aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.circleci/config.yml212
-rw-r--r--.gitignore41
-rw-r--r--.prettierignore20
-rw-r--r--CODEOWNERS1
-rw-r--r--CODE_OF_CONDUCT.md46
-rw-r--r--CONTRIBUTING.md12
-rw-r--r--PULL_REQUEST_TEMPLATE.md41
-rw-r--r--README.md139
-rw-r--r--lerna.json11
-rw-r--r--package.json48
-rw-r--r--packages/0x.js/CHANGELOG.json424
-rw-r--r--packages/0x.js/CHANGELOG.md212
-rw-r--r--packages/0x.js/README.md58
-rw-r--r--packages/0x.js/package.json103
-rw-r--r--packages/0x.js/src/0x.ts379
-rw-r--r--packages/0x.js/src/artifacts.ts19
-rw-r--r--packages/0x.js/src/artifacts/DummyToken.json22
-rw-r--r--packages/0x.js/src/artifacts/EtherToken.json287
-rw-r--r--packages/0x.js/src/artifacts/Token.json172
-rw-r--r--packages/0x.js/src/artifacts/TokenRegistry.json547
-rw-r--r--packages/0x.js/src/artifacts/TokenTransferProxy.json187
-rw-r--r--packages/0x.js/src/artifacts/ZRX.json20
-rw-r--r--packages/0x.js/src/artifacts/ZRXToken.json10031
-rw-r--r--packages/0x.js/src/contract_wrappers/contract_wrapper.ts204
-rw-r--r--packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts199
-rw-r--r--packages/0x.js/src/contract_wrappers/exchange_wrapper.ts934
-rw-r--r--packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts128
-rw-r--r--packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts70
-rw-r--r--packages/0x.js/src/contract_wrappers/token_wrapper.ts434
-rw-r--r--packages/0x.js/src/globals.d.ts44
-rw-r--r--packages/0x.js/src/globalsAugment.d.ts23
-rw-r--r--packages/0x.js/src/index.ts93
-rw-r--r--packages/0x.js/src/order_watcher/event_watcher.ts99
-rw-r--r--packages/0x.js/src/order_watcher/expiration_watcher.ts75
-rw-r--r--packages/0x.js/src/order_watcher/order_state_watcher.ts384
-rw-r--r--packages/0x.js/src/order_watcher/remaining_fillable_calculator.ts95
-rw-r--r--packages/0x.js/src/schemas/zero_ex_private_network_config_schema.ts8
-rw-r--r--packages/0x.js/src/schemas/zero_ex_public_network_config_schema.ts20
-rw-r--r--packages/0x.js/src/stores/balance_proxy_allowance_lazy_store.ts86
-rw-r--r--packages/0x.js/src/stores/order_filled_cancelled_lazy_store.ts61
-rw-r--r--packages/0x.js/src/types.ts279
-rw-r--r--packages/0x.js/src/utils/assert.ts35
-rw-r--r--packages/0x.js/src/utils/constants.ts8
-rw-r--r--packages/0x.js/src/utils/decorators.ts91
-rw-r--r--packages/0x.js/src/utils/exchange_transfer_simulator.ts107
-rw-r--r--packages/0x.js/src/utils/filter_utils.ts95
-rw-r--r--packages/0x.js/src/utils/order_state_utils.ts138
-rw-r--r--packages/0x.js/src/utils/order_validation_utils.ts217
-rw-r--r--packages/0x.js/src/utils/signature_utils.ts45
-rw-r--r--packages/0x.js/src/utils/utils.ts63
-rw-r--r--packages/0x.js/test/0x.js_test.ts235
-rw-r--r--packages/0x.js/test/artifacts_test.ts55
-rw-r--r--packages/0x.js/test/assert_test.ts43
-rw-r--r--packages/0x.js/test/ether_token_wrapper_test.ts387
-rw-r--r--packages/0x.js/test/event_watcher_test.ts127
-rw-r--r--packages/0x.js/test/exchange_transfer_simulator_test.ts117
-rw-r--r--packages/0x.js/test/exchange_wrapper_test.ts1159
-rw-r--r--packages/0x.js/test/expiration_watcher_test.ts157
-rw-r--r--packages/0x.js/test/global_hooks.ts17
-rw-r--r--packages/0x.js/test/order_state_watcher_test.ts559
-rw-r--r--packages/0x.js/test/order_validation_test.ts473
-rw-r--r--packages/0x.js/test/remaining_fillable_calculator_test.ts234
-rw-r--r--packages/0x.js/test/subscription_test.ts83
-rw-r--r--packages/0x.js/test/token_registry_wrapper_test.ts128
-rw-r--r--packages/0x.js/test/token_transfer_proxy_wrapper_test.ts36
-rw-r--r--packages/0x.js/test/token_wrapper_test.ts517
-rw-r--r--packages/0x.js/test/utils/chai_setup.ts2
-rw-r--r--packages/0x.js/test/utils/fill_scenarios.ts198
-rw-r--r--packages/0x.js/test/utils/order_factory.ts46
-rw-r--r--packages/0x.js/test/utils/report_callback_errors.ts66
-rw-r--r--packages/0x.js/test/utils/token_utils.ts38
-rw-r--r--packages/0x.js/test/utils/web3_wrapper.ts14
-rw-r--r--packages/0x.js/tsconfig.json10
-rw-r--r--packages/abi-gen/CHANGELOG.json173
-rw-r--r--packages/abi-gen/CHANGELOG.md78
-rw-r--r--packages/abi-gen/README.md51
-rwxr-xr-xpackages/abi-gen/bin/abi-gen.js2
-rw-r--r--packages/abi-gen/coverage/.gitkeep (renamed from packages/contracts/coverage/.gitkeep)0
-rw-r--r--packages/abi-gen/package.json46
-rw-r--r--packages/abi-gen/src/globals.d.ts5
-rw-r--r--packages/abi-gen/src/index.ts47
-rw-r--r--packages/abi-gen/src/types.ts11
-rw-r--r--packages/abi-gen/src/utils.ts30
-rw-r--r--packages/abi-gen/test/utils_test.ts86
-rw-r--r--packages/assert/CHANGELOG.json161
-rw-r--r--packages/assert/CHANGELOG.md74
-rw-r--r--packages/assert/README.md20
-rw-r--r--packages/assert/package.json34
-rw-r--r--packages/assert/src/globals.d.ts2
-rw-r--r--packages/assert/src/index.ts41
-rw-r--r--packages/assert/test/assert_test.ts4
-rw-r--r--packages/base-contract/CHANGELOG.json163
-rw-r--r--packages/base-contract/CHANGELOG.md70
-rw-r--r--packages/base-contract/README.md8
-rw-r--r--packages/base-contract/coverage/.gitkeep (renamed from packages/deployer/coverage/.gitkeep)0
-rw-r--r--packages/base-contract/package.json43
-rw-r--r--packages/base-contract/src/index.ts147
-rw-r--r--packages/base-contract/src/utils.ts25
-rw-r--r--packages/base-contract/test/base_contract_test.ts114
-rw-r--r--packages/base-contract/test/utils_test.ts108
-rw-r--r--packages/base-contract/tsconfig.json2
-rw-r--r--packages/connect/CHANGELOG.json175
-rw-r--r--packages/connect/CHANGELOG.md84
-rw-r--r--packages/connect/README.md20
-rw-r--r--packages/connect/package.json49
-rw-r--r--packages/connect/src/globals.d.ts3
-rw-r--r--packages/connect/src/http_client.ts8
-rw-r--r--packages/connect/src/index.ts5
-rw-r--r--packages/connect/src/orderbook_channel_factory.ts32
-rw-r--r--packages/connect/src/schemas/schemas.ts2
-rw-r--r--packages/connect/src/schemas/websocket_orderbook_channel_config_schema.ts10
-rw-r--r--packages/connect/src/types.ts17
-rw-r--r--packages/connect/src/utils/assert.ts26
-rw-r--r--packages/connect/src/utils/orderbook_channel_message_parser.ts8
-rw-r--r--packages/connect/src/utils/relayer_response_json_parsers.ts1
-rw-r--r--packages/connect/src/utils/type_converters.ts6
-rw-r--r--packages/connect/src/ws_orderbook_channel.ts187
-rw-r--r--packages/connect/test/orderbook_channel_factory_test.ts45
-rw-r--r--packages/connect/test/ws_orderbook_channel_test.ts60
-rw-r--r--packages/contract-wrappers/.npmignore11
-rw-r--r--packages/contract-wrappers/CHANGELOG.json107
-rw-r--r--packages/contract-wrappers/CHANGELOG.md49
-rw-r--r--packages/contract-wrappers/README.md89
-rw-r--r--packages/contract-wrappers/coverage/.gitkeep0
-rw-r--r--packages/contract-wrappers/package.json95
-rw-r--r--packages/contract-wrappers/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts11
-rw-r--r--packages/contract-wrappers/src/artifacts.ts25
-rw-r--r--packages/contract-wrappers/src/contract_wrappers.ts144
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts212
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts85
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts445
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts85
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts472
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts225
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts1123
-rw-r--r--packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts220
-rw-r--r--packages/contract-wrappers/src/globals.d.ts6
-rw-r--r--packages/contract-wrappers/src/index.ts82
-rw-r--r--packages/contract-wrappers/src/monorepo_scripts/postpublish.ts (renamed from packages/deployer/src/monorepo_scripts/postpublish.ts)0
-rw-r--r--packages/contract-wrappers/src/schemas/contract_wrappers_config_schema.ts5
-rw-r--r--packages/contract-wrappers/src/schemas/contract_wrappers_private_network_config_schema.ts36
-rw-r--r--packages/contract-wrappers/src/schemas/contract_wrappers_public_network_config_schema.ts44
-rw-r--r--packages/contract-wrappers/src/schemas/method_opts_schema.ts7
-rw-r--r--packages/contract-wrappers/src/schemas/order_tx_opts_schema.ts8
-rw-r--r--packages/contract-wrappers/src/schemas/tx_opts_schema.ts8
-rw-r--r--packages/contract-wrappers/src/types.ts190
-rw-r--r--packages/contract-wrappers/src/utils/assert.ts90
-rw-r--r--packages/contract-wrappers/src/utils/calldata_optimization_utils.ts44
-rw-r--r--packages/contract-wrappers/src/utils/constants.ts15
-rw-r--r--packages/contract-wrappers/src/utils/decorators.ts96
-rw-r--r--packages/contract-wrappers/src/utils/exchange_transfer_simulator.ts111
-rw-r--r--packages/contract-wrappers/src/utils/filter_utils.ts87
-rw-r--r--packages/contract-wrappers/src/utils/utils.ts11
-rw-r--r--packages/contract-wrappers/test/artifacts_test.ts43
-rw-r--r--packages/contract-wrappers/test/calldata_optimization_utils_test.ts60
-rw-r--r--packages/contract-wrappers/test/erc20_proxy_wrapper_test.ts35
-rw-r--r--packages/contract-wrappers/test/erc20_wrapper_test.ts658
-rw-r--r--packages/contract-wrappers/test/erc721_proxy_wrapper_test.ts35
-rw-r--r--packages/contract-wrappers/test/erc721_wrapper_test.ts471
-rw-r--r--packages/contract-wrappers/test/ether_token_wrapper_test.ts432
-rw-r--r--packages/contract-wrappers/test/exchange_wrapper_test.ts526
-rw-r--r--packages/contract-wrappers/test/forwarder_wrapper_test.ts130
-rw-r--r--packages/contract-wrappers/test/global_hooks.ts17
-rw-r--r--packages/contract-wrappers/test/subscription_test.ts72
-rw-r--r--packages/contract-wrappers/test/utils/chai_setup.ts13
-rw-r--r--packages/contract-wrappers/test/utils/constants.ts18
-rw-r--r--packages/contract-wrappers/test/utils/token_utils.ts47
-rw-r--r--packages/contract-wrappers/test/utils/web3_wrapper.ts12
-rw-r--r--packages/contract-wrappers/tsconfig.json7
-rw-r--r--packages/contract-wrappers/tslint.json (renamed from packages/deployer/tslint.json)0
-rw-r--r--packages/contract_templates/README.md17
-rw-r--r--packages/contract_templates/contract.handlebars70
-rw-r--r--packages/contract_templates/partials/call.handlebars2
-rw-r--r--packages/contract_templates/partials/callAsync.handlebars30
-rw-r--r--packages/contract_templates/partials/event.handlebars2
-rw-r--r--packages/contract_templates/partials/params.handlebars2
-rw-r--r--packages/contract_templates/partials/return_type.handlebars2
-rw-r--r--packages/contract_templates/partials/tx.handlebars45
-rw-r--r--packages/contracts/.solhint.json20
-rw-r--r--packages/contracts/README.md60
-rw-r--r--packages/contracts/compiler.json54
-rw-r--r--packages/contracts/globals.d.ts29
-rw-r--r--packages/contracts/globalsAugment.d.ts19
-rw-r--r--packages/contracts/migrations/config/multisig_sample.ts10
-rw-r--r--packages/contracts/migrations/config/token_info.ts40
-rw-r--r--packages/contracts/migrations/index.ts20
-rw-r--r--packages/contracts/migrations/migrate.ts90
-rw-r--r--packages/contracts/migrations/types.ts23
-rw-r--r--packages/contracts/package.json89
-rw-r--r--packages/contracts/src/1.0.0/Arbitrage/Arbitrage.sol114
-rw-r--r--packages/contracts/src/1.0.0/ERC20Token/ERC20Token_v1.sol (renamed from packages/contracts/src/contracts/previous/ERC20Token/ERC20Token_v1.sol)0
-rw-r--r--packages/contracts/src/1.0.0/EtherDelta/AccountLevels.sol (renamed from packages/contracts/src/contracts/current/tutorials/EtherDelta/AccountLevels.sol)0
-rw-r--r--packages/contracts/src/1.0.0/EtherDelta/EtherDelta.sol168
-rw-r--r--packages/contracts/src/1.0.0/Exchange/Exchange_v1.sol602
-rw-r--r--packages/contracts/src/1.0.0/Exchange/IExchange_v1.sol226
-rw-r--r--packages/contracts/src/1.0.0/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol82
-rw-r--r--packages/contracts/src/1.0.0/Ownable/IOwnable_v1.sol18
-rw-r--r--packages/contracts/src/1.0.0/Ownable/Ownable_v1.sol (renamed from packages/contracts/src/contracts/previous/Ownable/Ownable_v1.sol)0
-rw-r--r--packages/contracts/src/1.0.0/SafeMath/SafeMath_v1.sol (renamed from packages/contracts/src/contracts/previous/SafeMath/SafeMath_v1.sol)0
-rw-r--r--packages/contracts/src/1.0.0/Token/Token_v1.sol (renamed from packages/contracts/src/contracts/previous/Token/Token_v1.sol)0
-rw-r--r--packages/contracts/src/1.0.0/TokenRegistry/ITokenRegistery.sol195
-rw-r--r--packages/contracts/src/1.0.0/TokenRegistry/TokenRegistry.sol308
-rw-r--r--packages/contracts/src/1.0.0/TokenTransferProxy/TokenTransferProxy_v1.sol115
-rw-r--r--packages/contracts/src/1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol52
-rw-r--r--packages/contracts/src/2.0.0/examples/ExchangeWrapper/ExchangeWrapper.sol100
-rw-r--r--packages/contracts/src/2.0.0/examples/Validator/Validator.sol56
-rw-r--r--packages/contracts/src/2.0.0/examples/Wallet/Wallet.sol65
-rw-r--r--packages/contracts/src/2.0.0/examples/Whitelist/Whitelist.sol136
-rw-r--r--packages/contracts/src/2.0.0/forwarder/Forwarder.sol55
-rw-r--r--packages/contracts/src/2.0.0/forwarder/MixinAssets.sol144
-rw-r--r--packages/contracts/src/2.0.0/forwarder/MixinExchangeWrapper.sol263
-rw-r--r--packages/contracts/src/2.0.0/forwarder/MixinForwarderCore.sol213
-rw-r--r--packages/contracts/src/2.0.0/forwarder/MixinWeth.sol114
-rw-r--r--packages/contracts/src/2.0.0/forwarder/interfaces/IAssets.sol34
-rw-r--r--packages/contracts/src/2.0.0/forwarder/interfaces/IForwarder.sol30
-rw-r--r--packages/contracts/src/2.0.0/forwarder/interfaces/IForwarderCore.sol80
-rw-r--r--packages/contracts/src/2.0.0/forwarder/libs/LibConstants.sol58
-rw-r--r--packages/contracts/src/2.0.0/forwarder/libs/LibForwarderErrors.sol34
-rw-r--r--packages/contracts/src/2.0.0/forwarder/mixins/MAssets.sol54
-rw-r--r--packages/contracts/src/2.0.0/forwarder/mixins/MExchangeWrapper.sol87
-rw-r--r--packages/contracts/src/2.0.0/forwarder/mixins/MWeth.sol41
-rw-r--r--packages/contracts/src/2.0.0/multisig/MultiSigWallet.sol367
-rw-r--r--packages/contracts/src/2.0.0/multisig/MultiSigWalletWithTimeLock.sol134
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol133
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/ERC721Proxy.sol167
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/MixinAuthorizable.sol118
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetData.sol40
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol47
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol53
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/libs/LibAssetProxyErrors.sol38
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol42
-rw-r--r--packages/contracts/src/2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol119
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/Exchange.sol54
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol177
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol435
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinMatchOrders.sol299
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol260
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinTransactions.sol161
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol403
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol37
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchange.sol38
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol60
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol44
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol57
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ITransactions.sol35
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IValidator.sol37
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWallet.sol35
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol160
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol215
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibConstants.sol49
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibEIP712.sol86
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol70
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibFillResults.sol54
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol75
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/libs/LibOrder.sol146
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol46
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MExchangeCore.sol127
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MMatchOrders.sol59
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol46
-rw-r--r--packages/contracts/src/2.0.0/protocol/Exchange/mixins/MTransactions.sol36
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC20Token/DummyERC20Token.sol60
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol64
-rw-r--r--packages/contracts/src/2.0.0/test/DummyERC721Token/DummyERC721Token.sol76
-rw-r--r--packages/contracts/src/2.0.0/test/Mintable/Mintable.sol43
-rw-r--r--packages/contracts/src/2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol37
-rw-r--r--packages/contracts/src/2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol72
-rw-r--r--packages/contracts/src/2.0.0/test/TestConstants/TestConstants.sol57
-rw-r--r--packages/contracts/src/2.0.0/test/TestExchangeInternals/TestExchangeInternals.sol121
-rw-r--r--packages/contracts/src/2.0.0/test/TestLibBytes/TestLibBytes.sol269
-rw-r--r--packages/contracts/src/2.0.0/test/TestLibs/TestLibs.sol119
-rw-r--r--packages/contracts/src/2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol46
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC20Token/ERC20Token.sol96
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC20Token/IERC20Token.sol74
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC721Token/ERC721Token.sol407
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Receiver.sol61
-rw-r--r--packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Token.sol118
-rw-r--r--packages/contracts/src/2.0.0/tokens/EtherToken/IEtherToken.sol33
-rw-r--r--packages/contracts/src/2.0.0/tokens/EtherToken/WETH9.sol758
-rw-r--r--packages/contracts/src/2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol58
-rw-r--r--packages/contracts/src/2.0.0/tokens/ZRXToken/ZRXToken.sol39
-rw-r--r--packages/contracts/src/2.0.0/utils/LibBytes/LibBytes.sol560
-rw-r--r--packages/contracts/src/2.0.0/utils/Ownable/IOwnable.sol13
-rw-r--r--packages/contracts/src/2.0.0/utils/Ownable/Ownable.sol38
-rw-r--r--packages/contracts/src/2.0.0/utils/SafeMath/SafeMath.sol86
-rw-r--r--packages/contracts/src/contracts/current/multisig/MultiSigWallet/MultiSigWallet.sol365
-rw-r--r--packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol132
-rw-r--r--packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol82
-rw-r--r--packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol602
-rw-r--r--packages/contracts/src/contracts/current/protocol/TokenRegistry/TokenRegistry.sol308
-rw-r--r--packages/contracts/src/contracts/current/protocol/TokenTransferProxy/TokenTransferProxy.sol115
-rw-r--r--packages/contracts/src/contracts/current/test/DummyToken/DummyToken.sol37
-rw-r--r--packages/contracts/src/contracts/current/test/MaliciousToken/MaliciousToken.sol31
-rw-r--r--packages/contracts/src/contracts/current/test/Mintable/Mintable.sol18
-rw-r--r--packages/contracts/src/contracts/current/tokens/ERC20Token/ERC20Token.sol58
-rw-r--r--packages/contracts/src/contracts/current/tokens/Token/Token.sol35
-rw-r--r--packages/contracts/src/contracts/current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol46
-rw-r--r--packages/contracts/src/contracts/current/tokens/WETH9/WETH9.sol756
-rw-r--r--packages/contracts/src/contracts/current/tokens/ZRXToken/ZRXToken.sol33
-rw-r--r--packages/contracts/src/contracts/current/tutorials/Arbitrage/Arbitrage.sol114
-rw-r--r--packages/contracts/src/contracts/current/tutorials/EtherDelta/EtherDelta.sol168
-rw-r--r--packages/contracts/src/contracts/current/utils/Ownable/Ownable.sol32
-rw-r--r--packages/contracts/src/contracts/current/utils/SafeMath/SafeMath.sol73
-rw-r--r--packages/contracts/src/contracts/previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol52
-rw-r--r--packages/contracts/test/asset_proxy/authorizable.ts207
-rw-r--r--packages/contracts/test/asset_proxy/proxies.ts386
-rw-r--r--packages/contracts/test/ether_token.ts125
-rw-r--r--packages/contracts/test/exchange/core.ts1249
-rw-r--r--packages/contracts/test/exchange/dispatcher.ts226
-rw-r--r--packages/contracts/test/exchange/fill_order.ts301
-rw-r--r--packages/contracts/test/exchange/helpers.ts194
-rw-r--r--packages/contracts/test/exchange/internal.ts305
-rw-r--r--packages/contracts/test/exchange/libs.ts125
-rw-r--r--packages/contracts/test/exchange/match_orders.ts796
-rw-r--r--packages/contracts/test/exchange/signature_validator.ts507
-rw-r--r--packages/contracts/test/exchange/transactions.ts462
-rw-r--r--packages/contracts/test/exchange/wrapper.ts1382
-rw-r--r--packages/contracts/test/forwarder/forwarder.ts996
-rw-r--r--packages/contracts/test/global_hooks.ts9
-rw-r--r--packages/contracts/test/libraries/lib_bytes.ts834
-rw-r--r--packages/contracts/test/multi_sig_with_time_lock.ts196
-rw-r--r--packages/contracts/test/multi_sig_with_time_lock_except_remove_auth_addr.ts193
-rw-r--r--packages/contracts/test/multisig/asset_proxy_owner.ts468
-rw-r--r--packages/contracts/test/multisig/multi_sig_with_time_lock.ts168
-rw-r--r--packages/contracts/test/token_registry.ts110
-rw-r--r--packages/contracts/test/token_transfer_proxy/auth.ts104
-rw-r--r--packages/contracts/test/token_transfer_proxy/transfer_from.ts103
-rw-r--r--packages/contracts/test/tokens/ether_token.ts138
-rw-r--r--packages/contracts/test/tokens/unlimited_allowance_token.ts191
-rw-r--r--packages/contracts/test/tokens/zrx_token.ts206
-rw-r--r--packages/contracts/test/tutorials/arbitrage.ts461
-rw-r--r--packages/contracts/test/unlimited_allowance_token.ts155
-rw-r--r--packages/contracts/test/utils/abstract_asset_wrapper.ts3
-rw-r--r--packages/contracts/test/utils/address_utils.ts10
-rw-r--r--packages/contracts/test/utils/artifacts.ts57
-rw-r--r--packages/contracts/test/utils/assertions.ts186
-rw-r--r--packages/contracts/test/utils/asset_wrapper.ts223
-rw-r--r--packages/contracts/test/utils/block_timestamp.ts40
-rw-r--r--packages/contracts/test/utils/chai_setup.ts2
-rw-r--r--packages/contracts/test/utils/combinatorial_utils.ts113
-rw-r--r--packages/contracts/test/utils/constants.ts54
-rw-r--r--packages/contracts/test/utils/coverage.ts21
-rw-r--r--packages/contracts/test/utils/deployer.ts19
-rw-r--r--packages/contracts/test/utils/erc20_wrapper.ts175
-rw-r--r--packages/contracts/test/utils/erc721_wrapper.ts236
-rw-r--r--packages/contracts/test/utils/exchange_wrapper.ts269
-rw-r--r--packages/contracts/test/utils/fill_order_combinatorial_utils.ts913
-rw-r--r--packages/contracts/test/utils/formatters.ts68
-rw-r--r--packages/contracts/test/utils/forwarder_wrapper.ts118
-rw-r--r--packages/contracts/test/utils/log_decoder.ts55
-rw-r--r--packages/contracts/test/utils/match_order_tester.ts326
-rw-r--r--packages/contracts/test/utils/multi_sig_wrapper.ts60
-rw-r--r--packages/contracts/test/utils/order_factory.ts38
-rw-r--r--packages/contracts/test/utils/order_factory_from_scenario.ts273
-rw-r--r--packages/contracts/test/utils/order_utils.ts58
-rw-r--r--packages/contracts/test/utils/profiler.ts27
-rw-r--r--packages/contracts/test/utils/revert_trace.ts21
-rw-r--r--packages/contracts/test/utils/signing_utils.ts29
-rw-r--r--packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts19
-rw-r--r--packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts24
-rw-r--r--packages/contracts/test/utils/test_with_reference.ts119
-rw-r--r--packages/contracts/test/utils/token_registry_wrapper.ts66
-rw-r--r--packages/contracts/test/utils/transaction_factory.ts47
-rw-r--r--packages/contracts/test/utils/type_encoding_utils.ts21
-rw-r--r--packages/contracts/test/utils/types.ts237
-rw-r--r--packages/contracts/test/utils/web3_wrapper.ts86
-rw-r--r--packages/contracts/test/zrx_token.ts178
-rw-r--r--packages/contracts/tsconfig.json6
-rw-r--r--packages/contracts/tslint.json5
-rw-r--r--packages/contracts/util/artifacts.ts25
-rw-r--r--packages/contracts/util/balances.ts30
-rw-r--r--packages/contracts/util/constants.ts15
-rw-r--r--packages/contracts/util/crypto.ts43
-rw-r--r--packages/contracts/util/exchange_wrapper.ts230
-rw-r--r--packages/contracts/util/formatters.ts111
-rw-r--r--packages/contracts/util/multi_sig_wrapper.ts43
-rw-r--r--packages/contracts/util/order_factory.ts37
-rw-r--r--packages/contracts/util/signed_order_utils.ts49
-rw-r--r--packages/contracts/util/token_registry_wrapper.ts60
-rw-r--r--packages/contracts/util/types.ts118
-rw-r--r--packages/deployer/CHANGELOG.json108
-rw-r--r--packages/deployer/CHANGELOG.md40
-rw-r--r--packages/deployer/README.md84
-rw-r--r--packages/deployer/package.json87
-rw-r--r--packages/deployer/src/cli.ts154
-rw-r--r--packages/deployer/src/commands.ts14
-rw-r--r--packages/deployer/src/compiler.ts278
-rw-r--r--packages/deployer/src/deployer.ts219
-rw-r--r--packages/deployer/src/globals.d.ts52
-rw-r--r--packages/deployer/src/index.ts2
-rw-r--r--packages/deployer/src/solc/bin_paths.ts18
-rw-r--r--packages/deployer/src/utils/compiler.ts123
-rw-r--r--packages/deployer/src/utils/constants.ts4
-rw-r--r--packages/deployer/src/utils/contract.ts82
-rw-r--r--packages/deployer/src/utils/encoder.ts20
-rw-r--r--packages/deployer/src/utils/error_reporter.ts18
-rw-r--r--packages/deployer/src/utils/fs_wrapper.ts12
-rw-r--r--packages/deployer/src/utils/types.ts101
-rw-r--r--packages/deployer/src/utils/utils.ts8
-rw-r--r--packages/deployer/test/compiler_test.ts47
-rw-r--r--packages/deployer/test/compiler_utils_test.ts74
-rw-r--r--packages/deployer/test/deployer_test.ts76
-rw-r--r--packages/deployer/test/fixtures/contracts/Exchange.sol602
-rw-r--r--packages/deployer/test/fixtures/contracts/TokenTransferProxy.sol115
-rw-r--r--packages/deployer/test/fixtures/contracts/base/Ownable.sol27
-rw-r--r--packages/deployer/test/fixtures/contracts/base/SafeMath.sol41
-rw-r--r--packages/deployer/test/fixtures/contracts/base/Token.sol38
-rw-r--r--packages/deployer/test/fixtures/exchange_bin.ts4
-rw-r--r--packages/deployer/test/util/constants.ts12
-rw-r--r--packages/deployer/tsconfig.json13
-rw-r--r--packages/dev-utils/CHANGELOG.json167
-rw-r--r--packages/dev-utils/CHANGELOG.md76
-rw-r--r--packages/dev-utils/README.md52
-rw-r--r--packages/dev-utils/package.json45
-rw-r--r--packages/dev-utils/src/blockchain_lifecycle.ts98
-rw-r--r--packages/dev-utils/src/callback_error_reporter.ts77
-rw-r--r--packages/dev-utils/src/constants.ts2
-rw-r--r--packages/dev-utils/src/coverage.ts22
-rw-r--r--packages/dev-utils/src/env.ts2
-rw-r--r--packages/dev-utils/src/globals.d.ts3
-rw-r--r--packages/dev-utils/src/index.ts2
-rw-r--r--packages/dev-utils/src/web3_factory.ts62
-rw-r--r--packages/dev-utils/test/blockchain_lifecycle_test.ts6
-rw-r--r--packages/dev-utils/test/rpc_test.ts8
-rw-r--r--packages/dev-utils/tsconfig.json7
-rw-r--r--packages/devnet/Dockerfile25
-rw-r--r--packages/devnet/README.md110
-rw-r--r--packages/devnet/genesis.json61
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-08.903003751Z--5409ed021d9299bf6814279a6a1411a7e866a6311
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-09.794553183Z--6ecbe1db9ef729cbe972c83fb886247691fb6beb1
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-10.696351411Z--e36ea790bc9d7ab70c55260c66d52b1eca985f841
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-11.479938556Z--e834ec434daba538cd1b9fe1582052b880bd7e631
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-12.260348580Z--78dc5d2d739606d31509c31d654056a45185ecb61
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.178294829Z--a8dda8d7f5310e4a9e24f8eba77e091ac264f8721
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.960499696Z--06cef8e666768cc40cc78cf93d9611019ddcb6281
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-14.757010386Z--4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d1
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-15.554233052Z--7457d5e02197480db681d3fdf256c7aca21bdc121
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-11T21-29-16.342711541Z--91c987bf62d25945db517bdaa840a6c6613744021
-rw-r--r--packages/devnet/node0/keystore/UTC--2018-05-15T21-50-24.532037737Z--e8816898d851d5b61b7f950627d04d794c07ca371
-rw-r--r--packages/devnet/node0/password.txt11
-rwxr-xr-xpackages/devnet/run.sh25
-rw-r--r--packages/ethereum-types/.npmignore6
-rw-r--r--packages/ethereum-types/CHANGELOG.json62
-rw-r--r--packages/ethereum-types/CHANGELOG.md31
-rw-r--r--packages/ethereum-types/README.md61
-rw-r--r--packages/ethereum-types/package.json53
-rw-r--r--packages/ethereum-types/src/globals.d.ts6
-rw-r--r--packages/ethereum-types/src/index.ts289
-rw-r--r--packages/ethereum-types/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/ethereum-types/src/monorepo_scripts/stage_docs.ts (renamed from packages/deployer/src/monorepo_scripts/stage_docs.ts)0
-rw-r--r--packages/ethereum-types/tsconfig.json8
-rw-r--r--packages/ethereum-types/tslint.json3
-rw-r--r--packages/fill-scenarios/.npmignore6
-rw-r--r--packages/fill-scenarios/CHANGELOG.json108
-rw-r--r--packages/fill-scenarios/CHANGELOG.md51
-rw-r--r--packages/fill-scenarios/README.md63
-rw-r--r--packages/fill-scenarios/package.json57
-rw-r--r--packages/fill-scenarios/src/artifacts.ts11
-rw-r--r--packages/fill-scenarios/src/constants.ts4
-rw-r--r--packages/fill-scenarios/src/fill_scenarios.ts302
-rw-r--r--packages/fill-scenarios/src/globals.d.ts6
-rw-r--r--packages/fill-scenarios/src/index.ts1
-rw-r--r--packages/fill-scenarios/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/fill-scenarios/tsconfig.json7
-rw-r--r--packages/fill-scenarios/tslint.json3
-rw-r--r--packages/json-schemas/CHANGELOG.json176
-rw-r--r--packages/json-schemas/CHANGELOG.md76
-rw-r--r--packages/json-schemas/README.md20
-rw-r--r--packages/json-schemas/package.json35
-rw-r--r--packages/json-schemas/schemas/basic_type_schemas.ts10
-rw-r--r--packages/json-schemas/schemas/block_range_schema.ts8
-rw-r--r--packages/json-schemas/schemas/call_data_schema.ts27
-rw-r--r--packages/json-schemas/schemas/ec_signature_schema.ts6
-rw-r--r--packages/json-schemas/schemas/index_filter_values_schema.ts4
-rw-r--r--packages/json-schemas/schemas/order_cancel_schema.ts6
-rw-r--r--packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts6
-rw-r--r--packages/json-schemas/schemas/order_fill_requests_schema.ts6
-rw-r--r--packages/json-schemas/schemas/order_hash_schema.ts2
-rw-r--r--packages/json-schemas/schemas/order_schemas.ts52
-rw-r--r--packages/json-schemas/schemas/orders_schema.ts5
-rw-r--r--packages/json-schemas/schemas/paginated_collection_schema.ts10
-rw-r--r--packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts38
-rw-r--r--packages/json-schemas/schemas/relayer_api_error_response_schema.ts6
-rw-r--r--packages/json-schemas/schemas/relayer_api_fee_recipients_response_schema.ts13
-rw-r--r--packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts24
-rw-r--r--packages/json-schemas/schemas/relayer_api_fees_response_schema.ts10
-rw-r--r--packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts23
-rw-r--r--packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts24
-rw-r--r--packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts11
-rw-r--r--packages/json-schemas/schemas/relayer_api_order_schema.ts9
-rw-r--r--packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts21
-rw-r--r--packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts11
-rw-r--r--packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts8
-rw-r--r--packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts26
-rw-r--r--packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts11
-rw-r--r--packages/json-schemas/schemas/relayer_api_orders_response_schema.ts13
-rw-r--r--packages/json-schemas/schemas/relayer_api_orders_schema.ts5
-rw-r--r--packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts24
-rw-r--r--packages/json-schemas/schemas/signed_orders_schema.ts2
-rw-r--r--packages/json-schemas/schemas/token_schema.ts4
-rw-r--r--packages/json-schemas/schemas/tx_data_schema.ts15
-rw-r--r--packages/json-schemas/src/globals.d.ts2
-rw-r--r--packages/json-schemas/src/schema_validator.ts4
-rw-r--r--packages/json-schemas/src/schemas.ts65
-rw-r--r--packages/json-schemas/test/schema_test.ts1046
-rw-r--r--packages/metacoin/README.md97
-rw-r--r--packages/metacoin/compiler.json15
-rw-r--r--packages/metacoin/contracts/Metacoin.sol40
-rw-r--r--packages/metacoin/coverage/.gitkeep0
-rw-r--r--packages/metacoin/package.json61
-rw-r--r--packages/metacoin/src/global.d.ts4
-rw-r--r--packages/metacoin/test/global_hooks.ts15
-rw-r--r--packages/metacoin/test/metacoin_test.ts121
-rw-r--r--packages/metacoin/test/utils/chai_setup.ts13
-rw-r--r--packages/metacoin/test/utils/config.ts12
-rw-r--r--packages/metacoin/test/utils/coverage.ts21
-rw-r--r--packages/metacoin/test/utils/profiler.ts27
-rw-r--r--packages/metacoin/test/utils/web3_wrapper.ts76
-rw-r--r--packages/metacoin/tsconfig.json16
-rw-r--r--packages/metacoin/tslint.json3
-rw-r--r--packages/migrations/CHANGELOG.json120
-rw-r--r--packages/migrations/CHANGELOG.md58
-rw-r--r--packages/migrations/README.md82
-rw-r--r--packages/migrations/artifacts/1.0.0/DummyERC20Token.json375
-rw-r--r--packages/migrations/artifacts/1.0.0/Exchange_v1.json678
-rw-r--r--packages/migrations/artifacts/1.0.0/MultiSigWallet.json580
-rw-r--r--packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLock.json664
-rw-r--r--packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json725
-rw-r--r--packages/migrations/artifacts/1.0.0/TokenRegistry.json600
-rw-r--r--packages/migrations/artifacts/1.0.0/TokenTransferProxy_v1.json236
-rw-r--r--packages/migrations/artifacts/1.0.0/WETH9.json332
-rw-r--r--packages/migrations/artifacts/1.0.0/ZRXToken.json288
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/AssetProxyOwner.json44483
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Proxy.json267
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Token.json230
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Proxy.json267
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Token.json379
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Exchange.json2244
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/Forwarder.json696
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IValidator.json80
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/IWallet.json76
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/WETH9.json341
-rw-r--r--packages/migrations/artifacts/2.0.0-beta-testnet/ZRXToken.json10036
-rw-r--r--packages/migrations/artifacts/2.0.0/AssetProxyOwner.json44478
-rw-r--r--packages/migrations/artifacts/2.0.0/DummyERC20Token.json379
-rw-r--r--packages/migrations/artifacts/2.0.0/DummyERC721Receiver.json106
-rw-r--r--packages/migrations/artifacts/2.0.0/DummyERC721Token.json455
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC20Proxy.json262
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC20Token.json230
-rw-r--r--packages/migrations/artifacts/2.0.0/ERC721Proxy.json262
-rw-r--r--packages/migrations/artifacts/2.0.0/Exchange.json2148
-rw-r--r--packages/migrations/artifacts/2.0.0/ExchangeWrapper.json210
-rw-r--r--packages/migrations/artifacts/2.0.0/Forwarder.json615
-rw-r--r--packages/migrations/artifacts/2.0.0/IAssetData.json89
-rw-r--r--packages/migrations/artifacts/2.0.0/IAssetProxy.json175
-rw-r--r--packages/migrations/artifacts/2.0.0/IValidator.json80
-rw-r--r--packages/migrations/artifacts/2.0.0/IWallet.json76
-rw-r--r--packages/migrations/artifacts/2.0.0/MixinAuthorizable.json229
-rw-r--r--packages/migrations/artifacts/2.0.0/MultiSigWallet.json584
-rw-r--r--packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLock.json668
-rw-r--r--packages/migrations/artifacts/2.0.0/TestAssetProxyDispatcher.json208
-rw-r--r--packages/migrations/artifacts/2.0.0/TestAssetProxyOwner.json48173
-rw-r--r--packages/migrations/artifacts/2.0.0/TestConstants.json85
-rw-r--r--packages/migrations/artifacts/2.0.0/TestLibBytes.json426
-rw-r--r--packages/migrations/artifacts/2.0.0/TestLibs.json396
-rw-r--r--packages/migrations/artifacts/2.0.0/TestSignatureValidator.json332
-rw-r--r--packages/migrations/artifacts/2.0.0/TestValidator.json95
-rw-r--r--packages/migrations/artifacts/2.0.0/TestWallet.json95
-rw-r--r--packages/migrations/artifacts/2.0.0/TokenRegistry.json598
-rw-r--r--packages/migrations/artifacts/2.0.0/Validator.json95
-rw-r--r--packages/migrations/artifacts/2.0.0/WETH9.json336
-rw-r--r--packages/migrations/artifacts/2.0.0/Wallet.json95
-rw-r--r--packages/migrations/artifacts/2.0.0/Whitelist.json284
-rw-r--r--packages/migrations/artifacts/2.0.0/ZRXToken.json10031
-rw-r--r--packages/migrations/compiler.json20
-rw-r--r--packages/migrations/package.json74
-rw-r--r--packages/migrations/src/1.0.0/artifacts.ts21
-rw-r--r--packages/migrations/src/1.0.0/migration.ts142
-rw-r--r--packages/migrations/src/2.0.0-beta-testnet/artifacts.ts13
-rw-r--r--packages/migrations/src/2.0.0-beta-testnet/migration.ts104
-rw-r--r--packages/migrations/src/2.0.0/artifacts.ts23
-rw-r--r--packages/migrations/src/2.0.0/migration.ts144
-rw-r--r--packages/migrations/src/globals.d.ts6
-rw-r--r--packages/migrations/src/index.ts3
-rw-r--r--packages/migrations/src/migrate.ts61
-rw-r--r--packages/migrations/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/migrations/src/types.ts29
-rw-r--r--packages/migrations/src/utils/artifact_writer.ts26
-rw-r--r--packages/migrations/src/utils/constants.ts16
-rw-r--r--packages/migrations/src/utils/provider_factory.ts27
-rw-r--r--packages/migrations/src/utils/token_info.ts48
-rw-r--r--packages/migrations/tsconfig.json7
-rw-r--r--packages/migrations/tslint.json3
-rw-r--r--packages/monorepo-scripts/CHANGELOG.json127
-rw-r--r--packages/monorepo-scripts/CHANGELOG.md59
-rw-r--r--packages/monorepo-scripts/README.md26
-rw-r--r--packages/monorepo-scripts/package.json37
-rw-r--r--packages/monorepo-scripts/src/constants.ts3
-rw-r--r--packages/monorepo-scripts/src/convert_changelogs.ts99
-rw-r--r--packages/monorepo-scripts/src/deps_versions.ts4
-rw-r--r--packages/monorepo-scripts/src/find_unused_dependencies.ts34
-rw-r--r--packages/monorepo-scripts/src/globals.d.ts24
-rw-r--r--packages/monorepo-scripts/src/postpublish_utils.ts123
-rw-r--r--packages/monorepo-scripts/src/prepublish_checks.ts189
-rw-r--r--packages/monorepo-scripts/src/publish.ts323
-rw-r--r--packages/monorepo-scripts/src/test_installation.ts176
-rw-r--r--packages/monorepo-scripts/src/types.ts45
-rw-r--r--packages/monorepo-scripts/src/utils.ts20
-rw-r--r--packages/monorepo-scripts/src/utils/changelog_utils.ts106
-rw-r--r--packages/monorepo-scripts/src/utils/configs.ts8
-rw-r--r--packages/monorepo-scripts/src/utils/npm_utils.ts29
-rw-r--r--packages/monorepo-scripts/src/utils/utils.ts167
-rw-r--r--packages/monorepo-scripts/tsconfig.json2
-rw-r--r--packages/monorepo-scripts/tslint.json2
-rw-r--r--packages/order-utils/.npmignore7
-rw-r--r--packages/order-utils/CHANGELOG.json153
-rw-r--r--packages/order-utils/CHANGELOG.md67
-rw-r--r--packages/order-utils/README.md65
-rw-r--r--packages/order-utils/coverage/.gitkeep0
-rw-r--r--packages/order-utils/package.json95
-rw-r--r--packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_fetcher.ts6
-rw-r--r--packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts11
-rw-r--r--packages/order-utils/src/abstract/abstract_order_filled_cancelled_fetcher.ts7
-rw-r--r--packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts12
-rw-r--r--packages/order-utils/src/artifacts.ts14
-rw-r--r--packages/order-utils/src/assert.ts37
-rw-r--r--packages/order-utils/src/asset_data_utils.ts139
-rw-r--r--packages/order-utils/src/constants.ts16
-rw-r--r--packages/order-utils/src/crypto.ts46
-rw-r--r--packages/order-utils/src/eip712_utils.ts93
-rw-r--r--packages/order-utils/src/exchange_transfer_simulator.ts116
-rw-r--r--packages/order-utils/src/globals.d.ts6
-rw-r--r--packages/order-utils/src/index.ts27
-rw-r--r--packages/order-utils/src/market_utils.ts133
-rw-r--r--packages/order-utils/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/order-utils/src/monorepo_scripts/stage_docs.ts8
-rw-r--r--packages/order-utils/src/order_factory.ts85
-rw-r--r--packages/order-utils/src/order_hash.ts79
-rw-r--r--packages/order-utils/src/order_state_utils.ts284
-rw-r--r--packages/order-utils/src/order_validation_utils.ts210
-rw-r--r--packages/order-utils/src/remaining_fillable_calculator.ts86
-rw-r--r--packages/order-utils/src/salt.ts18
-rw-r--r--packages/order-utils/src/signature_utils.ts388
-rw-r--r--packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts97
-rw-r--r--packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts65
-rw-r--r--packages/order-utils/src/types.ts43
-rw-r--r--packages/order-utils/src/utils.ts22
-rw-r--r--packages/order-utils/test/assert_test.ts34
-rw-r--r--packages/order-utils/test/exchange_transfer_simulator_test.ts176
-rw-r--r--packages/order-utils/test/market_utils_test.ts280
-rw-r--r--packages/order-utils/test/order_hash_test.ts61
-rw-r--r--packages/order-utils/test/order_validation_utils_test.ts70
-rw-r--r--packages/order-utils/test/remaining_fillable_calculator_test.ts246
-rw-r--r--packages/order-utils/test/signature_utils_test.ts253
-rw-r--r--packages/order-utils/test/utils/chai_setup.ts13
-rw-r--r--packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts26
-rw-r--r--packages/order-utils/test/utils/test_order_factory.ts32
-rw-r--r--packages/order-utils/test/utils/web3_wrapper.ts8
-rw-r--r--packages/order-utils/tsconfig.json7
-rw-r--r--packages/order-utils/tslint.json3
-rw-r--r--packages/order-watcher/.npmignore10
-rw-r--r--packages/order-watcher/CHANGELOG.json134
-rw-r--r--packages/order-watcher/CHANGELOG.md61
-rw-r--r--packages/order-watcher/README.md79
-rw-r--r--packages/order-watcher/coverage/.gitkeep0
-rw-r--r--packages/order-watcher/package.json92
-rw-r--r--packages/order-watcher/src/artifacts.ts13
-rw-r--r--packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts74
-rw-r--r--packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts27
-rw-r--r--packages/order-watcher/src/globals.d.ts6
-rw-r--r--packages/order-watcher/src/index.ts8
-rw-r--r--packages/order-watcher/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts54
-rw-r--r--packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts230
-rw-r--r--packages/order-watcher/src/order_watcher/event_watcher.ts130
-rw-r--r--packages/order-watcher/src/order_watcher/expiration_watcher.ts89
-rw-r--r--packages/order-watcher/src/order_watcher/order_watcher.ts433
-rw-r--r--packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts13
-rw-r--r--packages/order-watcher/src/types.ts33
-rw-r--r--packages/order-watcher/src/utils/assert.ts23
-rw-r--r--packages/order-watcher/src/utils/utils.ts11
-rw-r--r--packages/order-watcher/test/expiration_watcher_test.ts206
-rw-r--r--packages/order-watcher/test/global_hooks.ts17
-rw-r--r--packages/order-watcher/test/order_watcher_test.ts634
-rw-r--r--packages/order-watcher/test/utils/chai_setup.ts13
-rw-r--r--packages/order-watcher/test/utils/constants.ts5
-rw-r--r--packages/order-watcher/test/utils/token_utils.ts34
-rw-r--r--packages/order-watcher/test/utils/web3_wrapper.ts8
-rw-r--r--packages/order-watcher/tsconfig.json7
-rw-r--r--packages/order-watcher/tslint.json6
-rw-r--r--packages/react-docs-example/README.md32
-rw-r--r--packages/react-docs-example/package.json20
-rw-r--r--packages/react-docs-example/ts/docs.tsx18
-rw-r--r--packages/react-docs-example/yarn.lock5100
-rw-r--r--packages/react-docs/CHANGELOG.json181
-rw-r--r--packages/react-docs/CHANGELOG.md80
-rw-r--r--packages/react-docs/README.md20
-rw-r--r--packages/react-docs/package.json34
-rw-r--r--packages/react-docs/src/components/badge.tsx5
-rw-r--r--packages/react-docs/src/components/comment.tsx1
-rw-r--r--packages/react-docs/src/components/custom_enum.tsx5
-rw-r--r--packages/react-docs/src/components/documentation.tsx42
-rw-r--r--packages/react-docs/src/components/enum.tsx6
-rw-r--r--packages/react-docs/src/components/event_definition.tsx6
-rw-r--r--packages/react-docs/src/components/interface.tsx7
-rw-r--r--packages/react-docs/src/components/signature.tsx7
-rw-r--r--packages/react-docs/src/components/signature_block.tsx8
-rw-r--r--packages/react-docs/src/components/source_link.tsx5
-rw-r--r--packages/react-docs/src/components/type.tsx16
-rw-r--r--packages/react-docs/src/components/type_definition.tsx51
-rw-r--r--packages/react-docs/src/docs_info.ts16
-rw-r--r--packages/react-docs/src/globals.d.ts8
-rw-r--r--packages/react-docs/src/types.ts8
-rw-r--r--packages/react-docs/src/utils/doxity_utils.ts26
-rw-r--r--packages/react-docs/src/utils/typedoc_utils.ts23
-rw-r--r--packages/react-docs/src/utils/utils.ts5
-rw-r--r--packages/react-docs/tslint.json3
-rw-r--r--packages/react-shared/CHANGELOG.json156
-rw-r--r--packages/react-shared/CHANGELOG.md70
-rw-r--r--packages/react-shared/README.md22
-rw-r--r--packages/react-shared/package.json25
-rw-r--r--packages/react-shared/src/components/anchor_title.tsx23
-rw-r--r--packages/react-shared/src/components/markdown_code_block.tsx5
-rw-r--r--packages/react-shared/src/components/markdown_link_block.tsx6
-rw-r--r--packages/react-shared/src/components/markdown_section.tsx5
-rw-r--r--packages/react-shared/src/components/nested_sidebar_menu.tsx5
-rw-r--r--packages/react-shared/src/components/section_header.tsx6
-rw-r--r--packages/react-shared/src/components/version_drop_down.tsx8
-rw-r--r--packages/react-shared/src/globals.d.ts8
-rw-r--r--packages/react-shared/src/utils/colors.ts15
-rw-r--r--packages/react-shared/src/utils/utils.ts6
-rw-r--r--packages/react-shared/tslint.json3
-rw-r--r--packages/sol-compiler/.npmignore (renamed from packages/deployer/.npmignore)0
-rw-r--r--packages/sol-compiler/CHANGELOG.json260
-rw-r--r--packages/sol-compiler/CHANGELOG.md106
-rw-r--r--packages/sol-compiler/README.md97
-rwxr-xr-xpackages/sol-compiler/bin/sol-compiler.js2
-rw-r--r--packages/sol-compiler/coverage/.gitkeep0
-rw-r--r--packages/sol-compiler/package.json102
-rw-r--r--packages/sol-compiler/solc_bin/.gitkeep0
-rw-r--r--packages/sol-compiler/src/cli.ts44
-rw-r--r--packages/sol-compiler/src/compiler.ts273
-rw-r--r--packages/sol-compiler/src/globals.d.ts6
-rw-r--r--packages/sol-compiler/src/index.ts3
-rw-r--r--packages/sol-compiler/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/sol-compiler/src/monorepo_scripts/stage_docs.ts8
-rw-r--r--packages/sol-compiler/src/schemas/compiler_options_schema.ts26
-rw-r--r--packages/sol-compiler/src/solc/bin_paths.ts21
-rw-r--r--packages/sol-compiler/src/utils/compiler.ts108
-rw-r--r--packages/sol-compiler/src/utils/constants.ts5
-rw-r--r--packages/sol-compiler/src/utils/encoder.ts18
-rw-r--r--packages/sol-compiler/src/utils/fs_wrapper.ts13
-rw-r--r--packages/sol-compiler/src/utils/types.ts77
-rw-r--r--packages/sol-compiler/src/utils/utils.ts6
-rw-r--r--packages/sol-compiler/test/compiler_test.ts50
-rw-r--r--packages/sol-compiler/test/compiler_utils_test.ts83
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/Exchange.sol603
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol115
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol41
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/base/Token.sol38
-rw-r--r--packages/sol-compiler/test/fixtures/exchange_bin.ts4
-rw-r--r--packages/sol-compiler/test/util/constants.ts11
-rw-r--r--packages/sol-compiler/test/util/provider.ts7
-rw-r--r--packages/sol-compiler/tsconfig.json8
-rw-r--r--packages/sol-compiler/tslint.json3
-rw-r--r--packages/sol-cov/CHANGELOG.json225
-rw-r--r--packages/sol-cov/CHANGELOG.md82
-rw-r--r--packages/sol-cov/README.md32
-rw-r--r--packages/sol-cov/compiler.json18
-rw-r--r--packages/sol-cov/package.json65
-rw-r--r--packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts5
-rw-r--r--packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts56
-rw-r--r--packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts83
-rw-r--r--packages/sol-cov/src/ast_visitor.ts51
-rw-r--r--packages/sol-cov/src/collect_contract_data.ts44
-rw-r--r--packages/sol-cov/src/collect_coverage_entries.ts25
-rw-r--r--packages/sol-cov/src/constants.ts2
-rw-r--r--packages/sol-cov/src/coverage_manager.ts186
-rw-r--r--packages/sol-cov/src/coverage_subprovider.ts282
-rw-r--r--packages/sol-cov/src/get_source_range_snippet.ts180
-rw-r--r--packages/sol-cov/src/globals.d.ts317
-rw-r--r--packages/sol-cov/src/index.ts7
-rw-r--r--packages/sol-cov/src/profiler_subprovider.ts91
-rw-r--r--packages/sol-cov/src/revert_trace.ts90
-rw-r--r--packages/sol-cov/src/revert_trace_subprovider.ts163
-rw-r--r--packages/sol-cov/src/source_maps.ts6
-rw-r--r--packages/sol-cov/src/trace.ts99
-rw-r--r--packages/sol-cov/src/trace_collection_subprovider.ts187
-rw-r--r--packages/sol-cov/src/trace_collector.ts93
-rw-r--r--packages/sol-cov/src/trace_info_subprovider.ts59
-rw-r--r--packages/sol-cov/src/types.ts39
-rw-r--r--packages/sol-cov/src/utils.ts76
-rw-r--r--packages/sol-cov/test/collect_contracts_data_test.ts30
-rw-r--r--packages/sol-cov/test/collect_coverage_entries_test.ts54
-rw-r--r--packages/sol-cov/test/fixtures/artifacts/SimpleStorage.json64
-rw-r--r--packages/sol-cov/test/fixtures/artifacts/Simplest.json20
-rw-r--r--packages/sol-cov/test/fixtures/contracts/SimpleStorage.sol2
-rw-r--r--packages/sol-cov/test/fixtures/contracts/SolcovIgnore.sol22
-rw-r--r--packages/sol-cov/test/instructions_test.ts3
-rw-r--r--packages/sol-cov/test/sol_compiler_artifact_adapter_test.ts29
-rw-r--r--packages/sol-cov/test/trace_test.ts55
-rw-r--r--packages/sol-cov/tsconfig.json7
-rw-r--r--packages/sol-resolver/CHANGELOG.json129
-rw-r--r--packages/sol-resolver/CHANGELOG.md60
-rw-r--r--packages/sol-resolver/README.md67
-rw-r--r--packages/sol-resolver/package.json43
-rw-r--r--packages/sol-resolver/src/globals.d.ts7
-rw-r--r--packages/sol-resolver/src/index.ts9
-rw-r--r--packages/sol-resolver/src/monorepo_scripts/postpublish.ts8
-rw-r--r--packages/sol-resolver/src/resolvers/enumerable_resolver.ts7
-rw-r--r--packages/sol-resolver/src/resolvers/fallthrough_resolver.ts21
-rw-r--r--packages/sol-resolver/src/resolvers/fs_resolver.ts19
-rw-r--r--packages/sol-resolver/src/resolvers/name_resolver.ts72
-rw-r--r--packages/sol-resolver/src/resolvers/npm_resolver.ts34
-rw-r--r--packages/sol-resolver/src/resolvers/relative_fs_resolver.ts26
-rw-r--r--packages/sol-resolver/src/resolvers/resolver.ts14
-rw-r--r--packages/sol-resolver/src/resolvers/url_resolver.ts21
-rw-r--r--packages/sol-resolver/src/types.ts8
-rw-r--r--packages/sol-resolver/tsconfig.json7
-rw-r--r--packages/sol-resolver/tslint.json3
-rw-r--r--packages/sra-api/.discharge.json13
-rw-r--r--packages/sra-api/.npmignore8
-rw-r--r--packages/sra-api/CHANGELOG.json12
-rw-r--r--packages/sra-api/CHANGELOG.md10
-rw-r--r--packages/sra-api/README.md93
-rw-r--r--packages/sra-api/build_scripts/buildJson.ts7
-rw-r--r--packages/sra-api/package.json60
-rw-r--r--packages/sra-api/public/api.json1
-rw-r--r--packages/sra-api/public/index.html24
-rw-r--r--packages/sra-api/src/api.ts301
-rw-r--r--packages/sra-api/src/errors.ts24
-rw-r--r--packages/sra-api/src/examples/errors.ts11
-rw-r--r--packages/sra-api/src/examples/index.ts21
-rw-r--r--packages/sra-api/src/examples/relayerApiAssetDataPairsResponse.ts21
-rw-r--r--packages/sra-api/src/examples/relayerApiFeeRecipientsResponse.ts10
-rw-r--r--packages/sra-api/src/examples/relayerApiOrder.ts19
-rw-r--r--packages/sra-api/src/examples/relayerApiOrderConfig0
-rw-r--r--packages/sra-api/src/examples/relayerApiOrderConfigPayload.ts10
-rw-r--r--packages/sra-api/src/examples/relayerApiOrderConfigResponse.ts6
-rw-r--r--packages/sra-api/src/examples/relayerApiOrderbookResponse.ts54
-rw-r--r--packages/sra-api/src/examples/relayerApiOrdersResponse.ts26
-rw-r--r--packages/sra-api/src/examples/signedOrder.ts16
-rw-r--r--packages/sra-api/src/headers.ts20
-rw-r--r--packages/sra-api/src/index.ts1
-rw-r--r--packages/sra-api/src/json-schemas.ts63
-rw-r--r--packages/sra-api/src/md/index.ts5
-rw-r--r--packages/sra-api/src/md/introduction.md214
-rw-r--r--packages/sra-api/src/parameters.ts36
-rw-r--r--packages/sra-api/src/responses.ts24
-rw-r--r--packages/sra-api/tsconfig.json7
-rw-r--r--packages/sra-api/tslint.json3
-rw-r--r--packages/sra-report/CHANGELOG.json199
-rw-r--r--packages/sra-report/CHANGELOG.md90
-rw-r--r--packages/sra-report/README.md20
-rwxr-xr-xpackages/sra-report/bin/sra-report.js2
-rw-r--r--packages/sra-report/coverage/.gitkeep0
-rw-r--r--packages/sra-report/package.json50
-rw-r--r--packages/sra-report/src/globals.d.ts27
-rw-r--r--packages/sra-report/src/index.ts17
-rw-r--r--packages/sra-report/src/postman_environment_factory.ts49
-rw-r--r--packages/sra-report/test/test_runner.ts25
-rw-r--r--packages/subproviders/CHANGELOG.json190
-rw-r--r--packages/subproviders/CHANGELOG.md83
-rw-r--r--packages/subproviders/README.md16
-rw-r--r--packages/subproviders/package.json64
-rw-r--r--packages/subproviders/src/globals.d.ts143
-rw-r--r--packages/subproviders/src/index.ts12
-rw-r--r--packages/subproviders/src/subproviders/base_wallet_subprovider.ts139
-rw-r--r--packages/subproviders/src/subproviders/empty_wallet_subprovider.ts6
-rw-r--r--packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts68
-rw-r--r--packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts8
-rw-r--r--packages/subproviders/src/subproviders/ganache.ts11
-rw-r--r--packages/subproviders/src/subproviders/injected_web3.ts58
-rw-r--r--packages/subproviders/src/subproviders/ledger.ts324
-rw-r--r--packages/subproviders/src/subproviders/mnemonic_wallet.ts144
-rw-r--r--packages/subproviders/src/subproviders/nonce_tracker.ts9
-rw-r--r--packages/subproviders/src/subproviders/private_key_wallet.ts87
-rw-r--r--packages/subproviders/src/subproviders/redundant_rpc.ts70
-rw-r--r--packages/subproviders/src/subproviders/redundant_subprovider.ts65
-rw-r--r--packages/subproviders/src/subproviders/rpc_subprovider.ts90
-rw-r--r--packages/subproviders/src/subproviders/signer.ts75
-rw-r--r--packages/subproviders/src/subproviders/subprovider.ts48
-rw-r--r--packages/subproviders/src/types.ts50
-rw-r--r--packages/subproviders/src/utils/subprovider_utils.ts15
-rw-r--r--packages/subproviders/src/utils/wallet_utils.ts78
-rw-r--r--packages/subproviders/test/chai_setup.ts2
-rw-r--r--packages/subproviders/test/integration/ledger_subprovider_test.ts95
-rw-r--r--packages/subproviders/test/unit/eth_lightwallet_subprovider_test.ts166
-rw-r--r--packages/subproviders/test/unit/ledger_subprovider_test.ts62
-rw-r--r--packages/subproviders/test/unit/mnemonic_wallet_subprovider_test.ts209
-rw-r--r--packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts38
-rw-r--r--packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts211
-rw-r--r--packages/subproviders/test/unit/redundant_rpc_subprovider_test.ts32
-rw-r--r--packages/subproviders/test/utils/configs.ts5
-rw-r--r--packages/subproviders/test/utils/fixture_data.ts33
-rw-r--r--packages/subproviders/test/utils/ganache_subprovider.ts18
-rw-r--r--packages/subproviders/test/utils/report_callback_errors.ts2
-rw-r--r--packages/subproviders/tsconfig.json7
-rw-r--r--packages/testnet-faucets/Dockerfile7
-rw-r--r--packages/testnet-faucets/README.md40
-rw-r--r--packages/testnet-faucets/gulpfile.js6
-rw-r--r--packages/testnet-faucets/package.json40
-rw-r--r--packages/testnet-faucets/src/ts/constants.ts5
-rw-r--r--packages/testnet-faucets/src/ts/dispatch_queue.ts8
-rw-r--r--packages/testnet-faucets/src/ts/dispense_asset_tasks.ts20
-rw-r--r--packages/testnet-faucets/src/ts/error_reporter.ts8
-rw-r--r--packages/testnet-faucets/src/ts/global.d.ts33
-rw-r--r--packages/testnet-faucets/src/ts/handler.ts88
-rw-r--r--packages/testnet-faucets/src/ts/id_management.ts35
-rw-r--r--packages/testnet-faucets/src/ts/parameter_transformer.ts8
-rw-r--r--packages/testnet-faucets/src/ts/server.ts32
-rw-r--r--packages/testnet-faucets/tsconfig.json6
-rw-r--r--packages/tslint-config/CHANGELOG.json148
-rw-r--r--packages/tslint-config/CHANGELOG.md70
-rw-r--r--packages/tslint-config/README.md18
-rw-r--r--packages/tslint-config/package.json21
-rw-r--r--packages/tslint-config/rules/booleanNamingRule.ts69
-rw-r--r--packages/tslint-config/rules/customNoMagicNumbersRule.ts79
-rw-r--r--packages/tslint-config/rules/underscorePrivateAndProtectedRule.ts4
-rw-r--r--packages/tslint-config/tsconfig.json2
-rw-r--r--packages/tslint-config/tslint.json70
-rw-r--r--packages/types/CHANGELOG.json169
-rw-r--r--packages/types/CHANGELOG.md75
-rw-r--r--packages/types/README.md20
-rw-r--r--packages/types/package.json23
-rw-r--r--packages/types/src/index.ts464
-rw-r--r--packages/types/tsconfig.json4
-rw-r--r--packages/typescript-typings/CHANGELOG.json158
-rw-r--r--packages/typescript-typings/CHANGELOG.md64
-rw-r--r--packages/typescript-typings/README.md24
-rw-r--r--packages/typescript-typings/package.json15
-rw-r--r--packages/typescript-typings/types/@ledgerhq/index.d.ts45
-rw-r--r--packages/typescript-typings/types/async-child-process/index.d.ts1
-rw-r--r--packages/typescript-typings/types/chai-bignumber/index.d.ts1
-rw-r--r--packages/typescript-typings/types/chai/index.d.ts5
-rw-r--r--packages/typescript-typings/types/detect-node/index.d.ts3
-rw-r--r--packages/typescript-typings/types/dirty-chai/index.d.ts1
-rw-r--r--packages/typescript-typings/types/es6-promisify/index.d.ts1
-rw-r--r--packages/typescript-typings/types/eth-lightwallet/index.d.ts54
-rw-r--r--packages/typescript-typings/types/ethereumjs-abi/index.d.ts7
-rw-r--r--packages/typescript-typings/types/ethereumjs-util/index.d.ts100
-rw-r--r--packages/typescript-typings/types/ethers-contracts/index.d.ts28
-rw-r--r--packages/typescript-typings/types/ethers/index.d.ts55
-rw-r--r--packages/typescript-typings/types/ganache-core/index.d.ts16
-rw-r--r--packages/typescript-typings/types/json-rpc-error/index.d.ts8
-rw-r--r--packages/typescript-typings/types/keccak/index.d.ts1
-rw-r--r--packages/typescript-typings/types/newman/index.d.ts24
-rw-r--r--packages/typescript-typings/types/openapi-schema-validation/index.d.ts1
-rw-r--r--packages/typescript-typings/types/promisify-child-process/index.d.ts1
-rw-r--r--packages/typescript-typings/types/publish-release/index.d.ts1
-rw-r--r--packages/typescript-typings/types/react-highlight/index.d.ts1
-rw-r--r--packages/typescript-typings/types/react-popper/index.d.ts49
-rw-r--r--packages/typescript-typings/types/react-tooltip/index.d.ts1
-rw-r--r--packages/typescript-typings/types/request-promise-native/index.d.ts1
-rw-r--r--packages/typescript-typings/types/rollbar/index.d.ts1
-rw-r--r--packages/typescript-typings/types/semver-diff/index.d.ts1
-rw-r--r--packages/typescript-typings/types/semver-sort/index.d.ts3
-rw-r--r--packages/typescript-typings/types/solc/index.d.ts156
-rw-r--r--packages/typescript-typings/types/to-snake-case/index.d.ts4
-rw-r--r--packages/typescript-typings/types/truffle-hdwalet-provider/index.d.ts11
-rw-r--r--packages/typescript-typings/types/web3-eth-abi/index.d.ts3
-rw-r--r--packages/typescript-typings/types/web3-provider-engine/index.d.ts62
-rw-r--r--packages/typescript-typings/types/web3/index.d.ts18
-rw-r--r--packages/utils/CHANGELOG.json179
-rw-r--r--packages/utils/CHANGELOG.md80
-rw-r--r--packages/utils/README.md33
-rw-r--r--packages/utils/coverage/.gitkeep0
-rw-r--r--packages/utils/package.json44
-rw-r--r--packages/utils/src/abi_decoder.ts57
-rw-r--r--packages/utils/src/abi_utils.ts224
-rw-r--r--packages/utils/src/address_utils.ts16
-rw-r--r--packages/utils/src/configured_bignumber.ts9
-rw-r--r--packages/utils/src/constants.ts1
-rw-r--r--packages/utils/src/error_utils.ts5
-rw-r--r--packages/utils/src/fetchAsync.ts40
-rw-r--r--packages/utils/src/index.ts4
-rw-r--r--packages/utils/src/interval_utils.ts18
-rw-r--r--packages/utils/src/log_utils.ts3
-rw-r--r--packages/utils/test/abi_utils_test.ts19
-rw-r--r--packages/utils/tsconfig.json2
-rw-r--r--packages/web3-wrapper/CHANGELOG.json220
-rw-r--r--packages/web3-wrapper/CHANGELOG.md86
-rw-r--r--packages/web3-wrapper/README.md22
-rw-r--r--packages/web3-wrapper/coverage/.gitkeep0
-rw-r--r--packages/web3-wrapper/package.json56
-rw-r--r--packages/web3-wrapper/src/index.ts339
-rw-r--r--packages/web3-wrapper/src/marshaller.ts210
-rw-r--r--packages/web3-wrapper/src/types.ts65
-rw-r--r--packages/web3-wrapper/src/utils.ts58
-rw-r--r--packages/web3-wrapper/src/web3_wrapper.ts653
-rw-r--r--packages/web3-wrapper/test/utils/chai_setup.ts13
-rw-r--r--packages/web3-wrapper/test/web3_wrapper_test.ts132
-rw-r--r--packages/web3-wrapper/tsconfig.json2
-rw-r--r--packages/website/README.md14
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/async.md (renamed from packages/website/md/docs/0xjs/async.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/errors.md (renamed from packages/website/md/docs/0xjs/errors.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/installation.md (renamed from packages/website/md/docs/0xjs/installation.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/introduction.md (renamed from packages/website/md/docs/0xjs/introduction.md)0
-rw-r--r--packages/website/md/docs/0xjs/1.0.0/versioning.md (renamed from packages/website/md/docs/0xjs/versioning.md)0
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/introduction.md3
-rw-r--r--packages/website/md/docs/0xjs/2.0.0/versioning.md1
-rw-r--r--packages/website/md/docs/connect/1.0.0/installation.md (renamed from packages/website/md/docs/connect/installation.md)0
-rw-r--r--packages/website/md/docs/connect/1.0.0/introduction.md (renamed from packages/website/md/docs/connect/introduction.md)0
-rw-r--r--packages/website/md/docs/deployer/installation.md24
-rw-r--r--packages/website/md/docs/deployer/introduction.md18
-rw-r--r--packages/website/md/docs/deployer/usage.md56
-rw-r--r--packages/website/md/docs/ethereum_types/installation.md11
-rw-r--r--packages/website/md/docs/ethereum_types/introduction.md1
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/installation.md (renamed from packages/website/md/docs/json_schemas/installation.md)0
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/introduction.md5
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/schemas.md (renamed from packages/website/md/docs/json_schemas/schemas.md)0
-rw-r--r--packages/website/md/docs/json_schemas/1.0.0/usage.md (renamed from packages/website/md/docs/json_schemas/usage.md)0
-rw-r--r--packages/website/md/docs/json_schemas/introduction.md3
-rw-r--r--packages/website/md/docs/order_utils/1.0.0/installation.md17
-rw-r--r--packages/website/md/docs/order_utils/1.0.0/introduction.md1
-rw-r--r--packages/website/md/docs/smart_contracts/1.0.0/introduction.md (renamed from packages/website/md/docs/smart_contracts/introduction.md)0
-rw-r--r--packages/website/md/docs/sol-compiler/installation.md23
-rw-r--r--packages/website/md/docs/sol-compiler/introduction.md8
-rw-r--r--packages/website/md/docs/sol-compiler/usage.md24
-rw-r--r--packages/website/md/docs/sol_cov/usage.md42
-rw-r--r--packages/website/md/docs/web3_wrapper/introduction.md2
-rw-r--r--packages/website/package.json76
-rw-r--r--packages/website/public/images/eth_dollar.svg29
-rw-r--r--packages/website/public/images/eth_token.svg20
-rw-r--r--packages/website/public/images/eth_token_erc20.svg22
-rw-r--r--packages/website/public/images/ether_alt.svg7
-rw-r--r--packages/website/public/images/fake_toggle.svg4
-rw-r--r--packages/website/public/images/jobs/calendar-icon.svg15
-rw-r--r--packages/website/public/images/jobs/heart-icon.svg3
-rw-r--r--packages/website/public/images/jobs/hero-dots-left.svg17
-rw-r--r--packages/website/public/images/jobs/hero-dots-right.svg16
-rw-r--r--packages/website/public/images/jobs/ship-icon.svg6
-rw-r--r--packages/website/public/images/jobs/world-map.svg64
-rw-r--r--packages/website/public/images/landing/project_logos/ercdex.pngbin5726 -> 3929 bytes
-rw-r--r--packages/website/public/images/landing/project_logos/imToken.pngbin0 -> 4933 bytes
-rw-r--r--packages/website/public/images/landing/project_logos/the_ocean.pngbin4766 -> 6322 bytes
-rw-r--r--packages/website/public/images/lock_icon.svg3
-rw-r--r--packages/website/public/images/relayer_fallback.pngbin0 -> 4707 bytes
-rw-r--r--packages/website/public/images/setup_account_icon.svg3
-rw-r--r--packages/website/public/images/team/alexbrowne.pngbin0 -> 146699 bytes
-rw-r--r--packages/website/public/images/team/amir.jpegbin21098 -> 0 bytes
-rw-r--r--packages/website/public/images/team/amir.pngbin0 -> 116488 bytes
-rw-r--r--packages/website/public/images/team/chris.pngbin0 -> 96388 bytes
-rw-r--r--packages/website/public/images/team/clay.pngbin0 -> 85774 bytes
-rw-r--r--packages/website/public/images/team/fragosti.pngbin0 -> 26209 bytes
-rw-r--r--packages/website/public/images/team/greg.jpegbin0 -> 4100 bytes
-rw-r--r--packages/website/public/images/team/mel.pngbin0 -> 110351 bytes
-rw-r--r--packages/website/public/images/team/peter.jpgbin0 -> 26748 bytes
-rw-r--r--packages/website/public/images/team/philippe.pngbin51419 -> 0 bytes
-rw-r--r--packages/website/public/images/team/remco.jpegbin0 -> 14807 bytes
-rw-r--r--packages/website/public/images/token_icons/1ST.png (renamed from packages/website/public/images/token_icons/firstblood.jpg)bin7872 -> 7872 bytes
-rw-r--r--packages/website/public/images/token_icons/ABYSS.pngbin0 -> 13633 bytes
-rw-r--r--packages/website/public/images/token_icons/ADT.pngbin0 -> 10747 bytes
-rw-r--r--packages/website/public/images/token_icons/AE.pngbin0 -> 12322 bytes
-rw-r--r--packages/website/public/images/token_icons/AION.pngbin0 -> 2777 bytes
-rw-r--r--packages/website/public/images/token_icons/AIR.pngbin0 -> 20802 bytes
-rw-r--r--packages/website/public/images/token_icons/ANT.pngbin0 -> 42477 bytes
-rw-r--r--packages/website/public/images/token_icons/APCC.pngbin0 -> 19592 bytes
-rw-r--r--packages/website/public/images/token_icons/APPC.pngbin0 -> 19592 bytes
-rw-r--r--packages/website/public/images/token_icons/ARN.pngbin0 -> 16200 bytes
-rw-r--r--packages/website/public/images/token_icons/ART.pngbin0 -> 12430 bytes
-rw-r--r--packages/website/public/images/token_icons/AST.pngbin0 -> 14169 bytes
-rw-r--r--packages/website/public/images/token_icons/BAT.pngbin0 -> 6188 bytes
-rw-r--r--packages/website/public/images/token_icons/BCAP.pngbin0 -> 7787 bytes
-rw-r--r--packages/website/public/images/token_icons/BCPT.pngbin0 -> 10283 bytes
-rw-r--r--packages/website/public/images/token_icons/BNT.pngbin0 -> 4011 bytes
-rw-r--r--packages/website/public/images/token_icons/BRM.pngbin0 -> 18794 bytes
-rw-r--r--packages/website/public/images/token_icons/CAG.pngbin0 -> 11062 bytes
-rw-r--r--packages/website/public/images/token_icons/CAN.pngbin0 -> 10234 bytes
-rw-r--r--packages/website/public/images/token_icons/CAT.pngbin0 -> 23361 bytes
-rw-r--r--packages/website/public/images/token_icons/CFI.pngbin0 -> 11105 bytes
-rw-r--r--packages/website/public/images/token_icons/CVC.png (renamed from packages/website/public/images/token_icons/civic.png)bin10700 -> 10700 bytes
-rw-r--r--packages/website/public/images/token_icons/DAI.pngbin0 -> 6926 bytes
-rw-r--r--packages/website/public/images/token_icons/DATA.pngbin0 -> 13313 bytes
-rw-r--r--packages/website/public/images/token_icons/DEB.pngbin0 -> 13991 bytes
-rw-r--r--packages/website/public/images/token_icons/DGD.pngbin0 -> 23282 bytes
-rw-r--r--packages/website/public/images/token_icons/DIVX.pngbin0 -> 5110 bytes
-rw-r--r--packages/website/public/images/token_icons/DNT.pngbin0 -> 10054 bytes
-rw-r--r--packages/website/public/images/token_icons/EDG.png (renamed from packages/website/public/images/token_icons/edgeless.png)bin2712 -> 2712 bytes
-rw-r--r--packages/website/public/images/token_icons/EDU.pngbin0 -> 13535 bytes
-rw-r--r--packages/website/public/images/token_icons/ELEC.pngbin0 -> 11379 bytes
-rw-r--r--packages/website/public/images/token_icons/EMONT.pngbin0 -> 10523 bytes
-rw-r--r--packages/website/public/images/token_icons/ENG.pngbin0 -> 6767 bytes
-rw-r--r--packages/website/public/images/token_icons/ENTR.pngbin0 -> 3951 bytes
-rw-r--r--packages/website/public/images/token_icons/EOS.pngbin0 -> 6979 bytes
-rw-r--r--packages/website/public/images/token_icons/EVE.pngbin0 -> 5895 bytes
-rw-r--r--packages/website/public/images/token_icons/FUN.pngbin0 -> 14973 bytes
-rw-r--r--packages/website/public/images/token_icons/GEE.pngbin0 -> 10235 bytes
-rw-r--r--packages/website/public/images/token_icons/GEN.pngbin0 -> 5280 bytes
-rw-r--r--packages/website/public/images/token_icons/GET.pngbin0 -> 11930 bytes
-rw-r--r--packages/website/public/images/token_icons/GNO.pngbin0 -> 16559 bytes
-rw-r--r--packages/website/public/images/token_icons/GNT.png (renamed from packages/website/public/images/token_icons/golem.png)bin2990 -> 2990 bytes
-rw-r--r--packages/website/public/images/token_icons/HGT.pngbin0 -> 5709 bytes
-rw-r--r--packages/website/public/images/token_icons/HOT.pngbin0 -> 4578 bytes
-rw-r--r--packages/website/public/images/token_icons/ICN.pngbin0 -> 3962 bytes
-rw-r--r--packages/website/public/images/token_icons/IND.pngbin0 -> 4583 bytes
-rw-r--r--packages/website/public/images/token_icons/J8T.pngbin0 -> 10835 bytes
-rw-r--r--packages/website/public/images/token_icons/JET.pngbin0 -> 18374 bytes
-rw-r--r--packages/website/public/images/token_icons/KIN.pngbin0 -> 6075 bytes
-rw-r--r--packages/website/public/images/token_icons/KNC.pngbin0 -> 8396 bytes
-rw-r--r--packages/website/public/images/token_icons/LINK.pngbin0 -> 11267 bytes
-rw-r--r--packages/website/public/images/token_icons/LOOM.pngbin0 -> 9491 bytes
-rw-r--r--packages/website/public/images/token_icons/LUN.pngbin0 -> 13648 bytes
-rw-r--r--packages/website/public/images/token_icons/MANA.pngbin0 -> 17411 bytes
-rw-r--r--packages/website/public/images/token_icons/MCO.pngbin0 -> 6487 bytes
-rw-r--r--packages/website/public/images/token_icons/MKR.pngbin0 -> 6967 bytes
-rw-r--r--packages/website/public/images/token_icons/MLN.png (renamed from packages/website/public/images/token_icons/melon.png)bin3408 -> 3408 bytes
-rw-r--r--packages/website/public/images/token_icons/MOD.pngbin0 -> 7088 bytes
-rw-r--r--packages/website/public/images/token_icons/MORPH.pngbin0 -> 8919 bytes
-rw-r--r--packages/website/public/images/token_icons/MOT.pngbin0 -> 6069 bytes
-rw-r--r--packages/website/public/images/token_icons/MTL.pngbin0 -> 3540 bytes
-rw-r--r--packages/website/public/images/token_icons/NANJ.pngbin0 -> 11577 bytes
-rw-r--r--packages/website/public/images/token_icons/NAVI.pngbin0 -> 6827 bytes
-rw-r--r--packages/website/public/images/token_icons/NCT.pngbin0 -> 5462 bytes
-rw-r--r--packages/website/public/images/token_icons/NDC.pngbin0 -> 20972 bytes
-rw-r--r--packages/website/public/images/token_icons/NEXO.pngbin0 -> 4689 bytes
-rw-r--r--packages/website/public/images/token_icons/NMR.pngbin0 -> 21822 bytes
-rw-r--r--packages/website/public/images/token_icons/OAX.pngbin0 -> 6331 bytes
-rw-r--r--packages/website/public/images/token_icons/OCC.pngbin0 -> 7774 bytes
-rw-r--r--packages/website/public/images/token_icons/OMG.pngbin0 -> 5311 bytes
-rw-r--r--packages/website/public/images/token_icons/OMX.pngbin0 -> 7320 bytes
-rw-r--r--packages/website/public/images/token_icons/PAL.pngbin0 -> 13196 bytes
-rw-r--r--packages/website/public/images/token_icons/PAY.png (renamed from packages/website/public/images/token_icons/tenx.png)bin7276 -> 7276 bytes
-rw-r--r--packages/website/public/images/token_icons/PKT.pngbin0 -> 5900 bytes
-rw-r--r--packages/website/public/images/token_icons/PLAY.pngbin0 -> 3226 bytes
-rw-r--r--packages/website/public/images/token_icons/PLU.pngbin0 -> 51829 bytes
-rw-r--r--packages/website/public/images/token_icons/POLY.pngbin0 -> 9350 bytes
-rw-r--r--packages/website/public/images/token_icons/QTUM.png (renamed from packages/website/public/images/token_icons/qtum.png)bin32496 -> 32496 bytes
-rw-r--r--packages/website/public/images/token_icons/REN.pngbin0 -> 17682 bytes
-rw-r--r--packages/website/public/images/token_icons/REP.pngbin0 -> 13905 bytes
-rw-r--r--packages/website/public/images/token_icons/REQ.pngbin0 -> 4476 bytes
-rw-r--r--packages/website/public/images/token_icons/RFR.pngbin0 -> 8319 bytes
-rw-r--r--packages/website/public/images/token_icons/RLC.pngbin0 -> 9856 bytes
-rw-r--r--packages/website/public/images/token_icons/ROL.pngbin0 -> 16279 bytes
-rw-r--r--packages/website/public/images/token_icons/RVT.pngbin0 -> 9294 bytes
-rw-r--r--packages/website/public/images/token_icons/SALT.pngbin0 -> 5912 bytes
-rw-r--r--packages/website/public/images/token_icons/SAN.pngbin0 -> 7569 bytes
-rw-r--r--packages/website/public/images/token_icons/SIG.pngbin0 -> 9885 bytes
-rw-r--r--packages/website/public/images/token_icons/SNGLS.pngbin0 -> 8475 bytes
-rw-r--r--packages/website/public/images/token_icons/SNT.pngbin0 -> 6530 bytes
-rw-r--r--packages/website/public/images/token_icons/SPANK.pngbin0 -> 16743 bytes
-rw-r--r--packages/website/public/images/token_icons/SPN.pngbin0 -> 4760 bytes
-rw-r--r--packages/website/public/images/token_icons/SS.pngbin0 -> 2576 bytes
-rw-r--r--packages/website/public/images/token_icons/STORJ.pngbin0 -> 8117 bytes
-rw-r--r--packages/website/public/images/token_icons/SUB.pngbin0 -> 15424 bytes
-rw-r--r--packages/website/public/images/token_icons/SWT.pngbin0 -> 1215 bytes
-rw-r--r--packages/website/public/images/token_icons/SXDT.pngbin0 -> 4323 bytes
-rw-r--r--packages/website/public/images/token_icons/TAAS.pngbin0 -> 14580 bytes
-rw-r--r--packages/website/public/images/token_icons/TIME.pngbin0 -> 33752 bytes
-rw-r--r--packages/website/public/images/token_icons/TKN.pngbin0 -> 3743 bytes
-rw-r--r--packages/website/public/images/token_icons/TRL.pngbin0 -> 447936 bytes
-rw-r--r--packages/website/public/images/token_icons/TRST.pngbin0 -> 26306 bytes
-rw-r--r--packages/website/public/images/token_icons/TRX.pngbin0 -> 7941 bytes
-rw-r--r--packages/website/public/images/token_icons/UPP.pngbin0 -> 7700 bytes
-rw-r--r--packages/website/public/images/token_icons/VSL.pngbin0 -> 17717 bytes
-rw-r--r--packages/website/public/images/token_icons/WAND.pngbin0 -> 9201 bytes
-rw-r--r--packages/website/public/images/token_icons/WETH.png (renamed from packages/website/public/images/token_icons/ether_erc20.png)bin7584 -> 7584 bytes
-rw-r--r--packages/website/public/images/token_icons/WINGS.pngbin0 -> 3822 bytes
-rw-r--r--packages/website/public/images/token_icons/WTC.pngbin0 -> 8234 bytes
-rw-r--r--packages/website/public/images/token_icons/WYV.pngbin0 -> 9261 bytes
-rw-r--r--packages/website/public/images/token_icons/XAUR.pngbin0 -> 5150 bytes
-rw-r--r--packages/website/public/images/token_icons/XNK.pngbin0 -> 4117 bytes
-rw-r--r--packages/website/public/images/token_icons/XSC.pngbin0 -> 17956 bytes
-rw-r--r--packages/website/public/images/token_icons/XYO.pngbin0 -> 13793 bytes
-rw-r--r--packages/website/public/images/token_icons/ZIL.pngbin0 -> 4444 bytes
-rw-r--r--packages/website/public/images/token_icons/ZRX.png (renamed from packages/website/public/images/token_icons/zero_ex.png)bin17905 -> 17905 bytes
-rw-r--r--packages/website/public/images/token_icons/adtoken.pngbin5150 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/aragon.pngbin14012 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/augur.pngbin23161 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/bancor.pngbin2274 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/basicattentiontoken.pngbin7082 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/bitquence.pngbin14293 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/btc.pngbin5742 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/clams.pngbin18866 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/cofound-it.pngbin5403 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/default.pngbin20225 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/digixdao.pngbin34397 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/district0x.pngbin25007 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/eos.pngbin2168 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/etheroll.pngbin22736 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/funfair.pngbin18800 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/gnosis.pngbin7554 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/iconomi.pngbin810 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/iexec.pngbin1910 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/lunyr.pngbin5734 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/makerdao.pngbin3161 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/metal.pngbin1295 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/monaco.pngbin6984 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/numeraire.pngbin10272 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/omisego.pngbin5976 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/santiment.pngbin4698 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/singularity.pngbin3849 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/status.pngbin3445 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/storjcoinx.pngbin9453 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/taas.pngbin7823 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/tokencard.pngbin14586 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/trust.pngbin14428 -> 0 bytes
-rw-r--r--packages/website/public/images/token_icons/wings.pngbin16143 -> 0 bytes
-rw-r--r--packages/website/public/images/toshi_logo.jpgbin0 -> 4611 bytes
-rw-r--r--packages/website/public/images/unlock-mm.pngbin0 -> 21137 bytes
-rw-r--r--packages/website/public/images/zrx_ecosystem.svg158
-rw-r--r--packages/website/public/index.html87
-rw-r--r--packages/website/public/js/rollbar.umd.min.js2
-rw-r--r--packages/website/public/js/rollbar.umd.nojson.min.js1
-rw-r--r--packages/website/translations/chinese.json4
-rw-r--r--packages/website/translations/english.json7
-rw-r--r--packages/website/translations/korean.json4
-rw-r--r--packages/website/translations/russian.json4
-rw-r--r--packages/website/translations/spanish.json4
-rw-r--r--packages/website/ts/artifacts/Exchange.json (renamed from packages/0x.js/src/artifacts/Exchange.json)0
-rw-r--r--packages/website/ts/blockchain.ts587
-rw-r--r--packages/website/ts/blockchain_watcher.ts123
-rw-r--r--packages/website/ts/components/dialogs/blockchain_err_dialog.tsx34
-rw-r--r--packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx34
-rw-r--r--packages/website/ts/components/dialogs/ledger_config_dialog.tsx31
-rw-r--r--packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx4
-rw-r--r--packages/website/ts/components/dialogs/send_dialog.tsx55
-rw-r--r--packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx9
-rw-r--r--packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx8
-rw-r--r--packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx4
-rw-r--r--packages/website/ts/components/dropdowns/network_drop_down.tsx4
-rw-r--r--packages/website/ts/components/eth_weth_conversion_button.tsx16
-rw-r--r--packages/website/ts/components/eth_wrappers.tsx65
-rw-r--r--packages/website/ts/components/fill_order.tsx93
-rw-r--r--packages/website/ts/components/fill_order_json.tsx6
-rw-r--r--packages/website/ts/components/fill_warning_dialog.tsx10
-rw-r--r--packages/website/ts/components/flash_messages/asset_send_completed.tsx34
-rw-r--r--packages/website/ts/components/flash_messages/token_send_completed.tsx34
-rw-r--r--packages/website/ts/components/flash_messages/transaction_submitted.tsx2
-rw-r--r--packages/website/ts/components/footer.tsx14
-rw-r--r--packages/website/ts/components/forms/subscribe_form.tsx127
-rw-r--r--packages/website/ts/components/generate_order/asset_picker.tsx100
-rw-r--r--packages/website/ts/components/generate_order/generate_order_form.tsx74
-rw-r--r--packages/website/ts/components/generate_order/new_token_form.tsx29
-rw-r--r--packages/website/ts/components/inputs/address_input.tsx6
-rw-r--r--packages/website/ts/components/inputs/allowance_state_toggle.tsx160
-rw-r--r--packages/website/ts/components/inputs/allowance_toggle.tsx134
-rw-r--r--packages/website/ts/components/inputs/balance_bounded_input.tsx95
-rw-r--r--packages/website/ts/components/inputs/eth_amount_input.tsx28
-rw-r--r--packages/website/ts/components/inputs/expiration_input.tsx10
-rw-r--r--packages/website/ts/components/inputs/hash_input.tsx9
-rw-r--r--packages/website/ts/components/inputs/identicon_address_input.tsx3
-rw-r--r--packages/website/ts/components/inputs/token_amount_input.tsx50
-rw-r--r--packages/website/ts/components/inputs/token_input.tsx9
-rw-r--r--packages/website/ts/components/meta_tags.tsx25
-rw-r--r--packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx40
-rw-r--r--packages/website/ts/components/onboarding/congrats_onboarding_step.tsx15
-rw-r--r--packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx42
-rw-r--r--packages/website/ts/components/onboarding/intro_onboarding_step.tsx28
-rw-r--r--packages/website/ts/components/onboarding/onboarding_card.tsx115
-rw-r--r--packages/website/ts/components/onboarding/onboarding_flow.tsx182
-rw-r--r--packages/website/ts/components/onboarding/onboarding_tooltip.tsx30
-rw-r--r--packages/website/ts/components/onboarding/portal_onboarding_flow.tsx281
-rw-r--r--packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx30
-rw-r--r--packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx8
-rw-r--r--packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx88
-rw-r--r--packages/website/ts/components/order_json.tsx22
-rw-r--r--packages/website/ts/components/portal.tsx427
-rw-r--r--packages/website/ts/components/portal/back_button.tsx42
-rw-r--r--packages/website/ts/components/portal/drawer_menu.tsx77
-rw-r--r--packages/website/ts/components/portal/loading.tsx21
-rw-r--r--packages/website/ts/components/portal/menu.tsx120
-rw-r--r--packages/website/ts/components/portal/portal.tsx738
-rw-r--r--packages/website/ts/components/portal/section.tsx14
-rw-r--r--packages/website/ts/components/portal/text_header.tsx16
-rw-r--r--packages/website/ts/components/portal_menu.tsx84
-rw-r--r--packages/website/ts/components/redirector.tsx9
-rw-r--r--packages/website/ts/components/relayer_index/relayer_grid_tile.tsx134
-rw-r--r--packages/website/ts/components/relayer_index/relayer_index.tsx107
-rw-r--r--packages/website/ts/components/relayer_index/relayer_top_tokens.tsx61
-rw-r--r--packages/website/ts/components/send_button.tsx22
-rw-r--r--packages/website/ts/components/sidebar_header.tsx5
-rw-r--r--packages/website/ts/components/token_balances.tsx222
-rw-r--r--packages/website/ts/components/top_bar/provider_display.tsx239
-rw-r--r--packages/website/ts/components/top_bar/provider_picker.tsx81
-rw-r--r--packages/website/ts/components/top_bar/top_bar.tsx244
-rw-r--r--packages/website/ts/components/top_bar/top_bar_menu_item.tsx28
-rw-r--r--packages/website/ts/components/track_token_confirmation.tsx2
-rw-r--r--packages/website/ts/components/trade_history/trade_history.tsx49
-rw-r--r--packages/website/ts/components/trade_history/trade_history_item.tsx24
-rw-r--r--packages/website/ts/components/ui/account_connection.tsx40
-rw-r--r--packages/website/ts/components/ui/alert.tsx4
-rw-r--r--packages/website/ts/components/ui/allowance_state_view.tsx51
-rw-r--r--packages/website/ts/components/ui/animation.tsx42
-rw-r--r--packages/website/ts/components/ui/balance.tsx27
-rw-r--r--packages/website/ts/components/ui/button.tsx99
-rw-r--r--packages/website/ts/components/ui/circle.tsx16
-rw-r--r--packages/website/ts/components/ui/container.tsx55
-rw-r--r--packages/website/ts/components/ui/copy_icon.tsx13
-rw-r--r--packages/website/ts/components/ui/drop_down.tsx69
-rw-r--r--packages/website/ts/components/ui/etherscan_icon.tsx3
-rw-r--r--packages/website/ts/components/ui/fake_text_field.tsx4
-rw-r--r--packages/website/ts/components/ui/filled_image.tsx18
-rw-r--r--packages/website/ts/components/ui/flash_message.tsx4
-rw-r--r--packages/website/ts/components/ui/icon_button.tsx64
-rw-r--r--packages/website/ts/components/ui/identicon.tsx36
-rw-r--r--packages/website/ts/components/ui/image.tsx47
-rw-r--r--packages/website/ts/components/ui/input.tsx43
-rw-r--r--packages/website/ts/components/ui/input_label.tsx6
-rw-r--r--packages/website/ts/components/ui/island.tsx29
-rw-r--r--packages/website/ts/components/ui/lifecycle_raised_button.tsx11
-rw-r--r--packages/website/ts/components/ui/menu_item.tsx6
-rw-r--r--packages/website/ts/components/ui/overlay.tsx32
-rw-r--r--packages/website/ts/components/ui/party.tsx3
-rw-r--r--packages/website/ts/components/ui/pointer.tsx72
-rw-r--r--packages/website/ts/components/ui/retry.tsx32
-rw-r--r--packages/website/ts/components/ui/simple_menu.tsx88
-rw-r--r--packages/website/ts/components/ui/spinner.tsx54
-rw-r--r--packages/website/ts/components/ui/swap_icon.tsx5
-rw-r--r--packages/website/ts/components/ui/text.tsx72
-rw-r--r--packages/website/ts/components/ui/token_icon.tsx27
-rw-r--r--packages/website/ts/components/visual_order.tsx8
-rw-r--r--packages/website/ts/components/wallet/body_overlay.tsx136
-rw-r--r--packages/website/ts/components/wallet/null_token_row.tsx41
-rw-r--r--packages/website/ts/components/wallet/placeholder.tsx25
-rw-r--r--packages/website/ts/components/wallet/standard_icon_row.tsx44
-rw-r--r--packages/website/ts/components/wallet/wallet.tsx696
-rw-r--r--packages/website/ts/components/wallet/wallet_disconnected_item.tsx81
-rw-r--r--packages/website/ts/components/wallet/wrap_ether_item.tsx148
-rw-r--r--packages/website/ts/containers/about.ts3
-rw-r--r--packages/website/ts/containers/connect_documentation.ts20
-rw-r--r--packages/website/ts/containers/deployer_documentation.ts102
-rw-r--r--packages/website/ts/containers/ethereum_types_documentation.ts124
-rw-r--r--packages/website/ts/containers/faq.ts3
-rw-r--r--packages/website/ts/containers/generate_order_form.ts7
-rw-r--r--packages/website/ts/containers/inputs/allowance_state_toggle.ts42
-rw-r--r--packages/website/ts/containers/inputs/eth_amount_input.ts36
-rw-r--r--packages/website/ts/containers/jobs.ts28
-rw-r--r--packages/website/ts/containers/json_schemas_documentation.ts29
-rw-r--r--packages/website/ts/containers/landing.ts3
-rw-r--r--packages/website/ts/containers/not_found.ts3
-rw-r--r--packages/website/ts/containers/order_utils_documentation.ts99
-rw-r--r--packages/website/ts/containers/portal.ts12
-rw-r--r--packages/website/ts/containers/portal_onboarding_flow.ts68
-rw-r--r--packages/website/ts/containers/smart_contracts_documentation.ts13
-rw-r--r--packages/website/ts/containers/sol_compiler_documentation.ts85
-rw-r--r--packages/website/ts/containers/sol_cov_documentation.ts61
-rw-r--r--packages/website/ts/containers/subproviders_documentation.ts50
-rw-r--r--packages/website/ts/containers/web3_wrapper_documentation.ts53
-rw-r--r--packages/website/ts/containers/wiki.ts3
-rw-r--r--packages/website/ts/containers/zero_ex_js_documentation.ts100
-rw-r--r--packages/website/ts/globals.d.ts129
-rw-r--r--packages/website/ts/index.tsx145
-rw-r--r--packages/website/ts/lazy_component.tsx8
-rw-r--r--packages/website/ts/local_storage/local_storage.ts24
-rw-r--r--packages/website/ts/local_storage/state_storage.ts16
-rw-r--r--packages/website/ts/local_storage/tracked_token_storage.ts4
-rw-r--r--packages/website/ts/local_storage/trade_history_storage.tsx32
-rw-r--r--packages/website/ts/pages/about/about.tsx105
-rw-r--r--packages/website/ts/pages/about/profile.tsx11
-rw-r--r--packages/website/ts/pages/documentation/doc_page.tsx26
-rw-r--r--packages/website/ts/pages/faq/faq.tsx8
-rw-r--r--packages/website/ts/pages/faq/question.tsx5
-rw-r--r--packages/website/ts/pages/fullscreen_message.tsx30
-rw-r--r--packages/website/ts/pages/jobs/benefits.tsx158
-rw-r--r--packages/website/ts/pages/jobs/jobs.tsx71
-rw-r--r--packages/website/ts/pages/jobs/join_0x.tsx64
-rw-r--r--packages/website/ts/pages/jobs/mission.tsx47
-rw-r--r--packages/website/ts/pages/jobs/open_positions.tsx179
-rw-r--r--packages/website/ts/pages/jobs/photo_rail.tsx22
-rw-r--r--packages/website/ts/pages/landing/landing.tsx159
-rw-r--r--packages/website/ts/pages/not_found.tsx45
-rw-r--r--packages/website/ts/pages/wiki/wiki.tsx84
-rw-r--r--packages/website/ts/redux/analyticsMiddleware.ts36
-rw-r--r--packages/website/ts/redux/dispatcher.ts71
-rw-r--r--packages/website/ts/redux/reducer.ts49
-rw-r--r--packages/website/ts/redux/store.ts24
-rw-r--r--packages/website/ts/schemas/validator.ts1
-rw-r--r--packages/website/ts/style/colors.ts21
-rw-r--r--packages/website/ts/style/keyframes.ts22
-rw-r--r--packages/website/ts/style/media.ts14
-rw-r--r--packages/website/ts/style/theme.ts17
-rw-r--r--packages/website/ts/style/z_index.ts6
-rw-r--r--packages/website/ts/types.ts149
-rw-r--r--packages/website/ts/utils/analytics.ts103
-rw-r--r--packages/website/ts/utils/backend_client.ts61
-rw-r--r--packages/website/ts/utils/configs.ts58
-rw-r--r--packages/website/ts/utils/constants.ts23
-rw-r--r--packages/website/ts/utils/doc_utils.ts12
-rw-r--r--packages/website/ts/utils/error_reporter.ts32
-rw-r--r--packages/website/ts/utils/fetch_utils.ts48
-rw-r--r--packages/website/ts/utils/mui_theme.ts2
-rw-r--r--packages/website/ts/utils/order_parser.ts33
-rw-r--r--packages/website/ts/utils/translate.ts21
-rw-r--r--packages/website/ts/utils/utils.ts310
-rw-r--r--packages/website/ts/utils/wallet_item_styles.ts7
-rw-r--r--packages/website/tslint.json3
-rw-r--r--packages/website/webpack.config.js69
-rw-r--r--tsconfig.json2
-rw-r--r--yarn.lock5024
1389 files changed, 256803 insertions, 34447 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 615980e88..a6fb511b9 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -3,7 +3,7 @@ version: 2
jobs:
build:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
environment:
CONTRACTS_COMMIT_HASH: '9ed05f5'
working_directory: ~/repo
@@ -11,104 +11,111 @@ jobs:
- checkout
- run: echo 'export PATH=$HOME/CIRCLE_PROJECT_REPONAME/node_modules/.bin:$PATH' >> $BASH_ENV
- restore_cache:
- key: dependency-cache-{{ checksum "package.json" }}
+ name: Restore Yarn Package Cache
+ keys:
+ - yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }}
+ - yarn-packages-{{ .Branch }}
+ - yarn-packages-master
+ - yarn-packages-
- run:
name: yarn
- command: yarn --frozen-lockfile
+ command: yarn --frozen-lockfile install
- save_cache:
- key: dependency-cache-{{ checksum "package.json" }}
+ name: Save Yarn Package Cache
+ key: yarn-packages-{{ .Branch }}-{{ checksum "yarn.lock" }}
paths:
- - ./node_modules
- - run: wget https://s3.amazonaws.com/testrpc-shapshots/${CONTRACTS_COMMIT_HASH}.zip
- - run: unzip ${CONTRACTS_COMMIT_HASH}.zip -d testrpc_snapshot
- - run: node ./node_modules/lerna/bin/lerna.js bootstrap
- - run: yarn lerna:run build
+ - node_modules/
+ - run: >
+ if [ -z "$(git diff --name-only v2-prototype packages/website)" ]; then
+ yarn build --exclude website
+ else
+ yarn build
+ fi
- save_cache:
key: repo-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo
- test-installation:
+ test-contracts-ganache:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- - run: yarn test:installation
- test-0xjs:
+ - run: yarn wsrun test:circleci contracts
+ test-contracts-geth:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
+ - image: albrow/0x-devnet
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: testrpc
- command: npm run testrpc -- --db testrpc_snapshot
- background: true
- - run: yarn lerna:run --scope 0x.js test:circleci
- - save_cache:
- key: coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
- paths:
- - ~/repo/packages/0x.js/coverage/lcov.info
- test-contracts:
+ # HACK(albrow): we need to sleep 10 seconds to ensure the devnet is
+ # initialized
+ - run: sleep 10 && TEST_PROVIDER=geth yarn wsrun test contracts
+ test-publish:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
+ - image: verdaccio/verdaccio
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: testrpc
- command: npm run testrpc -- --db testrpc_snapshot
- background: true
- - run: yarn lerna:run --scope contracts test:circleci
- - save_cache:
- key: coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
- paths:
- - ~/repo/packages/contracts/coverage/lcov.info
- test-deployer:
+ - run: yarn test:publish:circleci
+ test-rest:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
working_directory: ~/repo
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: testrpc
- command: npm run testrpc -- --db testrpc_snapshot
- background: true
- - run: yarn lerna:run --scope @0xproject/deployer test:circleci
+ - run: yarn wsrun test:circleci 0x.js
+ - run: yarn wsrun test:circleci @0xproject/abi-gen
+ - run: yarn wsrun test:circleci @0xproject/assert
+ - run: yarn wsrun test:circleci @0xproject/base-contract
+ - run: yarn wsrun test:circleci @0xproject/connect
+ - run: yarn wsrun test:circleci @0xproject/contract-wrappers
+ - run: yarn wsrun test:circleci @0xproject/dev-utils
+ - run: yarn wsrun test:circleci @0xproject/json-schemas
+ - run: yarn wsrun test:circleci @0xproject/metacoin
+ - run: yarn wsrun test:circleci @0xproject/order-utils
+ - run: yarn wsrun test:circleci @0xproject/order-watcher
+ - run: yarn wsrun test:circleci @0xproject/sol-compiler
+ - run: yarn wsrun test:circleci @0xproject/sol-cov
+ - run: yarn wsrun test:circleci @0xproject/sra-report
+ - run: yarn wsrun test:circleci @0xproject/subproviders
+ - run: yarn wsrun test:circleci @0xproject/web3-wrapper
+ - run: yarn wsrun test:circleci @0xproject/utils
- save_cache:
- key: coverage-deployer-{{ .Environment.CIRCLE_SHA1 }}
+ key: coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
paths:
- - ~/repo/packages/deployer/coverage/lcov.info
- test-rest:
- docker:
- - image: circleci/node:6.12
- working_directory: ~/repo
- steps:
- - restore_cache:
- keys:
- - repo-{{ .Environment.CIRCLE_SHA1 }}
- - run:
- name: testrpc
- command: npm run testrpc -- --db testrpc_snapshot
- background: true
- - run: yarn lerna:run --ignore contracts --ignore 0x.js --ignore @0xproject/deployer test:circleci
+ - ~/repo/packages/0x.js/coverage/lcov.info
+ - save_cache:
+ key: coverage-abi-gen-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/abi-gen/coverage/lcov.info
- save_cache:
key: coverage-assert-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo/packages/assert/coverage/lcov.info
- save_cache:
+ key: coverage-base-contract-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/base-contract/coverage/lcov.info
+ - save_cache:
key: coverage-connect-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo/packages/connect/coverage/lcov.info
- save_cache:
+ key: coverage-contract-wrappers-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/contract-wrappers/coverage/lcov.info
+ - save_cache:
key: coverage-dev-utils-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo/packages/dev-utils/coverage/lcov.info
@@ -117,34 +124,50 @@ jobs:
paths:
- ~/repo/packages/json-schemas/coverage/lcov.info
- save_cache:
- key: coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
+ key: coverage-metacoin-{{ .Environment.CIRCLE_SHA1 }}
paths:
- - ~/repo/packages/subproviders/coverage/lcov.info
+ - ~/repo/packages/metacoin/coverage/lcov.info
+ - save_cache:
+ key: coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/order-utils/coverage/lcov.info
+ - save_cache:
+ key: coverage-order-watcher-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/order-watcher/coverage/lcov.info
+ - save_cache:
+ key: coverage-sol-compiler-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/sol-compiler/coverage/lcov.info
- save_cache:
key: coverage-sol-cov-{{ .Environment.CIRCLE_SHA1 }}
paths:
- ~/repo/packages/sol-cov/coverage/lcov.info
- lint:
- working_directory: ~/repo
- docker:
- - image: circleci/node:6.12
- steps:
- - restore_cache:
- keys:
- - repo-{{ .Environment.CIRCLE_SHA1 }}
- - run: yarn lerna:run lint
- prettier:
+ - save_cache:
+ key: coverage-sra-report-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/sra-report/coverage/lcov.info
+ - save_cache:
+ key: coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/subproviders/coverage/lcov.info
+ - save_cache:
+ key: coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }}
+ paths:
+ - ~/repo/packages/web3-wrapper/coverage/lcov.info
+ static-tests:
working_directory: ~/repo
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
steps:
- restore_cache:
keys:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- run: yarn prettier:ci
+ - run: yarn lerna run lint
submit-coverage:
docker:
- - image: circleci/node:6.12
+ - image: circleci/node:9
working_directory: ~/repo
steps:
- restore_cache:
@@ -152,61 +175,76 @@ jobs:
- repo-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- - coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
+ - coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-abi-gen-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- coverage-assert-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
+ - coverage-base-contract-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
- coverage-connect-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
+ - coverage-contract-wrappers-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
- coverage-dev-utils-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- coverage-json-schemas-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- - coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
+ - coverage-metacoin-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-order-utils-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-order-watcher-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-sol-compiler-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- coverage-sol-cov-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- - coverage-deployer-{{ .Environment.CIRCLE_SHA1 }}
+ - coverage-sra-report-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- - coverage-0xjs-{{ .Environment.CIRCLE_SHA1 }}
+ - coverage-subproviders-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-web3-wrapper-{{ .Environment.CIRCLE_SHA1 }}
+ - restore_cache:
+ keys:
+ - coverage-contracts-{{ .Environment.CIRCLE_SHA1 }}
- run: yarn report_coverage
workflows:
version: 2
main:
jobs:
- build
- - test-installation:
- requires:
- - build
- - test-0xjs:
- requires:
- - build
- - test-contracts:
+ - test-contracts-ganache:
requires:
- build
- - test-deployer:
+ - test-contracts-geth:
requires:
- build
- test-rest:
requires:
- build
- - prettier:
+ - static-tests:
requires:
- build
- - lint:
+ - test-publish:
requires:
- build
- submit-coverage:
requires:
- - test-0xjs
- - test-deployer
- test-rest
- - test-contracts
diff --git a/.gitignore b/.gitignore
index c37cf438e..ef7cc0a3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,6 +41,7 @@ typings/
# Optional npm cache directory
.npm
+.npmrc
# Optional eslint cache
.eslintcache
@@ -67,21 +68,37 @@ generated_docs/
TODO.md
+# VSCode file
+.vscode
+
packages/website/public/bundle*
packages/react-docs/example/public/bundle*
-# generated binaries
-bin/
-
-# generated contract artifacts
-packages/contracts/src/artifacts
-
-# generated contract wrappers
-packages/0x.js/src/contract_wrappers/generated/
-packages/contracts/src/contract_wrappers/generated/
-
-# solc-bin in deployer
-packages/deployer/solc_bin/
+# server cli
+packages/testnet-faucets/server/
+
+# generated contract artifacts/
+packages/sol-cov/test/fixtures/artifacts/
+packages/metacoin/artifacts/
+packages/order-watcher/test/artifacts/
+packages/contract-wrappers/test/artifacts/
+packages/contract-wrappers/src/artifacts/
+packages/order-watcher/src/artifacts/
+
+# generated contract watcher
+packages/0x.js/src/generated_contract_wrappers/
+packages/contracts/generated_contract_wrappers/
+packages/contract-wrappers/src/contract_wrappers/generated/
+packages/metacoin/src/contract_wrappers
+packages/fill-scenarios/src/generated_contract_wrappers/
+packages/order-watcher/src/generated_contract_wrappers/
+packages/order-utils/src/generated_contract_wrappers/
+packages/migrations/src/1.0.0/contract_wrappers
+packages/migrations/src/2.0.0/contract_wrappers
+packages/migrations/src/2.0.0-beta-testnet/contract_wrappers
+
+# solc-bin in sol-compiler
+packages/sol-compiler/solc_bin/
# Monorepo scripts
packages/*/scripts/
diff --git a/.prettierignore b/.prettierignore
index 5b8003c95..3a69fc8de 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,5 +1,25 @@
lib
.nyc_output
+/packages/contract-wrappers/src/contract_wrappers/generated/
+/packages/metacoin/src/contract_wrappers
+/packages/0x.js/src/generated_contract_wrappers/
+/packages/contracts/generated_contract_wrappers/
+/packages/fill-scenarios/src/generated_contract_wrappers/
+/packages/order-watcher/src/generated_contract_wrappers/
+/packages/order-utils/src/generated_contract_wrappers/
+/packages/migrations/src/1.0.0/contract_wrappers
+/packages/migrations/src/2.0.0/contract_wrappers
+/packages/migrations/src/2.0.0-beta-testnet/contract_wrappers
+/packages/0x.js/src/artifacts
/packages/contracts/src/artifacts
+/packages/contract-wrappers/src/artifacts
+/packages/order-watcher/src/artifacts
+/packages/metacoin/artifacts
+/packages/sra-api/public/
+/packages/contract-wrappers/test/artifacts
+/packages/order-watcher/test/artifacts
+/packages/migrations/artifacts/1.0.0
+/packages/migrations/artifacts/2.0.0
+/packages/migrations/artifacts/2.0.0-beta-testnet
package.json
scripts/postpublish_utils.js
diff --git a/CODEOWNERS b/CODEOWNERS
deleted file mode 100644
index b0a5366ed..000000000
--- a/CODEOWNERS
+++ /dev/null
@@ -1 +0,0 @@
-* @abandeali1 @BMillman19 @dekz @fabioberger @LogvinovLeon @Recmo
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..4b3ef1f07
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at team@0xproject.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 39c3239eb..ff55ac4c6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -21,6 +21,18 @@ If you're adding a new public function/member, make sure you document it with Ja
If the sub-package you are modifying has a `CHANGELOG.md` file, make sure to add an entry in it for the change made to the package. For published packages, only changes that modify the public interface or behavior of the package need a CHANGELOG entry.
+#### Enabling code coverage checks on your fork
+
+If you simply fork the repo and then create a PR sourced from it, your PR will fail its test coverage check. This is because the 0x CircleCI configuration sets the `COVERALLS_REPO_TOKEN` environment variable to the token for 0xProject/0x-monorepo, but when running the check against your fork the token needs to match the repo that is your fork, rather than the 0x repo.
+
+To facilitate this check, after creating your fork, but before creating the branch for your PR, do the following:
+
+1. Log in to [coveralls.io](https://coveralls.io/), go to Add Repos, and enable your fork. Then go to the settings for that repo, and copy the Repo Token identifier.
+2. Log in to [CircleCI](https://circleci.com/login), go to Add Projects, click the Set Up Project button corresponding to your fork, and then click Start Building. (Aside from step 3 below, no actual set up is needed, since it will use the `.circleci/config.yml` file in 0x-monorepo, so you can ignore all of the instruction/explanation given on the page with the Start Building button.)
+3. In CircleCI, configure your project to add an Environment Variable, with name `COVERALLS_REPO_TOKEN`, and for the value paste in the Repo Token you copied in step 1.
+
+Now, when you push to your branch, CircleCI will automatically run all of the checks in your own instance, and the coverage check will work since it has the proper Repo Token, and the PR will magically refer to your own checks rather than running them in the 0x CircleCI instance.
+
### Styleguide
We use [TSLint](https://palantir.github.io/tslint/) with [custom configs](https://github.com/0xProject/0x-monorepo/tree/development/packages/tslint-config) to keep our code style consistent.
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
index 481b1d536..9bacbcede 100644
--- a/PULL_REQUEST_TEMPLATE.md
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -1,42 +1,27 @@
-<!--- Thank you for taking the time to submit a Pull Request -->
-
-<!--- Provide a general summary of the issue in the Title above -->
-
## Description
<!--- Describe your changes in detail -->
-## Motivation and Context
-
-<!--- Why is this change required? What problem does it solve? -->
-
-<!--- If it fixes an open issue, please link to the issue here. -->
+## Testing instructions
-## How Has This Been Tested?
+<!--- Please describe how reviewers can test your changes -->
-<!--- Please describe in detail how you tested your changes. -->
-
-<!--- Include details of your testing environment, and the tests you ran to -->
+## Types of changes
-<!--- see how your change affects other areas of the code, etc. -->
+<!--- What types of changes does your code introduce? Uncomment all the bullets that apply: -->
-## Types of changes
+<!-- * Bug fix (non-breaking change which fixes an issue) -->
-<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
+<!-- * New feature (non-breaking change which adds functionality) -->
-* [ ] Bug fix (non-breaking change which fixes an issue)
-* [ ] New feature (non-breaking change which adds functionality)
-* [ ] Breaking change (fix or feature that would cause existing functionality to change)
+<!-- * Breaking change (fix or feature that would cause existing functionality to change) -->
## Checklist:
-<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
-
-<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
+<!--- The following points should be used to indicate the progress of your PR. Put an `x` in all the boxes that apply right now, and come back over time and check them off as you make progress. If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
-* [ ] Change requires a change to the documentation.
-* [ ] Added tests to cover my changes.
-* [ ] Added new entries to the relevant CHANGELOGs.
-* [ ] Updated the new versions of the changed packages in the relevant CHANGELOGs.
-* [ ] Labeled this PR with the 'WIP' label if it is a work in progress.
-* [ ] Labeled this PR with the labels corresponding to the changed package.
+* [ ] Prefix PR title with `[WIP]` if necessary.
+* [ ] Prefix PR title with bracketed package name(s) corresponding to the changed package(s). For example: `[sol-cov] Fixed bug`.
+* [ ] Add tests to cover changes as needed.
+* [ ] Update documentation as needed.
+* [ ] Add new entries to the relevant CHANGELOG.jsons.
diff --git a/README.md b/README.md
index 86e00bfd9..0f55f3fa8 100644
--- a/README.md
+++ b/README.md
@@ -6,39 +6,41 @@
This repository is a monorepo including the 0x protocol smart contracts and numerous developer tools. Each public sub-package is independently published to NPM.
+If you're developing on 0x now or are interested in using 0x infrastructure in the future, please join our [developer mailing list][dev-mailing-list-url] for updates.
+
[website-url]: https://0xproject.com/
[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf
+[dev-mailing-list-url]: http://eepurl.com/dx4cPf
[![CircleCI](https://circleci.com/gh/0xProject/0x-monorepo.svg?style=svg&circle-token=61bf7cd8c9b4e11b132089dfcffdd1be277d1e0c)](https://circleci.com/gh/0xProject/0x-monorepo)
[![Coverage Status](https://coveralls.io/repos/github/0xProject/0x-monorepo/badge.svg?branch=development)](https://coveralls.io/github/0xProject/0x-monorepo?branch=development)
[![Discord](https://img.shields.io/badge/chat-rocket.chat-yellow.svg?style=flat)](https://chat.0xproject.com)
[![Join the chat at https://gitter.im/0xProject/Lobby](https://badges.gitter.im/0xProject/Lobby.svg)](https://gitter.im/0xProject/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
-[![Greenkeeper badge](https://badges.greenkeeper.io/0xProject/0x-monorepo.svg?token=7c22e5c72acf39d3ead8d29c5d9bb38f9096df3e643024dcedd53ab732847be1&ts=1496426342666)](https://greenkeeper.io/)
### Published Packages
-| Package | Version | Description |
-| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
-| [`0x.js`](/packages/0x.js) | [![npm](https://img.shields.io/npm/v/0x.js.svg)](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
-| [`@0xproject/abi-gen`](/packages/abi-gen) | [![npm](https://img.shields.io/npm/v/@0xproject/abi-gen.svg)](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
-| [`@0xproject/assert`](/packages/assert) | [![npm](https://img.shields.io/npm/v/@0xproject/assert.svg)](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
-| [`@0xproject/base-contract`](/packages/base-contract) | [![npm](https://img.shields.io/npm/v/@0xproject/base-contract.svg)](https://www.npmjs.com/package/@0xproject/base-contract) | BaseContract used by auto-generated `abi-gen` wrapper contracts |
-| [`@0xproject/connect`](/packages/connect) | [![npm](https://img.shields.io/npm/v/@0xproject/connect.svg)](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the Standard Relayer API |
-| [`@0xproject/deployer`](/packages/deployer) | [![npm](https://img.shields.io/npm/v/@0xproject/deployer.svg)](https://www.npmjs.com/package/@0xproject/deployer) | Solidity project compiler and deployer framework |
-| [`@0xproject/dev-utils`](/packages/dev-utils) | [![npm](https://img.shields.io/npm/v/@0xproject/dev-utils.svg)](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
-| [`@0xproject/json-schemas`](/packages/json-schemas) | [![npm](https://img.shields.io/npm/v/@0xproject/json-schemas.svg)](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
-| [`@0xproject/monorepo-scripts`](/packages/monorepo-scripts) | [![npm](https://img.shields.io/npm/v/@0xproject/monorepo-scripts.svg)](https://www.npmjs.com/package/@0xproject/monorepo-scripts) | Monorepo scripts |
-| [`@0xproject/react-docs`](/packages/react-docs) | [![npm](https://img.shields.io/npm/v/@0xproject/react-docs.svg)](https://www.npmjs.com/package/@0xproject/react-docs) | React documentation component for rendering TypeDoc & Doxity generated JSON |
-| [`@0xproject/react-shared`](/packages/react-shared) | [![npm](https://img.shields.io/npm/v/@0xproject/react-shared.svg)](https://www.npmjs.com/package/@0xproject/react-shared) | 0x shared react components |
-| [`@0xproject/sra-report`](/packages/sra-report) | [![npm](https://img.shields.io/npm/v/@0xproject/sra-report.svg)](https://www.npmjs.com/package/@0xproject/sra-report) | Generate reports for standard relayer API compliance |
-| [`@0xproject/sol-cov`](/packages/sol-cov) | [![npm](https://img.shields.io/npm/v/@0xproject/sol-cov.svg)](https://www.npmjs.com/package/@0xproject/sol-cov) | Solidity test coverage tool tool |
-| [`@0xproject/subproviders`](/packages/subproviders) | [![npm](https://img.shields.io/npm/v/@0xproject/subproviders.svg)](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
-| [`@0xproject/tslint-config`](/packages/tslint-config) | [![npm](https://img.shields.io/npm/v/@0xproject/tslint-config.svg)](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
-| [`@0xproject/types`](/packages/types) | [![npm](https://img.shields.io/npm/v/@0xproject/types.svg)](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
-| [`@0xproject/typescript-typings`](/packages/typescript-typings) | [![npm](https://img.shields.io/npm/v/@0xproject/typescript-typings.svg)](https://www.npmjs.com/package/@0xproject/typescript-typings) | Repository of types for external packages |
-| [`@0xproject/utils`](/packages/utils) | [![npm](https://img.shields.io/npm/v/@0xproject/utils.svg)](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
-| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [![npm](https://img.shields.io/npm/v/@0xproject/web3-wrapper.svg)](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
+| Package | Version | Description |
+| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
+| [`0x.js`](/packages/0x.js) | [![npm](https://img.shields.io/npm/v/0x.js.svg)](https://www.npmjs.com/package/0x.js) | A Javascript library for interacting with the 0x protocol |
+| [`@0xproject/abi-gen`](/packages/abi-gen) | [![npm](https://img.shields.io/npm/v/@0xproject/abi-gen.svg)](https://www.npmjs.com/package/@0xproject/abi-gen) | Tool to generate TS wrappers from smart contract ABIs |
+| [`@0xproject/assert`](/packages/assert) | [![npm](https://img.shields.io/npm/v/@0xproject/assert.svg)](https://www.npmjs.com/package/@0xproject/assert) | Type and schema assertions used by our packages |
+| [`@0xproject/base-contract`](/packages/base-contract) | [![npm](https://img.shields.io/npm/v/@0xproject/base-contract.svg)](https://www.npmjs.com/package/@0xproject/base-contract) | BaseContract used by auto-generated `abi-gen` wrapper contracts |
+| [`@0xproject/connect`](/packages/connect) | [![npm](https://img.shields.io/npm/v/@0xproject/connect.svg)](https://www.npmjs.com/package/@0xproject/connect) | A Javascript library for interacting with the Standard Relayer API |
+| [`@0xproject/sol-compiler`](/packages/sol-compiler) | [![npm](https://img.shields.io/npm/v/@0xproject/sol-compiler.svg)](https://www.npmjs.com/package/@0xproject/sol-compiler) | A thin wrapper around Solc.js that outputs artifacts, resolves imports, only re-compiles when needed, and other niceties. |
+| [`@0xproject/dev-utils`](/packages/dev-utils) | [![npm](https://img.shields.io/npm/v/@0xproject/dev-utils.svg)](https://www.npmjs.com/package/@0xproject/dev-utils) | Dev utils to be shared across 0x projects and packages |
+| [`@0xproject/json-schemas`](/packages/json-schemas) | [![npm](https://img.shields.io/npm/v/@0xproject/json-schemas.svg)](https://www.npmjs.com/package/@0xproject/json-schemas) | 0x-related json schemas |
+| [`@0xproject/monorepo-scripts`](/packages/monorepo-scripts) | [![npm](https://img.shields.io/npm/v/@0xproject/monorepo-scripts.svg)](https://www.npmjs.com/package/@0xproject/monorepo-scripts) | Monorepo scripts |
+| [`@0xproject/react-docs`](/packages/react-docs) | [![npm](https://img.shields.io/npm/v/@0xproject/react-docs.svg)](https://www.npmjs.com/package/@0xproject/react-docs) | React documentation component for rendering TypeDoc & Doxity generated JSON |
+| [`@0xproject/react-shared`](/packages/react-shared) | [![npm](https://img.shields.io/npm/v/@0xproject/react-shared.svg)](https://www.npmjs.com/package/@0xproject/react-shared) | 0x shared react components |
+| [`@0xproject/sra-report`](/packages/sra-report) | [![npm](https://img.shields.io/npm/v/@0xproject/sra-report.svg)](https://www.npmjs.com/package/@0xproject/sra-report) | Generate reports for standard relayer API compliance |
+| [`@0xproject/sol-cov`](/packages/sol-cov) | [![npm](https://img.shields.io/npm/v/@0xproject/sol-cov.svg)](https://www.npmjs.com/package/@0xproject/sol-cov) | Solidity test coverage tool |
+| [`@0xproject/subproviders`](/packages/subproviders) | [![npm](https://img.shields.io/npm/v/@0xproject/subproviders.svg)](https://www.npmjs.com/package/@0xproject/subproviders) | Useful web3 subproviders (e.g LedgerSubprovider) |
+| [`@0xproject/tslint-config`](/packages/tslint-config) | [![npm](https://img.shields.io/npm/v/@0xproject/tslint-config.svg)](https://www.npmjs.com/package/@0xproject/tslint-config) | Custom 0x development TSLint rules |
+| [`@0xproject/types`](/packages/types) | [![npm](https://img.shields.io/npm/v/@0xproject/types.svg)](https://www.npmjs.com/package/@0xproject/types) | Shared type declarations |
+| [`@0xproject/typescript-typings`](/packages/typescript-typings) | [![npm](https://img.shields.io/npm/v/@0xproject/typescript-typings.svg)](https://www.npmjs.com/package/@0xproject/typescript-typings) | Repository of types for external packages |
+| [`@0xproject/utils`](/packages/utils) | [![npm](https://img.shields.io/npm/v/@0xproject/utils.svg)](https://www.npmjs.com/package/@0xproject/utils) | Shared utilities |
+| [`@0xproject/web3-wrapper`](/packages/web3-wrapper) | [![npm](https://img.shields.io/npm/v/@0xproject/web3-wrapper.svg)](https://www.npmjs.com/package/@0xproject/web3-wrapper) | Web3 wrapper |
### Private Packages
@@ -57,12 +59,14 @@ Dedicated documentation pages:
* [0x Connect](https://0xproject.com/docs/connect)
* [Smart contracts](https://0xproject.com/docs/contracts)
* [Subproviders](https://0xproject.com/docs/subproviders)
-* [Deployer](https://0xproject.com/docs/deployer)
+* [Sol Compiler](https://0xproject.com/docs/sol-compiler)
* [Web3-wrapper](https://0xproject.com/docs/web3-wrapper)
* [JSON-schemas](https://0xproject.com/docs/json-schemas)
* [Sol-cov](https://0xproject.com/docs/sol-cov)
* [Standard Relayer API](https://github.com/0xProject/standard-relayer-api/blob/master/README.md)
+Node version >= 6.12 is required.
+
Most of the packages require additional typings for external dependencies.
You can include those by prepending @0xproject/typescript-typings package to your [`typeRoots`](http://www.typescriptlang.org/docs/handbook/tsconfig-json.html) config.
@@ -74,14 +78,16 @@ You can include those by prepending @0xproject/typescript-typings package to you
We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
-Please read our [contribution guidelines](./CONTRIBUTING.md) before getting started.
+#### Read our [contribution guidelines](./CONTRIBUTING.md).
### Install dependencies
-If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+Make sure you are using Yarn v1.6. To install using brew:
-```bash
-yarn config set workspaces-experimental true
+```
+brew unlink yarn
+brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/76215230de5f7f7bee2cfcdd7185cf49d949862d/Formula/yarn.rb
+brew switch yarn 1.6.0_1
```
Then install dependencies
@@ -92,50 +98,87 @@ yarn install
### Build
-Build all packages. You need to do this before working on any given package. Although these packages
-as independent, when run from within the monorepo, they are internally symlinked, to make development
-easier. You can change several packages and run the changes without publishing them first to NPM. When
-running `rebuild`, Lerna will figure out the dependency order of all the packages, and build them in
-this order.
+To build all packages:
```bash
-yarn lerna:rebuild
+yarn build
```
-Or continuously rebuild on change:
+To build a specific package:
```bash
-yarn dev
+PKG=@0xproject/web3-wrapper yarn build
```
-### Lint
+### Watch
-Lint all packages
+To re-build all packages on change:
```bash
-yarn lerna:run lint
+yarn watch
```
-### Run Tests
+To watch a specific package and all it's dependent packages:
+
+```bash
+PKG=[NPM_PACKAGE_NAME] yarn watch
+
+e.g
+PKG=@0xproject/web3-wrapper yarn watch
+```
-Before running the tests, you will need to spin up a [TestRPC](https://www.npmjs.com/package/ethereumjs-testrpc) instance and deploy all the 0x smart contracts.
+### Clean
-In a separate terminal, start TestRPC (a convenience command is provided as part of this repo)
+Clean all packages:
```bash
-yarn testrpc
+yarn clean
```
-Then in your main terminal run
+Clean a specific package
+```bash
+PKG=0x.js yarn clean
```
-cd packages/contracts
-yarn migrate
-cd ..
+
+### Rebuild
+
+To re-build (clean & build) all packages:
+
+```bash
+yarn rebuild
+```
+
+To re-build (clean & build) a specific package & it's deps:
+
+```bash
+PKG=0x.js yarn rebuild
+```
+
+### Lint
+
+Lint all packages:
+
+```bash
+yarn lint
+```
+
+Lint a specific package:
+
+```bash
+PKG=0x.js yarn lint
+```
+
+### Run Tests
+
+Run all tests:
+
+```bash
+yarn test
```
-And finally from the root project directory run
+Run a specific package's test:
```bash
-yarn lerna:run test
+PKG=@0xproject/web3-wrapper yarn test
```
diff --git a/lerna.json b/lerna.json
index 5f975fff9..e2147be85 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,15 +1,10 @@
{
- "lerna": "2.5.1",
+ "lerna": "3.0.0-beta.23",
"packages": ["packages/*"],
- "commands": {
- "publish": {
- "allowBranch": "development"
- }
- },
"version": "independent",
- "commands": {
+ "command": {
"publish": {
- "ignore": ["test/**/*", "*.md", "scripts", "lib", "tslint.json", "tsconfig.json"]
+ "ignoreChanges": ["test/**/*", "*.md", "scripts", "lib", "tslint.json", "tsconfig.json"]
}
},
"npmClient": "yarn",
diff --git a/package.json b/package.json
index b3b3e3bcc..9b8146be8 100644
--- a/package.json
+++ b/package.json
@@ -1,36 +1,56 @@
{
"private": true,
"name": "0x-monorepo",
+ "engines": {
+ "node": ">=6.12"
+ },
"workspaces": [
"packages/*"
],
"scripts": {
- "dev": "lerna run --parallel build:watch",
- "testrpc": "testrpc -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
+ "ganache": "ganache-cli -p 8545 --networkId 50 -m \"${npm_package_config_mnemonic}\"",
"prettier": "prettier --write '**/*.{ts,tsx,json,md}' --config .prettierrc",
"prettier:ci": "prettier --list-different '**/*.{ts,tsx,json,md}' --config .prettierrc",
"report_coverage": "lcov-result-merger 'packages/*/coverage/lcov.info' | coveralls",
"test:installation": "node ./packages/monorepo-scripts/lib/test_installation.js",
- "lerna:install": "yarn install",
- "lerna:run": "lerna run",
- "lerna:clean": "lerna run clean",
- "lerna:build": "lerna run build",
- "lerna:rebuild": "run-s lerna:clean lerna:build",
- "lerna:publish": "run-s lerna:install lerna:rebuild script:publish",
- "lerna:publish:dry": "run-s lerna:install lerna:rebuild script:publish:dry",
+ "test:installation:local": "IS_LOCAL_PUBLISH=true node ./packages/monorepo-scripts/lib/test_installation.js",
+ "test:publish:circleci:comment": "HACK(albrow) We need an automated way to login to npm and echo+sleep piped to stdin was the only way I could find to do it.",
+ "test:publish:circleci": "{ echo \"test\"; sleep 1; echo \"test\"; sleep 1; echo \"test@example.com\"; } | npm login --registry=http://localhost:4873 && IS_LOCAL_PUBLISH=true run-s script:publish test:installation:local",
+ "run:publish": "run-s install:all build:monorepo_scripts script:prepublish_checks rebuild:no_website script:publish",
+ "run:publish:local": "IS_LOCAL_PUBLISH=true yarn run:publish",
+ "script:prepublish_checks": "node ./packages/monorepo-scripts/lib/prepublish_checks.js",
"script:publish": "node ./packages/monorepo-scripts/lib/publish.js",
- "script:publish:dry": "IS_DRY_RUN=true yarn script:publish"
+ "install:all": "yarn install",
+ "wsrun": "wsrun",
+ "lerna": "lerna",
+ "watch": "wsrun watch_without_deps $PKG --fast-exit -r --stages --done-criteria='complete|successfully'",
+ "build": "wsrun build $PKG --fast-exit -r --stages",
+ "build:no_website": "wsrun build $PKG --fast-exit -r --stages --exclude @0xproject/website",
+ "build:monorepo_scripts": "PKG=@0xproject/monorepo-scripts yarn build",
+ "clean": "wsrun clean $PKG --fast-exit -r --parallel",
+ "remove_node_modules": "lerna clean --yes; rm -rf node_modules",
+ "rebuild": "run-s clean build",
+ "rebuild:no_website": "run-s clean build:no_website",
+ "test": "wsrun test $PKG --fast-exit --serial --exclude-missing",
+ "stage_docs": "wsrun docs:stage $PKG --fast-exit --parallel --exclude-missing",
+ "lint": "wsrun lint $PKG --fast-exit --parallel --exclude-missing",
+ "comment:postinstall": "HACK: For some reason `yarn` is not setting up symlinks properly for order-utils. We temporarily set them manually. Remove this after V2 refactor is complete."
},
"config": {
"mnemonic": "concert load couple harbor equip island argue ramp clarify fence smart topic"
},
"devDependencies": {
+ "@0x-lerna-fork/lerna": "3.0.0-beta.23",
"async-child-process": "^1.1.1",
"coveralls": "^3.0.0",
- "ethereumjs-testrpc": "^6.0.3",
- "lcov-result-merger": "^2.0.0",
- "lerna": "^2.5.1",
+ "ganache-cli": "6.1.3",
+ "lcov-result-merger": "^3.0.0",
"npm-run-all": "^4.1.2",
- "prettier": "^1.11.1"
+ "prettier": "^1.11.1",
+ "source-map-support": "^0.5.6",
+ "wsrun": "^2.2.0"
+ },
+ "resolutions": {
+ "ethers": "0xproject/ethers.js#eip-838-reasons"
}
}
diff --git a/packages/0x.js/CHANGELOG.json b/packages/0x.js/CHANGELOG.json
index 9a750a169..e96fda9af 100644
--- a/packages/0x.js/CHANGELOG.json
+++ b/packages/0x.js/CHANGELOG.json
@@ -1,5 +1,261 @@
[
{
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ },
+ {
+ "pr": 914,
+ "note": "Update ecSignOrderHashAsync to return the signature as a string for immediate use in contracts"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Fixed bug caused by importing non-existent dep"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043100,
+ "version": "1.0.0-rc.2",
+ "changes": [
+ {
+ "note": "Remove `zeroEx.assetData` and instead re-export it's static functions directly off `ZeroEx`"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Remove tokenRegistry wrapper",
+ "pr": 863
+ },
+ {
+ "note": "Rename `zeroEx.token` to `zeroEx.erc20Token`, and add `zeroEx.erc721Token`",
+ "pr": 863
+ },
+ {
+ "note": "Rename `zeroEx.proxy` to `zeroEx.erc20Proxy` and add `zeroEx.erc721Proxy`",
+ "pr": 863
+ },
+ {
+ "note":
+ "Refactored `ZeroEx.isValidSignature` to `zeroEx.isValidSignatureAsync`. It is now async so that it can verify contract-dependent signature types",
+ "pr": 863
+ },
+ {
+ "note":
+ "Refactored `signOrderHashAsync` to `ecSignOrderHashAsync`. There are now many non-ECSignature ways to sign orders too.",
+ "pr": 863
+ },
+ {
+ "note":
+ "Removed `createOrderWatcherAsync` method. Will be added back once OrderWatcher is refactored for V2",
+ "pr": 863
+ },
+ {
+ "note": "0x.js exports renamed contract events and event arg types",
+ "pr": 863
+ },
+ {
+ "note": "Export `ZeroEx.assetData` with methods to decode/encode assetData fields found in 0x orders",
+ "pr": 884
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.38.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.38.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.38.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617805,
+ "version": "0.38.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617227,
+ "version": "0.38.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.38.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.38.0",
+ "changes": [
+ {
+ "note": "Renamed createOrderStateWatcher to createOrderWatcherAsync since it is now async",
+ "pr": 579
+ },
+ {
+ "note":
+ "Renamed ZeroExError to ContractWrappersErrors since they now lives in the @0xproject/contract-wrappers subpackage",
+ "pr": 579
+ }
+ ],
+ "timestamp": 1527008270
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.37.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525453812,
+ "version": "0.37.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.37.0",
+ "changes": [
+ {
+ "note": "Fixed expiration watcher comparator to handle orders with equal expiration times",
+ "pr": 526
+ },
+ {
+ "note": "Update Web3 Provider Engine to 14.0.4",
+ "pr": 555
+ },
+ {
+ "note": "Add `zeroEx.getProvider()`",
+ "pr": 559
+ },
+ {
+ "note": "Move `ZeroExError.InvalidSignature` to `@0xproject/order-utils` `OrderError.InvalidSignature`",
+ "pr": 559
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.36.3",
+ "changes": [
+ {
+ "note": "Move @0xproject/migrations to devDependencies"
+ }
+ ],
+ "timestamp": 1524079658
+ },
+ {
+ "timestamp": 1524073495,
+ "version": "0.36.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.36.1",
+ "changes": [
+ {
+ "note": "Internal changes and refactoring"
+ },
+ {
+ "note": "Fix redundant expired order removal bug",
+ "pr": 527
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "version": "0.36.0",
+ "changes": [
+ {
+ "note": "Moved Web3.Provider to `@0xproject/types:Provider`",
+ "pr": 501
+ },
+ {
+ "note":
+ "Add `zeroEx.exchange.getOrderStateAsync` to allow obtaining current OrderState for a signedOrder",
+ "pr": 510
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "version": "0.35.0",
+ "changes": [
+ {
+ "note":
+ "Removed `ZeroExError.TransactionMiningTimeout` and moved it to '@0xproject/web3-wrapper' `Web3WrapperErrors.TransactionMiningTimeout`",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
"version": "0.34.0",
"changes": [
{
@@ -35,8 +291,7 @@
"pr": 456
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.33.1",
@@ -45,8 +300,7 @@
"note": "Add missing EthersJs typescript typings as dependency"
}
],
- "timestamp": 1520434800,
- "isPublished": true
+ "timestamp": 1520434800
},
{
"version": "0.33.0",
@@ -72,8 +326,7 @@
"pr": 429
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.32.2",
@@ -83,8 +336,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.32.1",
@@ -98,8 +350,7 @@
"pr": 371
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
},
{
"version": "0.32.0",
@@ -114,8 +365,7 @@
"pr": 366
}
],
- "timestamp": 1517756400,
- "isPublished": true
+ "timestamp": 1517756400
},
{
"version": "0.31.1",
@@ -125,8 +375,7 @@
"pr": 357
}
],
- "timestamp": 1517410800,
- "isPublished": true
+ "timestamp": 1517410800
},
{
"version": "0.31.0",
@@ -137,8 +386,7 @@
"pr": 349
}
],
- "timestamp": 1517238000,
- "isPublished": true
+ "timestamp": 1517238000
},
{
"version": "0.30.2",
@@ -151,8 +399,7 @@
"note": "Move @0xproject/types to dependencies from devDependencies fixing missing type errors"
}
],
- "timestamp": 1517151600,
- "isPublished": true
+ "timestamp": 1517151600
},
{
"version": "0.30.1",
@@ -166,8 +413,7 @@
"pr": 341
}
],
- "timestamp": 1516719600,
- "isPublished": true
+ "timestamp": 1516719600
},
{
"version": "0.30.0",
@@ -186,8 +432,7 @@
"pr": 321
}
],
- "timestamp": 1516114800,
- "isPublished": true
+ "timestamp": 1516114800
},
{
"version": "0.29.1",
@@ -197,8 +442,7 @@
"pr": 305
}
],
- "timestamp": 1515596400,
- "isPublished": true
+ "timestamp": 1515596400
},
{
"version": "0.29.0",
@@ -212,8 +456,7 @@
"pr": 287
}
],
- "timestamp": 1514386800,
- "isPublished": true
+ "timestamp": 1514386800
},
{
"version": "0.28.0",
@@ -259,8 +502,7 @@
"pr": 278
}
],
- "timestamp": 1513695600,
- "isPublished": true
+ "timestamp": 1513695600
},
{
"version": "0.27.1",
@@ -269,8 +511,7 @@
"note": "Export `TransactionOpts` type"
}
],
- "timestamp": 1511794800,
- "isPublished": true
+ "timestamp": 1511794800
},
{
"version": "0.27.0",
@@ -315,8 +556,7 @@
"pr": 236
}
],
- "timestamp": 1511794800,
- "isPublished": true
+ "timestamp": 1511794800
},
{
"version": "0.26.0",
@@ -336,8 +576,7 @@
"pr": 225
}
],
- "timestamp": 1511190000,
- "isPublished": true
+ "timestamp": 1511190000
},
{
"version": "0.25.1",
@@ -356,8 +595,7 @@
"pr": 200
}
],
- "timestamp": 1510498800,
- "isPublished": true
+ "timestamp": 1510498800
},
{
"version": "0.23.0",
@@ -370,8 +608,7 @@
"note": "Subscribe callbacks now receive an error object as their first argument"
}
],
- "timestamp": 1510412400,
- "isPublished": true
+ "timestamp": 1510412400
},
{
"version": "0.22.6",
@@ -381,8 +618,7 @@
"pr": 206
}
],
- "timestamp": 1510239600,
- "isPublished": true
+ "timestamp": 1510239600
},
{
"version": "0.22.5",
@@ -391,8 +627,7 @@
"note": "Re-publish v0.22.4 to fix publishing issue"
}
],
- "timestamp": 1509980400,
- "isPublished": true
+ "timestamp": 1509980400
},
{
"version": "0.22.4",
@@ -401,8 +636,7 @@
"note": "Upgraded bignumber.js to a new version that ships with native typings"
}
],
- "timestamp": 1508857200,
- "isPublished": true
+ "timestamp": 1508857200
},
{
"version": "0.22.3",
@@ -412,8 +646,7 @@
"pr": 199
}
],
- "timestamp": 1508857200,
- "isPublished": true
+ "timestamp": 1508857200
},
{
"version": "0.22.2",
@@ -423,8 +656,7 @@
"pr": 197
}
],
- "timestamp": 1508770800,
- "isPublished": true
+ "timestamp": 1508770800
},
{
"version": "0.22.0",
@@ -439,8 +671,7 @@
"pr": 187
}
],
- "timestamp": 1508079600,
- "isPublished": true
+ "timestamp": 1508079600
},
{
"version": "0.21.4",
@@ -451,8 +682,7 @@
"pr": 194
}
],
- "timestamp": 1507820400,
- "isPublished": true
+ "timestamp": 1507820400
},
{
"version": "0.21.3",
@@ -462,8 +692,7 @@
"pr": 193
}
],
- "timestamp": 1507734000,
- "isPublished": true
+ "timestamp": 1507734000
},
{
"version": "0.21.2",
@@ -473,8 +702,7 @@
"pr": 190
}
],
- "timestamp": 1507647600,
- "isPublished": true
+ "timestamp": 1507647600
},
{
"version": "0.21.1",
@@ -484,8 +712,7 @@
"pr": 189
}
],
- "timestamp": 1507647600,
- "isPublished": true
+ "timestamp": 1507647600
},
{
"version": "0.21.0",
@@ -531,8 +758,7 @@
"pr": 185
}
],
- "timestamp": 1507561200,
- "isPublished": true
+ "timestamp": 1507561200
},
{
"version": "0.20.0",
@@ -550,8 +776,7 @@
"pr": 181
}
],
- "timestamp": 1507129200,
- "isPublished": true
+ "timestamp": 1507129200
},
{
"version": "0.19.0",
@@ -569,8 +794,7 @@
"pr": 175
}
],
- "timestamp": 1506610800,
- "isPublished": true
+ "timestamp": 1506610800
},
{
"version": "0.18.0",
@@ -580,8 +804,7 @@
"pr": 170
}
],
- "timestamp": 1506351600,
- "isPublished": true
+ "timestamp": 1506351600
},
{
"version": "0.17.0",
@@ -591,8 +814,7 @@
"pr": 171
}
],
- "timestamp": 1506351600,
- "isPublished": true
+ "timestamp": 1506351600
},
{
"version": "0.16.0",
@@ -615,8 +837,7 @@
"pr": 165
}
],
- "timestamp": 1505833200,
- "isPublished": true
+ "timestamp": 1505833200
},
{
"version": "0.15.0",
@@ -627,8 +848,7 @@
"pr": 161
}
],
- "timestamp": 1504796400,
- "isPublished": true
+ "timestamp": 1504796400
},
{
"version": "0.14.2",
@@ -638,8 +858,7 @@
"pr": 160
}
],
- "timestamp": 1504710000,
- "isPublished": true
+ "timestamp": 1504710000
},
{
"version": "0.14.1",
@@ -649,8 +868,7 @@
"pr": 159
}
],
- "timestamp": 1504710000,
- "isPublished": true
+ "timestamp": 1504710000
},
{
"version": "0.14.0",
@@ -668,8 +886,7 @@
"pr": 157
}
],
- "timestamp": 1504623600,
- "isPublished": true
+ "timestamp": 1504623600
},
{
"version": "0.13.0",
@@ -693,8 +910,7 @@
"pr": 152
}
],
- "timestamp": 1504623600,
- "isPublished": true
+ "timestamp": 1504623600
},
{
"version": "0.12.1",
@@ -712,8 +928,7 @@
"pr": 139
}
],
- "timestamp": 1504278000,
- "isPublished": true
+ "timestamp": 1504278000
},
{
"version": "0.11.0",
@@ -731,8 +946,7 @@
"pr": 137
}
],
- "timestamp": 1503500400,
- "isPublished": true
+ "timestamp": 1503500400
},
{
"version": "0.10.4",
@@ -742,8 +956,7 @@
"pr": 135
}
],
- "timestamp": 1503500400,
- "isPublished": true
+ "timestamp": 1503500400
},
{
"version": "0.10.1",
@@ -797,8 +1010,7 @@
"pr": 127
}
],
- "timestamp": 1503500400,
- "isPublished": true
+ "timestamp": 1503500400
},
{
"version": "0.9.3",
@@ -808,8 +1020,7 @@
"pr": 118
}
],
- "timestamp": 1503327600,
- "isPublished": true
+ "timestamp": 1503327600
},
{
"version": "0.9.2",
@@ -822,8 +1033,7 @@
"pr": 118
}
],
- "timestamp": 1503241200,
- "isPublished": true
+ "timestamp": 1503241200
},
{
"version": "0.9.1",
@@ -833,8 +1043,7 @@
"pr": 120
}
],
- "timestamp": 1502809200,
- "isPublished": true
+ "timestamp": 1502809200
},
{
"version": "0.9.0",
@@ -871,8 +1080,7 @@
"pr": 109
}
],
- "timestamp": 1500994800,
- "isPublished": true
+ "timestamp": 1500994800
},
{
"version": "0.8.0",
@@ -914,8 +1122,7 @@
"note": "Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance"
}
],
- "timestamp": 1499094000,
- "isPublished": true
+ "timestamp": 1499094000
},
{
"version": "0.7.1",
@@ -926,8 +1133,7 @@
"pr": 81
}
],
- "timestamp": 1498402800,
- "isPublished": true
+ "timestamp": 1498402800
},
{
"version": "0.7.0",
@@ -949,8 +1155,7 @@
"Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`"
}
],
- "timestamp": 1498057200,
- "isPublished": true
+ "timestamp": 1498057200
},
{
"version": "0.6.2",
@@ -962,8 +1167,7 @@
"note": "Improved documentation"
}
],
- "timestamp": 1497970800,
- "isPublished": true
+ "timestamp": 1497970800
},
{
"version": "0.6.1",
@@ -972,8 +1176,7 @@
"note": "Improved documentation"
}
],
- "timestamp": 1497798000,
- "isPublished": true
+ "timestamp": 1497798000
},
{
"version": "0.6.0",
@@ -985,8 +1188,7 @@
"note": "Added types for contract event arguments"
}
],
- "timestamp": 1497798000,
- "isPublished": true
+ "timestamp": 1497798000
},
{
"version": "0.5.2",
@@ -996,8 +1198,7 @@
"Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page"
}
],
- "timestamp": 1497452400,
- "isPublished": true
+ "timestamp": 1497452400
},
{
"version": "0.5.1",
@@ -1006,7 +1207,6 @@
"note": "Added `postpublish` script to publish to Github Releases with assets."
}
],
- "timestamp": 1497452400,
- "isPublished": true
+ "timestamp": 1497452400
}
]
diff --git a/packages/0x.js/CHANGELOG.md b/packages/0x.js/CHANGELOG.md
index e8c2e6473..adeaed9eb 100644
--- a/packages/0x.js/CHANGELOG.md
+++ b/packages/0x.js/CHANGELOG.md
@@ -1,10 +1,108 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.1-rc.3 - _August 13, 2018_
+
+ * Dependencies updated
+ * Update ecSignOrderHashAsync to return the signature as a string for immediate use in contracts (#914)
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Fixed bug caused by importing non-existent dep
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.2 - _July 19, 2018_
+
+ * Remove `zeroEx.assetData` and instead re-export it's static functions directly off `ZeroEx`
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Remove tokenRegistry wrapper (#863)
+ * Rename `zeroEx.token` to `zeroEx.erc20Token`, and add `zeroEx.erc721Token` (#863)
+ * Rename `zeroEx.proxy` to `zeroEx.erc20Proxy` and add `zeroEx.erc721Proxy` (#863)
+ * Refactored `ZeroEx.isValidSignature` to `zeroEx.isValidSignatureAsync`. It is now async so that it can verify contract-dependent signature types (#863)
+ * Refactored `signOrderHashAsync` to `ecSignOrderHashAsync`. There are now many non-ECSignature ways to sign orders too. (#863)
+ * Removed `createOrderWatcherAsync` method. Will be added back once OrderWatcher is refactored for V2 (#863)
+ * 0x.js exports renamed contract events and event arg types (#863)
+ * Export `ZeroEx.assetData` with methods to decode/encode assetData fields found in 0x orders (#884)
+
+## v0.38.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.38.5 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.38.4 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.38.3 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.38.2 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.38.1 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.38.0 - _May 22, 2018_
+
+ * Renamed createOrderStateWatcher to createOrderWatcherAsync since it is now async (#579)
+ * Renamed ZeroExError to ContractWrappersErrors since they now lives in the @0xproject/contract-wrappers subpackage (#579)
+
+## v0.37.2 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.37.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.37.0 - _May 4, 2018_
+
+ * Fixed expiration watcher comparator to handle orders with equal expiration times (#526)
+ * Update Web3 Provider Engine to 14.0.4 (#555)
+ * Add `zeroEx.getProvider()` (#559)
+ * Move `ZeroExError.InvalidSignature` to `@0xproject/order-utils` `OrderError.InvalidSignature` (#559)
+
+## v0.36.3 - _April 18, 2018_
+
+ * Move @0xproject/migrations to devDependencies
+
+## v0.36.2 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.36.1 - _April 18, 2018_
+
+ * Internal changes and refactoring
+ * Fix redundant expired order removal bug (#527)
+
+## v0.36.0 - _April 11, 2018_
+
+ * Moved Web3.Provider to `@0xproject/types:Provider` (#501)
+ * Add `zeroEx.exchange.getOrderStateAsync` to allow obtaining current OrderState for a signedOrder (#510)
+
+## v0.35.0 - _April 2, 2018_
+
+ * Removed `ZeroExError.TransactionMiningTimeout` and moved it to '@0xproject/web3-wrapper' `Web3WrapperErrors.TransactionMiningTimeout` (#485)
+
## v0.34.0 - _April 2, 2018_
* Fix the bug causing `zeroEx.exchange.fillOrdersUpToAsync` validation to fail if there were some extra orders passed (#470)
@@ -12,16 +110,16 @@ CHANGELOG
* Add `zeroEx.createOrderStateWatcher` to allow creating arbitrary number of OrderStateWatchers (#488)
* Added `stateLayer` setting to `OrderStateWatcherConfig` so OrderStateWatcher can be set to monitor different blockchain state layers (#488)
-## v0.33.2 - _March 18, 2018_
+## v0.33.2 - _March 17, 2018_
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
-## v0.33.1 - _March 8, 2018_
+## v0.33.1 - _March 7, 2018_
* Add missing EthersJs typescript typings as dependency
-## v0.33.0 - _March 4, 2018_
+## v0.33.0 - _March 3, 2018_
* Validate and lowercase all addresses in public methods (#373)
* Improve validation to force passing contract addresses on private networks (#385)
@@ -29,54 +127,54 @@ CHANGELOG
* Rename all public `_unsubscribeAll` methods to `unsubscribeAll` (#415)
* Move web3 typings from devDep to dep since cannot use this package without it (#429)
-## v0.32.2 - _February 9, 2018_
+## v0.32.2 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.32.1 - _February 7, 2018_
+## v0.32.1 - _February 6, 2018_
* Reorganized `BlockParamLiteral` export into `@0xproject/types` package (#355)
* Now using `abi-gen` package to generate ContractEventArgs types (#371)
-## v0.32.0 - _February 5, 2018_
+## v0.32.0 - _February 4, 2018_
* Add `zeroEx.etherToken.getContractAddressIfExists` (#350)
* Fixed the bug causing order watcher to throw if there is an event with the same signature but different indexed fields (#366)
-## v0.31.1 - _February 1, 2018_
+## v0.31.1 - _January 31, 2018_
* Fix the bug causing order watcher to throw if makerToken === zrx (#357)
-## v0.31.0 - _January 30, 2018_
+## v0.31.0 - _January 29, 2018_
* Add the `shouldAddPersonalMessagePrefix` parameter to `signOrderHashAsync` so that the caller can decide on whether to add the personalMessage prefix before relaying the request to the signer. Parity Signer, Ledger and TestRPC add the prefix themselves, Metamask expects it to have already been added. (#349)
-## v0.30.2 - _January 29, 2018_
+## v0.30.2 - _January 28, 2018_
* Add Rinkeby testnet addresses to artifacts (#337)
* Move @0xproject/types to dependencies from devDependencies fixing missing type errors
-## v0.30.1 - _January 24, 2018_
+## v0.30.1 - _January 23, 2018_
* Fix a bug allowing negative fill values (#212)
* Fix a bug that made it impossible to pass a custom ZRX address (#341)
-## v0.30.0 - _January 17, 2018_
+## v0.30.0 - _January 16, 2018_
* Add an error parameter to the order watcher callback (#312)
* Fix a bug making it impossible to catch some errors from awaitTransactionMinedAsync (#312)
* Fix a bug in fillOrdersUpTo validation making it impossible to fill up to if user doesn't have enough balance to fully fill all the orders (#321)
-## v0.29.1 - _January 11, 2018_
+## v0.29.1 - _January 10, 2018_
* Fixed bignumber config issue #301 (#305)
-## v0.29.0 - _December 28, 2017_
+## v0.29.0 - _December 27, 2017_
* Assert baseUnit amount supplied to `toUnitAmount` is integer amount. (#287)
* `toBaseUnitAmount` throws if amount supplied has too many decimals (#287)
-## v0.28.0 - _December 20, 2017_
+## v0.28.0 - _December 19, 2017_
* Add `etherTokenAddress` arg to `depositAsync` and `withdrawAsync` methods on `zeroEx.etherToken` (#267)
* Removed accidentally included `unsubscribeAll` method from `zeroEx.proxy`, `zeroEx.etherToken` and `zeroEx.tokenRegistry` (#267)
@@ -88,11 +186,11 @@ CHANGELOG
* Support `Deposit` and `Withdraw` events on etherToken (#277)
* Improve the error message when taker is not a string (#278)
-## v0.27.1 - _November 28, 2017_
+## v0.27.1 - _November 27, 2017_
* Export `TransactionOpts` type
-## v0.27.0 - _November 28, 2017_
+## v0.27.0 - _November 27, 2017_
* Make `ZeroExConfig` required parameter of `ZeroEx` constructor (#233)
* Add a required property `networkId` to `ZeroExConfig` (#233)
@@ -104,65 +202,65 @@ CHANGELOG
* All transaction sending methods now call `estimateGas` if no gas amount was supplied (#235)
* Modify order validation methods to validate against the `latest` block, not against the `pending` block (#236)
-## v0.26.0 - _November 21, 2017_
+## v0.26.0 - _November 20, 2017_
* Add post-formatter for logs converting `blockNumber`, `logIndex`, `transactionIndex` from hexes to numbers (#231)
* Remove support for Async callback types when used in Subscribe functions (#222)
* In OrderWatcher subscribe to ZRX Token Transfer and Approval events when maker token is different (#225)
-## v0.25.1 - _November 13, 2017_
+## v0.25.1 - _November 12, 2017_
* Standardise on Cancelled over Canceled (#217)
* Add missing `DecodedLogEvent` type to exported types (#205)
* Normalized the transactionReceipt status to be `null|0|1`, 1 meaning transaction execution successful, 0 unsuccessful and `null` if it is a pre-byzantinium transaction. (#200)
-## v0.23.0 - _November 12, 2017_
+## v0.23.0 - _November 11, 2017_
* Fixed unhandled promise rejection error in subscribe methods (#209)
* Subscribe callbacks now receive an error object as their first argument
-## v0.22.6 - _November 10, 2017_
+## v0.22.6 - _November 9, 2017_
* Add a timeout parameter to transaction awaiting (#206)
-## v0.22.5 - _November 7, 2017_
+## v0.22.5 - _November 6, 2017_
* Re-publish v0.22.4 to fix publishing issue
-## v0.22.4 - _October 25, 2017_
+## v0.22.4 - _October 24, 2017_
* Upgraded bignumber.js to a new version that ships with native typings
-## v0.22.3 - _October 25, 2017_
+## v0.22.3 - _October 24, 2017_
* Fixed an issue with new version of testrpc and unlimited proxy allowance (#199)
-## v0.22.2 - _October 24, 2017_
+## v0.22.2 - _October 23, 2017_
* Fixed rounding of maker fill amount and incorrect validation of partial fees (#197)
-## v0.22.0 - _October 16, 2017_
+## v0.22.0 - _October 15, 2017_
* Started using `OrderFillRequest` interface instead of `OrderFillOrKillRequest` interface for `zeroEx.exchange.batchFillOrKill` (#187)
* Removed `OrderFillOrKillRequest` (#187)
-## v0.21.4 - _October 13, 2017_
+## v0.21.4 - _October 12, 2017_
* Made 0x.js more type-safe by making `getLogsAsync` and `subscribe/subscribeAsync` generics parametrized with arg type (#194)
-## v0.21.3 - _October 12, 2017_
+## v0.21.3 - _October 11, 2017_
* Fixed a bug causing order fills to throw `INSUFFICIENT_TAKER_ALLOWANCE` (#193)
-## v0.21.2 - _October 11, 2017_
+## v0.21.2 - _October 10, 2017_
* Exported `ContractEventArg` as a public type (#190)
-## v0.21.1 - _October 11, 2017_
+## v0.21.1 - _October 10, 2017_
* Fixed a bug in subscriptions (#189)
-## v0.21.0 - _October 10, 2017_
+## v0.21.0 - _October 9, 2017_
* Complete rewrite of subscription logic (#182)
* Subscriptions no longer return historical logs. If you want them - use `getLogsAsync`
@@ -177,27 +275,27 @@ CHANGELOG
* Renamed `zeroEx.token.stopWatchingAllEventsAsync` to `zeroEx.token.unsubscribeAll`
* Fixed the batch fills validation by emulating all balance & proxy allowance changes (#185)
-## v0.20.0 - _October 5, 2017_
+## v0.20.0 - _October 4, 2017_
* Add `zeroEx.token.getLogsAsync` (#178)
* Add `zeroEx.exchange.getLogsAsync` (#178)
* Fixed fees validation when one of the tokens transferred is ZRX (#181)
-## v0.19.0 - _September 29, 2017_
+## v0.19.0 - _September 28, 2017_
* Made order validation optional (#172)
* Added Ropsten testnet support (#173)
* Fixed a bug causing awaitTransactionMinedAsync to DDos backend nodes (#175)
-## v0.18.0 - _September 26, 2017_
+## v0.18.0 - _September 25, 2017_
* Added `zeroEx.exchange.validateOrderFillableOrThrowAsync` to simplify orderbook pruning (#170)
-## v0.17.0 - _September 26, 2017_
+## v0.17.0 - _September 25, 2017_
* Made `zeroEx.exchange.getZRXTokenAddressAsync` public (#171)
-## v0.16.0 - _September 20, 2017_
+## v0.16.0 - _September 19, 2017_
* Added the ability to specify custom contract addresses to be used with 0x.js (#165)
* ZeroExConfig.exchangeContractAddress
@@ -205,48 +303,48 @@ CHANGELOG
* ZeroExConfig.etherTokenContractAddress
* Added `zeroEx.tokenRegistry.getContractAddressAsync` (#165)
-## v0.15.0 - _September 8, 2017_
+## v0.15.0 - _September 7, 2017_
* Added the ability to specify a historical `blockNumber` at which to query the blockchain's state when calling a token or exchange method (#161)
-## v0.14.2 - _September 7, 2017_
+## v0.14.2 - _September 6, 2017_
* Fixed an issue with bignumber.js types not found (#160)
-## v0.14.1 - _September 7, 2017_
+## v0.14.1 - _September 6, 2017_
* Fixed an issue with Artifact type not found (#159)
-## v0.14.0 - _September 6, 2017_
+## v0.14.0 - _September 5, 2017_
* Added `zeroEx.exchange.throwLogErrorsAsErrors` method to public interface (#157)
* Fixed an issue with overlapping async intervals in `zeroEx.awaitTransactionMinedAsync` (#157)
* Fixed an issue with log decoder returning `BigNumber`s as `strings` (#157)
-## v0.13.0 - _September 6, 2017_
+## v0.13.0 - _September 5, 2017_
* Made all the functions submitting transactions to the network to immediately return transaction hash (#151)
* Added `zeroEx.awaitTransactionMinedAsync` (#151)
* Added `TransactionReceiptWithDecodedLogs`, `LogWithDecodedArgs`, `DecodedLogArgs` to public types (#151)
* Added signature validation to `validateFillOrderThrowIfInvalidAsync` (#152)
-## v0.12.1 - _September 2, 2017_
+## v0.12.1 - _September 1, 2017_
* Added the support for web3@1.x.x provider (#142)
* Added the optional `zeroExConfig` parameter to the constructor of `ZeroEx` (#139)
* Added the ability to specify `gasPrice` when instantiating `ZeroEx` (#139)
-## v0.11.0 - _August 24, 2017_
+## v0.11.0 - _August 23, 2017_
* Added `zeroEx.token.setUnlimitedProxyAllowanceAsync` (#137)
* Added `zeroEx.token.setUnlimitedAllowanceAsync` (#137)
* Added `zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS` (#137)
-## v0.10.4 - _August 24, 2017_
+## v0.10.4 - _August 23, 2017_
* Fixed a bug where checksummed addresses were being pulled from artifacts and not lower-cased. (#135)
-## v0.10.1 - _August 24, 2017_
+## v0.10.1 - _August 23, 2017_
* Added `zeroEx.exchange.validateFillOrderThrowIfInvalidAsync` (#128)
* Added `zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync` (#128)
@@ -261,20 +359,20 @@ CHANGELOG
* Added clear error message when checksummed address is passed to a public method (#124)
* Fixes the description of `shouldThrowOnInsufficientBalanceOrAllowance` in docs (#127)
-## v0.9.3 - _August 22, 2017_
+## v0.9.3 - _August 21, 2017_
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
-## v0.9.2 - _August 21, 2017_
+## v0.9.2 - _August 20, 2017_
* *This version was unpublished because of a publishing issue.*
* Update contract artifacts to include latest Kovan and Mainnet deploys (#118)
-## v0.9.1 - _August 16, 2017_
+## v0.9.1 - _August 15, 2017_
* Fixed the bug causing `zeroEx.token.getBalanceAsync()` to fail if no addresses available (#120)
-## v0.9.0 - _July 26, 2017_
+## v0.9.0 - _July 25, 2017_
* Migrated to the new version of smart contracts (#101)
* Removed the ability to call methods on multiple authorized Exchange smart contracts (#106)
@@ -285,7 +383,7 @@ CHANGELOG
* Updated to typescript v2.4 (#104)
* Fixed an issue with incorrect balance/allowance validation when ZRX is one of the tokens traded (#109)
-## v0.8.0 - _July 4, 2017_
+## v0.8.0 - _July 3, 2017_
* Added the ability to call methods on different authorized versions of the Exchange smart contract (#82)
* Updated contract artifacts to reflect latest changes to the smart contracts (0xproject/contracts#59)
@@ -298,35 +396,35 @@ CHANGELOG
* `zeroEx.tokenRegistry.invalidateContractInstance`
* Fixed the bug where `zeroEx.setProviderAsync` didn't invalidate etherToken contract's instance
-## v0.7.1 - _June 26, 2017_
+## v0.7.1 - _June 25, 2017_
* Added the ability to convert Ether to wrapped Ether tokens and back via `zeroEx.etherToken.depostAsync` and `zeroEx.etherToken.withdrawAsync` (#81)
-## v0.7.0 - _June 22, 2017_
+## v0.7.0 - _June 21, 2017_
* Added Kovan smart contract artifacts (#78)
* Started returning fillAmount from `fillOrderAsync` and `fillUpToAsync` (#72)
* Started returning cancelledAmount from `cancelOrderAsync` (#72)
* Renamed type `LogCancelArgs` to `LogCancelContractEventArgs` and `LogFillArgs` to `LogFillContractEventArgs`
-## v0.6.2 - _June 21, 2017_
+## v0.6.2 - _June 20, 2017_
* Reduced bundle size
* Improved documentation
-## v0.6.1 - _June 19, 2017_
+## v0.6.1 - _June 18, 2017_
* Improved documentation
-## v0.6.0 - _June 19, 2017_
+## v0.6.0 - _June 18, 2017_
* Made `ZeroEx` class accept `Web3Provider` instance instead of `Web3` instance
* Added types for contract event arguments
-## v0.5.2 - _June 15, 2017_
+## v0.5.2 - _June 14, 2017_
* Fixed the bug in `postpublish` script that caused that only unminified UMD bundle was uploaded to release page
-## v0.5.1 - _June 15, 2017_
+## v0.5.1 - _June 14, 2017_
* Added `postpublish` script to publish to Github Releases with assets.
diff --git a/packages/0x.js/README.md b/packages/0x.js/README.md
index 5b17dac8b..fd6217151 100644
--- a/packages/0x.js/README.md
+++ b/packages/0x.js/README.md
@@ -1,5 +1,9 @@
## 0x.js
+A TypeScript/Javascript library for interacting with the 0x protocol.
+
+### Read the [Documentation](https://0xproject.com/docs/0x.js).
+
## Installation
0x.js ships as both a [UMD](https://github.com/umdjs/umd) module and a [CommonJS](https://en.wikipedia.org/wiki/CommonJS) package.
@@ -38,10 +42,54 @@ Download the UMD module from our [releases page](https://github.com/0xProject/0x
<script type="text/javascript" src="0x.js"></script>
```
-## Documentation
+## Contributing
+
+We strongly recommend that the community help us make improvements and determine the future direction of 0x protocol. To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=0x.js yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=0x.js yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
-Extensive documentation of 0x.js can be found on [our website][docs-url].
+### Run Tests
-[website-url]: https://0xproject.com/
-[whitepaper-url]: https://0xproject.com/pdfs/0x_white_paper.pdf
-[docs-url]: https://0xproject.com/docs/0xjs
+```bash
+yarn test
+```
diff --git a/packages/0x.js/package.json b/packages/0x.js/package.json
index b27eb188b..cf7b1962f 100644
--- a/packages/0x.js/package.json
+++ b/packages/0x.js/package.json
@@ -1,6 +1,9 @@
{
"name": "0x.js",
- "version": "0.34.0",
+ "version": "1.0.1-rc.3",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "A javascript library for interacting with the 0x protocol",
"keywords": [
"0x.js",
@@ -12,28 +15,30 @@
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "prebuild": "run-s clean generate_contract_wrappers",
- "build": "run-p build:umd:prod build:commonjs; exit 0;",
- "generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken|TokenRegistry|DummyToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && yarn build:all && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "build:all": "run-p build:umd:prod build:commonjs; exit 0;",
+ "pre_build": "run-s update_artifacts generate_contract_wrappers",
+ "copy_artifacts": "copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts",
+ "update_artifacts": "for i in ${npm_package_config_contracts}; do copyfiles -u 4 ../migrations/artifacts/2.0.0/$i.json src/artifacts; done;",
+ "generate_contract_wrappers": "abi-gen --abis 'src/artifacts/@(ZRXToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
+ "lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
"test:circleci": "run-s test:coverage",
- "test": "run-s clean test:commonjs",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
- "update_contracts": "for i in ${npm_package_config_artifacts}; do copyfiles -u 4 ../contracts/build/contracts/$i.json ../0x.js/src/artifacts; done;",
- "clean": "shx rm -rf _bundles lib test_temp scripts",
+ "clean": "shx rm -rf _bundles lib test_temp scripts src/generated_contract_wrappers",
"build:umd:prod": "NODE_ENV=production webpack",
- "build:commonjs": "tsc && copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "test:commonjs": "run-s build:commonjs run_mocha",
- "run_mocha": "mocha lib/test/**/*_test.js --timeout 10000 --bail --exit",
+ "build:commonjs": "tsc && yarn copy_artifacts && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js lib/test/global_hooks.js --timeout 10000 --bail --exit",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
"config": {
- "artifacts": "TokenTransferProxy Exchange TokenRegistry Token EtherToken",
+ "contracts": "ZRXToken",
"postpublish": {
"assets": [
"packages/0x.js/_bundles/index.js",
@@ -42,9 +47,15 @@
"docPublishConfigs": {
"extraFileIncludes": [
"../types/src/index.ts",
- "./src/contract_wrappers/generated/ether_token.ts",
- "./src/contract_wrappers/generated/token.ts",
- "./src/contract_wrappers/generated/exchange.ts"
+ "../ethereum-types/src/index.ts",
+ "../contract-wrappers/src/types.ts",
+ "../contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/exchange_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts",
+ "../contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts",
+ "../order-watcher/src/order_watcher/order_watcher.ts"
],
"s3BucketPath": "s3://doc-jsons/0x.js/",
"s3StagingBucketPath": "s3://staging-doc-jsons/0x.js/"
@@ -56,21 +67,16 @@
"url": "https://github.com/0xProject/0x-monorepo"
},
"license": "Apache-2.0",
- "engines": {
- "node": ">=6.0.0"
- },
"devDependencies": {
- "@0xproject/abi-gen": "^0.2.8",
- "@0xproject/dev-utils": "^0.3.3",
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/bintrees": "^1.0.2",
- "@types/jsonschema": "^1.1.1",
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/migrations": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
"@types/sinon": "^2.2.2",
- "@types/uuid": "^3.4.2",
"awesome-typescript-loader": "^3.1.3",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
@@ -78,42 +84,33 @@
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"json-loader": "^0.5.4",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"opn-cli": "^3.1.0",
- "prettier": "^1.11.1",
- "request": "^2.81.0",
- "request-promise-native": "^1.0.5",
"shx": "^0.2.2",
"sinon": "^4.0.0",
"source-map-support": "^0.5.0",
- "truffle-hdwallet-provider": "^0.0.3",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "types-bn": "^0.0.1",
- "typescript": "2.7.1",
- "web3-provider-engine": "^13.0.1",
+ "typescript": "2.9.2",
"webpack": "^3.1.0"
},
"dependencies": {
- "@0xproject/assert": "^0.2.4",
- "@0xproject/base-contract": "^0.0.6",
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "@0xproject/web3-wrapper": "^0.4.0",
- "bintrees": "^1.0.2",
- "bn.js": "^4.11.8",
- "ethereumjs-abi": "^0.6.4",
- "ethereumjs-blockstream": "^2.0.6",
- "ethereumjs-util": "^5.1.1",
- "ethers-contracts": "^2.2.1",
- "js-sha3": "^0.7.0",
- "lodash": "^4.17.4",
- "uuid": "^3.1.0",
- "web3": "^0.20.0"
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/contract-wrappers": "^1.0.1-rc.3",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "ethereum-types": "^1.0.4",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
},
"publishConfig": {
"access": "public"
diff --git a/packages/0x.js/src/0x.ts b/packages/0x.js/src/0x.ts
index b82cc820f..48d00c1ac 100644
--- a/packages/0x.js/src/0x.ts
+++ b/packages/0x.js/src/0x.ts
@@ -1,26 +1,30 @@
-import { schemas, SchemaValidator } from '@0xproject/json-schemas';
-import { ECSignature, Order, SignedOrder, TransactionReceiptWithDecodedLogs } from '@0xproject/types';
-import { AbiDecoder, BigNumber, intervalUtils } from '@0xproject/utils';
+import { assert } from '@0xproject/assert';
+import {
+ ContractWrappers,
+ ContractWrappersConfig,
+ ERC20ProxyWrapper,
+ ERC20TokenWrapper,
+ ERC721ProxyWrapper,
+ ERC721TokenWrapper,
+ EtherTokenWrapper,
+ ExchangeWrapper,
+} from '@0xproject/contract-wrappers';
+import {
+ assetDataUtils,
+ ecSignOrderHashAsync,
+ generatePseudoRandomSalt,
+ isValidSignatureAsync,
+ orderHashUtils,
+} from '@0xproject/order-utils';
+// HACK: Since we export assetDataUtils from ZeroEx and it has AssetProxyId, ERC20AssetData and ERC721AssetData
+// in it's public interface, we need to import these types here.
+// tslint:disable-next-line:no-unused-variable
+import { AssetProxyId, ERC20AssetData, ERC721AssetData, Order, SignedOrder, SignerType } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as ethUtil from 'ethereumjs-util';
-import * as _ from 'lodash';
+import { Provider, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
-import { artifacts } from './artifacts';
-import { EtherTokenWrapper } from './contract_wrappers/ether_token_wrapper';
-import { ExchangeWrapper } from './contract_wrappers/exchange_wrapper';
-import { TokenRegistryWrapper } from './contract_wrappers/token_registry_wrapper';
-import { TokenTransferProxyWrapper } from './contract_wrappers/token_transfer_proxy_wrapper';
-import { TokenWrapper } from './contract_wrappers/token_wrapper';
-import { OrderStateWatcher } from './order_watcher/order_state_watcher';
-import { zeroExConfigSchema } from './schemas/zero_ex_config_schema';
-import { zeroExPrivateNetworkConfigSchema } from './schemas/zero_ex_private_network_config_schema';
-import { zeroExPublicNetworkConfigSchema } from './schemas/zero_ex_public_network_config_schema';
-import { OrderStateWatcherConfig, Web3Provider, ZeroExConfig, ZeroExError } from './types';
-import { assert } from './utils/assert';
import { constants } from './utils/constants';
-import { decorators } from './utils/decorators';
-import { signatureUtils } from './utils/signature_utils';
-import { utils } from './utils/utils';
/**
* The ZeroEx class is the single entry-point into the 0x.js library. It contains all of the library's functionality
@@ -33,49 +37,34 @@ export class ZeroEx {
* this constant for your convenience.
*/
public static NULL_ADDRESS = constants.NULL_ADDRESS;
-
/**
* An instance of the ExchangeWrapper class containing methods for interacting with the 0x Exchange smart contract.
*/
public exchange: ExchangeWrapper;
/**
- * An instance of the TokenRegistryWrapper class containing methods for interacting with the 0x
- * TokenRegistry smart contract.
+ * An instance of the ERC20TokenWrapper class containing methods for interacting with any ERC20 token smart contract.
*/
- public tokenRegistry: TokenRegistryWrapper;
+ public erc20Token: ERC20TokenWrapper;
/**
- * An instance of the TokenWrapper class containing methods for interacting with any ERC20 token smart contract.
+ * An instance of the ERC721TokenWrapper class containing methods for interacting with any ERC721 token smart contract.
*/
- public token: TokenWrapper;
+ public erc721Token: ERC721TokenWrapper;
/**
* An instance of the EtherTokenWrapper class containing methods for interacting with the
* wrapped ETH ERC20 token smart contract.
*/
public etherToken: EtherTokenWrapper;
/**
- * An instance of the TokenTransferProxyWrapper class containing methods for interacting with the
- * tokenTransferProxy smart contract.
+ * An instance of the ERC20ProxyWrapper class containing methods for interacting with the
+ * ERC20 proxy smart contract.
*/
- public proxy: TokenTransferProxyWrapper;
- private _web3Wrapper: Web3Wrapper;
- private _abiDecoder: AbiDecoder;
+ public erc20Proxy: ERC20ProxyWrapper;
/**
- * Verifies that the elliptic curve signature `signature` was generated
- * by signing `data` with the private key corresponding to the `signerAddress` address.
- * @param data The hex encoded data signed by the supplied signature.
- * @param signature An object containing the elliptic curve signature parameters.
- * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
- * @return Whether the signature is valid for the supplied signerAddress and data.
+ * An instance of the ERC721ProxyWrapper class containing methods for interacting with the
+ * ERC721 proxy smart contract.
*/
- public static isValidSignature(data: string, signature: ECSignature, signerAddress: string): boolean {
- assert.isHexString('data', data);
- assert.doesConformToSchema('signature', signature, schemas.ecSignatureSchema);
- assert.isETHAddressHex('signerAddress', signerAddress);
- const normalizedSignerAddress = signerAddress.toLowerCase();
-
- const isValidSignature = signatureUtils.isValidSignature(data, signature, normalizedSignerAddress);
- return isValidSignature;
- }
+ public erc721Proxy: ERC721ProxyWrapper;
+ private readonly _contractWrappers: ContractWrappers;
/**
* Generates a pseudo-random 256-bit salt.
* The salt can be included in a 0x order, ensuring that the order generates a unique orderHash
@@ -83,12 +72,15 @@ export class ZeroEx {
* @return A pseudo-random 256-bit number that can be used as a salt.
*/
public static generatePseudoRandomSalt(): BigNumber {
- // BigNumber.random returns a pseudo-random number between 0 & 1 with a passed in number of decimal places.
- // Source: https://mikemcl.github.io/bignumber.js/#random
- const randomNumber = BigNumber.random(constants.MAX_DIGITS_IN_UNSIGNED_256_INT);
- const factor = new BigNumber(10).pow(constants.MAX_DIGITS_IN_UNSIGNED_256_INT - 1);
- const salt = randomNumber.times(factor).round();
- return salt;
+ return generatePseudoRandomSalt();
+ }
+ /**
+ * Computes the orderHash for a supplied order.
+ * @param order An object that conforms to the Order or SignedOrder interface definitions.
+ * @return The resulting orderHash from hashing the supplied order.
+ */
+ public static getOrderHashHex(order: Order | SignedOrder): string {
+ return orderHashUtils.getOrderHashHex(order);
}
/**
* Checks if the supplied hex encoded order hash is valid.
@@ -98,12 +90,7 @@ export class ZeroEx {
* @return Whether the supplied orderHash has the expected format.
*/
public static isValidOrderHash(orderHash: string): boolean {
- // Since this method can be called to check if any arbitrary string conforms to an orderHash's
- // format, we only assert that we were indeed passed a string.
- assert.isString('orderHash', orderHash);
- const schemaValidator = new SchemaValidator();
- const isValidOrderHash = schemaValidator.validate(orderHash, schemas.orderHashSchema).valid;
- return isValidOrderHash;
+ return orderHashUtils.isValidOrderHash(orderHash);
}
/**
* A unit amount is defined as the amount of a token above the specified decimal places (integer part).
@@ -116,10 +103,8 @@ export class ZeroEx {
public static toUnitAmount(amount: BigNumber, decimals: number): BigNumber {
assert.isValidBaseUnitAmount('amount', amount);
assert.isNumber('decimals', decimals);
-
- const aUnit = new BigNumber(10).pow(decimals);
- const unit = amount.div(aUnit);
- return unit;
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
+ return unitAmount;
}
/**
* A baseUnit is defined as the smallest denomination of a token. An amount expressed in baseUnits
@@ -132,66 +117,93 @@ export class ZeroEx {
public static toBaseUnitAmount(amount: BigNumber, decimals: number): BigNumber {
assert.isBigNumber('amount', amount);
assert.isNumber('decimals', decimals);
-
- const unit = new BigNumber(10).pow(decimals);
- const baseUnitAmount = amount.times(unit);
- const hasDecimals = baseUnitAmount.decimalPlaces() !== 0;
- if (hasDecimals) {
- throw new Error(`Invalid unit amount: ${amount.toString()} - Too many decimal places`);
- }
+ const baseUnitAmount = Web3Wrapper.toBaseUnitAmount(amount, decimals);
return baseUnitAmount;
}
/**
- * Computes the orderHash for a supplied order.
- * @param order An object that conforms to the Order or SignedOrder interface definitions.
- * @return The resulting orderHash from hashing the supplied order.
+ * Encodes an ERC20 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC20 token address to encode
+ * @return The hex encoded assetData string
*/
- @decorators.syncZeroExErrorHandler
- public static getOrderHashHex(order: Order | SignedOrder): string {
- assert.doesConformToSchema('order', order, schemas.orderSchema);
- const orderHashHex = utils.getOrderHashHex(order);
- return orderHashHex;
+ public static encodeERC20AssetData(tokenAddress: string): string {
+ return assetDataUtils.encodeERC20AssetData(tokenAddress);
+ }
+ /**
+ * Decodes an ERC20 assetData hex string into it's corresponding ERC20 tokenAddress & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress & assetProxyId
+ */
+ public static decodeERC20AssetData(assetData: string): ERC20AssetData {
+ return assetDataUtils.decodeERC20AssetData(assetData);
+ }
+ /**
+ * Encodes an ERC721 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC721 token address to encode
+ * @param tokenId The ERC721 tokenId to encode
+ * @return The hex encoded assetData string
+ */
+ public static encodeERC721AssetData(tokenAddress: string, tokenId: BigNumber): string {
+ return assetDataUtils.encodeERC721AssetData(tokenAddress, tokenId);
+ }
+ /**
+ * Decodes an ERC721 assetData hex string into it's corresponding ERC721 tokenAddress, tokenId & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress, tokenId & assetProxyId
+ */
+ public static decodeERC721AssetData(assetData: string): ERC721AssetData {
+ return assetDataUtils.decodeERC721AssetData(assetData);
+ }
+ /**
+ * Decode and return the assetProxyId from the assetData
+ * @param assetData Hex encoded assetData string to decode
+ * @return The assetProxyId
+ */
+ public static decodeAssetProxyId(assetData: string): AssetProxyId {
+ return assetDataUtils.decodeAssetProxyId(assetData);
+ }
+ /**
+ * Decode any assetData into it's corresponding assetData object
+ * @param assetData Hex encoded assetData string to decode
+ * @return Either a ERC20 or ERC721 assetData object
+ */
+ public static decodeAssetDataOrThrow(assetData: string): ERC20AssetData | ERC721AssetData {
+ return assetDataUtils.decodeAssetDataOrThrow(assetData);
}
/**
* Instantiates a new ZeroEx instance that provides the public interface to the 0x.js library.
- * @param provider The Web3.js Provider instance you would like the 0x.js library to use for interacting with
+ * @param provider The Provider instance you would like the 0x.js library to use for interacting with
* the Ethereum network.
* @param config The configuration object. Look up the type for the description.
* @return An instance of the 0x.js ZeroEx class.
*/
- constructor(provider: Web3Provider, config: ZeroExConfig) {
+ constructor(provider: Provider, config: ContractWrappersConfig) {
assert.isWeb3Provider('provider', provider);
- assert.doesConformToSchema('config', config, zeroExConfigSchema, [
- zeroExPrivateNetworkConfigSchema,
- zeroExPublicNetworkConfigSchema,
- ]);
- const artifactJSONs = _.values(artifacts);
- const abiArrays = _.map(artifactJSONs, artifact => artifact.abi);
- this._abiDecoder = new AbiDecoder(abiArrays);
- const defaults = {
- gasPrice: config.gasPrice,
- };
- this._web3Wrapper = new Web3Wrapper(provider, defaults);
- this.proxy = new TokenTransferProxyWrapper(
- this._web3Wrapper,
- config.networkId,
- config.tokenTransferProxyContractAddress,
- );
- this.token = new TokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.proxy);
- this.exchange = new ExchangeWrapper(
- this._web3Wrapper,
- config.networkId,
- this._abiDecoder,
- this.token,
- config.exchangeContractAddress,
- config.zrxContractAddress,
- );
- this.tokenRegistry = new TokenRegistryWrapper(
- this._web3Wrapper,
- config.networkId,
- config.tokenRegistryContractAddress,
+ this._contractWrappers = new ContractWrappers(provider, config);
+
+ this.erc20Proxy = this._contractWrappers.erc20Proxy;
+ this.erc721Proxy = this._contractWrappers.erc721Proxy;
+ this.erc20Token = this._contractWrappers.erc20Token;
+ this.erc721Token = this._contractWrappers.erc721Token;
+ this.exchange = this._contractWrappers.exchange;
+ this.etherToken = this._contractWrappers.etherToken;
+ }
+ /**
+ * Verifies that the provided signature is valid according to the 0x Protocol smart contracts
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature The hex encoded signature.
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the signature is valid for the supplied signerAddress and data.
+ */
+ public async isValidSignatureAsync(data: string, signature: string, signerAddress: string): Promise<boolean> {
+ const isValid = await isValidSignatureAsync(
+ this._contractWrappers.getProvider(),
+ data,
+ signature,
+ signerAddress,
);
- this.etherToken = new EtherTokenWrapper(this._web3Wrapper, config.networkId, this._abiDecoder, this.token);
+ return isValid;
}
/**
* Sets a new web3 provider for 0x.js. Updating the provider will stop all
@@ -199,25 +211,24 @@ export class ZeroEx {
* @param provider The Web3Provider you would like the 0x.js library to use from now on.
* @param networkId The id of the network your provider is connected to
*/
- public setProvider(provider: Web3Provider, networkId: number): void {
- this._web3Wrapper.setProvider(provider);
- (this.exchange as any)._invalidateContractInstances();
- (this.exchange as any)._setNetworkId(networkId);
- (this.tokenRegistry as any)._invalidateContractInstance();
- (this.tokenRegistry as any)._setNetworkId(networkId);
- (this.token as any)._invalidateContractInstances();
- (this.token as any)._setNetworkId(networkId);
- (this.proxy as any)._invalidateContractInstance();
- (this.proxy as any)._setNetworkId(networkId);
- (this.etherToken as any)._invalidateContractInstance();
- (this.etherToken as any)._setNetworkId(networkId);
+ public setProvider(provider: Provider, networkId: number): void {
+ this._contractWrappers.setProvider(provider, networkId);
+ }
+ /**
+ * Get the provider instance currently used by 0x.js
+ * @return Web3 provider instance
+ */
+ public getProvider(): Provider {
+ return this._contractWrappers.getProvider();
}
/**
* Get user Ethereum addresses available through the supplied web3 provider available for sending transactions.
* @return An array of available user Ethereum addresses.
*/
public async getAvailableAddressesAsync(): Promise<string[]> {
- const availableAddresses = await this._web3Wrapper.getAvailableAddressesAsync();
+ // Hack: Get Web3Wrapper from ContractWrappers
+ const web3Wrapper: Web3Wrapper = (this._contractWrappers as any)._web3Wrapper;
+ const availableAddresses = await web3Wrapper.getAvailableAddressesAsync();
return availableAddresses;
}
/**
@@ -225,53 +236,24 @@ export class ZeroEx {
* This method currently supports TestRPC, Geth and Parity above and below V1.6.6
* @param orderHash Hex encoded orderHash to sign.
* @param signerAddress The hex encoded Ethereum address you wish to sign it with. This address
- * must be available via the Web3.Provider supplied to 0x.js.
- * @param shouldAddPersonalMessagePrefix Some signers add the personal message prefix `\x19Ethereum Signed Message`
- * themselves (e.g Parity Signer, Ledger, TestRPC) and others expect it to already be done by the client
- * (e.g Metamask). Depending on which signer this request is going to, decide on whether to add the prefix
- * before sending the request.
- * @return An object containing the Elliptic curve signature parameters generated by signing the orderHash.
+ * must be available via the Provider supplied to 0x.js.
+ * @param signerType the signer type that will perform the `eth_sign` operation. E.g Default, Metamask, Ledger or Trezor.
+ * Some implementations exhibit different behaviour. Default will assume a spec compliant eth_sign implementation.
+ * This parameter is defaulted to `SignerType.Default`.
+ * @return A hex encoded string of the Elliptic curve signature parameters generated by signing the orderHash and signature type.
*/
- public async signOrderHashAsync(
+ public async ecSignOrderHashAsync(
orderHash: string,
signerAddress: string,
- shouldAddPersonalMessagePrefix: boolean,
- ): Promise<ECSignature> {
- assert.isHexString('orderHash', orderHash);
- await assert.isSenderAddressAsync('signerAddress', signerAddress, this._web3Wrapper);
- const normalizedSignerAddress = signerAddress.toLowerCase();
-
- let msgHashHex = orderHash;
- if (shouldAddPersonalMessagePrefix) {
- const orderHashBuff = ethUtil.toBuffer(orderHash);
- const msgHashBuff = ethUtil.hashPersonalMessage(orderHashBuff);
- msgHashHex = ethUtil.bufferToHex(msgHashBuff);
- }
-
- const signature = await this._web3Wrapper.signMessageAsync(normalizedSignerAddress, msgHashHex);
-
- // HACK: There is no consensus on whether the signatureHex string should be formatted as
- // v + r + s OR r + s + v, and different clients (even different versions of the same client)
- // return the signature params in different orders. In order to support all client implementations,
- // we parse the signature in both ways, and evaluate if either one is a valid signature.
- const validVParamValues = [27, 28];
- const ecSignatureVRS = signatureUtils.parseSignatureHexAsVRS(signature);
- if (_.includes(validVParamValues, ecSignatureVRS.v)) {
- const isValidVRSSignature = ZeroEx.isValidSignature(orderHash, ecSignatureVRS, normalizedSignerAddress);
- if (isValidVRSSignature) {
- return ecSignatureVRS;
- }
- }
-
- const ecSignatureRSV = signatureUtils.parseSignatureHexAsRSV(signature);
- if (_.includes(validVParamValues, ecSignatureRSV.v)) {
- const isValidRSVSignature = ZeroEx.isValidSignature(orderHash, ecSignatureRSV, normalizedSignerAddress);
- if (isValidRSVSignature) {
- return ecSignatureRSV;
- }
- }
-
- throw new Error(ZeroExError.InvalidSignature);
+ signerType: SignerType = SignerType.Default,
+ ): Promise<string> {
+ const signature = await ecSignOrderHashAsync(
+ this._contractWrappers.getProvider(),
+ orderHash,
+ signerAddress,
+ signerType,
+ );
+ return signature;
}
/**
* Waits for a transaction to be mined and returns the transaction receipt.
@@ -282,65 +264,16 @@ export class ZeroEx {
*/
public async awaitTransactionMinedAsync(
txHash: string,
- pollingIntervalMs = 1000,
+ pollingIntervalMs: number = 1000,
timeoutMs?: number,
): Promise<TransactionReceiptWithDecodedLogs> {
- let timeoutExceeded = false;
- if (timeoutMs) {
- setTimeout(() => (timeoutExceeded = true), timeoutMs);
- }
-
- const txReceiptPromise = new Promise(
- (resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
- const intervalId = intervalUtils.setAsyncExcludingInterval(
- async () => {
- if (timeoutExceeded) {
- intervalUtils.clearAsyncExcludingInterval(intervalId);
- return reject(ZeroExError.TransactionMiningTimeout);
- }
-
- const transactionReceipt = await this._web3Wrapper.getTransactionReceiptAsync(txHash);
- if (!_.isNull(transactionReceipt)) {
- intervalUtils.clearAsyncExcludingInterval(intervalId);
- const logsWithDecodedArgs = _.map(
- transactionReceipt.logs,
- this._abiDecoder.tryToDecodeLogOrNoop.bind(this._abiDecoder),
- );
- const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
- ...transactionReceipt,
- logs: logsWithDecodedArgs,
- };
- resolve(transactionReceiptWithDecodedLogArgs);
- }
- },
- pollingIntervalMs,
- (err: Error) => {
- intervalUtils.clearAsyncExcludingInterval(intervalId);
- reject(err);
- },
- );
- },
+ // Hack: Get Web3Wrapper from ContractWrappers
+ const web3Wrapper: Web3Wrapper = (this._contractWrappers as any)._web3Wrapper;
+ const transactionReceiptWithDecodedLogs = await web3Wrapper.awaitTransactionMinedAsync(
+ txHash,
+ pollingIntervalMs,
+ timeoutMs,
);
- const txReceipt = await txReceiptPromise;
- return txReceipt;
- }
- /**
- * Instantiates and returns a new OrderStateWatcher instance.
- * Defaults to watching the pending state.
- * @param config The configuration object. Look up the type for the description.
- * @return An instance of the 0x.js OrderStateWatcher class.
- */
- public createOrderStateWatcher(config?: OrderStateWatcherConfig) {
- return new OrderStateWatcher(this._web3Wrapper, this._abiDecoder, this.token, this.exchange, config);
- }
- /*
- * HACK: `TokenWrapper` needs a token transfer proxy address. `TokenTransferProxy` address is fetched from
- * an `ExchangeWrapper`. `ExchangeWrapper` needs `TokenWrapper` to validate orders, creating a dependency cycle.
- * In order to break this - we create this function here and pass it as a parameter to the `TokenWrapper`
- * and `ProxyWrapper`.
- */
- private async _getTokenTransferProxyAddressAsync(): Promise<string> {
- const tokenTransferProxyAddress = await (this.exchange as any)._getTokenTransferProxyAddressAsync();
- return tokenTransferProxyAddress;
+ return transactionReceiptWithDecodedLogs;
}
}
diff --git a/packages/0x.js/src/artifacts.ts b/packages/0x.js/src/artifacts.ts
index cbacd7d56..f68969d28 100644
--- a/packages/0x.js/src/artifacts.ts
+++ b/packages/0x.js/src/artifacts.ts
@@ -1,18 +1,7 @@
-import * as DummyTokenArtifact from './artifacts/DummyToken.json';
-import * as EtherTokenArtifact from './artifacts/EtherToken.json';
-import * as ExchangeArtifact from './artifacts/Exchange.json';
-import * as TokenArtifact from './artifacts/Token.json';
-import * as TokenRegistryArtifact from './artifacts/TokenRegistry.json';
-import * as TokenTransferProxyArtifact from './artifacts/TokenTransferProxy.json';
-import * as ZRXArtifact from './artifacts/ZRX.json';
-import { Artifact } from './types';
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as ZRXToken from './artifacts/ZRXToken.json';
export const artifacts = {
- ZRXArtifact: (ZRXArtifact as any) as Artifact,
- DummyTokenArtifact: (DummyTokenArtifact as any) as Artifact,
- TokenArtifact: (TokenArtifact as any) as Artifact,
- ExchangeArtifact: (ExchangeArtifact as any) as Artifact,
- EtherTokenArtifact: (EtherTokenArtifact as any) as Artifact,
- TokenRegistryArtifact: (TokenRegistryArtifact as any) as Artifact,
- TokenTransferProxyArtifact: (TokenTransferProxyArtifact as any) as Artifact,
+ ZRXToken: (ZRXToken as any) as ContractArtifact,
};
diff --git a/packages/0x.js/src/artifacts/DummyToken.json b/packages/0x.js/src/artifacts/DummyToken.json
deleted file mode 100644
index f64a8cd3d..000000000
--- a/packages/0x.js/src/artifacts/DummyToken.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "contract_name": "DummyToken",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_target",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "setBalance",
- "outputs": [],
- "payable": false,
- "type": "function"
- }
- ]
-}
diff --git a/packages/0x.js/src/artifacts/EtherToken.json b/packages/0x.js/src/artifacts/EtherToken.json
deleted file mode 100644
index 26cca57cd..000000000
--- a/packages/0x.js/src/artifacts/EtherToken.json
+++ /dev/null
@@ -1,287 +0,0 @@
-{
- "contract_name": "EtherToken",
- "abi": [
- {
- "constant": true,
- "inputs": [],
- "name": "name",
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_spender",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "approve",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "totalSupply",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_from",
- "type": "address"
- },
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "amount",
- "type": "uint256"
- }
- ],
- "name": "withdraw",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "decimals",
- "outputs": [
- {
- "name": "",
- "type": "uint8"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "balanceOf",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "symbol",
- "outputs": [
- {
- "name": "",
- "type": "string"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transfer",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [],
- "name": "deposit",
- "outputs": [],
- "payable": true,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- },
- {
- "name": "_spender",
- "type": "address"
- }
- ],
- "name": "allowance",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "payable": true,
- "type": "fallback"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_from",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_to",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Transfer",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_spender",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Approval",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Deposit",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Withdrawal",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"
- },
- "3": {
- "address": "0xc00fd9820cd2898cc4c054b7bf142de637ad129a"
- },
- "4": {
- "address": "0xc778417e063141139fce010982780140aa0cd5ab"
- },
- "42": {
- "address": "0x653e49e301e508a13237c0ddc98ae7d4cd2667a1"
- },
- "50": {
- "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c"
- }
- }
-}
diff --git a/packages/0x.js/src/artifacts/Token.json b/packages/0x.js/src/artifacts/Token.json
deleted file mode 100644
index 3b5a86ae0..000000000
--- a/packages/0x.js/src/artifacts/Token.json
+++ /dev/null
@@ -1,172 +0,0 @@
-{
- "contract_name": "Token",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_spender",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "approve",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "totalSupply",
- "outputs": [
- {
- "name": "supply",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_from",
- "type": "address"
- },
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- }
- ],
- "name": "balanceOf",
- "outputs": [
- {
- "name": "balance",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_to",
- "type": "address"
- },
- {
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "transfer",
- "outputs": [
- {
- "name": "success",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_owner",
- "type": "address"
- },
- {
- "name": "_spender",
- "type": "address"
- }
- ],
- "name": "allowance",
- "outputs": [
- {
- "name": "remaining",
- "type": "uint256"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_from",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_to",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Transfer",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "_owner",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "_spender",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "_value",
- "type": "uint256"
- }
- ],
- "name": "Approval",
- "type": "event"
- }
- ]
-}
diff --git a/packages/0x.js/src/artifacts/TokenRegistry.json b/packages/0x.js/src/artifacts/TokenRegistry.json
deleted file mode 100644
index 0f583628c..000000000
--- a/packages/0x.js/src/artifacts/TokenRegistry.json
+++ /dev/null
@@ -1,547 +0,0 @@
-{
- "contract_name": "TokenRegistry",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_index",
- "type": "uint256"
- }
- ],
- "name": "removeToken",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "getTokenAddressByName",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "getTokenAddressBySymbol",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_swarmHash",
- "type": "bytes"
- }
- ],
- "name": "setTokenSwarmHash",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- }
- ],
- "name": "getTokenMetaData",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "owner",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_name",
- "type": "string"
- },
- {
- "name": "_symbol",
- "type": "string"
- },
- {
- "name": "_decimals",
- "type": "uint8"
- },
- {
- "name": "_ipfsHash",
- "type": "bytes"
- },
- {
- "name": "_swarmHash",
- "type": "bytes"
- }
- ],
- "name": "addToken",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "setTokenName",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "tokens",
- "outputs": [
- {
- "name": "token",
- "type": "address"
- },
- {
- "name": "name",
- "type": "string"
- },
- {
- "name": "symbol",
- "type": "string"
- },
- {
- "name": "decimals",
- "type": "uint8"
- },
- {
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "tokenAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_name",
- "type": "string"
- }
- ],
- "name": "getTokenByName",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "getTokenAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address[]"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_ipfsHash",
- "type": "bytes"
- }
- ],
- "name": "setTokenIpfsHash",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "getTokenBySymbol",
- "outputs": [
- {
- "name": "",
- "type": "address"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "string"
- },
- {
- "name": "",
- "type": "uint8"
- },
- {
- "name": "",
- "type": "bytes"
- },
- {
- "name": "",
- "type": "bytes"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "_token",
- "type": "address"
- },
- {
- "name": "_symbol",
- "type": "string"
- }
- ],
- "name": "setTokenSymbol",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "transferOwnership",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "name",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "symbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "decimals",
- "type": "uint8"
- },
- {
- "indexed": false,
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogAddToken",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "name",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "symbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "decimals",
- "type": "uint8"
- },
- {
- "indexed": false,
- "name": "ipfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "swarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogRemoveToken",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldName",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "newName",
- "type": "string"
- }
- ],
- "name": "LogTokenNameChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldSymbol",
- "type": "string"
- },
- {
- "indexed": false,
- "name": "newSymbol",
- "type": "string"
- }
- ],
- "name": "LogTokenSymbolChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldIpfsHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "newIpfsHash",
- "type": "bytes"
- }
- ],
- "name": "LogTokenIpfsHashChange",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "token",
- "type": "address"
- },
- {
- "indexed": false,
- "name": "oldSwarmHash",
- "type": "bytes"
- },
- {
- "indexed": false,
- "name": "newSwarmHash",
- "type": "bytes"
- }
- ],
- "name": "LogTokenSwarmHashChange",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0x926a74c5c36adf004c87399e65f75628b0f98d2c"
- },
- "3": {
- "address": "0x6b1a50f0bb5a7995444bd3877b22dc89c62843ed"
- },
- "4": {
- "address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
- },
- "42": {
- "address": "0xf18e504561f4347bea557f3d4558f559dddbae7f"
- },
- "50": {
- "address": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082"
- }
- }
-}
diff --git a/packages/0x.js/src/artifacts/TokenTransferProxy.json b/packages/0x.js/src/artifacts/TokenTransferProxy.json
deleted file mode 100644
index 8cf551ddb..000000000
--- a/packages/0x.js/src/artifacts/TokenTransferProxy.json
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- "contract_name": "TokenTransferProxy",
- "abi": [
- {
- "constant": false,
- "inputs": [
- {
- "name": "token",
- "type": "address"
- },
- {
- "name": "from",
- "type": "address"
- },
- {
- "name": "to",
- "type": "address"
- },
- {
- "name": "value",
- "type": "uint256"
- }
- ],
- "name": "transferFrom",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "target",
- "type": "address"
- }
- ],
- "name": "addAuthorizedAddress",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "name": "authorities",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "target",
- "type": "address"
- }
- ],
- "name": "removeAuthorizedAddress",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "owner",
- "outputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [
- {
- "name": "",
- "type": "address"
- }
- ],
- "name": "authorized",
- "outputs": [
- {
- "name": "",
- "type": "bool"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "getAuthorizedAddresses",
- "outputs": [
- {
- "name": "",
- "type": "address[]"
- }
- ],
- "payable": false,
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "newOwner",
- "type": "address"
- }
- ],
- "name": "transferOwnership",
- "outputs": [],
- "payable": false,
- "type": "function"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "target",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "caller",
- "type": "address"
- }
- ],
- "name": "LogAuthorizedAddressAdded",
- "type": "event"
- },
- {
- "anonymous": false,
- "inputs": [
- {
- "indexed": true,
- "name": "target",
- "type": "address"
- },
- {
- "indexed": true,
- "name": "caller",
- "type": "address"
- }
- ],
- "name": "LogAuthorizedAddressRemoved",
- "type": "event"
- }
- ],
- "networks": {
- "1": {
- "address": "0x8da0d80f5007ef1e431dd2127178d224e32c2ef4"
- },
- "3": {
- "address": "0x4e9aad8184de8833365fea970cd9149372fdf1e6"
- },
- "4": {
- "address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
- },
- "42": {
- "address": "0x087eed4bc1ee3de49befbd66c662b434b15d49d4"
- },
- "50": {
- "address": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48"
- }
- }
-}
diff --git a/packages/0x.js/src/artifacts/ZRX.json b/packages/0x.js/src/artifacts/ZRX.json
deleted file mode 100644
index e40b8f268..000000000
--- a/packages/0x.js/src/artifacts/ZRX.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "contract_name": "ZRX",
- "networks": {
- "1": {
- "address": "0xe41d2489571d322189246dafa5ebde1f4699f498"
- },
- "3": {
- "address": "0xa8e9fa8f91e5ae138c74648c9c304f1c75003a8d"
- },
- "4": {
- "address": "0x00f58d6d585f84b2d7267940cede30ce2fe6eae8"
- },
- "42": {
- "address": "0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570"
- },
- "50": {
- "address": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401"
- }
- }
-}
diff --git a/packages/0x.js/src/artifacts/ZRXToken.json b/packages/0x.js/src/artifacts/ZRXToken.json
new file mode 100644
index 000000000..0ce91c1c1
--- /dev/null
+++ b/packages/0x.js/src/artifacts/ZRXToken.json
@@ -0,0 +1,10031 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ZRXToken",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "devdoc": {
+ "methods": {
+ "transferFrom(address,address,uint256)": {
+ "details": "ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.",
+ "params": {
+ "_from": "Address to transfer from.",
+ "_to": "Address to transfer to.",
+ "_value": "Amount to transfer."
+ },
+ "return": "Success of transfer."
+ }
+ }
+ },
+ "evm": {
+ "assembly": " /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":958:964 10**27 */\n 0x33b2e3c9fd0803ce8000000\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n 0x3\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\n jumpi(tag_1, iszero(callvalue))\n invalid\ntag_1:\ntag_2:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1222:1233 totalSupply */\n sload(0x3)\n sub(exp(0x2, 0xa0), 0x1)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1208:1218 msg.sender */\n caller\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n and\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1207 balances */\n 0x0\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1233 balances[msg.sender] = totalSupply */\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\ntag_3:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\ntag_4:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, iszero(calldatasize))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x6fdde03\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0x95ea7b3\n eq\n tag_3\n jumpi\n dup1\n 0x18160ddd\n eq\n tag_4\n jumpi\n dup1\n 0x23b872dd\n eq\n tag_5\n jumpi\n dup1\n 0x313ce567\n eq\n tag_6\n jumpi\n dup1\n 0x70a08231\n eq\n tag_7\n jumpi\n dup1\n 0x95d89b41\n eq\n tag_8\n jumpi\n dup1\n 0xa9059cbb\n eq\n tag_9\n jumpi\n dup1\n 0xdd62ed3e\n eq\n tag_10\n jumpi\n tag_1:\n invalid\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_2:\n jumpi(tag_11, iszero(callvalue))\n invalid\n tag_11:\n tag_12\n jump(tag_13)\n tag_12:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_15:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_14:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_16:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_3:\n jumpi(tag_17, iszero(callvalue))\n invalid\n tag_17:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_19)\n tag_18:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_4:\n jumpi(tag_20, iszero(callvalue))\n invalid\n tag_20:\n tag_21\n jump(tag_22)\n tag_21:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_5:\n jumpi(tag_23, iszero(callvalue))\n invalid\n tag_23:\n tag_18\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n calldataload(0x44)\n jump(tag_25)\n tag_24:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_6:\n jumpi(tag_26, iszero(callvalue))\n invalid\n tag_26:\n tag_27\n jump(tag_28)\n tag_27:\n 0x40\n dup1\n mload\n 0xff\n swap1\n swap3\n and\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_7:\n jumpi(tag_29, iszero(callvalue))\n invalid\n tag_29:\n tag_21\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_31)\n tag_30:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_8:\n jumpi(tag_32, iszero(callvalue))\n invalid\n tag_32:\n tag_12\n jump(tag_34)\n tag_33:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_36:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_35:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_37:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_9:\n jumpi(tag_38, iszero(callvalue))\n invalid\n tag_38:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_40)\n tag_39:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_10:\n jumpi(tag_41, iszero(callvalue))\n invalid\n tag_41:\n tag_21\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n jump(tag_43)\n tag_42:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_13:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x11\n dup2\n mstore\n 0x30782050726f746f636f6c20546f6b656e000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_19:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1168:1178 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1167 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap5\n dup8\n and\n dup1\n dup5\n mstore\n swap5\n dup3\n mstore\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1198 */\n dup7\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n dup1\n mload\n dup7\n dup2\n mstore\n swap1\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n swap3\n swap5\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n swap3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\n swap3\n swap2\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1263:1267 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_44:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_22:\n sload(0x3)\n dup2\n jump\t// out\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_25:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1161:1165 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n dup2\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1205 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1213:1223 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1224 */\n swap1\n swap6\n and\n dup4\n mstore\n swap4\n dup2\n mstore\n dup4\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1253 */\n swap3\n dup3\n mstore\n dup2\n swap1\n mstore\n swap2\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1263 */\n dup4\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1292:1298 */\n dup3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1288 */\n dup2\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1298 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n dup1\n iszero\n tag_47\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1348 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1336 */\n dup4\n dup2\n add\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1353 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n tag_47:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n iszero\n tag_48\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup6\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1386 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup1\n dup3\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1401 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1430 */\n swap2\n dup8\n and\n dup2\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1440 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":768:778 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1458:1478 */\n dup2\n lt\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n iszero\n tag_49\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup7\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1505 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1513:1523 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1524 */\n swap1\n swap5\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1534 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n tag_49:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1578:1581 */\n dup4\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1571:1576 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1583:1589 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n mload(0x40)\n dup1\n dup3\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1611:1615 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1604:1615 */\n swap2\n pop\n jump(tag_50)\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_48:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1653:1658 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1646:1658 */\n swap2\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_50:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_45:\n pop\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_28:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":924:926 18 */\n 0x12\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_31:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1035:1039 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_51:\n swap2\n swap1\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_34:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x3\n dup2\n mstore\n 0x5a52580000000000000000000000000000000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_40:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":276:286 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":178:182 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup2\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:297 */\n dup3\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53\n jumpi\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:335 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:323 */\n dup3\n dup2\n add\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:340 */\n lt\n iszero\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n iszero\n tag_54\n jumpi\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":365:375 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:364 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n dup2\n mstore\n 0x20\n dup2\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:386 */\n dup1\n sload\n dup9\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap4\n dup8\n and\n dup1\n dup4\n mstore\n swap2\n dup5\n swap1\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:423 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n dup4\n mload\n dup7\n dup2\n mstore\n swap4\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap2\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n swap3\n swap1\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":491:495 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":484:495 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_54:\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":521:526 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":514:526 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_55:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_52:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_43:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1351:1355 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n swap1\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1381 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1399 */\n swap4\n dup6\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_56:\n swap3\n swap2\n pop\n pop\n jump\t// out\n}\n",
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60606040526b033b2e3c9fd0803ce8000000600355341561001c57fe5b5b600354600160a060020a0333166000908152602081905260409020555b5b61078d8061004a6000396000f300606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH12 0x33B2E3C9FD0803CE8000000 PUSH1 0x3 SSTORE CALLVALUE ISZERO PUSH2 0x1C JUMPI INVALID JUMPDEST JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SSTORE JUMPDEST JUMPDEST PUSH2 0x78D DUP1 PUSH2 0x4A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;958:6;932:32;;1150:90;;;;;;;1222:11;;-1:-1:-1;;;;;1208:10:3;1199:20;:8;:20;;;;;;;;;;:34;1150:90;795:447;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1087:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;932:32:3;;;;;;;;;;;;;;;;;;;;;;;;;;1066:609:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;891:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;982:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1064:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1280:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49:3;;;;;;;;;;;;;;;;;;;:::o;1087:187:0:-;1160:19;1168:10;1160:19;;1144:4;1160:19;;;:7;:19;;;;;;;;:29;;;;;;;;;;;;:38;;;1208;;;;;;;1144:4;;1160:29;:19;1208:38;;;;;;;;;;;-1:-1:-1;1263:4:0;1087:187;;;;;:::o;932:32:3:-;;;;:::o;1066:609:2:-;1198:14;;;;1161:4;1198:14;;;:7;:14;;;;;;;;1213:10;1198:26;;;;;;;;;;;;1238:15;;;;;;;;;;:25;;;;;;:60;;;1292:6;1279:9;:19;;1238:60;:115;;;;-1:-1:-1;1340:13:2;;;:8;:13;;;;;;;;;;;1314:22;;;:39;;1238:115;1234:435;;;1378:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1415:15;;;;;;:25;;;;;;;768:10;1458:20;;1454:95;;;1498:14;;;;;;;;:7;:14;;;;;;;;1513:10;1498:26;;;;;;;;;:36;;;;;;;1454:95;1578:3;1562:28;;1571:5;1562:28;;;1583:6;1562:28;;;;;;;;;;;;;;;;;;1611:4;1604:11;;;;1234:435;1653:5;1646:12;;1234:435;1066:609;;;;;;;:::o;891:35:3:-;924:2;891:35;:::o;982:99:0:-;1058:16;;;1035:4;1058:16;;;;;;;;;;;982:99;;;;:::o;1064:37:3:-;;;;;;;;;;;;;;;;;;;:::o;125:410:0:-;267:20;276:10;267:20;178:4;267:20;;;;;;;;;;;:30;;;;;;:73;;-1:-1:-1;327:13:0;;;:8;:13;;;;;;;;;;;301:22;;;:39;;267:73;263:266;;;356:20;365:10;356:20;;:8;:20;;;;;;;;;;;:30;;;;;;;400:13;;;;;;;;;;:23;;;;;;437:33;;;;;;;400:13;;437:33;;;;;;;;;;;-1:-1:-1;491:4:0;484:11;;263:266;-1:-1:-1;521:5:0;514:12;;263:266;125:410;;;;;:::o;1280:126::-;1374:15;;;;1351:4;1374:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;1280:126;;;;;:::o"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "386600",
+ "executionCost": "40780",
+ "totalCost": "427380"
+ },
+ "external": {
+ "allowance(address,address)": "737",
+ "approve(address,uint256)": "22218",
+ "balanceOf(address)": "579",
+ "decimals()": "270",
+ "name()": "530",
+ "symbol()": "662",
+ "totalSupply()": "417",
+ "transfer(address,uint256)": "43393",
+ "transferFrom(address,address,uint256)": "64116"
+ }
+ },
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 958,
+ "end": 964,
+ "name": "PUSH",
+ "value": "33B2E3C9FD0803CE8000000"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1218,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "AND"
+ },
+ {
+ "begin": 1199,
+ "end": 1207,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1199,
+ "end": 1233,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "100000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DIV"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "AND"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "6FDDE03"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95EA7B3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "18160DDD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "23B872DD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "313CE567"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "70A08231"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95D89B41"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "A9059CBB"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "DD62ED3E"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "AND"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SUB"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ADD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "RETURN"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "INVALID"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SUB"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ADD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SUB"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ADD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "RETURN"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "INVALID"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "AND"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SUB"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ADD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "RETURN"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "INVALID"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "AND"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP3"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SUB"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ADD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "INVALID"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "AND"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SUB"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ADD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SUB"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ADD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "30782050726F746F636F6C20546F6B656E000000000000000000000000000000"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1168,
+ "end": 1178,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "AND"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1167,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "AND"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "PUSH",
+ "value": "8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "ADD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1263,
+ "end": 1267,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "AND"
+ },
+ {
+ "begin": 1161,
+ "end": 1165,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1205,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1213,
+ "end": 1223,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "AND"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "LT"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "POP"
+ },
+ {
+ "begin": 1292,
+ "end": 1298,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1279,
+ "end": 1288,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "LT"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "AND"
+ },
+ {
+ "begin": 1340,
+ "end": 1348,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "ADD"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "LT"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "AND"
+ },
+ {
+ "begin": 1378,
+ "end": 1386,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "ADD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "AND"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SUB"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 768,
+ "end": 778,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "LT"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "PUSH [tag]",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1505,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1513,
+ "end": 1523,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SUB"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1578,
+ "end": 1581,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1571,
+ "end": 1576,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 1583,
+ "end": 1589,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "ADD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SUB"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1611,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "POP"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1653,
+ "end": 1658,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "POP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 924,
+ "end": 926,
+ "name": "PUSH",
+ "value": "12"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "AND"
+ },
+ {
+ "begin": 1035,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "POP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "5A52580000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 276,
+ "end": 286,
+ "name": "CALLER"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "AND"
+ },
+ {
+ "begin": 178,
+ "end": 182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SHA3"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP3"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "LT"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP4"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "AND"
+ },
+ {
+ "begin": 327,
+ "end": 335,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SHA3"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP3"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "ADD"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "LT"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 365,
+ "end": 375,
+ "name": "CALLER"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "AND"
+ },
+ {
+ "begin": 356,
+ "end": 364,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP4"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "SHA3"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP9"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SUB"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "AND"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP5"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SHA3"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "ADD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP7"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SUB"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "ADD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 491,
+ "end": 495,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 521,
+ "end": 526,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "AND"
+ },
+ {
+ "begin": 1351,
+ "end": 1355,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1381,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "AND"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "methodIdentifiers": {
+ "allowance(address,address)": "dd62ed3e",
+ "approve(address,uint256)": "095ea7b3",
+ "balanceOf(address)": "70a08231",
+ "decimals()": "313ce567",
+ "name()": "06fdde03",
+ "symbol()": "95d89b41",
+ "totalSupply()": "18160ddd",
+ "transfer(address,uint256)": "a9059cbb",
+ "transferFrom(address,address,uint256)": "23b872dd"
+ }
+ },
+ "metadata": "{\"compiler\":{\"version\":\"0.4.11+commit.68ef5810\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"transferFrom(address,address,uint256)\":{\"details\":\"ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\",\"params\":{\"_from\":\"Address to transfer from.\",\"_to\":\"Address to transfer to.\",\"_value\":\"Amount to transfer.\"},\"return\":\"Success of transfer.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":\"ZRXToken\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"1.0.0/ERC20Token/ERC20Token_v1.sol\":{\"keccak256\":\"0x3d710b436c430d6fe49f64b091555405360d76da6454b93faa8e213eea34a96d\",\"urls\":[\"bzzr://d12710a563415ad98ff28ecb3aab0b68467b3d023e7c130c73ed9918ef86158e\"]},\"1.0.0/Token/Token_v1.sol\":{\"keccak256\":\"0x35a82bc7bc0994caa97f8ea44660b9b5e796acfe72705b5ff7ed8f2a3c47ff37\",\"urls\":[\"bzzr://a62ae857a4cf2e8948e36d02470c612ac1a5ac20ebe1c1b553ad1ed8becb634e\"]},\"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":{\"keccak256\":\"0x2e1f4b899081cedd8940a9cd0f0f7413264c883312ed0ba9c53885766fe0a1a5\",\"urls\":[\"bzzr://47c42a58e56ffe81e49c8aabd3c391f5fa807fea299b3a2178501e3669baeb52\"]},\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":{\"keccak256\":\"0x9eeb623d48909b083c77688b13b610811c53e37622b3fcbaa23c01873230f5d6\",\"urls\":[\"bzzr://84f3b5c2653068092771d443281018ff2ee0543817426d0fb6f9037a3570e37f\"]}},\"version\":1}",
+ "userdoc": {
+ "methods": {}
+ }
+ },
+ "sources": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": {
+ "id": 0,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 126,
+ "name": "PragmaDirective",
+ "src": "0:24:0"
+ },
+ {
+ "attributes": {
+ "file": "../Token/Token_v1.sol"
+ },
+ "id": 128,
+ "name": "ImportDirective",
+ "src": "26:58:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 322,
+ 397
+ ],
+ "name": "ERC20Token_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "Token"
+ },
+ "id": 129,
+ "name": "UserDefinedTypeName",
+ "src": "112:5:0"
+ }
+ ],
+ "id": 130,
+ "name": "InheritanceSpecifier",
+ "src": "112:5:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 131,
+ "name": "ElementaryTypeName",
+ "src": "143:7:0"
+ }
+ ],
+ "id": 132,
+ "name": "VariableDeclaration",
+ "src": "143:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 133,
+ "name": "ElementaryTypeName",
+ "src": "156:4:0"
+ }
+ ],
+ "id": 134,
+ "name": "VariableDeclaration",
+ "src": "156:11:0"
+ }
+ ],
+ "id": 135,
+ "name": "ParameterList",
+ "src": "142:26:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 136,
+ "name": "ElementaryTypeName",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 137,
+ "name": "VariableDeclaration",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 138,
+ "name": "ParameterList",
+ "src": "177:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 139,
+ "name": "Identifier",
+ "src": "267:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 140,
+ "name": "Identifier",
+ "src": "276:3:0"
+ }
+ ],
+ "id": 141,
+ "name": "MemberAccess",
+ "src": "276:10:0"
+ }
+ ],
+ "id": 142,
+ "name": "IndexAccess",
+ "src": "267:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 143,
+ "name": "Identifier",
+ "src": "291:6:0"
+ }
+ ],
+ "id": 144,
+ "name": "BinaryOperation",
+ "src": "267:30:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "301:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "310:3:0"
+ }
+ ],
+ "id": 147,
+ "name": "IndexAccess",
+ "src": "301:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 148,
+ "name": "Identifier",
+ "src": "317:6:0"
+ }
+ ],
+ "id": 149,
+ "name": "BinaryOperation",
+ "src": "301:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 150,
+ "name": "Identifier",
+ "src": "327:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 151,
+ "name": "Identifier",
+ "src": "336:3:0"
+ }
+ ],
+ "id": 152,
+ "name": "IndexAccess",
+ "src": "327:13:0"
+ }
+ ],
+ "id": 153,
+ "name": "BinaryOperation",
+ "src": "301:39:0"
+ }
+ ],
+ "id": 154,
+ "name": "BinaryOperation",
+ "src": "267:73:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "356:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "365:3:0"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "365:10:0"
+ }
+ ],
+ "id": 158,
+ "name": "IndexAccess",
+ "src": "356:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "380:6:0"
+ }
+ ],
+ "id": 160,
+ "name": "Assignment",
+ "src": "356:30:0"
+ }
+ ],
+ "id": 161,
+ "name": "ExpressionStatement",
+ "src": "356:30:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 162,
+ "name": "Identifier",
+ "src": "400:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 163,
+ "name": "Identifier",
+ "src": "409:3:0"
+ }
+ ],
+ "id": 164,
+ "name": "IndexAccess",
+ "src": "400:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 165,
+ "name": "Identifier",
+ "src": "417:6:0"
+ }
+ ],
+ "id": 166,
+ "name": "Assignment",
+ "src": "400:23:0"
+ }
+ ],
+ "id": 167,
+ "name": "ExpressionStatement",
+ "src": "400:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 168,
+ "name": "Identifier",
+ "src": "437:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 169,
+ "name": "Identifier",
+ "src": "446:3:0"
+ }
+ ],
+ "id": 170,
+ "name": "MemberAccess",
+ "src": "446:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 171,
+ "name": "Identifier",
+ "src": "458:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 172,
+ "name": "Identifier",
+ "src": "463:6:0"
+ }
+ ],
+ "id": 173,
+ "name": "FunctionCall",
+ "src": "437:33:0"
+ }
+ ],
+ "id": 174,
+ "name": "ExpressionStatement",
+ "src": "437:33:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 175,
+ "name": "Literal",
+ "src": "491:4:0"
+ }
+ ],
+ "id": 176,
+ "name": "Return",
+ "src": "484:11:0"
+ }
+ ],
+ "id": 177,
+ "name": "Block",
+ "src": "342:164:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 178,
+ "name": "Literal",
+ "src": "521:5:0"
+ }
+ ],
+ "id": 179,
+ "name": "Return",
+ "src": "514:12:0"
+ }
+ ],
+ "id": 180,
+ "name": "Block",
+ "src": "512:17:0"
+ }
+ ],
+ "id": 181,
+ "name": "IfStatement",
+ "src": "263:266:0"
+ }
+ ],
+ "id": 182,
+ "name": "Block",
+ "src": "184:351:0"
+ }
+ ],
+ "id": 183,
+ "name": "FunctionDefinition",
+ "src": "125:410:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 184,
+ "name": "ElementaryTypeName",
+ "src": "563:7:0"
+ }
+ ],
+ "id": 185,
+ "name": "VariableDeclaration",
+ "src": "563:13:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 186,
+ "name": "ElementaryTypeName",
+ "src": "578:7:0"
+ }
+ ],
+ "id": 187,
+ "name": "VariableDeclaration",
+ "src": "578:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 188,
+ "name": "ElementaryTypeName",
+ "src": "591:4:0"
+ }
+ ],
+ "id": 189,
+ "name": "VariableDeclaration",
+ "src": "591:11:0"
+ }
+ ],
+ "id": 190,
+ "name": "ParameterList",
+ "src": "562:41:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 191,
+ "name": "ElementaryTypeName",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 192,
+ "name": "VariableDeclaration",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 193,
+ "name": "ParameterList",
+ "src": "612:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 194,
+ "name": "Identifier",
+ "src": "633:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 195,
+ "name": "Identifier",
+ "src": "642:5:0"
+ }
+ ],
+ "id": 196,
+ "name": "IndexAccess",
+ "src": "633:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 197,
+ "name": "Identifier",
+ "src": "652:6:0"
+ }
+ ],
+ "id": 198,
+ "name": "BinaryOperation",
+ "src": "633:25:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 199,
+ "name": "Identifier",
+ "src": "662:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 200,
+ "name": "Identifier",
+ "src": "670:5:0"
+ }
+ ],
+ "id": 201,
+ "name": "IndexAccess",
+ "src": "662:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 202,
+ "name": "Identifier",
+ "src": "677:3:0"
+ }
+ ],
+ "id": 203,
+ "name": "MemberAccess",
+ "src": "677:10:0"
+ }
+ ],
+ "id": 204,
+ "name": "IndexAccess",
+ "src": "662:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 205,
+ "name": "Identifier",
+ "src": "692:6:0"
+ }
+ ],
+ "id": 206,
+ "name": "BinaryOperation",
+ "src": "662:36:0"
+ }
+ ],
+ "id": 207,
+ "name": "BinaryOperation",
+ "src": "633:65:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 208,
+ "name": "Identifier",
+ "src": "702:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "711:3:0"
+ }
+ ],
+ "id": 210,
+ "name": "IndexAccess",
+ "src": "702:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 211,
+ "name": "Identifier",
+ "src": "718:6:0"
+ }
+ ],
+ "id": 212,
+ "name": "BinaryOperation",
+ "src": "702:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 213,
+ "name": "Identifier",
+ "src": "728:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 214,
+ "name": "Identifier",
+ "src": "737:3:0"
+ }
+ ],
+ "id": 215,
+ "name": "IndexAccess",
+ "src": "728:13:0"
+ }
+ ],
+ "id": 216,
+ "name": "BinaryOperation",
+ "src": "702:39:0"
+ }
+ ],
+ "id": 217,
+ "name": "BinaryOperation",
+ "src": "633:108:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 218,
+ "name": "Identifier",
+ "src": "757:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 219,
+ "name": "Identifier",
+ "src": "766:3:0"
+ }
+ ],
+ "id": 220,
+ "name": "IndexAccess",
+ "src": "757:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 221,
+ "name": "Identifier",
+ "src": "774:6:0"
+ }
+ ],
+ "id": 222,
+ "name": "Assignment",
+ "src": "757:23:0"
+ }
+ ],
+ "id": 223,
+ "name": "ExpressionStatement",
+ "src": "757:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 224,
+ "name": "Identifier",
+ "src": "794:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 225,
+ "name": "Identifier",
+ "src": "803:5:0"
+ }
+ ],
+ "id": 226,
+ "name": "IndexAccess",
+ "src": "794:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "813:6:0"
+ }
+ ],
+ "id": 228,
+ "name": "Assignment",
+ "src": "794:25:0"
+ }
+ ],
+ "id": 229,
+ "name": "ExpressionStatement",
+ "src": "794:25:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 230,
+ "name": "Identifier",
+ "src": "833:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 231,
+ "name": "Identifier",
+ "src": "841:5:0"
+ }
+ ],
+ "id": 234,
+ "name": "IndexAccess",
+ "src": "833:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 232,
+ "name": "Identifier",
+ "src": "848:3:0"
+ }
+ ],
+ "id": 233,
+ "name": "MemberAccess",
+ "src": "848:10:0"
+ }
+ ],
+ "id": 235,
+ "name": "IndexAccess",
+ "src": "833:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 236,
+ "name": "Identifier",
+ "src": "863:6:0"
+ }
+ ],
+ "id": 237,
+ "name": "Assignment",
+ "src": "833:36:0"
+ }
+ ],
+ "id": 238,
+ "name": "ExpressionStatement",
+ "src": "833:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 239,
+ "name": "Identifier",
+ "src": "883:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "892:5:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 241,
+ "name": "Identifier",
+ "src": "899:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 242,
+ "name": "Identifier",
+ "src": "904:6:0"
+ }
+ ],
+ "id": 243,
+ "name": "FunctionCall",
+ "src": "883:28:0"
+ }
+ ],
+ "id": 244,
+ "name": "ExpressionStatement",
+ "src": "883:28:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 245,
+ "name": "Literal",
+ "src": "932:4:0"
+ }
+ ],
+ "id": 246,
+ "name": "Return",
+ "src": "925:11:0"
+ }
+ ],
+ "id": 247,
+ "name": "Block",
+ "src": "743:204:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 248,
+ "name": "Literal",
+ "src": "962:5:0"
+ }
+ ],
+ "id": 249,
+ "name": "Return",
+ "src": "955:12:0"
+ }
+ ],
+ "id": 250,
+ "name": "Block",
+ "src": "953:17:0"
+ }
+ ],
+ "id": 251,
+ "name": "IfStatement",
+ "src": "629:341:0"
+ }
+ ],
+ "id": 252,
+ "name": "Block",
+ "src": "619:357:0"
+ }
+ ],
+ "id": 253,
+ "name": "FunctionDefinition",
+ "src": "541:435:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 254,
+ "name": "ElementaryTypeName",
+ "src": "1001:7:0"
+ }
+ ],
+ "id": 255,
+ "name": "VariableDeclaration",
+ "src": "1001:14:0"
+ }
+ ],
+ "id": 256,
+ "name": "ParameterList",
+ "src": "1000:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 257,
+ "name": "ElementaryTypeName",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 258,
+ "name": "VariableDeclaration",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 259,
+ "name": "ParameterList",
+ "src": "1034:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 260,
+ "name": "Identifier",
+ "src": "1058:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 261,
+ "name": "Identifier",
+ "src": "1067:6:0"
+ }
+ ],
+ "id": 262,
+ "name": "IndexAccess",
+ "src": "1058:16:0"
+ }
+ ],
+ "id": 263,
+ "name": "Return",
+ "src": "1051:23:0"
+ }
+ ],
+ "id": 264,
+ "name": "Block",
+ "src": "1041:40:0"
+ }
+ ],
+ "id": 265,
+ "name": "FunctionDefinition",
+ "src": "982:99:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 266,
+ "name": "ElementaryTypeName",
+ "src": "1104:7:0"
+ }
+ ],
+ "id": 267,
+ "name": "VariableDeclaration",
+ "src": "1104:16:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 268,
+ "name": "ElementaryTypeName",
+ "src": "1122:4:0"
+ }
+ ],
+ "id": 269,
+ "name": "VariableDeclaration",
+ "src": "1122:11:0"
+ }
+ ],
+ "id": 270,
+ "name": "ParameterList",
+ "src": "1103:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 271,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 272,
+ "name": "VariableDeclaration",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 273,
+ "name": "ParameterList",
+ "src": "1143:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 274,
+ "name": "Identifier",
+ "src": "1160:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 275,
+ "name": "Identifier",
+ "src": "1168:3:0"
+ }
+ ],
+ "id": 276,
+ "name": "MemberAccess",
+ "src": "1168:10:0"
+ }
+ ],
+ "id": 278,
+ "name": "IndexAccess",
+ "src": "1160:19:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 277,
+ "name": "Identifier",
+ "src": "1180:8:0"
+ }
+ ],
+ "id": 279,
+ "name": "IndexAccess",
+ "src": "1160:29:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 280,
+ "name": "Identifier",
+ "src": "1192:6:0"
+ }
+ ],
+ "id": 281,
+ "name": "Assignment",
+ "src": "1160:38:0"
+ }
+ ],
+ "id": 282,
+ "name": "ExpressionStatement",
+ "src": "1160:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Approval"
+ },
+ "id": 283,
+ "name": "Identifier",
+ "src": "1208:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 284,
+ "name": "Identifier",
+ "src": "1217:3:0"
+ }
+ ],
+ "id": 285,
+ "name": "MemberAccess",
+ "src": "1217:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 286,
+ "name": "Identifier",
+ "src": "1229:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 287,
+ "name": "Identifier",
+ "src": "1239:6:0"
+ }
+ ],
+ "id": 288,
+ "name": "FunctionCall",
+ "src": "1208:38:0"
+ }
+ ],
+ "id": 289,
+ "name": "ExpressionStatement",
+ "src": "1208:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 290,
+ "name": "Literal",
+ "src": "1263:4:0"
+ }
+ ],
+ "id": 291,
+ "name": "Return",
+ "src": "1256:11:0"
+ }
+ ],
+ "id": 292,
+ "name": "Block",
+ "src": "1150:124:0"
+ }
+ ],
+ "id": 293,
+ "name": "FunctionDefinition",
+ "src": "1087:187:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 294,
+ "name": "ElementaryTypeName",
+ "src": "1299:7:0"
+ }
+ ],
+ "id": 295,
+ "name": "VariableDeclaration",
+ "src": "1299:14:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 296,
+ "name": "ElementaryTypeName",
+ "src": "1315:7:0"
+ }
+ ],
+ "id": 297,
+ "name": "VariableDeclaration",
+ "src": "1315:16:0"
+ }
+ ],
+ "id": 298,
+ "name": "ParameterList",
+ "src": "1298:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 299,
+ "name": "ElementaryTypeName",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 300,
+ "name": "VariableDeclaration",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 301,
+ "name": "ParameterList",
+ "src": "1350:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 302,
+ "name": "Identifier",
+ "src": "1374:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 303,
+ "name": "Identifier",
+ "src": "1382:6:0"
+ }
+ ],
+ "id": 304,
+ "name": "IndexAccess",
+ "src": "1374:15:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 305,
+ "name": "Identifier",
+ "src": "1390:8:0"
+ }
+ ],
+ "id": 306,
+ "name": "IndexAccess",
+ "src": "1374:25:0"
+ }
+ ],
+ "id": 307,
+ "name": "Return",
+ "src": "1367:32:0"
+ }
+ ],
+ "id": 308,
+ "name": "Block",
+ "src": "1357:49:0"
+ }
+ ],
+ "id": 309,
+ "name": "FunctionDefinition",
+ "src": "1280:126:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balances",
+ "storageLocation": "default",
+ "type": "mapping(address => uint256)",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 310,
+ "name": "ElementaryTypeName",
+ "src": "1421:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 311,
+ "name": "ElementaryTypeName",
+ "src": "1432:4:0"
+ }
+ ],
+ "id": 312,
+ "name": "Mapping",
+ "src": "1412:25:0"
+ }
+ ],
+ "id": 313,
+ "name": "VariableDeclaration",
+ "src": "1412:34:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowed",
+ "storageLocation": "default",
+ "type": "mapping(address => mapping(address => uint256))",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 314,
+ "name": "ElementaryTypeName",
+ "src": "1461:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 315,
+ "name": "ElementaryTypeName",
+ "src": "1481:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 316,
+ "name": "ElementaryTypeName",
+ "src": "1492:4:0"
+ }
+ ],
+ "id": 317,
+ "name": "Mapping",
+ "src": "1472:25:0"
+ }
+ ],
+ "id": 318,
+ "name": "Mapping",
+ "src": "1452:46:0"
+ }
+ ],
+ "id": 319,
+ "name": "VariableDeclaration",
+ "src": "1452:54:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 320,
+ "name": "ElementaryTypeName",
+ "src": "1512:4:0"
+ }
+ ],
+ "id": 321,
+ "name": "VariableDeclaration",
+ "src": "1512:23:0"
+ }
+ ],
+ "id": 322,
+ "name": "ContractDefinition",
+ "src": "86:1452:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/Token/Token_v1.sol": {
+ "id": 1,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 324,
+ "name": "PragmaDirective",
+ "src": "0:24:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 397
+ ],
+ "name": "Token_v1"
+ },
+ "children": [
+ {
+ "attributes": {
+ "constant": true,
+ "name": "totalSupply",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 325,
+ "name": "ParameterList",
+ "src": "110:2:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "supply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 326,
+ "name": "ElementaryTypeName",
+ "src": "131:4:1"
+ }
+ ],
+ "id": 327,
+ "name": "VariableDeclaration",
+ "src": "131:11:1"
+ }
+ ],
+ "id": 328,
+ "name": "ParameterList",
+ "src": "130:13:1"
+ },
+ {
+ "children": [],
+ "id": 329,
+ "name": "Block",
+ "src": "144:2:1"
+ }
+ ],
+ "id": 330,
+ "name": "FunctionDefinition",
+ "src": "90:56:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 331,
+ "name": "ElementaryTypeName",
+ "src": "274:7:1"
+ }
+ ],
+ "id": 332,
+ "name": "VariableDeclaration",
+ "src": "274:14:1"
+ }
+ ],
+ "id": 333,
+ "name": "ParameterList",
+ "src": "273:16:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 334,
+ "name": "ElementaryTypeName",
+ "src": "308:4:1"
+ }
+ ],
+ "id": 335,
+ "name": "VariableDeclaration",
+ "src": "308:12:1"
+ }
+ ],
+ "id": 336,
+ "name": "ParameterList",
+ "src": "307:14:1"
+ },
+ {
+ "children": [],
+ "id": 337,
+ "name": "Block",
+ "src": "322:2:1"
+ }
+ ],
+ "id": 338,
+ "name": "FunctionDefinition",
+ "src": "255:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 339,
+ "name": "ElementaryTypeName",
+ "src": "578:7:1"
+ }
+ ],
+ "id": 340,
+ "name": "VariableDeclaration",
+ "src": "578:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 341,
+ "name": "ElementaryTypeName",
+ "src": "591:4:1"
+ }
+ ],
+ "id": 342,
+ "name": "VariableDeclaration",
+ "src": "591:11:1"
+ }
+ ],
+ "id": 343,
+ "name": "ParameterList",
+ "src": "577:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 344,
+ "name": "ElementaryTypeName",
+ "src": "613:4:1"
+ }
+ ],
+ "id": 345,
+ "name": "VariableDeclaration",
+ "src": "613:12:1"
+ }
+ ],
+ "id": 346,
+ "name": "ParameterList",
+ "src": "612:14:1"
+ },
+ {
+ "children": [],
+ "id": 347,
+ "name": "Block",
+ "src": "627:2:1"
+ }
+ ],
+ "id": 348,
+ "name": "FunctionDefinition",
+ "src": "560:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 349,
+ "name": "ElementaryTypeName",
+ "src": "972:7:1"
+ }
+ ],
+ "id": 350,
+ "name": "VariableDeclaration",
+ "src": "972:13:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 351,
+ "name": "ElementaryTypeName",
+ "src": "987:7:1"
+ }
+ ],
+ "id": 352,
+ "name": "VariableDeclaration",
+ "src": "987:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 353,
+ "name": "ElementaryTypeName",
+ "src": "1000:4:1"
+ }
+ ],
+ "id": 354,
+ "name": "VariableDeclaration",
+ "src": "1000:11:1"
+ }
+ ],
+ "id": 355,
+ "name": "ParameterList",
+ "src": "971:41:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 356,
+ "name": "ElementaryTypeName",
+ "src": "1022:4:1"
+ }
+ ],
+ "id": 357,
+ "name": "VariableDeclaration",
+ "src": "1022:12:1"
+ }
+ ],
+ "id": 358,
+ "name": "ParameterList",
+ "src": "1021:14:1"
+ },
+ {
+ "children": [],
+ "id": 359,
+ "name": "Block",
+ "src": "1036:2:1"
+ }
+ ],
+ "id": 360,
+ "name": "FunctionDefinition",
+ "src": "950:88:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 361,
+ "name": "ElementaryTypeName",
+ "src": "1338:7:1"
+ }
+ ],
+ "id": 362,
+ "name": "VariableDeclaration",
+ "src": "1338:16:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 363,
+ "name": "ElementaryTypeName",
+ "src": "1356:4:1"
+ }
+ ],
+ "id": 364,
+ "name": "VariableDeclaration",
+ "src": "1356:11:1"
+ }
+ ],
+ "id": 365,
+ "name": "ParameterList",
+ "src": "1337:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 366,
+ "name": "ElementaryTypeName",
+ "src": "1378:4:1"
+ }
+ ],
+ "id": 367,
+ "name": "VariableDeclaration",
+ "src": "1378:12:1"
+ }
+ ],
+ "id": 368,
+ "name": "ParameterList",
+ "src": "1377:14:1"
+ },
+ {
+ "children": [],
+ "id": 369,
+ "name": "Block",
+ "src": "1392:2:1"
+ }
+ ],
+ "id": 370,
+ "name": "FunctionDefinition",
+ "src": "1321:73:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 371,
+ "name": "ElementaryTypeName",
+ "src": "1621:7:1"
+ }
+ ],
+ "id": 372,
+ "name": "VariableDeclaration",
+ "src": "1621:14:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 373,
+ "name": "ElementaryTypeName",
+ "src": "1637:7:1"
+ }
+ ],
+ "id": 374,
+ "name": "VariableDeclaration",
+ "src": "1637:16:1"
+ }
+ ],
+ "id": 375,
+ "name": "ParameterList",
+ "src": "1620:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "remaining",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 376,
+ "name": "ElementaryTypeName",
+ "src": "1673:4:1"
+ }
+ ],
+ "id": 377,
+ "name": "VariableDeclaration",
+ "src": "1673:14:1"
+ }
+ ],
+ "id": 378,
+ "name": "ParameterList",
+ "src": "1672:16:1"
+ },
+ {
+ "children": [],
+ "id": 379,
+ "name": "Block",
+ "src": "1689:2:1"
+ }
+ ],
+ "id": 380,
+ "name": "FunctionDefinition",
+ "src": "1602:89:1"
+ },
+ {
+ "attributes": {
+ "name": "Transfer"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 381,
+ "name": "ElementaryTypeName",
+ "src": "1712:7:1"
+ }
+ ],
+ "id": 382,
+ "name": "VariableDeclaration",
+ "src": "1712:21:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 383,
+ "name": "ElementaryTypeName",
+ "src": "1735:7:1"
+ }
+ ],
+ "id": 384,
+ "name": "VariableDeclaration",
+ "src": "1735:19:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 385,
+ "name": "ElementaryTypeName",
+ "src": "1756:4:1"
+ }
+ ],
+ "id": 386,
+ "name": "VariableDeclaration",
+ "src": "1756:11:1"
+ }
+ ],
+ "id": 387,
+ "name": "ParameterList",
+ "src": "1711:57:1"
+ }
+ ],
+ "id": 388,
+ "name": "EventDefinition",
+ "src": "1697:72:1"
+ },
+ {
+ "attributes": {
+ "name": "Approval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 389,
+ "name": "ElementaryTypeName",
+ "src": "1789:7:1"
+ }
+ ],
+ "id": 390,
+ "name": "VariableDeclaration",
+ "src": "1789:22:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 391,
+ "name": "ElementaryTypeName",
+ "src": "1813:7:1"
+ }
+ ],
+ "id": 392,
+ "name": "VariableDeclaration",
+ "src": "1813:24:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 393,
+ "name": "ElementaryTypeName",
+ "src": "1839:4:1"
+ }
+ ],
+ "id": 394,
+ "name": "VariableDeclaration",
+ "src": "1839:11:1"
+ }
+ ],
+ "id": 395,
+ "name": "ParameterList",
+ "src": "1788:63:1"
+ }
+ ],
+ "id": 396,
+ "name": "EventDefinition",
+ "src": "1774:78:1"
+ }
+ ],
+ "id": 397,
+ "name": "ContractDefinition",
+ "src": "26:1828:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol": {
+ "id": 2,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 33,
+ "name": "PragmaDirective",
+ "src": "580:24:2"
+ },
+ {
+ "attributes": {
+ "file": "../ERC20Token/ERC20Token_v1.sol"
+ },
+ "id": 35,
+ "name": "ImportDirective",
+ "src": "606:78:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 124,
+ 322,
+ 397
+ ],
+ "name": "UnlimitedAllowanceToken_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ERC20Token"
+ },
+ "id": 36,
+ "name": "UserDefinedTypeName",
+ "src": "725:10:2"
+ }
+ ],
+ "id": 37,
+ "name": "InheritanceSpecifier",
+ "src": "725:10:2"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "MAX_UINT",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 38,
+ "name": "ElementaryTypeName",
+ "src": "743:4:2"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "32",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 2",
+ "value": "2"
+ },
+ "id": 39,
+ "name": "Literal",
+ "src": "768:1:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "323536",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 256",
+ "value": "256"
+ },
+ "id": 40,
+ "name": "Literal",
+ "src": "771:3:2"
+ }
+ ],
+ "id": 41,
+ "name": "BinaryOperation",
+ "src": "768:6:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 42,
+ "name": "Literal",
+ "src": "777:1:2"
+ }
+ ],
+ "id": 43,
+ "name": "BinaryOperation",
+ "src": "768:10:2"
+ }
+ ],
+ "id": 44,
+ "name": "VariableDeclaration",
+ "src": "743:35:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 45,
+ "name": "ElementaryTypeName",
+ "src": "1088:7:2"
+ }
+ ],
+ "id": 46,
+ "name": "VariableDeclaration",
+ "src": "1088:13:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 47,
+ "name": "ElementaryTypeName",
+ "src": "1103:7:2"
+ }
+ ],
+ "id": 48,
+ "name": "VariableDeclaration",
+ "src": "1103:11:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 49,
+ "name": "ElementaryTypeName",
+ "src": "1116:4:2"
+ }
+ ],
+ "id": 50,
+ "name": "VariableDeclaration",
+ "src": "1116:11:2"
+ }
+ ],
+ "id": 51,
+ "name": "ParameterList",
+ "src": "1087:41:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 52,
+ "name": "ElementaryTypeName",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 53,
+ "name": "VariableDeclaration",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 54,
+ "name": "ParameterList",
+ "src": "1160:6:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 55,
+ "name": "ElementaryTypeName",
+ "src": "1181:4:2"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "1181:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 57,
+ "name": "Identifier",
+ "src": "1198:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 58,
+ "name": "Identifier",
+ "src": "1206:5:2"
+ }
+ ],
+ "id": 59,
+ "name": "IndexAccess",
+ "src": "1198:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 60,
+ "name": "Identifier",
+ "src": "1213:3:2"
+ }
+ ],
+ "id": 61,
+ "name": "MemberAccess",
+ "src": "1213:10:2"
+ }
+ ],
+ "id": 62,
+ "name": "IndexAccess",
+ "src": "1198:26:2"
+ }
+ ],
+ "id": 63,
+ "name": "VariableDeclarationStatement",
+ "src": "1181:43:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "1238:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 65,
+ "name": "Identifier",
+ "src": "1247:5:2"
+ }
+ ],
+ "id": 66,
+ "name": "IndexAccess",
+ "src": "1238:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 67,
+ "name": "Identifier",
+ "src": "1257:6:2"
+ }
+ ],
+ "id": 68,
+ "name": "BinaryOperation",
+ "src": "1238:25:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 69,
+ "name": "Identifier",
+ "src": "1279:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 70,
+ "name": "Identifier",
+ "src": "1292:6:2"
+ }
+ ],
+ "id": 71,
+ "name": "BinaryOperation",
+ "src": "1279:19:2"
+ }
+ ],
+ "id": 72,
+ "name": "BinaryOperation",
+ "src": "1238:60:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 73,
+ "name": "Identifier",
+ "src": "1314:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 74,
+ "name": "Identifier",
+ "src": "1323:3:2"
+ }
+ ],
+ "id": 75,
+ "name": "IndexAccess",
+ "src": "1314:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "1330:6:2"
+ }
+ ],
+ "id": 77,
+ "name": "BinaryOperation",
+ "src": "1314:22:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 78,
+ "name": "Identifier",
+ "src": "1340:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 79,
+ "name": "Identifier",
+ "src": "1349:3:2"
+ }
+ ],
+ "id": 80,
+ "name": "IndexAccess",
+ "src": "1340:13:2"
+ }
+ ],
+ "id": 81,
+ "name": "BinaryOperation",
+ "src": "1314:39:2"
+ }
+ ],
+ "id": 82,
+ "name": "BinaryOperation",
+ "src": "1238:115:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 83,
+ "name": "Identifier",
+ "src": "1378:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 84,
+ "name": "Identifier",
+ "src": "1387:3:2"
+ }
+ ],
+ "id": 85,
+ "name": "IndexAccess",
+ "src": "1378:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 86,
+ "name": "Identifier",
+ "src": "1395:6:2"
+ }
+ ],
+ "id": 87,
+ "name": "Assignment",
+ "src": "1378:23:2"
+ }
+ ],
+ "id": 88,
+ "name": "ExpressionStatement",
+ "src": "1378:23:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 89,
+ "name": "Identifier",
+ "src": "1415:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1424:5:2"
+ }
+ ],
+ "id": 91,
+ "name": "IndexAccess",
+ "src": "1415:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 92,
+ "name": "Identifier",
+ "src": "1434:6:2"
+ }
+ ],
+ "id": 93,
+ "name": "Assignment",
+ "src": "1415:25:2"
+ }
+ ],
+ "id": 94,
+ "name": "ExpressionStatement",
+ "src": "1415:25:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 95,
+ "name": "Identifier",
+ "src": "1458:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_UINT"
+ },
+ "id": 96,
+ "name": "Identifier",
+ "src": "1470:8:2"
+ }
+ ],
+ "id": 97,
+ "name": "BinaryOperation",
+ "src": "1458:20:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 98,
+ "name": "Identifier",
+ "src": "1498:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 99,
+ "name": "Identifier",
+ "src": "1506:5:2"
+ }
+ ],
+ "id": 102,
+ "name": "IndexAccess",
+ "src": "1498:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1513:3:2"
+ }
+ ],
+ "id": 101,
+ "name": "MemberAccess",
+ "src": "1513:10:2"
+ }
+ ],
+ "id": 103,
+ "name": "IndexAccess",
+ "src": "1498:26:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 104,
+ "name": "Identifier",
+ "src": "1528:6:2"
+ }
+ ],
+ "id": 105,
+ "name": "Assignment",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 106,
+ "name": "ExpressionStatement",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 107,
+ "name": "Block",
+ "src": "1480:69:2"
+ }
+ ],
+ "id": 108,
+ "name": "IfStatement",
+ "src": "1454:95:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 109,
+ "name": "Identifier",
+ "src": "1562:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 110,
+ "name": "Identifier",
+ "src": "1571:5:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "1578:3:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 112,
+ "name": "Identifier",
+ "src": "1583:6:2"
+ }
+ ],
+ "id": 113,
+ "name": "FunctionCall",
+ "src": "1562:28:2"
+ }
+ ],
+ "id": 114,
+ "name": "ExpressionStatement",
+ "src": "1562:28:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 115,
+ "name": "Literal",
+ "src": "1611:4:2"
+ }
+ ],
+ "id": 116,
+ "name": "Return",
+ "src": "1604:11:2"
+ }
+ ],
+ "id": 117,
+ "name": "Block",
+ "src": "1364:262:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 118,
+ "name": "Literal",
+ "src": "1653:5:2"
+ }
+ ],
+ "id": 119,
+ "name": "Return",
+ "src": "1646:12:2"
+ }
+ ],
+ "id": 120,
+ "name": "Block",
+ "src": "1632:37:2"
+ }
+ ],
+ "id": 121,
+ "name": "IfStatement",
+ "src": "1234:435:2"
+ }
+ ],
+ "id": 122,
+ "name": "Block",
+ "src": "1171:504:2"
+ }
+ ],
+ "id": 123,
+ "name": "FunctionDefinition",
+ "src": "1066:609:2"
+ }
+ ],
+ "id": 124,
+ "name": "ContractDefinition",
+ "src": "686:991:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/tokens/ZRXToken/ZRXToken.sol": {
+ "id": 3,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:3"
+ },
+ {
+ "attributes": {
+ "file": "../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol"
+ },
+ "id": 3,
+ "name": "ImportDirective",
+ "src": "650:142:3"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 31,
+ 124,
+ 322,
+ 397
+ ],
+ "name": "ZRXToken"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "UnlimitedAllowanceToken"
+ },
+ "id": 4,
+ "name": "UserDefinedTypeName",
+ "src": "816:23:3"
+ }
+ ],
+ "id": 5,
+ "name": "InheritanceSpecifier",
+ "src": "816:23:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "decimals",
+ "storageLocation": "default",
+ "type": "uint8",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8"
+ },
+ "id": 6,
+ "name": "ElementaryTypeName",
+ "src": "891:5:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3138",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 18",
+ "value": "18"
+ },
+ "id": 7,
+ "name": "Literal",
+ "src": "924:2:3"
+ }
+ ],
+ "id": 8,
+ "name": "VariableDeclaration",
+ "src": "891:35:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 9,
+ "name": "ElementaryTypeName",
+ "src": "932:4:3"
+ },
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 1000000000000000000000000000"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "3130",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 10",
+ "value": "10"
+ },
+ "id": 10,
+ "name": "Literal",
+ "src": "958:2:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3237",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 27",
+ "value": "27"
+ },
+ "id": 11,
+ "name": "Literal",
+ "src": "962:2:3"
+ }
+ ],
+ "id": 12,
+ "name": "BinaryOperation",
+ "src": "958:6:3"
+ }
+ ],
+ "id": 13,
+ "name": "VariableDeclaration",
+ "src": "932:32:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "name",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 14,
+ "name": "ElementaryTypeName",
+ "src": "1009:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30782050726f746f636f6c20546f6b656e",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"0x Protocol Token\"",
+ "value": "0x Protocol Token"
+ },
+ "id": 15,
+ "name": "Literal",
+ "src": "1039:19:3"
+ }
+ ],
+ "id": 16,
+ "name": "VariableDeclaration",
+ "src": "1009:49:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "symbol",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 17,
+ "name": "ElementaryTypeName",
+ "src": "1064:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "5a5258",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"ZRX\"",
+ "value": "ZRX"
+ },
+ "id": 18,
+ "name": "Literal",
+ "src": "1096:5:3"
+ }
+ ],
+ "id": 19,
+ "name": "VariableDeclaration",
+ "src": "1064:37:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "ZRXToken",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 20,
+ "name": "ParameterList",
+ "src": "1167:2:3"
+ },
+ {
+ "children": [],
+ "id": 21,
+ "name": "ParameterList",
+ "src": "1189:0:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 22,
+ "name": "Identifier",
+ "src": "1199:8:3"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 23,
+ "name": "Identifier",
+ "src": "1208:3:3"
+ }
+ ],
+ "id": 24,
+ "name": "MemberAccess",
+ "src": "1208:10:3"
+ }
+ ],
+ "id": 25,
+ "name": "IndexAccess",
+ "src": "1199:20:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "totalSupply"
+ },
+ "id": 26,
+ "name": "Identifier",
+ "src": "1222:11:3"
+ }
+ ],
+ "id": 27,
+ "name": "Assignment",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 28,
+ "name": "ExpressionStatement",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 29,
+ "name": "Block",
+ "src": "1189:51:3"
+ }
+ ],
+ "id": 30,
+ "name": "FunctionDefinition",
+ "src": "1150:90:3"
+ }
+ ],
+ "id": 31,
+ "name": "ContractDefinition",
+ "src": "795:447:3"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": "pragma solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\n\ncontract ERC20Token_v1 is Token {\n\n function transfer(address _to, uint _value) returns (bool) {\n //Default assumes totalSupply can't be over max (2^256 - 1).\n if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n Transfer(msg.sender, _to, _value);\n return true;\n } else { return false; }\n }\n\n function transferFrom(address _from, address _to, uint _value) returns (bool) {\n if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n Transfer(_from, _to, _value);\n return true;\n } else { return false; }\n }\n\n function balanceOf(address _owner) constant returns (uint) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint _value) returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) constant returns (uint) {\n return allowed[_owner][_spender];\n }\n\n mapping (address => uint) balances;\n mapping (address => mapping (address => uint)) allowed;\n uint public totalSupply;\n}\n",
+ "1.0.0/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.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 solidity ^0.4.11;\n\nimport { ERC20Token_v1 as ERC20Token } from \"../ERC20Token/ERC20Token_v1.sol\";\n\ncontract UnlimitedAllowanceToken_v1 is ERC20Token {\n\n uint constant MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint _value)\n public\n returns (bool)\n {\n uint allowance = allowed[_from][msg.sender];\n if (balances[_from] >= _value\n && allowance >= _value\n && balances[_to] + _value >= balances[_to]\n ) {\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n Transfer(_from, _to, _value);\n return true;\n } else {\n return false;\n }\n }\n}\n",
+ "2.0.0/tokens/ZRXToken/ZRXToken.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 solidity 0.4.11;\n\n// solhint-disable-next-line max-line-length\nimport { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from \"../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\";\n\n\ncontract ZRXToken is UnlimitedAllowanceToken {\n\n // solhint-disable const-name-snakecase\n uint8 constant public decimals = 18;\n uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places\n string constant public name = \"0x Protocol Token\";\n string constant public symbol = \"ZRX\";\n // solhint-enableconst-name-snakecase\n\n function ZRXToken()\n public\n {\n balances[msg.sender] = totalSupply;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xbcce67d129fe53ddb9717b4f567b33108c41a4f4324aa47ac609037e41f5b95d",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.11+commit.68ef5810.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts b/packages/0x.js/src/contract_wrappers/contract_wrapper.ts
deleted file mode 100644
index 6c96428ed..000000000
--- a/packages/0x.js/src/contract_wrappers/contract_wrapper.ts
+++ /dev/null
@@ -1,204 +0,0 @@
-import { BlockParamLiteral, ContractAbi, FilterObject, LogEntry, LogWithDecodedArgs, RawLog } from '@0xproject/types';
-import { AbiDecoder, intervalUtils } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import { Block, BlockAndLogStreamer } from 'ethereumjs-blockstream';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import {
- Artifact,
- BlockRange,
- ContractEventArgs,
- ContractEvents,
- EventCallback,
- IndexedFilterValues,
- InternalZeroExError,
- ZeroExError,
-} from '../types';
-import { constants } from '../utils/constants';
-import { filterUtils } from '../utils/filter_utils';
-
-const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {
- [contractName: string]: ZeroExError;
-} = {
- ZRX: ZeroExError.ZRXContractDoesNotExist,
- EtherToken: ZeroExError.EtherTokenContractDoesNotExist,
- Token: ZeroExError.TokenContractDoesNotExist,
- TokenRegistry: ZeroExError.TokenRegistryContractDoesNotExist,
- TokenTransferProxy: ZeroExError.TokenTransferProxyContractDoesNotExist,
- Exchange: ZeroExError.ExchangeContractDoesNotExist,
-};
-
-export class ContractWrapper {
- protected _web3Wrapper: Web3Wrapper;
- protected _networkId: number;
- private _abiDecoder?: AbiDecoder;
- private _blockAndLogStreamerIfExists?: BlockAndLogStreamer;
- private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
- private _filters: { [filterToken: string]: FilterObject };
- private _filterCallbacks: {
- [filterToken: string]: EventCallback<ContractEventArgs>;
- };
- private _onLogAddedSubscriptionToken: string | undefined;
- private _onLogRemovedSubscriptionToken: string | undefined;
- constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder?: AbiDecoder) {
- this._web3Wrapper = web3Wrapper;
- this._networkId = networkId;
- this._abiDecoder = abiDecoder;
- this._filters = {};
- this._filterCallbacks = {};
- this._blockAndLogStreamerIfExists = undefined;
- this._onLogAddedSubscriptionToken = undefined;
- this._onLogRemovedSubscriptionToken = undefined;
- }
- protected _unsubscribeAll(): void {
- const filterTokens = _.keys(this._filterCallbacks);
- _.each(filterTokens, filterToken => {
- this._unsubscribe(filterToken);
- });
- }
- protected _unsubscribe(filterToken: string, err?: Error): void {
- if (_.isUndefined(this._filters[filterToken])) {
- throw new Error(ZeroExError.SubscriptionNotFound);
- }
- if (!_.isUndefined(err)) {
- const callback = this._filterCallbacks[filterToken];
- callback(err, undefined);
- }
- delete this._filters[filterToken];
- delete this._filterCallbacks[filterToken];
- if (_.isEmpty(this._filters)) {
- this._stopBlockAndLogStream();
- }
- }
- protected _subscribe<ArgsType extends ContractEventArgs>(
- address: string,
- eventName: ContractEvents,
- indexFilterValues: IndexedFilterValues,
- abi: ContractAbi,
- callback: EventCallback<ArgsType>,
- ): string {
- const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
- if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
- this._startBlockAndLogStream();
- }
- const filterToken = filterUtils.generateUUID();
- this._filters[filterToken] = filter;
- this._filterCallbacks[filterToken] = callback as EventCallback<ContractEventArgs>;
- return filterToken;
- }
- protected async _getLogsAsync<ArgsType extends ContractEventArgs>(
- address: string,
- eventName: ContractEvents,
- blockRange: BlockRange,
- indexFilterValues: IndexedFilterValues,
- abi: ContractAbi,
- ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
- const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
- const logs = await this._web3Wrapper.getLogsAsync(filter);
- const logsWithDecodedArguments = _.map(logs, this._tryToDecodeLogOrNoop.bind(this));
- return logsWithDecodedArguments;
- }
- protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
- log: LogEntry,
- ): LogWithDecodedArgs<ArgsType> | RawLog {
- if (_.isUndefined(this._abiDecoder)) {
- throw new Error(InternalZeroExError.NoAbiDecoder);
- }
- const logWithDecodedArgs = this._abiDecoder.tryToDecodeLogOrNoop(log);
- return logWithDecodedArgs;
- }
- protected async _getContractAbiAndAddressFromArtifactsAsync(
- artifact: Artifact,
- addressIfExists?: string,
- ): Promise<[ContractAbi, string]> {
- let contractAddress: string;
- if (_.isUndefined(addressIfExists)) {
- if (_.isUndefined(artifact.networks[this._networkId])) {
- throw new Error(ZeroExError.ContractNotDeployedOnNetwork);
- }
- contractAddress = artifact.networks[this._networkId].address.toLowerCase();
- } else {
- contractAddress = addressIfExists;
- }
- const doesContractExist = await this._web3Wrapper.doesContractExistAtAddressAsync(contractAddress);
- if (!doesContractExist) {
- throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contract_name]);
- }
- const abiAndAddress: [ContractAbi, string] = [artifact.abi, contractAddress];
- return abiAndAddress;
- }
- protected _getContractAddress(artifact: Artifact, addressIfExists?: string): string {
- if (_.isUndefined(addressIfExists)) {
- const contractAddress = artifact.networks[this._networkId].address;
- if (_.isUndefined(contractAddress)) {
- throw new Error(ZeroExError.ExchangeContractDoesNotExist);
- }
- return contractAddress;
- } else {
- return addressIfExists;
- }
- }
- private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: LogEntry): void {
- _.forEach(this._filters, (filter: FilterObject, filterToken: string) => {
- if (filterUtils.matchesFilter(log, filter)) {
- const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
- const logEvent = {
- log: decodedLog,
- isRemoved,
- };
- this._filterCallbacks[filterToken](null, logEvent);
- }
- });
- }
- private _startBlockAndLogStream(): void {
- if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
- throw new Error(ZeroExError.SubscriptionAlreadyPresent);
- }
- this._blockAndLogStreamerIfExists = new BlockAndLogStreamer(
- this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper),
- this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper),
- );
- const catchAllLogFilter = {};
- this._blockAndLogStreamerIfExists.addLogFilter(catchAllLogFilter);
- this._blockAndLogStreamIntervalIfExists = intervalUtils.setAsyncExcludingInterval(
- this._reconcileBlockAsync.bind(this),
- constants.DEFAULT_BLOCK_POLLING_INTERVAL,
- this._onReconcileBlockError.bind(this),
- );
- let isRemoved = false;
- this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded(
- this._onLogStateChanged.bind(this, isRemoved),
- );
- isRemoved = true;
- this._onLogRemovedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogRemoved(
- this._onLogStateChanged.bind(this, isRemoved),
- );
- }
- private _onReconcileBlockError(err: Error): void {
- const filterTokens = _.keys(this._filterCallbacks);
- _.each(filterTokens, filterToken => {
- this._unsubscribe(filterToken, err);
- });
- }
- private _setNetworkId(networkId: number): void {
- this._networkId = networkId;
- }
- private _stopBlockAndLogStream(): void {
- if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
- throw new Error(ZeroExError.SubscriptionNotFound);
- }
- this._blockAndLogStreamerIfExists.unsubscribeFromOnLogAdded(this._onLogAddedSubscriptionToken as string);
- this._blockAndLogStreamerIfExists.unsubscribeFromOnLogRemoved(this._onLogRemovedSubscriptionToken as string);
- intervalUtils.clearAsyncExcludingInterval(this._blockAndLogStreamIntervalIfExists as NodeJS.Timer);
- delete this._blockAndLogStreamerIfExists;
- }
- private async _reconcileBlockAsync(): Promise<void> {
- const latestBlock = await this._web3Wrapper.getBlockAsync(BlockParamLiteral.Latest);
- // We need to coerce to Block type cause Web3.Block includes types for mempool blocks
- if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
- // If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
- await this._blockAndLogStreamerIfExists.reconcileNewBlock((latestBlock as any) as Block);
- }
- }
-}
diff --git a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts b/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts
deleted file mode 100644
index 4a4da116b..000000000
--- a/packages/0x.js/src/contract_wrappers/ether_token_wrapper.ts
+++ /dev/null
@@ -1,199 +0,0 @@
-import { schemas } from '@0xproject/json-schemas';
-import { LogWithDecodedArgs } from '@0xproject/types';
-import { AbiDecoder, BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { artifacts } from '../artifacts';
-import { BlockRange, EventCallback, IndexedFilterValues, TransactionOpts, ZeroExError } from '../types';
-import { assert } from '../utils/assert';
-
-import { ContractWrapper } from './contract_wrapper';
-import { EtherTokenContract, EtherTokenContractEventArgs, EtherTokenEvents } from './generated/ether_token';
-import { TokenWrapper } from './token_wrapper';
-
-/**
- * This class includes all the functionality related to interacting with a wrapped Ether ERC20 token contract.
- * The caller can convert ETH into the equivalent number of wrapped ETH ERC20 tokens and back.
- */
-export class EtherTokenWrapper extends ContractWrapper {
- private _etherTokenContractsByAddress: {
- [address: string]: EtherTokenContract;
- } = {};
- private _tokenWrapper: TokenWrapper;
- constructor(web3Wrapper: Web3Wrapper, networkId: number, abiDecoder: AbiDecoder, tokenWrapper: TokenWrapper) {
- super(web3Wrapper, networkId, abiDecoder);
- this._tokenWrapper = tokenWrapper;
- }
- /**
- * Deposit ETH into the Wrapped ETH smart contract and issues the equivalent number of wrapped ETH tokens
- * to the depositor address. These wrapped ETH tokens can be used in 0x trades and are redeemable for 1-to-1
- * for ETH.
- * @param etherTokenAddress EtherToken address you wish to deposit into.
- * @param amountInWei Amount of ETH in Wei the caller wishes to deposit.
- * @param depositor The hex encoded user Ethereum address that would like to make the deposit.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async depositAsync(
- etherTokenAddress: string,
- amountInWei: BigNumber,
- depositor: string,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
- assert.isValidBaseUnitAmount('amountInWei', amountInWei);
- await assert.isSenderAddressAsync('depositor', depositor, this._web3Wrapper);
- const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
- const normalizedDepositorAddress = depositor.toLowerCase();
-
- const ethBalanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(normalizedDepositorAddress);
- assert.assert(ethBalanceInWei.gte(amountInWei), ZeroExError.InsufficientEthBalanceForDeposit);
-
- const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
- const txHash = await wethContract.deposit.sendTransactionAsync({
- from: normalizedDepositorAddress,
- value: amountInWei,
- gas: txOpts.gasLimit,
- gasPrice: txOpts.gasPrice,
- });
- return txHash;
- }
- /**
- * Withdraw ETH to the withdrawer's address from the wrapped ETH smart contract in exchange for the
- * equivalent number of wrapped ETH tokens.
- * @param etherTokenAddress EtherToken address you wish to withdraw from.
- * @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
- * @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawal.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async withdrawAsync(
- etherTokenAddress: string,
- amountInWei: BigNumber,
- withdrawer: string,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isValidBaseUnitAmount('amountInWei', amountInWei);
- assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
- await assert.isSenderAddressAsync('withdrawer', withdrawer, this._web3Wrapper);
- const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
- const normalizedWithdrawerAddress = withdrawer.toLowerCase();
-
- const WETHBalanceInBaseUnits = await this._tokenWrapper.getBalanceAsync(
- normalizedEtherTokenAddress,
- normalizedWithdrawerAddress,
- );
- assert.assert(WETHBalanceInBaseUnits.gte(amountInWei), ZeroExError.InsufficientWEthBalanceForWithdrawal);
-
- const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
- const txHash = await wethContract.withdraw.sendTransactionAsync(amountInWei, {
- from: normalizedWithdrawerAddress,
- gas: txOpts.gasLimit,
- gasPrice: txOpts.gasPrice,
- });
- return txHash;
- }
- /**
- * Gets historical logs without creating a subscription
- * @param etherTokenAddress An address of the ether token that emitted the logs.
- * @param eventName The ether token contract event you would like to subscribe to.
- * @param blockRange Block range to get logs from.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
- * @return Array of logs that match the parameters
- */
- public async getLogsAsync<ArgsType extends EtherTokenContractEventArgs>(
- etherTokenAddress: string,
- eventName: EtherTokenEvents,
- blockRange: BlockRange,
- indexFilterValues: IndexedFilterValues,
- ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
- assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
- const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
- assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
- assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- const logs = await this._getLogsAsync<ArgsType>(
- normalizedEtherTokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- artifacts.EtherTokenArtifact.abi,
- );
- return logs;
- }
- /**
- * Subscribe to an event type emitted by the Token contract.
- * @param etherTokenAddress The hex encoded address where the ether token is deployed.
- * @param eventName The ether token contract event you would like to subscribe to.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
- * @param callback Callback that gets called when a log is added/removed
- * @return Subscription token used later to unsubscribe
- */
- public subscribe<ArgsType extends EtherTokenContractEventArgs>(
- etherTokenAddress: string,
- eventName: EtherTokenEvents,
- indexFilterValues: IndexedFilterValues,
- callback: EventCallback<ArgsType>,
- ): string {
- assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
- const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
- assert.doesBelongToStringEnum('eventName', eventName, EtherTokenEvents);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- assert.isFunction('callback', callback);
- const subscriptionToken = this._subscribe<ArgsType>(
- normalizedEtherTokenAddress,
- eventName,
- indexFilterValues,
- artifacts.EtherTokenArtifact.abi,
- callback,
- );
- return subscriptionToken;
- }
- /**
- * Cancel a subscription
- * @param subscriptionToken Subscription token returned by `subscribe()`
- */
- public unsubscribe(subscriptionToken: string): void {
- this._unsubscribe(subscriptionToken);
- }
- /**
- * Cancels all existing subscriptions
- */
- public unsubscribeAll(): void {
- super._unsubscribeAll();
- }
- /**
- * Retrieves the Ethereum address of the EtherToken contract deployed on the network
- * that the user-passed web3 provider is connected to. If it's not Kovan, Ropsten, Rinkeby, Mainnet or TestRPC
- * (networkId: 50), it will return undefined (e.g a private network).
- * @returns The Ethereum address of the EtherToken contract or undefined.
- */
- public getContractAddressIfExists(): string | undefined {
- const networkSpecificArtifact = artifacts.EtherTokenArtifact.networks[this._networkId];
- const contractAddressIfExists = _.isUndefined(networkSpecificArtifact)
- ? undefined
- : networkSpecificArtifact.address;
- return contractAddressIfExists;
- }
- private _invalidateContractInstance(): void {
- this.unsubscribeAll();
- this._etherTokenContractsByAddress = {};
- }
- private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise<EtherTokenContract> {
- let etherTokenContract = this._etherTokenContractsByAddress[etherTokenAddress];
- if (!_.isUndefined(etherTokenContract)) {
- return etherTokenContract;
- }
- const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
- artifacts.EtherTokenArtifact,
- etherTokenAddress,
- );
- const contractInstance = new EtherTokenContract(this._web3Wrapper, abi, address);
- etherTokenContract = contractInstance;
- this._etherTokenContractsByAddress[etherTokenAddress] = etherTokenContract;
- return etherTokenContract;
- }
-}
diff --git a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts b/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts
deleted file mode 100644
index 6b5a75a9a..000000000
--- a/packages/0x.js/src/contract_wrappers/exchange_wrapper.ts
+++ /dev/null
@@ -1,934 +0,0 @@
-import { schemas } from '@0xproject/json-schemas';
-import {
- BlockParamLiteral,
- DecodedLogArgs,
- ECSignature,
- LogEntry,
- LogWithDecodedArgs,
- Order,
- SignedOrder,
-} from '@0xproject/types';
-import { AbiDecoder, BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { artifacts } from '../artifacts';
-import {
- BlockRange,
- EventCallback,
- ExchangeContractErrCodes,
- ExchangeContractErrs,
- IndexedFilterValues,
- MethodOpts,
- OrderAddresses,
- OrderCancellationRequest,
- OrderFillRequest,
- OrderTransactionOpts,
- OrderValues,
- ValidateOrderFillableOpts,
-} from '../types';
-import { assert } from '../utils/assert';
-import { decorators } from '../utils/decorators';
-import { ExchangeTransferSimulator } from '../utils/exchange_transfer_simulator';
-import { OrderValidationUtils } from '../utils/order_validation_utils';
-import { utils } from '../utils/utils';
-
-import { ContractWrapper } from './contract_wrapper';
-import {
- ExchangeContract,
- ExchangeContractEventArgs,
- ExchangeEvents,
- LogErrorContractEventArgs,
-} from './generated/exchange';
-import { TokenWrapper } from './token_wrapper';
-
-const SHOULD_VALIDATE_BY_DEFAULT = true;
-
-interface ExchangeContractErrCodesToMsgs {
- [exchangeContractErrCodes: number]: string;
-}
-
-/**
- * This class includes all the functionality related to calling methods and subscribing to
- * events of the 0x Exchange smart contract.
- */
-export class ExchangeWrapper extends ContractWrapper {
- private _exchangeContractIfExists?: ExchangeContract;
- private _orderValidationUtils: OrderValidationUtils;
- private _tokenWrapper: TokenWrapper;
- private _exchangeContractErrCodesToMsg: ExchangeContractErrCodesToMsgs = {
- [ExchangeContractErrCodes.ERROR_FILL_EXPIRED]: ExchangeContractErrs.OrderFillExpired,
- [ExchangeContractErrCodes.ERROR_CANCEL_EXPIRED]: ExchangeContractErrs.OrderFillExpired,
- [ExchangeContractErrCodes.ERROR_FILL_NO_VALUE]: ExchangeContractErrs.OrderRemainingFillAmountZero,
- [ExchangeContractErrCodes.ERROR_CANCEL_NO_VALUE]: ExchangeContractErrs.OrderRemainingFillAmountZero,
- [ExchangeContractErrCodes.ERROR_FILL_TRUNCATION]: ExchangeContractErrs.OrderFillRoundingError,
- [ExchangeContractErrCodes.ERROR_FILL_BALANCE_ALLOWANCE]: ExchangeContractErrs.FillBalanceAllowanceError,
- };
- private _contractAddressIfExists?: string;
- private _zrxContractAddressIfExists?: string;
- private static _getOrderAddressesAndValues(order: Order): [OrderAddresses, OrderValues] {
- const orderAddresses: OrderAddresses = [
- order.maker,
- order.taker,
- order.makerTokenAddress,
- order.takerTokenAddress,
- order.feeRecipient,
- ];
- const orderValues: OrderValues = [
- order.makerTokenAmount,
- order.takerTokenAmount,
- order.makerFee,
- order.takerFee,
- order.expirationUnixTimestampSec,
- order.salt,
- ];
- return [orderAddresses, orderValues];
- }
- constructor(
- web3Wrapper: Web3Wrapper,
- networkId: number,
- abiDecoder: AbiDecoder,
- tokenWrapper: TokenWrapper,
- contractAddressIfExists?: string,
- zrxContractAddressIfExists?: string,
- ) {
- super(web3Wrapper, networkId, abiDecoder);
- this._tokenWrapper = tokenWrapper;
- this._orderValidationUtils = new OrderValidationUtils(this);
- this._contractAddressIfExists = contractAddressIfExists;
- this._zrxContractAddressIfExists = zrxContractAddressIfExists;
- }
- /**
- * Returns the unavailable takerAmount of an order. Unavailable amount is defined as the total
- * amount that has been filled or cancelled. The remaining takerAmount can be calculated by
- * subtracting the unavailable amount from the total order takerAmount.
- * @param orderHash The hex encoded orderHash for which you would like to retrieve the
- * unavailable takerAmount.
- * @param methodOpts Optional arguments this method accepts.
- * @return The amount of the order (in taker tokens) that has either been filled or cancelled.
- */
- public async getUnavailableTakerAmountAsync(orderHash: string, methodOpts?: MethodOpts): Promise<BigNumber> {
- assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
-
- const exchangeContract = await this._getExchangeContractAsync();
- const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
- const txData = {};
- let unavailableTakerTokenAmount = await exchangeContract.getUnavailableTakerTokenAmount.callAsync(
- orderHash,
- txData,
- defaultBlock,
- );
- // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
- unavailableTakerTokenAmount = new BigNumber(unavailableTakerTokenAmount);
- return unavailableTakerTokenAmount;
- }
- /**
- * Retrieve the takerAmount of an order that has already been filled.
- * @param orderHash The hex encoded orderHash for which you would like to retrieve the filled takerAmount.
- * @param methodOpts Optional arguments this method accepts.
- * @return The amount of the order (in taker tokens) that has already been filled.
- */
- public async getFilledTakerAmountAsync(orderHash: string, methodOpts?: MethodOpts): Promise<BigNumber> {
- assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
-
- const exchangeContract = await this._getExchangeContractAsync();
- const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
- const txData = {};
- let fillAmountInBaseUnits = await exchangeContract.filled.callAsync(orderHash, txData, defaultBlock);
- // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
- fillAmountInBaseUnits = new BigNumber(fillAmountInBaseUnits);
- return fillAmountInBaseUnits;
- }
- /**
- * Retrieve the takerAmount of an order that has been cancelled.
- * @param orderHash The hex encoded orderHash for which you would like to retrieve the
- * cancelled takerAmount.
- * @param methodOpts Optional arguments this method accepts.
- * @return The amount of the order (in taker tokens) that has been cancelled.
- */
- public async getCancelledTakerAmountAsync(orderHash: string, methodOpts?: MethodOpts): Promise<BigNumber> {
- assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
-
- const exchangeContract = await this._getExchangeContractAsync();
- const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
- const txData = {};
- let cancelledAmountInBaseUnits = await exchangeContract.cancelled.callAsync(orderHash, txData, defaultBlock);
- // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
- cancelledAmountInBaseUnits = new BigNumber(cancelledAmountInBaseUnits);
- return cancelledAmountInBaseUnits;
- }
- /**
- * Fills a signed order with an amount denominated in baseUnits of the taker token.
- * Since the order in which transactions are included in the next block is indeterminate, race-conditions
- * could arise where a users balance or allowance changes before the fillOrder executes. Because of this,
- * we allow you to specify `shouldThrowOnInsufficientBalanceOrAllowance`.
- * If false, the smart contract will not throw if the parties
- * do not have sufficient balances/allowances, preserving gas costs. Setting it to true forgoes this check
- * and causes the smart contract to throw (using all the gas supplied) instead.
- * @param signedOrder An object that conforms to the SignedOrder interface.
- * @param fillTakerTokenAmount The amount of the order (in taker tokens baseUnits) that
- * you wish to fill.
- * @param shouldThrowOnInsufficientBalanceOrAllowance Whether or not you wish for the contract call to throw
- * if upon execution the tokens cannot be transferred.
- * @param takerAddress The user Ethereum address who would like to fill this order.
- * Must be available via the supplied Web3.Provider
- * passed to 0x.js.
- * @param orderTransactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async fillOrderAsync(
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- shouldThrowOnInsufficientBalanceOrAllowance: boolean,
- takerAddress: string,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
-
- const exchangeInstance = await this._getExchangeContractAsync();
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
-
- const [orderAddresses, orderValues] = ExchangeWrapper._getOrderAddressesAndValues(signedOrder);
-
- const txHash: string = await exchangeInstance.fillOrder.sendTransactionAsync(
- orderAddresses,
- orderValues,
- fillTakerTokenAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- signedOrder.ecSignature.v,
- signedOrder.ecSignature.r,
- signedOrder.ecSignature.s,
- {
- from: normalizedTakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Sequentially and atomically fills signedOrders up to the specified takerTokenFillAmount.
- * If the fill amount is reached - it succeeds and does not fill the rest of the orders.
- * If fill amount is not reached - it fills as much of the fill amount as possible and succeeds.
- * @param signedOrders The array of signedOrders that you would like to fill until
- * takerTokenFillAmount is reached.
- * @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
- * @param shouldThrowOnInsufficientBalanceOrAllowance Whether or not you wish for the contract call to throw if
- * upon execution any of the tokens cannot be transferred.
- * If set to false, the call will continue to fill subsequent
- * signedOrders even when some cannot be filled.
- * @param takerAddress The user Ethereum address who would like to fill these
- * orders. Must be available via the supplied Web3.Provider
- * passed to 0x.js.
- * @param orderTransactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async fillOrdersUpToAsync(
- signedOrders: SignedOrder[],
- fillTakerTokenAmount: BigNumber,
- shouldThrowOnInsufficientBalanceOrAllowance: boolean,
- takerAddress: string,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
- const takerTokenAddresses = _.map(signedOrders, signedOrder => signedOrder.takerTokenAddress);
- assert.hasAtMostOneUniqueValue(
- takerTokenAddresses,
- ExchangeContractErrs.MultipleTakerTokensInFillUpToDisallowed,
- );
- const exchangeContractAddresses = _.map(signedOrders, signedOrder => signedOrder.exchangeContractAddress);
- assert.hasAtMostOneUniqueValue(
- exchangeContractAddresses,
- ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
- );
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
-
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- let filledTakerTokenAmount = new BigNumber(0);
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- for (const signedOrder of signedOrders) {
- const singleFilledTakerTokenAmount = await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount.minus(filledTakerTokenAmount),
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- filledTakerTokenAmount = filledTakerTokenAmount.plus(singleFilledTakerTokenAmount);
- if (filledTakerTokenAmount.eq(fillTakerTokenAmount)) {
- break;
- }
- }
- }
-
- if (_.isEmpty(signedOrders)) {
- throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- }
-
- const orderAddressesValuesAndSignatureArray = _.map(signedOrders, signedOrder => {
- return [
- ...ExchangeWrapper._getOrderAddressesAndValues(signedOrder),
- signedOrder.ecSignature.v,
- signedOrder.ecSignature.r,
- signedOrder.ecSignature.s,
- ];
- });
- // We use _.unzip<any> because _.unzip doesn't type check if values have different types :'(
- const [orderAddressesArray, orderValuesArray, vArray, rArray, sArray] = _.unzip<any>(
- orderAddressesValuesAndSignatureArray,
- );
-
- const exchangeInstance = await this._getExchangeContractAsync();
- const txHash = await exchangeInstance.fillOrdersUpTo.sendTransactionAsync(
- orderAddressesArray,
- orderValuesArray,
- fillTakerTokenAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- vArray,
- rArray,
- sArray,
- {
- from: normalizedTakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Batch version of fillOrderAsync.
- * Executes multiple fills atomically in a single transaction.
- * If shouldThrowOnInsufficientBalanceOrAllowance is set to false, it will continue filling subsequent orders even
- * when earlier ones fail.
- * When shouldThrowOnInsufficientBalanceOrAllowance is set to true, if any fill fails, the entire batch fails.
- * @param orderFillRequests An array of objects that conform to the
- * OrderFillRequest interface.
- * @param shouldThrowOnInsufficientBalanceOrAllowance Whether or not you wish for the contract call to throw
- * if upon execution any of the tokens cannot be
- * transferred. If set to false, the call will continue to
- * fill subsequent signedOrders even when some
- * cannot be filled.
- * @param takerAddress The user Ethereum address who would like to fill
- * these orders. Must be available via the supplied
- * Web3.Provider passed to 0x.js.
- * @param orderTransactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async batchFillOrdersAsync(
- orderFillRequests: OrderFillRequest[],
- shouldThrowOnInsufficientBalanceOrAllowance: boolean,
- takerAddress: string,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('orderFillRequests', orderFillRequests, schemas.orderFillRequestsSchema);
- const exchangeContractAddresses = _.map(
- orderFillRequests,
- orderFillRequest => orderFillRequest.signedOrder.exchangeContractAddress,
- );
- assert.hasAtMostOneUniqueValue(
- exchangeContractAddresses,
- ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
- );
- assert.isBoolean('shouldThrowOnInsufficientBalanceOrAllowance', shouldThrowOnInsufficientBalanceOrAllowance);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- for (const orderFillRequest of orderFillRequests) {
- await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- orderFillRequest.signedOrder,
- orderFillRequest.takerTokenFillAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
- }
- if (_.isEmpty(orderFillRequests)) {
- throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- }
-
- const orderAddressesValuesAmountsAndSignatureArray = _.map(orderFillRequests, orderFillRequest => {
- return [
- ...ExchangeWrapper._getOrderAddressesAndValues(orderFillRequest.signedOrder),
- orderFillRequest.takerTokenFillAmount,
- orderFillRequest.signedOrder.ecSignature.v,
- orderFillRequest.signedOrder.ecSignature.r,
- orderFillRequest.signedOrder.ecSignature.s,
- ];
- });
- // We use _.unzip<any> because _.unzip doesn't type check if values have different types :'(
- const [orderAddressesArray, orderValuesArray, fillTakerTokenAmounts, vArray, rArray, sArray] = _.unzip<any>(
- orderAddressesValuesAmountsAndSignatureArray,
- );
-
- const exchangeInstance = await this._getExchangeContractAsync();
- const txHash = await exchangeInstance.batchFillOrders.sendTransactionAsync(
- orderAddressesArray,
- orderValuesArray,
- fillTakerTokenAmounts,
- shouldThrowOnInsufficientBalanceOrAllowance,
- vArray,
- rArray,
- sArray,
- {
- from: normalizedTakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Attempts to fill a specific amount of an order. If the entire amount specified cannot be filled,
- * the fill order is abandoned.
- * @param signedOrder An object that conforms to the SignedOrder interface. The
- * signedOrder you wish to fill.
- * @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
- * @param takerAddress The user Ethereum address who would like to fill this order.
- * Must be available via the supplied Web3.Provider passed to 0x.js.
- * @param orderTransactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async fillOrKillOrderAsync(
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- takerAddress: string,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
-
- const exchangeInstance = await this._getExchangeContractAsync();
-
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- await this._orderValidationUtils.validateFillOrKillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
-
- const [orderAddresses, orderValues] = ExchangeWrapper._getOrderAddressesAndValues(signedOrder);
- const txHash = await exchangeInstance.fillOrKillOrder.sendTransactionAsync(
- orderAddresses,
- orderValues,
- fillTakerTokenAmount,
- signedOrder.ecSignature.v,
- signedOrder.ecSignature.r,
- signedOrder.ecSignature.s,
- {
- from: normalizedTakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Batch version of fillOrKill. Allows a taker to specify a batch of orders that will either be atomically
- * filled (each to the specified fillAmount) or aborted.
- * @param orderFillRequests An array of objects that conform to the OrderFillRequest interface.
- * @param takerAddress The user Ethereum address who would like to fill there orders.
- * Must be available via the supplied Web3.Provider passed to 0x.js.
- * @param orderTransactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async batchFillOrKillAsync(
- orderFillRequests: OrderFillRequest[],
- takerAddress: string,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('orderFillRequests', orderFillRequests, schemas.orderFillRequestsSchema);
- const exchangeContractAddresses = _.map(
- orderFillRequests,
- orderFillRequest => orderFillRequest.signedOrder.exchangeContractAddress,
- );
- assert.hasAtMostOneUniqueValue(
- exchangeContractAddresses,
- ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
- );
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
- if (_.isEmpty(orderFillRequests)) {
- throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- }
- const exchangeInstance = await this._getExchangeContractAsync();
-
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- for (const orderFillRequest of orderFillRequests) {
- await this._orderValidationUtils.validateFillOrKillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- orderFillRequest.signedOrder,
- orderFillRequest.takerTokenFillAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
- }
-
- const orderAddressesValuesAndTakerTokenFillAmounts = _.map(orderFillRequests, request => {
- return [
- ...ExchangeWrapper._getOrderAddressesAndValues(request.signedOrder),
- request.takerTokenFillAmount,
- request.signedOrder.ecSignature.v,
- request.signedOrder.ecSignature.r,
- request.signedOrder.ecSignature.s,
- ];
- });
-
- // We use _.unzip<any> because _.unzip doesn't type check if values have different types :'(
- const [orderAddresses, orderValues, fillTakerTokenAmounts, vParams, rParams, sParams] = _.unzip<any>(
- orderAddressesValuesAndTakerTokenFillAmounts,
- );
- const txHash = await exchangeInstance.batchFillOrKillOrders.sendTransactionAsync(
- orderAddresses,
- orderValues,
- fillTakerTokenAmounts,
- vParams,
- rParams,
- sParams,
- {
- from: normalizedTakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Cancel a given fill amount of an order. Cancellations are cumulative.
- * @param order An object that conforms to the Order or SignedOrder interface.
- * The order you would like to cancel.
- * @param cancelTakerTokenAmount The amount (specified in taker tokens) that you would like to cancel.
- * @param transactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async cancelOrderAsync(
- order: Order | SignedOrder,
- cancelTakerTokenAmount: BigNumber,
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema('order', order, schemas.orderSchema);
- assert.isValidBaseUnitAmount('takerTokenCancelAmount', cancelTakerTokenAmount);
- await assert.isSenderAddressAsync('order.maker', order.maker, this._web3Wrapper);
- const normalizedMakerAddress = order.maker.toLowerCase();
-
- const exchangeInstance = await this._getExchangeContractAsync();
-
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- const orderHash = utils.getOrderHashHex(order);
- const unavailableTakerTokenAmount = await this.getUnavailableTakerAmountAsync(orderHash);
- OrderValidationUtils.validateCancelOrderThrowIfInvalid(
- order,
- cancelTakerTokenAmount,
- unavailableTakerTokenAmount,
- );
- }
-
- const [orderAddresses, orderValues] = ExchangeWrapper._getOrderAddressesAndValues(order);
- const txHash = await exchangeInstance.cancelOrder.sendTransactionAsync(
- orderAddresses,
- orderValues,
- cancelTakerTokenAmount,
- {
- from: normalizedMakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Batch version of cancelOrderAsync. Atomically cancels multiple orders in a single transaction.
- * All orders must be from the same maker.
- * @param orderCancellationRequests An array of objects that conform to the OrderCancellationRequest
- * interface.
- * @param transactionOpts Optional arguments this method accepts.
- * @return Transaction hash.
- */
- @decorators.asyncZeroExErrorHandler
- public async batchCancelOrdersAsync(
- orderCancellationRequests: OrderCancellationRequest[],
- orderTransactionOpts: OrderTransactionOpts = {},
- ): Promise<string> {
- assert.doesConformToSchema(
- 'orderCancellationRequests',
- orderCancellationRequests,
- schemas.orderCancellationRequestsSchema,
- );
- const exchangeContractAddresses = _.map(
- orderCancellationRequests,
- orderCancellationRequest => orderCancellationRequest.order.exchangeContractAddress,
- );
- assert.hasAtMostOneUniqueValue(
- exchangeContractAddresses,
- ExchangeContractErrs.BatchOrdersMustHaveSameExchangeAddress,
- );
- const makers = _.map(orderCancellationRequests, cancellationRequest => cancellationRequest.order.maker);
- assert.hasAtMostOneUniqueValue(makers, ExchangeContractErrs.MultipleMakersInSingleCancelBatchDisallowed);
- const maker = makers[0];
- await assert.isSenderAddressAsync('maker', maker, this._web3Wrapper);
- const normalizedMakerAddress = maker.toLowerCase();
-
- const shouldValidate = _.isUndefined(orderTransactionOpts.shouldValidate)
- ? SHOULD_VALIDATE_BY_DEFAULT
- : orderTransactionOpts.shouldValidate;
- if (shouldValidate) {
- for (const orderCancellationRequest of orderCancellationRequests) {
- const orderHash = utils.getOrderHashHex(orderCancellationRequest.order);
- const unavailableTakerTokenAmount = await this.getUnavailableTakerAmountAsync(orderHash);
- OrderValidationUtils.validateCancelOrderThrowIfInvalid(
- orderCancellationRequest.order,
- orderCancellationRequest.takerTokenCancelAmount,
- unavailableTakerTokenAmount,
- );
- }
- }
- if (_.isEmpty(orderCancellationRequests)) {
- throw new Error(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- }
- const exchangeInstance = await this._getExchangeContractAsync();
- const orderAddressesValuesAndTakerTokenCancelAmounts = _.map(orderCancellationRequests, cancellationRequest => {
- return [
- ...ExchangeWrapper._getOrderAddressesAndValues(cancellationRequest.order),
- cancellationRequest.takerTokenCancelAmount,
- ];
- });
- // We use _.unzip<any> because _.unzip doesn't type check if values have different types :'(
- const [orderAddresses, orderValues, cancelTakerTokenAmounts] = _.unzip<any>(
- orderAddressesValuesAndTakerTokenCancelAmounts,
- );
- const txHash = await exchangeInstance.batchCancelOrders.sendTransactionAsync(
- orderAddresses,
- orderValues,
- cancelTakerTokenAmounts,
- {
- from: normalizedMakerAddress,
- gas: orderTransactionOpts.gasLimit,
- gasPrice: orderTransactionOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Subscribe to an event type emitted by the Exchange contract.
- * @param eventName The exchange contract event you would like to subscribe to.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
- * @param callback Callback that gets called when a log is added/removed
- * @return Subscription token used later to unsubscribe
- */
- public subscribe<ArgsType extends ExchangeContractEventArgs>(
- eventName: ExchangeEvents,
- indexFilterValues: IndexedFilterValues,
- callback: EventCallback<ArgsType>,
- ): string {
- assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- assert.isFunction('callback', callback);
- const exchangeContractAddress = this.getContractAddress();
- const subscriptionToken = this._subscribe<ArgsType>(
- exchangeContractAddress,
- eventName,
- indexFilterValues,
- artifacts.ExchangeArtifact.abi,
- callback,
- );
- return subscriptionToken;
- }
- /**
- * Cancel a subscription
- * @param subscriptionToken Subscription token returned by `subscribe()`
- */
- public unsubscribe(subscriptionToken: string): void {
- this._unsubscribe(subscriptionToken);
- }
- /**
- * Cancels all existing subscriptions
- */
- public unsubscribeAll(): void {
- super._unsubscribeAll();
- }
- /**
- * Gets historical logs without creating a subscription
- * @param eventName The exchange contract event you would like to subscribe to.
- * @param blockRange Block range to get logs from.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
- * @return Array of logs that match the parameters
- */
- public async getLogsAsync<ArgsType extends ExchangeContractEventArgs>(
- eventName: ExchangeEvents,
- blockRange: BlockRange,
- indexFilterValues: IndexedFilterValues,
- ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
- assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
- assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- const exchangeContractAddress = this.getContractAddress();
- const logs = await this._getLogsAsync<ArgsType>(
- exchangeContractAddress,
- eventName,
- blockRange,
- indexFilterValues,
- artifacts.ExchangeArtifact.abi,
- );
- return logs;
- }
- /**
- * Retrieves the Ethereum address of the Exchange contract deployed on the network
- * that the user-passed web3 provider is connected to.
- * @returns The Ethereum address of the Exchange contract being used.
- */
- public getContractAddress(): string {
- const contractAddress = this._getContractAddress(artifacts.ExchangeArtifact, this._contractAddressIfExists);
- return contractAddress;
- }
- /**
- * Checks if order is still fillable and throws an error otherwise. Useful for orderbook
- * pruning where you want to remove stale orders without knowing who the taker will be.
- * @param signedOrder An object that conforms to the SignedOrder interface. The
- * signedOrder you wish to validate.
- * @param opts An object that conforms to the ValidateOrderFillableOpts
- * interface. Allows specifying a specific fillTakerTokenAmount
- * to validate for.
- */
- public async validateOrderFillableOrThrowAsync(
- signedOrder: SignedOrder,
- opts?: ValidateOrderFillableOpts,
- ): Promise<void> {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- const zrxTokenAddress = this.getZRXTokenAddress();
- const expectedFillTakerTokenAmount = !_.isUndefined(opts) ? opts.expectedFillTakerTokenAmount : undefined;
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- await this._orderValidationUtils.validateOrderFillableOrThrowAsync(
- exchangeTradeEmulator,
- signedOrder,
- zrxTokenAddress,
- expectedFillTakerTokenAmount,
- );
- }
- /**
- * Checks if order fill will succeed and throws an error otherwise.
- * @param signedOrder An object that conforms to the SignedOrder interface. The
- * signedOrder you wish to fill.
- * @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
- * @param takerAddress The user Ethereum address who would like to fill this order.
- * Must be available via the supplied Web3.Provider passed to 0x.js.
- */
- public async validateFillOrderThrowIfInvalidAsync(
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- takerAddress: string,
- ): Promise<void> {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- await this._orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
- /**
- * Checks if cancelling a given order will succeed and throws an informative error if it won't.
- * @param order An object that conforms to the Order or SignedOrder interface.
- * The order you would like to cancel.
- * @param cancelTakerTokenAmount The amount (specified in taker tokens) that you would like to cancel.
- */
- public async validateCancelOrderThrowIfInvalidAsync(
- order: Order,
- cancelTakerTokenAmount: BigNumber,
- ): Promise<void> {
- assert.doesConformToSchema('order', order, schemas.orderSchema);
- assert.isValidBaseUnitAmount('cancelTakerTokenAmount', cancelTakerTokenAmount);
- const orderHash = utils.getOrderHashHex(order);
- const unavailableTakerTokenAmount = await this.getUnavailableTakerAmountAsync(orderHash);
- OrderValidationUtils.validateCancelOrderThrowIfInvalid(
- order,
- cancelTakerTokenAmount,
- unavailableTakerTokenAmount,
- );
- }
- /**
- * Checks if calling fillOrKill on a given order will succeed and throws an informative error if it won't.
- * @param signedOrder An object that conforms to the SignedOrder interface. The
- * signedOrder you wish to fill.
- * @param fillTakerTokenAmount The total amount of the takerTokens you would like to fill.
- * @param takerAddress The user Ethereum address who would like to fill this order.
- * Must be available via the supplied Web3.Provider passed to 0x.js.
- */
- public async validateFillOrKillOrderThrowIfInvalidAsync(
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- takerAddress: string,
- ): Promise<void> {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
- const normalizedTakerAddress = takerAddress.toLowerCase();
- const zrxTokenAddress = this.getZRXTokenAddress();
- const exchangeTradeEmulator = new ExchangeTransferSimulator(this._tokenWrapper, BlockParamLiteral.Latest);
- await this._orderValidationUtils.validateFillOrKillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount,
- normalizedTakerAddress,
- zrxTokenAddress,
- );
- }
- /**
- * Checks if rounding error will be > 0.1% when computing makerTokenAmount by doing:
- * `(fillTakerTokenAmount * makerTokenAmount) / takerTokenAmount`.
- * 0x Protocol does not accept any trades that result in large rounding errors. This means that tokens with few or
- * no decimals can only be filled in quantities and ratios that avoid large rounding errors.
- * @param fillTakerTokenAmount The amount of the order (in taker tokens baseUnits) that you wish to fill.
- * @param takerTokenAmount The order size on the taker side
- * @param makerTokenAmount The order size on the maker side
- */
- public async isRoundingErrorAsync(
- fillTakerTokenAmount: BigNumber,
- takerTokenAmount: BigNumber,
- makerTokenAmount: BigNumber,
- ): Promise<boolean> {
- assert.isValidBaseUnitAmount('fillTakerTokenAmount', fillTakerTokenAmount);
- assert.isValidBaseUnitAmount('takerTokenAmount', takerTokenAmount);
- assert.isValidBaseUnitAmount('makerTokenAmount', makerTokenAmount);
- const exchangeInstance = await this._getExchangeContractAsync();
- const isRoundingError = await exchangeInstance.isRoundingError.callAsync(
- fillTakerTokenAmount,
- takerTokenAmount,
- makerTokenAmount,
- );
- return isRoundingError;
- }
- /**
- * Checks if logs contain LogError, which is emitted by Exchange contract on transaction failure.
- * @param logs Transaction logs as returned by `zeroEx.awaitTransactionMinedAsync`
- */
- public throwLogErrorsAsErrors(logs: Array<LogWithDecodedArgs<DecodedLogArgs> | LogEntry>): void {
- const errLog = _.find(logs, {
- event: ExchangeEvents.LogError,
- });
- if (!_.isUndefined(errLog)) {
- const logArgs = (errLog as LogWithDecodedArgs<LogErrorContractEventArgs>).args;
- const errCode = logArgs.errorId;
- const errMessage = this._exchangeContractErrCodesToMsg[errCode];
- throw new Error(errMessage);
- }
- }
- /**
- * Returns the ZRX token address used by the exchange contract.
- * @return Address of ZRX token
- */
- public getZRXTokenAddress(): string {
- const contractAddress = this._getContractAddress(artifacts.ZRXArtifact, this._zrxContractAddressIfExists);
- return contractAddress;
- }
- private _invalidateContractInstances(): void {
- this.unsubscribeAll();
- delete this._exchangeContractIfExists;
- }
- private async _isValidSignatureUsingContractCallAsync(
- dataHex: string,
- ecSignature: ECSignature,
- signerAddressHex: string,
- ): Promise<boolean> {
- assert.isHexString('dataHex', dataHex);
- assert.doesConformToSchema('ecSignature', ecSignature, schemas.ecSignatureSchema);
- assert.isETHAddressHex('signerAddressHex', signerAddressHex);
- const normalizedSignerAddress = signerAddressHex.toLowerCase();
-
- const exchangeInstance = await this._getExchangeContractAsync();
-
- const isValidSignature = await exchangeInstance.isValidSignature.callAsync(
- normalizedSignerAddress,
- dataHex,
- ecSignature.v,
- ecSignature.r,
- ecSignature.s,
- );
- return isValidSignature;
- }
- private async _getOrderHashHexUsingContractCallAsync(order: Order | SignedOrder): Promise<string> {
- const exchangeInstance = await this._getExchangeContractAsync();
- const [orderAddresses, orderValues] = ExchangeWrapper._getOrderAddressesAndValues(order);
- const orderHashHex = await exchangeInstance.getOrderHash.callAsync(orderAddresses, orderValues);
- return orderHashHex;
- }
- private async _getExchangeContractAsync(): Promise<ExchangeContract> {
- if (!_.isUndefined(this._exchangeContractIfExists)) {
- return this._exchangeContractIfExists;
- }
- const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
- artifacts.ExchangeArtifact,
- this._contractAddressIfExists,
- );
- const contractInstance = new ExchangeContract(this._web3Wrapper, abi, address);
- this._exchangeContractIfExists = contractInstance;
- return this._exchangeContractIfExists;
- }
- private async _getTokenTransferProxyAddressAsync(): Promise<string> {
- const exchangeInstance = await this._getExchangeContractAsync();
- const tokenTransferProxyAddress = await exchangeInstance.TOKEN_TRANSFER_PROXY_CONTRACT.callAsync();
- const tokenTransferProxyAddressLowerCase = tokenTransferProxyAddress.toLowerCase();
- return tokenTransferProxyAddressLowerCase;
- }
-} // tslint:disable:max-file-line-count
diff --git a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts
deleted file mode 100644
index e1806c6f2..000000000
--- a/packages/0x.js/src/contract_wrappers/token_registry_wrapper.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { artifacts } from '../artifacts';
-import { Token, TokenMetadata } from '../types';
-import { assert } from '../utils/assert';
-import { constants } from '../utils/constants';
-
-import { ContractWrapper } from './contract_wrapper';
-import { TokenRegistryContract } from './generated/token_registry';
-
-/**
- * This class includes all the functionality related to interacting with the 0x Token Registry smart contract.
- */
-export class TokenRegistryWrapper extends ContractWrapper {
- private _tokenRegistryContractIfExists?: TokenRegistryContract;
- private _contractAddressIfExists?: string;
- private static _createTokenFromMetadata(metadata: TokenMetadata): Token | undefined {
- if (metadata[0] === constants.NULL_ADDRESS) {
- return undefined;
- }
- const token = {
- address: metadata[0],
- name: metadata[1],
- symbol: metadata[2],
- decimals: metadata[3],
- };
- return token;
- }
- constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
- super(web3Wrapper, networkId);
- this._contractAddressIfExists = contractAddressIfExists;
- }
- /**
- * Retrieves all the tokens currently listed in the Token Registry smart contract
- * @return An array of objects that conform to the Token interface.
- */
- public async getTokensAsync(): Promise<Token[]> {
- const addresses = await this.getTokenAddressesAsync();
- const tokenPromises: Array<Promise<Token | undefined>> = _.map(addresses, async (address: string) =>
- this.getTokenIfExistsAsync(address),
- );
- const tokens = await Promise.all(tokenPromises);
- return tokens as Token[];
- }
- /**
- * Retrieves all the addresses of the tokens currently listed in the Token Registry smart contract
- * @return An array of token addresses.
- */
- public async getTokenAddressesAsync(): Promise<string[]> {
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const addresses = await tokenRegistryContract.getTokenAddresses.callAsync();
- const lowerCaseAddresses = _.map(addresses, address => address.toLowerCase());
- return lowerCaseAddresses;
- }
- /**
- * Retrieves a token by address currently listed in the Token Registry smart contract
- * @return An object that conforms to the Token interface or undefined if token not found.
- */
- public async getTokenIfExistsAsync(address: string): Promise<Token | undefined> {
- assert.isETHAddressHex('address', address);
- const normalizedAddress = address.toLowerCase();
-
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const metadata = await tokenRegistryContract.getTokenMetaData.callAsync(normalizedAddress);
- const token = TokenRegistryWrapper._createTokenFromMetadata(metadata);
- return token;
- }
- public async getTokenAddressBySymbolIfExistsAsync(symbol: string): Promise<string | undefined> {
- assert.isString('symbol', symbol);
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const addressIfExists = await tokenRegistryContract.getTokenAddressBySymbol.callAsync(symbol);
- if (addressIfExists === constants.NULL_ADDRESS) {
- return undefined;
- }
- return addressIfExists;
- }
- public async getTokenAddressByNameIfExistsAsync(name: string): Promise<string | undefined> {
- assert.isString('name', name);
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const addressIfExists = await tokenRegistryContract.getTokenAddressByName.callAsync(name);
- if (addressIfExists === constants.NULL_ADDRESS) {
- return undefined;
- }
- return addressIfExists;
- }
- public async getTokenBySymbolIfExistsAsync(symbol: string): Promise<Token | undefined> {
- assert.isString('symbol', symbol);
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const metadata = await tokenRegistryContract.getTokenBySymbol.callAsync(symbol);
- const token = TokenRegistryWrapper._createTokenFromMetadata(metadata);
- return token;
- }
- public async getTokenByNameIfExistsAsync(name: string): Promise<Token | undefined> {
- assert.isString('name', name);
- const tokenRegistryContract = await this._getTokenRegistryContractAsync();
- const metadata = await tokenRegistryContract.getTokenByName.callAsync(name);
- const token = TokenRegistryWrapper._createTokenFromMetadata(metadata);
- return token;
- }
- /**
- * Retrieves the Ethereum address of the TokenRegistry contract deployed on the network
- * that the user-passed web3 provider is connected to.
- * @returns The Ethereum address of the TokenRegistry contract being used.
- */
- public getContractAddress(): string {
- const contractAddress = this._getContractAddress(
- artifacts.TokenRegistryArtifact,
- this._contractAddressIfExists,
- );
- return contractAddress;
- }
- private _invalidateContractInstance(): void {
- delete this._tokenRegistryContractIfExists;
- }
- private async _getTokenRegistryContractAsync(): Promise<TokenRegistryContract> {
- if (!_.isUndefined(this._tokenRegistryContractIfExists)) {
- return this._tokenRegistryContractIfExists;
- }
- const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
- artifacts.TokenRegistryArtifact,
- this._contractAddressIfExists,
- );
- const contractInstance = new TokenRegistryContract(this._web3Wrapper, abi, address);
- this._tokenRegistryContractIfExists = contractInstance;
- return this._tokenRegistryContractIfExists;
- }
-}
diff --git a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts
deleted file mode 100644
index 211c7dfb4..000000000
--- a/packages/0x.js/src/contract_wrappers/token_transfer_proxy_wrapper.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { artifacts } from '../artifacts';
-import { assert } from '../utils/assert';
-
-import { ContractWrapper } from './contract_wrapper';
-import { TokenTransferProxyContract } from './generated/token_transfer_proxy';
-
-/**
- * This class includes the functionality related to interacting with the TokenTransferProxy contract.
- */
-export class TokenTransferProxyWrapper extends ContractWrapper {
- private _tokenTransferProxyContractIfExists?: TokenTransferProxyContract;
- private _contractAddressIfExists?: string;
- constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
- super(web3Wrapper, networkId);
- this._contractAddressIfExists = contractAddressIfExists;
- }
- /**
- * Check if the Exchange contract address is authorized by the TokenTransferProxy contract.
- * @param exchangeContractAddress The hex encoded address of the Exchange contract to call.
- * @return Whether the exchangeContractAddress is authorized.
- */
- public async isAuthorizedAsync(exchangeContractAddress: string): Promise<boolean> {
- assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress);
- const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase();
- const tokenTransferProxyContractInstance = await this._getTokenTransferProxyContractAsync();
- const isAuthorized = await tokenTransferProxyContractInstance.authorized.callAsync(
- normalizedExchangeContractAddress,
- );
- return isAuthorized;
- }
- /**
- * Get the list of all Exchange contract addresses authorized by the TokenTransferProxy contract.
- * @return The list of authorized addresses.
- */
- public async getAuthorizedAddressesAsync(): Promise<string[]> {
- const tokenTransferProxyContractInstance = await this._getTokenTransferProxyContractAsync();
- const authorizedAddresses = await tokenTransferProxyContractInstance.getAuthorizedAddresses.callAsync();
- return authorizedAddresses;
- }
- /**
- * Retrieves the Ethereum address of the TokenTransferProxy contract deployed on the network
- * that the user-passed web3 provider is connected to.
- * @returns The Ethereum address of the TokenTransferProxy contract being used.
- */
- public getContractAddress(): string {
- const contractAddress = this._getContractAddress(
- artifacts.TokenTransferProxyArtifact,
- this._contractAddressIfExists,
- );
- return contractAddress;
- }
- private _invalidateContractInstance(): void {
- delete this._tokenTransferProxyContractIfExists;
- }
- private async _getTokenTransferProxyContractAsync(): Promise<TokenTransferProxyContract> {
- if (!_.isUndefined(this._tokenTransferProxyContractIfExists)) {
- return this._tokenTransferProxyContractIfExists;
- }
- const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
- artifacts.TokenTransferProxyArtifact,
- this._contractAddressIfExists,
- );
- const contractInstance = new TokenTransferProxyContract(this._web3Wrapper, abi, address);
- this._tokenTransferProxyContractIfExists = contractInstance;
- return this._tokenTransferProxyContractIfExists;
- }
-}
diff --git a/packages/0x.js/src/contract_wrappers/token_wrapper.ts b/packages/0x.js/src/contract_wrappers/token_wrapper.ts
deleted file mode 100644
index e350dfb92..000000000
--- a/packages/0x.js/src/contract_wrappers/token_wrapper.ts
+++ /dev/null
@@ -1,434 +0,0 @@
-import { schemas } from '@0xproject/json-schemas';
-import { LogWithDecodedArgs } from '@0xproject/types';
-import { AbiDecoder, BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { artifacts } from '../artifacts';
-import { BlockRange, EventCallback, IndexedFilterValues, MethodOpts, TransactionOpts, ZeroExError } from '../types';
-import { assert } from '../utils/assert';
-import { constants } from '../utils/constants';
-
-import { ContractWrapper } from './contract_wrapper';
-import { TokenContract, TokenContractEventArgs, TokenEvents } from './generated/token';
-import { TokenTransferProxyWrapper } from './token_transfer_proxy_wrapper';
-
-/**
- * This class includes all the functionality related to interacting with ERC20 token contracts.
- * All ERC20 method calls are supported, along with some convenience methods for getting/setting allowances
- * to the 0x Proxy smart contract.
- */
-export class TokenWrapper extends ContractWrapper {
- public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
- private _tokenContractsByAddress: { [address: string]: TokenContract };
- private _tokenTransferProxyWrapper: TokenTransferProxyWrapper;
- constructor(
- web3Wrapper: Web3Wrapper,
- networkId: number,
- abiDecoder: AbiDecoder,
- tokenTransferProxyWrapper: TokenTransferProxyWrapper,
- ) {
- super(web3Wrapper, networkId, abiDecoder);
- this._tokenContractsByAddress = {};
- this._tokenTransferProxyWrapper = tokenTransferProxyWrapper;
- }
- /**
- * Retrieves an owner's ERC20 token balance.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address whose balance you would like to check.
- * @param methodOpts Optional arguments this method accepts.
- * @return The owner's ERC20 token balance in base units.
- */
- public async getBalanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- methodOpts?: MethodOpts,
- ): Promise<BigNumber> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
-
- const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
- const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
- const txData = {};
- let balance = await tokenContract.balanceOf.callAsync(normalizedOwnerAddress, txData, defaultBlock);
- // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
- balance = new BigNumber(balance);
- return balance;
- }
- /**
- * Sets the spender's allowance to a specified number of baseUnits on behalf of the owner address.
- * Equivalent to the ERC20 spec method `approve`.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address who would like to set an allowance
- * for spenderAddress.
- * @param spenderAddress The hex encoded user Ethereum address who will be able to spend the set allowance.
- * @param amountInBaseUnits The allowance amount you would like to set.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async setAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- spenderAddress: string,
- amountInBaseUnits: BigNumber,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('spenderAddress', spenderAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedSpenderAddress = spenderAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
- assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
-
- const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
- const txHash = await tokenContract.approve.sendTransactionAsync(normalizedSpenderAddress, amountInBaseUnits, {
- from: normalizedOwnerAddress,
- gas: txOpts.gasLimit,
- gasPrice: txOpts.gasPrice,
- });
- return txHash;
- }
- /**
- * Sets the spender's allowance to an unlimited number of baseUnits on behalf of the owner address.
- * Equivalent to the ERC20 spec method `approve`.
- * Setting an unlimited allowance will lower the gas cost for filling orders involving tokens that forego updating
- * allowances set to the max amount (e.g ZRX, WETH)
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address who would like to set an allowance
- * for spenderAddress.
- * @param spenderAddress The hex encoded user Ethereum address who will be able to spend the set allowance.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async setUnlimitedAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- spenderAddress: string,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- assert.isETHAddressHex('spenderAddress', spenderAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
- const normalizedSpenderAddress = spenderAddress.toLowerCase();
- const txHash = await this.setAllowanceAsync(
- normalizedTokenAddress,
- normalizedOwnerAddress,
- normalizedSpenderAddress,
- this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
- txOpts,
- );
- return txHash;
- }
- /**
- * Retrieves the owners allowance in baseUnits set to the spender's address.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address whose allowance to spenderAddress
- * you would like to retrieve.
- * @param spenderAddress The hex encoded user Ethereum address who can spend the allowance you are fetching.
- * @param methodOpts Optional arguments this method accepts.
- */
- public async getAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- spenderAddress: string,
- methodOpts?: MethodOpts,
- ): Promise<BigNumber> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- assert.isETHAddressHex('spenderAddress', spenderAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
- const normalizedSpenderAddress = spenderAddress.toLowerCase();
-
- const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
- const defaultBlock = _.isUndefined(methodOpts) ? undefined : methodOpts.defaultBlock;
- const txData = {};
- let allowanceInBaseUnits = await tokenContract.allowance.callAsync(
- normalizedOwnerAddress,
- normalizedSpenderAddress,
- txData,
- defaultBlock,
- );
- // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
- allowanceInBaseUnits = new BigNumber(allowanceInBaseUnits);
- return allowanceInBaseUnits;
- }
- /**
- * Retrieves the owner's allowance in baseUnits set to the 0x proxy contract.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address whose proxy contract allowance we are retrieving.
- * @param methodOpts Optional arguments this method accepts.
- */
- public async getProxyAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- methodOpts?: MethodOpts,
- ): Promise<BigNumber> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
-
- const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
- const allowanceInBaseUnits = await this.getAllowanceAsync(
- normalizedTokenAddress,
- normalizedOwnerAddress,
- proxyAddress,
- methodOpts,
- );
- return allowanceInBaseUnits;
- }
- /**
- * Sets the 0x proxy contract's allowance to a specified number of a tokens' baseUnits on behalf
- * of an owner address.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address who is setting an allowance
- * for the Proxy contract.
- * @param amountInBaseUnits The allowance amount specified in baseUnits.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async setProxyAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- amountInBaseUnits: BigNumber,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
- assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
-
- const proxyAddress = this._tokenTransferProxyWrapper.getContractAddress();
- const txHash = await this.setAllowanceAsync(
- normalizedTokenAddress,
- normalizedOwnerAddress,
- proxyAddress,
- amountInBaseUnits,
- txOpts,
- );
- return txHash;
- }
- /**
- * Sets the 0x proxy contract's allowance to a unlimited number of a tokens' baseUnits on behalf
- * of an owner address.
- * Setting an unlimited allowance will lower the gas cost for filling orders involving tokens that forego updating
- * allowances set to the max amount (e.g ZRX, WETH)
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param ownerAddress The hex encoded user Ethereum address who is setting an allowance
- * for the Proxy contract.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async setUnlimitedProxyAllowanceAsync(
- tokenAddress: string,
- ownerAddress: string,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('ownerAddress', ownerAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedOwnerAddress = ownerAddress.toLowerCase();
- const txHash = await this.setProxyAllowanceAsync(
- normalizedTokenAddress,
- normalizedOwnerAddress,
- this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
- txOpts,
- );
- return txHash;
- }
- /**
- * Transfers `amountInBaseUnits` ERC20 tokens from `fromAddress` to `toAddress`.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param fromAddress The hex encoded user Ethereum address that will send the funds.
- * @param toAddress The hex encoded user Ethereum address that will receive the funds.
- * @param amountInBaseUnits The amount (specified in baseUnits) of the token to transfer.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async transferAsync(
- tokenAddress: string,
- fromAddress: string,
- toAddress: string,
- amountInBaseUnits: BigNumber,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- assert.isETHAddressHex('toAddress', toAddress);
- await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedFromAddress = fromAddress.toLowerCase();
- const normalizedToAddress = toAddress.toLowerCase();
- assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
-
- const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
-
- const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
- if (fromAddressBalance.lessThan(amountInBaseUnits)) {
- throw new Error(ZeroExError.InsufficientBalanceForTransfer);
- }
-
- const txHash = await tokenContract.transfer.sendTransactionAsync(normalizedToAddress, amountInBaseUnits, {
- from: normalizedFromAddress,
- gas: txOpts.gasLimit,
- gasPrice: txOpts.gasPrice,
- });
- return txHash;
- }
- /**
- * Transfers `amountInBaseUnits` ERC20 tokens from `fromAddress` to `toAddress`.
- * Requires the fromAddress to have sufficient funds and to have approved an allowance of
- * `amountInBaseUnits` to `senderAddress`.
- * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
- * @param fromAddress The hex encoded user Ethereum address whose funds are being sent.
- * @param toAddress The hex encoded user Ethereum address that will receive the funds.
- * @param senderAddress The hex encoded user Ethereum address whose initiates the fund transfer. The
- * `fromAddress` must have set an allowance to the `senderAddress`
- * before this call.
- * @param amountInBaseUnits The amount (specified in baseUnits) of the token to transfer.
- * @param txOpts Transaction parameters.
- * @return Transaction hash.
- */
- public async transferFromAsync(
- tokenAddress: string,
- fromAddress: string,
- toAddress: string,
- senderAddress: string,
- amountInBaseUnits: BigNumber,
- txOpts: TransactionOpts = {},
- ): Promise<string> {
- assert.isETHAddressHex('toAddress', toAddress);
- assert.isETHAddressHex('fromAddress', fromAddress);
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
- const normalizedToAddress = toAddress.toLowerCase();
- const normalizedFromAddress = fromAddress.toLowerCase();
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- const normalizedSenderAddress = senderAddress.toLowerCase();
- assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
-
- const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
-
- const fromAddressAllowance = await this.getAllowanceAsync(
- normalizedTokenAddress,
- normalizedFromAddress,
- normalizedSenderAddress,
- );
- if (fromAddressAllowance.lessThan(amountInBaseUnits)) {
- throw new Error(ZeroExError.InsufficientAllowanceForTransfer);
- }
-
- const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
- if (fromAddressBalance.lessThan(amountInBaseUnits)) {
- throw new Error(ZeroExError.InsufficientBalanceForTransfer);
- }
-
- const txHash = await tokenContract.transferFrom.sendTransactionAsync(
- normalizedFromAddress,
- normalizedToAddress,
- amountInBaseUnits,
- {
- from: normalizedSenderAddress,
- gas: txOpts.gasLimit,
- gasPrice: txOpts.gasPrice,
- },
- );
- return txHash;
- }
- /**
- * Subscribe to an event type emitted by the Token contract.
- * @param tokenAddress The hex encoded address where the ERC20 token is deployed.
- * @param eventName The token contract event you would like to subscribe to.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
- * @param callback Callback that gets called when a log is added/removed
- * @return Subscription token used later to unsubscribe
- */
- public subscribe<ArgsType extends TokenContractEventArgs>(
- tokenAddress: string,
- eventName: TokenEvents,
- indexFilterValues: IndexedFilterValues,
- callback: EventCallback<ArgsType>,
- ): string {
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- assert.isFunction('callback', callback);
- const subscriptionToken = this._subscribe<ArgsType>(
- normalizedTokenAddress,
- eventName,
- indexFilterValues,
- artifacts.TokenArtifact.abi,
- callback,
- );
- return subscriptionToken;
- }
- /**
- * Cancel a subscription
- * @param subscriptionToken Subscription token returned by `subscribe()`
- */
- public unsubscribe(subscriptionToken: string): void {
- this._unsubscribe(subscriptionToken);
- }
- /**
- * Cancels all existing subscriptions
- */
- public unsubscribeAll(): void {
- super._unsubscribeAll();
- }
- /**
- * Gets historical logs without creating a subscription
- * @param tokenAddress An address of the token that emitted the logs.
- * @param eventName The token contract event you would like to subscribe to.
- * @param blockRange Block range to get logs from.
- * @param indexFilterValues An object where the keys are indexed args returned by the event and
- * the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
- * @return Array of logs that match the parameters
- */
- public async getLogsAsync<ArgsType extends TokenContractEventArgs>(
- tokenAddress: string,
- eventName: TokenEvents,
- blockRange: BlockRange,
- indexFilterValues: IndexedFilterValues,
- ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
- assert.isETHAddressHex('tokenAddress', tokenAddress);
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- assert.doesBelongToStringEnum('eventName', eventName, TokenEvents);
- assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
- assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
- const logs = await this._getLogsAsync<ArgsType>(
- normalizedTokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- artifacts.TokenArtifact.abi,
- );
- return logs;
- }
- private _invalidateContractInstances(): void {
- this.unsubscribeAll();
- this._tokenContractsByAddress = {};
- }
- private async _getTokenContractAsync(tokenAddress: string): Promise<TokenContract> {
- const normalizedTokenAddress = tokenAddress.toLowerCase();
- let tokenContract = this._tokenContractsByAddress[normalizedTokenAddress];
- if (!_.isUndefined(tokenContract)) {
- return tokenContract;
- }
- const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
- artifacts.TokenArtifact,
- normalizedTokenAddress,
- );
- const contractInstance = new TokenContract(this._web3Wrapper, abi, address);
- tokenContract = contractInstance;
- this._tokenContractsByAddress[normalizedTokenAddress] = tokenContract;
- return tokenContract;
- }
-}
diff --git a/packages/0x.js/src/globals.d.ts b/packages/0x.js/src/globals.d.ts
index 3e8ea21bc..94e63a32d 100644
--- a/packages/0x.js/src/globals.d.ts
+++ b/packages/0x.js/src/globals.d.ts
@@ -1,50 +1,6 @@
-declare module 'web3_beta';
-declare module 'chai-bignumber';
-declare module 'dirty-chai';
-declare module 'request-promise-native';
-declare module 'web3-provider-engine';
-declare module 'web3-provider-engine/subproviders/rpc';
-declare module 'publish-release';
-
-// semver-sort declarations
-declare module 'semver-sort' {
- const desc: (versions: string[]) => string[];
-}
-
-// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
-// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
-// disallow `namespace`, we disable tslint for the following.
-/* tslint:disable */
-declare namespace Chai {
- interface Assertion {
- bignumber: Assertion;
- // HACK: In order to comply with chai-as-promised we make eventually a `PromisedAssertion` not an `Assertion`
- eventually: PromisedAssertion;
- }
-}
-/* tslint:enable */
-
declare module '*.json' {
const json: any;
/* tslint:disable */
export default json;
/* tslint:enable */
}
-
-declare module 'ethereumjs-abi' {
- const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
-}
-
-// truffle-hdwallet-provider declarations
-declare module 'truffle-hdwallet-provider' {
- import { JSONRPCRequestPayload, JSONRPCResponsePayload } from '@0xproject/types';
- import * as Web3 from 'web3';
- class HDWalletProvider implements Web3.Provider {
- constructor(mnemonic: string, rpcUrl: string);
- public sendAsync(
- payload: JSONRPCRequestPayload,
- callback: (err: Error, result: JSONRPCResponsePayload) => void,
- ): void;
- }
- export = HDWalletProvider;
-}
diff --git a/packages/0x.js/src/globalsAugment.d.ts b/packages/0x.js/src/globalsAugment.d.ts
deleted file mode 100644
index 3e2f2216b..000000000
--- a/packages/0x.js/src/globalsAugment.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-
-// HACK: This module overrides the Chai namespace so that we can use BigNumber types inside.
-// Source: https://github.com/Microsoft/TypeScript/issues/7352#issuecomment-191547232
-declare global {
- // HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
- // interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
- // disallow `namespace`, we disable tslint for the following.
- /* tslint:disable */
- namespace Chai {
- interface NumberComparer {
- (value: number | BigNumber, message?: string): Assertion;
- }
- interface NumericComparison {
- greaterThan: NumberComparer;
- }
- }
- /* tslint:enable */
- interface DecodedLogArg {
- name: string;
- value: string | BigNumber;
- }
-}
diff --git a/packages/0x.js/src/index.ts b/packages/0x.js/src/index.ts
index e353a1d3d..2ba60e730 100644
--- a/packages/0x.js/src/index.ts
+++ b/packages/0x.js/src/index.ts
@@ -1,61 +1,66 @@
export { ZeroEx } from './0x';
+export { Web3ProviderEngine, RPCSubprovider } from '@0xproject/subproviders';
+
export {
- ZeroExError,
- EventCallback,
ExchangeContractErrs,
- ContractEvent,
- Token,
- IndexedFilterValues,
- BlockRange,
- OrderCancellationRequest,
- OrderFillRequest,
- ContractEventArgs,
- Web3Provider,
- ZeroExConfig,
- MethodOpts,
- OrderTransactionOpts,
- TransactionOpts,
- LogEvent,
- DecodedLogEvent,
- EventWatcherCallback,
- OnOrderStateChangeCallback,
+ Order,
+ SignedOrder,
+ SignerType,
+ ECSignature,
OrderStateValid,
OrderStateInvalid,
OrderState,
-} from './types';
+ Token,
+ ERC20AssetData,
+ ERC721AssetData,
+ AssetProxyId,
+} from '@0xproject/types';
export {
BlockParamLiteral,
FilterObject,
BlockParam,
- ContractEventArg,
LogWithDecodedArgs,
- Order,
- SignedOrder,
- ECSignature,
+ ContractEventArg,
+ Provider,
TransactionReceipt,
TransactionReceiptWithDecodedLogs,
-} from '@0xproject/types';
-
-export {
- EtherTokenContractEventArgs,
- WithdrawalContractEventArgs,
- DepositContractEventArgs,
- EtherTokenEvents,
-} from './contract_wrappers/generated/ether_token';
-
-export {
- TransferContractEventArgs,
- ApprovalContractEventArgs,
- TokenContractEventArgs,
- TokenEvents,
-} from './contract_wrappers/generated/token';
+} from 'ethereum-types';
export {
- LogErrorContractEventArgs,
- LogCancelContractEventArgs,
- LogFillContractEventArgs,
- ExchangeContractEventArgs,
- ExchangeEvents,
-} from './contract_wrappers/generated/exchange';
+ EventCallback,
+ ContractEvent,
+ IndexedFilterValues,
+ BlockRange,
+ OrderFillRequest,
+ ContractEventArgs,
+ MethodOpts,
+ OrderTransactionOpts,
+ TransactionOpts,
+ LogEvent,
+ DecodedLogEvent,
+ OnOrderStateChangeCallback,
+ ContractWrappersError,
+ WETH9Events,
+ WETH9WithdrawalEventArgs,
+ WETH9ApprovalEventArgs,
+ WETH9EventArgs,
+ WETH9DepositEventArgs,
+ WETH9TransferEventArgs,
+ ERC20TokenTransferEventArgs,
+ ERC20TokenApprovalEventArgs,
+ ERC20TokenEvents,
+ ERC20TokenEventArgs,
+ ERC721TokenApprovalEventArgs,
+ ERC721TokenApprovalForAllEventArgs,
+ ERC721TokenTransferEventArgs,
+ ERC721TokenEvents,
+ ExchangeCancelUpToEventArgs,
+ ExchangeAssetProxyRegisteredEventArgs,
+ ExchangeFillEventArgs,
+ ExchangeCancelEventArgs,
+ ExchangeEventArgs,
+ ContractWrappersConfig,
+ OrderInfo,
+} from '@0xproject/contract-wrappers';
diff --git a/packages/0x.js/src/order_watcher/event_watcher.ts b/packages/0x.js/src/order_watcher/event_watcher.ts
deleted file mode 100644
index 47bbd5b2e..000000000
--- a/packages/0x.js/src/order_watcher/event_watcher.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import { BlockParamLiteral, LogEntry } from '@0xproject/types';
-import { intervalUtils } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { EventWatcherCallback, ZeroExError } from '../types';
-import { assert } from '../utils/assert';
-
-const DEFAULT_EVENT_POLLING_INTERVAL_MS = 200;
-
-enum LogEventState {
- Removed,
- Added,
-}
-
-/*
- * The EventWatcher watches for blockchain events at the specified block confirmation
- * depth.
- */
-export class EventWatcher {
- private _web3Wrapper: Web3Wrapper;
- private _pollingIntervalMs: number;
- private _intervalIdIfExists?: NodeJS.Timer;
- private _lastEvents: LogEntry[] = [];
- private _stateLayer: BlockParamLiteral;
- constructor(
- web3Wrapper: Web3Wrapper,
- pollingIntervalIfExistsMs: undefined | number,
- stateLayer: BlockParamLiteral = BlockParamLiteral.Latest,
- ) {
- this._web3Wrapper = web3Wrapper;
- this._stateLayer = stateLayer;
- this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
- ? DEFAULT_EVENT_POLLING_INTERVAL_MS
- : pollingIntervalIfExistsMs;
- }
- public subscribe(callback: EventWatcherCallback): void {
- assert.isFunction('callback', callback);
- if (!_.isUndefined(this._intervalIdIfExists)) {
- throw new Error(ZeroExError.SubscriptionAlreadyPresent);
- }
- this._intervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
- this._pollForBlockchainEventsAsync.bind(this, callback),
- this._pollingIntervalMs,
- (err: Error) => {
- this.unsubscribe();
- callback(err);
- },
- );
- }
- public unsubscribe(): void {
- this._lastEvents = [];
- if (!_.isUndefined(this._intervalIdIfExists)) {
- intervalUtils.clearAsyncExcludingInterval(this._intervalIdIfExists);
- delete this._intervalIdIfExists;
- }
- }
- private async _pollForBlockchainEventsAsync(callback: EventWatcherCallback): Promise<void> {
- const pendingEvents = await this._getEventsAsync();
- if (_.isUndefined(pendingEvents)) {
- // HACK: This should never happen, but happens frequently on CI due to a ganache bug
- return;
- }
- if (pendingEvents.length === 0) {
- // HACK: Sometimes when node rebuilds the pending block we get back the empty result.
- // We don't want to emit a lot of removal events and bring them back after a couple of miliseconds,
- // that's why we just ignore those cases.
- return;
- }
- const removedEvents = _.differenceBy(this._lastEvents, pendingEvents, JSON.stringify);
- const newEvents = _.differenceBy(pendingEvents, this._lastEvents, JSON.stringify);
- await this._emitDifferencesAsync(removedEvents, LogEventState.Removed, callback);
- await this._emitDifferencesAsync(newEvents, LogEventState.Added, callback);
- this._lastEvents = pendingEvents;
- }
- private async _getEventsAsync(): Promise<LogEntry[]> {
- const eventFilter = {
- fromBlock: this._stateLayer,
- toBlock: this._stateLayer,
- };
- const events = await this._web3Wrapper.getLogsAsync(eventFilter);
- return events;
- }
- private async _emitDifferencesAsync(
- logs: LogEntry[],
- logEventState: LogEventState,
- callback: EventWatcherCallback,
- ): Promise<void> {
- for (const log of logs) {
- const logEvent = {
- removed: logEventState === LogEventState.Removed,
- ...log,
- };
- if (!_.isUndefined(this._intervalIdIfExists)) {
- callback(null, logEvent);
- }
- }
- }
-}
diff --git a/packages/0x.js/src/order_watcher/expiration_watcher.ts b/packages/0x.js/src/order_watcher/expiration_watcher.ts
deleted file mode 100644
index 00b62162d..000000000
--- a/packages/0x.js/src/order_watcher/expiration_watcher.ts
+++ /dev/null
@@ -1,75 +0,0 @@
-import { BigNumber, intervalUtils } from '@0xproject/utils';
-import { RBTree } from 'bintrees';
-import * as _ from 'lodash';
-
-import { ZeroExError } from '../types';
-import { utils } from '../utils/utils';
-
-const DEFAULT_EXPIRATION_MARGIN_MS = 0;
-const DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS = 50;
-
-/**
- * This class includes the functionality to detect expired orders.
- * It stores them in a min heap by expiration time and checks for expired ones every `orderExpirationCheckingIntervalMs`
- */
-export class ExpirationWatcher {
- private _orderHashByExpirationRBTree: RBTree<string>;
- private _expiration: { [orderHash: string]: BigNumber } = {};
- private _orderExpirationCheckingIntervalMs: number;
- private _expirationMarginMs: number;
- private _orderExpirationCheckingIntervalIdIfExists?: NodeJS.Timer;
- constructor(expirationMarginIfExistsMs?: number, orderExpirationCheckingIntervalIfExistsMs?: number) {
- this._expirationMarginMs = expirationMarginIfExistsMs || DEFAULT_EXPIRATION_MARGIN_MS;
- this._orderExpirationCheckingIntervalMs =
- expirationMarginIfExistsMs || DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS;
- const scoreFunction = (orderHash: string) => this._expiration[orderHash].toNumber();
- const comparator = (lhs: string, rhs: string) => scoreFunction(lhs) - scoreFunction(rhs);
- this._orderHashByExpirationRBTree = new RBTree(comparator);
- }
- public subscribe(callback: (orderHash: string) => void): void {
- if (!_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
- throw new Error(ZeroExError.SubscriptionAlreadyPresent);
- }
- this._orderExpirationCheckingIntervalIdIfExists = intervalUtils.setInterval(
- this._pruneExpiredOrders.bind(this, callback),
- this._orderExpirationCheckingIntervalMs,
- _.noop, // _pruneExpiredOrders never throws
- );
- }
- public unsubscribe(): void {
- if (_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
- throw new Error(ZeroExError.SubscriptionNotFound);
- }
- intervalUtils.clearInterval(this._orderExpirationCheckingIntervalIdIfExists);
- delete this._orderExpirationCheckingIntervalIdIfExists;
- }
- public addOrder(orderHash: string, expirationUnixTimestampMs: BigNumber): void {
- this._expiration[orderHash] = expirationUnixTimestampMs;
- this._orderHashByExpirationRBTree.insert(orderHash);
- }
- public removeOrder(orderHash: string): void {
- this._orderHashByExpirationRBTree.remove(orderHash);
- delete this._expiration[orderHash];
- }
- private _pruneExpiredOrders(callback: (orderHash: string) => void): void {
- const currentUnixTimestampMs = utils.getCurrentUnixTimestampMs();
- while (true) {
- const hasTrakedOrders = this._orderHashByExpirationRBTree.size === 0;
- if (hasTrakedOrders) {
- break;
- }
- const nextOrderHashToExpire = this._orderHashByExpirationRBTree.min();
- const hasNoExpiredOrders = this._expiration[nextOrderHashToExpire].greaterThan(
- currentUnixTimestampMs.plus(this._expirationMarginMs),
- );
- const isSubscriptionActive = _.isUndefined(this._orderExpirationCheckingIntervalIdIfExists);
- if (hasNoExpiredOrders || isSubscriptionActive) {
- break;
- }
- const orderHash = this._orderHashByExpirationRBTree.min();
- this._orderHashByExpirationRBTree.remove(orderHash);
- delete this._expiration[orderHash];
- callback(orderHash);
- }
- }
-}
diff --git a/packages/0x.js/src/order_watcher/order_state_watcher.ts b/packages/0x.js/src/order_watcher/order_state_watcher.ts
deleted file mode 100644
index cd6016c5a..000000000
--- a/packages/0x.js/src/order_watcher/order_state_watcher.ts
+++ /dev/null
@@ -1,384 +0,0 @@
-import { schemas } from '@0xproject/json-schemas';
-import { BlockParamLiteral, LogWithDecodedArgs, SignedOrder } from '@0xproject/types';
-import { AbiDecoder, intervalUtils } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { ZeroEx } from '../0x';
-import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
-import {
- DepositContractEventArgs,
- EtherTokenEvents,
- WithdrawalContractEventArgs,
-} from '../contract_wrappers/generated/ether_token';
-import {
- ExchangeEvents,
- LogCancelContractEventArgs,
- LogFillContractEventArgs,
-} from '../contract_wrappers/generated/exchange';
-import {
- ApprovalContractEventArgs,
- TokenEvents,
- TransferContractEventArgs,
-} from '../contract_wrappers/generated/token';
-import { TokenWrapper } from '../contract_wrappers/token_wrapper';
-import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store';
-import { OrderFilledCancelledLazyStore } from '../stores/order_filled_cancelled_lazy_store';
-import {
- ContractEventArgs,
- ExchangeContractErrs,
- LogEvent,
- OnOrderStateChangeCallback,
- OrderState,
- OrderStateWatcherConfig,
- ZeroExError,
-} from '../types';
-import { assert } from '../utils/assert';
-import { OrderStateUtils } from '../utils/order_state_utils';
-import { utils } from '../utils/utils';
-
-import { EventWatcher } from './event_watcher';
-import { ExpirationWatcher } from './expiration_watcher';
-
-interface DependentOrderHashes {
- [makerAddress: string]: {
- [makerToken: string]: Set<string>;
- };
-}
-
-interface OrderByOrderHash {
- [orderHash: string]: SignedOrder;
-}
-
-interface OrderStateByOrderHash {
- [orderHash: string]: OrderState;
-}
-
-const DEFAULT_CLEANUP_JOB_INTERVAL_MS = 1000 * 60 * 60; // 1h
-
-/**
- * This class includes all the functionality related to watching a set of orders
- * for potential changes in order validity/fillability. The orderWatcher notifies
- * the subscriber of these changes so that a final decision can be made on whether
- * the order should be deemed invalid.
- */
-export class OrderStateWatcher {
- private _orderStateByOrderHashCache: OrderStateByOrderHash = {};
- private _orderByOrderHash: OrderByOrderHash = {};
- private _dependentOrderHashes: DependentOrderHashes = {};
- private _callbackIfExists?: OnOrderStateChangeCallback;
- private _eventWatcher: EventWatcher;
- private _web3Wrapper: Web3Wrapper;
- private _abiDecoder: AbiDecoder;
- private _expirationWatcher: ExpirationWatcher;
- private _orderStateUtils: OrderStateUtils;
- private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
- private _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
- private _cleanupJobInterval: number;
- private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
- constructor(
- web3Wrapper: Web3Wrapper,
- abiDecoder: AbiDecoder,
- token: TokenWrapper,
- exchange: ExchangeWrapper,
- config?: OrderStateWatcherConfig,
- ) {
- this._abiDecoder = abiDecoder;
- this._web3Wrapper = web3Wrapper;
- const pollingIntervalIfExistsMs = _.isUndefined(config) ? undefined : config.eventPollingIntervalMs;
- const stateLayer =
- _.isUndefined(config) || _.isUndefined(config.stateLayer) ? BlockParamLiteral.Latest : config.stateLayer;
- this._eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalIfExistsMs, stateLayer);
- this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(token, stateLayer);
- this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(exchange);
- this._orderStateUtils = new OrderStateUtils(
- this._balanceAndProxyAllowanceLazyStore,
- this._orderFilledCancelledLazyStore,
- );
- const orderExpirationCheckingIntervalMsIfExists = _.isUndefined(config)
- ? undefined
- : config.orderExpirationCheckingIntervalMs;
- const expirationMarginIfExistsMs = _.isUndefined(config) ? undefined : config.expirationMarginMs;
- this._expirationWatcher = new ExpirationWatcher(
- expirationMarginIfExistsMs,
- orderExpirationCheckingIntervalMsIfExists,
- );
- this._cleanupJobInterval =
- _.isUndefined(config) || _.isUndefined(config.cleanupJobIntervalMs)
- ? DEFAULT_CLEANUP_JOB_INTERVAL_MS
- : config.cleanupJobIntervalMs;
- }
- /**
- * Add an order to the orderStateWatcher. Before the order is added, it's
- * signature is verified.
- * @param signedOrder The order you wish to start watching.
- */
- public addOrder(signedOrder: SignedOrder): void {
- assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- assert.isValidSignature(orderHash, signedOrder.ecSignature, signedOrder.maker);
- this._orderByOrderHash[orderHash] = signedOrder;
- this._addToDependentOrderHashes(signedOrder, orderHash);
- const expirationUnixTimestampMs = signedOrder.expirationUnixTimestampSec.times(1000);
- this._expirationWatcher.addOrder(orderHash, expirationUnixTimestampMs);
- }
- /**
- * Removes an order from the orderStateWatcher
- * @param orderHash The orderHash of the order you wish to stop watching.
- */
- public removeOrder(orderHash: string): void {
- assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
- const signedOrder = this._orderByOrderHash[orderHash];
- if (_.isUndefined(signedOrder)) {
- return; // noop
- }
- delete this._orderByOrderHash[orderHash];
- delete this._orderStateByOrderHashCache[orderHash];
- const exchange = (this._orderFilledCancelledLazyStore as any)._exchange as ExchangeWrapper;
- const zrxTokenAddress = exchange.getZRXTokenAddress();
-
- this._removeFromDependentOrderHashes(signedOrder.maker, zrxTokenAddress, orderHash);
- if (zrxTokenAddress !== signedOrder.makerTokenAddress) {
- this._removeFromDependentOrderHashes(signedOrder.maker, signedOrder.makerTokenAddress, orderHash);
- }
-
- this._expirationWatcher.removeOrder(orderHash);
- }
- /**
- * Starts an orderStateWatcher subscription. The callback will be called every time a watched order's
- * backing blockchain state has changed. This is a call-to-action for the caller to re-validate the order.
- * @param callback Receives the orderHash of the order that should be re-validated, together
- * with all the order-relevant blockchain state needed to re-validate the order.
- */
- public subscribe(callback: OnOrderStateChangeCallback): void {
- assert.isFunction('callback', callback);
- if (!_.isUndefined(this._callbackIfExists)) {
- throw new Error(ZeroExError.SubscriptionAlreadyPresent);
- }
- this._callbackIfExists = callback;
- this._eventWatcher.subscribe(this._onEventWatcherCallbackAsync.bind(this));
- this._expirationWatcher.subscribe(this._onOrderExpired.bind(this));
- this._cleanupJobIntervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
- this._cleanupAsync.bind(this),
- this._cleanupJobInterval,
- (err: Error) => {
- this.unsubscribe();
- callback(err);
- },
- );
- }
- /**
- * Ends an orderStateWatcher subscription.
- */
- public unsubscribe(): void {
- if (_.isUndefined(this._callbackIfExists) || _.isUndefined(this._cleanupJobIntervalIdIfExists)) {
- throw new Error(ZeroExError.SubscriptionNotFound);
- }
- this._balanceAndProxyAllowanceLazyStore.deleteAll();
- this._orderFilledCancelledLazyStore.deleteAll();
- delete this._callbackIfExists;
- this._eventWatcher.unsubscribe();
- this._expirationWatcher.unsubscribe();
- intervalUtils.clearAsyncExcludingInterval(this._cleanupJobIntervalIdIfExists);
- }
- private async _cleanupAsync(): Promise<void> {
- for (const orderHash of _.keys(this._orderByOrderHash)) {
- this._cleanupOrderRelatedState(orderHash);
- await this._emitRevalidateOrdersAsync([orderHash]);
- }
- }
- private _cleanupOrderRelatedState(orderHash: string): void {
- const signedOrder = this._orderByOrderHash[orderHash];
-
- this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(orderHash);
- this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(orderHash);
-
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.makerTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(signedOrder.makerTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.takerTokenAddress, signedOrder.taker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(signedOrder.takerTokenAddress, signedOrder.taker);
-
- const zrxTokenAddress = this._getZRXTokenAddress();
- if (!signedOrder.makerFee.isZero()) {
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxTokenAddress, signedOrder.maker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxTokenAddress, signedOrder.maker);
- }
- if (!signedOrder.takerFee.isZero()) {
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxTokenAddress, signedOrder.taker);
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxTokenAddress, signedOrder.taker);
- }
- }
- private _onOrderExpired(orderHash: string): void {
- const orderState: OrderState = {
- isValid: false,
- orderHash,
- error: ExchangeContractErrs.OrderFillExpired,
- };
- if (!_.isUndefined(this._orderByOrderHash[orderHash])) {
- this.removeOrder(orderHash);
- if (!_.isUndefined(this._callbackIfExists)) {
- this._callbackIfExists(null, orderState);
- }
- }
- }
- private async _onEventWatcherCallbackAsync(err: Error | null, logIfExists?: LogEvent): Promise<void> {
- if (!_.isNull(err)) {
- if (!_.isUndefined(this._callbackIfExists)) {
- this._callbackIfExists(err);
- this.unsubscribe();
- }
- return;
- }
- const log = logIfExists as LogEvent; // At this moment we are sure that no error occured and log is defined.
- const maybeDecodedLog = this._abiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(log);
- const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
- if (!isLogDecoded) {
- return; // noop
- }
- const decodedLog = (maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>;
- let makerToken: string;
- let makerAddress: string;
- switch (decodedLog.event) {
- case TokenEvents.Approval: {
- // Invalidate cache
- const args = decodedLog.args as ApprovalContractEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(decodedLog.address, args._owner);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
- break;
- }
- case TokenEvents.Transfer: {
- // Invalidate cache
- const args = decodedLog.args as TransferContractEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._from);
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._to);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._from;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
- break;
- }
- case EtherTokenEvents.Deposit: {
- // Invalidate cache
- const args = decodedLog.args as DepositContractEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._owner);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
- break;
- }
- case EtherTokenEvents.Withdrawal: {
- // Invalidate cache
- const args = decodedLog.args as WithdrawalContractEventArgs;
- this._balanceAndProxyAllowanceLazyStore.deleteBalance(decodedLog.address, args._owner);
- // Revalidate orders
- makerToken = decodedLog.address;
- makerAddress = args._owner;
- if (
- !_.isUndefined(this._dependentOrderHashes[makerAddress]) &&
- !_.isUndefined(this._dependentOrderHashes[makerAddress][makerToken])
- ) {
- const orderHashes = Array.from(this._dependentOrderHashes[makerAddress][makerToken]);
- await this._emitRevalidateOrdersAsync(orderHashes);
- }
- break;
- }
- case ExchangeEvents.LogFill: {
- // Invalidate cache
- const args = decodedLog.args as LogFillContractEventArgs;
- this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(args.orderHash);
- // Revalidate orders
- const orderHash = args.orderHash;
- const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
- if (isOrderWatched) {
- await this._emitRevalidateOrdersAsync([orderHash]);
- }
- break;
- }
- case ExchangeEvents.LogCancel: {
- // Invalidate cache
- const args = decodedLog.args as LogCancelContractEventArgs;
- this._orderFilledCancelledLazyStore.deleteCancelledTakerAmount(args.orderHash);
- // Revalidate orders
- const orderHash = args.orderHash;
- const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
- if (isOrderWatched) {
- await this._emitRevalidateOrdersAsync([orderHash]);
- }
- break;
- }
- case ExchangeEvents.LogError:
- return; // noop
-
- default:
- throw utils.spawnSwitchErr('decodedLog.event', decodedLog.event);
- }
- }
- private async _emitRevalidateOrdersAsync(orderHashes: string[]): Promise<void> {
- for (const orderHash of orderHashes) {
- const signedOrder = this._orderByOrderHash[orderHash];
- // Most of these calls will never reach the network because the data is fetched from stores
- // and only updated when cache is invalidated
- const orderState = await this._orderStateUtils.getOrderStateAsync(signedOrder);
- if (_.isUndefined(this._callbackIfExists)) {
- break; // Unsubscribe was called
- }
- if (_.isEqual(orderState, this._orderStateByOrderHashCache[orderHash])) {
- // Actual order state didn't change
- continue;
- } else {
- this._orderStateByOrderHashCache[orderHash] = orderState;
- }
- this._callbackIfExists(null, orderState);
- }
- }
- private _addToDependentOrderHashes(signedOrder: SignedOrder, orderHash: string): void {
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker])) {
- this._dependentOrderHashes[signedOrder.maker] = {};
- }
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress])) {
- this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress] = new Set();
- }
- this._dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress].add(orderHash);
- const zrxTokenAddress = this._getZRXTokenAddress();
- if (_.isUndefined(this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress])) {
- this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress] = new Set();
- }
- this._dependentOrderHashes[signedOrder.maker][zrxTokenAddress].add(orderHash);
- }
- private _removeFromDependentOrderHashes(makerAddress: string, tokenAddress: string, orderHash: string) {
- this._dependentOrderHashes[makerAddress][tokenAddress].delete(orderHash);
- if (this._dependentOrderHashes[makerAddress][tokenAddress].size === 0) {
- delete this._dependentOrderHashes[makerAddress][tokenAddress];
- }
- if (_.isEmpty(this._dependentOrderHashes[makerAddress])) {
- delete this._dependentOrderHashes[makerAddress];
- }
- }
- private _getZRXTokenAddress(): string {
- const exchange = (this._orderFilledCancelledLazyStore as any)._exchange as ExchangeWrapper;
- const zrxTokenAddress = exchange.getZRXTokenAddress();
- return zrxTokenAddress;
- }
-}
diff --git a/packages/0x.js/src/order_watcher/remaining_fillable_calculator.ts b/packages/0x.js/src/order_watcher/remaining_fillable_calculator.ts
deleted file mode 100644
index 184c13aa4..000000000
--- a/packages/0x.js/src/order_watcher/remaining_fillable_calculator.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import { SignedOrder } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-
-export class RemainingFillableCalculator {
- private _signedOrder: SignedOrder;
- private _isMakerTokenZRX: boolean;
- // Transferrable Amount is the minimum of Approval and Balance
- private _transferrableMakerTokenAmount: BigNumber;
- private _transferrableMakerFeeTokenAmount: BigNumber;
- private _remainingMakerTokenAmount: BigNumber;
- private _remainingMakerFeeAmount: BigNumber;
- constructor(
- signedOrder: SignedOrder,
- isMakerTokenZRX: boolean,
- transferrableMakerTokenAmount: BigNumber,
- transferrableMakerFeeTokenAmount: BigNumber,
- remainingMakerTokenAmount: BigNumber,
- ) {
- this._signedOrder = signedOrder;
- this._isMakerTokenZRX = isMakerTokenZRX;
- this._transferrableMakerTokenAmount = transferrableMakerTokenAmount;
- this._transferrableMakerFeeTokenAmount = transferrableMakerFeeTokenAmount;
- this._remainingMakerTokenAmount = remainingMakerTokenAmount;
- this._remainingMakerFeeAmount = remainingMakerTokenAmount
- .times(signedOrder.makerFee)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- }
- public computeRemainingMakerFillable(): BigNumber {
- if (this._hasSufficientFundsForFeeAndTransferAmount()) {
- return this._remainingMakerTokenAmount;
- }
- if (this._signedOrder.makerFee.isZero()) {
- return BigNumber.min(this._remainingMakerTokenAmount, this._transferrableMakerTokenAmount);
- }
- return this._calculatePartiallyFillableMakerTokenAmount();
- }
- public computeRemainingTakerFillable(): BigNumber {
- return this.computeRemainingMakerFillable()
- .times(this._signedOrder.takerTokenAmount)
- .dividedToIntegerBy(this._signedOrder.makerTokenAmount);
- }
- private _hasSufficientFundsForFeeAndTransferAmount(): boolean {
- if (this._isMakerTokenZRX) {
- const totalZRXTransferAmountRequired = this._remainingMakerTokenAmount.plus(this._remainingMakerFeeAmount);
- const hasSufficientFunds = this._transferrableMakerTokenAmount.greaterThanOrEqualTo(
- totalZRXTransferAmountRequired,
- );
- return hasSufficientFunds;
- } else {
- const hasSufficientFundsForTransferAmount = this._transferrableMakerTokenAmount.greaterThanOrEqualTo(
- this._remainingMakerTokenAmount,
- );
- const hasSufficientFundsForFeeAmount = this._transferrableMakerFeeTokenAmount.greaterThanOrEqualTo(
- this._remainingMakerFeeAmount,
- );
- const hasSufficientFunds = hasSufficientFundsForTransferAmount && hasSufficientFundsForFeeAmount;
- return hasSufficientFunds;
- }
- }
- private _calculatePartiallyFillableMakerTokenAmount(): BigNumber {
- // Given an order for 200 wei for 2 ZRXwei fee, find 100 wei for 1 ZRXwei. Order ratio is then 100:1
- const orderToFeeRatio = this._signedOrder.makerTokenAmount.dividedBy(this._signedOrder.makerFee);
- // The number of times the maker can fill the order, if each fill only required the transfer of a single
- // baseUnit of fee tokens.
- // Given 2 ZRXwei, the maximum amount of times Maker can fill this order, in terms of fees, is 2
- const fillableTimesInFeeTokenBaseUnits = BigNumber.min(
- this._transferrableMakerFeeTokenAmount,
- this._remainingMakerFeeAmount,
- );
- // The number of times the Maker can fill the order, given the Maker Token Balance
- // Assuming a balance of 150 wei, and an orderToFeeRatio of 100:1, maker can fill this order 1 time.
- let fillableTimesInMakerTokenUnits = this._transferrableMakerTokenAmount.dividedBy(orderToFeeRatio);
- if (this._isMakerTokenZRX) {
- // If ZRX is the maker token, the Fee and the Maker amount need to be removed from the same pool;
- // 200 ZRXwei for 2ZRXwei fee can only be filled once (need 202 ZRXwei)
- const totalZRXTokenPooled = this._transferrableMakerTokenAmount;
- // The purchasing power here is less as the tokens are taken from the same Pool
- // For every one number of fills, we have to take an extra ZRX out of the pool
- fillableTimesInMakerTokenUnits = totalZRXTokenPooled.dividedBy(orderToFeeRatio.plus(new BigNumber(1)));
- }
- // When Ratio is not fully divisible there can be remainders which cannot be represented, so they are floored.
- // This can result in a RoundingError being thrown by the Exchange Contract.
- const partiallyFillableMakerTokenAmount = fillableTimesInMakerTokenUnits
- .times(this._signedOrder.makerTokenAmount)
- .dividedToIntegerBy(this._signedOrder.makerFee);
- const partiallyFillableFeeTokenAmount = fillableTimesInFeeTokenBaseUnits
- .times(this._signedOrder.makerTokenAmount)
- .dividedToIntegerBy(this._signedOrder.makerFee);
- const partiallyFillableAmount = BigNumber.min(
- partiallyFillableMakerTokenAmount,
- partiallyFillableFeeTokenAmount,
- );
- return partiallyFillableAmount;
- }
-}
diff --git a/packages/0x.js/src/schemas/zero_ex_private_network_config_schema.ts b/packages/0x.js/src/schemas/zero_ex_private_network_config_schema.ts
index f7f649a6d..378b86e77 100644
--- a/packages/0x.js/src/schemas/zero_ex_private_network_config_schema.ts
+++ b/packages/0x.js/src/schemas/zero_ex_private_network_config_schema.ts
@@ -8,8 +8,8 @@ export const zeroExPrivateNetworkConfigSchema = {
gasPrice: { $ref: '/Number' },
zrxContractAddress: { $ref: '/Address' },
exchangeContractAddress: { $ref: '/Address' },
- tokenRegistryContractAddress: { $ref: '/Address' },
- tokenTransferProxyContractAddress: { $ref: '/Address' },
+ erc20ProxyContractAddress: { $ref: '/Address' },
+ erc721ProxyContractAddress: { $ref: '/Address' },
orderWatcherConfig: {
type: 'object',
properties: {
@@ -29,7 +29,7 @@ export const zeroExPrivateNetworkConfigSchema = {
'networkId',
'zrxContractAddress',
'exchangeContractAddress',
- 'tokenRegistryContractAddress',
- 'tokenTransferProxyContractAddress',
+ 'erc20ProxyContractAddress',
+ 'erc721ProxyContractAddress',
],
};
diff --git a/packages/0x.js/src/schemas/zero_ex_public_network_config_schema.ts b/packages/0x.js/src/schemas/zero_ex_public_network_config_schema.ts
index 9da31481a..f2a9a4d56 100644
--- a/packages/0x.js/src/schemas/zero_ex_public_network_config_schema.ts
+++ b/packages/0x.js/src/schemas/zero_ex_public_network_config_schema.ts
@@ -1,15 +1,29 @@
+const networkNameToId: { [networkName: string]: number } = {
+ mainnet: 1,
+ ropsten: 3,
+ rinkeby: 4,
+ kovan: 42,
+ ganache: 50,
+};
+
export const zeroExPublicNetworkConfigSchema = {
id: '/ZeroExPublicNetworkConfig',
properties: {
networkId: {
type: 'number',
- enum: [1, 3, 4, 42, 50],
+ enum: [
+ networkNameToId.mainnet,
+ networkNameToId.ropsten,
+ networkNameToId.rinkeby,
+ networkNameToId.kovan,
+ networkNameToId.ganache,
+ ],
},
gasPrice: { $ref: '/Number' },
zrxContractAddress: { $ref: '/Address' },
exchangeContractAddress: { $ref: '/Address' },
- tokenRegistryContractAddress: { $ref: '/Address' },
- tokenTransferProxyContractAddress: { $ref: '/Address' },
+ erc20ProxyContractAddress: { $ref: '/Address' },
+ erc721ProxyContractAddress: { $ref: '/Address' },
orderWatcherConfig: {
type: 'object',
properties: {
diff --git a/packages/0x.js/src/stores/balance_proxy_allowance_lazy_store.ts b/packages/0x.js/src/stores/balance_proxy_allowance_lazy_store.ts
deleted file mode 100644
index ede1319fe..000000000
--- a/packages/0x.js/src/stores/balance_proxy_allowance_lazy_store.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { TokenWrapper } from '../contract_wrappers/token_wrapper';
-
-/**
- * Copy on read store for balances/proxyAllowances of tokens/accounts
- */
-export class BalanceAndProxyAllowanceLazyStore {
- private _token: TokenWrapper;
- private _defaultBlock: BlockParamLiteral;
- private _balance: {
- [tokenAddress: string]: {
- [userAddress: string]: BigNumber;
- };
- };
- private _proxyAllowance: {
- [tokenAddress: string]: {
- [userAddress: string]: BigNumber;
- };
- };
- constructor(token: TokenWrapper, defaultBlock: BlockParamLiteral) {
- this._token = token;
- this._defaultBlock = defaultBlock;
- this._balance = {};
- this._proxyAllowance = {};
- }
- public async getBalanceAsync(tokenAddress: string, userAddress: string): Promise<BigNumber> {
- if (_.isUndefined(this._balance[tokenAddress]) || _.isUndefined(this._balance[tokenAddress][userAddress])) {
- const methodOpts = {
- defaultBlock: this._defaultBlock,
- };
- const balance = await this._token.getBalanceAsync(tokenAddress, userAddress, methodOpts);
- this.setBalance(tokenAddress, userAddress, balance);
- }
- const cachedBalance = this._balance[tokenAddress][userAddress];
- return cachedBalance;
- }
- public setBalance(tokenAddress: string, userAddress: string, balance: BigNumber): void {
- if (_.isUndefined(this._balance[tokenAddress])) {
- this._balance[tokenAddress] = {};
- }
- this._balance[tokenAddress][userAddress] = balance;
- }
- public deleteBalance(tokenAddress: string, userAddress: string): void {
- if (!_.isUndefined(this._balance[tokenAddress])) {
- delete this._balance[tokenAddress][userAddress];
- if (_.isEmpty(this._balance[tokenAddress])) {
- delete this._balance[tokenAddress];
- }
- }
- }
- public async getProxyAllowanceAsync(tokenAddress: string, userAddress: string): Promise<BigNumber> {
- if (
- _.isUndefined(this._proxyAllowance[tokenAddress]) ||
- _.isUndefined(this._proxyAllowance[tokenAddress][userAddress])
- ) {
- const methodOpts = {
- defaultBlock: this._defaultBlock,
- };
- const proxyAllowance = await this._token.getProxyAllowanceAsync(tokenAddress, userAddress, methodOpts);
- this.setProxyAllowance(tokenAddress, userAddress, proxyAllowance);
- }
- const cachedProxyAllowance = this._proxyAllowance[tokenAddress][userAddress];
- return cachedProxyAllowance;
- }
- public setProxyAllowance(tokenAddress: string, userAddress: string, proxyAllowance: BigNumber): void {
- if (_.isUndefined(this._proxyAllowance[tokenAddress])) {
- this._proxyAllowance[tokenAddress] = {};
- }
- this._proxyAllowance[tokenAddress][userAddress] = proxyAllowance;
- }
- public deleteProxyAllowance(tokenAddress: string, userAddress: string): void {
- if (!_.isUndefined(this._proxyAllowance[tokenAddress])) {
- delete this._proxyAllowance[tokenAddress][userAddress];
- if (_.isEmpty(this._proxyAllowance[tokenAddress])) {
- delete this._proxyAllowance[tokenAddress];
- }
- }
- }
- public deleteAll(): void {
- this._balance = {};
- this._proxyAllowance = {};
- }
-}
diff --git a/packages/0x.js/src/stores/order_filled_cancelled_lazy_store.ts b/packages/0x.js/src/stores/order_filled_cancelled_lazy_store.ts
deleted file mode 100644
index 0a0d93406..000000000
--- a/packages/0x.js/src/stores/order_filled_cancelled_lazy_store.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
-
-/**
- * Copy on read store for filled/cancelled taker amounts
- */
-export class OrderFilledCancelledLazyStore {
- private _exchange: ExchangeWrapper;
- private _filledTakerAmount: {
- [orderHash: string]: BigNumber;
- };
- private _cancelledTakerAmount: {
- [orderHash: string]: BigNumber;
- };
- constructor(exchange: ExchangeWrapper) {
- this._exchange = exchange;
- this._filledTakerAmount = {};
- this._cancelledTakerAmount = {};
- }
- public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
- if (_.isUndefined(this._filledTakerAmount[orderHash])) {
- const methodOpts = {
- defaultBlock: BlockParamLiteral.Pending,
- };
- const filledTakerAmount = await this._exchange.getFilledTakerAmountAsync(orderHash, methodOpts);
- this.setFilledTakerAmount(orderHash, filledTakerAmount);
- }
- const cachedFilled = this._filledTakerAmount[orderHash];
- return cachedFilled;
- }
- public setFilledTakerAmount(orderHash: string, filledTakerAmount: BigNumber): void {
- this._filledTakerAmount[orderHash] = filledTakerAmount;
- }
- public deleteFilledTakerAmount(orderHash: string): void {
- delete this._filledTakerAmount[orderHash];
- }
- public async getCancelledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
- if (_.isUndefined(this._cancelledTakerAmount[orderHash])) {
- const methodOpts = {
- defaultBlock: BlockParamLiteral.Pending,
- };
- const cancelledTakerAmount = await this._exchange.getCancelledTakerAmountAsync(orderHash, methodOpts);
- this.setCancelledTakerAmount(orderHash, cancelledTakerAmount);
- }
- const cachedCancelled = this._cancelledTakerAmount[orderHash];
- return cachedCancelled;
- }
- public setCancelledTakerAmount(orderHash: string, cancelledTakerAmount: BigNumber): void {
- this._cancelledTakerAmount[orderHash] = cancelledTakerAmount;
- }
- public deleteCancelledTakerAmount(orderHash: string): void {
- delete this._cancelledTakerAmount[orderHash];
- }
- public deleteAll(): void {
- this._filledTakerAmount = {};
- this._cancelledTakerAmount = {};
- }
-}
diff --git a/packages/0x.js/src/types.ts b/packages/0x.js/src/types.ts
index 7f1f140ca..651b15abd 100644
--- a/packages/0x.js/src/types.ts
+++ b/packages/0x.js/src/types.ts
@@ -1,286 +1,7 @@
-import { BigNumber } from '@0xproject/utils';
-
-import {
- BlockParam,
- BlockParamLiteral,
- ContractAbi,
- ContractEventArg,
- FilterObject,
- LogEntryEvent,
- LogWithDecodedArgs,
- Order,
- SignedOrder,
-} from '@0xproject/types';
-
-import * as Web3 from 'web3';
-
-import { EtherTokenContractEventArgs, EtherTokenEvents } from './contract_wrappers/generated/ether_token';
-import { ExchangeContractEventArgs, ExchangeEvents } from './contract_wrappers/generated/exchange';
-import { TokenContractEventArgs, TokenEvents } from './contract_wrappers/generated/token';
-
-export enum ZeroExError {
- ExchangeContractDoesNotExist = 'EXCHANGE_CONTRACT_DOES_NOT_EXIST',
- ZRXContractDoesNotExist = 'ZRX_CONTRACT_DOES_NOT_EXIST',
- EtherTokenContractDoesNotExist = 'ETHER_TOKEN_CONTRACT_DOES_NOT_EXIST',
- TokenTransferProxyContractDoesNotExist = 'TOKEN_TRANSFER_PROXY_CONTRACT_DOES_NOT_EXIST',
- TokenRegistryContractDoesNotExist = 'TOKEN_REGISTRY_CONTRACT_DOES_NOT_EXIST',
- TokenContractDoesNotExist = 'TOKEN_CONTRACT_DOES_NOT_EXIST',
- UnhandledError = 'UNHANDLED_ERROR',
- UserHasNoAssociatedAddress = 'USER_HAS_NO_ASSOCIATED_ADDRESSES',
- InvalidSignature = 'INVALID_SIGNATURE',
- ContractNotDeployedOnNetwork = 'CONTRACT_NOT_DEPLOYED_ON_NETWORK',
- InsufficientAllowanceForTransfer = 'INSUFFICIENT_ALLOWANCE_FOR_TRANSFER',
- InsufficientBalanceForTransfer = 'INSUFFICIENT_BALANCE_FOR_TRANSFER',
- InsufficientEthBalanceForDeposit = 'INSUFFICIENT_ETH_BALANCE_FOR_DEPOSIT',
- InsufficientWEthBalanceForWithdrawal = 'INSUFFICIENT_WETH_BALANCE_FOR_WITHDRAWAL',
- InvalidJump = 'INVALID_JUMP',
- OutOfGas = 'OUT_OF_GAS',
- NoNetworkId = 'NO_NETWORK_ID',
- SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
- SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
- TransactionMiningTimeout = 'TRANSACTION_MINING_TIMEOUT',
-}
-
export enum InternalZeroExError {
NoAbiDecoder = 'NO_ABI_DECODER',
ZrxNotInTokenRegistry = 'ZRX_NOT_IN_TOKEN_REGISTRY',
WethNotInTokenRegistry = 'WETH_NOT_IN_TOKEN_REGISTRY',
}
-export type OrderAddresses = [string, string, string, string, string];
-
-export type OrderValues = [BigNumber, BigNumber, BigNumber, BigNumber, BigNumber, BigNumber];
-
-export type LogEvent = LogEntryEvent;
-export interface DecodedLogEvent<ArgsType> {
- isRemoved: boolean;
- log: LogWithDecodedArgs<ArgsType>;
-}
-
-export type EventCallback<ArgsType> = (err: null | Error, log?: DecodedLogEvent<ArgsType>) => void;
-export type EventWatcherCallback = (err: null | Error, log?: LogEvent) => void;
-
-export enum ExchangeContractErrCodes {
- ERROR_FILL_EXPIRED, // Order has already expired
- ERROR_FILL_NO_VALUE, // Order has already been fully filled or cancelled
- ERROR_FILL_TRUNCATION, // Rounding error too large
- ERROR_FILL_BALANCE_ALLOWANCE, // Insufficient balance or allowance for token transfer
- ERROR_CANCEL_EXPIRED, // Order has already expired
- ERROR_CANCEL_NO_VALUE, // Order has already been fully filled or cancelled
-}
-
-export enum ExchangeContractErrs {
- OrderFillExpired = 'ORDER_FILL_EXPIRED',
- OrderCancelExpired = 'ORDER_CANCEL_EXPIRED',
- OrderCancelAmountZero = 'ORDER_CANCEL_AMOUNT_ZERO',
- OrderAlreadyCancelledOrFilled = 'ORDER_ALREADY_CANCELLED_OR_FILLED',
- OrderFillAmountZero = 'ORDER_FILL_AMOUNT_ZERO',
- OrderRemainingFillAmountZero = 'ORDER_REMAINING_FILL_AMOUNT_ZERO',
- OrderFillRoundingError = 'ORDER_FILL_ROUNDING_ERROR',
- FillBalanceAllowanceError = 'FILL_BALANCE_ALLOWANCE_ERROR',
- InsufficientTakerBalance = 'INSUFFICIENT_TAKER_BALANCE',
- InsufficientTakerAllowance = 'INSUFFICIENT_TAKER_ALLOWANCE',
- InsufficientMakerBalance = 'INSUFFICIENT_MAKER_BALANCE',
- InsufficientMakerAllowance = 'INSUFFICIENT_MAKER_ALLOWANCE',
- InsufficientTakerFeeBalance = 'INSUFFICIENT_TAKER_FEE_BALANCE',
- InsufficientTakerFeeAllowance = 'INSUFFICIENT_TAKER_FEE_ALLOWANCE',
- InsufficientMakerFeeBalance = 'INSUFFICIENT_MAKER_FEE_BALANCE',
- InsufficientMakerFeeAllowance = 'INSUFFICIENT_MAKER_FEE_ALLOWANCE',
- TransactionSenderIsNotFillOrderTaker = 'TRANSACTION_SENDER_IS_NOT_FILL_ORDER_TAKER',
- MultipleMakersInSingleCancelBatchDisallowed = 'MULTIPLE_MAKERS_IN_SINGLE_CANCEL_BATCH_DISALLOWED',
- InsufficientRemainingFillAmount = 'INSUFFICIENT_REMAINING_FILL_AMOUNT',
- MultipleTakerTokensInFillUpToDisallowed = 'MULTIPLE_TAKER_TOKENS_IN_FILL_UP_TO_DISALLOWED',
- BatchOrdersMustHaveSameExchangeAddress = 'BATCH_ORDERS_MUST_HAVE_SAME_EXCHANGE_ADDRESS',
- BatchOrdersMustHaveAtLeastOneItem = 'BATCH_ORDERS_MUST_HAVE_AT_LEAST_ONE_ITEM',
-}
-
-export interface ContractEvent {
- logIndex: number;
- transactionIndex: number;
- transactionHash: string;
- blockHash: string;
- blockNumber: number;
- address: string;
- type: string;
- event: string;
- args: ContractEventArgs;
-}
-
-export type ContractEventArgs = ExchangeContractEventArgs | TokenContractEventArgs | EtherTokenContractEventArgs;
-
-// [address, name, symbol, decimals, ipfsHash, swarmHash]
-export type TokenMetadata = [string, string, string, number, string, string];
-
-export interface Token {
- name: string;
- address: string;
- symbol: string;
- decimals: number;
-}
-
-export interface TxOpts {
- from: string;
- gas?: number;
- value?: BigNumber;
- gasPrice?: BigNumber;
-}
-
-export interface TokenAddressBySymbol {
- [symbol: string]: string;
-}
-
-export type ContractEvents = TokenEvents | ExchangeEvents | EtherTokenEvents;
-
-export interface IndexedFilterValues {
- [index: string]: ContractEventArg;
-}
-
-export interface BlockRange {
- fromBlock: BlockParam;
- toBlock: BlockParam;
-}
-
-export type DoneCallback = (err?: Error) => void;
-
-export interface OrderCancellationRequest {
- order: Order | SignedOrder;
- takerTokenCancelAmount: BigNumber;
-}
-
-export interface OrderFillRequest {
- signedOrder: SignedOrder;
- takerTokenFillAmount: BigNumber;
-}
-
-export type AsyncMethod = (...args: any[]) => Promise<any>;
-export type SyncMethod = (...args: any[]) => any;
-
-/**
- * We re-export the `Web3.Provider` type specified in the Web3 Typescript typings
- * since it is the type of the `provider` argument to the `ZeroEx` constructor.
- * It is however a `Web3` library type, not a native `0x.js` type. To learn more
- * about providers, visit https://0xproject.com/wiki#Web3-Provider-Explained
- */
-export type Web3Provider = Web3.Provider;
-
-/*
- * orderExpirationCheckingIntervalMs: How often to check for expired orders. Default: 50
- * eventPollingIntervalMs: How often to poll the Ethereum node for new events. Default: 200
- * expirationMarginMs: Amount of time before order expiry that you'd like to be notified
- * of an orders expiration. Default: 0
- * cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Defaults: 1h
- * stateLayer: Optional blockchain state layer OrderWatcher will monitor for new events. Default: latest
- */
-export interface OrderStateWatcherConfig {
- orderExpirationCheckingIntervalMs?: number;
- eventPollingIntervalMs?: number;
- expirationMarginMs?: number;
- cleanupJobIntervalMs?: number;
- stateLayer: BlockParamLiteral;
-}
-
-/*
- * networkId: The id of the underlying ethereum network your provider is connected to. (1-mainnet, 3-ropsten, 4-rinkeby, 42-kovan, 50-testrpc)
- * gasPrice: Gas price to use with every transaction
- * exchangeContractAddress: The address of an exchange contract to use
- * zrxContractAddress: The address of the ZRX contract to use
- * tokenRegistryContractAddress: The address of a token registry contract to use
- * tokenTransferProxyContractAddress: The address of the token transfer proxy contract to use
- * orderWatcherConfig: All the configs related to the orderWatcher
- */
-export interface ZeroExConfig {
- networkId: number;
- gasPrice?: BigNumber;
- exchangeContractAddress?: string;
- zrxContractAddress?: string;
- tokenRegistryContractAddress?: string;
- tokenTransferProxyContractAddress?: string;
- orderWatcherConfig?: OrderStateWatcherConfig;
-}
-
-export type ArtifactContractName = 'ZRX' | 'TokenTransferProxy' | 'TokenRegistry' | 'Token' | 'Exchange' | 'EtherToken';
-
-export interface Artifact {
- contract_name: ArtifactContractName;
- abi: ContractAbi;
- networks: {
- [networkId: number]: {
- address: string;
- };
- };
-}
-
-/*
- * expectedFillTakerTokenAmount: If specified, the validation method will ensure that the
- * supplied order maker has a sufficient allowance/balance to fill this amount of the order's
- * takerTokenAmount. If not specified, the validation method ensures that the maker has a sufficient
- * allowance/balance to fill the entire remaining order amount.
- */
-export interface ValidateOrderFillableOpts {
- expectedFillTakerTokenAmount?: BigNumber;
-}
-
-/*
- * defaultBlock: The block up to which to query the blockchain state. Setting this to a historical block number
- * let's the user query the blockchain's state at an arbitrary point in time. In order for this to work, the
- * backing Ethereum node must keep the entire historical state of the chain (e.g setting `--pruning=archive`
- * flag when running Parity).
- */
-export interface MethodOpts {
- defaultBlock?: BlockParam;
-}
-
-/*
- * gasPrice: Gas price in Wei to use for a transaction
- * gasLimit: The amount of gas to send with a transaction
- */
-export interface TransactionOpts {
- gasPrice?: BigNumber;
- gasLimit?: number;
-}
-
-/*
- * shouldValidate: Flag indicating whether the library should make attempts to validate a transaction before
- * broadcasting it. For example, order has a valid signature, maker has sufficient funds, etc. Default: true
- */
-export interface OrderTransactionOpts extends TransactionOpts {
- shouldValidate?: boolean;
-}
-
-export enum TradeSide {
- Maker = 'maker',
- Taker = 'taker',
-}
-
-export enum TransferType {
- Trade = 'trade',
- Fee = 'fee',
-}
-
-export interface OrderRelevantState {
- makerBalance: BigNumber;
- makerProxyAllowance: BigNumber;
- makerFeeBalance: BigNumber;
- makerFeeProxyAllowance: BigNumber;
- filledTakerTokenAmount: BigNumber;
- cancelledTakerTokenAmount: BigNumber;
- remainingFillableMakerTokenAmount: BigNumber;
- remainingFillableTakerTokenAmount: BigNumber;
-}
-
-export interface OrderStateValid {
- isValid: true;
- orderHash: string;
- orderRelevantState: OrderRelevantState;
-}
-
-export interface OrderStateInvalid {
- isValid: false;
- orderHash: string;
- error: ExchangeContractErrs;
-}
-
-export type OrderState = OrderStateValid | OrderStateInvalid;
-
-export type OnOrderStateChangeCallback = (err: Error | null, orderState?: OrderState) => void;
// tslint:disable:max-file-line-count
diff --git a/packages/0x.js/src/utils/assert.ts b/packages/0x.js/src/utils/assert.ts
deleted file mode 100644
index 5e8004cd0..000000000
--- a/packages/0x.js/src/utils/assert.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { assert as sharedAssert } from '@0xproject/assert';
-// We need those two unused imports because they're actually used by sharedAssert which gets injected here
-// tslint:disable-next-line:no-unused-variable
-import { Schema } from '@0xproject/json-schemas';
-// tslint:disable-next-line:no-unused-variable
-import { ECSignature } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { signatureUtils } from '../utils/signature_utils';
-
-export const assert = {
- ...sharedAssert,
- isValidSignature(orderHash: string, ecSignature: ECSignature, signerAddress: string) {
- const isValidSignature = signatureUtils.isValidSignature(orderHash, ecSignature, signerAddress);
- this.assert(isValidSignature, `Expected order with hash '${orderHash}' to have a valid signature`);
- },
- async isSenderAddressAsync(
- variableName: string,
- senderAddressHex: string,
- web3Wrapper: Web3Wrapper,
- ): Promise<void> {
- sharedAssert.isETHAddressHex(variableName, senderAddressHex);
- const isSenderAddressAvailable = await web3Wrapper.isSenderAddressAvailableAsync(senderAddressHex);
- sharedAssert.assert(
- isSenderAddressAvailable,
- `Specified ${variableName} ${senderAddressHex} isn't available through the supplied web3 provider`,
- );
- },
- async isUserAddressAvailableAsync(web3Wrapper: Web3Wrapper): Promise<void> {
- const availableAddresses = await web3Wrapper.getAvailableAddressesAsync();
- this.assert(!_.isEmpty(availableAddresses), 'No addresses were available on the provided web3 provider');
- },
-};
diff --git a/packages/0x.js/src/utils/constants.ts b/packages/0x.js/src/utils/constants.ts
index 06beec8e2..5a5ba0e0a 100644
--- a/packages/0x.js/src/utils/constants.ts
+++ b/packages/0x.js/src/utils/constants.ts
@@ -1,12 +1,4 @@
-import { BigNumber } from '@0xproject/utils';
-
export const constants = {
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
TESTRPC_NETWORK_ID: 50,
- MAX_DIGITS_IN_UNSIGNED_256_INT: 78,
- INVALID_JUMP_PATTERN: 'invalid JUMP at',
- OUT_OF_GAS_PATTERN: 'out of gas',
- INVALID_TAKER_FORMAT: 'instance.taker is not of a type(s) string',
- UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
- DEFAULT_BLOCK_POLLING_INTERVAL: 1000,
};
diff --git a/packages/0x.js/src/utils/decorators.ts b/packages/0x.js/src/utils/decorators.ts
deleted file mode 100644
index f774d734e..000000000
--- a/packages/0x.js/src/utils/decorators.ts
+++ /dev/null
@@ -1,91 +0,0 @@
-import * as _ from 'lodash';
-
-import { AsyncMethod, SyncMethod, ZeroExError } from '../types';
-
-import { constants } from './constants';
-
-type ErrorTransformer = (err: Error) => Error;
-
-const contractCallErrorTransformer = (error: Error) => {
- if (_.includes(error.message, constants.INVALID_JUMP_PATTERN)) {
- return new Error(ZeroExError.InvalidJump);
- }
- if (_.includes(error.message, constants.OUT_OF_GAS_PATTERN)) {
- return new Error(ZeroExError.OutOfGas);
- }
- return error;
-};
-
-const schemaErrorTransformer = (error: Error) => {
- if (_.includes(error.message, constants.INVALID_TAKER_FORMAT)) {
- const errMsg =
- 'Order taker must be of type string. If you want anyone to be able to fill an order - pass ZeroEx.NULL_ADDRESS';
- return new Error(errMsg);
- }
- return error;
-};
-
-/**
- * Source: https://stackoverflow.com/a/29837695/3546986
- */
-const asyncErrorHandlerFactory = (errorTransformer: ErrorTransformer) => {
- const asyncErrorHandlingDecorator = (
- target: object,
- key: string | symbol,
- descriptor: TypedPropertyDescriptor<AsyncMethod>,
- ) => {
- const originalMethod = descriptor.value as AsyncMethod;
-
- // Do not use arrow syntax here. Use a function expression in
- // order to use the correct value of `this` in this method
- // tslint:disable-next-line:only-arrow-functions
- descriptor.value = async function(...args: any[]) {
- try {
- const result = await originalMethod.apply(this, args);
- return result;
- } catch (error) {
- const transformedError = errorTransformer(error);
- throw transformedError;
- }
- };
-
- return descriptor;
- };
-
- return asyncErrorHandlingDecorator;
-};
-
-const syncErrorHandlerFactory = (errorTransformer: ErrorTransformer) => {
- const syncErrorHandlingDecorator = (
- target: object,
- key: string | symbol,
- descriptor: TypedPropertyDescriptor<SyncMethod>,
- ) => {
- const originalMethod = descriptor.value as SyncMethod;
-
- // Do not use arrow syntax here. Use a function expression in
- // order to use the correct value of `this` in this method
- // tslint:disable-next-line:only-arrow-functions
- descriptor.value = function(...args: any[]) {
- try {
- const result = originalMethod.apply(this, args);
- return result;
- } catch (error) {
- const transformedError = errorTransformer(error);
- throw transformedError;
- }
- };
-
- return descriptor;
- };
-
- return syncErrorHandlingDecorator;
-};
-
-// _.flow(f, g) = f ∘ g
-const zeroExErrorTransformer = _.flow(schemaErrorTransformer, contractCallErrorTransformer);
-
-export const decorators = {
- asyncZeroExErrorHandler: asyncErrorHandlerFactory(zeroExErrorTransformer),
- syncZeroExErrorHandler: syncErrorHandlerFactory(zeroExErrorTransformer),
-};
diff --git a/packages/0x.js/src/utils/exchange_transfer_simulator.ts b/packages/0x.js/src/utils/exchange_transfer_simulator.ts
deleted file mode 100644
index 9a920c643..000000000
--- a/packages/0x.js/src/utils/exchange_transfer_simulator.ts
+++ /dev/null
@@ -1,107 +0,0 @@
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { TokenWrapper } from '../contract_wrappers/token_wrapper';
-import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store';
-import { ExchangeContractErrs, TradeSide, TransferType } from '../types';
-
-enum FailureReason {
- Balance = 'balance',
- ProxyAllowance = 'proxyAllowance',
-}
-
-const ERR_MSG_MAPPING = {
- [FailureReason.Balance]: {
- [TradeSide.Maker]: {
- [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerBalance,
- [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeBalance,
- },
- [TradeSide.Taker]: {
- [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerBalance,
- [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeBalance,
- },
- },
- [FailureReason.ProxyAllowance]: {
- [TradeSide.Maker]: {
- [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerAllowance,
- [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeAllowance,
- },
- [TradeSide.Taker]: {
- [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerAllowance,
- [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeAllowance,
- },
- },
-};
-
-export class ExchangeTransferSimulator {
- private _store: BalanceAndProxyAllowanceLazyStore;
- private _UNLIMITED_ALLOWANCE_IN_BASE_UNITS: BigNumber;
- private static _throwValidationError(
- failureReason: FailureReason,
- tradeSide: TradeSide,
- transferType: TransferType,
- ): never {
- const errMsg = ERR_MSG_MAPPING[failureReason][tradeSide][transferType];
- throw new Error(errMsg);
- }
- constructor(token: TokenWrapper, defaultBlock: BlockParamLiteral) {
- this._store = new BalanceAndProxyAllowanceLazyStore(token, defaultBlock);
- this._UNLIMITED_ALLOWANCE_IN_BASE_UNITS = token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
- }
- /**
- * Simulates transferFrom call performed by a proxy
- * @param tokenAddress Address of the token to be transferred
- * @param from Owner of the transferred tokens
- * @param to Recipient of the transferred tokens
- * @param amountInBaseUnits The amount of tokens being transferred
- * @param tradeSide Is Maker/Taker transferring
- * @param transferType Is it a fee payment or a value transfer
- */
- public async transferFromAsync(
- tokenAddress: string,
- from: string,
- to: string,
- amountInBaseUnits: BigNumber,
- tradeSide: TradeSide,
- transferType: TransferType,
- ): Promise<void> {
- const balance = await this._store.getBalanceAsync(tokenAddress, from);
- const proxyAllowance = await this._store.getProxyAllowanceAsync(tokenAddress, from);
- if (proxyAllowance.lessThan(amountInBaseUnits)) {
- ExchangeTransferSimulator._throwValidationError(FailureReason.ProxyAllowance, tradeSide, transferType);
- }
- if (balance.lessThan(amountInBaseUnits)) {
- ExchangeTransferSimulator._throwValidationError(FailureReason.Balance, tradeSide, transferType);
- }
- await this._decreaseProxyAllowanceAsync(tokenAddress, from, amountInBaseUnits);
- await this._decreaseBalanceAsync(tokenAddress, from, amountInBaseUnits);
- await this._increaseBalanceAsync(tokenAddress, to, amountInBaseUnits);
- }
- private async _decreaseProxyAllowanceAsync(
- tokenAddress: string,
- userAddress: string,
- amountInBaseUnits: BigNumber,
- ): Promise<void> {
- const proxyAllowance = await this._store.getProxyAllowanceAsync(tokenAddress, userAddress);
- if (!proxyAllowance.eq(this._UNLIMITED_ALLOWANCE_IN_BASE_UNITS)) {
- this._store.setProxyAllowance(tokenAddress, userAddress, proxyAllowance.minus(amountInBaseUnits));
- }
- }
- private async _increaseBalanceAsync(
- tokenAddress: string,
- userAddress: string,
- amountInBaseUnits: BigNumber,
- ): Promise<void> {
- const balance = await this._store.getBalanceAsync(tokenAddress, userAddress);
- this._store.setBalance(tokenAddress, userAddress, balance.plus(amountInBaseUnits));
- }
- private async _decreaseBalanceAsync(
- tokenAddress: string,
- userAddress: string,
- amountInBaseUnits: BigNumber,
- ): Promise<void> {
- const balance = await this._store.getBalanceAsync(tokenAddress, userAddress);
- this._store.setBalance(tokenAddress, userAddress, balance.minus(amountInBaseUnits));
- }
-}
diff --git a/packages/0x.js/src/utils/filter_utils.ts b/packages/0x.js/src/utils/filter_utils.ts
deleted file mode 100644
index c5df7321e..000000000
--- a/packages/0x.js/src/utils/filter_utils.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import {
- ConstructorAbi,
- ContractAbi,
- EventAbi,
- FallbackAbi,
- FilterObject,
- LogEntry,
- MethodAbi,
-} from '@0xproject/types';
-import * as ethUtil from 'ethereumjs-util';
-import * as jsSHA3 from 'js-sha3';
-import * as _ from 'lodash';
-import * as uuid from 'uuid/v4';
-
-import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
-
-const TOPIC_LENGTH = 32;
-
-export const filterUtils = {
- generateUUID(): string {
- return uuid();
- },
- getFilter(
- address: string,
- eventName: ContractEvents,
- indexFilterValues: IndexedFilterValues,
- abi: ContractAbi,
- blockRange?: BlockRange,
- ): FilterObject {
- const eventAbi = _.find(abi, { name: eventName }) as EventAbi;
- const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi, eventName);
- const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
- const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
- const topics = [topicForEventSignature, ...topicsForIndexedArgs];
- let filter: FilterObject = {
- address,
- topics,
- };
- if (!_.isUndefined(blockRange)) {
- filter = {
- ...blockRange,
- ...filter,
- };
- }
- return filter;
- },
- getEventSignatureFromAbiByName(eventAbi: EventAbi, eventName: ContractEvents): string {
- const types = _.map(eventAbi.inputs, 'type');
- const signature = `${eventAbi.name}(${types.join(',')})`;
- return signature;
- },
- getTopicsForIndexedArgs(abi: EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
- const topics: Array<string | null> = [];
- for (const eventInput of abi.inputs) {
- if (!eventInput.indexed) {
- continue;
- }
- if (_.isUndefined(indexFilterValues[eventInput.name])) {
- // Null is a wildcard topic in a JSON-RPC call
- topics.push(null);
- } else {
- const value = indexFilterValues[eventInput.name] as string;
- const buffer = ethUtil.toBuffer(value);
- const paddedBuffer = ethUtil.setLengthLeft(buffer, TOPIC_LENGTH);
- const topic = ethUtil.bufferToHex(paddedBuffer);
- topics.push(topic);
- }
- }
- return topics;
- },
- matchesFilter(log: LogEntry, filter: FilterObject): boolean {
- if (!_.isUndefined(filter.address) && log.address !== filter.address) {
- return false;
- }
- if (!_.isUndefined(filter.topics)) {
- return filterUtils.matchesTopics(log.topics, filter.topics);
- }
- return true;
- },
- matchesTopics(logTopics: string[], filterTopics: Array<string[] | string | null>): boolean {
- const matchesTopic = _.zipWith(logTopics, filterTopics, filterUtils.matchesTopic.bind(filterUtils));
- const matchesTopics = _.every(matchesTopic);
- return matchesTopics;
- },
- matchesTopic(logTopic: string, filterTopic: string[] | string | null): boolean {
- if (_.isArray(filterTopic)) {
- return _.includes(filterTopic, logTopic);
- }
- if (_.isString(filterTopic)) {
- return filterTopic === logTopic;
- }
- // null topic is a wildcard
- return true;
- },
-};
diff --git a/packages/0x.js/src/utils/order_state_utils.ts b/packages/0x.js/src/utils/order_state_utils.ts
deleted file mode 100644
index 38189443b..000000000
--- a/packages/0x.js/src/utils/order_state_utils.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import { SignedOrder } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { ZeroEx } from '../0x';
-import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
-import { RemainingFillableCalculator } from '../order_watcher/remaining_fillable_calculator';
-import { BalanceAndProxyAllowanceLazyStore } from '../stores/balance_proxy_allowance_lazy_store';
-import { OrderFilledCancelledLazyStore } from '../stores/order_filled_cancelled_lazy_store';
-import { ExchangeContractErrs, OrderRelevantState, OrderState, OrderStateInvalid, OrderStateValid } from '../types';
-
-const ACCEPTABLE_RELATIVE_ROUNDING_ERROR = 0.0001;
-
-export class OrderStateUtils {
- private _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
- private _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
- private static _validateIfOrderIsValid(signedOrder: SignedOrder, orderRelevantState: OrderRelevantState): void {
- const unavailableTakerTokenAmount = orderRelevantState.cancelledTakerTokenAmount.add(
- orderRelevantState.filledTakerTokenAmount,
- );
- const availableTakerTokenAmount = signedOrder.takerTokenAmount.minus(unavailableTakerTokenAmount);
- if (availableTakerTokenAmount.eq(0)) {
- throw new Error(ExchangeContractErrs.OrderRemainingFillAmountZero);
- }
-
- if (orderRelevantState.makerBalance.eq(0)) {
- throw new Error(ExchangeContractErrs.InsufficientMakerBalance);
- }
- if (orderRelevantState.makerProxyAllowance.eq(0)) {
- throw new Error(ExchangeContractErrs.InsufficientMakerAllowance);
- }
- if (!signedOrder.makerFee.eq(0)) {
- if (orderRelevantState.makerFeeBalance.eq(0)) {
- throw new Error(ExchangeContractErrs.InsufficientMakerFeeBalance);
- }
- if (orderRelevantState.makerFeeProxyAllowance.eq(0)) {
- throw new Error(ExchangeContractErrs.InsufficientMakerFeeAllowance);
- }
- }
- const minFillableTakerTokenAmountWithinNoRoundingErrorRange = signedOrder.takerTokenAmount
- .dividedBy(ACCEPTABLE_RELATIVE_ROUNDING_ERROR)
- .dividedBy(signedOrder.makerTokenAmount);
- if (
- orderRelevantState.remainingFillableTakerTokenAmount.lessThan(
- minFillableTakerTokenAmountWithinNoRoundingErrorRange,
- )
- ) {
- throw new Error(ExchangeContractErrs.OrderFillRoundingError);
- }
- }
- constructor(
- balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore,
- orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore,
- ) {
- this._balanceAndProxyAllowanceLazyStore = balanceAndProxyAllowanceLazyStore;
- this._orderFilledCancelledLazyStore = orderFilledCancelledLazyStore;
- }
- public async getOrderStateAsync(signedOrder: SignedOrder): Promise<OrderState> {
- const orderRelevantState = await this.getOrderRelevantStateAsync(signedOrder);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- try {
- OrderStateUtils._validateIfOrderIsValid(signedOrder, orderRelevantState);
- const orderState: OrderStateValid = {
- isValid: true,
- orderHash,
- orderRelevantState,
- };
- return orderState;
- } catch (err) {
- const orderState: OrderStateInvalid = {
- isValid: false,
- orderHash,
- error: err.message,
- };
- return orderState;
- }
- }
- public async getOrderRelevantStateAsync(signedOrder: SignedOrder): Promise<OrderRelevantState> {
- // HACK: We access the private property here but otherwise the interface will be less nice.
- // If we pass it from the instantiator - there is no opportunity to get it there
- // because JS doesn't support async constructors.
- // Moreover - it's cached under the hood so it's equivalent to an async constructor.
- const exchange = (this._orderFilledCancelledLazyStore as any)._exchange as ExchangeWrapper;
- const zrxTokenAddress = exchange.getZRXTokenAddress();
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- const makerBalance = await this._balanceAndProxyAllowanceLazyStore.getBalanceAsync(
- signedOrder.makerTokenAddress,
- signedOrder.maker,
- );
- const makerProxyAllowance = await this._balanceAndProxyAllowanceLazyStore.getProxyAllowanceAsync(
- signedOrder.makerTokenAddress,
- signedOrder.maker,
- );
- const makerFeeBalance = await this._balanceAndProxyAllowanceLazyStore.getBalanceAsync(
- zrxTokenAddress,
- signedOrder.maker,
- );
- const makerFeeProxyAllowance = await this._balanceAndProxyAllowanceLazyStore.getProxyAllowanceAsync(
- zrxTokenAddress,
- signedOrder.maker,
- );
- const filledTakerTokenAmount = await this._orderFilledCancelledLazyStore.getFilledTakerAmountAsync(orderHash);
- const cancelledTakerTokenAmount = await this._orderFilledCancelledLazyStore.getCancelledTakerAmountAsync(
- orderHash,
- );
- const unavailableTakerTokenAmount = await exchange.getUnavailableTakerAmountAsync(orderHash);
- const totalMakerTokenAmount = signedOrder.makerTokenAmount;
- const totalTakerTokenAmount = signedOrder.takerTokenAmount;
- const remainingTakerTokenAmount = totalTakerTokenAmount.minus(unavailableTakerTokenAmount);
- const remainingMakerTokenAmount = remainingTakerTokenAmount
- .times(totalMakerTokenAmount)
- .dividedToIntegerBy(totalTakerTokenAmount);
- const transferrableMakerTokenAmount = BigNumber.min([makerProxyAllowance, makerBalance]);
- const transferrableFeeTokenAmount = BigNumber.min([makerFeeProxyAllowance, makerFeeBalance]);
-
- const isMakerTokenZRX = signedOrder.makerTokenAddress === zrxTokenAddress;
- const remainingFillableCalculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- const remainingFillableMakerTokenAmount = remainingFillableCalculator.computeRemainingMakerFillable();
- const remainingFillableTakerTokenAmount = remainingFillableCalculator.computeRemainingTakerFillable();
- const orderRelevantState = {
- makerBalance,
- makerProxyAllowance,
- makerFeeBalance,
- makerFeeProxyAllowance,
- filledTakerTokenAmount,
- cancelledTakerTokenAmount,
- remainingFillableMakerTokenAmount,
- remainingFillableTakerTokenAmount,
- };
- return orderRelevantState;
- }
-}
diff --git a/packages/0x.js/src/utils/order_validation_utils.ts b/packages/0x.js/src/utils/order_validation_utils.ts
deleted file mode 100644
index f32bf43d0..000000000
--- a/packages/0x.js/src/utils/order_validation_utils.ts
+++ /dev/null
@@ -1,217 +0,0 @@
-import { Order, SignedOrder } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { ZeroEx } from '../0x';
-import { ExchangeWrapper } from '../contract_wrappers/exchange_wrapper';
-import { ExchangeContractErrs, TradeSide, TransferType, ZeroExError } from '../types';
-import { constants } from '../utils/constants';
-import { utils } from '../utils/utils';
-
-import { ExchangeTransferSimulator } from './exchange_transfer_simulator';
-
-export class OrderValidationUtils {
- private _exchangeWrapper: ExchangeWrapper;
- public static validateCancelOrderThrowIfInvalid(
- order: Order,
- cancelTakerTokenAmount: BigNumber,
- unavailableTakerTokenAmount: BigNumber,
- ): void {
- if (cancelTakerTokenAmount.eq(0)) {
- throw new Error(ExchangeContractErrs.OrderCancelAmountZero);
- }
- if (order.takerTokenAmount.eq(unavailableTakerTokenAmount)) {
- throw new Error(ExchangeContractErrs.OrderAlreadyCancelledOrFilled);
- }
- const currentUnixTimestampSec = utils.getCurrentUnixTimestampSec();
- if (order.expirationUnixTimestampSec.lessThan(currentUnixTimestampSec)) {
- throw new Error(ExchangeContractErrs.OrderCancelExpired);
- }
- }
- public static async validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTradeEmulator: ExchangeTransferSimulator,
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- senderAddress: string,
- zrxTokenAddress: string,
- ): Promise<void> {
- const fillMakerTokenAmount = OrderValidationUtils._getPartialAmount(
- fillTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerTokenAmount,
- );
- await exchangeTradeEmulator.transferFromAsync(
- signedOrder.makerTokenAddress,
- signedOrder.maker,
- senderAddress,
- fillMakerTokenAmount,
- TradeSide.Maker,
- TransferType.Trade,
- );
- await exchangeTradeEmulator.transferFromAsync(
- signedOrder.takerTokenAddress,
- senderAddress,
- signedOrder.maker,
- fillTakerTokenAmount,
- TradeSide.Taker,
- TransferType.Trade,
- );
- const makerFeeAmount = OrderValidationUtils._getPartialAmount(
- fillTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- );
- await exchangeTradeEmulator.transferFromAsync(
- zrxTokenAddress,
- signedOrder.maker,
- signedOrder.feeRecipient,
- makerFeeAmount,
- TradeSide.Maker,
- TransferType.Fee,
- );
- const takerFeeAmount = OrderValidationUtils._getPartialAmount(
- fillTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.takerFee,
- );
- await exchangeTradeEmulator.transferFromAsync(
- zrxTokenAddress,
- senderAddress,
- signedOrder.feeRecipient,
- takerFeeAmount,
- TradeSide.Taker,
- TransferType.Fee,
- );
- }
- private static _validateRemainingFillAmountNotZeroOrThrow(
- takerTokenAmount: BigNumber,
- unavailableTakerTokenAmount: BigNumber,
- ) {
- if (takerTokenAmount.eq(unavailableTakerTokenAmount)) {
- throw new Error(ExchangeContractErrs.OrderRemainingFillAmountZero);
- }
- }
- private static _validateOrderNotExpiredOrThrow(expirationUnixTimestampSec: BigNumber) {
- const currentUnixTimestampSec = utils.getCurrentUnixTimestampSec();
- if (expirationUnixTimestampSec.lessThan(currentUnixTimestampSec)) {
- throw new Error(ExchangeContractErrs.OrderFillExpired);
- }
- }
- private static _getPartialAmount(numerator: BigNumber, denominator: BigNumber, target: BigNumber): BigNumber {
- const fillMakerTokenAmount = numerator
- .mul(target)
- .div(denominator)
- .round(0);
- return fillMakerTokenAmount;
- }
- constructor(exchangeWrapper: ExchangeWrapper) {
- this._exchangeWrapper = exchangeWrapper;
- }
- public async validateOrderFillableOrThrowAsync(
- exchangeTradeEmulator: ExchangeTransferSimulator,
- signedOrder: SignedOrder,
- zrxTokenAddress: string,
- expectedFillTakerTokenAmount?: BigNumber,
- ): Promise<void> {
- const orderHash = utils.getOrderHashHex(signedOrder);
- const unavailableTakerTokenAmount = await this._exchangeWrapper.getUnavailableTakerAmountAsync(orderHash);
- OrderValidationUtils._validateRemainingFillAmountNotZeroOrThrow(
- signedOrder.takerTokenAmount,
- unavailableTakerTokenAmount,
- );
- OrderValidationUtils._validateOrderNotExpiredOrThrow(signedOrder.expirationUnixTimestampSec);
- let fillTakerTokenAmount = signedOrder.takerTokenAmount.minus(unavailableTakerTokenAmount);
- if (!_.isUndefined(expectedFillTakerTokenAmount)) {
- fillTakerTokenAmount = expectedFillTakerTokenAmount;
- }
- const fillMakerTokenAmount = OrderValidationUtils._getPartialAmount(
- fillTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerTokenAmount,
- );
- await exchangeTradeEmulator.transferFromAsync(
- signedOrder.makerTokenAddress,
- signedOrder.maker,
- signedOrder.taker,
- fillMakerTokenAmount,
- TradeSide.Maker,
- TransferType.Trade,
- );
- const makerFeeAmount = OrderValidationUtils._getPartialAmount(
- fillTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- );
- await exchangeTradeEmulator.transferFromAsync(
- zrxTokenAddress,
- signedOrder.maker,
- signedOrder.feeRecipient,
- makerFeeAmount,
- TradeSide.Maker,
- TransferType.Fee,
- );
- }
- public async validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator: ExchangeTransferSimulator,
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- takerAddress: string,
- zrxTokenAddress: string,
- ): Promise<BigNumber> {
- if (fillTakerTokenAmount.eq(0)) {
- throw new Error(ExchangeContractErrs.OrderFillAmountZero);
- }
- const orderHash = utils.getOrderHashHex(signedOrder);
- if (!ZeroEx.isValidSignature(orderHash, signedOrder.ecSignature, signedOrder.maker)) {
- throw new Error(ZeroExError.InvalidSignature);
- }
- const unavailableTakerTokenAmount = await this._exchangeWrapper.getUnavailableTakerAmountAsync(orderHash);
- OrderValidationUtils._validateRemainingFillAmountNotZeroOrThrow(
- signedOrder.takerTokenAmount,
- unavailableTakerTokenAmount,
- );
- if (signedOrder.taker !== constants.NULL_ADDRESS && signedOrder.taker !== takerAddress) {
- throw new Error(ExchangeContractErrs.TransactionSenderIsNotFillOrderTaker);
- }
- OrderValidationUtils._validateOrderNotExpiredOrThrow(signedOrder.expirationUnixTimestampSec);
- const remainingTakerTokenAmount = signedOrder.takerTokenAmount.minus(unavailableTakerTokenAmount);
- const filledTakerTokenAmount = remainingTakerTokenAmount.lessThan(fillTakerTokenAmount)
- ? remainingTakerTokenAmount
- : fillTakerTokenAmount;
- await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- filledTakerTokenAmount,
- takerAddress,
- zrxTokenAddress,
- );
-
- const wouldRoundingErrorOccur = await this._exchangeWrapper.isRoundingErrorAsync(
- filledTakerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerTokenAmount,
- );
- if (wouldRoundingErrorOccur) {
- throw new Error(ExchangeContractErrs.OrderFillRoundingError);
- }
- return filledTakerTokenAmount;
- }
- public async validateFillOrKillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator: ExchangeTransferSimulator,
- signedOrder: SignedOrder,
- fillTakerTokenAmount: BigNumber,
- takerAddress: string,
- zrxTokenAddress: string,
- ): Promise<void> {
- const filledTakerTokenAmount = await this.validateFillOrderThrowIfInvalidAsync(
- exchangeTradeEmulator,
- signedOrder,
- fillTakerTokenAmount,
- takerAddress,
- zrxTokenAddress,
- );
- if (filledTakerTokenAmount !== fillTakerTokenAmount) {
- throw new Error(ExchangeContractErrs.InsufficientRemainingFillAmount);
- }
- }
-}
diff --git a/packages/0x.js/src/utils/signature_utils.ts b/packages/0x.js/src/utils/signature_utils.ts
deleted file mode 100644
index 46f167339..000000000
--- a/packages/0x.js/src/utils/signature_utils.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { ECSignature } from '@0xproject/types';
-import * as ethUtil from 'ethereumjs-util';
-
-export const signatureUtils = {
- isValidSignature(data: string, signature: ECSignature, signerAddress: string): boolean {
- const dataBuff = ethUtil.toBuffer(data);
- const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff);
- try {
- const pubKey = ethUtil.ecrecover(
- msgHashBuff,
- signature.v,
- ethUtil.toBuffer(signature.r),
- ethUtil.toBuffer(signature.s),
- );
- const retrievedAddress = ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey));
- return retrievedAddress === signerAddress;
- } catch (err) {
- return false;
- }
- },
- parseSignatureHexAsVRS(signatureHex: string): ECSignature {
- const signatureBuffer = ethUtil.toBuffer(signatureHex);
- let v = signatureBuffer[0];
- if (v < 27) {
- v += 27;
- }
- const r = signatureBuffer.slice(1, 33);
- const s = signatureBuffer.slice(33, 65);
- const ecSignature: ECSignature = {
- v,
- r: ethUtil.bufferToHex(r),
- s: ethUtil.bufferToHex(s),
- };
- return ecSignature;
- },
- parseSignatureHexAsRSV(signatureHex: string): ECSignature {
- const { v, r, s } = ethUtil.fromRpcSig(signatureHex);
- const ecSignature: ECSignature = {
- v,
- r: ethUtil.bufferToHex(r),
- s: ethUtil.bufferToHex(s),
- };
- return ecSignature;
- },
-};
diff --git a/packages/0x.js/src/utils/utils.ts b/packages/0x.js/src/utils/utils.ts
deleted file mode 100644
index c8bcd907e..000000000
--- a/packages/0x.js/src/utils/utils.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Order, SignedOrder, SolidityTypes } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import BN = require('bn.js');
-import * as ethABI from 'ethereumjs-abi';
-import * as ethUtil from 'ethereumjs-util';
-import * as _ from 'lodash';
-
-export const utils = {
- /**
- * Converts BigNumber instance to BN
- * The only reason we convert to BN is to remain compatible with `ethABI. soliditySHA3` that
- * expects values of Solidity type `uint` to be passed as type `BN`.
- * We do not use BN anywhere else in the codebase.
- */
- bigNumberToBN(value: BigNumber) {
- return new BN(value.toString(), 10);
- },
- spawnSwitchErr(name: string, value: any): Error {
- return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
- },
- getOrderHashHex(order: Order | SignedOrder): string {
- const orderParts = [
- { value: order.exchangeContractAddress, type: SolidityTypes.Address },
- { value: order.maker, type: SolidityTypes.Address },
- { value: order.taker, type: SolidityTypes.Address },
- { value: order.makerTokenAddress, type: SolidityTypes.Address },
- { value: order.takerTokenAddress, type: SolidityTypes.Address },
- { value: order.feeRecipient, type: SolidityTypes.Address },
- {
- value: utils.bigNumberToBN(order.makerTokenAmount),
- type: SolidityTypes.Uint256,
- },
- {
- value: utils.bigNumberToBN(order.takerTokenAmount),
- type: SolidityTypes.Uint256,
- },
- {
- value: utils.bigNumberToBN(order.makerFee),
- type: SolidityTypes.Uint256,
- },
- {
- value: utils.bigNumberToBN(order.takerFee),
- type: SolidityTypes.Uint256,
- },
- {
- value: utils.bigNumberToBN(order.expirationUnixTimestampSec),
- type: SolidityTypes.Uint256,
- },
- { value: utils.bigNumberToBN(order.salt), type: SolidityTypes.Uint256 },
- ];
- const types = _.map(orderParts, o => o.type);
- const values = _.map(orderParts, o => o.value);
- const hashBuff = ethABI.soliditySHA3(types, values);
- const hashHex = ethUtil.bufferToHex(hashBuff);
- return hashHex;
- },
- getCurrentUnixTimestampSec(): BigNumber {
- return new BigNumber(Date.now() / 1000).round();
- },
- getCurrentUnixTimestampMs(): BigNumber {
- return new BigNumber(Date.now());
- },
-};
diff --git a/packages/0x.js/test/0x.js_test.ts b/packages/0x.js/test/0x.js_test.ts
index 70e85aa52..be2a94482 100644
--- a/packages/0x.js/test/0x.js_test.ts
+++ b/packages/0x.js/test/0x.js_test.ts
@@ -1,120 +1,78 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
import { BigNumber } from '@0xproject/utils';
import * as chai from 'chai';
-import * as _ from 'lodash';
import 'mocha';
-import * as Sinon from 'sinon';
-import { ApprovalContractEventArgs, LogWithDecodedArgs, Order, TokenEvents, ZeroEx } from '../src';
+import { ERC20TokenApprovalEventArgs, ERC20TokenEvents, LogWithDecodedArgs, ZeroEx } from '../src';
import { chaiSetup } from './utils/chai_setup';
import { constants } from './utils/constants';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
chaiSetup.configure();
const expect = chai.expect;
-const SHOULD_ADD_PERSONAL_MESSAGE_PREFIX = false;
-
describe('ZeroEx library', () => {
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3.currentProvider, config);
+ let zeroEx: ZeroEx;
+ before(async () => {
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ zeroEx = new ZeroEx(provider, config);
+ });
describe('#setProvider', () => {
it('overrides provider in nested web3s and invalidates contractInstances', async () => {
// Instantiate the contract instances with the current provider
await (zeroEx.exchange as any)._getExchangeContractAsync();
- await (zeroEx.tokenRegistry as any)._getTokenRegistryContractAsync();
expect((zeroEx.exchange as any)._exchangeContractIfExists).to.not.be.undefined();
- expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.not.be.undefined();
- const newProvider = web3Factory.getRpcProvider();
// Add property to newProvider so that we can differentiate it from old provider
- (newProvider as any).zeroExTestId = 1;
- zeroEx.setProvider(newProvider, constants.TESTRPC_NETWORK_ID);
+ (provider as any).zeroExTestId = 1;
+ zeroEx.setProvider(provider, constants.TESTRPC_NETWORK_ID);
// Check that contractInstances with old provider are removed after provider update
expect((zeroEx.exchange as any)._exchangeContractIfExists).to.be.undefined();
- expect((zeroEx.tokenRegistry as any)._tokenRegistryContractIfExists).to.be.undefined();
- // Check that all nested web3 wrapper instances return the updated provider
- const nestedWeb3WrapperProvider = (zeroEx as any)._web3Wrapper.getProvider();
- expect(nestedWeb3WrapperProvider.zeroExTestId).to.be.a('number');
+ // Check that all nested zeroExContract/web3Wrapper instances return the updated provider
+ const nestedWeb3WrapperProvider = ((zeroEx as any)._contractWrappers as ContractWrappers).getProvider();
+ expect((nestedWeb3WrapperProvider as any).zeroExTestId).to.be.a('number');
const exchangeWeb3WrapperProvider = (zeroEx.exchange as any)._web3Wrapper.getProvider();
expect(exchangeWeb3WrapperProvider.zeroExTestId).to.be.a('number');
- const tokenRegistryWeb3WrapperProvider = (zeroEx.tokenRegistry as any)._web3Wrapper.getProvider();
- expect(tokenRegistryWeb3WrapperProvider.zeroExTestId).to.be.a('number');
});
});
describe('#isValidSignature', () => {
- // The Exchange smart contract `isValidSignature` method only validates orderHashes and assumes
- // the length of the data is exactly 32 bytes. Thus for these tests, we use data of this size.
const dataHex = '0x6927e990021d23b1eb7b8789f6a6feaf98fe104bb0cf8259421b79f9a34222b0';
- const signature = {
- v: 27,
- r: '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
- s: '0x40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
- };
+ const ethSignSignature =
+ '0x1B61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace225403';
const address = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
+ const bytes32Zeros = '0x0000000000000000000000000000000000000000000000000000000000000000';
it("should return false if the data doesn't pertain to the signature & address", async () => {
- expect(ZeroEx.isValidSignature('0x0', signature, address)).to.be.false();
return expect(
- (zeroEx.exchange as any)._isValidSignatureUsingContractCallAsync('0x0', signature, address),
+ (zeroEx.exchange as any).isValidSignatureAsync(bytes32Zeros, address, ethSignSignature),
).to.become(false);
});
it("should return false if the address doesn't pertain to the signature & data", async () => {
const validUnrelatedAddress = '0x8b0292b11a196601ed2ce54b665cafeca0347d42';
- expect(ZeroEx.isValidSignature(dataHex, signature, validUnrelatedAddress)).to.be.false();
return expect(
- (zeroEx.exchange as any)._isValidSignatureUsingContractCallAsync(
- dataHex,
- signature,
- validUnrelatedAddress,
- ),
+ (zeroEx.exchange as any).isValidSignatureAsync(dataHex, validUnrelatedAddress, ethSignSignature),
).to.become(false);
});
it("should return false if the signature doesn't pertain to the dataHex & address", async () => {
- const wrongSignature = _.assign({}, signature, { v: 28 });
- expect(ZeroEx.isValidSignature(dataHex, wrongSignature, address)).to.be.false();
- return expect(
- (zeroEx.exchange as any)._isValidSignatureUsingContractCallAsync(dataHex, wrongSignature, address),
- ).to.become(false);
+ const signatureArray = ethSignSignature.split('');
+ // tslint:disable-next-line:custom-no-magic-numbers
+ signatureArray[5] = 'C'; // V = 28, instead of 27
+ const wrongSignature = signatureArray.join('');
+ return expect((zeroEx.exchange as any).isValidSignatureAsync(dataHex, address, wrongSignature)).to.become(
+ false,
+ );
});
it('should return true if the signature does pertain to the dataHex & address', async () => {
- const isValidSignatureLocal = ZeroEx.isValidSignature(dataHex, signature, address);
- expect(isValidSignatureLocal).to.be.true();
- return expect(
- (zeroEx.exchange as any)._isValidSignatureUsingContractCallAsync(dataHex, signature, address),
- ).to.become(true);
- });
- });
- describe('#generateSalt', () => {
- it('generates different salts', () => {
- const equal = ZeroEx.generatePseudoRandomSalt().eq(ZeroEx.generatePseudoRandomSalt());
- expect(equal).to.be.false();
- });
- it('generates salt in range [0..2^256)', () => {
- const salt = ZeroEx.generatePseudoRandomSalt();
- expect(salt.greaterThanOrEqualTo(0)).to.be.true();
- const twoPow256 = new BigNumber(2).pow(256);
- expect(salt.lessThan(twoPow256)).to.be.true();
- });
- });
- describe('#isValidOrderHash', () => {
- it('returns false if the value is not a hex string', () => {
- const isValid = ZeroEx.isValidOrderHash('not a hex');
- expect(isValid).to.be.false();
- });
- it('returns false if the length is wrong', () => {
- const isValid = ZeroEx.isValidOrderHash('0xdeadbeef');
- expect(isValid).to.be.false();
- });
- it('returns true if order hash is correct', () => {
- const isValid = ZeroEx.isValidOrderHash('0x' + Array(65).join('0'));
- expect(isValid).to.be.true();
+ return expect((zeroEx.exchange as any).isValidSignatureAsync(dataHex, address, ethSignSignature)).to.become(
+ true,
+ );
});
});
describe('#toUnitAmount', () => {
@@ -149,106 +107,6 @@ describe('ZeroEx library', () => {
);
});
});
- describe('#getOrderHashHex', () => {
- const expectedOrderHash = '0x39da987067a3c9e5f1617694f1301326ba8c8b0498ebef5df4863bed394e3c83';
- const fakeExchangeContractAddress = '0xb69e673309512a9d726f87304c6984054f87a93b';
- const order: Order = {
- maker: constants.NULL_ADDRESS,
- taker: constants.NULL_ADDRESS,
- feeRecipient: constants.NULL_ADDRESS,
- makerTokenAddress: constants.NULL_ADDRESS,
- takerTokenAddress: constants.NULL_ADDRESS,
- exchangeContractAddress: fakeExchangeContractAddress,
- salt: new BigNumber(0),
- makerFee: new BigNumber(0),
- takerFee: new BigNumber(0),
- makerTokenAmount: new BigNumber(0),
- takerTokenAmount: new BigNumber(0),
- expirationUnixTimestampSec: new BigNumber(0),
- };
- it('calculates the order hash', async () => {
- const orderHash = ZeroEx.getOrderHashHex(order);
- expect(orderHash).to.be.equal(expectedOrderHash);
- });
- it('throws a readable error message if taker format is invalid', async () => {
- const orderWithInvalidtakerFormat = {
- ...order,
- taker: (null as any) as string,
- };
- const expectedErrorMessage =
- 'Order taker must be of type string. If you want anyone to be able to fill an order - pass ZeroEx.NULL_ADDRESS';
- expect(() => ZeroEx.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage);
- });
- });
- describe('#signOrderHashAsync', () => {
- let stubs: Sinon.SinonStub[] = [];
- let makerAddress: string;
- before(async () => {
- const availableAddreses = await zeroEx.getAvailableAddressesAsync();
- makerAddress = availableAddreses[0];
- });
- afterEach(() => {
- // clean up any stubs after the test has completed
- _.each(stubs, s => s.restore());
- stubs = [];
- });
- it('Should return the correct ECSignature', async () => {
- const orderHash = '0x6927e990021d23b1eb7b8789f6a6feaf98fe104bb0cf8259421b79f9a34222b0';
- const expectedECSignature = {
- v: 27,
- r: '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
- s: '0x40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
- };
- const ecSignature = await zeroEx.signOrderHashAsync(
- orderHash,
- makerAddress,
- SHOULD_ADD_PERSONAL_MESSAGE_PREFIX,
- );
- expect(ecSignature).to.deep.equal(expectedECSignature);
- });
- it('should return the correct ECSignature for signatureHex concatenated as R + S + V', async () => {
- const orderHash = '0x34decbedc118904df65f379a175bb39ca18209d6ce41d5ed549d54e6e0a95004';
- const signature =
- '0x22109d11d79cb8bf96ed88625e1cd9558800c4073332a9a02857499883ee5ce3050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb021b';
- const expectedECSignature = {
- v: 27,
- r: '0x22109d11d79cb8bf96ed88625e1cd9558800c4073332a9a02857499883ee5ce3',
- s: '0x050aa3cc1f2c435e67e114cdce54b9527b4f50548342401bc5d2b77adbdacb02',
- };
- stubs = [
- Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
- Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
- ];
-
- const ecSignature = await zeroEx.signOrderHashAsync(
- orderHash,
- makerAddress,
- SHOULD_ADD_PERSONAL_MESSAGE_PREFIX,
- );
- expect(ecSignature).to.deep.equal(expectedECSignature);
- });
- it('should return the correct ECSignature for signatureHex concatenated as V + R + S', async () => {
- const orderHash = '0xc793e33ffded933b76f2f48d9aa3339fc090399d5e7f5dec8d3660f5480793f7';
- const signature =
- '0x1bc80bedc6756722672753413efdd749b5adbd4fd552595f59c13427407ee9aee02dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960';
- const expectedECSignature = {
- v: 27,
- r: '0xc80bedc6756722672753413efdd749b5adbd4fd552595f59c13427407ee9aee0',
- s: '0x2dea66f25a608bbae457e020fb6decb763deb8b7192abab624997242da248960',
- };
- stubs = [
- Sinon.stub((zeroEx as any)._web3Wrapper, 'signMessageAsync').returns(Promise.resolve(signature)),
- Sinon.stub(ZeroEx, 'isValidSignature').returns(true),
- ];
-
- const ecSignature = await zeroEx.signOrderHashAsync(
- orderHash,
- makerAddress,
- SHOULD_ADD_PERSONAL_MESSAGE_PREFIX,
- );
- expect(ecSignature).to.deep.equal(expectedECSignature);
- });
- });
describe('#awaitTransactionMinedAsync', () => {
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -259,17 +117,16 @@ describe('ZeroEx library', () => {
it('returns transaction receipt with decoded logs', async () => {
const availableAddresses = await zeroEx.getAvailableAddressesAsync();
const coinbase = availableAddresses[0];
- const tokens = await zeroEx.tokenRegistry.getTokensAsync();
- const tokenUtils = new TokenUtils(tokens);
- const zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- const proxyAddress = zeroEx.proxy.getContractAddress();
- const txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(zrxTokenAddress, coinbase);
+ const zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ const erc20ProxyAddress = zeroEx.erc20Proxy.getContractAddress();
+ const txHash = await zeroEx.erc20Token.setUnlimitedProxyAllowanceAsync(zrxTokenAddress, coinbase);
const txReceiptWithDecodedLogs = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = txReceiptWithDecodedLogs.logs[0] as LogWithDecodedArgs<ApprovalContractEventArgs>;
- expect(log.event).to.be.equal(TokenEvents.Approval);
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ const log = txReceiptWithDecodedLogs.logs[0] as LogWithDecodedArgs<ERC20TokenApprovalEventArgs>;
+ expect(log.event).to.be.equal(ERC20TokenEvents.Approval);
expect(log.args._owner).to.be.equal(coinbase);
- expect(log.args._spender).to.be.equal(proxyAddress);
- expect(log.args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ expect(log.args._spender).to.be.equal(erc20ProxyAddress);
+ expect(log.args._value).to.be.bignumber.equal(zeroEx.erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
});
});
describe('#config', () => {
@@ -278,18 +135,16 @@ describe('ZeroEx library', () => {
exchangeContractAddress: ZeroEx.NULL_ADDRESS,
networkId: constants.TESTRPC_NETWORK_ID,
};
- const zeroExWithWrongExchangeAddress = new ZeroEx(web3.currentProvider, zeroExConfig);
+ const zeroExWithWrongExchangeAddress = new ZeroEx(provider, zeroExConfig);
expect(zeroExWithWrongExchangeAddress.exchange.getContractAddress()).to.be.equal(ZeroEx.NULL_ADDRESS);
});
- it('allows to specify token registry token contract address', async () => {
+ it('allows to specify erc20Proxy contract address', async () => {
const zeroExConfig = {
- tokenRegistryContractAddress: ZeroEx.NULL_ADDRESS,
+ erc20ProxyContractAddress: ZeroEx.NULL_ADDRESS,
networkId: constants.TESTRPC_NETWORK_ID,
};
- const zeroExWithWrongTokenRegistryAddress = new ZeroEx(web3.currentProvider, zeroExConfig);
- expect(zeroExWithWrongTokenRegistryAddress.tokenRegistry.getContractAddress()).to.be.equal(
- ZeroEx.NULL_ADDRESS,
- );
+ const zeroExWithWrongERC20ProxyAddress = new ZeroEx(provider, zeroExConfig);
+ expect(zeroExWithWrongERC20ProxyAddress.erc20Proxy.getContractAddress()).to.be.equal(ZeroEx.NULL_ADDRESS);
});
});
});
diff --git a/packages/0x.js/test/artifacts_test.ts b/packages/0x.js/test/artifacts_test.ts
deleted file mode 100644
index e8ab9aa97..000000000
--- a/packages/0x.js/test/artifacts_test.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import * as fs from 'fs';
-import HDWalletProvider = require('truffle-hdwallet-provider');
-
-import { ZeroEx } from '../src';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-
-chaiSetup.configure();
-
-// Those tests are slower cause they're talking to a remote node
-const TIMEOUT = 10000;
-
-describe('Artifacts', () => {
- describe('contracts are deployed on kovan', () => {
- const kovanRpcUrl = constants.KOVAN_RPC_URL;
- const packageJSONContent = fs.readFileSync('package.json', 'utf-8');
- const packageJSON = JSON.parse(packageJSONContent);
- const mnemonic = packageJSON.config.mnemonic;
- const web3Provider = new HDWalletProvider(mnemonic, kovanRpcUrl);
- const config = {
- networkId: constants.KOVAN_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3Provider, config);
- it('token registry contract is deployed', async () => {
- await (zeroEx.tokenRegistry as any)._getTokenRegistryContractAsync();
- }).timeout(TIMEOUT);
- it('proxy contract is deployed', async () => {
- await (zeroEx.proxy as any)._getTokenTransferProxyContractAsync();
- }).timeout(TIMEOUT);
- it('exchange contract is deployed', async () => {
- await (zeroEx.exchange as any)._getExchangeContractAsync();
- }).timeout(TIMEOUT);
- });
- describe('contracts are deployed on ropsten', () => {
- const ropstenRpcUrl = constants.ROPSTEN_RPC_URL;
- const packageJSONContent = fs.readFileSync('package.json', 'utf-8');
- const packageJSON = JSON.parse(packageJSONContent);
- const mnemonic = packageJSON.config.mnemonic;
- const web3Provider = new HDWalletProvider(mnemonic, ropstenRpcUrl);
- const config = {
- networkId: constants.ROPSTEN_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3Provider, config);
- it('token registry contract is deployed', async () => {
- await (zeroEx.tokenRegistry as any)._getTokenRegistryContractAsync();
- }).timeout(TIMEOUT);
- it('proxy contract is deployed', async () => {
- await (zeroEx.proxy as any)._getTokenTransferProxyContractAsync();
- }).timeout(TIMEOUT);
- it('exchange contract is deployed', async () => {
- await (zeroEx.exchange as any)._getExchangeContractAsync();
- }).timeout(TIMEOUT);
- });
-});
diff --git a/packages/0x.js/test/assert_test.ts b/packages/0x.js/test/assert_test.ts
deleted file mode 100644
index c4451742f..000000000
--- a/packages/0x.js/test/assert_test.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { web3Factory } from '@0xproject/dev-utils';
-import * as chai from 'chai';
-import 'mocha';
-
-import { ZeroEx } from '../src';
-import { assert } from '../src/utils/assert';
-
-import { constants } from './utils/constants';
-
-const expect = chai.expect;
-
-describe('Assertion library', () => {
- const web3 = web3Factory.create();
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3.currentProvider, config);
- describe('#isSenderAddressHexAsync', () => {
- it('throws when address is invalid', async () => {
- const address = '0xdeadbeef';
- const varName = 'address';
- return expect(
- assert.isSenderAddressAsync(varName, address, (zeroEx as any)._web3Wrapper),
- ).to.be.rejectedWith(`Expected ${varName} to be of type ETHAddressHex, encountered: ${address}`);
- });
- it('throws when address is unavailable', async () => {
- const validUnrelatedAddress = '0x8b0292b11a196601eddce54b665cafeca0347d42';
- const varName = 'address';
- return expect(
- assert.isSenderAddressAsync(varName, validUnrelatedAddress, (zeroEx as any)._web3Wrapper),
- ).to.be.rejectedWith(
- `Specified ${varName} ${validUnrelatedAddress} isn't available through the supplied web3 provider`,
- );
- });
- it("doesn't throw if address is available", async () => {
- const availableAddress = (await zeroEx.getAvailableAddressesAsync())[0];
- const varName = 'address';
- return expect(
- assert.isSenderAddressAsync(varName, availableAddress, (zeroEx as any)._web3Wrapper),
- ).to.become(undefined);
- });
- });
-});
diff --git a/packages/0x.js/test/ether_token_wrapper_test.ts b/packages/0x.js/test/ether_token_wrapper_test.ts
deleted file mode 100644
index 6237ccf23..000000000
--- a/packages/0x.js/test/ether_token_wrapper_test.ts
+++ /dev/null
@@ -1,387 +0,0 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import 'mocha';
-import * as Web3 from 'web3';
-
-import {
- ApprovalContractEventArgs,
- BlockParamLiteral,
- BlockRange,
- DecodedLogEvent,
- DepositContractEventArgs,
- EtherTokenEvents,
- Token,
- TransferContractEventArgs,
- WithdrawalContractEventArgs,
- ZeroEx,
- ZeroExError,
-} from '../src';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { reportNodeCallbackErrors } from './utils/report_callback_errors';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-// Since the address depositing/withdrawing ETH/WETH also needs to pay gas costs for the transaction,
-// a small amount of ETH will be used to pay this gas cost. We therefore check that the difference between
-// the expected balance and actual balance (given the amount of ETH deposited), only deviates by the amount
-// required to pay gas costs.
-const MAX_REASONABLE_GAS_COST_IN_WEI = 62517;
-
-describe('EtherTokenWrapper', () => {
- let zeroEx: ZeroEx;
- let tokens: Token[];
- let userAddresses: string[];
- let addressWithETH: string;
- let wethContractAddress: string;
- let depositWeiAmount: BigNumber;
- let decimalPlaces: number;
- let addressWithoutFunds: string;
- const gasPrice = new BigNumber(1);
- const zeroExConfig = {
- gasPrice,
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const transferAmount = new BigNumber(42);
- const allowanceAmount = new BigNumber(42);
- const depositAmount = new BigNumber(42);
- const withdrawalAmount = new BigNumber(42);
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- addressWithETH = userAddresses[0];
- wethContractAddress = zeroEx.etherToken.getContractAddressIfExists() as string;
- depositWeiAmount = (zeroEx as any)._web3Wrapper.toWei(new BigNumber(5));
- decimalPlaces = 7;
- addressWithoutFunds = userAddresses[1];
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#getContractAddressIfExists', async () => {
- it('should return contract address if connected to a known network', () => {
- const contractAddressIfExists = zeroEx.etherToken.getContractAddressIfExists();
- expect(contractAddressIfExists).to.not.be.undefined();
- });
- it('should throw if connected to a private network and contract addresses are not specified', () => {
- const UNKNOWN_NETWORK_NETWORK_ID = 10;
- expect(
- () =>
- new ZeroEx(web3.currentProvider, {
- networkId: UNKNOWN_NETWORK_NETWORK_ID,
- } as any),
- ).to.throw();
- });
- });
- describe('#depositAsync', () => {
- it('should successfully deposit ETH and issue Wrapped ETH tokens', async () => {
- const preETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
- const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
- expect(preETHBalance).to.be.bignumber.gt(0);
- expect(preWETHBalance).to.be.bignumber.equal(0);
-
- const txHash = await zeroEx.etherToken.depositAsync(wethContractAddress, depositWeiAmount, addressWithETH);
- await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const postETHBalanceInWei = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
- const postWETHBalanceInBaseUnits = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
-
- expect(postWETHBalanceInBaseUnits).to.be.bignumber.equal(depositWeiAmount);
- const remainingETHInWei = preETHBalance.minus(depositWeiAmount);
- const gasCost = remainingETHInWei.minus(postETHBalanceInWei);
- expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
- });
- it('should throw if user has insufficient ETH balance for deposit', async () => {
- const preETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
-
- const extraETHBalance = (zeroEx as any)._web3Wrapper.toWei(5, 'ether');
- const overETHBalanceinWei = preETHBalance.add(extraETHBalance);
-
- return expect(
- zeroEx.etherToken.depositAsync(wethContractAddress, overETHBalanceinWei, addressWithETH),
- ).to.be.rejectedWith(ZeroExError.InsufficientEthBalanceForDeposit);
- });
- });
- describe('#withdrawAsync', () => {
- it('should successfully withdraw ETH in return for Wrapped ETH tokens', async () => {
- const ETHBalanceInWei = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
-
- await zeroEx.etherToken.depositAsync(wethContractAddress, depositWeiAmount, addressWithETH);
-
- const expectedPreETHBalance = ETHBalanceInWei.minus(depositWeiAmount);
- const preETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
- const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
- let gasCost = expectedPreETHBalance.minus(preETHBalance);
- expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
- expect(preWETHBalance).to.be.bignumber.equal(depositWeiAmount);
-
- const txHash = await zeroEx.etherToken.withdrawAsync(wethContractAddress, depositWeiAmount, addressWithETH);
- await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const postETHBalance = await (zeroEx as any)._web3Wrapper.getBalanceInWeiAsync(addressWithETH);
- const postWETHBalanceInBaseUnits = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
-
- expect(postWETHBalanceInBaseUnits).to.be.bignumber.equal(0);
- const expectedETHBalance = preETHBalance.add(depositWeiAmount).round(decimalPlaces);
- gasCost = expectedETHBalance.minus(postETHBalance);
- expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
- });
- it('should throw if user has insufficient WETH balance for withdrawal', async () => {
- const preWETHBalance = await zeroEx.token.getBalanceAsync(wethContractAddress, addressWithETH);
- expect(preWETHBalance).to.be.bignumber.equal(0);
-
- const overWETHBalance = preWETHBalance.add(999999999);
-
- return expect(
- zeroEx.etherToken.withdrawAsync(wethContractAddress, overWETHBalance, addressWithETH),
- ).to.be.rejectedWith(ZeroExError.InsufficientWEthBalanceForWithdrawal);
- });
- });
- describe('#subscribe', () => {
- const indexFilterValues = {};
- let etherTokenAddress: string;
- before(() => {
- const tokenUtils = new TokenUtils(tokens);
- const etherToken = tokenUtils.getWethTokenOrThrow();
- etherTokenAddress = etherToken.address;
- });
- afterEach(() => {
- zeroEx.etherToken.unsubscribeAll();
- });
- // Hack: Mocha does not allow a test to be both async and have a `done` callback
- // Since we need to await the receipt of the event in the `subscribe` callback,
- // we do need both. A hack is to make the top-level async fn w/ a done callback and then
- // wrap the rest of the test in an async block
- // Source: https://github.com/mochajs/mocha/issues/2407
- it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<TransferContractEventArgs>) => {
- expect(logEvent).to.not.be.undefined();
- expect(logEvent.isRemoved).to.be.false();
- expect(logEvent.log.logIndex).to.be.equal(0);
- expect(logEvent.log.transactionIndex).to.be.equal(0);
- expect(logEvent.log.blockNumber).to.be.a('number');
- const args = logEvent.log.args;
- expect(args._from).to.be.equal(addressWithETH);
- expect(args._to).to.be.equal(addressWithoutFunds);
- expect(args._value).to.be.bignumber.equal(transferAmount);
- },
- );
- await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
- zeroEx.etherToken.subscribe(etherTokenAddress, EtherTokenEvents.Transfer, indexFilterValues, callback);
- await zeroEx.token.transferAsync(
- etherTokenAddress,
- addressWithETH,
- addressWithoutFunds,
- transferAmount,
- );
- })().catch(done);
- });
- it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- expect(logEvent).to.not.be.undefined();
- expect(logEvent.isRemoved).to.be.false();
- const args = logEvent.log.args;
- expect(args._owner).to.be.equal(addressWithETH);
- expect(args._spender).to.be.equal(addressWithoutFunds);
- expect(args._value).to.be.bignumber.equal(allowanceAmount);
- },
- );
- zeroEx.etherToken.subscribe(etherTokenAddress, EtherTokenEvents.Approval, indexFilterValues, callback);
- await zeroEx.token.setAllowanceAsync(
- etherTokenAddress,
- addressWithETH,
- addressWithoutFunds,
- allowanceAmount,
- );
- })().catch(done);
- });
- it('Should receive the Deposit event when ether is being deposited', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<DepositContractEventArgs>) => {
- expect(logEvent).to.not.be.undefined();
- expect(logEvent.isRemoved).to.be.false();
- const args = logEvent.log.args;
- expect(args._owner).to.be.equal(addressWithETH);
- expect(args._value).to.be.bignumber.equal(depositAmount);
- },
- );
- zeroEx.etherToken.subscribe(etherTokenAddress, EtherTokenEvents.Deposit, indexFilterValues, callback);
- await zeroEx.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
- })().catch(done);
- });
- it('Should receive the Withdrawal event when ether is being withdrawn', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<WithdrawalContractEventArgs>) => {
- expect(logEvent).to.not.be.undefined();
- expect(logEvent.isRemoved).to.be.false();
- const args = logEvent.log.args;
- expect(args._owner).to.be.equal(addressWithETH);
- expect(args._value).to.be.bignumber.equal(depositAmount);
- },
- );
- await zeroEx.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
- zeroEx.etherToken.subscribe(
- etherTokenAddress,
- EtherTokenEvents.Withdrawal,
- indexFilterValues,
- callback,
- );
- await zeroEx.etherToken.withdrawAsync(etherTokenAddress, withdrawalAmount, addressWithETH);
- })().catch(done);
- });
- it('should cancel outstanding subscriptions when ZeroEx.setProvider is called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- zeroEx.etherToken.subscribe(
- etherTokenAddress,
- EtherTokenEvents.Transfer,
- indexFilterValues,
- callbackNeverToBeCalled,
- );
- const callbackToBeCalled = reportNodeCallbackErrors(done)();
- const newProvider = web3Factory.getRpcProvider();
- zeroEx.setProvider(newProvider, constants.TESTRPC_NETWORK_ID);
- await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
- zeroEx.etherToken.subscribe(
- etherTokenAddress,
- EtherTokenEvents.Transfer,
- indexFilterValues,
- callbackToBeCalled,
- );
- await zeroEx.token.transferAsync(
- etherTokenAddress,
- addressWithETH,
- addressWithoutFunds,
- transferAmount,
- );
- })().catch(done);
- });
- it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- await zeroEx.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
- const subscriptionToken = zeroEx.etherToken.subscribe(
- etherTokenAddress,
- EtherTokenEvents.Transfer,
- indexFilterValues,
- callbackNeverToBeCalled,
- );
- zeroEx.etherToken.unsubscribe(subscriptionToken);
- await zeroEx.token.transferAsync(
- etherTokenAddress,
- addressWithETH,
- addressWithoutFunds,
- transferAmount,
- );
- done();
- })().catch(done);
- });
- });
- describe('#getLogsAsync', () => {
- let etherTokenAddress: string;
- let tokenTransferProxyAddress: string;
- const blockRange: BlockRange = {
- fromBlock: 0,
- toBlock: BlockParamLiteral.Latest,
- };
- let txHash: string;
- before(() => {
- addressWithETH = userAddresses[0];
- const tokenUtils = new TokenUtils(tokens);
- const etherToken = tokenUtils.getWethTokenOrThrow();
- etherTokenAddress = etherToken.address;
- tokenTransferProxyAddress = zeroEx.proxy.getContractAddress();
- });
- it('should get logs with decoded args emitted by Approval', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const eventName = EtherTokenEvents.Approval;
- const indexFilterValues = {};
- const logs = await zeroEx.etherToken.getLogsAsync<ApprovalContractEventArgs>(
- etherTokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(logs[0].event).to.be.equal(eventName);
- expect(args._owner).to.be.equal(addressWithETH);
- expect(args._spender).to.be.equal(tokenTransferProxyAddress);
- expect(args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
- });
- it('should get logs with decoded args emitted by Deposit', async () => {
- await zeroEx.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
- const eventName = EtherTokenEvents.Deposit;
- const indexFilterValues = {};
- const logs = await zeroEx.etherToken.getLogsAsync<DepositContractEventArgs>(
- etherTokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(logs[0].event).to.be.equal(eventName);
- expect(args._owner).to.be.equal(addressWithETH);
- expect(args._value).to.be.bignumber.equal(depositAmount);
- });
- it('should only get the logs with the correct event name', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const differentEventName = EtherTokenEvents.Transfer;
- const indexFilterValues = {};
- const logs = await zeroEx.etherToken.getLogsAsync(
- etherTokenAddress,
- differentEventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(0);
- });
- it('should only get the logs with the correct indexed fields', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithETH);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(etherTokenAddress, addressWithoutFunds);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const eventName = EtherTokenEvents.Approval;
- const indexFilterValues = {
- _owner: addressWithETH,
- };
- const logs = await zeroEx.etherToken.getLogsAsync<ApprovalContractEventArgs>(
- etherTokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(args._owner).to.be.equal(addressWithETH);
- });
- });
-});
diff --git a/packages/0x.js/test/event_watcher_test.ts b/packages/0x.js/test/event_watcher_test.ts
deleted file mode 100644
index 2fa6c0580..000000000
--- a/packages/0x.js/test/event_watcher_test.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-import { web3Factory } from '@0xproject/dev-utils';
-import { LogEntry } from '@0xproject/types';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-import * as Sinon from 'sinon';
-import * as Web3 from 'web3';
-
-import { LogEvent } from '../src';
-import { EventWatcher } from '../src/order_watcher/event_watcher';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { reportNodeCallbackErrors } from './utils/report_callback_errors';
-
-chaiSetup.configure();
-const expect = chai.expect;
-
-describe('EventWatcher', () => {
- let web3: Web3;
- let stubs: Sinon.SinonStub[] = [];
- let eventWatcher: EventWatcher;
- let web3Wrapper: Web3Wrapper;
- const logA: LogEntry = {
- address: '0x71d271f8b14adef568f8f28f1587ce7271ac4ca5',
- blockHash: null,
- blockNumber: null,
- data: '',
- logIndex: null,
- topics: [],
- transactionHash: '0x004881d38cd4a8f72f1a0d68c8b9b8124504706041ff37019c1d1ed6bfda8e17',
- transactionIndex: 0,
- };
- const logB: LogEntry = {
- address: '0x8d12a197cb00d4747a1fe03395095ce2a5cc6819',
- blockHash: null,
- blockNumber: null,
- data: '',
- logIndex: null,
- topics: ['0xf341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567'],
- transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
- transactionIndex: 0,
- };
- const logC: LogEntry = {
- address: '0x1d271f8b174adef58f1587ce68f8f27271ac4ca5',
- blockHash: null,
- blockNumber: null,
- data: '',
- logIndex: null,
- topics: ['0xf341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567'],
- transactionHash: '0x01ef3c048b18d9b09ea195b4ed94cf8dd5f3d857a1905ff886b152cfb1166f25',
- transactionIndex: 0,
- };
- before(async () => {
- web3 = web3Factory.create();
- const pollingIntervalMs = 10;
- web3Wrapper = new Web3Wrapper(web3.currentProvider);
- eventWatcher = new EventWatcher(web3Wrapper, pollingIntervalMs);
- });
- afterEach(() => {
- // clean up any stubs after the test has completed
- _.each(stubs, s => s.restore());
- stubs = [];
- eventWatcher.unsubscribe();
- });
- it('correctly emits initial log events', (done: DoneCallback) => {
- const logs: LogEntry[] = [logA, logB];
- const expectedLogEvents = [
- {
- removed: false,
- ...logA,
- },
- {
- removed: false,
- ...logB,
- },
- ];
- const getLogsStub = Sinon.stub(web3Wrapper, 'getLogsAsync');
- getLogsStub.onCall(0).returns(logs);
- stubs.push(getLogsStub);
- const expectedToBeCalledOnce = false;
- const callback = reportNodeCallbackErrors(done, expectedToBeCalledOnce)((event: LogEvent) => {
- const expectedLogEvent = expectedLogEvents.shift();
- expect(event).to.be.deep.equal(expectedLogEvent);
- if (_.isEmpty(expectedLogEvents)) {
- done();
- }
- });
- eventWatcher.subscribe(callback);
- });
- it('correctly computes the difference and emits only changes', (done: DoneCallback) => {
- const initialLogs: LogEntry[] = [logA, logB];
- const changedLogs: LogEntry[] = [logA, logC];
- const expectedLogEvents = [
- {
- removed: false,
- ...logA,
- },
- {
- removed: false,
- ...logB,
- },
- {
- removed: true,
- ...logB,
- },
- {
- removed: false,
- ...logC,
- },
- ];
- const getLogsStub = Sinon.stub(web3Wrapper, 'getLogsAsync');
- getLogsStub.onCall(0).returns(initialLogs);
- getLogsStub.onCall(1).returns(changedLogs);
- stubs.push(getLogsStub);
- const expectedToBeCalledOnce = false;
- const callback = reportNodeCallbackErrors(done, expectedToBeCalledOnce)((event: LogEvent) => {
- const expectedLogEvent = expectedLogEvents.shift();
- expect(event).to.be.deep.equal(expectedLogEvent);
- if (_.isEmpty(expectedLogEvents)) {
- done();
- }
- });
- eventWatcher.subscribe(callback);
- });
-});
diff --git a/packages/0x.js/test/exchange_transfer_simulator_test.ts b/packages/0x.js/test/exchange_transfer_simulator_test.ts
deleted file mode 100644
index 4447a61cb..000000000
--- a/packages/0x.js/test/exchange_transfer_simulator_test.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-
-import { ExchangeContractErrs, Token, ZeroEx } from '../src';
-import { TradeSide, TransferType } from '../src/types';
-import { ExchangeTransferSimulator } from '../src/utils/exchange_transfer_simulator';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('ExchangeTransferSimulator', () => {
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3.currentProvider, config);
- const transferAmount = new BigNumber(5);
- let userAddresses: string[];
- let tokens: Token[];
- let coinbase: string;
- let sender: string;
- let recipient: string;
- let exampleTokenAddress: string;
- let exchangeTransferSimulator: ExchangeTransferSimulator;
- let txHash: string;
- before(async () => {
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- [coinbase, sender, recipient] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- exampleTokenAddress = tokens[0].address;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#transferFromAsync', () => {
- beforeEach(() => {
- exchangeTransferSimulator = new ExchangeTransferSimulator(zeroEx.token, BlockParamLiteral.Latest);
- });
- it("throws if the user doesn't have enough allowance", async () => {
- return expect(
- exchangeTransferSimulator.transferFromAsync(
- exampleTokenAddress,
- sender,
- recipient,
- transferAmount,
- TradeSide.Taker,
- TransferType.Trade,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.InsufficientTakerAllowance);
- });
- it("throws if the user doesn't have enough balance", async () => {
- txHash = await zeroEx.token.setProxyAllowanceAsync(exampleTokenAddress, sender, transferAmount);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- return expect(
- exchangeTransferSimulator.transferFromAsync(
- exampleTokenAddress,
- sender,
- recipient,
- transferAmount,
- TradeSide.Maker,
- TransferType.Trade,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.InsufficientMakerBalance);
- });
- it('updates balances and proxyAllowance after transfer', async () => {
- txHash = await zeroEx.token.transferAsync(exampleTokenAddress, coinbase, sender, transferAmount);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- txHash = await zeroEx.token.setProxyAllowanceAsync(exampleTokenAddress, sender, transferAmount);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- await exchangeTransferSimulator.transferFromAsync(
- exampleTokenAddress,
- sender,
- recipient,
- transferAmount,
- TradeSide.Taker,
- TransferType.Trade,
- );
- const store = (exchangeTransferSimulator as any)._store;
- const senderBalance = await store.getBalanceAsync(exampleTokenAddress, sender);
- const recipientBalance = await store.getBalanceAsync(exampleTokenAddress, recipient);
- const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleTokenAddress, sender);
- expect(senderBalance).to.be.bignumber.equal(0);
- expect(recipientBalance).to.be.bignumber.equal(transferAmount);
- expect(senderProxyAllowance).to.be.bignumber.equal(0);
- });
- it("doesn't update proxyAllowance after transfer if unlimited", async () => {
- txHash = await zeroEx.token.transferAsync(exampleTokenAddress, coinbase, sender, transferAmount);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(exampleTokenAddress, sender);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- await exchangeTransferSimulator.transferFromAsync(
- exampleTokenAddress,
- sender,
- recipient,
- transferAmount,
- TradeSide.Taker,
- TransferType.Trade,
- );
- const store = (exchangeTransferSimulator as any)._store;
- const senderBalance = await store.getBalanceAsync(exampleTokenAddress, sender);
- const recipientBalance = await store.getBalanceAsync(exampleTokenAddress, recipient);
- const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleTokenAddress, sender);
- expect(senderBalance).to.be.bignumber.equal(0);
- expect(recipientBalance).to.be.bignumber.equal(transferAmount);
- expect(senderProxyAllowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
- });
- });
-});
diff --git a/packages/0x.js/test/exchange_wrapper_test.ts b/packages/0x.js/test/exchange_wrapper_test.ts
deleted file mode 100644
index cfc390bae..000000000
--- a/packages/0x.js/test/exchange_wrapper_test.ts
+++ /dev/null
@@ -1,1159 +0,0 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-import * as Web3 from 'web3';
-
-import {
- BlockRange,
- DecodedLogEvent,
- ExchangeContractErrs,
- ExchangeEvents,
- LogCancelContractEventArgs,
- LogFillContractEventArgs,
- OrderCancellationRequest,
- OrderFillRequest,
- SignedOrder,
- Token,
- ZeroEx,
-} from '../src';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { FillScenarios } from './utils/fill_scenarios';
-import { reportNodeCallbackErrors } from './utils/report_callback_errors';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-const NON_EXISTENT_ORDER_HASH = '0x79370342234e7acd6bbeac335bd3bb1d368383294b64b8160a00f4060e4d3777';
-
-describe('ExchangeWrapper', () => {
- let zeroEx: ZeroEx;
- let tokenUtils: TokenUtils;
- let tokens: Token[];
- let userAddresses: string[];
- let zrxTokenAddress: string;
- let fillScenarios: FillScenarios;
- let exchangeContractAddress: string;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- exchangeContractAddress = zeroEx.exchange.getContractAddress();
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(zeroEx, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
- await fillScenarios.initTokenBalancesAsync();
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('fillOrKill order(s)', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let makerAddress: string;
- let takerAddress: string;
- let feeRecipient: string;
- const takerTokenFillAmount = new BigNumber(5);
- before(async () => {
- [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- describe('#batchFillOrKillAsync', () => {
- it('successfully batch fillOrKill', async () => {
- const fillableAmount = new BigNumber(5);
- const partialFillTakerAmount = new BigNumber(2);
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const orderFillRequests = [
- {
- signedOrder,
- takerTokenFillAmount: partialFillTakerAmount,
- },
- {
- signedOrder: anotherSignedOrder,
- takerTokenFillAmount: partialFillTakerAmount,
- },
- ];
- await zeroEx.exchange.batchFillOrKillAsync(orderFillRequests, takerAddress);
- });
- describe('order transaction options', () => {
- let signedOrder: SignedOrder;
- let orderFillRequests: OrderFillRequest[];
- const fillableAmount = new BigNumber(5);
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- orderFillRequests = [
- {
- signedOrder,
- takerTokenFillAmount: new BigNumber(0),
- },
- ];
- });
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.batchFillOrKillAsync(orderFillRequests, takerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.batchFillOrKillAsync(orderFillRequests, takerAddress, {
- shouldValidate: true,
- }),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.batchFillOrKillAsync(orderFillRequests, takerAddress, {
- shouldValidate: false,
- }),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- });
- });
- describe('#fillOrKillOrderAsync', () => {
- let signedOrder: SignedOrder;
- const fillableAmount = new BigNumber(5);
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- });
- describe('successful fills', () => {
- it('should fill a valid order', async () => {
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- 0,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- 0,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount,
- );
- await zeroEx.exchange.fillOrKillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress);
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(takerTokenFillAmount),
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- takerTokenFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- takerTokenFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(takerTokenFillAmount),
- );
- });
- it('should partially fill a valid order', async () => {
- const partialFillAmount = new BigNumber(3);
- await zeroEx.exchange.fillOrKillOrderAsync(signedOrder, partialFillAmount, takerAddress);
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(partialFillAmount),
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- partialFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- partialFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(partialFillAmount),
- );
- });
- });
- describe('order transaction options', () => {
- const emptyFillableAmount = new BigNumber(0);
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.fillOrKillOrderAsync(signedOrder, emptyFillableAmount, takerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrKillOrderAsync(signedOrder, emptyFillableAmount, takerAddress, {
- shouldValidate: true,
- }),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrKillOrderAsync(signedOrder, emptyFillableAmount, takerAddress, {
- shouldValidate: false,
- }),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- });
- });
- });
- describe('fill order(s)', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let makerAddress: string;
- let takerAddress: string;
- let feeRecipient: string;
- const fillableAmount = new BigNumber(5);
- const takerTokenFillAmount = new BigNumber(5);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- before(async () => {
- [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- describe('#fillOrderAsync', () => {
- describe('successful fills', () => {
- it('should fill a valid order', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- 0,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- 0,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount,
- );
- const txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- takerTokenFillAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(takerTokenFillAmount),
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- takerTokenFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- takerTokenFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(takerTokenFillAmount),
- );
- });
- it('should partially fill the valid order', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const partialFillAmount = new BigNumber(3);
- const txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- partialFillAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, makerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(partialFillAmount),
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, makerAddress)).to.be.bignumber.equal(
- partialFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(makerTokenAddress, takerAddress)).to.be.bignumber.equal(
- partialFillAmount,
- );
- expect(await zeroEx.token.getBalanceAsync(takerTokenAddress, takerAddress)).to.be.bignumber.equal(
- fillableAmount.minus(partialFillAmount),
- );
- });
- it('should fill the valid orders with fees', async () => {
- const makerFee = new BigNumber(1);
- const takerFee = new BigNumber(2);
- const signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- fillableAmount,
- feeRecipient,
- );
- const txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- takerTokenFillAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(await zeroEx.token.getBalanceAsync(zrxTokenAddress, feeRecipient)).to.be.bignumber.equal(
- makerFee.plus(takerFee),
- );
- });
- });
- describe('order transaction options', () => {
- let signedOrder: SignedOrder;
- const emptyFillTakerAmount = new BigNumber(0);
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- });
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.fillOrderAsync(
- signedOrder,
- emptyFillTakerAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrderAsync(
- signedOrder,
- emptyFillTakerAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: true,
- },
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrderAsync(
- signedOrder,
- emptyFillTakerAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: false,
- },
- ),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- });
- describe('negative fill amount', async () => {
- let signedOrder: SignedOrder;
- const negativeFillTakerAmount = new BigNumber(-100);
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- });
- it('should not allow the exchange wrapper to fill if amount is negative', async () => {
- return expect(
- zeroEx.exchange.fillOrderAsync(
- signedOrder,
- negativeFillTakerAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejected();
- });
- });
- });
- describe('#batchFillOrdersAsync', () => {
- let signedOrder: SignedOrder;
- let signedOrderHashHex: string;
- let anotherSignedOrder: SignedOrder;
- let anotherOrderHashHex: string;
- let orderFillBatch: OrderFillRequest[];
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- signedOrderHashHex = ZeroEx.getOrderHashHex(signedOrder);
- anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- anotherOrderHashHex = ZeroEx.getOrderHashHex(anotherSignedOrder);
- });
- describe('successful batch fills', () => {
- beforeEach(() => {
- orderFillBatch = [
- {
- signedOrder,
- takerTokenFillAmount,
- },
- {
- signedOrder: anotherSignedOrder,
- takerTokenFillAmount,
- },
- ];
- });
- it('should throw if a batch is empty', async () => {
- return expect(
- zeroEx.exchange.batchFillOrdersAsync(
- [],
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- });
- it('should successfully fill multiple orders', async () => {
- const txHash = await zeroEx.exchange.batchFillOrdersAsync(
- orderFillBatch,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
- const anotherFilledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
- expect(filledAmount).to.be.bignumber.equal(takerTokenFillAmount);
- expect(anotherFilledAmount).to.be.bignumber.equal(takerTokenFillAmount);
- });
- });
- describe('order transaction options', () => {
- beforeEach(async () => {
- const emptyFillTakerAmount = new BigNumber(0);
- orderFillBatch = [
- {
- signedOrder,
- takerTokenFillAmount: emptyFillTakerAmount,
- },
- {
- signedOrder: anotherSignedOrder,
- takerTokenFillAmount: emptyFillTakerAmount,
- },
- ];
- });
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.batchFillOrdersAsync(
- orderFillBatch,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.batchFillOrdersAsync(
- orderFillBatch,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: true,
- },
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.batchFillOrdersAsync(
- orderFillBatch,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: false,
- },
- ),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- });
- describe('negative batch fill amount', async () => {
- beforeEach(async () => {
- const negativeFillTakerAmount = new BigNumber(-100);
- orderFillBatch = [
- {
- signedOrder,
- takerTokenFillAmount,
- },
- {
- signedOrder: anotherSignedOrder,
- takerTokenFillAmount: negativeFillTakerAmount,
- },
- ];
- });
- it('should not allow the exchange wrapper to batch fill if any amount is negative', async () => {
- return expect(
- zeroEx.exchange.batchFillOrdersAsync(
- orderFillBatch,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejected();
- });
- });
- });
- describe('#fillOrdersUpTo', () => {
- let signedOrder: SignedOrder;
- let signedOrderHashHex: string;
- let anotherSignedOrder: SignedOrder;
- let anotherOrderHashHex: string;
- let signedOrders: SignedOrder[];
- const fillUpToAmount = fillableAmount.plus(fillableAmount).minus(1);
- beforeEach(async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- signedOrderHashHex = ZeroEx.getOrderHashHex(signedOrder);
- anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- anotherOrderHashHex = ZeroEx.getOrderHashHex(anotherSignedOrder);
- signedOrders = [signedOrder, anotherSignedOrder];
- });
- describe('successful batch fills', () => {
- it('should throw if a batch is empty', async () => {
- return expect(
- zeroEx.exchange.fillOrdersUpToAsync(
- [],
- fillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.BatchOrdersMustHaveAtLeastOneItem);
- });
- it('should successfully fill up to specified amount when all orders are fully funded', async () => {
- const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- fillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
- const anotherFilledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
- expect(filledAmount).to.be.bignumber.equal(fillableAmount);
- const remainingFillAmount = fillableAmount.minus(1);
- expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
- });
- it('should successfully fill up to specified amount and leave the rest of the orders untouched', async () => {
- const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
- const zeroAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
- expect(filledAmount).to.be.bignumber.equal(fillableAmount);
- expect(zeroAmount).to.be.bignumber.equal(0);
- });
- it('should successfully fill up to specified amount even if filling all orders would fail', async () => {
- const missingBalance = new BigNumber(1); // User will still have enough balance to fill up to 9,
- // but won't have 10 to fully fill all orders in a batch.
- await zeroEx.token.transferAsync(makerTokenAddress, makerAddress, coinbase, missingBalance);
- const txHash = await zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- fillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const filledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(signedOrderHashHex);
- const anotherFilledAmount = await zeroEx.exchange.getFilledTakerAmountAsync(anotherOrderHashHex);
- expect(filledAmount).to.be.bignumber.equal(fillableAmount);
- const remainingFillAmount = fillableAmount.minus(1);
- expect(anotherFilledAmount).to.be.bignumber.equal(remainingFillAmount);
- });
- });
- describe('failed batch fills', () => {
- it("should fail validation if user doesn't have enough balance without fill up to", async () => {
- const missingBalance = new BigNumber(2); // User will only have enough balance to fill up to 8
- await zeroEx.token.transferAsync(makerTokenAddress, makerAddress, coinbase, missingBalance);
- return expect(
- zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- fillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.InsufficientMakerBalance);
- });
- });
- describe('order transaction options', () => {
- const emptyFillUpToAmount = new BigNumber(0);
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- emptyFillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- emptyFillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: true,
- },
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.fillOrdersUpToAsync(
- signedOrders,
- emptyFillUpToAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- {
- shouldValidate: false,
- },
- ),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- });
- });
- });
- describe('cancel order(s)', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let makerAddress: string;
- let takerAddress: string;
- const fillableAmount = new BigNumber(5);
- let signedOrder: SignedOrder;
- let orderHashHex: string;
- const cancelAmount = new BigNumber(3);
- beforeEach(async () => {
- [coinbase, makerAddress, takerAddress] = userAddresses;
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- orderHashHex = ZeroEx.getOrderHashHex(signedOrder);
- });
- describe('#cancelOrderAsync', () => {
- describe('successful cancels', () => {
- it('should cancel an order', async () => {
- const txHash = await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmount);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const cancelledAmount = await zeroEx.exchange.getCancelledTakerAmountAsync(orderHashHex);
- expect(cancelledAmount).to.be.bignumber.equal(cancelAmount);
- });
- });
- describe('order transaction options', () => {
- const emptyCancelTakerTokenAmount = new BigNumber(0);
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(
- zeroEx.exchange.cancelOrderAsync(signedOrder, emptyCancelTakerTokenAmount),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.cancelOrderAsync(signedOrder, emptyCancelTakerTokenAmount, {
- shouldValidate: true,
- }),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.cancelOrderAsync(signedOrder, emptyCancelTakerTokenAmount, {
- shouldValidate: false,
- }),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- });
- });
- describe('#batchCancelOrdersAsync', () => {
- let anotherSignedOrder: SignedOrder;
- let anotherOrderHashHex: string;
- let cancelBatch: OrderCancellationRequest[];
- beforeEach(async () => {
- anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- anotherOrderHashHex = ZeroEx.getOrderHashHex(anotherSignedOrder);
- cancelBatch = [
- {
- order: signedOrder,
- takerTokenCancelAmount: cancelAmount,
- },
- {
- order: anotherSignedOrder,
- takerTokenCancelAmount: cancelAmount,
- },
- ];
- });
- describe('failed batch cancels', () => {
- it('should throw when orders have different makers', async () => {
- const signedOrderWithDifferentMaker = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- takerAddress,
- takerAddress,
- fillableAmount,
- );
- return expect(
- zeroEx.exchange.batchCancelOrdersAsync([
- cancelBatch[0],
- {
- order: signedOrderWithDifferentMaker,
- takerTokenCancelAmount: cancelAmount,
- },
- ]),
- ).to.be.rejectedWith(ExchangeContractErrs.MultipleMakersInSingleCancelBatchDisallowed);
- });
- });
- describe('successful batch cancels', () => {
- it('should cancel a batch of orders', async () => {
- await zeroEx.exchange.batchCancelOrdersAsync(cancelBatch);
- const cancelledAmount = await zeroEx.exchange.getCancelledTakerAmountAsync(orderHashHex);
- const anotherCancelledAmount = await zeroEx.exchange.getCancelledTakerAmountAsync(
- anotherOrderHashHex,
- );
- expect(cancelledAmount).to.be.bignumber.equal(cancelAmount);
- expect(anotherCancelledAmount).to.be.bignumber.equal(cancelAmount);
- });
- });
- describe('order transaction options', () => {
- beforeEach(async () => {
- const emptyTakerTokenCancelAmount = new BigNumber(0);
- cancelBatch = [
- {
- order: signedOrder,
- takerTokenCancelAmount: emptyTakerTokenCancelAmount,
- },
- {
- order: anotherSignedOrder,
- takerTokenCancelAmount: emptyTakerTokenCancelAmount,
- },
- ];
- });
- it('should validate when orderTransactionOptions are not present', async () => {
- return expect(zeroEx.exchange.batchCancelOrdersAsync(cancelBatch)).to.be.rejectedWith(
- ExchangeContractErrs.OrderCancelAmountZero,
- );
- });
- it('should validate when orderTransactionOptions specify to validate', async () => {
- return expect(
- zeroEx.exchange.batchCancelOrdersAsync(cancelBatch, {
- shouldValidate: true,
- }),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- it('should not validate when orderTransactionOptions specify not to validate', async () => {
- return expect(
- zeroEx.exchange.batchCancelOrdersAsync(cancelBatch, {
- shouldValidate: false,
- }),
- ).to.not.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- });
- });
- });
- describe('tests that require partially filled order', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let takerAddress: string;
- let fillableAmount: BigNumber;
- let partialFillAmount: BigNumber;
- let signedOrder: SignedOrder;
- let orderHash: string;
- before(() => {
- takerAddress = userAddresses[1];
- tokenUtils = new TokenUtils(tokens);
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- beforeEach(async () => {
- fillableAmount = new BigNumber(5);
- partialFillAmount = new BigNumber(2);
- signedOrder = await fillScenarios.createPartiallyFilledSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- takerAddress,
- fillableAmount,
- partialFillAmount,
- );
- orderHash = ZeroEx.getOrderHashHex(signedOrder);
- });
- describe('#getUnavailableTakerAmountAsync', () => {
- it('should throw if passed an invalid orderHash', async () => {
- const invalidOrderHashHex = '0x123';
- return expect(zeroEx.exchange.getUnavailableTakerAmountAsync(invalidOrderHashHex)).to.be.rejected();
- });
- it('should return zero if passed a valid but non-existent orderHash', async () => {
- const unavailableValueT = await zeroEx.exchange.getUnavailableTakerAmountAsync(NON_EXISTENT_ORDER_HASH);
- expect(unavailableValueT).to.be.bignumber.equal(0);
- });
- it('should return the unavailableValueT for a valid and partially filled orderHash', async () => {
- const unavailableValueT = await zeroEx.exchange.getUnavailableTakerAmountAsync(orderHash);
- expect(unavailableValueT).to.be.bignumber.equal(partialFillAmount);
- });
- });
- describe('#getFilledTakerAmountAsync', () => {
- it('should throw if passed an invalid orderHash', async () => {
- const invalidOrderHashHex = '0x123';
- return expect(zeroEx.exchange.getFilledTakerAmountAsync(invalidOrderHashHex)).to.be.rejected();
- });
- it('should return zero if passed a valid but non-existent orderHash', async () => {
- const filledValueT = await zeroEx.exchange.getFilledTakerAmountAsync(NON_EXISTENT_ORDER_HASH);
- expect(filledValueT).to.be.bignumber.equal(0);
- });
- it('should return the filledValueT for a valid and partially filled orderHash', async () => {
- const filledValueT = await zeroEx.exchange.getFilledTakerAmountAsync(orderHash);
- expect(filledValueT).to.be.bignumber.equal(partialFillAmount);
- });
- });
- describe('#getCancelledTakerAmountAsync', () => {
- it('should throw if passed an invalid orderHash', async () => {
- const invalidOrderHashHex = '0x123';
- return expect(zeroEx.exchange.getCancelledTakerAmountAsync(invalidOrderHashHex)).to.be.rejected();
- });
- it('should return zero if passed a valid but non-existent orderHash', async () => {
- const cancelledValueT = await zeroEx.exchange.getCancelledTakerAmountAsync(NON_EXISTENT_ORDER_HASH);
- expect(cancelledValueT).to.be.bignumber.equal(0);
- });
- it('should return the cancelledValueT for a valid and partially filled orderHash', async () => {
- const cancelledValueT = await zeroEx.exchange.getCancelledTakerAmountAsync(orderHash);
- expect(cancelledValueT).to.be.bignumber.equal(0);
- });
- it('should return the cancelledValueT for a valid and cancelled orderHash', async () => {
- const cancelAmount = fillableAmount.minus(partialFillAmount);
- await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmount);
- const cancelledValueT = await zeroEx.exchange.getCancelledTakerAmountAsync(orderHash);
- expect(cancelledValueT).to.be.bignumber.equal(cancelAmount);
- });
- });
- });
- describe('#subscribe', () => {
- const indexFilterValues = {};
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let takerAddress: string;
- let makerAddress: string;
- let fillableAmount: BigNumber;
- let signedOrder: SignedOrder;
- const takerTokenFillAmountInBaseUnits = new BigNumber(1);
- const cancelTakerAmountInBaseUnits = new BigNumber(1);
- before(() => {
- [coinbase, makerAddress, takerAddress] = userAddresses;
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- beforeEach(async () => {
- fillableAmount = new BigNumber(5);
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- });
- afterEach(async () => {
- zeroEx.exchange.unsubscribeAll();
- });
- // Hack: Mocha does not allow a test to be both async and have a `done` callback
- // Since we need to await the receipt of the event in the `subscribe` callback,
- // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
- // wrap the rest of the test in an async block
- // Source: https://github.com/mochajs/mocha/issues/2407
- it('Should receive the LogFill event when an order is filled', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<LogFillContractEventArgs>) => {
- expect(logEvent.log.event).to.be.equal(ExchangeEvents.LogFill);
- },
- );
- zeroEx.exchange.subscribe(ExchangeEvents.LogFill, indexFilterValues, callback);
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- takerTokenFillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- })().catch(done);
- });
- it('Should receive the LogCancel event when an order is cancelled', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<LogCancelContractEventArgs>) => {
- expect(logEvent.log.event).to.be.equal(ExchangeEvents.LogCancel);
- },
- );
- zeroEx.exchange.subscribe(ExchangeEvents.LogCancel, indexFilterValues, callback);
- await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelTakerAmountInBaseUnits);
- })().catch(done);
- });
- it('Outstanding subscriptions are cancelled when zeroEx.setProvider called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<LogFillContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- zeroEx.exchange.subscribe(ExchangeEvents.LogFill, indexFilterValues, callbackNeverToBeCalled);
-
- const newProvider = web3Factory.getRpcProvider();
- zeroEx.setProvider(newProvider, constants.TESTRPC_NETWORK_ID);
-
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<LogFillContractEventArgs>) => {
- expect(logEvent.log.event).to.be.equal(ExchangeEvents.LogFill);
- },
- );
- zeroEx.exchange.subscribe(ExchangeEvents.LogFill, indexFilterValues, callback);
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- takerTokenFillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- })().catch(done);
- });
- it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<LogFillContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- const subscriptionToken = zeroEx.exchange.subscribe(
- ExchangeEvents.LogFill,
- indexFilterValues,
- callbackNeverToBeCalled,
- );
- zeroEx.exchange.unsubscribe(subscriptionToken);
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- takerTokenFillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- done();
- })().catch(done);
- });
- });
- describe('#getOrderHashHexUsingContractCallAsync', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let makerAddress: string;
- let takerAddress: string;
- const fillableAmount = new BigNumber(5);
- before(async () => {
- [, makerAddress, takerAddress] = userAddresses;
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- it("get's the same hash as the local function", async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- const orderHashFromContract = await (zeroEx.exchange as any)._getOrderHashHexUsingContractCallAsync(
- signedOrder,
- );
- expect(orderHash).to.equal(orderHashFromContract);
- });
- });
- describe('#getZRXTokenAddressAsync', () => {
- it('gets the same token as is in token registry', () => {
- const zrxAddress = zeroEx.exchange.getZRXTokenAddress();
- const zrxToken = tokenUtils.getProtocolTokenOrThrow();
- expect(zrxAddress).to.equal(zrxToken.address);
- });
- });
- describe('#getLogsAsync', () => {
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let makerAddress: string;
- let takerAddress: string;
- const fillableAmount = new BigNumber(5);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- const blockRange: BlockRange = {
- fromBlock: 0,
- toBlock: BlockParamLiteral.Latest,
- };
- let txHash: string;
- before(async () => {
- [, makerAddress, takerAddress] = userAddresses;
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- it('should get logs with decoded args emitted by LogFill', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const eventName = ExchangeEvents.LogFill;
- const indexFilterValues = {};
- const logs = await zeroEx.exchange.getLogsAsync(eventName, blockRange, indexFilterValues);
- expect(logs).to.have.length(1);
- expect(logs[0].event).to.be.equal(eventName);
- });
- it('should only get the logs with the correct event name', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const differentEventName = ExchangeEvents.LogCancel;
- const indexFilterValues = {};
- const logs = await zeroEx.exchange.getLogsAsync(differentEventName, blockRange, indexFilterValues);
- expect(logs).to.have.length(0);
- });
- it('should only get the logs with the correct indexed fields', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- txHash = await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const differentMakerAddress = userAddresses[2];
- const anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- differentMakerAddress,
- takerAddress,
- fillableAmount,
- );
- txHash = await zeroEx.exchange.fillOrderAsync(
- anotherSignedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const eventName = ExchangeEvents.LogFill;
- const indexFilterValues = {
- maker: differentMakerAddress,
- };
- const logs = await zeroEx.exchange.getLogsAsync<LogFillContractEventArgs>(
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(args.maker).to.be.equal(differentMakerAddress);
- });
- });
-}); // tslint:disable:max-file-line-count
diff --git a/packages/0x.js/test/expiration_watcher_test.ts b/packages/0x.js/test/expiration_watcher_test.ts
deleted file mode 100644
index ed7a6e5e3..000000000
--- a/packages/0x.js/test/expiration_watcher_test.ts
+++ /dev/null
@@ -1,157 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-import * as Sinon from 'sinon';
-import * as Web3 from 'web3';
-
-import { ZeroEx } from '../src/0x';
-import { ExpirationWatcher } from '../src/order_watcher/expiration_watcher';
-import { DoneCallback, Token } from '../src/types';
-import { utils } from '../src/utils/utils';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { FillScenarios } from './utils/fill_scenarios';
-import { reportNoErrorCallbackErrors } from './utils/report_callback_errors';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('ExpirationWatcher', () => {
- let zeroEx: ZeroEx;
- let tokenUtils: TokenUtils;
- let tokens: Token[];
- let userAddresses: string[];
- let zrxTokenAddress: string;
- let fillScenarios: FillScenarios;
- let exchangeContractAddress: string;
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let makerAddress: string;
- let takerAddress: string;
- let feeRecipient: string;
- const fillableAmount = new BigNumber(5);
- let currentUnixTimestampSec: BigNumber;
- let timer: Sinon.SinonFakeTimers;
- let expirationWatcher: ExpirationWatcher;
- before(async () => {
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- zeroEx = new ZeroEx(web3.currentProvider, config);
- exchangeContractAddress = zeroEx.exchange.getContractAddress();
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(zeroEx, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
- [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- const sinonTimerConfig = { shouldAdvanceTime: true } as any;
- // This constructor has incorrect types
- timer = Sinon.useFakeTimers(sinonTimerConfig);
- currentUnixTimestampSec = utils.getCurrentUnixTimestampSec();
- expirationWatcher = new ExpirationWatcher();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- timer.restore();
- expirationWatcher.unsubscribe();
- });
- it('correctly emits events when order expires', (done: DoneCallback) => {
- (async () => {
- const orderLifetimeSec = 60;
- const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- expirationUnixTimestampSec,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- expirationWatcher.addOrder(orderHash, signedOrder.expirationUnixTimestampSec.times(1000));
- const callbackAsync = reportNoErrorCallbackErrors(done)((hash: string) => {
- expect(hash).to.be.equal(orderHash);
- expect(utils.getCurrentUnixTimestampSec()).to.be.bignumber.gte(expirationUnixTimestampSec);
- });
- expirationWatcher.subscribe(callbackAsync);
- timer.tick(orderLifetimeSec * 1000);
- })().catch(done);
- });
- it("doesn't emit events before order expires", (done: DoneCallback) => {
- (async () => {
- const orderLifetimeSec = 60;
- const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- expirationUnixTimestampSec,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- expirationWatcher.addOrder(orderHash, signedOrder.expirationUnixTimestampSec.times(1000));
- const callbackAsync = reportNoErrorCallbackErrors(done)(async (hash: string) => {
- done(new Error('Emitted expiration went before the order actually expired'));
- });
- expirationWatcher.subscribe(callbackAsync);
- const notEnoughTime = orderLifetimeSec - 1;
- timer.tick(notEnoughTime * 1000);
- done();
- })().catch(done);
- });
- it('emits events in correct order', (done: DoneCallback) => {
- (async () => {
- const order1Lifetime = 60;
- const order2Lifetime = 120;
- const order1ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order1Lifetime);
- const order2ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order2Lifetime);
- const signedOrder1 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- order1ExpirationUnixTimestampSec,
- );
- const signedOrder2 = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- order2ExpirationUnixTimestampSec,
- );
- const orderHash1 = ZeroEx.getOrderHashHex(signedOrder1);
- const orderHash2 = ZeroEx.getOrderHashHex(signedOrder2);
- expirationWatcher.addOrder(orderHash2, signedOrder2.expirationUnixTimestampSec.times(1000));
- expirationWatcher.addOrder(orderHash1, signedOrder1.expirationUnixTimestampSec.times(1000));
- const expirationOrder = [orderHash1, orderHash2];
- const expectToBeCalledOnce = false;
- const callbackAsync = reportNoErrorCallbackErrors(done, expectToBeCalledOnce)((hash: string) => {
- const orderHash = expirationOrder.shift();
- expect(hash).to.be.equal(orderHash);
- if (_.isEmpty(expirationOrder)) {
- done();
- }
- });
- expirationWatcher.subscribe(callbackAsync);
- timer.tick(order2Lifetime * 1000);
- })().catch(done);
- });
-});
diff --git a/packages/0x.js/test/global_hooks.ts b/packages/0x.js/test/global_hooks.ts
new file mode 100644
index 000000000..364828231
--- /dev/null
+++ b/packages/0x.js/test/global_hooks.ts
@@ -0,0 +1,17 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { runV2MigrationsAsync } from '@0xproject/migrations';
+
+import { provider } from './utils/web3_wrapper';
+
+before('migrate contracts', async function(): Promise<void> {
+ // HACK: Since the migrations take longer then our global mocha timeout limit
+ // we manually increase it for this before hook.
+ const mochaTestTimeoutMs = 20000;
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
+ const txDefaults = {
+ gas: devConstants.GAS_LIMIT,
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+ const artifactsDir = `../migrations/artifacts/2.0.0`;
+ await runV2MigrationsAsync(provider, artifactsDir, txDefaults);
+});
diff --git a/packages/0x.js/test/order_state_watcher_test.ts b/packages/0x.js/test/order_state_watcher_test.ts
deleted file mode 100644
index 4210e013f..000000000
--- a/packages/0x.js/test/order_state_watcher_test.ts
+++ /dev/null
@@ -1,559 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-import * as Web3 from 'web3';
-
-import {
- ExchangeContractErrs,
- OrderState,
- OrderStateInvalid,
- OrderStateValid,
- SignedOrder,
- Token,
- ZeroEx,
- ZeroExError,
-} from '../src';
-import { OrderStateWatcher } from '../src/order_watcher/order_state_watcher';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { FillScenarios } from './utils/fill_scenarios';
-import { reportNodeCallbackErrors } from './utils/report_callback_errors';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-const TIMEOUT_MS = 150;
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('OrderStateWatcher', () => {
- let zeroEx: ZeroEx;
- let tokens: Token[];
- let tokenUtils: TokenUtils;
- let fillScenarios: FillScenarios;
- let userAddresses: string[];
- let zrxTokenAddress: string;
- let exchangeContractAddress: string;
- let makerToken: Token;
- let takerToken: Token;
- let maker: string;
- let taker: string;
- let signedOrder: SignedOrder;
- let orderStateWatcher: OrderStateWatcher;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const decimals = constants.ZRX_DECIMALS;
- const fillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- orderStateWatcher = zeroEx.createOrderStateWatcher();
- exchangeContractAddress = zeroEx.exchange.getContractAddress();
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- [, maker, taker] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(zeroEx, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
- await fillScenarios.initTokenBalancesAsync();
- [makerToken, takerToken] = tokenUtils.getDummyTokens();
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#removeOrder', async () => {
- it('should successfully remove existing order', async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
- expect((orderStateWatcher as any)._orderByOrderHash).to.include({
- [orderHash]: signedOrder,
- });
- let dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
- expect(dependentOrderHashes[signedOrder.maker][signedOrder.makerTokenAddress]).to.have.keys(orderHash);
- orderStateWatcher.removeOrder(orderHash);
- expect((orderStateWatcher as any)._orderByOrderHash).to.not.include({
- [orderHash]: signedOrder,
- });
- dependentOrderHashes = (orderStateWatcher as any)._dependentOrderHashes;
- expect(dependentOrderHashes[signedOrder.maker]).to.be.undefined();
- });
- it('should no-op when removing a non-existing order', async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- const nonExistentOrderHash = `0x${orderHash
- .substr(2)
- .split('')
- .reverse()
- .join('')}`;
- orderStateWatcher.removeOrder(nonExistentOrderHash);
- });
- });
- describe('#subscribe', async () => {
- afterEach(async () => {
- orderStateWatcher.unsubscribe();
- });
- it('should fail when trying to subscribe twice', async () => {
- orderStateWatcher.subscribe(_.noop);
- expect(() => orderStateWatcher.subscribe(_.noop)).to.throw(ZeroExError.SubscriptionAlreadyPresent);
- });
- });
- describe('tests with cleanup', async () => {
- afterEach(async () => {
- orderStateWatcher.unsubscribe();
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.removeOrder(orderHash);
- });
- it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.false();
- const invalidOrderState = orderState as OrderStateInvalid;
- expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, new BigNumber(0));
- })().catch(done);
- });
- it('should not emit an orderState event when irrelevant Transfer event received', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- orderStateWatcher.addOrder(signedOrder);
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- throw new Error('OrderState callback fired for irrelevant order');
- });
- orderStateWatcher.subscribe(callback);
- const notTheMaker = userAddresses[0];
- const anyRecipient = taker;
- const transferAmount = new BigNumber(2);
- await zeroEx.token.transferAsync(makerToken.address, notTheMaker, anyRecipient, transferAmount);
- setTimeout(() => {
- done();
- }, TIMEOUT_MS);
- })().catch(done);
- });
- it('should emit orderStateInvalid when maker moves balance backing watched order', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.false();
- const invalidOrderState = orderState as OrderStateInvalid;
- expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
- });
- orderStateWatcher.subscribe(callback);
- const anyRecipient = taker;
- const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
- await zeroEx.token.transferAsync(makerToken.address, maker, anyRecipient, makerBalance);
- })().catch(done);
- });
- it('should emit orderStateInvalid when watched order fully filled', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.false();
- const invalidOrderState = orderState as OrderStateInvalid;
- expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
- });
- orderStateWatcher.subscribe(callback);
-
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillableAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
- })().catch(done);
- });
- it('should emit orderStateValid when watched order partially filled', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
-
- const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
- const fillAmountInBaseUnits = new BigNumber(2);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- expect(validOrderState.orderHash).to.be.equal(orderHash);
- const orderRelevantState = validOrderState.orderRelevantState;
- const remainingMakerBalance = makerBalance.sub(fillAmountInBaseUnits);
- const remainingFillable = fillableAmount.minus(fillAmountInBaseUnits);
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- remainingFillable,
- );
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
- remainingFillable,
- );
- expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
- });
- orderStateWatcher.subscribe(callback);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
- })().catch(done);
- });
- it('should trigger the callback when orders backing ZRX allowance changes', (done: DoneCallback) => {
- (async () => {
- const makerFee = ZeroEx.toBaseUnitAmount(new BigNumber(2), 18);
- const takerFee = ZeroEx.toBaseUnitAmount(new BigNumber(0), 18);
- signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
- makerFee,
- takerFee,
- maker,
- taker,
- fillableAmount,
- taker,
- );
- const callback = reportNodeCallbackErrors(done)();
- orderStateWatcher.addOrder(signedOrder);
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, new BigNumber(0));
- })().catch(done);
- });
- describe('remainingFillable(M|T)akerTokenAmount', () => {
- it('should calculate correct remaining fillable', (done: DoneCallback) => {
- (async () => {
- const takerFillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(10), decimals);
- const makerFillableAmount = ZeroEx.toBaseUnitAmount(new BigNumber(20), decimals);
- signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- makerFillableAmount,
- takerFillableAmount,
- );
- const fillAmountInBaseUnits = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- expect(validOrderState.orderHash).to.be.equal(orderHash);
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- ZeroEx.toBaseUnitAmount(new BigNumber(16), decimals),
- );
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
- ZeroEx.toBaseUnitAmount(new BigNumber(8), decimals),
- );
- });
- orderStateWatcher.subscribe(callback);
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- await zeroEx.exchange.fillOrderAsync(
- signedOrder,
- fillAmountInBaseUnits,
- shouldThrowOnInsufficientBalanceOrAllowance,
- taker,
- );
- })().catch(done);
- });
- it('should equal approved amount when approved amount is lowest', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
-
- const changedMakerApprovalAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- changedMakerApprovalAmount,
- );
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
- changedMakerApprovalAmount,
- );
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.setProxyAllowanceAsync(makerToken.address, maker, changedMakerApprovalAmount);
- })().catch(done);
- });
- it('should equal balance amount when balance amount is lowest', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
-
- const makerBalance = await zeroEx.token.getBalanceAsync(makerToken.address, maker);
-
- const remainingAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
- const transferAmount = makerBalance.sub(remainingAmount);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- remainingAmount,
- );
- expect(orderRelevantState.remainingFillableTakerTokenAmount).to.be.bignumber.equal(
- remainingAmount,
- );
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.transferAsync(makerToken.address, maker, ZeroEx.NULL_ADDRESS, transferAmount);
- })().catch(done);
- });
- it('should equal remaining amount when partially cancelled and order has fees', (done: DoneCallback) => {
- (async () => {
- const takerFee = ZeroEx.toBaseUnitAmount(new BigNumber(0), decimals);
- const makerFee = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
- const feeRecipient = taker;
- signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
- makerFee,
- takerFee,
- maker,
- taker,
- fillableAmount,
- feeRecipient,
- );
-
- const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
- const transferTokenAmount = makerFee.sub(remainingTokenAmount);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- remainingTokenAmount,
- );
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.exchange.cancelOrderAsync(signedOrder, transferTokenAmount);
- })().catch(done);
- });
- it('should equal ratio amount when fee balance is lowered', (done: DoneCallback) => {
- (async () => {
- const takerFee = ZeroEx.toBaseUnitAmount(new BigNumber(0), decimals);
- const makerFee = ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals);
- const feeRecipient = taker;
- signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
- makerFee,
- takerFee,
- maker,
- taker,
- fillableAmount,
- feeRecipient,
- );
-
- const remainingFeeAmount = ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals);
-
- const remainingTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(4), decimals);
- const transferTokenAmount = makerFee.sub(remainingTokenAmount);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- remainingFeeAmount,
- );
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.setProxyAllowanceAsync(zrxTokenAddress, maker, remainingFeeAmount);
- await zeroEx.token.transferAsync(
- makerToken.address,
- maker,
- ZeroEx.NULL_ADDRESS,
- transferTokenAmount,
- );
- })().catch(done);
- });
- it('should calculate full amount when all available and non-divisible', (done: DoneCallback) => {
- (async () => {
- const takerFee = ZeroEx.toBaseUnitAmount(new BigNumber(0), decimals);
- const makerFee = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- const feeRecipient = taker;
- signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerToken.address,
- takerToken.address,
- makerFee,
- takerFee,
- maker,
- taker,
- fillableAmount,
- feeRecipient,
- );
-
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- const validOrderState = orderState as OrderStateValid;
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.remainingFillableMakerTokenAmount).to.be.bignumber.equal(
- fillableAmount,
- );
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.token.setProxyAllowanceAsync(
- makerToken.address,
- maker,
- ZeroEx.toBaseUnitAmount(new BigNumber(100), decimals),
- );
- })().catch(done);
- });
- });
- it('should emit orderStateInvalid when watched order cancelled', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.false();
- const invalidOrderState = orderState as OrderStateInvalid;
- expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
- });
- orderStateWatcher.subscribe(callback);
-
- await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
- })().catch(done);
- });
- it('should emit orderStateInvalid when within rounding error range', (done: DoneCallback) => {
- (async () => {
- const remainingFillableAmountInBaseUnits = new BigNumber(100);
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.false();
- const invalidOrderState = orderState as OrderStateInvalid;
- expect(invalidOrderState.orderHash).to.be.equal(orderHash);
- expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.exchange.cancelOrderAsync(
- signedOrder,
- fillableAmount.minus(remainingFillableAmountInBaseUnits),
- );
- })().catch(done);
- });
- it('should emit orderStateValid when watched order partially cancelled', (done: DoneCallback) => {
- (async () => {
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerToken.address,
- takerToken.address,
- maker,
- taker,
- fillableAmount,
- );
-
- const cancelAmountInBaseUnits = new BigNumber(2);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
- orderStateWatcher.addOrder(signedOrder);
-
- const callback = reportNodeCallbackErrors(done)((orderState: OrderState) => {
- expect(orderState.isValid).to.be.true();
- const validOrderState = orderState as OrderStateValid;
- expect(validOrderState.orderHash).to.be.equal(orderHash);
- const orderRelevantState = validOrderState.orderRelevantState;
- expect(orderRelevantState.cancelledTakerTokenAmount).to.be.bignumber.equal(cancelAmountInBaseUnits);
- });
- orderStateWatcher.subscribe(callback);
- await zeroEx.exchange.cancelOrderAsync(signedOrder, cancelAmountInBaseUnits);
- })().catch(done);
- });
- });
-}); // tslint:disable:max-file-line-count
diff --git a/packages/0x.js/test/order_validation_test.ts b/packages/0x.js/test/order_validation_test.ts
deleted file mode 100644
index 5472ca8f6..000000000
--- a/packages/0x.js/test/order_validation_test.ts
+++ /dev/null
@@ -1,473 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { BlockParamLiteral } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import * as Sinon from 'sinon';
-import * as Web3 from 'web3';
-
-import { ExchangeContractErrs, SignedOrder, Token, ZeroEx, ZeroExError } from '../src';
-import { TradeSide, TransferType } from '../src/types';
-import { ExchangeTransferSimulator } from '../src/utils/exchange_transfer_simulator';
-import { OrderValidationUtils } from '../src/utils/order_validation_utils';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { FillScenarios } from './utils/fill_scenarios';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('OrderValidation', () => {
- let zeroEx: ZeroEx;
- let userAddresses: string[];
- let tokens: Token[];
- let tokenUtils: TokenUtils;
- let exchangeContractAddress: string;
- let zrxTokenAddress: string;
- let fillScenarios: FillScenarios;
- let makerTokenAddress: string;
- let takerTokenAddress: string;
- let coinbase: string;
- let makerAddress: string;
- let takerAddress: string;
- let feeRecipient: string;
- const fillableAmount = new BigNumber(5);
- const fillTakerAmount = new BigNumber(5);
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- exchangeContractAddress = zeroEx.exchange.getContractAddress();
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- zrxTokenAddress = tokenUtils.getProtocolTokenOrThrow().address;
- fillScenarios = new FillScenarios(zeroEx, userAddresses, tokens, zrxTokenAddress, exchangeContractAddress);
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('validateOrderFillableOrThrowAsync', () => {
- it('should succeed if the order is fillable', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- await zeroEx.exchange.validateOrderFillableOrThrowAsync(signedOrder);
- });
- it('should succeed if the order is asymmetric and fillable', async () => {
- const makerFillableAmount = fillableAmount;
- const takerFillableAmount = fillableAmount.minus(4);
- const signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- makerFillableAmount,
- takerFillableAmount,
- );
- await zeroEx.exchange.validateOrderFillableOrThrowAsync(signedOrder);
- });
- it('should throw when the order is fully filled or cancelled', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
- return expect(zeroEx.exchange.validateOrderFillableOrThrowAsync(signedOrder)).to.be.rejectedWith(
- ExchangeContractErrs.OrderRemainingFillAmountZero,
- );
- });
- it('should throw when order is expired', async () => {
- const expirationInPast = new BigNumber(1496826058); // 7th Jun 2017
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- expirationInPast,
- );
- return expect(zeroEx.exchange.validateOrderFillableOrThrowAsync(signedOrder)).to.be.rejectedWith(
- ExchangeContractErrs.OrderFillExpired,
- );
- });
- });
- describe('validateFillOrderAndThrowIfInvalidAsync', () => {
- it('should throw when the fill amount is zero', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const zeroFillAmount = new BigNumber(0);
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(signedOrder, zeroFillAmount, takerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillAmountZero);
- });
- it('should throw when the signature is invalid', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- // 27 <--> 28
- signedOrder.ecSignature.v = 28 - signedOrder.ecSignature.v + 27;
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(signedOrder, fillableAmount, takerAddress),
- ).to.be.rejectedWith(ZeroExError.InvalidSignature);
- });
- it('should throw when the order is fully filled or cancelled', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(signedOrder, fillableAmount, takerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderRemainingFillAmountZero);
- });
- it('should throw when sender is not a taker', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const nonTakerAddress = userAddresses[6];
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(signedOrder, fillTakerAmount, nonTakerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.TransactionSenderIsNotFillOrderTaker);
- });
- it('should throw when order is expired', async () => {
- const expirationInPast = new BigNumber(1496826058); // 7th Jun 2017
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- expirationInPast,
- );
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(signedOrder, fillTakerAmount, takerAddress),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillExpired);
- });
- it('should throw when there a rounding error would have occurred', async () => {
- const makerAmount = new BigNumber(3);
- const takerAmount = new BigNumber(5);
- const signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- makerAmount,
- takerAmount,
- );
- const fillTakerAmountThatCausesRoundingError = new BigNumber(3);
- return expect(
- zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(
- signedOrder,
- fillTakerAmountThatCausesRoundingError,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderFillRoundingError);
- });
- });
- describe('#validateFillOrKillOrderAndThrowIfInvalidAsync', () => {
- it('should throw if remaining fillAmount is less then the desired fillAmount', async () => {
- const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- const tooLargeFillAmount = new BigNumber(7);
- const fillAmountDifference = tooLargeFillAmount.minus(fillableAmount);
- await zeroEx.token.transferAsync(takerTokenAddress, coinbase, takerAddress, fillAmountDifference);
- await zeroEx.token.setProxyAllowanceAsync(takerTokenAddress, takerAddress, tooLargeFillAmount);
- await zeroEx.token.transferAsync(makerTokenAddress, coinbase, makerAddress, fillAmountDifference);
- await zeroEx.token.setProxyAllowanceAsync(makerTokenAddress, makerAddress, tooLargeFillAmount);
-
- return expect(
- zeroEx.exchange.validateFillOrKillOrderThrowIfInvalidAsync(
- signedOrder,
- tooLargeFillAmount,
- takerAddress,
- ),
- ).to.be.rejectedWith(ExchangeContractErrs.InsufficientRemainingFillAmount);
- });
- });
- describe('validateCancelOrderAndThrowIfInvalidAsync', () => {
- let signedOrder: SignedOrder;
- const cancelAmount = new BigNumber(3);
- beforeEach(async () => {
- [coinbase, makerAddress, takerAddress] = userAddresses;
- const [makerToken, takerToken] = tokenUtils.getDummyTokens();
- makerTokenAddress = makerToken.address;
- takerTokenAddress = takerToken.address;
- signedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- );
- });
- it('should throw when cancel amount is zero', async () => {
- const zeroCancelAmount = new BigNumber(0);
- return expect(
- zeroEx.exchange.validateCancelOrderThrowIfInvalidAsync(signedOrder, zeroCancelAmount),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderCancelAmountZero);
- });
- it('should throw when order is expired', async () => {
- const expirationInPast = new BigNumber(1496826058); // 7th Jun 2017
- const expiredSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- expirationInPast,
- );
- return expect(
- zeroEx.exchange.validateCancelOrderThrowIfInvalidAsync(expiredSignedOrder, cancelAmount),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderCancelExpired);
- });
- it('should throw when order is already cancelled or filled', async () => {
- await zeroEx.exchange.cancelOrderAsync(signedOrder, fillableAmount);
- return expect(
- zeroEx.exchange.validateCancelOrderThrowIfInvalidAsync(signedOrder, fillableAmount),
- ).to.be.rejectedWith(ExchangeContractErrs.OrderAlreadyCancelledOrFilled);
- });
- });
- describe('#validateFillOrderBalancesAllowancesThrowIfInvalidAsync', () => {
- let exchangeTransferSimulator: ExchangeTransferSimulator;
- let transferFromAsync: Sinon.SinonSpy;
- const bigNumberMatch = (expected: BigNumber) => {
- return Sinon.match((value: BigNumber) => value.eq(expected));
- };
- beforeEach('create exchangeTransferSimulator', async () => {
- exchangeTransferSimulator = new ExchangeTransferSimulator(zeroEx.token, BlockParamLiteral.Latest);
- transferFromAsync = Sinon.spy();
- exchangeTransferSimulator.transferFromAsync = transferFromAsync as any;
- });
- it('should call exchangeTransferSimulator.transferFrom in a correct order', async () => {
- const makerFee = new BigNumber(2);
- const takerFee = new BigNumber(2);
- const signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- fillableAmount,
- feeRecipient,
- );
- await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTransferSimulator,
- signedOrder,
- fillableAmount,
- takerAddress,
- zrxTokenAddress,
- );
- expect(transferFromAsync.callCount).to.be.equal(4);
- expect(
- transferFromAsync
- .getCall(0)
- .calledWith(
- makerTokenAddress,
- makerAddress,
- takerAddress,
- bigNumberMatch(fillableAmount),
- TradeSide.Maker,
- TransferType.Trade,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(1)
- .calledWith(
- takerTokenAddress,
- takerAddress,
- makerAddress,
- bigNumberMatch(fillableAmount),
- TradeSide.Taker,
- TransferType.Trade,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(2)
- .calledWith(
- zrxTokenAddress,
- makerAddress,
- feeRecipient,
- bigNumberMatch(makerFee),
- TradeSide.Maker,
- TransferType.Fee,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(3)
- .calledWith(
- zrxTokenAddress,
- takerAddress,
- feeRecipient,
- bigNumberMatch(takerFee),
- TradeSide.Taker,
- TransferType.Fee,
- ),
- ).to.be.true();
- });
- it('should call exchangeTransferSimulator.transferFrom with correct values for an open order', async () => {
- const makerFee = new BigNumber(2);
- const takerFee = new BigNumber(2);
- const signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- ZeroEx.NULL_ADDRESS,
- fillableAmount,
- feeRecipient,
- );
- await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTransferSimulator,
- signedOrder,
- fillableAmount,
- takerAddress,
- zrxTokenAddress,
- );
- expect(transferFromAsync.callCount).to.be.equal(4);
- expect(
- transferFromAsync
- .getCall(0)
- .calledWith(
- makerTokenAddress,
- makerAddress,
- takerAddress,
- bigNumberMatch(fillableAmount),
- TradeSide.Maker,
- TransferType.Trade,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(1)
- .calledWith(
- takerTokenAddress,
- takerAddress,
- makerAddress,
- bigNumberMatch(fillableAmount),
- TradeSide.Taker,
- TransferType.Trade,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(2)
- .calledWith(
- zrxTokenAddress,
- makerAddress,
- feeRecipient,
- bigNumberMatch(makerFee),
- TradeSide.Maker,
- TransferType.Fee,
- ),
- ).to.be.true();
- expect(
- transferFromAsync
- .getCall(3)
- .calledWith(
- zrxTokenAddress,
- takerAddress,
- feeRecipient,
- bigNumberMatch(takerFee),
- TradeSide.Taker,
- TransferType.Fee,
- ),
- ).to.be.true();
- });
- it('should correctly round the fillMakerTokenAmount', async () => {
- const makerTokenAmount = new BigNumber(3);
- const takerTokenAmount = new BigNumber(1);
- const signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- makerTokenAmount,
- takerTokenAmount,
- );
- await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTransferSimulator,
- signedOrder,
- takerTokenAmount,
- takerAddress,
- zrxTokenAddress,
- );
- expect(transferFromAsync.callCount).to.be.equal(4);
- const makerFillAmount = transferFromAsync.getCall(0).args[3];
- expect(makerFillAmount).to.be.bignumber.equal(makerTokenAmount);
- });
- it('should correctly round the makerFeeAmount', async () => {
- const makerFee = new BigNumber(2);
- const takerFee = new BigNumber(4);
- const signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- fillableAmount,
- ZeroEx.NULL_ADDRESS,
- );
- const fillTakerTokenAmount = fillableAmount.div(2).round(0);
- await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
- exchangeTransferSimulator,
- signedOrder,
- fillTakerTokenAmount,
- takerAddress,
- zrxTokenAddress,
- );
- const makerPartialFee = makerFee.div(2);
- const takerPartialFee = takerFee.div(2);
- expect(transferFromAsync.callCount).to.be.equal(4);
- const partialMakerFee = transferFromAsync.getCall(2).args[3];
- expect(partialMakerFee).to.be.bignumber.equal(makerPartialFee);
- const partialTakerFee = transferFromAsync.getCall(3).args[3];
- expect(partialTakerFee).to.be.bignumber.equal(takerPartialFee);
- });
- });
-});
diff --git a/packages/0x.js/test/remaining_fillable_calculator_test.ts b/packages/0x.js/test/remaining_fillable_calculator_test.ts
deleted file mode 100644
index d97402ef6..000000000
--- a/packages/0x.js/test/remaining_fillable_calculator_test.ts
+++ /dev/null
@@ -1,234 +0,0 @@
-import { ECSignature, SignedOrder } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import * as chai from 'chai';
-import 'mocha';
-
-import { ZeroEx } from '../src/0x';
-import { RemainingFillableCalculator } from '../src/order_watcher/remaining_fillable_calculator';
-
-import { chaiSetup } from './utils/chai_setup';
-
-chaiSetup.configure();
-const expect = chai.expect;
-
-describe('RemainingFillableCalculator', () => {
- let calculator: RemainingFillableCalculator;
- let signedOrder: SignedOrder;
- let transferrableMakerTokenAmount: BigNumber;
- let transferrableMakerFeeTokenAmount: BigNumber;
- let remainingMakerTokenAmount: BigNumber;
- let makerAmount: BigNumber;
- let takerAmount: BigNumber;
- let makerFeeAmount: BigNumber;
- let isMakerTokenZRX: boolean;
- const makerToken: string = '0x1';
- const takerToken: string = '0x2';
- const decimals: number = 4;
- const zero: BigNumber = new BigNumber(0);
- const zeroAddress = '0x0';
- const signature: ECSignature = { v: 27, r: '', s: '' };
- beforeEach(async () => {
- [makerAmount, takerAmount, makerFeeAmount] = [
- ZeroEx.toBaseUnitAmount(new BigNumber(50), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals),
- ];
- [transferrableMakerTokenAmount, transferrableMakerFeeTokenAmount] = [
- ZeroEx.toBaseUnitAmount(new BigNumber(50), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(5), decimals),
- ];
- });
- function buildSignedOrder(): SignedOrder {
- return {
- ecSignature: signature,
- exchangeContractAddress: zeroAddress,
- feeRecipient: zeroAddress,
- maker: zeroAddress,
- taker: zeroAddress,
- makerFee: makerFeeAmount,
- takerFee: zero,
- makerTokenAmount: makerAmount,
- takerTokenAmount: takerAmount,
- makerTokenAddress: makerToken,
- takerTokenAddress: takerToken,
- salt: zero,
- expirationUnixTimestampSec: zero,
- };
- }
- describe('Maker token is NOT ZRX', () => {
- before(async () => {
- isMakerTokenZRX = false;
- });
- it('calculates the correct amount when unfilled and funds available', () => {
- signedOrder = buildSignedOrder();
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(remainingMakerTokenAmount);
- });
- it('calculates the correct amount when partially filled and funds available', () => {
- signedOrder = buildSignedOrder();
- remainingMakerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(remainingMakerTokenAmount);
- });
- it('calculates the amount to be 0 when all fee funds are transferred', () => {
- signedOrder = buildSignedOrder();
- transferrableMakerFeeTokenAmount = zero;
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(zero);
- });
- it('calculates the correct amount when balance is less than remaining fillable', () => {
- signedOrder = buildSignedOrder();
- const partiallyFilledAmount = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- remainingMakerTokenAmount = signedOrder.makerTokenAmount.minus(partiallyFilledAmount);
- transferrableMakerTokenAmount = remainingMakerTokenAmount.minus(partiallyFilledAmount);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(transferrableMakerTokenAmount);
- });
- describe('Order to Fee Ratio is < 1', () => {
- beforeEach(async () => {
- [makerAmount, takerAmount, makerFeeAmount] = [
- ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(6), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(6), decimals),
- ];
- });
- it('calculates the correct amount when funds unavailable', () => {
- signedOrder = buildSignedOrder();
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- const transferredAmount = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- transferrableMakerTokenAmount = remainingMakerTokenAmount.minus(transferredAmount);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(transferrableMakerTokenAmount);
- });
- });
- describe('Ratio is not evenly divisble', () => {
- beforeEach(async () => {
- [makerAmount, takerAmount, makerFeeAmount] = [
- ZeroEx.toBaseUnitAmount(new BigNumber(3), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(7), decimals),
- ZeroEx.toBaseUnitAmount(new BigNumber(7), decimals),
- ];
- });
- it('calculates the correct amount when funds unavailable', () => {
- signedOrder = buildSignedOrder();
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- const transferredAmount = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- transferrableMakerTokenAmount = remainingMakerTokenAmount.minus(transferredAmount);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- const calculatedFillableAmount = calculator.computeRemainingMakerFillable();
- expect(calculatedFillableAmount.lessThanOrEqualTo(transferrableMakerTokenAmount)).to.be.true();
- expect(calculatedFillableAmount).to.be.bignumber.greaterThan(new BigNumber(0));
- const orderToFeeRatio = signedOrder.makerTokenAmount.dividedBy(signedOrder.makerFee);
- const calculatedFeeAmount = calculatedFillableAmount.dividedBy(orderToFeeRatio);
- expect(calculatedFeeAmount).to.be.bignumber.lessThan(transferrableMakerFeeTokenAmount);
- });
- });
- });
- describe('Maker Token is ZRX', () => {
- before(async () => {
- isMakerTokenZRX = true;
- });
- it('calculates the correct amount when unfilled and funds available', () => {
- signedOrder = buildSignedOrder();
- transferrableMakerTokenAmount = makerAmount.plus(makerFeeAmount);
- transferrableMakerFeeTokenAmount = transferrableMakerTokenAmount;
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(remainingMakerTokenAmount);
- });
- it('calculates the correct amount when partially filled and funds available', () => {
- signedOrder = buildSignedOrder();
- remainingMakerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), decimals);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(remainingMakerTokenAmount);
- });
- it('calculates the amount to be 0 when all fee funds are transferred', () => {
- signedOrder = buildSignedOrder();
- transferrableMakerTokenAmount = zero;
- transferrableMakerFeeTokenAmount = zero;
- remainingMakerTokenAmount = signedOrder.makerTokenAmount;
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- expect(calculator.computeRemainingMakerFillable()).to.be.bignumber.equal(zero);
- });
- it('calculates the correct amount when balance is less than remaining fillable', () => {
- signedOrder = buildSignedOrder();
- const partiallyFilledAmount = ZeroEx.toBaseUnitAmount(new BigNumber(2), decimals);
- remainingMakerTokenAmount = signedOrder.makerTokenAmount.minus(partiallyFilledAmount);
- transferrableMakerTokenAmount = remainingMakerTokenAmount.minus(partiallyFilledAmount);
- transferrableMakerFeeTokenAmount = transferrableMakerTokenAmount;
-
- const orderToFeeRatio = signedOrder.makerTokenAmount.dividedToIntegerBy(signedOrder.makerFee);
- const expectedFillableAmount = new BigNumber(450980);
- calculator = new RemainingFillableCalculator(
- signedOrder,
- isMakerTokenZRX,
- transferrableMakerTokenAmount,
- transferrableMakerFeeTokenAmount,
- remainingMakerTokenAmount,
- );
- const calculatedFillableAmount = calculator.computeRemainingMakerFillable();
- const numberOfFillsInRatio = calculatedFillableAmount.dividedToIntegerBy(orderToFeeRatio);
- const calculatedFillableAmountPlusFees = calculatedFillableAmount.plus(numberOfFillsInRatio);
- expect(calculatedFillableAmountPlusFees).to.be.bignumber.lessThan(transferrableMakerTokenAmount);
- expect(calculatedFillableAmountPlusFees).to.be.bignumber.lessThan(remainingMakerTokenAmount);
- expect(calculatedFillableAmount).to.be.bignumber.equal(expectedFillableAmount);
- expect(numberOfFillsInRatio.decimalPlaces()).to.be.equal(0);
- });
- });
-});
diff --git a/packages/0x.js/test/subscription_test.ts b/packages/0x.js/test/subscription_test.ts
deleted file mode 100644
index 9b4751287..000000000
--- a/packages/0x.js/test/subscription_test.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-import 'mocha';
-import * as Sinon from 'sinon';
-import * as Web3 from 'web3';
-
-import { ApprovalContractEventArgs, DecodedLogEvent, Token, TokenEvents, ZeroEx } from '../src';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { assertNodeCallbackError } from './utils/report_callback_errors';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('SubscriptionTest', () => {
- let zeroEx: ZeroEx;
- let userAddresses: string[];
- let tokens: Token[];
- let coinbase: string;
- let addressWithoutFunds: string;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- coinbase = userAddresses[0];
- addressWithoutFunds = userAddresses[1];
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#subscribe', () => {
- const indexFilterValues = {};
- let tokenAddress: string;
- const allowanceAmount = new BigNumber(42);
- let stubs: Sinon.SinonStub[] = [];
- before(() => {
- const token = tokens[0];
- tokenAddress = token.address;
- });
- afterEach(() => {
- zeroEx.token.unsubscribeAll();
- _.each(stubs, s => s.restore());
- stubs = [];
- });
- it('Should receive the Error when an error occurs while fetching the block', (done: DoneCallback) => {
- (async () => {
- const errMsg = 'Error fetching block';
- const callback = assertNodeCallbackError(done, errMsg);
- stubs = [Sinon.stub((zeroEx as any)._web3Wrapper, 'getBlockAsync').throws(new Error(errMsg))];
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
- await zeroEx.token.setAllowanceAsync(tokenAddress, coinbase, addressWithoutFunds, allowanceAmount);
- })().catch(done);
- });
- it('Should receive the Error when an error occurs while reconciling the new block', (done: DoneCallback) => {
- (async () => {
- const errMsg = 'Error fetching logs';
- const callback = assertNodeCallbackError(done, errMsg);
- stubs = [Sinon.stub((zeroEx as any)._web3Wrapper, 'getLogsAsync').throws(new Error(errMsg))];
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
- await zeroEx.token.setAllowanceAsync(tokenAddress, coinbase, addressWithoutFunds, allowanceAmount);
- })().catch(done);
- });
- it('Should allow unsubscribeAll to be called successfully after an error', (done: DoneCallback) => {
- (async () => {
- const callback = (err: Error | null, logEvent?: DecodedLogEvent<ApprovalContractEventArgs>) => _.noop;
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
- stubs = [Sinon.stub((zeroEx as any)._web3Wrapper, 'getBlockAsync').throws(new Error('JSON RPC error'))];
- zeroEx.token.unsubscribeAll();
- done();
- })().catch(done);
- });
- });
-});
diff --git a/packages/0x.js/test/token_registry_wrapper_test.ts b/packages/0x.js/test/token_registry_wrapper_test.ts
deleted file mode 100644
index 3b7ce46fb..000000000
--- a/packages/0x.js/test/token_registry_wrapper_test.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
-import { schemas, SchemaValidator } from '@0xproject/json-schemas';
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-
-import { Token, ZeroEx } from '../src';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-const TOKEN_REGISTRY_SIZE_AFTER_MIGRATION = 7;
-
-describe('TokenRegistryWrapper', () => {
- let zeroEx: ZeroEx;
- let tokens: Token[];
- const tokenAddressBySymbol: { [symbol: string]: string } = {};
- const tokenAddressByName: { [symbol: string]: string } = {};
- const tokenBySymbol: { [symbol: string]: Token } = {};
- const tokenByName: { [symbol: string]: Token } = {};
- const registeredSymbol = 'ZRX';
- const registeredName = '0x Protocol Token';
- const unregisteredSymbol = 'MAL';
- const unregisteredName = 'Malicious Token';
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- _.map(tokens, token => {
- tokenAddressBySymbol[token.symbol] = token.address;
- tokenAddressByName[token.name] = token.address;
- tokenBySymbol[token.symbol] = token;
- tokenByName[token.name] = token;
- });
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#getTokensAsync', () => {
- it('should return all the tokens added to the tokenRegistry during the migration', async () => {
- expect(tokens).to.have.lengthOf(TOKEN_REGISTRY_SIZE_AFTER_MIGRATION);
-
- const schemaValidator = new SchemaValidator();
- _.each(tokens, token => {
- const validationResult = schemaValidator.validate(token, schemas.tokenSchema);
- expect(validationResult.errors).to.have.lengthOf(0);
- });
- });
- });
- describe('#getTokenAddressesAsync', () => {
- it('should return all the token addresses added to the tokenRegistry during the migration', async () => {
- const tokenAddresses = await zeroEx.tokenRegistry.getTokenAddressesAsync();
- expect(tokenAddresses).to.have.lengthOf(TOKEN_REGISTRY_SIZE_AFTER_MIGRATION);
-
- const schemaValidator = new SchemaValidator();
- _.each(tokenAddresses, tokenAddress => {
- const validationResult = schemaValidator.validate(tokenAddress, schemas.addressSchema);
- expect(validationResult.errors).to.have.lengthOf(0);
- expect(tokenAddress).to.not.be.equal(ZeroEx.NULL_ADDRESS);
- });
- });
- });
- describe('#getTokenAddressBySymbol', () => {
- it('should return correct address for a token in the registry', async () => {
- const tokenAddress = await zeroEx.tokenRegistry.getTokenAddressBySymbolIfExistsAsync(registeredSymbol);
- expect(tokenAddress).to.be.equal(tokenAddressBySymbol[registeredSymbol]);
- });
- it('should return undefined for a token out of registry', async () => {
- const tokenAddress = await zeroEx.tokenRegistry.getTokenAddressBySymbolIfExistsAsync(unregisteredSymbol);
- expect(tokenAddress).to.be.undefined();
- });
- });
- describe('#getTokenAddressByName', () => {
- it('should return correct address for a token in the registry', async () => {
- const tokenAddress = await zeroEx.tokenRegistry.getTokenAddressByNameIfExistsAsync(registeredName);
- expect(tokenAddress).to.be.equal(tokenAddressByName[registeredName]);
- });
- it('should return undefined for a token out of registry', async () => {
- const tokenAddress = await zeroEx.tokenRegistry.getTokenAddressByNameIfExistsAsync(unregisteredName);
- expect(tokenAddress).to.be.undefined();
- });
- });
- describe('#getTokenBySymbol', () => {
- it('should return correct token for a token in the registry', async () => {
- const token = await zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(registeredSymbol);
- expect(token).to.be.deep.equal(tokenBySymbol[registeredSymbol]);
- });
- it('should return undefined for a token out of registry', async () => {
- const token = await zeroEx.tokenRegistry.getTokenBySymbolIfExistsAsync(unregisteredSymbol);
- expect(token).to.be.undefined();
- });
- });
- describe('#getTokenByName', () => {
- it('should return correct token for a token in the registry', async () => {
- const token = await zeroEx.tokenRegistry.getTokenByNameIfExistsAsync(registeredName);
- expect(token).to.be.deep.equal(tokenByName[registeredName]);
- });
- it('should return undefined for a token out of registry', async () => {
- const token = await zeroEx.tokenRegistry.getTokenByNameIfExistsAsync(unregisteredName);
- expect(token).to.be.undefined();
- });
- });
- describe('#getTokenIfExistsAsync', () => {
- it('should return the token added to the tokenRegistry during the migration', async () => {
- const aToken = tokens[0];
-
- const token = await zeroEx.tokenRegistry.getTokenIfExistsAsync(aToken.address);
- const schemaValidator = new SchemaValidator();
- const validationResult = schemaValidator.validate(token, schemas.tokenSchema);
- expect(validationResult.errors).to.have.lengthOf(0);
- });
- it('should return return undefined when passed a token address not in the tokenRegistry', async () => {
- const unregisteredTokenAddress = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
- const tokenIfExists = await zeroEx.tokenRegistry.getTokenIfExistsAsync(unregisteredTokenAddress);
- expect(tokenIfExists).to.be.undefined();
- });
- });
-});
diff --git a/packages/0x.js/test/token_transfer_proxy_wrapper_test.ts b/packages/0x.js/test/token_transfer_proxy_wrapper_test.ts
deleted file mode 100644
index fb003634a..000000000
--- a/packages/0x.js/test/token_transfer_proxy_wrapper_test.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { web3Factory } from '@0xproject/dev-utils';
-import * as chai from 'chai';
-
-import { ZeroEx } from '../src';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const web3 = web3Factory.create();
-
-describe('TokenTransferProxyWrapper', () => {
- let zeroEx: ZeroEx;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- });
- describe('#isAuthorizedAsync', () => {
- it('should return false if the address is not authorized', async () => {
- const isAuthorized = await zeroEx.proxy.isAuthorizedAsync(ZeroEx.NULL_ADDRESS);
- expect(isAuthorized).to.be.false();
- });
- });
- describe('#getAuthorizedAddressesAsync', () => {
- it('should return the list of authorized addresses', async () => {
- const authorizedAddresses = await zeroEx.proxy.getAuthorizedAddressesAsync();
- for (const authorizedAddress of authorizedAddresses) {
- const isAuthorized = await zeroEx.proxy.isAuthorizedAsync(authorizedAddress);
- expect(isAuthorized).to.be.true();
- }
- });
- });
-});
diff --git a/packages/0x.js/test/token_wrapper_test.ts b/packages/0x.js/test/token_wrapper_test.ts
deleted file mode 100644
index 0c6335d5e..000000000
--- a/packages/0x.js/test/token_wrapper_test.ts
+++ /dev/null
@@ -1,517 +0,0 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import 'mocha';
-import * as Web3 from 'web3';
-
-import {
- ApprovalContractEventArgs,
- BlockParamLiteral,
- BlockRange,
- DecodedLogEvent,
- Token,
- TokenEvents,
- TransferContractEventArgs,
- ZeroEx,
- ZeroExError,
-} from '../src';
-import { DoneCallback } from '../src/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { constants } from './utils/constants';
-import { reportNodeCallbackErrors } from './utils/report_callback_errors';
-import { TokenUtils } from './utils/token_utils';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('TokenWrapper', () => {
- let zeroEx: ZeroEx;
- let userAddresses: string[];
- let tokens: Token[];
- let tokenUtils: TokenUtils;
- let coinbase: string;
- let addressWithoutFunds: string;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- before(async () => {
- zeroEx = new ZeroEx(web3.currentProvider, config);
- userAddresses = await zeroEx.getAvailableAddressesAsync();
- tokens = await zeroEx.tokenRegistry.getTokensAsync();
- tokenUtils = new TokenUtils(tokens);
- coinbase = userAddresses[0];
- addressWithoutFunds = userAddresses[1];
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('#transferAsync', () => {
- let token: Token;
- let transferAmount: BigNumber;
- before(() => {
- token = tokens[0];
- transferAmount = new BigNumber(42);
- });
- it('should successfully transfer tokens', async () => {
- const fromAddress = coinbase;
- const toAddress = addressWithoutFunds;
- const preBalance = await zeroEx.token.getBalanceAsync(token.address, toAddress);
- expect(preBalance).to.be.bignumber.equal(0);
- await zeroEx.token.transferAsync(token.address, fromAddress, toAddress, transferAmount);
- const postBalance = await zeroEx.token.getBalanceAsync(token.address, toAddress);
- return expect(postBalance).to.be.bignumber.equal(transferAmount);
- });
- it('should fail to transfer tokens if fromAddress has an insufficient balance', async () => {
- const fromAddress = addressWithoutFunds;
- const toAddress = coinbase;
- return expect(
- zeroEx.token.transferAsync(token.address, fromAddress, toAddress, transferAmount),
- ).to.be.rejectedWith(ZeroExError.InsufficientBalanceForTransfer);
- });
- it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
- const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
- const fromAddress = coinbase;
- const toAddress = coinbase;
- return expect(
- zeroEx.token.transferAsync(nonExistentTokenAddress, fromAddress, toAddress, transferAmount),
- ).to.be.rejectedWith(ZeroExError.TokenContractDoesNotExist);
- });
- });
- describe('#transferFromAsync', () => {
- let token: Token;
- let toAddress: string;
- let senderAddress: string;
- before(async () => {
- token = tokens[0];
- toAddress = addressWithoutFunds;
- senderAddress = userAddresses[2];
- });
- it('should fail to transfer tokens if fromAddress has insufficient allowance set', async () => {
- const fromAddress = coinbase;
- const transferAmount = new BigNumber(42);
-
- const fromAddressBalance = await zeroEx.token.getBalanceAsync(token.address, fromAddress);
- expect(fromAddressBalance).to.be.bignumber.greaterThan(transferAmount);
-
- const fromAddressAllowance = await zeroEx.token.getAllowanceAsync(token.address, fromAddress, toAddress);
- expect(fromAddressAllowance).to.be.bignumber.equal(0);
-
- return expect(
- zeroEx.token.transferFromAsync(token.address, fromAddress, toAddress, senderAddress, transferAmount),
- ).to.be.rejectedWith(ZeroExError.InsufficientAllowanceForTransfer);
- });
- it('[regression] should fail to transfer tokens if set allowance for toAddress instead of senderAddress', async () => {
- const fromAddress = coinbase;
- const transferAmount = new BigNumber(42);
-
- await zeroEx.token.setAllowanceAsync(token.address, fromAddress, toAddress, transferAmount);
-
- return expect(
- zeroEx.token.transferFromAsync(token.address, fromAddress, toAddress, senderAddress, transferAmount),
- ).to.be.rejectedWith(ZeroExError.InsufficientAllowanceForTransfer);
- });
- it('should fail to transfer tokens if fromAddress has insufficient balance', async () => {
- const fromAddress = addressWithoutFunds;
- const transferAmount = new BigNumber(42);
-
- const fromAddressBalance = await zeroEx.token.getBalanceAsync(token.address, fromAddress);
- expect(fromAddressBalance).to.be.bignumber.equal(0);
-
- await zeroEx.token.setAllowanceAsync(token.address, fromAddress, senderAddress, transferAmount);
- const fromAddressAllowance = await zeroEx.token.getAllowanceAsync(
- token.address,
- fromAddress,
- senderAddress,
- );
- expect(fromAddressAllowance).to.be.bignumber.equal(transferAmount);
-
- return expect(
- zeroEx.token.transferFromAsync(token.address, fromAddress, toAddress, senderAddress, transferAmount),
- ).to.be.rejectedWith(ZeroExError.InsufficientBalanceForTransfer);
- });
- it('should successfully transfer tokens', async () => {
- const fromAddress = coinbase;
-
- const preBalance = await zeroEx.token.getBalanceAsync(token.address, toAddress);
- expect(preBalance).to.be.bignumber.equal(0);
-
- const transferAmount = new BigNumber(42);
- await zeroEx.token.setAllowanceAsync(token.address, fromAddress, senderAddress, transferAmount);
-
- await zeroEx.token.transferFromAsync(token.address, fromAddress, toAddress, senderAddress, transferAmount);
- const postBalance = await zeroEx.token.getBalanceAsync(token.address, toAddress);
- return expect(postBalance).to.be.bignumber.equal(transferAmount);
- });
- it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
- const fromAddress = coinbase;
- const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
- return expect(
- zeroEx.token.transferFromAsync(
- nonExistentTokenAddress,
- fromAddress,
- toAddress,
- senderAddress,
- new BigNumber(42),
- ),
- ).to.be.rejectedWith(ZeroExError.TokenContractDoesNotExist);
- });
- });
- describe('#getBalanceAsync', () => {
- describe('With web3 provider with accounts', () => {
- it('should return the balance for an existing ERC20 token', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const balance = await zeroEx.token.getBalanceAsync(token.address, ownerAddress);
- const expectedBalance = new BigNumber('1000000000000000000000000000');
- return expect(balance).to.be.bignumber.equal(expectedBalance);
- });
- it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
- const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
- const ownerAddress = coinbase;
- return expect(zeroEx.token.getBalanceAsync(nonExistentTokenAddress, ownerAddress)).to.be.rejectedWith(
- ZeroExError.TokenContractDoesNotExist,
- );
- });
- it('should return a balance of 0 for a non-existent owner address', async () => {
- const token = tokens[0];
- const nonExistentOwner = '0x198c6ad858f213fb31b6fe809e25040e6b964593';
- const balance = await zeroEx.token.getBalanceAsync(token.address, nonExistentOwner);
- const expectedBalance = new BigNumber(0);
- return expect(balance).to.be.bignumber.equal(expectedBalance);
- });
- });
- describe('With web3 provider without accounts', () => {
- let zeroExWithoutAccounts: ZeroEx;
- before(async () => {
- const hasAddresses = false;
- const web3WithoutAccounts = web3Factory.create({ hasAddresses });
- zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
- });
- it('should return balance even when called with Web3 provider instance without addresses', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const balance = await zeroExWithoutAccounts.token.getBalanceAsync(token.address, ownerAddress);
- const expectedBalance = new BigNumber('1000000000000000000000000000');
- return expect(balance).to.be.bignumber.equal(expectedBalance);
- });
- });
- });
- describe('#setAllowanceAsync', () => {
- it("should set the spender's allowance", async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const spenderAddress = addressWithoutFunds;
-
- const allowanceBeforeSet = await zeroEx.token.getAllowanceAsync(
- token.address,
- ownerAddress,
- spenderAddress,
- );
- const expectedAllowanceBeforeAllowanceSet = new BigNumber(0);
- expect(allowanceBeforeSet).to.be.bignumber.equal(expectedAllowanceBeforeAllowanceSet);
-
- const amountInBaseUnits = new BigNumber(50);
- await zeroEx.token.setAllowanceAsync(token.address, ownerAddress, spenderAddress, amountInBaseUnits);
-
- const allowanceAfterSet = await zeroEx.token.getAllowanceAsync(token.address, ownerAddress, spenderAddress);
- const expectedAllowanceAfterAllowanceSet = amountInBaseUnits;
- return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet);
- });
- });
- describe('#setUnlimitedAllowanceAsync', () => {
- it("should set the unlimited spender's allowance", async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const spenderAddress = addressWithoutFunds;
-
- await zeroEx.token.setUnlimitedAllowanceAsync(token.address, ownerAddress, spenderAddress);
- const allowance = await zeroEx.token.getAllowanceAsync(token.address, ownerAddress, spenderAddress);
- return expect(allowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
- });
- it('should reduce the gas cost for transfers including tokens with unlimited allowance support', async () => {
- const transferAmount = new BigNumber(5);
- const zrx = tokenUtils.getProtocolTokenOrThrow();
- const [, userWithNormalAllowance, userWithUnlimitedAllowance] = userAddresses;
- await zeroEx.token.setAllowanceAsync(zrx.address, coinbase, userWithNormalAllowance, transferAmount);
- await zeroEx.token.setUnlimitedAllowanceAsync(zrx.address, coinbase, userWithUnlimitedAllowance);
-
- const initBalanceWithNormalAllowance = await web3Wrapper.getBalanceInWeiAsync(userWithNormalAllowance);
- const initBalanceWithUnlimitedAllowance = await web3Wrapper.getBalanceInWeiAsync(
- userWithUnlimitedAllowance,
- );
-
- await zeroEx.token.transferFromAsync(
- zrx.address,
- coinbase,
- userWithNormalAllowance,
- userWithNormalAllowance,
- transferAmount,
- );
- await zeroEx.token.transferFromAsync(
- zrx.address,
- coinbase,
- userWithUnlimitedAllowance,
- userWithUnlimitedAllowance,
- transferAmount,
- );
-
- const finalBalanceWithNormalAllowance = await web3Wrapper.getBalanceInWeiAsync(userWithNormalAllowance);
- const finalBalanceWithUnlimitedAllowance = await web3Wrapper.getBalanceInWeiAsync(
- userWithUnlimitedAllowance,
- );
-
- const normalGasCost = initBalanceWithNormalAllowance.minus(finalBalanceWithNormalAllowance);
- const unlimitedGasCost = initBalanceWithUnlimitedAllowance.minus(finalBalanceWithUnlimitedAllowance);
-
- // In theory the gas cost with unlimited allowance should be smaller, but with testrpc it's actually bigger.
- // This needs to be investigated in ethereumjs-vm. This test is essentially a repro.
- // TODO: Make this test pass with inverted assertion.
- expect(unlimitedGasCost.toNumber()).to.be.gt(normalGasCost.toNumber());
- });
- });
- describe('#getAllowanceAsync', () => {
- describe('With web3 provider with accounts', () => {
- it('should get the proxy allowance', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const spenderAddress = addressWithoutFunds;
-
- const amountInBaseUnits = new BigNumber(50);
- await zeroEx.token.setAllowanceAsync(token.address, ownerAddress, spenderAddress, amountInBaseUnits);
-
- const allowance = await zeroEx.token.getAllowanceAsync(token.address, ownerAddress, spenderAddress);
- const expectedAllowance = amountInBaseUnits;
- return expect(allowance).to.be.bignumber.equal(expectedAllowance);
- });
- it('should return 0 if no allowance set yet', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const spenderAddress = addressWithoutFunds;
- const allowance = await zeroEx.token.getAllowanceAsync(token.address, ownerAddress, spenderAddress);
- const expectedAllowance = new BigNumber(0);
- return expect(allowance).to.be.bignumber.equal(expectedAllowance);
- });
- });
- describe('With web3 provider without accounts', () => {
- let zeroExWithoutAccounts: ZeroEx;
- before(async () => {
- const hasAddresses = false;
- const web3WithoutAccounts = web3Factory.create({ hasAddresses });
- zeroExWithoutAccounts = new ZeroEx(web3WithoutAccounts.currentProvider, config);
- });
- it('should get the proxy allowance', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
- const spenderAddress = addressWithoutFunds;
-
- const amountInBaseUnits = new BigNumber(50);
- await zeroEx.token.setAllowanceAsync(token.address, ownerAddress, spenderAddress, amountInBaseUnits);
-
- const allowance = await zeroExWithoutAccounts.token.getAllowanceAsync(
- token.address,
- ownerAddress,
- spenderAddress,
- );
- const expectedAllowance = amountInBaseUnits;
- return expect(allowance).to.be.bignumber.equal(expectedAllowance);
- });
- });
- });
- describe('#getProxyAllowanceAsync', () => {
- it('should get the proxy allowance', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
-
- const amountInBaseUnits = new BigNumber(50);
- await zeroEx.token.setProxyAllowanceAsync(token.address, ownerAddress, amountInBaseUnits);
-
- const allowance = await zeroEx.token.getProxyAllowanceAsync(token.address, ownerAddress);
- const expectedAllowance = amountInBaseUnits;
- return expect(allowance).to.be.bignumber.equal(expectedAllowance);
- });
- });
- describe('#setProxyAllowanceAsync', () => {
- it('should set the proxy allowance', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
-
- const allowanceBeforeSet = await zeroEx.token.getProxyAllowanceAsync(token.address, ownerAddress);
- const expectedAllowanceBeforeAllowanceSet = new BigNumber(0);
- expect(allowanceBeforeSet).to.be.bignumber.equal(expectedAllowanceBeforeAllowanceSet);
-
- const amountInBaseUnits = new BigNumber(50);
- await zeroEx.token.setProxyAllowanceAsync(token.address, ownerAddress, amountInBaseUnits);
-
- const allowanceAfterSet = await zeroEx.token.getProxyAllowanceAsync(token.address, ownerAddress);
- const expectedAllowanceAfterAllowanceSet = amountInBaseUnits;
- return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet);
- });
- });
- describe('#setUnlimitedProxyAllowanceAsync', () => {
- it('should set the unlimited proxy allowance', async () => {
- const token = tokens[0];
- const ownerAddress = coinbase;
-
- await zeroEx.token.setUnlimitedProxyAllowanceAsync(token.address, ownerAddress);
- const allowance = await zeroEx.token.getProxyAllowanceAsync(token.address, ownerAddress);
- return expect(allowance).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
- });
- });
- describe('#subscribe', () => {
- const indexFilterValues = {};
- let tokenAddress: string;
- const transferAmount = new BigNumber(42);
- const allowanceAmount = new BigNumber(42);
- before(() => {
- const token = tokens[0];
- tokenAddress = token.address;
- });
- afterEach(() => {
- zeroEx.token.unsubscribeAll();
- });
- // Hack: Mocha does not allow a test to be both async and have a `done` callback
- // Since we need to await the receipt of the event in the `subscribe` callback,
- // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
- // wrap the rest of the test in an async block
- // Source: https://github.com/mochajs/mocha/issues/2407
- it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<TransferContractEventArgs>) => {
- expect(logEvent.isRemoved).to.be.false();
- expect(logEvent.log.logIndex).to.be.equal(0);
- expect(logEvent.log.transactionIndex).to.be.equal(0);
- expect(logEvent.log.blockNumber).to.be.a('number');
- const args = logEvent.log.args;
- expect(args._from).to.be.equal(coinbase);
- expect(args._to).to.be.equal(addressWithoutFunds);
- expect(args._value).to.be.bignumber.equal(transferAmount);
- },
- );
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Transfer, indexFilterValues, callback);
- await zeroEx.token.transferAsync(tokenAddress, coinbase, addressWithoutFunds, transferAmount);
- })().catch(done);
- });
- it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
- (async () => {
- const callback = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- expect(logEvent).to.not.be.undefined();
- expect(logEvent.isRemoved).to.be.false();
- const args = logEvent.log.args;
- expect(args._owner).to.be.equal(coinbase);
- expect(args._spender).to.be.equal(addressWithoutFunds);
- expect(args._value).to.be.bignumber.equal(allowanceAmount);
- },
- );
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Approval, indexFilterValues, callback);
- await zeroEx.token.setAllowanceAsync(tokenAddress, coinbase, addressWithoutFunds, allowanceAmount);
- })().catch(done);
- });
- it('Outstanding subscriptions are cancelled when zeroEx.setProvider called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Transfer, indexFilterValues, callbackNeverToBeCalled);
- const callbackToBeCalled = reportNodeCallbackErrors(done)();
- const newProvider = web3Factory.getRpcProvider();
- zeroEx.setProvider(newProvider, constants.TESTRPC_NETWORK_ID);
- zeroEx.token.subscribe(tokenAddress, TokenEvents.Transfer, indexFilterValues, callbackToBeCalled);
- await zeroEx.token.transferAsync(tokenAddress, coinbase, addressWithoutFunds, transferAmount);
- })().catch(done);
- });
- it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
- (async () => {
- const callbackNeverToBeCalled = reportNodeCallbackErrors(done)(
- (logEvent: DecodedLogEvent<ApprovalContractEventArgs>) => {
- done(new Error('Expected this subscription to have been cancelled'));
- },
- );
- const subscriptionToken = zeroEx.token.subscribe(
- tokenAddress,
- TokenEvents.Transfer,
- indexFilterValues,
- callbackNeverToBeCalled,
- );
- zeroEx.token.unsubscribe(subscriptionToken);
- await zeroEx.token.transferAsync(tokenAddress, coinbase, addressWithoutFunds, transferAmount);
- done();
- })().catch(done);
- });
- });
- describe('#getLogsAsync', () => {
- let tokenAddress: string;
- let tokenTransferProxyAddress: string;
- const blockRange: BlockRange = {
- fromBlock: 0,
- toBlock: BlockParamLiteral.Latest,
- };
- let txHash: string;
- before(() => {
- const token = tokens[0];
- tokenAddress = token.address;
- tokenTransferProxyAddress = zeroEx.proxy.getContractAddress();
- });
- it('should get logs with decoded args emitted by Approval', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const eventName = TokenEvents.Approval;
- const indexFilterValues = {};
- const logs = await zeroEx.token.getLogsAsync<ApprovalContractEventArgs>(
- tokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(logs[0].event).to.be.equal(eventName);
- expect(args._owner).to.be.equal(coinbase);
- expect(args._spender).to.be.equal(tokenTransferProxyAddress);
- expect(args._value).to.be.bignumber.equal(zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
- });
- it('should only get the logs with the correct event name', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const differentEventName = TokenEvents.Transfer;
- const indexFilterValues = {};
- const logs = await zeroEx.token.getLogsAsync(
- tokenAddress,
- differentEventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(0);
- });
- it('should only get the logs with the correct indexed fields', async () => {
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- txHash = await zeroEx.token.setUnlimitedProxyAllowanceAsync(tokenAddress, addressWithoutFunds);
- await zeroEx.awaitTransactionMinedAsync(txHash);
- const eventName = TokenEvents.Approval;
- const indexFilterValues = {
- _owner: coinbase,
- };
- const logs = await zeroEx.token.getLogsAsync<ApprovalContractEventArgs>(
- tokenAddress,
- eventName,
- blockRange,
- indexFilterValues,
- );
- expect(logs).to.have.length(1);
- const args = logs[0].args;
- expect(args._owner).to.be.equal(coinbase);
- });
- });
-});
-// tslint:disable:max-file-line-count
diff --git a/packages/0x.js/test/utils/chai_setup.ts b/packages/0x.js/test/utils/chai_setup.ts
index 078edd309..1a8733093 100644
--- a/packages/0x.js/test/utils/chai_setup.ts
+++ b/packages/0x.js/test/utils/chai_setup.ts
@@ -4,7 +4,7 @@ import ChaiBigNumber = require('chai-bignumber');
import * as dirtyChai from 'dirty-chai';
export const chaiSetup = {
- configure() {
+ configure(): void {
chai.config.includeStack = true;
chai.use(ChaiBigNumber());
chai.use(dirtyChai);
diff --git a/packages/0x.js/test/utils/fill_scenarios.ts b/packages/0x.js/test/utils/fill_scenarios.ts
deleted file mode 100644
index 8b1308298..000000000
--- a/packages/0x.js/test/utils/fill_scenarios.ts
+++ /dev/null
@@ -1,198 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-
-import { SignedOrder, Token, ZeroEx } from '../../src';
-import { artifacts } from '../../src/artifacts';
-import { DummyTokenContract } from '../../src/contract_wrappers/generated/dummy_token';
-import { orderFactory } from '../utils/order_factory';
-
-import { constants } from './constants';
-
-const INITIAL_COINBASE_TOKEN_SUPPLY_IN_UNITS = new BigNumber(100);
-
-export class FillScenarios {
- private _zeroEx: ZeroEx;
- private _userAddresses: string[];
- private _tokens: Token[];
- private _coinbase: string;
- private _zrxTokenAddress: string;
- private _exchangeContractAddress: string;
- constructor(
- zeroEx: ZeroEx,
- userAddresses: string[],
- tokens: Token[],
- zrxTokenAddress: string,
- exchangeContractAddress: string,
- ) {
- this._zeroEx = zeroEx;
- this._userAddresses = userAddresses;
- this._tokens = tokens;
- this._coinbase = userAddresses[0];
- this._zrxTokenAddress = zrxTokenAddress;
- this._exchangeContractAddress = exchangeContractAddress;
- }
- public async initTokenBalancesAsync() {
- const web3Wrapper = (this._zeroEx as any)._web3Wrapper as Web3Wrapper;
- for (const token of this._tokens) {
- if (token.symbol !== 'ZRX' && token.symbol !== 'WETH') {
- const defaults = {};
- const dummyToken = new DummyTokenContract(web3Wrapper, artifacts.DummyTokenArtifact.abi, token.address);
- const tokenSupply = ZeroEx.toBaseUnitAmount(INITIAL_COINBASE_TOKEN_SUPPLY_IN_UNITS, token.decimals);
- const txHash = await dummyToken.setBalance.sendTransactionAsync(this._coinbase, tokenSupply, {
- from: this._coinbase,
- });
- await this._zeroEx.awaitTransactionMinedAsync(txHash);
- }
- }
- }
- public async createFillableSignedOrderAsync(
- makerTokenAddress: string,
- takerTokenAddress: string,
- makerAddress: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- expirationUnixTimestampSec?: BigNumber,
- ): Promise<SignedOrder> {
- return this.createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- expirationUnixTimestampSec,
- );
- }
- public async createFillableSignedOrderWithFeesAsync(
- makerTokenAddress: string,
- takerTokenAddress: string,
- makerFee: BigNumber,
- takerFee: BigNumber,
- makerAddress: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- feeRecepient: string,
- expirationUnixTimestampSec?: BigNumber,
- ): Promise<SignedOrder> {
- return this._createAsymmetricFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- feeRecepient,
- expirationUnixTimestampSec,
- );
- }
- public async createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress: string,
- takerTokenAddress: string,
- makerAddress: string,
- takerAddress: string,
- makerFillableAmount: BigNumber,
- takerFillableAmount: BigNumber,
- expirationUnixTimestampSec?: BigNumber,
- ): Promise<SignedOrder> {
- const makerFee = new BigNumber(0);
- const takerFee = new BigNumber(0);
- const feeRecepient = constants.NULL_ADDRESS;
- return this._createAsymmetricFillableSignedOrderWithFeesAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerFee,
- takerFee,
- makerAddress,
- takerAddress,
- makerFillableAmount,
- takerFillableAmount,
- feeRecepient,
- expirationUnixTimestampSec,
- );
- }
- public async createPartiallyFilledSignedOrderAsync(
- makerTokenAddress: string,
- takerTokenAddress: string,
- takerAddress: string,
- fillableAmount: BigNumber,
- partialFillAmount: BigNumber,
- ) {
- const [makerAddress] = this._userAddresses;
- const signedOrder = await this.createAsymmetricFillableSignedOrderAsync(
- makerTokenAddress,
- takerTokenAddress,
- makerAddress,
- takerAddress,
- fillableAmount,
- fillableAmount,
- );
- const shouldThrowOnInsufficientBalanceOrAllowance = false;
- await this._zeroEx.exchange.fillOrderAsync(
- signedOrder,
- partialFillAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- takerAddress,
- );
- return signedOrder;
- }
- private async _createAsymmetricFillableSignedOrderWithFeesAsync(
- makerTokenAddress: string,
- takerTokenAddress: string,
- makerFee: BigNumber,
- takerFee: BigNumber,
- makerAddress: string,
- takerAddress: string,
- makerFillableAmount: BigNumber,
- takerFillableAmount: BigNumber,
- feeRecepient: string,
- expirationUnixTimestampSec?: BigNumber,
- ): Promise<SignedOrder> {
- await Promise.all([
- this._increaseBalanceAndAllowanceAsync(makerTokenAddress, makerAddress, makerFillableAmount),
- this._increaseBalanceAndAllowanceAsync(takerTokenAddress, takerAddress, takerFillableAmount),
- ]);
- await Promise.all([
- this._increaseBalanceAndAllowanceAsync(this._zrxTokenAddress, makerAddress, makerFee),
- this._increaseBalanceAndAllowanceAsync(this._zrxTokenAddress, takerAddress, takerFee),
- ]);
-
- const signedOrder = await orderFactory.createSignedOrderAsync(
- this._zeroEx,
- makerAddress,
- takerAddress,
- makerFee,
- takerFee,
- makerFillableAmount,
- makerTokenAddress,
- takerFillableAmount,
- takerTokenAddress,
- this._exchangeContractAddress,
- feeRecepient,
- expirationUnixTimestampSec,
- );
- return signedOrder;
- }
- private async _increaseBalanceAndAllowanceAsync(
- tokenAddress: string,
- address: string,
- amount: BigNumber,
- ): Promise<void> {
- if (amount.isZero() || address === ZeroEx.NULL_ADDRESS) {
- return; // noop
- }
- await Promise.all([
- this._increaseBalanceAsync(tokenAddress, address, amount),
- this._increaseAllowanceAsync(tokenAddress, address, amount),
- ]);
- }
- private async _increaseBalanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
- await this._zeroEx.token.transferAsync(tokenAddress, this._coinbase, address, amount);
- }
- private async _increaseAllowanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
- const oldMakerAllowance = await this._zeroEx.token.getProxyAllowanceAsync(tokenAddress, address);
- const newMakerAllowance = oldMakerAllowance.plus(amount);
- await this._zeroEx.token.setProxyAllowanceAsync(tokenAddress, address, newMakerAllowance);
- }
-}
diff --git a/packages/0x.js/test/utils/order_factory.ts b/packages/0x.js/test/utils/order_factory.ts
deleted file mode 100644
index 08f2081a4..000000000
--- a/packages/0x.js/test/utils/order_factory.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { SignedOrder, ZeroEx } from '../../src';
-
-const SHOULD_ADD_PERSONAL_MESSAGE_PREFIX = false;
-
-export const orderFactory = {
- async createSignedOrderAsync(
- zeroEx: ZeroEx,
- maker: string,
- taker: string,
- makerFee: BigNumber,
- takerFee: BigNumber,
- makerTokenAmount: BigNumber,
- makerTokenAddress: string,
- takerTokenAmount: BigNumber,
- takerTokenAddress: string,
- exchangeContractAddress: string,
- feeRecipient: string,
- expirationUnixTimestampSecIfExists?: BigNumber,
- ): Promise<SignedOrder> {
- const defaultExpirationUnixTimestampSec = new BigNumber(2524604400); // Close to infinite
- const expirationUnixTimestampSec = _.isUndefined(expirationUnixTimestampSecIfExists)
- ? defaultExpirationUnixTimestampSec
- : expirationUnixTimestampSecIfExists;
- const order = {
- maker,
- taker,
- makerFee,
- takerFee,
- makerTokenAmount,
- takerTokenAmount,
- makerTokenAddress,
- takerTokenAddress,
- salt: ZeroEx.generatePseudoRandomSalt(),
- exchangeContractAddress,
- feeRecipient,
- expirationUnixTimestampSec,
- };
- const orderHash = ZeroEx.getOrderHashHex(order);
- const ecSignature = await zeroEx.signOrderHashAsync(orderHash, maker, SHOULD_ADD_PERSONAL_MESSAGE_PREFIX);
- const signedOrder: SignedOrder = _.assign(order, { ecSignature });
- return signedOrder;
- },
-};
diff --git a/packages/0x.js/test/utils/report_callback_errors.ts b/packages/0x.js/test/utils/report_callback_errors.ts
deleted file mode 100644
index 27c9745c9..000000000
--- a/packages/0x.js/test/utils/report_callback_errors.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import * as chai from 'chai';
-import * as _ from 'lodash';
-
-import { DoneCallback } from '../../src/types';
-
-const expect = chai.expect;
-
-export const reportNoErrorCallbackErrors = (done: DoneCallback, expectToBeCalledOnce = true) => {
- return <T>(f?: (value: T) => void) => {
- const wrapped = (value: T) => {
- if (_.isUndefined(f)) {
- done();
- return;
- }
- try {
- f(value);
- if (expectToBeCalledOnce) {
- done();
- }
- } catch (err) {
- done(err);
- }
- };
- return wrapped;
- };
-};
-
-export const reportNodeCallbackErrors = (done: DoneCallback, expectToBeCalledOnce = true) => {
- return <T>(f?: (value: T) => void) => {
- const wrapped = (error: Error | null, value: T | undefined) => {
- if (!_.isNull(error)) {
- done(error);
- } else {
- if (_.isUndefined(f)) {
- done();
- return;
- }
- try {
- f(value as T);
- if (expectToBeCalledOnce) {
- done();
- }
- } catch (err) {
- done(err);
- }
- }
- };
- return wrapped;
- };
-};
-
-export const assertNodeCallbackError = (done: DoneCallback, errMsg: string) => {
- const wrapped = <T>(error: Error | null, value: T | undefined) => {
- if (_.isNull(error)) {
- done(new Error('Expected callback to receive an error'));
- } else {
- try {
- expect(error.message).to.be.equal(errMsg);
- done();
- } catch (err) {
- done(err);
- }
- }
- };
- return wrapped;
-};
diff --git a/packages/0x.js/test/utils/token_utils.ts b/packages/0x.js/test/utils/token_utils.ts
index d3fc22ff4..a439c464d 100644
--- a/packages/0x.js/test/utils/token_utils.ts
+++ b/packages/0x.js/test/utils/token_utils.ts
@@ -1,33 +1,9 @@
-import * as _ from 'lodash';
+import { artifacts } from '../../src/artifacts';
-import { InternalZeroExError, Token } from '../../src/types';
+import { constants } from './constants';
-const PROTOCOL_TOKEN_SYMBOL = 'ZRX';
-const WETH_TOKEN_SYMBOL = 'WETH';
-
-export class TokenUtils {
- private _tokens: Token[];
- constructor(tokens: Token[]) {
- this._tokens = tokens;
- }
- public getProtocolTokenOrThrow(): Token {
- const zrxToken = _.find(this._tokens, { symbol: PROTOCOL_TOKEN_SYMBOL });
- if (_.isUndefined(zrxToken)) {
- throw new Error(InternalZeroExError.ZrxNotInTokenRegistry);
- }
- return zrxToken;
- }
- public getWethTokenOrThrow(): Token {
- const wethToken = _.find(this._tokens, { symbol: WETH_TOKEN_SYMBOL });
- if (_.isUndefined(wethToken)) {
- throw new Error(InternalZeroExError.WethNotInTokenRegistry);
- }
- return wethToken;
- }
- public getDummyTokens(): Token[] {
- const dummyTokens = _.filter(this._tokens, token => {
- return !_.includes([PROTOCOL_TOKEN_SYMBOL, WETH_TOKEN_SYMBOL], token.symbol);
- });
- return dummyTokens;
- }
-}
+export const tokenUtils = {
+ getProtocolTokenAddress(): string {
+ return artifacts.ZRXToken.networks[constants.TESTRPC_NETWORK_ID].address;
+ },
+};
diff --git a/packages/0x.js/test/utils/web3_wrapper.ts b/packages/0x.js/test/utils/web3_wrapper.ts
index 4b374fc7e..02c8c5918 100644
--- a/packages/0x.js/test/utils/web3_wrapper.ts
+++ b/packages/0x.js/test/utils/web3_wrapper.ts
@@ -1,6 +1,12 @@
-import { web3Factory } from '@0xproject/dev-utils';
+import { devConstants, web3Factory } from '@0xproject/dev-utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as Web3 from 'web3';
+import { Provider } from 'ethereum-types';
-export const web3 = web3Factory.create();
-export const web3Wrapper = new Web3Wrapper(web3.currentProvider);
+const txDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ gas: devConstants.GAS_LIMIT,
+};
+const provider: Provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+const web3Wrapper = new Web3Wrapper(provider);
+
+export { provider, web3Wrapper, txDefaults };
diff --git a/packages/0x.js/tsconfig.json b/packages/0x.js/tsconfig.json
index ddf5a910e..e35816553 100644
--- a/packages/0x.js/tsconfig.json
+++ b/packages/0x.js/tsconfig.json
@@ -1,13 +1,7 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "outDir": "lib",
- "noImplicitThis": false
+ "outDir": "lib"
},
- "include": [
- "./src/**/*",
- "./test/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
+ "include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/abi-gen/CHANGELOG.json b/packages/abi-gen/CHANGELOG.json
index ac0f83da6..d7b084fe6 100644
--- a/packages/abi-gen/CHANGELOG.json
+++ b/packages/abi-gen/CHANGELOG.json
@@ -1,13 +1,167 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Fix the abi-gen entry point in package.json",
+ "pr": 901
+ }
+ ],
+ "timestamp": 1532357734
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Convert e_r_c to erc in generated file names",
+ "pr": 822
+ },
+ {
+ "note": "Remove the output directory before writing to it",
+ "pr": 822
+ },
+ {
+ "note": "skip generation of wrappers that are already up to date",
+ "pr": 788
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.3.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.3.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.3.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.3.1",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "version": "0.3.0",
+ "changes": [
+ {
+ "note": "Properly export the executable binary",
+ "pr": 588
+ }
+ ],
+ "timestamp": 1527008270
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.2.13",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.2.12",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.2.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.2.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.2.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.2.8",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.2.5",
@@ -17,8 +171,7 @@
"pr": 452
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.2.4",
@@ -38,8 +191,7 @@
"pr": 413
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.2.1",
@@ -49,8 +201,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.2.0",
@@ -65,8 +216,7 @@
"pr": 388
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
},
{
"version": "0.1.0",
@@ -84,7 +234,6 @@
"pr": 304
}
],
- "timestamp": 1515596400,
- "isPublished": true
+ "timestamp": 1515596400
}
]
diff --git a/packages/abi-gen/CHANGELOG.md b/packages/abi-gen/CHANGELOG.md
index 6a9a2c5e9..5368ae3f0 100644
--- a/packages/abi-gen/CHANGELOG.md
+++ b/packages/abi-gen/CHANGELOG.md
@@ -1,34 +1,100 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Fix the abi-gen entry point in package.json (#901)
+
+## v1.0.0 - _July 19, 2018_
+
+ * Convert e_r_c to erc in generated file names (#822)
+ * Remove the output directory before writing to it (#822)
+ * skip generation of wrappers that are already up to date (#788)
+
+## v0.3.4 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.3.3 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.3.2 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.3.1 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.3.0 - _May 22, 2018_
+
+ * Properly export the executable binary (#588)
+
+## v0.2.13 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.2.12 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.2.11 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.2.10 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.2.9 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.2.8 - _April 2, 2018_
* Dependencies updated
-## v0.2.5 - _March 18, 2018_
+## v0.2.5 - _March 17, 2018_
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
-## v0.2.4 - _March 4, 2018_
+## v0.2.4 - _March 3, 2018_
* Add a `backend` parameter that allows you to specify the Ethereum library you use in your templates (`web3` or `ethers`). Ethers auto-converts small ints to numbers whereas Web3 doesn't. Defaults to `web3` (#413)
* Add support for [tuple types](https://solidity.readthedocs.io/en/develop/abi-spec.html#handling-tuple-types) (#413)
* Add `hasReturnValue` to context data (#413)
-## v0.2.1 - _February 9, 2018_
+## v0.2.1 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.2.0 - _February 7, 2018_
+## v0.2.0 - _February 6, 2018_
* Added CLI options for explicit specifying location of partials and main template (#346)
* Added CLI option to specify networkId, adding support for the JSON artifact format found in @0xproject/contracts (#388)
-## v0.1.0 - _January 11, 2018_
+## v0.1.0 - _January 10, 2018_
* Fixed array typings with union types (#295)
* Add event ABIs to context data passed to templates (#302)
diff --git a/packages/abi-gen/README.md b/packages/abi-gen/README.md
index 899b4845e..b6dd37cd1 100644
--- a/packages/abi-gen/README.md
+++ b/packages/abi-gen/README.md
@@ -4,8 +4,7 @@ This package allows you to generate TypeScript contract wrappers from ABI files.
It's heavily inspired by [Geth abigen](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) but takes a different approach.
You can write your custom handlebars templates which will allow you to seamlessly integrate the generated code into your existing codebase with existing conventions.
-For an example of the generated [wrapper files](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/src/contract_wrappers/generated) check out 0x.js.
-[Here](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/contract_templates) are the templates used to generate those files.
+[Here](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/contract_templates) are the templates used to generate the contract wrappers used by 0x.js.e
## Installation
@@ -45,7 +44,7 @@ You need to also specify the location of your main template used for every contr
## How to write custom templates?
-The best way to get started is to copy [0x.js templates](https://github.com/0xProject/0x-monorepo/tree/development/packages/0x.js/contract_templates) and start adjusting them for your needs.
+The best way to get started is to copy [0x.js templates](https://github.com/0xProject/0x-monorepo/tree/development/packages/contract_templates) and start adjusting them for your needs.
We use [handlebars](http://handlebarsjs.com/) template engine under the hood.
You need to have a master template called `contract.mustache`. it will be used to generate each contract wrapper. Although - you don't need and probably shouldn't write all your logic in a single template file. You can write [partial templates](http://handlebarsjs.com/partials.html) and as long as they are within a partials folder - they will be registered and available.
@@ -57,3 +56,49 @@ See the [type definition](https://github.com/0xProject/0x-monorepo/tree/developm
## Output files
Output files will be generated within an output folder with names converted to camel case and taken from abi file names. If you already have some files in that folder they will be overwritten.
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/abi-gen yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/abi-gen yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
diff --git a/packages/abi-gen/bin/abi-gen.js b/packages/abi-gen/bin/abi-gen.js
new file mode 100755
index 000000000..73ffe76ed
--- /dev/null
+++ b/packages/abi-gen/bin/abi-gen.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../lib/src/index.js');
diff --git a/packages/contracts/coverage/.gitkeep b/packages/abi-gen/coverage/.gitkeep
index e69de29bb..e69de29bb 100644
--- a/packages/contracts/coverage/.gitkeep
+++ b/packages/abi-gen/coverage/.gitkeep
diff --git a/packages/abi-gen/package.json b/packages/abi-gen/package.json
index 4bd2d5296..8ea055a15 100644
--- a/packages/abi-gen/package.json
+++ b/packages/abi-gen/package.json
@@ -1,18 +1,26 @@
{
"name": "@0xproject/abi-gen",
- "version": "0.2.8",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Generate contract wrappers from ABI and handlebars templates",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "lint": "tslint --project . 'src/**/*.ts'",
+ "watch_without_deps": "tsc -w",
+ "lint": "tslint --project .",
"clean": "shx rm -rf lib scripts",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "test": "yarn run_mocha",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
+ "test:circleci": "yarn test:coverage",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"bin": {
- "abi-gen": "lib/index.js"
+ "abi-gen": "bin/abi-gen.js"
},
"repository": {
"type": "git",
@@ -24,30 +32,38 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/abi-gen/README.md",
"dependencies": {
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
"chalk": "^2.3.0",
+ "ethereum-types": "^1.0.4",
"glob": "^7.1.2",
"handlebars": "^4.0.11",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"mkdirp": "^0.5.1",
+ "sleep": "^5.1.1",
+ "tmp": "^0.0.33",
"to-snake-case": "^1.0.0",
"yargs": "^10.0.3"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/glob": "^5.0.33",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/glob": "5.0.35",
"@types/handlebars": "^4.0.36",
"@types/mkdirp": "^0.5.1",
"@types/node": "^8.0.53",
+ "@types/sleep": "^0.0.7",
+ "@types/tmp": "^0.0.33",
"@types/yargs": "^10.0.0",
+ "chai": "^4.1.2",
"copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^5.2.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/abi-gen/src/globals.d.ts b/packages/abi-gen/src/globals.d.ts
index d267a4106..94e63a32d 100644
--- a/packages/abi-gen/src/globals.d.ts
+++ b/packages/abi-gen/src/globals.d.ts
@@ -1,8 +1,3 @@
-declare function toSnakeCase(str: string): string;
-declare module 'to-snake-case' {
- export = toSnakeCase;
-}
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/abi-gen/src/index.ts b/packages/abi-gen/src/index.ts
index 942bb12db..f5283b97a 100644
--- a/packages/abi-gen/src/index.ts
+++ b/packages/abi-gen/src/index.ts
@@ -1,17 +1,14 @@
#!/usr/bin/env node
-import { AbiDefinition, ConstructorAbi, EventAbi, MethodAbi } from '@0xproject/types';
-import { logUtils } from '@0xproject/utils';
+import { abiUtils, logUtils } from '@0xproject/utils';
import chalk from 'chalk';
-import * as fs from 'fs';
+import { AbiDefinition, ConstructorAbi, EventAbi, MethodAbi } from 'ethereum-types';
import { sync as globSync } from 'glob';
import * as Handlebars from 'handlebars';
import * as _ from 'lodash';
import * as mkdirp from 'mkdirp';
import * as yargs from 'yargs';
-import toSnakeCase = require('to-snake-case');
-
import { ContextData, ContractsBackend, ParamKind } from './types';
import { utils } from './utils';
@@ -61,29 +58,17 @@ const args = yargs
'Full usage example',
).argv;
-function registerPartials(partialsGlob: string) {
+function registerPartials(partialsGlob: string): void {
const partialTemplateFileNames = globSync(partialsGlob);
logUtils.log(`Found ${chalk.green(`${partialTemplateFileNames.length}`)} ${chalk.bold('partial')} templates`);
for (const partialTemplateFileName of partialTemplateFileNames) {
const namedContent = utils.getNamedContent(partialTemplateFileName);
Handlebars.registerPartial(namedContent.name, namedContent.content);
}
- return partialsGlob;
-}
-
-function writeOutputFile(name: string, renderedTsCode: string): void {
- let fileName = toSnakeCase(name);
- if (fileName === 'z_r_x_token') {
- fileName = 'zrx_token';
- }
- const filePath = `${args.output}/${fileName}.ts`;
- fs.writeFileSync(filePath, renderedTsCode);
- logUtils.log(`Created: ${chalk.bold(filePath)}`);
}
Handlebars.registerHelper('parameterType', utils.solTypeToTsType.bind(utils, ParamKind.Input, args.backend));
Handlebars.registerHelper('returnType', utils.solTypeToTsType.bind(utils, ParamKind.Output, args.backend));
-
if (args.partials) {
registerPartials(args.partials);
}
@@ -109,28 +94,37 @@ for (const abiFileName of abiFileNames) {
ABI = parsedContent; // ABI file
} else if (!_.isUndefined(parsedContent.abi)) {
ABI = parsedContent.abi; // Truffle artifact
- } else if (!_.isUndefined(parsedContent.networks) && !_.isUndefined(parsedContent.networks[args.networkId])) {
- ABI = parsedContent.networks[args.networkId].abi; // 0x contracts package artifact
+ } else if (!_.isUndefined(parsedContent.compilerOutput.abi)) {
+ ABI = parsedContent.compilerOutput.abi; // 0x artifact
}
if (_.isUndefined(ABI)) {
logUtils.log(`${chalk.red(`ABI not found in ${abiFileName}.`)}`);
logUtils.log(
- `Please make sure your ABI file is either an array with ABI entries or a truffle artifact or 0x deployer artifact`,
+ `Please make sure your ABI file is either an array with ABI entries or a truffle artifact or 0x sol-compiler artifact`,
);
process.exit(1);
}
+ const outFileName = utils.makeOutputFileName(namedContent.name);
+ const outFilePath = `${args.output}/${outFileName}.ts`;
+
+ if (utils.isOutputFileUpToDate(abiFileName, outFilePath)) {
+ logUtils.log(`Already up to date: ${chalk.bold(outFilePath)}`);
+ continue;
+ }
+
let ctor = ABI.find((abi: AbiDefinition) => abi.type === ABI_TYPE_CONSTRUCTOR) as ConstructorAbi;
if (_.isUndefined(ctor)) {
ctor = utils.getEmptyConstructor(); // The constructor exists, but it's implicit in JSON's ABI definition
}
const methodAbis = ABI.filter((abi: AbiDefinition) => abi.type === ABI_TYPE_METHOD) as MethodAbi[];
- const methodsData = _.map(methodAbis, methodAbi => {
- _.map(methodAbi.inputs, (input, i: number) => {
+ const sanitizedMethodAbis = abiUtils.renameOverloadedMethods(methodAbis) as MethodAbi[];
+ const methodsData = _.map(methodAbis, (methodAbi, methodAbiIndex: number) => {
+ _.forEach(methodAbi.inputs, (input, inputIndex: number) => {
if (_.isEmpty(input.name)) {
// Auto-generated getters don't have parameter names
- input.name = `index_${i}`;
+ input.name = `index_${inputIndex}`;
}
});
// This will make templates simpler
@@ -138,6 +132,8 @@ for (const abiFileName of abiFileNames) {
...methodAbi,
singleReturnValue: methodAbi.outputs.length === 1,
hasReturnValue: methodAbi.outputs.length !== 0,
+ tsName: sanitizedMethodAbis[methodAbiIndex].name,
+ functionSignature: abiUtils.getFunctionSignature(methodAbi),
};
return methodData;
});
@@ -151,5 +147,6 @@ for (const abiFileName of abiFileNames) {
events: eventAbis,
};
const renderedTsCode = template(contextData);
- writeOutputFile(namedContent.name, renderedTsCode);
+ utils.writeOutputFile(outFilePath, renderedTsCode);
+ logUtils.log(`Created: ${chalk.bold(outFilePath)}`);
}
diff --git a/packages/abi-gen/src/types.ts b/packages/abi-gen/src/types.ts
index df5b1feaf..68765b04d 100644
--- a/packages/abi-gen/src/types.ts
+++ b/packages/abi-gen/src/types.ts
@@ -1,17 +1,10 @@
-import { EventAbi, MethodAbi } from '@0xproject/types';
+import { EventAbi, MethodAbi } from 'ethereum-types';
export enum ParamKind {
Input = 'input',
Output = 'output',
}
-export enum AbiType {
- Function = 'function',
- Constructor = 'constructor',
- Event = 'event',
- Fallback = 'fallback',
-}
-
export enum ContractsBackend {
Web3 = 'web3',
Ethers = 'ethers',
@@ -20,6 +13,8 @@ export enum ContractsBackend {
export interface Method extends MethodAbi {
singleReturnValue: boolean;
hasReturnValue: boolean;
+ tsName: string;
+ functionSignature: string;
}
export interface ContextData {
diff --git a/packages/abi-gen/src/utils.ts b/packages/abi-gen/src/utils.ts
index 755fbc71a..56b996ce3 100644
--- a/packages/abi-gen/src/utils.ts
+++ b/packages/abi-gen/src/utils.ts
@@ -1,9 +1,10 @@
-import { ConstructorAbi, DataItem } from '@0xproject/types';
+import { AbiType, ConstructorAbi, DataItem } from 'ethereum-types';
import * as fs from 'fs';
import * as _ from 'lodash';
import * as path from 'path';
+import toSnakeCase = require('to-snake-case');
-import { AbiType, ContractsBackend, ParamKind } from './types';
+import { ContractsBackend, ParamKind } from './types';
export const utils = {
solTypeToTsType(paramKind: ParamKind, backend: ContractsBackend, solType: string, components?: DataItem[]): string {
@@ -56,7 +57,7 @@ export const utils = {
const componentType = `${component.name}: ${componentValueType}`;
return componentType;
});
- const tsType = `{${componentsType}}`;
+ const tsType = `{${componentsType.join(';')}}`;
return tsType;
}
throw new Error(`Unknown Solidity type found: ${solType}`);
@@ -92,4 +93,27 @@ export const utils = {
inputs: [],
};
},
+ makeOutputFileName(name: string): string {
+ let fileName = toSnakeCase(name);
+ // HACK: Snake case doesn't make a lot of sense for abbreviated names but we can't reliably detect abbreviations
+ // so we special-case the abbreviations we use.
+ fileName = fileName.replace('z_r_x', 'zrx').replace('e_r_c', 'erc');
+ return fileName;
+ },
+ writeOutputFile(filePath: string, renderedTsCode: string): void {
+ fs.writeFileSync(filePath, renderedTsCode);
+ },
+ isOutputFileUpToDate(abiFile: string, outputFile: string): boolean {
+ const abiFileModTimeMs = fs.statSync(abiFile).mtimeMs;
+ try {
+ const outFileModTimeMs = fs.statSync(outputFile).mtimeMs;
+ return outFileModTimeMs > abiFileModTimeMs;
+ } catch (err) {
+ if (err.code === 'ENOENT') {
+ return false;
+ } else {
+ throw err;
+ }
+ }
+ },
};
diff --git a/packages/abi-gen/test/utils_test.ts b/packages/abi-gen/test/utils_test.ts
new file mode 100644
index 000000000..820c0c675
--- /dev/null
+++ b/packages/abi-gen/test/utils_test.ts
@@ -0,0 +1,86 @@
+import * as chai from 'chai';
+import * as dirtyChai from 'dirty-chai';
+import * as fs from 'fs';
+import 'mocha';
+import * as tmp from 'tmp';
+
+import { utils } from '../src/utils';
+
+tmp.setGracefulCleanup(); // remove tmp files even if there are failures
+
+chai.use(dirtyChai);
+
+const expect = chai.expect;
+
+describe('makeOutputFileName()', () => {
+ it('should handle Metacoin usage', () => {
+ expect(utils.makeOutputFileName('Metacoin')).to.equal('metacoin');
+ });
+ it('should handle special zrx_token case', () => {
+ expect(utils.makeOutputFileName('ZRXToken')).to.equal('zrx_token');
+ });
+ it('should handle special erc_token case', () => {
+ expect(utils.makeOutputFileName('ERC20Token')).to.equal('erc20_token');
+ });
+});
+
+describe('writeOutputFile()', () => {
+ let tempFilePath: string;
+ before(() => {
+ tempFilePath = tmp.fileSync(
+ { discardDescriptor: true }, // close file (so we can update it)
+ ).name;
+ });
+ it('should write content to output file', () => {
+ const content = 'hello world';
+
+ utils.writeOutputFile(tempFilePath, content);
+
+ expect(fs.readFileSync(tempFilePath).toString()).to.equal(content);
+ });
+});
+
+describe('isOutputFileUpToDate()', () => {
+ it('should throw ENOENT when there is no abi file', () => {
+ expect(utils.isOutputFileUpToDate.bind('nonexistant1', 'nonexistant2')).to.throw('ENOENT');
+ });
+
+ describe('when the abi input file exists', () => {
+ let abiFile: string;
+ before(() => {
+ abiFile = tmp.fileSync(
+ { discardDescriptor: true }, // close file (set timestamp)
+ ).name;
+ });
+
+ describe('without an existing output file', () => {
+ it('should return false', () => {
+ expect(utils.isOutputFileUpToDate(abiFile, 'nonexistant_file')).to.be.false();
+ });
+ });
+
+ describe('with an existing output file', () => {
+ let outputFile: string;
+ before(() => {
+ outputFile = tmp.fileSync(
+ { discardDescriptor: true }, // close file (set timestamp)
+ ).name;
+ const abiFileModTimeMs = fs.statSync(abiFile).mtimeMs;
+ const outfileModTimeMs = abiFileModTimeMs + 1;
+ fs.utimesSync(outputFile, outfileModTimeMs, outfileModTimeMs);
+ });
+
+ it('should return true when output file is newer than abi file', async () => {
+ expect(utils.isOutputFileUpToDate(abiFile, outputFile)).to.be.true();
+ });
+
+ it('should return false when output file exists but is older than abi file', () => {
+ const outFileModTimeMs = fs.statSync(outputFile).mtimeMs;
+ const abiFileModTimeMs = outFileModTimeMs + 1;
+ fs.utimesSync(abiFile, abiFileModTimeMs, abiFileModTimeMs);
+
+ expect(utils.isOutputFileUpToDate(abiFile, outputFile)).to.be.false();
+ });
+ });
+ });
+});
diff --git a/packages/assert/CHANGELOG.json b/packages/assert/CHANGELOG.json
index 84fce1ca8..1deacb7b5 100644
--- a/packages/assert/CHANGELOG.json
+++ b/packages/assert/CHANGELOG.json
@@ -1,13 +1,158 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note":
+ "Fix bug in string enum assertion. We erroneously were checking against the enum keys, not values",
+ "pr": 821
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.2.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.2.13",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.2.12",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.2.11",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527008270,
+ "version": "0.2.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.2.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.2.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.2.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.2.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.2.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.2.4",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.2.0",
@@ -17,8 +162,7 @@
"pr": 412
}
],
- "timestamp": 1520434800,
- "isPublished": true
+ "timestamp": 1520434800
},
{
"version": "0.1.0",
@@ -32,8 +176,7 @@
"pr": 385
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.0.18",
@@ -43,8 +186,7 @@
"pr": 389
}
],
- "timestamp": 1486566000,
- "isPublished": true
+ "timestamp": 1486566000
},
{
"version": "0.0.4",
@@ -57,7 +199,6 @@
"Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals."
}
],
- "timestamp": 1510585200,
- "isPublished": true
+ "timestamp": 1510585200
}
]
diff --git a/packages/assert/CHANGELOG.md b/packages/assert/CHANGELOG.md
index e14a02b3d..cdb5e45d4 100644
--- a/packages/assert/CHANGELOG.md
+++ b/packages/assert/CHANGELOG.md
@@ -1,28 +1,92 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Fix bug in string enum assertion. We erroneously were checking against the enum keys, not values (#821)
+
+## v0.2.14 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.2.13 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.2.12 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.2.11 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.2.10 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.2.9 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.2.8 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.2.7 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.2.6 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.2.5 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.2.4 - _April 2, 2018_
* Dependencies updated
-## v0.2.0 - _March 8, 2018_
+## v0.2.0 - _March 7, 2018_
* Rename `isHttpUrl` to `isWebUri` (#412)
-## v0.1.0 - _March 4, 2018_
+## v0.1.0 - _March 3, 2018_
* Remove isETHAddressHex checksum address check and assume address will be lowercased (#373)
* Add an optional parameter `subSchemas` to `doesConformToSchema` method (#385)
-## v0.0.18 - _February 9, 2017_
+## v0.0.18 - _February 8, 2017_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.0.4 - _November 14, 2017_
+## v0.0.4 - _November 13, 2017_
* Re-publish Assert previously published under NPM package @0xproject/0x-assert
* Added assertion isValidBaseUnitAmount which checks both that the value is a valid bigNumber and that it does not contain decimals.
diff --git a/packages/assert/README.md b/packages/assert/README.md
index 7f80e7e5d..1f2139d47 100644
--- a/packages/assert/README.md
+++ b/packages/assert/README.md
@@ -26,11 +26,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -46,8 +46,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/assert yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/assert yarn watch
+```
+
+### Clean
+
```bash
-yarn build
+yarn clean
```
### Lint
diff --git a/packages/assert/package.json b/packages/assert/package.json
index 2f657ba8e..9d2669955 100644
--- a/packages/assert/package.json
+++ b/packages/assert/package.json
@@ -1,17 +1,20 @@
{
"name": "@0xproject/assert",
- "version": "0.2.4",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Provides a standard way of performing type and schema validation across 0x projects",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib test_temp scripts",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "run_mocha": "mocha lib/test/**/*_test.js",
- "prepublishOnly": "run-p build",
- "test": "run-s clean build run_mocha",
+ "lint": "tslint --project .",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"test:circleci": "yarn test:coverage",
@@ -27,26 +30,27 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/assert/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/valid-url": "^1.0.2",
"chai": "^4.0.1",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "lodash": "^4.17.4",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "lodash": "^4.17.5",
"valid-url": "^1.0.9"
},
"publishConfig": {
diff --git a/packages/assert/src/globals.d.ts b/packages/assert/src/globals.d.ts
index 5476b6bd8..94e63a32d 100644
--- a/packages/assert/src/globals.d.ts
+++ b/packages/assert/src/globals.d.ts
@@ -1,5 +1,3 @@
-declare module 'dirty-chai';
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/assert/src/index.ts b/packages/assert/src/index.ts
index 171909c93..ccf2c9ad8 100644
--- a/packages/assert/src/index.ts
+++ b/packages/assert/src/index.ts
@@ -8,41 +8,41 @@ const HEX_REGEX = /^0x[0-9A-F]*$/i;
export const assert = {
isBigNumber(variableName: string, value: BigNumber): void {
const isBigNumber = _.isObject(value) && (value as any).isBigNumber;
- this.assert(isBigNumber, this.typeAssertionMessage(variableName, 'BigNumber', value));
+ assert.assert(isBigNumber, assert.typeAssertionMessage(variableName, 'BigNumber', value));
},
- isValidBaseUnitAmount(variableName: string, value: BigNumber) {
+ isValidBaseUnitAmount(variableName: string, value: BigNumber): void {
assert.isBigNumber(variableName, value);
const isNegative = value.lessThan(0);
- this.assert(!isNegative, `${variableName} cannot be a negative number, found value: ${value.toNumber()}`);
+ assert.assert(!isNegative, `${variableName} cannot be a negative number, found value: ${value.toNumber()}`);
const hasDecimals = value.decimalPlaces() !== 0;
- this.assert(
+ assert.assert(
!hasDecimals,
`${variableName} should be in baseUnits (no decimals), found value: ${value.toNumber()}`,
);
},
isString(variableName: string, value: string): void {
- this.assert(_.isString(value), this.typeAssertionMessage(variableName, 'string', value));
+ assert.assert(_.isString(value), assert.typeAssertionMessage(variableName, 'string', value));
},
isFunction(variableName: string, value: any): void {
- this.assert(_.isFunction(value), this.typeAssertionMessage(variableName, 'function', value));
+ assert.assert(_.isFunction(value), assert.typeAssertionMessage(variableName, 'function', value));
},
isHexString(variableName: string, value: string): void {
- this.assert(
+ assert.assert(
_.isString(value) && HEX_REGEX.test(value),
- this.typeAssertionMessage(variableName, 'HexString', value),
+ assert.typeAssertionMessage(variableName, 'HexString', value),
);
},
isETHAddressHex(variableName: string, value: string): void {
- this.assert(_.isString(value), this.typeAssertionMessage(variableName, 'string', value));
- this.assert(addressUtils.isAddress(value), this.typeAssertionMessage(variableName, 'ETHAddressHex', value));
+ assert.assert(_.isString(value), assert.typeAssertionMessage(variableName, 'string', value));
+ assert.assert(addressUtils.isAddress(value), assert.typeAssertionMessage(variableName, 'ETHAddressHex', value));
},
doesBelongToStringEnum(
variableName: string,
value: string,
stringEnum: any /* There is no base type for every string enum */,
): void {
- const doesBelongToStringEnum = !_.isUndefined(stringEnum[value]);
- const enumValues = _.keys(stringEnum);
+ const enumValues = _.values(stringEnum);
+ const doesBelongToStringEnum = _.includes(enumValues, value);
const enumValuesAsStrings = _.map(enumValues, enumValue => `'${enumValue}'`);
const enumValuesAsString = enumValuesAsStrings.join(', ');
assert.assert(
@@ -51,19 +51,22 @@ export const assert = {
);
},
hasAtMostOneUniqueValue(value: any[], errMsg: string): void {
- this.assert(_.uniq(value).length <= 1, errMsg);
+ assert.assert(_.uniq(value).length <= 1, errMsg);
},
isNumber(variableName: string, value: number): void {
- this.assert(_.isFinite(value), this.typeAssertionMessage(variableName, 'number', value));
+ assert.assert(_.isFinite(value), assert.typeAssertionMessage(variableName, 'number', value));
},
isBoolean(variableName: string, value: boolean): void {
- this.assert(_.isBoolean(value), this.typeAssertionMessage(variableName, 'boolean', value));
+ assert.assert(_.isBoolean(value), assert.typeAssertionMessage(variableName, 'boolean', value));
},
isWeb3Provider(variableName: string, value: any): void {
const isWeb3Provider = _.isFunction(value.send) || _.isFunction(value.sendAsync);
- this.assert(isWeb3Provider, this.typeAssertionMessage(variableName, 'Web3.Provider', value));
+ assert.assert(isWeb3Provider, assert.typeAssertionMessage(variableName, 'Provider', value));
},
doesConformToSchema(variableName: string, value: any, schema: Schema, subSchemas?: Schema[]): void {
+ if (_.isUndefined(value)) {
+ throw new Error(`${variableName} can't be undefined`);
+ }
const schemaValidator = new SchemaValidator();
if (!_.isUndefined(subSchemas)) {
_.map(subSchemas, schemaValidator.addSchema.bind(schemaValidator));
@@ -73,15 +76,15 @@ export const assert = {
const msg = `Expected ${variableName} to conform to schema ${schema.id}
Encountered: ${JSON.stringify(value, null, '\t')}
Validation errors: ${validationResult.errors.join(', ')}`;
- this.assert(!hasValidationErrors, msg);
+ assert.assert(!hasValidationErrors, msg);
},
isWebUri(variableName: string, value: any): void {
const isValidUrl = !_.isUndefined(validUrl.isWebUri(value));
- this.assert(isValidUrl, this.typeAssertionMessage(variableName, 'web uri', value));
+ assert.assert(isValidUrl, assert.typeAssertionMessage(variableName, 'web uri', value));
},
isUri(variableName: string, value: any): void {
const isValidUri = !_.isUndefined(validUrl.isUri(value));
- this.assert(isValidUri, this.typeAssertionMessage(variableName, 'uri', value));
+ assert.assert(isValidUri, assert.typeAssertionMessage(variableName, 'uri', value));
},
assert(condition: boolean, message: string): void {
if (!condition) {
diff --git a/packages/assert/test/assert_test.ts b/packages/assert/test/assert_test.ts
index 1d9a34ed9..cbbfe39db 100644
--- a/packages/assert/test/assert_test.ts
+++ b/packages/assert/test/assert_test.ts
@@ -10,6 +10,7 @@ chai.config.includeStack = true;
chai.use(dirtyChai);
const expect = chai.expect;
+// tslint:disable:custom-no-magic-numbers
describe('Assertions', () => {
const variableName = 'variable';
describe('#isBigNumber', () => {
@@ -48,7 +49,7 @@ describe('Assertions', () => {
});
describe('#isFunction', () => {
it('should not throw for valid input', () => {
- const validInputs = [BigNumber, assert.isString];
+ const validInputs = [BigNumber, assert.isString.bind(assert)];
validInputs.forEach(input => expect(assert.isFunction.bind(assert, variableName, input)).to.not.throw());
});
it('should throw for invalid input', () => {
@@ -251,3 +252,4 @@ describe('Assertions', () => {
});
});
});
+// tslint:enable:custom-no-magic-numbers
diff --git a/packages/base-contract/CHANGELOG.json b/packages/base-contract/CHANGELOG.json
index 3147006ea..39e3cbe5e 100644
--- a/packages/base-contract/CHANGELOG.json
+++ b/packages/base-contract/CHANGELOG.json
@@ -1,13 +1,169 @@
[
{
+ "version": "2.0.0-rc.1",
+ "changes": [
+ {
+ "pr": 915,
+ "note": "Added strict encoding/decoding checks for sendTransaction and call"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.3.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.3.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.3.4",
+ "changes": [
+ {
+ "note":
+ "Update EthersJs to fix the `value.toLowerCase()` is not a function bug caused by `ethers.js` breaking patch version https://github.com/ethers-io/ethers.js/issues/201"
+ }
+ ],
+ "timestamp": 1529397769
+ },
+ {
+ "timestamp": 1527810075,
+ "version": "0.3.3",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008270,
+ "version": "0.3.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.3.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.3.0",
+ "changes": [
+ {
+ "note": "Update ethers-contracts to ethers.js",
+ "pr": 540
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.2.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.2.0",
+ "changes": [
+ {
+ "note": "Contract wrappers now accept Provider and defaults instead of Web3Wrapper",
+ "pr": 501
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "version": "0.1.0",
+ "changes": [
+ {
+ "note": "Add tests for traversing ABI tree",
+ "pr": 485
+ },
+ {
+ "note": "Fix ABI tuples traversing",
+ "pr": 485
+ },
+ {
+ "note": "Fix ABI arrays traversing",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
"timestamp": 1522658513,
"version": "0.0.6",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.0.2",
@@ -16,7 +172,6 @@
"note": "Initial release"
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
}
]
diff --git a/packages/base-contract/CHANGELOG.md b/packages/base-contract/CHANGELOG.md
index 9f582021a..002ad931b 100644
--- a/packages/base-contract/CHANGELOG.md
+++ b/packages/base-contract/CHANGELOG.md
@@ -1,14 +1,80 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v2.0.0-rc.1 - _August 13, 2018_
+
+ * Added strict encoding/decoding checks for sendTransaction and call (#915)
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.3.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.3.5 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.3.4 - _June 19, 2018_
+
+ * Update EthersJs to fix the `value.toLowerCase()` is not a function bug caused by `ethers.js` breaking patch version https://github.com/ethers-io/ethers.js/issues/201
+
+## v0.3.3 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.3.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.3.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.3.0 - _May 4, 2018_
+
+ * Update ethers-contracts to ethers.js (#540)
+
+## v0.2.1 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.2.0 - _April 11, 2018_
+
+ * Contract wrappers now accept Provider and defaults instead of Web3Wrapper (#501)
+
+## v0.1.0 - _April 2, 2018_
+
+ * Add tests for traversing ABI tree (#485)
+ * Fix ABI tuples traversing (#485)
+ * Fix ABI arrays traversing (#485)
+
## v0.0.6 - _April 2, 2018_
* Dependencies updated
-## v0.0.2 - _March 4, 2018_
+## v0.0.2 - _March 3, 2018_
* Initial release
diff --git a/packages/base-contract/README.md b/packages/base-contract/README.md
index a689d0130..4f2426c2e 100644
--- a/packages/base-contract/README.md
+++ b/packages/base-contract/README.md
@@ -44,14 +44,16 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=@0xproject/base-contract yarn build
```
-or
+Or continuously rebuild on change:
```bash
-yarn build:watch
+PKG=@0xproject/base-contract yarn watch
```
### Lint
diff --git a/packages/deployer/coverage/.gitkeep b/packages/base-contract/coverage/.gitkeep
index e69de29bb..e69de29bb 100644
--- a/packages/deployer/coverage/.gitkeep
+++ b/packages/base-contract/coverage/.gitkeep
diff --git a/packages/base-contract/package.json b/packages/base-contract/package.json
index 9de6c01b6..e658d9cfa 100644
--- a/packages/base-contract/package.json
+++ b/packages/base-contract/package.json
@@ -1,14 +1,23 @@
{
"name": "@0xproject/base-contract",
- "version": "0.0.6",
+ "version": "2.0.0-rc.1",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x Base TS contract",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "watch_without_deps": "tsc -w",
+ "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'src/**/*.ts'",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s clean build test",
+ "test:circleci": "yarn test:coverage",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "lint": "tslint --project . --exclude **/src/contract_wrappers/**/*",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"license": "Apache-2.0",
@@ -21,21 +30,25 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/base-contract/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
+ "chai": "^4.0.1",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/web3-wrapper": "^0.4.0",
- "ethers-contracts": "^2.2.1",
- "lodash": "^4.17.4"
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "ethereum-types": "^1.0.4",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
},
"publishConfig": {
"access": "public"
diff --git a/packages/base-contract/src/index.ts b/packages/base-contract/src/index.ts
index 961da8842..12f974445 100644
--- a/packages/base-contract/src/index.ts
+++ b/packages/base-contract/src/index.ts
@@ -1,67 +1,146 @@
-import { ContractAbi, DataItem, TxData, TxDataPayable } from '@0xproject/types';
+import { abiUtils, BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as ethersContracts from 'ethers-contracts';
+import {
+ AbiDefinition,
+ AbiType,
+ ConstructorAbi,
+ ContractAbi,
+ DataItem,
+ MethodAbi,
+ Provider,
+ TxData,
+ TxDataPayable,
+} from 'ethereum-types';
+import * as ethers from 'ethers';
import * as _ from 'lodash';
+import { formatABIDataItem } from './utils';
+
+export interface EthersInterfaceByFunctionSignature {
+ [key: string]: ethers.Interface;
+}
+
export class BaseContract {
- protected _ethersInterface: ethersContracts.Interface;
+ protected _ethersInterfacesByFunctionSignature: EthersInterfaceByFunctionSignature;
protected _web3Wrapper: Web3Wrapper;
public abi: ContractAbi;
public address: string;
- protected static _transformABIData(
+ public contractName: string;
+ public constructorArgs: any[] = [];
+ protected static _formatABIDataItemList(
abis: DataItem[],
values: any[],
- transformation: (type: string, value: any) => any,
+ formatter: (type: string, value: any) => any,
): any {
- return _.map(values, (value: any, i: number) =>
- BaseContract._transformTypedData(abis[i].type, value, transformation),
- );
+ return _.map(values, (value: any, i: number) => formatABIDataItem(abis[i], value, formatter));
}
protected static _lowercaseAddress(type: string, value: string): string {
return type === 'address' ? value.toLowerCase() : value;
}
- protected static _bigNumberToString(type: string, value: string): string {
- return _.isObject(value) && (value as any).isBigNumber ? value.toString() : value;
+ protected static _bigNumberToString(_type: string, value: any): any {
+ return _.isObject(value) && value.isBigNumber ? value.toString() : value;
}
- private static _transformTypedData(
- type: string,
- values: any,
- transformation: (type: string, value: any) => any,
- ): any {
- const trailingArrayRegex = /\[\d*\]$/;
- if (type.match(trailingArrayRegex)) {
- const arrayItemType = type.replace(trailingArrayRegex, '');
- return _.map(values, value => this._transformTypedData(arrayItemType, value, transformation));
+ protected static _lookupConstructorAbi(abi: ContractAbi): ConstructorAbi {
+ const constructorAbiIfExists = _.find(
+ abi,
+ (abiDefinition: AbiDefinition) => abiDefinition.type === AbiType.Constructor,
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ ) as ConstructorAbi | undefined;
+ if (!_.isUndefined(constructorAbiIfExists)) {
+ return constructorAbiIfExists;
} else {
- return transformation(type, values);
+ // If the constructor is not explicitly defined, it won't be included in the ABI. It is
+ // still callable however, so we construct what the ABI would look like were it to exist.
+ const defaultConstructorAbi: ConstructorAbi = {
+ type: AbiType.Constructor,
+ stateMutability: 'nonpayable',
+ payable: false,
+ inputs: [],
+ };
+ return defaultConstructorAbi;
}
}
- protected async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
+ protected static _bnToBigNumber(_type: string, value: any): any {
+ return _.isObject(value) && value._bn ? new BigNumber(value.toString()) : value;
+ }
+ protected static async _applyDefaultsToTxDataAsync<T extends Partial<TxData | TxDataPayable>>(
txData: T,
+ txDefaults: Partial<TxData>,
estimateGasAsync?: (txData: T) => Promise<number>,
): Promise<TxData> {
// Gas amount sourced with the following priorities:
// 1. Optional param passed in to public method call
// 2. Global config passed in at library instantiation
// 3. Gas estimate calculation + safety margin
- const removeUndefinedProperties = _.pickBy;
- const txDataWithDefaults = ({
- to: this.address,
- ...removeUndefinedProperties(this._web3Wrapper.getContractDefaults()),
- ...removeUndefinedProperties(txData as any),
- // HACK: TS can't prove that T is spreadable.
- // Awaiting https://github.com/Microsoft/TypeScript/pull/13288 to be merged
- } as any) as TxData;
+ const removeUndefinedProperties = _.pickBy.bind(_);
+ const txDataWithDefaults = {
+ ...removeUndefinedProperties(txDefaults),
+ ...removeUndefinedProperties(txData),
+ };
if (_.isUndefined(txDataWithDefaults.gas) && !_.isUndefined(estimateGasAsync)) {
- const estimatedGas = await estimateGasAsync(txData);
- txDataWithDefaults.gas = estimatedGas;
+ txDataWithDefaults.gas = await estimateGasAsync(txDataWithDefaults);
}
return txDataWithDefaults;
}
- constructor(web3Wrapper: Web3Wrapper, abi: ContractAbi, address: string) {
- this._web3Wrapper = web3Wrapper;
+ // Throws if the given arguments cannot be safely/correctly encoded based on
+ // the given inputAbi. An argument may not be considered safely encodeable
+ // if it overflows the corresponding Solidity type, there is a bug in the
+ // encoder, or the encoder performs unsafe type coercion.
+ public static strictArgumentEncodingCheck(inputAbi: DataItem[], args: any[]): void {
+ const coder = ethers.utils.AbiCoder.defaultCoder;
+ const params = abiUtils.parseEthersParams(inputAbi);
+ const rawEncoded = coder.encode(params.names, params.types, args);
+ const rawDecoded = coder.decode(params.names, params.types, rawEncoded);
+ for (let i = 0; i < rawDecoded.length; i++) {
+ const original = args[i];
+ const decoded = rawDecoded[i];
+ if (!abiUtils.isAbiDataEqual(params.names[i], params.types[i], original, decoded)) {
+ throw new Error(
+ `Cannot safely encode argument: ${params.names[i]} (${original}) of type ${
+ params.types[i]
+ }. (Possible type overflow or other encoding error)`,
+ );
+ }
+ }
+ }
+ protected _lookupEthersInterface(functionSignature: string): ethers.Interface {
+ const ethersInterface = this._ethersInterfacesByFunctionSignature[functionSignature];
+ if (_.isUndefined(ethersInterface)) {
+ throw new Error(`Failed to lookup method with function signature '${functionSignature}'`);
+ }
+ return ethersInterface;
+ }
+ protected _lookupAbi(functionSignature: string): MethodAbi {
+ const methodAbi = _.find(this.abi, (abiDefinition: AbiDefinition) => {
+ if (abiDefinition.type !== AbiType.Function) {
+ return false;
+ }
+ const abiFunctionSignature = abiUtils.getFunctionSignature(abiDefinition);
+ if (abiFunctionSignature === functionSignature) {
+ return true;
+ }
+ return false;
+ }) as MethodAbi;
+ return methodAbi;
+ }
+ constructor(
+ contractName: string,
+ abi: ContractAbi,
+ address: string,
+ provider: Provider,
+ txDefaults?: Partial<TxData>,
+ ) {
+ this.contractName = contractName;
+ this._web3Wrapper = new Web3Wrapper(provider, txDefaults);
this.abi = abi;
this.address = address;
- this._ethersInterface = new ethersContracts.Interface(abi);
+ const methodAbis = this.abi.filter(
+ (abiDefinition: AbiDefinition) => abiDefinition.type === AbiType.Function,
+ ) as MethodAbi[];
+ this._ethersInterfacesByFunctionSignature = {};
+ _.each(methodAbis, methodAbi => {
+ const functionSignature = abiUtils.getFunctionSignature(methodAbi);
+ this._ethersInterfacesByFunctionSignature[functionSignature] = new ethers.Interface([methodAbi]);
+ });
}
}
diff --git a/packages/base-contract/src/utils.ts b/packages/base-contract/src/utils.ts
new file mode 100644
index 000000000..61f176df5
--- /dev/null
+++ b/packages/base-contract/src/utils.ts
@@ -0,0 +1,25 @@
+import { DataItem } from 'ethereum-types';
+import * as _ from 'lodash';
+
+// tslint:disable-next-line:completed-docs
+export function formatABIDataItem(abi: DataItem, value: any, formatter: (type: string, value: any) => any): any {
+ const trailingArrayRegex = /\[\d*\]$/;
+ if (abi.type.match(trailingArrayRegex)) {
+ const arrayItemType = abi.type.replace(trailingArrayRegex, '');
+ return _.map(value, val => {
+ const arrayItemAbi = {
+ ...abi,
+ type: arrayItemType,
+ };
+ return formatABIDataItem(arrayItemAbi, val, formatter);
+ });
+ } else if (abi.type === 'tuple') {
+ const formattedTuple: { [componentName: string]: DataItem } = {};
+ _.forEach(abi.components, componentABI => {
+ formattedTuple[componentABI.name] = formatABIDataItem(componentABI, value[componentABI.name], formatter);
+ });
+ return formattedTuple;
+ } else {
+ return formatter(abi.type, value);
+ }
+}
diff --git a/packages/base-contract/test/base_contract_test.ts b/packages/base-contract/test/base_contract_test.ts
new file mode 100644
index 000000000..2c31d1f11
--- /dev/null
+++ b/packages/base-contract/test/base_contract_test.ts
@@ -0,0 +1,114 @@
+import * as chai from 'chai';
+import 'mocha';
+
+import { BaseContract } from '../src';
+
+const { expect } = chai;
+
+describe('BaseContract', () => {
+ describe('strictArgumentEncodingCheck', () => {
+ it('works for simple types', () => {
+ BaseContract.strictArgumentEncodingCheck(
+ [{ name: 'to', type: 'address' }],
+ ['0xe834ec434daba538cd1b9fe1582052b880bd7e63'],
+ );
+ });
+ it('works for array types', () => {
+ const inputAbi = [
+ {
+ name: 'takerAssetFillAmounts',
+ type: 'uint256[]',
+ },
+ ];
+ const args = [
+ ['9000000000000000000', '79000000000000000000', '979000000000000000000', '7979000000000000000000'],
+ ];
+ BaseContract.strictArgumentEncodingCheck(inputAbi, args);
+ });
+ it('works for tuple/struct types', () => {
+ const inputAbi = [
+ {
+ 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',
+ },
+ ];
+ const args = [
+ {
+ makerAddress: '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb',
+ takerAddress: '0x0000000000000000000000000000000000000000',
+ feeRecipientAddress: '0xe834ec434daba538cd1b9fe1582052b880bd7e63',
+ senderAddress: '0x0000000000000000000000000000000000000000',
+ makerAssetAmount: '0',
+ takerAssetAmount: '200000000000000000000',
+ makerFee: '1000000000000000000',
+ takerFee: '1000000000000000000',
+ expirationTimeSeconds: '1532563026',
+ salt: '59342956082154660870994022243365949771115859664887449740907298019908621891376',
+ makerAssetData: '0xf47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48',
+ takerAssetData: '0xf47261b00000000000000000000000001d7022f5b17d2f8b695918fb48fa1089c9f85401',
+ },
+ ];
+ BaseContract.strictArgumentEncodingCheck(inputAbi, args);
+ });
+ it('throws for integer overflows', () => {
+ expect(() =>
+ BaseContract.strictArgumentEncodingCheck([{ name: 'amount', type: 'uint8' }], ['256']),
+ ).to.throw();
+ });
+ it('throws for fixed byte array overflows', () => {
+ expect(() =>
+ BaseContract.strictArgumentEncodingCheck([{ name: 'hash', type: 'bytes8' }], ['0x001122334455667788']),
+ ).to.throw();
+ });
+ });
+});
diff --git a/packages/base-contract/test/utils_test.ts b/packages/base-contract/test/utils_test.ts
new file mode 100644
index 000000000..c083704f4
--- /dev/null
+++ b/packages/base-contract/test/utils_test.ts
@@ -0,0 +1,108 @@
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import 'mocha';
+
+import { formatABIDataItem } from '../src/utils';
+
+const { expect } = chai;
+
+describe('Utils tests', () => {
+ describe('#formatABIDataItem', () => {
+ it('correctly handles arrays', () => {
+ const calls: Array<{ type: string; value: any }> = [];
+ const abi = {
+ name: 'values',
+ type: 'uint256[]',
+ };
+ const val = [1, 2, 3];
+ const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
+ calls.push({ type, value });
+ return value; // no-op
+ });
+ expect(formatted).to.be.deep.equal(val);
+ expect(calls).to.be.deep.equal([
+ { type: 'uint256', value: 1 },
+ { type: 'uint256', value: 2 },
+ { type: 'uint256', value: 3 },
+ ]);
+ });
+ it('correctly handles tuples', () => {
+ const calls: Array<{ type: string; value: any }> = [];
+ const abi = {
+ components: [
+ {
+ name: 'to',
+ type: 'address',
+ },
+ {
+ name: 'amount',
+ type: 'uint256',
+ },
+ ],
+ name: 'data',
+ type: 'tuple',
+ };
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
+ const val = { to: ZERO_ADDRESS, amount: new BigNumber(1) };
+ const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
+ calls.push({ type, value });
+ return value; // no-op
+ });
+ expect(formatted).to.be.deep.equal(val);
+ expect(calls).to.be.deep.equal([
+ {
+ type: 'address',
+ value: val.to,
+ },
+ {
+ type: 'uint256',
+ value: val.amount,
+ },
+ ]);
+ });
+ it('correctly handles nested arrays of tuples', () => {
+ const calls: Array<{ type: string; value: any }> = [];
+ const abi = {
+ components: [
+ {
+ name: 'to',
+ type: 'address',
+ },
+ {
+ name: 'amount',
+ type: 'uint256',
+ },
+ ],
+ name: 'data',
+ type: 'tuple[2][]',
+ };
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
+ const val = [
+ [{ to: ZERO_ADDRESS, amount: new BigNumber(1) }, { to: ZERO_ADDRESS, amount: new BigNumber(2) }],
+ ];
+ const formatted = formatABIDataItem(abi, val, (type: string, value: any) => {
+ calls.push({ type, value });
+ return value; // no-op
+ });
+ expect(formatted).to.be.deep.equal(val);
+ expect(calls).to.be.deep.equal([
+ {
+ type: 'address',
+ value: val[0][0].to,
+ },
+ {
+ type: 'uint256',
+ value: val[0][0].amount,
+ },
+ {
+ type: 'address',
+ value: val[0][1].to,
+ },
+ {
+ type: 'uint256',
+ value: val[0][1].amount,
+ },
+ ]);
+ });
+ });
+});
diff --git a/packages/base-contract/tsconfig.json b/packages/base-contract/tsconfig.json
index c56d255d5..8b4cd47a2 100644
--- a/packages/base-contract/tsconfig.json
+++ b/packages/base-contract/tsconfig.json
@@ -3,5 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": ["./src/**/*"]
+ "include": ["src/**/*", "test/**/*"]
}
diff --git a/packages/connect/CHANGELOG.json b/packages/connect/CHANGELOG.json
index 7ef29bddd..8d6feaa2e 100644
--- a/packages/connect/CHANGELOG.json
+++ b/packages/connect/CHANGELOG.json
@@ -1,13 +1,157 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note":
+ "Remove `WebSocketOrderbookChannel` from the public interface and replace with `orderbookChannelFactory`"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.6.17",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.6.16",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.6.15",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.6.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008270,
+ "version": "0.6.13",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.6.12",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.6.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.6.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.6.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.6.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.6.7",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.6.4",
@@ -17,8 +161,7 @@
"pr": 456
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.6.2",
@@ -28,8 +171,7 @@
"pr": 407
}
],
- "timestamp": 1518706800,
- "isPublished": true
+ "timestamp": 1518706800
},
{
"version": "0.6.0",
@@ -43,8 +185,7 @@
"pr": 406
}
],
- "timestamp": 1518706800,
- "isPublished": true
+ "timestamp": 1518706800
},
{
"version": "0.5.7",
@@ -54,8 +195,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.5.0",
@@ -73,8 +213,7 @@
"pr": 318
}
],
- "timestamp": 1516114800,
- "isPublished": true
+ "timestamp": 1516114800
},
{
"version": "0.4.0",
@@ -84,8 +223,7 @@
"pr": 296
}
],
- "timestamp": 1515596400,
- "isPublished": true
+ "timestamp": 1515596400
},
{
"version": "0.3.0",
@@ -99,8 +237,7 @@
"pr": 256
}
],
- "timestamp": 1512658800,
- "isPublished": true
+ "timestamp": 1512658800
},
{
"version": "0.2.0",
@@ -115,8 +252,7 @@
"note": "Remove dependency on 0x.js"
}
],
- "timestamp": 1511881200,
- "isPublished": true
+ "timestamp": 1511881200
},
{
"version": "0.1.0",
@@ -125,7 +261,6 @@
"note": "Provide a HttpClient class for interacting with standard relayer api compliant HTTP urls"
}
],
- "timestamp": 1511276400,
- "isPublished": true
+ "timestamp": 1511276400
}
]
diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md
index d0ba28963..f9d84ff9c 100644
--- a/packages/connect/CHANGELOG.md
+++ b/packages/connect/CHANGELOG.md
@@ -1,52 +1,116 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Remove `WebSocketOrderbookChannel` from the public interface and replace with `orderbookChannelFactory`
+
+## v0.6.17 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.6.16 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.6.15 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.6.14 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.6.13 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.6.12 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.11 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.10 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.6.9 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.6.8 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.6.7 - _April 2, 2018_
* Dependencies updated
-## v0.6.4 - _March 18, 2018_
+## v0.6.4 - _March 17, 2018_
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
-## v0.6.2 - _February 16, 2018_
+## v0.6.2 - _February 15, 2018_
* Fix JSON parse empty response (#407)
-## v0.6.0 - _February 16, 2018_
+## v0.6.0 - _February 15, 2018_
* Add pagination options to HttpClient methods (#393)
* Add heartbeat configuration to WebSocketOrderbookChannel constructor (#406)
-## v0.5.7 - _February 9, 2018_
+## v0.5.7 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.5.0 - _January 17, 2018_
+## v0.5.0 - _January 16, 2018_
* Sanitize api endpoint url and remove trailing slashes (#318)
* Improve error message text in HttpClient (#318)
* Stop appending '/v0' to api endpoint url in HttpClient (#318)
-## v0.4.0 - _January 11, 2018_
+## v0.4.0 - _January 10, 2018_
* Prevent getFeesAsync method on HttpClient from mutating input (#296)
-## v0.3.0 - _December 8, 2017_
+## v0.3.0 - _December 7, 2017_
* Expose WebSocketOrderbookChannel and associated types to public interface (#251)
* Remove tokenA and tokenB fields from OrdersRequest (#256)
-## v0.2.0 - _November 29, 2017_
+## v0.2.0 - _November 28, 2017_
* Add SignedOrder and TokenTradeInfo to the public interface
* Add ECSignature and Order to the public interface
* Remove dependency on 0x.js
-## v0.1.0 - _November 22, 2017_
+## v0.1.0 - _November 21, 2017_
* Provide a HttpClient class for interacting with standard relayer api compliant HTTP urls
diff --git a/packages/connect/README.md b/packages/connect/README.md
index 7087214d6..9d8cb9215 100644
--- a/packages/connect/README.md
+++ b/packages/connect/README.md
@@ -23,11 +23,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -43,8 +43,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/connect yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/connect yarn watch
+```
+
+### Clean
+
```bash
-yarn build
+yarn clean
```
### Lint
diff --git a/packages/connect/package.json b/packages/connect/package.json
index 5d0c7ee27..1cc5e1bab 100644
--- a/packages/connect/package.json
+++ b/packages/connect/package.json
@@ -1,6 +1,9 @@
{
"name": "@0xproject/connect",
- "version": "0.6.7",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "A javascript library for interacting with the standard relayer api",
"keywords": [
"connect",
@@ -12,18 +15,19 @@
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib test_temp scripts",
"copy_test_fixtures": "copyfiles -u 2 './test/fixtures/**/*.json' ./lib/test/fixtures",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "run_mocha": "mocha lib/test/**/*_test.js",
- "test": "run-s clean build copy_test_fixtures run_mocha",
+ "lint": "tslint --project .",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
+ "test": "run-s copy_test_fixtures run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"test:circleci": "yarn test:coverage",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
@@ -42,45 +46,44 @@
},
"author": "Brandon Millman",
"license": "Apache-2.0",
- "engines": {
- "node": ">=6.0.0"
- },
"bugs": {
"url": "https://github.com/0xProject/0x-monorepo/issues"
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/connect/README.md",
"dependencies": {
- "@0xproject/assert": "^0.2.4",
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "isomorphic-fetch": "^2.2.1",
- "lodash": "^4.17.4",
+ "@0xproject/assert": "^0.2.14",
+ "@0xproject/json-schemas": "^0.8.3",
+ "@0xproject/types": "^0.8.2",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "lodash": "^4.17.5",
"query-string": "^5.0.1",
+ "sinon": "^4.0.0",
"websocket": "^1.0.25"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/fetch-mock": "^5.12.1",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/fetch-mock": "^5.12.2",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/query-string": "^5.0.1",
- "@types/websocket": "^0.0.34",
+ "@types/sinon": "^2.2.2",
+ "@types/websocket": "^0.0.39",
"async-child-process": "^1.1.1",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"fetch-mock": "^5.13.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "~0.8.0",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/connect/src/globals.d.ts b/packages/connect/src/globals.d.ts
index cb71dcdd1..783b92913 100644
--- a/packages/connect/src/globals.d.ts
+++ b/packages/connect/src/globals.d.ts
@@ -1,6 +1,3 @@
-declare module 'async-child-process';
-declare module 'dirty-chai';
-
declare module '*.json' {
const value: any;
export default value;
diff --git a/packages/connect/src/http_client.ts b/packages/connect/src/http_client.ts
index 5806f1d43..03cc590e4 100644
--- a/packages/connect/src/http_client.ts
+++ b/packages/connect/src/http_client.ts
@@ -1,7 +1,7 @@
import { assert } from '@0xproject/assert';
import { schemas } from '@0xproject/json-schemas';
import { SignedOrder } from '@0xproject/types';
-import 'isomorphic-fetch';
+import { fetchAsync } from '@0xproject/utils';
import * as _ from 'lodash';
import * as queryString from 'query-string';
@@ -38,7 +38,7 @@ const OPTS_TO_QUERY_FIELD_MAP = {
* that implement the standard relayer API v0
*/
export class HttpClient implements Client {
- private _apiEndpointUrl: string;
+ private readonly _apiEndpointUrl: string;
/**
* Format parameters to be appended to http requests into query string form
*/
@@ -48,7 +48,7 @@ export class HttpClient implements Client {
return '';
}
// format params into a form the api expects
- const formattedParams = _.mapKeys(params, (value: any, key: string) => {
+ const formattedParams = _.mapKeys(params, (_value: any, key: string) => {
return _.get(OPTS_TO_QUERY_FIELD_MAP, key, key);
});
// stringify the formatted object
@@ -167,7 +167,7 @@ export class HttpClient implements Client {
const headers = new Headers({
'content-type': 'application/json',
});
- const response = await fetch(url, {
+ const response = await fetchAsync(url, {
method: requestType,
body: JSON.stringify(payload),
headers,
diff --git a/packages/connect/src/index.ts b/packages/connect/src/index.ts
index 135b5b5f6..7f5eb8ed3 100644
--- a/packages/connect/src/index.ts
+++ b/packages/connect/src/index.ts
@@ -1,5 +1,5 @@
export { HttpClient } from './http_client';
-export { WebSocketOrderbookChannel } from './ws_orderbook_channel';
+export { orderbookChannelFactory } from './orderbook_channel_factory';
export {
Client,
FeesRequest,
@@ -14,7 +14,6 @@ export {
TokenPairsItem,
TokenPairsRequestOpts,
TokenTradeInfo,
- WebSocketOrderbookChannelConfig,
} from './types';
-export { ECSignature, Order, SignedOrder } from '@0xproject/types';
+export { Order, SignedOrder } from '@0xproject/types';
diff --git a/packages/connect/src/orderbook_channel_factory.ts b/packages/connect/src/orderbook_channel_factory.ts
new file mode 100644
index 000000000..5134af323
--- /dev/null
+++ b/packages/connect/src/orderbook_channel_factory.ts
@@ -0,0 +1,32 @@
+import * as WebSocket from 'websocket';
+
+import { OrderbookChannel, OrderbookChannelHandler } from './types';
+import { assert } from './utils/assert';
+import { WebSocketOrderbookChannel } from './ws_orderbook_channel';
+
+export const orderbookChannelFactory = {
+ /**
+ * Instantiates a new WebSocketOrderbookChannel instance
+ * @param url The relayer API base WS url you would like to interact with
+ * @param handler An OrderbookChannelHandler instance that responds to various
+ * channel updates
+ * @return An OrderbookChannel Promise
+ */
+ async createWebSocketOrderbookChannelAsync(
+ url: string,
+ handler: OrderbookChannelHandler,
+ ): Promise<OrderbookChannel> {
+ assert.isUri('url', url);
+ assert.isOrderbookChannelHandler('handler', handler);
+ return new Promise<OrderbookChannel>((resolve, reject) => {
+ const client = new WebSocket.w3cwebsocket(url);
+ client.onopen = () => {
+ const orderbookChannel = new WebSocketOrderbookChannel(client, handler);
+ resolve(orderbookChannel);
+ };
+ client.onerror = err => {
+ reject(err);
+ };
+ });
+ },
+};
diff --git a/packages/connect/src/schemas/schemas.ts b/packages/connect/src/schemas/schemas.ts
index b9a8472fb..0b8b798a9 100644
--- a/packages/connect/src/schemas/schemas.ts
+++ b/packages/connect/src/schemas/schemas.ts
@@ -3,7 +3,6 @@ import { orderBookRequestSchema } from './orderbook_request_schema';
import { ordersRequestOptsSchema } from './orders_request_opts_schema';
import { pagedRequestOptsSchema } from './paged_request_opts_schema';
import { tokenPairsRequestOptsSchema } from './token_pairs_request_opts_schema';
-import { webSocketOrderbookChannelConfigSchema } from './websocket_orderbook_channel_config_schema';
export const schemas = {
feesRequestSchema,
@@ -11,5 +10,4 @@ export const schemas = {
ordersRequestOptsSchema,
pagedRequestOptsSchema,
tokenPairsRequestOptsSchema,
- webSocketOrderbookChannelConfigSchema,
};
diff --git a/packages/connect/src/schemas/websocket_orderbook_channel_config_schema.ts b/packages/connect/src/schemas/websocket_orderbook_channel_config_schema.ts
deleted file mode 100644
index 81c0cac9c..000000000
--- a/packages/connect/src/schemas/websocket_orderbook_channel_config_schema.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const webSocketOrderbookChannelConfigSchema = {
- id: '/WebSocketOrderbookChannelConfig',
- type: 'object',
- properties: {
- heartbeatIntervalMs: {
- type: 'number',
- minimum: 10,
- },
- },
-};
diff --git a/packages/connect/src/types.ts b/packages/connect/src/types.ts
index 5c344e328..fc7a4b24d 100644
--- a/packages/connect/src/types.ts
+++ b/packages/connect/src/types.ts
@@ -1,4 +1,4 @@
-import { ECSignature, Order, SignedOrder } from '@0xproject/types';
+import { SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
export interface Client {
@@ -11,18 +11,11 @@ export interface Client {
}
export interface OrderbookChannel {
- subscribe: (subscriptionOpts: OrderbookChannelSubscriptionOpts, handler: OrderbookChannelHandler) => void;
+ subscribe: (subscriptionOpts: OrderbookChannelSubscriptionOpts) => void;
close: () => void;
}
-/*
- * heartbeatInterval: Interval in milliseconds that the orderbook channel should ping the underlying websocket. Default: 15000
- */
-export interface WebSocketOrderbookChannelConfig {
- heartbeatIntervalMs?: number;
-}
-
-/*
+/**
* baseTokenAddress: The address of token designated as the baseToken in the currency pair calculation of price
* quoteTokenAddress: The address of token designated as the quoteToken in the currency pair calculation of price
* snapshot: If true, a snapshot of the orderbook will be sent before the updates to the orderbook
@@ -46,8 +39,8 @@ export interface OrderbookChannelHandler {
subscriptionOpts: OrderbookChannelSubscriptionOpts,
order: SignedOrder,
) => void;
- onError: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts, err: Error) => void;
- onClose: (channel: OrderbookChannel, subscriptionOpts: OrderbookChannelSubscriptionOpts) => void;
+ onError: (channel: OrderbookChannel, err: Error, subscriptionOpts?: OrderbookChannelSubscriptionOpts) => void;
+ onClose: (channel: OrderbookChannel) => void;
}
export type OrderbookChannelMessage =
diff --git a/packages/connect/src/utils/assert.ts b/packages/connect/src/utils/assert.ts
new file mode 100644
index 000000000..a0fd12fbd
--- /dev/null
+++ b/packages/connect/src/utils/assert.ts
@@ -0,0 +1,26 @@
+import { assert as sharedAssert } from '@0xproject/assert';
+// HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here
+// tslint:disable-next-line:no-unused-variable
+import { Schema, schemas } from '@0xproject/json-schemas';
+// tslint:disable-next-line:no-unused-variable
+import { ECSignature } from '@0xproject/types';
+// tslint:disable-next-line:no-unused-variable
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+export const assert = {
+ ...sharedAssert,
+ isOrderbookChannelSubscriptionOpts(variableName: string, subscriptionOpts: any): void {
+ sharedAssert.doesConformToSchema(
+ variableName,
+ subscriptionOpts,
+ schemas.relayerApiOrderbookChannelSubscribePayload,
+ );
+ },
+ isOrderbookChannelHandler(variableName: string, handler: any): void {
+ sharedAssert.isFunction(`${variableName}.onSnapshot`, _.get(handler, 'onSnapshot'));
+ sharedAssert.isFunction(`${variableName}.onUpdate`, _.get(handler, 'onUpdate'));
+ sharedAssert.isFunction(`${variableName}.onError`, _.get(handler, 'onError'));
+ sharedAssert.isFunction(`${variableName}.onClose`, _.get(handler, 'onClose'));
+ },
+};
diff --git a/packages/connect/src/utils/orderbook_channel_message_parser.ts b/packages/connect/src/utils/orderbook_channel_message_parser.ts
index 9a9ca8901..593288078 100644
--- a/packages/connect/src/utils/orderbook_channel_message_parser.ts
+++ b/packages/connect/src/utils/orderbook_channel_message_parser.ts
@@ -8,10 +8,16 @@ import { relayerResponseJsonParsers } from './relayer_response_json_parsers';
export const orderbookChannelMessageParser = {
parse(utf8Data: string): OrderbookChannelMessage {
+ // parse the message
const messageObj = JSON.parse(utf8Data);
+ // ensure we have a type parameter to switch on
const type: string = _.get(messageObj, 'type');
assert.assert(!_.isUndefined(type), `Message is missing a type parameter: ${utf8Data}`);
assert.isString('type', type);
+ // ensure we have a request id for the resulting message
+ const requestId: number = _.get(messageObj, 'requestId');
+ assert.assert(!_.isUndefined(requestId), `Message is missing a requestId parameter: ${utf8Data}`);
+ assert.isNumber('requestId', requestId);
switch (type) {
case OrderbookChannelMessageTypes.Snapshot: {
assert.doesConformToSchema('message', messageObj, schemas.relayerApiOrderbookChannelSnapshotSchema);
@@ -28,7 +34,7 @@ export const orderbookChannelMessageParser = {
default: {
return {
type: OrderbookChannelMessageTypes.Unknown,
- requestId: 0,
+ requestId,
payload: undefined,
};
}
diff --git a/packages/connect/src/utils/relayer_response_json_parsers.ts b/packages/connect/src/utils/relayer_response_json_parsers.ts
index cf1c07bd9..ccae8b115 100644
--- a/packages/connect/src/utils/relayer_response_json_parsers.ts
+++ b/packages/connect/src/utils/relayer_response_json_parsers.ts
@@ -1,7 +1,6 @@
import { assert } from '@0xproject/assert';
import { schemas } from '@0xproject/json-schemas';
import { SignedOrder } from '@0xproject/types';
-import * as _ from 'lodash';
import { FeesResponse, OrderbookResponse, TokenPairsItem } from '../types';
diff --git a/packages/connect/src/utils/type_converters.ts b/packages/connect/src/utils/type_converters.ts
index c1808ce8a..210d452b9 100644
--- a/packages/connect/src/utils/type_converters.ts
+++ b/packages/connect/src/utils/type_converters.ts
@@ -6,12 +6,12 @@ export const typeConverters = {
const bids = _.get(orderbook, 'bids', []);
const asks = _.get(orderbook, 'asks', []);
return {
- bids: bids.map((order: any) => this.convertOrderStringFieldsToBigNumber(order)),
- asks: asks.map((order: any) => this.convertOrderStringFieldsToBigNumber(order)),
+ bids: bids.map((order: any) => typeConverters.convertOrderStringFieldsToBigNumber(order)),
+ asks: asks.map((order: any) => typeConverters.convertOrderStringFieldsToBigNumber(order)),
};
},
convertOrderStringFieldsToBigNumber(order: any): any {
- return this.convertStringsFieldsToBigNumbers(order, [
+ return typeConverters.convertStringsFieldsToBigNumbers(order, [
'makerTokenAmount',
'takerTokenAmount',
'makerFee',
diff --git a/packages/connect/src/ws_orderbook_channel.ts b/packages/connect/src/ws_orderbook_channel.ts
index 5aa730d8f..fa9f5e37f 100644
--- a/packages/connect/src/ws_orderbook_channel.ts
+++ b/packages/connect/src/ws_orderbook_channel.ts
@@ -1,166 +1,105 @@
-import { assert } from '@0xproject/assert';
-import { schemas } from '@0xproject/json-schemas';
import * as _ from 'lodash';
import * as WebSocket from 'websocket';
-import { schemas as clientSchemas } from './schemas/schemas';
import {
OrderbookChannel,
OrderbookChannelHandler,
OrderbookChannelMessageTypes,
OrderbookChannelSubscriptionOpts,
- WebsocketClientEventType,
- WebsocketConnectionEventType,
- WebSocketOrderbookChannelConfig,
} from './types';
+import { assert } from './utils/assert';
import { orderbookChannelMessageParser } from './utils/orderbook_channel_message_parser';
-const DEFAULT_HEARTBEAT_INTERVAL_MS = 15000;
-const MINIMUM_HEARTBEAT_INTERVAL_MS = 10;
-
/**
* This class includes all the functionality related to interacting with a websocket endpoint
* that implements the standard relayer API v0
*/
export class WebSocketOrderbookChannel implements OrderbookChannel {
- private _apiEndpointUrl: string;
- private _client: WebSocket.client;
- private _connectionIfExists?: WebSocket.connection;
- private _heartbeatTimerIfExists?: NodeJS.Timer;
- private _subscriptionCounter = 0;
- private _heartbeatIntervalMs: number;
+ private readonly _client: WebSocket.w3cwebsocket;
+ private readonly _handler: OrderbookChannelHandler;
+ private readonly _subscriptionOptsList: OrderbookChannelSubscriptionOpts[] = [];
/**
* Instantiates a new WebSocketOrderbookChannel instance
- * @param url The relayer API base WS url you would like to interact with
- * @param config The configuration object. Look up the type for the description.
+ * @param client A WebSocket client
+ * @param handler An OrderbookChannelHandler instance that responds to various
+ * channel updates
* @return An instance of WebSocketOrderbookChannel
*/
- constructor(url: string, config?: WebSocketOrderbookChannelConfig) {
- assert.isUri('url', url);
- if (!_.isUndefined(config)) {
- assert.doesConformToSchema('config', config, clientSchemas.webSocketOrderbookChannelConfigSchema);
- }
- this._apiEndpointUrl = url;
- this._heartbeatIntervalMs =
- _.isUndefined(config) || _.isUndefined(config.heartbeatIntervalMs)
- ? DEFAULT_HEARTBEAT_INTERVAL_MS
- : config.heartbeatIntervalMs;
- this._client = new WebSocket.client();
+ constructor(client: WebSocket.w3cwebsocket, handler: OrderbookChannelHandler) {
+ assert.isOrderbookChannelHandler('handler', handler);
+ // set private members
+ this._client = client;
+ this._handler = handler;
+ // attach client callbacks
+ this._client.onerror = err => {
+ this._handler.onError(this, err);
+ };
+ this._client.onclose = () => {
+ this._handler.onClose(this);
+ };
+ this._client.onmessage = message => {
+ this._handleWebSocketMessage(message);
+ };
}
/**
* Subscribe to orderbook snapshots and updates from the websocket
* @param subscriptionOpts An OrderbookChannelSubscriptionOpts instance describing which
* token pair to subscribe to
- * @param handler An OrderbookChannelHandler instance that responds to various
- * channel updates
*/
- public subscribe(subscriptionOpts: OrderbookChannelSubscriptionOpts, handler: OrderbookChannelHandler): void {
- assert.doesConformToSchema(
- 'subscriptionOpts',
- subscriptionOpts,
- schemas.relayerApiOrderbookChannelSubscribePayload,
- );
- assert.isFunction('handler.onSnapshot', _.get(handler, 'onSnapshot'));
- assert.isFunction('handler.onUpdate', _.get(handler, 'onUpdate'));
- assert.isFunction('handler.onError', _.get(handler, 'onError'));
- assert.isFunction('handler.onClose', _.get(handler, 'onClose'));
- this._subscriptionCounter += 1;
+ public subscribe(subscriptionOpts: OrderbookChannelSubscriptionOpts): void {
+ assert.isOrderbookChannelSubscriptionOpts('subscriptionOpts', subscriptionOpts);
+ assert.assert(this._client.readyState === WebSocket.w3cwebsocket.OPEN, 'WebSocket connection is closed');
+ this._subscriptionOptsList.push(subscriptionOpts);
+ // TODO: update requestId management to use UUIDs for v2
const subscribeMessage = {
type: 'subscribe',
channel: 'orderbook',
- requestId: this._subscriptionCounter,
+ requestId: this._subscriptionOptsList.length - 1,
payload: subscriptionOpts,
};
- this._getConnection((error, connection) => {
- if (!_.isUndefined(error)) {
- handler.onError(this, subscriptionOpts, error);
- } else if (!_.isUndefined(connection) && connection.connected) {
- connection.on(WebsocketConnectionEventType.Error, wsError => {
- handler.onError(this, subscriptionOpts, wsError);
- });
- connection.on(WebsocketConnectionEventType.Close, (code: number, desc: string) => {
- handler.onClose(this, subscriptionOpts);
- });
- connection.on(WebsocketConnectionEventType.Message, message => {
- this._handleWebSocketMessage(subscribeMessage.requestId, subscriptionOpts, message, handler);
- });
- connection.sendUTF(JSON.stringify(subscribeMessage));
- }
- });
+ this._client.send(JSON.stringify(subscribeMessage));
}
/**
* Close the websocket and stop receiving updates
*/
- public close() {
- if (!_.isUndefined(this._connectionIfExists)) {
- this._connectionIfExists.close();
- }
- if (!_.isUndefined(this._heartbeatTimerIfExists)) {
- clearInterval(this._heartbeatTimerIfExists);
- }
+ public close(): void {
+ this._client.close();
}
- private _getConnection(callback: (error?: Error, connection?: WebSocket.connection) => void) {
- if (!_.isUndefined(this._connectionIfExists) && this._connectionIfExists.connected) {
- callback(undefined, this._connectionIfExists);
- } else {
- this._client.on(WebsocketClientEventType.Connect, connection => {
- this._connectionIfExists = connection;
- if (this._heartbeatIntervalMs >= MINIMUM_HEARTBEAT_INTERVAL_MS) {
- this._heartbeatTimerIfExists = setInterval(() => {
- connection.ping('');
- }, this._heartbeatIntervalMs);
- } else {
- callback(
- new Error(
- `Heartbeat interval is ${
- this._heartbeatIntervalMs
- }ms which is less than the required minimum of ${MINIMUM_HEARTBEAT_INTERVAL_MS}ms`,
- ),
- undefined,
- );
- }
- callback(undefined, this._connectionIfExists);
- });
- this._client.on(WebsocketClientEventType.ConnectFailed, error => {
- callback(error, undefined);
- });
- this._client.connect(this._apiEndpointUrl);
+ private _handleWebSocketMessage(message: any): void {
+ if (_.isUndefined(message.data)) {
+ this._handler.onError(this, new Error(`Message does not contain data. Url: ${this._client.url}`));
+ return;
}
- }
- private _handleWebSocketMessage(
- requestId: number,
- subscriptionOpts: OrderbookChannelSubscriptionOpts,
- message: WebSocket.IMessage,
- handler: OrderbookChannelHandler,
- ): void {
- if (!_.isUndefined(message.utf8Data)) {
- try {
- const utf8Data = message.utf8Data;
- const parserResult = orderbookChannelMessageParser.parse(utf8Data);
- if (parserResult.requestId === requestId) {
- switch (parserResult.type) {
- case OrderbookChannelMessageTypes.Snapshot: {
- handler.onSnapshot(this, subscriptionOpts, parserResult.payload);
- break;
- }
- case OrderbookChannelMessageTypes.Update: {
- handler.onUpdate(this, subscriptionOpts, parserResult.payload);
- break;
- }
- default: {
- handler.onError(
- this,
- subscriptionOpts,
- new Error(`Message has missing a type parameter: ${utf8Data}`),
- );
- }
- }
+ try {
+ const data = message.data;
+ const parserResult = orderbookChannelMessageParser.parse(data);
+ const subscriptionOpts = this._subscriptionOptsList[parserResult.requestId];
+ if (_.isUndefined(subscriptionOpts)) {
+ this._handler.onError(
+ this,
+ new Error(`Message has unknown requestId. Url: ${this._client.url} Message: ${data}`),
+ );
+ return;
+ }
+ switch (parserResult.type) {
+ case OrderbookChannelMessageTypes.Snapshot: {
+ this._handler.onSnapshot(this, subscriptionOpts, parserResult.payload);
+ break;
+ }
+ case OrderbookChannelMessageTypes.Update: {
+ this._handler.onUpdate(this, subscriptionOpts, parserResult.payload);
+ break;
+ }
+ default: {
+ this._handler.onError(
+ this,
+ new Error(`Message has unknown type parameter. Url: ${this._client.url} Message: ${data}`),
+ subscriptionOpts,
+ );
}
- } catch (error) {
- handler.onError(this, subscriptionOpts, error);
}
- } else {
- handler.onError(this, subscriptionOpts, new Error(`Message does not contain utf8Data`));
+ } catch (error) {
+ this._handler.onError(this, error);
}
}
}
diff --git a/packages/connect/test/orderbook_channel_factory_test.ts b/packages/connect/test/orderbook_channel_factory_test.ts
new file mode 100644
index 000000000..2ce361bd2
--- /dev/null
+++ b/packages/connect/test/orderbook_channel_factory_test.ts
@@ -0,0 +1,45 @@
+import * as chai from 'chai';
+import * as dirtyChai from 'dirty-chai';
+import * as _ from 'lodash';
+import 'mocha';
+
+import { orderbookChannelFactory } from '../src/orderbook_channel_factory';
+
+chai.config.includeStack = true;
+chai.use(dirtyChai);
+const expect = chai.expect;
+const emptyOrderbookChannelHandler = {
+ onSnapshot: () => {
+ _.noop();
+ },
+ onUpdate: () => {
+ _.noop();
+ },
+ onError: () => {
+ _.noop();
+ },
+ onClose: () => {
+ _.noop();
+ },
+};
+
+describe('orderbookChannelFactory', () => {
+ const websocketUrl = 'ws://localhost:8080';
+ describe('#createWebSocketOrderbookChannelAsync', () => {
+ it('throws when input is not a url', () => {
+ const badUrlInput = 54;
+ expect(
+ orderbookChannelFactory.createWebSocketOrderbookChannelAsync(
+ badUrlInput as any,
+ emptyOrderbookChannelHandler,
+ ),
+ ).to.be.rejected();
+ });
+ it('throws when handler has the incorrect members', () => {
+ const badHandlerInput = {};
+ expect(
+ orderbookChannelFactory.createWebSocketOrderbookChannelAsync(websocketUrl, badHandlerInput as any),
+ ).to.be.rejected();
+ });
+ });
+});
diff --git a/packages/connect/test/ws_orderbook_channel_test.ts b/packages/connect/test/ws_orderbook_channel_test.ts
index ce404d934..5a63cbdcc 100644
--- a/packages/connect/test/ws_orderbook_channel_test.ts
+++ b/packages/connect/test/ws_orderbook_channel_test.ts
@@ -2,60 +2,58 @@ import * as chai from 'chai';
import * as dirtyChai from 'dirty-chai';
import * as _ from 'lodash';
import 'mocha';
+import * as Sinon from 'sinon';
+import * as WebSocket from 'websocket';
import { WebSocketOrderbookChannel } from '../src/ws_orderbook_channel';
chai.config.includeStack = true;
chai.use(dirtyChai);
const expect = chai.expect;
+const emptyOrderbookChannelHandler = {
+ onSnapshot: () => {
+ _.noop();
+ },
+ onUpdate: () => {
+ _.noop();
+ },
+ onError: () => {
+ _.noop();
+ },
+ onClose: () => {
+ _.noop();
+ },
+};
describe('WebSocketOrderbookChannel', () => {
const websocketUrl = 'ws://localhost:8080';
- const orderbookChannel = new WebSocketOrderbookChannel(websocketUrl);
+ const openClient = new WebSocket.w3cwebsocket(websocketUrl);
+ Sinon.stub(openClient, 'readyState').get(() => WebSocket.w3cwebsocket.OPEN);
+ Sinon.stub(openClient, 'send').callsFake(_.noop.bind(_));
+ const openOrderbookChannel = new WebSocketOrderbookChannel(openClient, emptyOrderbookChannelHandler);
const subscriptionOpts = {
baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
quoteTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
snapshot: true,
limit: 100,
};
- const emptyOrderbookChannelHandler = {
- onSnapshot: () => {
- _.noop();
- },
- onUpdate: () => {
- _.noop();
- },
- onError: () => {
- _.noop();
- },
- onClose: () => {
- _.noop();
- },
- };
describe('#subscribe', () => {
it('throws when subscriptionOpts does not conform to schema', () => {
- const badSubscribeCall = orderbookChannel.subscribe.bind(
- orderbookChannel,
- {},
- emptyOrderbookChannelHandler,
- );
+ const badSubscribeCall = openOrderbookChannel.subscribe.bind(openOrderbookChannel, {});
expect(badSubscribeCall).throws(
'Expected subscriptionOpts to conform to schema /RelayerApiOrderbookChannelSubscribePayload\nEncountered: {}\nValidation errors: instance requires property "baseTokenAddress", instance requires property "quoteTokenAddress"',
);
});
- it('throws when handler has the incorrect members', () => {
- const badSubscribeCall = orderbookChannel.subscribe.bind(orderbookChannel, subscriptionOpts, {});
- expect(badSubscribeCall).throws(
- 'Expected handler.onSnapshot to be of type function, encountered: undefined',
- );
- });
it('does not throw when inputs are of correct types', () => {
- const goodSubscribeCall = orderbookChannel.subscribe.bind(
- orderbookChannel,
- subscriptionOpts,
- emptyOrderbookChannelHandler,
- );
+ const goodSubscribeCall = openOrderbookChannel.subscribe.bind(openOrderbookChannel, subscriptionOpts);
expect(goodSubscribeCall).to.not.throw();
});
+ it('throws when client is closed', () => {
+ const closedClient = new WebSocket.w3cwebsocket(websocketUrl);
+ Sinon.stub(closedClient, 'readyState').get(() => WebSocket.w3cwebsocket.CLOSED);
+ const closedOrderbookChannel = new WebSocketOrderbookChannel(closedClient, emptyOrderbookChannelHandler);
+ const badSubscribeCall = closedOrderbookChannel.subscribe.bind(closedOrderbookChannel, subscriptionOpts);
+ expect(badSubscribeCall).throws('WebSocket connection is closed');
+ });
});
});
diff --git a/packages/contract-wrappers/.npmignore b/packages/contract-wrappers/.npmignore
new file mode 100644
index 000000000..6a3eb57bd
--- /dev/null
+++ b/packages/contract-wrappers/.npmignore
@@ -0,0 +1,11 @@
+.*
+tsconfig.json
+webpack.config.js
+yarn-error.log
+test/
+/src/
+/_bundles/
+/contract_templates/
+/generated_docs/
+/scripts/
+/lib/src/monorepo_scripts/
diff --git a/packages/contract-wrappers/CHANGELOG.json b/packages/contract-wrappers/CHANGELOG.json
new file mode 100644
index 000000000..fdf779338
--- /dev/null
+++ b/packages/contract-wrappers/CHANGELOG.json
@@ -0,0 +1,107 @@
+[
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "pr": 915,
+ "note": "Added strict encoding/decoding checks for sendTransaction and call"
+ },
+ {
+ "note": "Add ForwarderWrapper",
+ "pr": 934
+ },
+ {
+ "note": "Optimize orders in ForwarderWrapper",
+ "pr": 936
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Fixed bug caused by importing non-existent dep"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Update blockstream to v5.0 and propogate up caught errors to active subscriptions",
+ "pr": 815
+ },
+ {
+ "note": "Update to v2 of 0x rpotocol",
+ "pr": 822
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617227,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Expose 'abi' ContractAbi property on all contract wrappers"
+ }
+ ]
+ },
+ {
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1527008544
+ },
+ {
+ "timestamp": 1527008270,
+ "version": "0.0.1",
+ "changes": [
+ {
+ "note": "Moved contractWrappers out of 0x.js",
+ "pr": 579
+ }
+ ]
+ }
+]
diff --git a/packages/contract-wrappers/CHANGELOG.md b/packages/contract-wrappers/CHANGELOG.md
new file mode 100644
index 000000000..c2ad7218e
--- /dev/null
+++ b/packages/contract-wrappers/CHANGELOG.md
@@ -0,0 +1,49 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.1-rc.3 - _August 13, 2018_
+
+ * Added strict encoding/decoding checks for sendTransaction and call (#915)
+ * Add ForwarderWrapper (#934)
+ * Optimize orders in ForwarderWrapper (#936)
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Fixed bug caused by importing non-existent dep
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Update blockstream to v5.0 and propogate up caught errors to active subscriptions (#815)
+ * Update to v2 of 0x rpotocol (#822)
+
+## v0.1.1 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.5 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.4 - _May 29, 2018_
+
+ * Expose 'abi' ContractAbi property on all contract wrappers
+
+## v0.0.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.1 - _May 22, 2018_
+
+ * Moved contractWrappers out of 0x.js (#579)
diff --git a/packages/contract-wrappers/README.md b/packages/contract-wrappers/README.md
new file mode 100644
index 000000000..6153f798e
--- /dev/null
+++ b/packages/contract-wrappers/README.md
@@ -0,0 +1,89 @@
+## @0xproject/contract-wrappers
+
+Smart TS wrappers for 0x smart contracts. The wrappers have simplified interfaces, perform client-side validation on transactions and throw helpful error messages.
+
+### Read the [Documentation](https://0xproject.com/docs/0x.js).
+
+## Installation
+
+**Install**
+
+```bash
+npm install @0xproject/contract-wrappers --save
+```
+
+**Import**
+
+```javascript
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+## Contributing
+
+We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/contract-wrappers yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/contract-wrappers yarn watch
+```
+
+```bash
+yarn build
+```
+
+or continuously rebuild on change:
+
+```bash
+yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/contract-wrappers/coverage/.gitkeep b/packages/contract-wrappers/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/contract-wrappers/coverage/.gitkeep
diff --git a/packages/contract-wrappers/package.json b/packages/contract-wrappers/package.json
new file mode 100644
index 000000000..7667b5b7f
--- /dev/null
+++ b/packages/contract-wrappers/package.json
@@ -0,0 +1,95 @@
+{
+ "name": "@0xproject/contract-wrappers",
+ "version": "1.0.1-rc.3",
+ "description": "Smart TS wrappers for 0x smart contracts",
+ "keywords": [
+ "0xproject",
+ "ethereum",
+ "tokens",
+ "exchange"
+ ],
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "pre_build": "run-s update_artifacts_v2_beta update_artifacts_v2 generate_contract_wrappers copy_artifacts",
+ "generate_contract_wrappers": "abi-gen --abis 'src/artifacts/@(Exchange|DummyERC20Token|DummyERC721Token|ZRXToken|ERC20Token|ERC721Token|WETH9|ERC20Proxy|ERC721Proxy|Forwarder).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers",
+ "lint": "tslint --project . --exclude **/src/contract_wrappers/**/* --exclude **/lib/**/*",
+ "test:circleci": "run-s test:coverage",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "update_artifacts_v2_beta": "for i in ${npm_package_config_contracts_v2_beta}; do copyfiles -u 4 ../migrations/artifacts/2.0.0-beta-testnet/$i.json src/artifacts; done;",
+ "update_artifacts_v2": "for i in ${npm_package_config_contracts_v2}; do copyfiles -u 4 ../migrations/artifacts/2.0.0/$i.json src/artifacts; done;",
+ "copy_artifacts": "copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts",
+ "clean": "shx rm -rf _bundles lib test_temp scripts test/artifacts src/contract_wrappers/generated src/artifacts",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js lib/test/global_hooks.js --timeout 10000 --bail --exit",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js"
+ },
+ "config": {
+ "contracts_v2_beta": "Exchange ERC20Proxy ERC20Token ERC721Proxy ERC721Token WETH9 ZRXToken Forwarder",
+ "contracts_v2": "DummyERC20Token DummyERC721Token"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo"
+ },
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "devDependencies": {
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/migrations": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/lodash": "4.14.104",
+ "@types/mocha": "^2.2.42",
+ "@types/node": "^8.0.53",
+ "@types/sinon": "^2.2.2",
+ "@types/uuid": "^3.4.2",
+ "awesome-typescript-loader": "^3.1.3",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "chai-bignumber": "^2.0.1",
+ "copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
+ "npm-run-all": "^4.1.2",
+ "nyc": "^11.0.1",
+ "opn-cli": "^3.1.0",
+ "shx": "^0.2.2",
+ "sinon": "^4.0.0",
+ "source-map-support": "^0.5.0",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2",
+ "web3-provider-engine": "14.0.6"
+ },
+ "dependencies": {
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/fill-scenarios": "^1.0.1-rc.3",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-blockstream": "5.0.0",
+ "ethereumjs-util": "^5.1.1",
+ "ethers": "3.0.22",
+ "js-sha3": "^0.7.0",
+ "lodash": "^4.17.5",
+ "uuid": "^3.1.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/contract-wrappers/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts b/packages/contract-wrappers/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts
new file mode 100644
index 000000000..1f139f1ef
--- /dev/null
+++ b/packages/contract-wrappers/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractBalanceAndProxyAllowanceLazyStore {
+ public abstract async getBalanceAsync(tokenAddress: string, userAddress: string): Promise<BigNumber>;
+ public abstract async getProxyAllowanceAsync(tokenAddress: string, userAddress: string): Promise<BigNumber>;
+ public abstract setBalance(tokenAddress: string, userAddress: string, balance: BigNumber): void;
+ public abstract deleteBalance(tokenAddress: string, userAddress: string): void;
+ public abstract setProxyAllowance(tokenAddress: string, userAddress: string, proxyAllowance: BigNumber): void;
+ public abstract deleteProxyAllowance(tokenAddress: string, userAddress: string): void;
+ public abstract deleteAll(): void;
+}
diff --git a/packages/contract-wrappers/src/artifacts.ts b/packages/contract-wrappers/src/artifacts.ts
new file mode 100644
index 000000000..2481b311a
--- /dev/null
+++ b/packages/contract-wrappers/src/artifacts.ts
@@ -0,0 +1,25 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as DummyERC20Token from './artifacts/DummyERC20Token.json';
+import * as DummyERC721Token from './artifacts/DummyERC721Token.json';
+import * as ERC20Proxy from './artifacts/ERC20Proxy.json';
+import * as ERC20Token from './artifacts/ERC20Token.json';
+import * as ERC721Proxy from './artifacts/ERC721Proxy.json';
+import * as ERC721Token from './artifacts/ERC721Token.json';
+import * as Exchange from './artifacts/Exchange.json';
+import * as Forwarder from './artifacts/Forwarder.json';
+import * as EtherToken from './artifacts/WETH9.json';
+import * as ZRXToken from './artifacts/ZRXToken.json';
+
+export const artifacts = {
+ ZRXToken: (ZRXToken as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ DummyERC721Token: (DummyERC721Token as any) as ContractArtifact,
+ ERC20Token: (ERC20Token as any) as ContractArtifact,
+ ERC721Token: (ERC721Token as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ EtherToken: (EtherToken as any) as ContractArtifact,
+ ERC20Proxy: (ERC20Proxy as any) as ContractArtifact,
+ ERC721Proxy: (ERC721Proxy as any) as ContractArtifact,
+ Forwarder: (Forwarder as any) as ContractArtifact,
+};
diff --git a/packages/contract-wrappers/src/contract_wrappers.ts b/packages/contract-wrappers/src/contract_wrappers.ts
new file mode 100644
index 000000000..4277a0746
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers.ts
@@ -0,0 +1,144 @@
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { constants } from './utils/constants';
+
+import { artifacts } from './artifacts';
+import { ERC20ProxyWrapper } from './contract_wrappers/erc20_proxy_wrapper';
+import { ERC20TokenWrapper } from './contract_wrappers/erc20_token_wrapper';
+import { ERC721ProxyWrapper } from './contract_wrappers/erc721_proxy_wrapper';
+import { ERC721TokenWrapper } from './contract_wrappers/erc721_token_wrapper';
+import { EtherTokenWrapper } from './contract_wrappers/ether_token_wrapper';
+import { ExchangeWrapper } from './contract_wrappers/exchange_wrapper';
+import { ForwarderWrapper } from './contract_wrappers/forwarder_wrapper';
+import { ContractWrappersConfigSchema } from './schemas/contract_wrappers_config_schema';
+import { contractWrappersPrivateNetworkConfigSchema } from './schemas/contract_wrappers_private_network_config_schema';
+import { contractWrappersPublicNetworkConfigSchema } from './schemas/contract_wrappers_public_network_config_schema';
+import { ContractWrappersConfig } from './types';
+import { assert } from './utils/assert';
+/**
+ * The ContractWrappers class contains smart contract wrappers helpful when building on 0x protocol.
+ */
+export class ContractWrappers {
+ /**
+ * An instance of the ExchangeWrapper class containing methods for interacting with the 0x Exchange smart contract.
+ */
+ public exchange: ExchangeWrapper;
+ /**
+ * An instance of the ERC20TokenWrapper class containing methods for interacting with any ERC20 token smart contract.
+ */
+ public erc20Token: ERC20TokenWrapper;
+ /**
+ * An instance of the ERC721TokenWrapper class containing methods for interacting with any ERC721 token smart contract.
+ */
+ public erc721Token: ERC721TokenWrapper;
+ /**
+ * An instance of the EtherTokenWrapper class containing methods for interacting with the
+ * wrapped ETH ERC20 token smart contract.
+ */
+ public etherToken: EtherTokenWrapper;
+ /**
+ * An instance of the ERC20ProxyWrapper class containing methods for interacting with the
+ * erc20Proxy smart contract.
+ */
+ public erc20Proxy: ERC20ProxyWrapper;
+ /**
+ * An instance of the ERC721ProxyWrapper class containing methods for interacting with the
+ * erc721Proxy smart contract.
+ */
+ public erc721Proxy: ERC721ProxyWrapper;
+ /**
+ * An instance of the ForwarderWrapper class containing methods for interacting with any Forwarder smart contract.
+ */
+ public forwarder: ForwarderWrapper;
+
+ private _web3Wrapper: Web3Wrapper;
+ /**
+ * Instantiates a new ContractWrappers instance.
+ * @param provider The Provider instance you would like the 0x.js library to use for interacting with
+ * the Ethereum network.
+ * @param config The configuration object. Look up the type for the description.
+ * @return An instance of the ContractWrappers class.
+ */
+ constructor(provider: Provider, config: ContractWrappersConfig) {
+ assert.isWeb3Provider('provider', provider);
+ assert.doesConformToSchema('config', config, ContractWrappersConfigSchema, [
+ contractWrappersPrivateNetworkConfigSchema,
+ contractWrappersPublicNetworkConfigSchema,
+ ]);
+ const artifactJSONs = _.values(artifacts);
+ const abiArrays = _.map(artifactJSONs, artifact => artifact.compilerOutput.abi);
+ const txDefaults = {
+ gasPrice: config.gasPrice,
+ };
+ this._web3Wrapper = new Web3Wrapper(provider, txDefaults);
+ _.forEach(abiArrays, abi => {
+ this._web3Wrapper.abiDecoder.addABI(abi);
+ });
+ const blockPollingIntervalMs = _.isUndefined(config.blockPollingIntervalMs)
+ ? constants.DEFAULT_BLOCK_POLLING_INTERVAL
+ : config.blockPollingIntervalMs;
+ this.erc20Proxy = new ERC20ProxyWrapper(this._web3Wrapper, config.networkId, config.erc20ProxyContractAddress);
+ this.erc721Proxy = new ERC721ProxyWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ config.erc721ProxyContractAddress,
+ );
+ this.erc20Token = new ERC20TokenWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ this.erc20Proxy,
+ blockPollingIntervalMs,
+ );
+ this.erc721Token = new ERC721TokenWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ this.erc721Proxy,
+ blockPollingIntervalMs,
+ );
+ this.etherToken = new EtherTokenWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ this.erc20Token,
+ blockPollingIntervalMs,
+ );
+ this.exchange = new ExchangeWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ config.exchangeContractAddress,
+ config.zrxContractAddress,
+ blockPollingIntervalMs,
+ );
+ this.forwarder = new ForwarderWrapper(
+ this._web3Wrapper,
+ config.networkId,
+ config.forwarderContractAddress,
+ config.zrxContractAddress,
+ );
+ }
+ /**
+ * Sets a new web3 provider for 0x.js. Updating the provider will stop all
+ * subscriptions so you will need to re-subscribe to all events relevant to your app after this call.
+ * @param provider The Web3Provider you would like the 0x.js library to use from now on.
+ * @param networkId The id of the network your provider is connected to
+ */
+ public setProvider(provider: Provider, networkId: number): void {
+ this._web3Wrapper.setProvider(provider);
+ (this.exchange as any)._invalidateContractInstances();
+ (this.exchange as any)._setNetworkId(networkId);
+ (this.erc20Token as any)._invalidateContractInstances();
+ (this.erc20Token as any)._setNetworkId(networkId);
+ (this.erc20Proxy as any)._invalidateContractInstance();
+ (this.erc20Proxy as any)._setNetworkId(networkId);
+ (this.etherToken as any)._invalidateContractInstance();
+ (this.etherToken as any)._setNetworkId(networkId);
+ }
+ /**
+ * Get the provider instance currently used by 0x.js
+ * @return Web3 provider instance
+ */
+ public getProvider(): Provider {
+ return this._web3Wrapper.getProvider();
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts
new file mode 100644
index 000000000..daf70253a
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/contract_wrapper.ts
@@ -0,0 +1,212 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+import { AbiDecoder, intervalUtils, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { BlockParamLiteral, ContractAbi, FilterObject, LogEntry, LogWithDecodedArgs, RawLog } from 'ethereum-types';
+import { Block, BlockAndLogStreamer, Log } from 'ethereumjs-blockstream';
+import * as _ from 'lodash';
+
+import {
+ BlockRange,
+ ContractEventArgs,
+ ContractEvents,
+ ContractWrappersError,
+ EventCallback,
+ IndexedFilterValues,
+} from '../types';
+import { constants } from '../utils/constants';
+import { filterUtils } from '../utils/filter_utils';
+
+const CONTRACT_NAME_TO_NOT_FOUND_ERROR: {
+ [contractName: string]: ContractWrappersError;
+} = {
+ ZRX: ContractWrappersError.ZRXContractDoesNotExist,
+ EtherToken: ContractWrappersError.EtherTokenContractDoesNotExist,
+ ERC20Token: ContractWrappersError.ERC20TokenContractDoesNotExist,
+ ERC20Proxy: ContractWrappersError.ERC20ProxyContractDoesNotExist,
+ ERC721Token: ContractWrappersError.ERC721TokenContractDoesNotExist,
+ ERC721Proxy: ContractWrappersError.ERC721ProxyContractDoesNotExist,
+ Exchange: ContractWrappersError.ExchangeContractDoesNotExist,
+};
+
+export abstract class ContractWrapper {
+ public abstract abi: ContractAbi;
+ protected _web3Wrapper: Web3Wrapper;
+ protected _networkId: number;
+ private _blockAndLogStreamerIfExists: BlockAndLogStreamer<Block, Log> | undefined;
+ private _blockPollingIntervalMs: number;
+ private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
+ private _filters: { [filterToken: string]: FilterObject };
+ private _filterCallbacks: {
+ [filterToken: string]: EventCallback<ContractEventArgs>;
+ };
+ private _onLogAddedSubscriptionToken: string | undefined;
+ private _onLogRemovedSubscriptionToken: string | undefined;
+ private static _onBlockAndLogStreamerError(isVerbose: boolean, err: Error): void {
+ // Since Blockstream errors are all recoverable, we simply log them if the verbose
+ // config is passed in.
+ if (isVerbose) {
+ logUtils.warn(err);
+ }
+ }
+ constructor(web3Wrapper: Web3Wrapper, networkId: number, blockPollingIntervalMs?: number) {
+ this._web3Wrapper = web3Wrapper;
+ this._networkId = networkId;
+ this._blockPollingIntervalMs = _.isUndefined(blockPollingIntervalMs)
+ ? constants.DEFAULT_BLOCK_POLLING_INTERVAL
+ : blockPollingIntervalMs;
+ this._filters = {};
+ this._filterCallbacks = {};
+ this._blockAndLogStreamerIfExists = undefined;
+ this._onLogAddedSubscriptionToken = undefined;
+ this._onLogRemovedSubscriptionToken = undefined;
+ }
+ protected _unsubscribeAll(): void {
+ const filterTokens = _.keys(this._filterCallbacks);
+ _.each(filterTokens, filterToken => {
+ this._unsubscribe(filterToken);
+ });
+ }
+ protected _unsubscribe(filterToken: string, err?: Error): void {
+ if (_.isUndefined(this._filters[filterToken])) {
+ throw new Error(ContractWrappersError.SubscriptionNotFound);
+ }
+ if (!_.isUndefined(err)) {
+ const callback = this._filterCallbacks[filterToken];
+ callback(err, undefined);
+ }
+ delete this._filters[filterToken];
+ delete this._filterCallbacks[filterToken];
+ if (_.isEmpty(this._filters)) {
+ this._stopBlockAndLogStream();
+ }
+ }
+ protected _subscribe<ArgsType extends ContractEventArgs>(
+ address: string,
+ eventName: ContractEvents,
+ indexFilterValues: IndexedFilterValues,
+ abi: ContractAbi,
+ callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
+ ): string {
+ const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi);
+ if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ this._startBlockAndLogStream(isVerbose);
+ }
+ const filterToken = filterUtils.generateUUID();
+ this._filters[filterToken] = filter;
+ this._filterCallbacks[filterToken] = callback as EventCallback<ContractEventArgs>;
+ return filterToken;
+ }
+ protected async _getLogsAsync<ArgsType extends ContractEventArgs>(
+ address: string,
+ eventName: ContractEvents,
+ blockRange: BlockRange,
+ indexFilterValues: IndexedFilterValues,
+ abi: ContractAbi,
+ ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
+ const filter = filterUtils.getFilter(address, eventName, indexFilterValues, abi, blockRange);
+ const logs = await this._web3Wrapper.getLogsAsync(filter);
+ const logsWithDecodedArguments = _.map(logs, this._tryToDecodeLogOrNoop.bind(this));
+ return logsWithDecodedArguments;
+ }
+ protected _tryToDecodeLogOrNoop<ArgsType extends ContractEventArgs>(
+ log: LogEntry,
+ ): LogWithDecodedArgs<ArgsType> | RawLog {
+ const abiDecoder = new AbiDecoder([this.abi]);
+ const logWithDecodedArgs = abiDecoder.tryToDecodeLogOrNoop(log);
+ return logWithDecodedArgs;
+ }
+ protected async _getContractAbiAndAddressFromArtifactsAsync(
+ artifact: ContractArtifact,
+ addressIfExists?: string,
+ ): Promise<[ContractAbi, string]> {
+ let contractAddress: string;
+ if (_.isUndefined(addressIfExists)) {
+ if (_.isUndefined(artifact.networks[this._networkId])) {
+ throw new Error(ContractWrappersError.ContractNotDeployedOnNetwork);
+ }
+ contractAddress = artifact.networks[this._networkId].address.toLowerCase();
+ } else {
+ contractAddress = addressIfExists;
+ }
+ const doesContractExist = await this._web3Wrapper.doesContractExistAtAddressAsync(contractAddress);
+ if (!doesContractExist) {
+ throw new Error(CONTRACT_NAME_TO_NOT_FOUND_ERROR[artifact.contractName]);
+ }
+ const abiAndAddress: [ContractAbi, string] = [artifact.compilerOutput.abi, contractAddress];
+ return abiAndAddress;
+ }
+ protected _getContractAddress(artifact: ContractArtifact, addressIfExists?: string): string {
+ if (_.isUndefined(addressIfExists)) {
+ const contractAddress = artifact.networks[this._networkId].address;
+ if (_.isUndefined(contractAddress)) {
+ throw new Error(ContractWrappersError.ExchangeContractDoesNotExist);
+ }
+ return contractAddress;
+ } else {
+ return addressIfExists;
+ }
+ }
+ private _onLogStateChanged<ArgsType extends ContractEventArgs>(isRemoved: boolean, log: LogEntry): void {
+ _.forEach(this._filters, (filter: FilterObject, filterToken: string) => {
+ if (filterUtils.matchesFilter(log, filter)) {
+ const decodedLog = this._tryToDecodeLogOrNoop(log) as LogWithDecodedArgs<ArgsType>;
+ const logEvent = {
+ log: decodedLog,
+ isRemoved,
+ };
+ this._filterCallbacks[filterToken](null, logEvent);
+ }
+ });
+ }
+ private _startBlockAndLogStream(isVerbose: boolean): void {
+ if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ throw new Error(ContractWrappersError.SubscriptionAlreadyPresent);
+ }
+ this._blockAndLogStreamerIfExists = new BlockAndLogStreamer(
+ this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper),
+ this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper),
+ ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose),
+ );
+ const catchAllLogFilter = {};
+ this._blockAndLogStreamerIfExists.addLogFilter(catchAllLogFilter);
+ this._blockAndLogStreamIntervalIfExists = intervalUtils.setAsyncExcludingInterval(
+ this._reconcileBlockAsync.bind(this),
+ this._blockPollingIntervalMs,
+ ContractWrapper._onBlockAndLogStreamerError.bind(this, isVerbose),
+ );
+ let isRemoved = false;
+ this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded(
+ this._onLogStateChanged.bind(this, isRemoved),
+ );
+ isRemoved = true;
+ this._onLogRemovedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogRemoved(
+ this._onLogStateChanged.bind(this, isRemoved),
+ );
+ }
+ // HACK: This should be a package-scoped method (which doesn't exist in TS)
+ // We don't want this method available in the public interface for all classes
+ // who inherit from ContractWrapper, and it is only used by the internal implementation
+ // of those higher classes.
+ // tslint:disable-next-line:no-unused-variable
+ private _setNetworkId(networkId: number): void {
+ this._networkId = networkId;
+ }
+ private _stopBlockAndLogStream(): void {
+ if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ throw new Error(ContractWrappersError.SubscriptionNotFound);
+ }
+ this._blockAndLogStreamerIfExists.unsubscribeFromOnLogAdded(this._onLogAddedSubscriptionToken as string);
+ this._blockAndLogStreamerIfExists.unsubscribeFromOnLogRemoved(this._onLogRemovedSubscriptionToken as string);
+ intervalUtils.clearAsyncExcludingInterval(this._blockAndLogStreamIntervalIfExists as NodeJS.Timer);
+ delete this._blockAndLogStreamerIfExists;
+ }
+ private async _reconcileBlockAsync(): Promise<void> {
+ const latestBlock = await this._web3Wrapper.getBlockAsync(BlockParamLiteral.Latest);
+ // We need to coerce to Block type cause Web3.Block includes types for mempool blocks
+ if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ // If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
+ await this._blockAndLogStreamerIfExists.reconcileNewBlock((latestBlock as any) as Block);
+ }
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts
new file mode 100644
index 000000000..821d1a8a2
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/erc20_proxy_wrapper.ts
@@ -0,0 +1,85 @@
+import { AssetProxyId } from '@0xproject/types';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { assert } from '../utils/assert';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ERC20ProxyContract } from './generated/erc20_proxy';
+
+/**
+ * This class includes the functionality related to interacting with the ERC20Proxy contract.
+ */
+export class ERC20ProxyWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.ERC20Proxy.compilerOutput.abi;
+ private _erc20ProxyContractIfExists?: ERC20ProxyContract;
+ private _contractAddressIfExists?: string;
+ constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
+ super(web3Wrapper, networkId);
+ this._contractAddressIfExists = contractAddressIfExists;
+ }
+ /**
+ * Get the 4 bytes ID of this asset proxy
+ * @return Proxy id
+ */
+ public async getProxyIdAsync(): Promise<AssetProxyId> {
+ const ERC20ProxyContractInstance = await this._getERC20ProxyContractAsync();
+ const proxyId = (await ERC20ProxyContractInstance.getProxyId.callAsync()) as AssetProxyId;
+ return proxyId;
+ }
+ /**
+ * Check if the Exchange contract address is authorized by the ERC20Proxy contract.
+ * @param exchangeContractAddress The hex encoded address of the Exchange contract to call.
+ * @return Whether the exchangeContractAddress is authorized.
+ */
+ public async isAuthorizedAsync(exchangeContractAddress: string): Promise<boolean> {
+ assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress);
+ const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase();
+ const ERC20ProxyContractInstance = await this._getERC20ProxyContractAsync();
+ const isAuthorized = await ERC20ProxyContractInstance.authorized.callAsync(normalizedExchangeContractAddress);
+ return isAuthorized;
+ }
+ /**
+ * Get the list of all Exchange contract addresses authorized by the ERC20Proxy contract.
+ * @return The list of authorized addresses.
+ */
+ public async getAuthorizedAddressesAsync(): Promise<string[]> {
+ const ERC20ProxyContractInstance = await this._getERC20ProxyContractAsync();
+ const authorizedAddresses = await ERC20ProxyContractInstance.getAuthorizedAddresses.callAsync();
+ return authorizedAddresses;
+ }
+ /**
+ * Retrieves the Ethereum address of the ERC20Proxy contract deployed on the network
+ * that the user-passed web3 provider is connected to.
+ * @returns The Ethereum address of the ERC20Proxy contract being used.
+ */
+ public getContractAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.ERC20Proxy, this._contractAddressIfExists);
+ return contractAddress;
+ }
+ // HACK: We don't want this method to be visible to the other units within that package but not to the end user.
+ // TS doesn't give that possibility and therefore we make it private and access it over an any cast. Because of that tslint sees it as unused.
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstance(): void {
+ delete this._erc20ProxyContractIfExists;
+ }
+ private async _getERC20ProxyContractAsync(): Promise<ERC20ProxyContract> {
+ if (!_.isUndefined(this._erc20ProxyContractIfExists)) {
+ return this._erc20ProxyContractIfExists;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.ERC20Proxy,
+ this._contractAddressIfExists,
+ );
+ const contractInstance = new ERC20ProxyContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ this._erc20ProxyContractIfExists = contractInstance;
+ return this._erc20ProxyContractIfExists;
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts
new file mode 100644
index 000000000..17bda5085
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/erc20_token_wrapper.ts
@@ -0,0 +1,445 @@
+import { schemas } from '@0xproject/json-schemas';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi, LogWithDecodedArgs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { methodOptsSchema } from '../schemas/method_opts_schema';
+import { txOptsSchema } from '../schemas/tx_opts_schema';
+import {
+ BlockRange,
+ ContractWrappersError,
+ EventCallback,
+ IndexedFilterValues,
+ MethodOpts,
+ TransactionOpts,
+} from '../types';
+import { assert } from '../utils/assert';
+import { constants } from '../utils/constants';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ERC20ProxyWrapper } from './erc20_proxy_wrapper';
+import { ERC20TokenContract, ERC20TokenEventArgs, ERC20TokenEvents } from './generated/erc20_token';
+
+const removeUndefinedProperties = _.pickBy;
+
+/**
+ * This class includes all the functionality related to interacting with ERC20 token contracts.
+ * All ERC20 method calls are supported, along with some convenience methods for getting/setting allowances
+ * to the 0x ERC20 Proxy smart contract.
+ */
+export class ERC20TokenWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.ERC20Token.compilerOutput.abi;
+ public UNLIMITED_ALLOWANCE_IN_BASE_UNITS = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
+ private _tokenContractsByAddress: { [address: string]: ERC20TokenContract };
+ private _erc20ProxyWrapper: ERC20ProxyWrapper;
+ constructor(
+ web3Wrapper: Web3Wrapper,
+ networkId: number,
+ erc20ProxyWrapper: ERC20ProxyWrapper,
+ blockPollingIntervalMs?: number,
+ ) {
+ super(web3Wrapper, networkId, blockPollingIntervalMs);
+ this._tokenContractsByAddress = {};
+ this._erc20ProxyWrapper = erc20ProxyWrapper;
+ }
+ /**
+ * Retrieves an owner's ERC20 token balance.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address whose balance you would like to check.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The owner's ERC20 token balance in base units.
+ */
+ public async getBalanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<BigNumber> {
+ assert.isETHAddressHex('ownerAddress', ownerAddress);
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ let balance = await tokenContract.balanceOf.callAsync(normalizedOwnerAddress, txData, methodOpts.defaultBlock);
+ // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
+ balance = new BigNumber(balance);
+ return balance;
+ }
+ /**
+ * Sets the spender's allowance to a specified number of baseUnits on behalf of the owner address.
+ * Equivalent to the ERC20 spec method `approve`.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address who would like to set an allowance
+ * for spenderAddress.
+ * @param spenderAddress The hex encoded user Ethereum address who will be able to spend the set allowance.
+ * @param amountInBaseUnits The allowance amount you would like to set.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ spenderAddress: string,
+ amountInBaseUnits: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
+ assert.isETHAddressHex('spenderAddress', spenderAddress);
+ assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+ const normalizedSpenderAddress = spenderAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+ const txHash = await tokenContract.approve.sendTransactionAsync(
+ normalizedSpenderAddress,
+ amountInBaseUnits,
+ removeUndefinedProperties({
+ from: normalizedOwnerAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Sets the spender's allowance to an unlimited number of baseUnits on behalf of the owner address.
+ * Equivalent to the ERC20 spec method `approve`.
+ * Setting an unlimited allowance will lower the gas cost for filling orders involving tokens that forego updating
+ * allowances set to the max amount (e.g ZRX, WETH)
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address who would like to set an allowance
+ * for spenderAddress.
+ * @param spenderAddress The hex encoded user Ethereum address who will be able to spend the set allowance.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setUnlimitedAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ spenderAddress: string,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ const txHash = await this.setAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ txOpts,
+ );
+ return txHash;
+ }
+ /**
+ * Retrieves the owners allowance in baseUnits set to the spender's address.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address whose allowance to spenderAddress
+ * you would like to retrieve.
+ * @param spenderAddress The hex encoded user Ethereum address who can spend the allowance you are fetching.
+ * @param methodOpts Optional arguments this method accepts.
+ */
+ public async getAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ spenderAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<BigNumber> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('ownerAddress', ownerAddress);
+ assert.isETHAddressHex('spenderAddress', spenderAddress);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+ const normalizedSpenderAddress = spenderAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ let allowanceInBaseUnits = await tokenContract.allowance.callAsync(
+ normalizedOwnerAddress,
+ normalizedSpenderAddress,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
+ allowanceInBaseUnits = new BigNumber(allowanceInBaseUnits);
+ return allowanceInBaseUnits;
+ }
+ /**
+ * Retrieves the owner's allowance in baseUnits set to the 0x proxy contract.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address whose proxy contract allowance we are retrieving.
+ * @param methodOpts Optional arguments this method accepts.
+ */
+ public async getProxyAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<BigNumber> {
+ const proxyAddress = this._erc20ProxyWrapper.getContractAddress();
+ const allowanceInBaseUnits = await this.getAllowanceAsync(tokenAddress, ownerAddress, proxyAddress, methodOpts);
+ return allowanceInBaseUnits;
+ }
+ /**
+ * Sets the 0x proxy contract's allowance to a specified number of a tokens' baseUnits on behalf
+ * of an owner address.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address who is setting an allowance
+ * for the Proxy contract.
+ * @param amountInBaseUnits The allowance amount specified in baseUnits.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setProxyAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ amountInBaseUnits: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ const proxyAddress = this._erc20ProxyWrapper.getContractAddress();
+ const txHash = await this.setAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ proxyAddress,
+ amountInBaseUnits,
+ txOpts,
+ );
+ return txHash;
+ }
+ /**
+ * Sets the 0x proxy contract's allowance to a unlimited number of a tokens' baseUnits on behalf
+ * of an owner address.
+ * Setting an unlimited allowance will lower the gas cost for filling orders involving tokens that forego updating
+ * allowances set to the max amount (e.g ZRX, WETH)
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address who is setting an allowance
+ * for the Proxy contract.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setUnlimitedProxyAllowanceAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ const txHash = await this.setProxyAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ this.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ txOpts,
+ );
+ return txHash;
+ }
+ /**
+ * Transfers `amountInBaseUnits` ERC20 tokens from `fromAddress` to `toAddress`.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param fromAddress The hex encoded user Ethereum address that will send the funds.
+ * @param toAddress The hex encoded user Ethereum address that will receive the funds.
+ * @param amountInBaseUnits The amount (specified in baseUnits) of the token to transfer.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async transferAsync(
+ tokenAddress: string,
+ fromAddress: string,
+ toAddress: string,
+ amountInBaseUnits: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ await assert.isSenderAddressAsync('fromAddress', fromAddress, this._web3Wrapper);
+ assert.isETHAddressHex('toAddress', toAddress);
+ assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedFromAddress = fromAddress.toLowerCase();
+ const normalizedToAddress = toAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
+ if (fromAddressBalance.lessThan(amountInBaseUnits)) {
+ throw new Error(ContractWrappersError.InsufficientBalanceForTransfer);
+ }
+
+ const txHash = await tokenContract.transfer.sendTransactionAsync(
+ normalizedToAddress,
+ amountInBaseUnits,
+ removeUndefinedProperties({
+ from: normalizedFromAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Transfers `amountInBaseUnits` ERC20 tokens from `fromAddress` to `toAddress`.
+ * Requires the fromAddress to have sufficient funds and to have approved an allowance of
+ * `amountInBaseUnits` to `senderAddress`.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC20 token is deployed.
+ * @param fromAddress The hex encoded user Ethereum address whose funds are being sent.
+ * @param toAddress The hex encoded user Ethereum address that will receive the funds.
+ * @param senderAddress The hex encoded user Ethereum address whose initiates the fund transfer. The
+ * `fromAddress` must have set an allowance to the `senderAddress`
+ * before this call.
+ * @param amountInBaseUnits The amount (specified in baseUnits) of the token to transfer.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async transferFromAsync(
+ tokenAddress: string,
+ fromAddress: string,
+ toAddress: string,
+ senderAddress: string,
+ amountInBaseUnits: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('fromAddress', fromAddress);
+ assert.isETHAddressHex('toAddress', toAddress);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.isValidBaseUnitAmount('amountInBaseUnits', amountInBaseUnits);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedToAddress = toAddress.toLowerCase();
+ const normalizedFromAddress = fromAddress.toLowerCase();
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedSenderAddress = senderAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const fromAddressAllowance = await this.getAllowanceAsync(
+ normalizedTokenAddress,
+ normalizedFromAddress,
+ normalizedSenderAddress,
+ );
+ if (fromAddressAllowance.lessThan(amountInBaseUnits)) {
+ throw new Error(ContractWrappersError.InsufficientAllowanceForTransfer);
+ }
+
+ const fromAddressBalance = await this.getBalanceAsync(normalizedTokenAddress, normalizedFromAddress);
+ if (fromAddressBalance.lessThan(amountInBaseUnits)) {
+ throw new Error(ContractWrappersError.InsufficientBalanceForTransfer);
+ }
+
+ const txHash = await tokenContract.transferFrom.sendTransactionAsync(
+ normalizedFromAddress,
+ normalizedToAddress,
+ amountInBaseUnits,
+ removeUndefinedProperties({
+ from: normalizedSenderAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Subscribe to an event type emitted by the Token contract.
+ * @param tokenAddress The hex encoded address where the ERC20 token is deployed.
+ * @param eventName The token contract event you would like to subscribe to.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
+ * @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
+ * @return Subscription token used later to unsubscribe
+ */
+ public subscribe<ArgsType extends ERC20TokenEventArgs>(
+ tokenAddress: string,
+ eventName: ERC20TokenEvents,
+ indexFilterValues: IndexedFilterValues,
+ callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
+ ): string {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.doesBelongToStringEnum('eventName', eventName, ERC20TokenEvents);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ assert.isFunction('callback', callback);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const subscriptionToken = this._subscribe<ArgsType>(
+ normalizedTokenAddress,
+ eventName,
+ indexFilterValues,
+ artifacts.ERC20Token.compilerOutput.abi,
+ callback,
+ isVerbose,
+ );
+ return subscriptionToken;
+ }
+ /**
+ * Cancel a subscription
+ * @param subscriptionToken Subscription token returned by `subscribe()`
+ */
+ public unsubscribe(subscriptionToken: string): void {
+ assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken);
+ this._unsubscribe(subscriptionToken);
+ }
+ /**
+ * Cancels all existing subscriptions
+ */
+ public unsubscribeAll(): void {
+ super._unsubscribeAll();
+ }
+ /**
+ * Gets historical logs without creating a subscription
+ * @param tokenAddress An address of the token that emitted the logs.
+ * @param eventName The token contract event you would like to subscribe to.
+ * @param blockRange Block range to get logs from.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
+ * @return Array of logs that match the parameters
+ */
+ public async getLogsAsync<ArgsType extends ERC20TokenEventArgs>(
+ tokenAddress: string,
+ eventName: ERC20TokenEvents,
+ blockRange: BlockRange,
+ indexFilterValues: IndexedFilterValues,
+ ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.doesBelongToStringEnum('eventName', eventName, ERC20TokenEvents);
+ assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const logs = await this._getLogsAsync<ArgsType>(
+ normalizedTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ artifacts.ERC20Token.compilerOutput.abi,
+ );
+ return logs;
+ }
+ // HACK: We don't want this method to be visible to the other units within that package but not to the end user.
+ // TS doesn't give that possibility and therefore we make it private and access it over an any cast. Because of that tslint sees it as unused.
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstances(): void {
+ this.unsubscribeAll();
+ this._tokenContractsByAddress = {};
+ }
+ private async _getTokenContractAsync(tokenAddress: string): Promise<ERC20TokenContract> {
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ let tokenContract = this._tokenContractsByAddress[normalizedTokenAddress];
+ if (!_.isUndefined(tokenContract)) {
+ return tokenContract;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.ERC20Token,
+ normalizedTokenAddress,
+ );
+ const contractInstance = new ERC20TokenContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ tokenContract = contractInstance;
+ this._tokenContractsByAddress[normalizedTokenAddress] = tokenContract;
+ return tokenContract;
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts
new file mode 100644
index 000000000..38ecd4687
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/erc721_proxy_wrapper.ts
@@ -0,0 +1,85 @@
+import { AssetProxyId } from '@0xproject/types';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { assert } from '../utils/assert';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ERC721ProxyContract } from './generated/erc721_proxy';
+
+/**
+ * This class includes the functionality related to interacting with the ERC721Proxy contract.
+ */
+export class ERC721ProxyWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.ERC20Proxy.compilerOutput.abi;
+ private _erc721ProxyContractIfExists?: ERC721ProxyContract;
+ private _contractAddressIfExists?: string;
+ constructor(web3Wrapper: Web3Wrapper, networkId: number, contractAddressIfExists?: string) {
+ super(web3Wrapper, networkId);
+ this._contractAddressIfExists = contractAddressIfExists;
+ }
+ /**
+ * Get the 4 bytes ID of this asset proxy
+ * @return Proxy id
+ */
+ public async getProxyIdAsync(): Promise<AssetProxyId> {
+ const ERC721ProxyContractInstance = await this._getERC721ProxyContractAsync();
+ const proxyId = (await ERC721ProxyContractInstance.getProxyId.callAsync()) as AssetProxyId;
+ return proxyId;
+ }
+ /**
+ * Check if the Exchange contract address is authorized by the ERC721Proxy contract.
+ * @param exchangeContractAddress The hex encoded address of the Exchange contract to call.
+ * @return Whether the exchangeContractAddress is authorized.
+ */
+ public async isAuthorizedAsync(exchangeContractAddress: string): Promise<boolean> {
+ assert.isETHAddressHex('exchangeContractAddress', exchangeContractAddress);
+ const normalizedExchangeContractAddress = exchangeContractAddress.toLowerCase();
+ const ERC721ProxyContractInstance = await this._getERC721ProxyContractAsync();
+ const isAuthorized = await ERC721ProxyContractInstance.authorized.callAsync(normalizedExchangeContractAddress);
+ return isAuthorized;
+ }
+ /**
+ * Get the list of all Exchange contract addresses authorized by the ERC721Proxy contract.
+ * @return The list of authorized addresses.
+ */
+ public async getAuthorizedAddressesAsync(): Promise<string[]> {
+ const ERC721ProxyContractInstance = await this._getERC721ProxyContractAsync();
+ const authorizedAddresses = await ERC721ProxyContractInstance.getAuthorizedAddresses.callAsync();
+ return authorizedAddresses;
+ }
+ /**
+ * Retrieves the Ethereum address of the ERC721Proxy contract deployed on the network
+ * that the user-passed web3 provider is connected to.
+ * @returns The Ethereum address of the ERC721Proxy contract being used.
+ */
+ public getContractAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.ERC721Proxy, this._contractAddressIfExists);
+ return contractAddress;
+ }
+ // HACK: We don't want this method to be visible to the other units within that package but not to the end user.
+ // TS doesn't give that possibility and therefore we make it private and access it over an any cast. Because of that tslint sees it as unused.
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstance(): void {
+ delete this._erc721ProxyContractIfExists;
+ }
+ private async _getERC721ProxyContractAsync(): Promise<ERC721ProxyContract> {
+ if (!_.isUndefined(this._erc721ProxyContractIfExists)) {
+ return this._erc721ProxyContractIfExists;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.ERC721Proxy,
+ this._contractAddressIfExists,
+ );
+ const contractInstance = new ERC721ProxyContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ this._erc721ProxyContractIfExists = contractInstance;
+ return this._erc721ProxyContractIfExists;
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts
new file mode 100644
index 000000000..7231e0bde
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/erc721_token_wrapper.ts
@@ -0,0 +1,472 @@
+import { schemas } from '@0xproject/json-schemas';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi, LogWithDecodedArgs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { methodOptsSchema } from '../schemas/method_opts_schema';
+import { txOptsSchema } from '../schemas/tx_opts_schema';
+import {
+ BlockRange,
+ ContractWrappersError,
+ EventCallback,
+ IndexedFilterValues,
+ MethodOpts,
+ TransactionOpts,
+} from '../types';
+import { assert } from '../utils/assert';
+import { constants } from '../utils/constants';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ERC721ProxyWrapper } from './erc721_proxy_wrapper';
+import { ERC721TokenContract, ERC721TokenEventArgs, ERC721TokenEvents } from './generated/erc721_token';
+
+const removeUndefinedProperties = _.pickBy;
+
+/**
+ * This class includes all the functionality related to interacting with ERC721 token contracts.
+ * All ERC721 method calls are supported, along with some convenience methods for getting/setting allowances
+ * to the 0x ERC721 Proxy smart contract.
+ */
+export class ERC721TokenWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.ERC721Token.compilerOutput.abi;
+ private _tokenContractsByAddress: { [address: string]: ERC721TokenContract };
+ private _erc721ProxyWrapper: ERC721ProxyWrapper;
+ constructor(
+ web3Wrapper: Web3Wrapper,
+ networkId: number,
+ erc721ProxyWrapper: ERC721ProxyWrapper,
+ blockPollingIntervalMs?: number,
+ ) {
+ super(web3Wrapper, networkId, blockPollingIntervalMs);
+ this._tokenContractsByAddress = {};
+ this._erc721ProxyWrapper = erc721ProxyWrapper;
+ }
+ /**
+ * Count all NFTs assigned to an owner
+ * NFTs assigned to the zero address are considered invalid, and this function throws for queries about the zero address.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address whose balance you would like to check.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The number of NFTs owned by `ownerAddress`, possibly zero
+ */
+ public async getTokenCountAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<BigNumber> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('ownerAddress', ownerAddress);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ let balance = await tokenContract.balanceOf.callAsync(normalizedOwnerAddress, txData, methodOpts.defaultBlock);
+ // Wrap BigNumbers returned from web3 with our own (later) version of BigNumber
+ balance = new BigNumber(balance);
+ return balance;
+ }
+ /**
+ * Find the owner of an NFT
+ * NFTs assigned to zero address are considered invalid, and queries about them do throw.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param tokenId The identifier for an NFT
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The address of the owner of the NFT
+ */
+ public async getOwnerOfAsync(
+ tokenAddress: string,
+ tokenId: BigNumber,
+ methodOpts: MethodOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isBigNumber('tokenId', tokenId);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ try {
+ const tokenOwner = await tokenContract.ownerOf.callAsync(tokenId, txData, methodOpts.defaultBlock);
+ return tokenOwner;
+ } catch (err) {
+ throw new Error(ContractWrappersError.ERC721OwnerNotFound);
+ }
+ }
+ /**
+ * Query if an address is an authorized operator for all NFT's of `ownerAddress`
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address of the token owner.
+ * @param operatorAddress The hex encoded user Ethereum address of the operator you'd like to check if approved.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return True if `operatorAddress` is an approved operator for `ownerAddress`, false otherwise
+ */
+ public async isApprovedForAllAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ operatorAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<boolean> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('ownerAddress', ownerAddress);
+ assert.isETHAddressHex('operatorAddress', operatorAddress);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+ const normalizedOperatorAddress = operatorAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ const isApprovedForAll = await tokenContract.isApprovedForAll.callAsync(
+ normalizedOwnerAddress,
+ normalizedOperatorAddress,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return isApprovedForAll;
+ }
+ /**
+ * Query if 0x proxy is an authorized operator for all NFT's of `ownerAddress`
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address of the token owner.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return True if `operatorAddress` is an approved operator for `ownerAddress`, false otherwise
+ */
+ public async isProxyApprovedForAllAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<boolean> {
+ const proxyAddress = this._erc721ProxyWrapper.getContractAddress();
+ const isProxyApprovedForAll = await this.isApprovedForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ proxyAddress,
+ methodOpts,
+ );
+ return isProxyApprovedForAll;
+ }
+ /**
+ * Get the approved address for a single NFT. Returns undefined if no approval was set
+ * Throws if `_tokenId` is not a valid NFT
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param tokenId The identifier for an NFT
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The approved address for this NFT, or the undefined if there is none
+ */
+ public async getApprovedIfExistsAsync(
+ tokenAddress: string,
+ tokenId: BigNumber,
+ methodOpts: MethodOpts = {},
+ ): Promise<string | undefined> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isBigNumber('tokenId', tokenId);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+
+ const txData = {};
+ const approvedAddress = await tokenContract.getApproved.callAsync(tokenId, txData, methodOpts.defaultBlock);
+ if (approvedAddress === constants.NULL_ADDRESS) {
+ return undefined;
+ }
+ return approvedAddress;
+ }
+ /**
+ * Checks if 0x proxy is approved for a single NFT
+ * Throws if `_tokenId` is not a valid NFT
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param tokenId The identifier for an NFT
+ * @param methodOpts Optional arguments this method accepts.
+ * @return True if 0x proxy is approved
+ */
+ public async isProxyApprovedAsync(
+ tokenAddress: string,
+ tokenId: BigNumber,
+ methodOpts: MethodOpts = {},
+ ): Promise<boolean> {
+ const proxyAddress = this._erc721ProxyWrapper.getContractAddress();
+ const approvedAddress = await this.getApprovedIfExistsAsync(tokenAddress, tokenId, methodOpts);
+ const isProxyApproved = approvedAddress === proxyAddress;
+ return isProxyApproved;
+ }
+ /**
+ * Enable or disable approval for a third party ("operator") to manage all of `ownerAddress`'s assets.
+ * Throws if `_tokenId` is not a valid NFT
+ * Emits the ApprovalForAll event.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address of the token owner.
+ * @param operatorAddress The hex encoded user Ethereum address of the operator you'd like to set approval for.
+ * @param isApproved The boolean variable to set the approval to.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setApprovalForAllAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ operatorAddress: string,
+ isApproved: boolean,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ await assert.isSenderAddressAsync('ownerAddress', ownerAddress, this._web3Wrapper);
+ assert.isETHAddressHex('operatorAddress', operatorAddress);
+ assert.isBoolean('isApproved', isApproved);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedOwnerAddress = ownerAddress.toLowerCase();
+ const normalizedOperatorAddress = operatorAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+ const txHash = await tokenContract.setApprovalForAll.sendTransactionAsync(
+ normalizedOperatorAddress,
+ isApproved,
+ removeUndefinedProperties({
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ from: normalizedOwnerAddress,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Enable or disable approval for a third party ("operator") to manage all of `ownerAddress`'s assets.
+ * Throws if `_tokenId` is not a valid NFT
+ * Emits the ApprovalForAll event.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param ownerAddress The hex encoded user Ethereum address of the token owner.
+ * @param operatorAddress The hex encoded user Ethereum address of the operator you'd like to set approval for.
+ * @param isApproved The boolean variable to set the approval to.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setProxyApprovalForAllAsync(
+ tokenAddress: string,
+ ownerAddress: string,
+ isApproved: boolean,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ const proxyAddress = this._erc721ProxyWrapper.getContractAddress();
+ const txHash = await this.setApprovalForAllAsync(tokenAddress, ownerAddress, proxyAddress, isApproved, txOpts);
+ return txHash;
+ }
+ /**
+ * Set or reaffirm the approved address for an NFT
+ * The zero address indicates there is no approved address. Throws unless `msg.sender` is the current NFT owner,
+ * or an authorized operator of the current owner.
+ * Throws if `_tokenId` is not a valid NFT
+ * Emits the Approval event.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param approvedAddress The hex encoded user Ethereum address you'd like to set approval for.
+ * @param tokenId The identifier for an NFT
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setApprovalAsync(
+ tokenAddress: string,
+ approvedAddress: string,
+ tokenId: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('approvedAddress', approvedAddress);
+ assert.isBigNumber('tokenId', tokenId);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedApprovedAddress = approvedAddress.toLowerCase();
+
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+ const tokenOwnerAddress = await tokenContract.ownerOf.callAsync(tokenId);
+ await assert.isSenderAddressAsync('tokenOwnerAddress', tokenOwnerAddress, this._web3Wrapper);
+ const txHash = await tokenContract.approve.sendTransactionAsync(
+ normalizedApprovedAddress,
+ tokenId,
+ removeUndefinedProperties({
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ from: tokenOwnerAddress,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Set or reaffirm 0x proxy as an approved address for an NFT
+ * Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.
+ * Throws if `_tokenId` is not a valid NFT
+ * Emits the Approval event.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param tokenId The identifier for an NFT
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async setProxyApprovalAsync(
+ tokenAddress: string,
+ tokenId: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ const proxyAddress = this._erc721ProxyWrapper.getContractAddress();
+ const txHash = await this.setApprovalAsync(tokenAddress, proxyAddress, tokenId, txOpts);
+ return txHash;
+ }
+ /**
+ * Enable or disable approval for a third party ("operator") to manage all of `ownerAddress`'s assets.
+ * Throws if `_tokenId` is not a valid NFT
+ * Emits the ApprovalForAll event.
+ * @param tokenAddress The hex encoded contract Ethereum address where the ERC721 token is deployed.
+ * @param receiverAddress The hex encoded Ethereum address of the user to send the NFT to.
+ * @param senderAddress The hex encoded Ethereum address of the user to send the NFT to.
+ * @param tokenId The identifier for an NFT
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async transferFromAsync(
+ tokenAddress: string,
+ receiverAddress: string,
+ senderAddress: string,
+ tokenId: BigNumber,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.isETHAddressHex('receiverAddress', receiverAddress);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const normalizedReceiverAddress = receiverAddress.toLowerCase();
+ const normalizedSenderAddress = senderAddress.toLowerCase();
+ const tokenContract = await this._getTokenContractAsync(normalizedTokenAddress);
+ const ownerAddress = await this.getOwnerOfAsync(tokenAddress, tokenId);
+ if (normalizedSenderAddress !== ownerAddress) {
+ const isApprovedForAll = await this.isApprovedForAllAsync(
+ normalizedTokenAddress,
+ ownerAddress,
+ normalizedSenderAddress,
+ );
+ if (!isApprovedForAll) {
+ const approvedAddress = await this.getApprovedIfExistsAsync(normalizedTokenAddress, tokenId);
+ if (approvedAddress !== normalizedSenderAddress) {
+ throw new Error(ContractWrappersError.ERC721NoApproval);
+ }
+ }
+ }
+ const txHash = await tokenContract.transferFrom.sendTransactionAsync(
+ ownerAddress,
+ normalizedReceiverAddress,
+ tokenId,
+ removeUndefinedProperties({
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ from: normalizedSenderAddress,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Subscribe to an event type emitted by the Token contract.
+ * @param tokenAddress The hex encoded address where the ERC721 token is deployed.
+ * @param eventName The token contract event you would like to subscribe to.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
+ * @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
+ * @return Subscription token used later to unsubscribe
+ */
+ public subscribe<ArgsType extends ERC721TokenEventArgs>(
+ tokenAddress: string,
+ eventName: ERC721TokenEvents,
+ indexFilterValues: IndexedFilterValues,
+ callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
+ ): string {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.doesBelongToStringEnum('eventName', eventName, ERC721TokenEvents);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ assert.isFunction('callback', callback);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const subscriptionToken = this._subscribe<ArgsType>(
+ normalizedTokenAddress,
+ eventName,
+ indexFilterValues,
+ artifacts.ERC721Token.compilerOutput.abi,
+ callback,
+ isVerbose,
+ );
+ return subscriptionToken;
+ }
+ /**
+ * Cancel a subscription
+ * @param subscriptionToken Subscription token returned by `subscribe()`
+ */
+ public unsubscribe(subscriptionToken: string): void {
+ assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken);
+ this._unsubscribe(subscriptionToken);
+ }
+ /**
+ * Cancels all existing subscriptions
+ */
+ public unsubscribeAll(): void {
+ super._unsubscribeAll();
+ }
+ /**
+ * Gets historical logs without creating a subscription
+ * @param tokenAddress An address of the token that emitted the logs.
+ * @param eventName The token contract event you would like to subscribe to.
+ * @param blockRange Block range to get logs from.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
+ * @return Array of logs that match the parameters
+ */
+ public async getLogsAsync<ArgsType extends ERC721TokenEventArgs>(
+ tokenAddress: string,
+ eventName: ERC721TokenEvents,
+ blockRange: BlockRange,
+ indexFilterValues: IndexedFilterValues,
+ ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
+ assert.isETHAddressHex('tokenAddress', tokenAddress);
+ assert.doesBelongToStringEnum('eventName', eventName, ERC721TokenEvents);
+ assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ const logs = await this._getLogsAsync<ArgsType>(
+ normalizedTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ artifacts.ERC721Token.compilerOutput.abi,
+ );
+ return logs;
+ }
+ // HACK: We don't want this method to be visible to the other units within that package but not to the end user.
+ // TS doesn't give that possibility and therefore we make it private and access it over an any cast. Because of that tslint sees it as unused.
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstances(): void {
+ this.unsubscribeAll();
+ this._tokenContractsByAddress = {};
+ }
+ private async _getTokenContractAsync(tokenAddress: string): Promise<ERC721TokenContract> {
+ const normalizedTokenAddress = tokenAddress.toLowerCase();
+ let tokenContract = this._tokenContractsByAddress[normalizedTokenAddress];
+ if (!_.isUndefined(tokenContract)) {
+ return tokenContract;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.ERC721Token,
+ normalizedTokenAddress,
+ );
+ const contractInstance = new ERC721TokenContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ tokenContract = contractInstance;
+ this._tokenContractsByAddress[normalizedTokenAddress] = tokenContract;
+ return tokenContract;
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts
new file mode 100644
index 000000000..5046d3667
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/ether_token_wrapper.ts
@@ -0,0 +1,225 @@
+import { schemas } from '@0xproject/json-schemas';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi, LogWithDecodedArgs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { BlockRange, ContractWrappersError, EventCallback, IndexedFilterValues, TransactionOpts } from '../types';
+import { assert } from '../utils/assert';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ERC20TokenWrapper } from './erc20_token_wrapper';
+import { WETH9Contract, WETH9EventArgs, WETH9Events } from './generated/weth9';
+
+const removeUndefinedProperties = _.pickBy;
+
+/**
+ * This class includes all the functionality related to interacting with a wrapped Ether ERC20 token contract.
+ * The caller can convert ETH into the equivalent number of wrapped ETH ERC20 tokens and back.
+ */
+export class EtherTokenWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.EtherToken.compilerOutput.abi;
+ private _etherTokenContractsByAddress: {
+ [address: string]: WETH9Contract;
+ } = {};
+ private _erc20TokenWrapper: ERC20TokenWrapper;
+ constructor(
+ web3Wrapper: Web3Wrapper,
+ networkId: number,
+ erc20TokenWrapper: ERC20TokenWrapper,
+ blockPollingIntervalMs?: number,
+ ) {
+ super(web3Wrapper, networkId, blockPollingIntervalMs);
+ this._erc20TokenWrapper = erc20TokenWrapper;
+ }
+ /**
+ * Deposit ETH into the Wrapped ETH smart contract and issues the equivalent number of wrapped ETH tokens
+ * to the depositor address. These wrapped ETH tokens can be used in 0x trades and are redeemable for 1-to-1
+ * for ETH.
+ * @param etherTokenAddress EtherToken address you wish to deposit into.
+ * @param amountInWei Amount of ETH in Wei the caller wishes to deposit.
+ * @param depositor The hex encoded user Ethereum address that would like to make the deposit.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async depositAsync(
+ etherTokenAddress: string,
+ amountInWei: BigNumber,
+ depositor: string,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
+ assert.isValidBaseUnitAmount('amountInWei', amountInWei);
+ await assert.isSenderAddressAsync('depositor', depositor, this._web3Wrapper);
+ const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
+ const normalizedDepositorAddress = depositor.toLowerCase();
+
+ const ethBalanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(normalizedDepositorAddress);
+ assert.assert(ethBalanceInWei.gte(amountInWei), ContractWrappersError.InsufficientEthBalanceForDeposit);
+
+ const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
+ const txHash = await wethContract.deposit.sendTransactionAsync(
+ removeUndefinedProperties({
+ from: normalizedDepositorAddress,
+ value: amountInWei,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Withdraw ETH to the withdrawer's address from the wrapped ETH smart contract in exchange for the
+ * equivalent number of wrapped ETH tokens.
+ * @param etherTokenAddress EtherToken address you wish to withdraw from.
+ * @param amountInWei Amount of ETH in Wei the caller wishes to withdraw.
+ * @param withdrawer The hex encoded user Ethereum address that would like to make the withdrawal.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async withdrawAsync(
+ etherTokenAddress: string,
+ amountInWei: BigNumber,
+ withdrawer: string,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ assert.isValidBaseUnitAmount('amountInWei', amountInWei);
+ assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
+ await assert.isSenderAddressAsync('withdrawer', withdrawer, this._web3Wrapper);
+ const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
+ const normalizedWithdrawerAddress = withdrawer.toLowerCase();
+
+ const WETHBalanceInBaseUnits = await this._erc20TokenWrapper.getBalanceAsync(
+ normalizedEtherTokenAddress,
+ normalizedWithdrawerAddress,
+ );
+ assert.assert(
+ WETHBalanceInBaseUnits.gte(amountInWei),
+ ContractWrappersError.InsufficientWEthBalanceForWithdrawal,
+ );
+
+ const wethContract = await this._getEtherTokenContractAsync(normalizedEtherTokenAddress);
+ const txHash = await wethContract.withdraw.sendTransactionAsync(
+ amountInWei,
+ removeUndefinedProperties({
+ from: normalizedWithdrawerAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ }),
+ );
+ return txHash;
+ }
+ /**
+ * Gets historical logs without creating a subscription
+ * @param etherTokenAddress An address of the ether token that emitted the logs.
+ * @param eventName The ether token contract event you would like to subscribe to.
+ * @param blockRange Block range to get logs from.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
+ * @return Array of logs that match the parameters
+ */
+ public async getLogsAsync<ArgsType extends WETH9EventArgs>(
+ etherTokenAddress: string,
+ eventName: WETH9Events,
+ blockRange: BlockRange,
+ indexFilterValues: IndexedFilterValues,
+ ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
+ assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
+ const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
+ assert.doesBelongToStringEnum('eventName', eventName, WETH9Events);
+ assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ const logs = await this._getLogsAsync<ArgsType>(
+ normalizedEtherTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ artifacts.EtherToken.compilerOutput.abi,
+ );
+ return logs;
+ }
+ /**
+ * Subscribe to an event type emitted by the Token contract.
+ * @param etherTokenAddress The hex encoded address where the ether token is deployed.
+ * @param eventName The ether token contract event you would like to subscribe to.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{_owner: aUserAddressHex}`
+ * @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
+ * @return Subscription token used later to unsubscribe
+ */
+ public subscribe<ArgsType extends WETH9EventArgs>(
+ etherTokenAddress: string,
+ eventName: WETH9Events,
+ indexFilterValues: IndexedFilterValues,
+ callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
+ ): string {
+ assert.isETHAddressHex('etherTokenAddress', etherTokenAddress);
+ const normalizedEtherTokenAddress = etherTokenAddress.toLowerCase();
+ assert.doesBelongToStringEnum('eventName', eventName, WETH9Events);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ assert.isFunction('callback', callback);
+ const subscriptionToken = this._subscribe<ArgsType>(
+ normalizedEtherTokenAddress,
+ eventName,
+ indexFilterValues,
+ artifacts.EtherToken.compilerOutput.abi,
+ callback,
+ isVerbose,
+ );
+ return subscriptionToken;
+ }
+ /**
+ * Cancel a subscription
+ * @param subscriptionToken Subscription token returned by `subscribe()`
+ */
+ public unsubscribe(subscriptionToken: string): void {
+ assert.isValidSubscriptionToken('subscriptionToken', subscriptionToken);
+ this._unsubscribe(subscriptionToken);
+ }
+ /**
+ * Cancels all existing subscriptions
+ */
+ public unsubscribeAll(): void {
+ super._unsubscribeAll();
+ }
+ /**
+ * Retrieves the Ethereum address of the EtherToken contract deployed on the network
+ * that the user-passed web3 provider is connected to. If it's not Kovan, Ropsten, Rinkeby, Mainnet or TestRPC
+ * (networkId: 50), it will return undefined (e.g a private network).
+ * @returns The Ethereum address of the EtherToken contract or undefined.
+ */
+ public getContractAddressIfExists(): string | undefined {
+ const networkSpecificArtifact = artifacts.EtherToken.networks[this._networkId];
+ const contractAddressIfExists = _.isUndefined(networkSpecificArtifact)
+ ? undefined
+ : networkSpecificArtifact.address;
+ return contractAddressIfExists;
+ }
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstance(): void {
+ this.unsubscribeAll();
+ this._etherTokenContractsByAddress = {};
+ }
+ private async _getEtherTokenContractAsync(etherTokenAddress: string): Promise<WETH9Contract> {
+ let etherTokenContract = this._etherTokenContractsByAddress[etherTokenAddress];
+ if (!_.isUndefined(etherTokenContract)) {
+ return etherTokenContract;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.EtherToken,
+ etherTokenAddress,
+ );
+ const contractInstance = new WETH9Contract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ etherTokenContract = contractInstance;
+ this._etherTokenContractsByAddress[etherTokenAddress] = etherTokenContract;
+ return etherTokenContract;
+ }
+}
diff --git a/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts
new file mode 100644
index 000000000..48bd00f90
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/exchange_wrapper.ts
@@ -0,0 +1,1123 @@
+import { schemas } from '@0xproject/json-schemas';
+import { assetDataUtils } from '@0xproject/order-utils';
+import { AssetProxyId, Order, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi, LogWithDecodedArgs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { methodOptsSchema } from '../schemas/method_opts_schema';
+import { orderTxOptsSchema } from '../schemas/order_tx_opts_schema';
+import { txOptsSchema } from '../schemas/tx_opts_schema';
+import {
+ BlockRange,
+ EventCallback,
+ ExchangeWrapperError,
+ IndexedFilterValues,
+ MethodOpts,
+ OrderInfo,
+ OrderTransactionOpts,
+} from '../types';
+import { assert } from '../utils/assert';
+import { decorators } from '../utils/decorators';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ExchangeContract, ExchangeEventArgs, ExchangeEvents } from './generated/exchange';
+
+/**
+ * This class includes all the functionality related to calling methods, sending transactions and subscribing to
+ * events of the 0x V2 Exchange smart contract.
+ */
+export class ExchangeWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.Exchange.compilerOutput.abi;
+ private _exchangeContractIfExists?: ExchangeContract;
+ private _contractAddressIfExists?: string;
+ private _zrxContractAddressIfExists?: string;
+ constructor(
+ web3Wrapper: Web3Wrapper,
+ networkId: number,
+ contractAddressIfExists?: string,
+ zrxContractAddressIfExists?: string,
+ blockPollingIntervalMs?: number,
+ ) {
+ super(web3Wrapper, networkId, blockPollingIntervalMs);
+ this._contractAddressIfExists = contractAddressIfExists;
+ this._zrxContractAddressIfExists = zrxContractAddressIfExists;
+ }
+ /**
+ * Retrieve the address of an asset proxy by signature.
+ * @param proxyId The 4 bytes signature of an asset proxy
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The address of an asset proxy for a given signature
+ */
+ public async getAssetProxyBySignatureAsync(proxyId: AssetProxyId, methodOpts: MethodOpts = {}): Promise<string> {
+ assert.doesBelongToStringEnum('proxyId', proxyId, AssetProxyId);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeContract = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const assetProxy = await exchangeContract.getAssetProxy.callAsync(proxyId, txData, methodOpts.defaultBlock);
+ return assetProxy;
+ }
+ /**
+ * Retrieve the takerAssetAmount of an order that has already been filled.
+ * @param orderHash The hex encoded orderHash for which you would like to retrieve the filled takerAssetAmount.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return The amount of the order (in taker asset base units) that has already been filled.
+ */
+ public async getFilledTakerAssetAmountAsync(orderHash: string, methodOpts: MethodOpts = {}): Promise<BigNumber> {
+ assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeContract = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const filledTakerAssetAmountInBaseUnits = await exchangeContract.filled.callAsync(
+ orderHash,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return filledTakerAssetAmountInBaseUnits;
+ }
+ /**
+ * Retrieve the exchange contract version
+ * @param methodOpts Optional arguments this method accepts.
+ * @return Version
+ */
+ public async getVersionAsync(methodOpts: MethodOpts = {}): Promise<string> {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeContract = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const version = await exchangeContract.VERSION.callAsync(txData, methodOpts.defaultBlock);
+ return version;
+ }
+ /**
+ * Retrieve the set order epoch for a given makerAddress & senderAddress pair.
+ * Orders can be bulk cancelled by setting the order epoch to a value lower then the salt value of orders one wishes to cancel.
+ * @param makerAddress Maker address
+ * @param senderAddress Sender address
+ * @param methodOpts Optional arguments this method accepts.
+ * @return Order epoch. Defaults to 0.
+ */
+ public async getOrderEpochAsync(
+ makerAddress: string,
+ senderAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<BigNumber> {
+ assert.isETHAddressHex('makerAddress', makerAddress);
+ assert.isETHAddressHex('senderAddress', senderAddress);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeContract = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const orderEpoch = await exchangeContract.orderEpoch.callAsync(
+ makerAddress,
+ senderAddress,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return orderEpoch;
+ }
+ /**
+ * Check if an order has been cancelled. Order cancellations are binary
+ * @param orderHash The hex encoded orderHash for which you would like to retrieve the cancelled takerAmount.
+ * @param methodOpts Optional arguments this method accepts.
+ * @return Whether the order has been cancelled.
+ */
+ public async isCancelledAsync(orderHash: string, methodOpts: MethodOpts = {}): Promise<boolean> {
+ assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeContract = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const isCancelled = await exchangeContract.cancelled.callAsync(orderHash, txData, methodOpts.defaultBlock);
+ return isCancelled;
+ }
+ /**
+ * Fills a signed order with an amount denominated in baseUnits of the taker asset.
+ * @param signedOrder An object that conforms to the SignedOrder interface.
+ * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async fillOrderAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
+ assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.fillOrder.callAsync(signedOrder, takerAssetFillAmount, signedOrder.signature, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+
+ const txHash = await exchangeInstance.fillOrder.sendTransactionAsync(
+ signedOrder,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * No-throw version of fillOrderAsync. This version will not throw if the fill fails. This allows the caller to save gas at the expense of not knowing the reason the fill failed.
+ * @param signedOrder An object that conforms to the SignedOrder interface.
+ * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill this order.
+ * Must be available via the supplied Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async fillOrderNoThrowAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
+ assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.fillOrderNoThrow.callAsync(
+ signedOrder,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ }
+ const txHash = await exchangeInstance.fillOrderNoThrow.sendTransactionAsync(
+ signedOrder,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Attempts to fill a specific amount of an order. If the entire amount specified cannot be filled,
+ * the fill order is abandoned.
+ * @param signedOrder An object that conforms to the SignedOrder interface.
+ * @param takerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async fillOrKillOrderAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
+ assert.isValidBaseUnitAmount('takerAssetFillAmount', takerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.fillOrKillOrder.callAsync(signedOrder, takerAssetFillAmount, signedOrder.signature, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.fillOrKillOrder.sendTransactionAsync(
+ signedOrder,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Executes a 0x transaction. Transaction messages exist for the purpose of calling methods on the Exchange contract
+ * in the context of another address (see [ZEIP18](https://github.com/0xProject/ZEIPs/issues/18)).
+ * This is especially useful for implementing filter contracts.
+ * @param salt Salt
+ * @param signerAddress Signer address
+ * @param data Transaction data
+ * @param signature Signature
+ * @param senderAddress Sender address
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async executeTransactionAsync(
+ salt: BigNumber,
+ signerAddress: string,
+ data: string,
+ signature: string,
+ senderAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.isBigNumber('salt', salt);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ assert.isHexString('data', data);
+ assert.isHexString('signature', signature);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedSenderAddress = senderAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.executeTransaction.callAsync(salt, signerAddress, data, signature, {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.executeTransaction.sendTransactionAsync(
+ salt,
+ signerAddress,
+ data,
+ signature,
+ {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Batch version of fillOrderAsync. Executes multiple fills atomically in a single transaction.
+ * @param signedOrders An array of signed orders to fill.
+ * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async batchFillOrdersAsync(
+ signedOrders: SignedOrder[],
+ takerAssetFillAmounts: BigNumber[],
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ _.forEach(takerAssetFillAmounts, takerAssetFillAmount =>
+ assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount),
+ );
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.batchFillOrders.callAsync(signedOrders, takerAssetFillAmounts, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.batchFillOrders.sendTransactionAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Synchronously executes multiple calls to fillOrder until total amount of makerAsset is bought by taker.
+ * @param signedOrders An array of signed orders to fill.
+ * @param makerAssetFillAmount Maker asset fill amount.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async marketBuyOrdersAsync(
+ signedOrders: SignedOrder[],
+ makerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.marketBuyOrders.callAsync(signedOrders, makerAssetFillAmount, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.marketBuyOrders.sendTransactionAsync(
+ signedOrders,
+ makerAssetFillAmount,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Synchronously executes multiple calls to fillOrder until total amount of makerAsset is bought by taker.
+ * @param signedOrders An array of signed orders to fill.
+ * @param takerAssetFillAmount Taker asset fill amount.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async marketSellOrdersAsync(
+ signedOrders: SignedOrder[],
+ takerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.marketSellOrders.callAsync(signedOrders, takerAssetFillAmount, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.marketSellOrders.sendTransactionAsync(
+ signedOrders,
+ takerAssetFillAmount,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * No throw version of marketBuyOrdersAsync
+ * @param signedOrders An array of signed orders to fill.
+ * @param makerAssetFillAmount Maker asset fill amount.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async marketBuyOrdersNoThrowAsync(
+ signedOrders: SignedOrder[],
+ makerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.marketBuyOrdersNoThrow.callAsync(signedOrders, makerAssetFillAmount, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.marketBuyOrdersNoThrow.sendTransactionAsync(
+ signedOrders,
+ makerAssetFillAmount,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * No throw version of marketSellOrdersAsync
+ * @param signedOrders An array of signed orders to fill.
+ * @param takerAssetFillAmount Taker asset fill amount.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async marketSellOrdersNoThrowAsync(
+ signedOrders: SignedOrder[],
+ takerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.marketSellOrdersNoThrow.callAsync(signedOrders, takerAssetFillAmount, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.marketSellOrdersNoThrow.sendTransactionAsync(
+ signedOrders,
+ takerAssetFillAmount,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * No throw version of batchFillOrdersAsync
+ * @param signedOrders An array of signed orders to fill.
+ * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async batchFillOrdersNoThrowAsync(
+ signedOrders: SignedOrder[],
+ takerAssetFillAmounts: BigNumber[],
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ _.forEach(takerAssetFillAmounts, takerAssetFillAmount =>
+ assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount),
+ );
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.batchFillOrdersNoThrow.callAsync(signedOrders, takerAssetFillAmounts, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.batchFillOrdersNoThrow.sendTransactionAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Batch version of fillOrKillOrderAsync. Executes multiple fills atomically in a single transaction.
+ * @param signedOrders An array of signed orders to fill.
+ * @param takerAssetFillAmounts The amounts of the orders (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill these orders. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async batchFillOrKillOrdersAsync(
+ signedOrders: SignedOrder[],
+ takerAssetFillAmounts: BigNumber[],
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ _.forEach(takerAssetFillAmounts, takerAssetFillAmount =>
+ assert.isBigNumber('takerAssetFillAmount', takerAssetFillAmount),
+ );
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const signatures = _.map(signedOrders, signedOrder => signedOrder.signature);
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.batchFillOrKillOrders.callAsync(signedOrders, takerAssetFillAmounts, signatures, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.batchFillOrKillOrders.sendTransactionAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ signatures,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Batch version of cancelOrderAsync. Executes multiple cancels atomically in a single transaction.
+ * @param orders An array of orders to cancel.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async batchCancelOrdersAsync(
+ orders: Array<Order | SignedOrder>,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('orders', orders, schemas.ordersSchema);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const makerAddresses = _.map(orders, order => order.makerAddress);
+ const makerAddress = makerAddresses[0];
+ await assert.isSenderAddressAsync('makerAddress', makerAddress, this._web3Wrapper);
+ const normalizedMakerAddress = makerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.batchCancelOrders.callAsync(orders, {
+ from: normalizedMakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.batchCancelOrders.sendTransactionAsync(orders, {
+ from: normalizedMakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ return txHash;
+ }
+ /**
+ * Match two complementary orders that have a profitable spread.
+ * Each order is filled at their respective price point. However, the calculations are carried out as though
+ * the orders are both being filled at the right order's price point.
+ * The profit made by the left order goes to the taker (whoever matched the two orders).
+ * @param leftSignedOrder First order to match.
+ * @param rightSignedOrder Second order to match.
+ * @param takerAddress The address that sends the transaction and gets the spread.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async matchOrdersAsync(
+ leftSignedOrder: SignedOrder,
+ rightSignedOrder: SignedOrder,
+ takerAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('leftSignedOrder', leftSignedOrder, schemas.signedOrderSchema);
+ assert.doesConformToSchema('rightSignedOrder', rightSignedOrder, schemas.signedOrderSchema);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+ if (
+ rightSignedOrder.makerAssetData !== leftSignedOrder.takerAssetData ||
+ rightSignedOrder.takerAssetData !== leftSignedOrder.makerAssetData
+ ) {
+ throw new Error(ExchangeWrapperError.AssetDataMismatch);
+ } else {
+ // Smart contracts assigns the asset data from the left order to the right one so we can save gas on reducing the size of call data
+ rightSignedOrder.makerAssetData = '0x';
+ rightSignedOrder.takerAssetData = '0x';
+ }
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.matchOrders.callAsync(
+ leftSignedOrder,
+ rightSignedOrder,
+ leftSignedOrder.signature,
+ rightSignedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ }
+ const txHash = await exchangeInstance.matchOrders.sendTransactionAsync(
+ leftSignedOrder,
+ rightSignedOrder,
+ leftSignedOrder.signature,
+ rightSignedOrder.signature,
+ {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Approves a hash on-chain using any valid signature type.
+ * After presigning a hash, the preSign signature type will become valid for that hash and signer.
+ * @param hash Hash to pre-sign
+ * @param signerAddress Address that should have signed the given hash.
+ * @param signature Proof that the hash has been signed by signer.
+ * @param senderAddress Address that should send the transaction.
+ * @returns Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async preSignAsync(
+ hash: string,
+ signerAddress: string,
+ signature: string,
+ senderAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.isHexString('hash', hash);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ assert.isHexString('signature', signature);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedTakerAddress = senderAddress.toLowerCase();
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.preSign.callAsync(hash, signerAddress, signature, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.preSign.sendTransactionAsync(hash, signerAddress, signature, {
+ from: normalizedTakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ return txHash;
+ }
+ /**
+ * Checks if the signature is valid.
+ * @param hash Hash to pre-sign
+ * @param signerAddress Address that should have signed the given hash.
+ * @param signature Proof that the hash has been signed by signer.
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns If the signature is valid
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async isValidSignatureAsync(
+ hash: string,
+ signerAddress: string,
+ signature: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<boolean> {
+ assert.isHexString('hash', hash);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ assert.isHexString('signature', signature);
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const txData = {};
+ const isValidSignature = await exchangeInstance.isValidSignature.callAsync(
+ hash,
+ signerAddress,
+ signature,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return isValidSignature;
+ }
+ /**
+ * Checks if the validator is allowed by the signer.
+ * @param validatorAddress Address of a validator
+ * @param signerAddress Address of a signer
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns If the validator is allowed
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async isAllowedValidatorAsync(
+ signerAddress: string,
+ validatorAddress: string,
+ methodOpts: MethodOpts = {},
+ ): Promise<boolean> {
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ assert.isETHAddressHex('validatorAddress', validatorAddress);
+ if (!_.isUndefined(methodOpts)) {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ }
+ const normalizedSignerAddress = signerAddress.toLowerCase();
+ const normalizedValidatorAddress = validatorAddress.toLowerCase();
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const txData = {};
+ const isValidSignature = await exchangeInstance.allowedValidators.callAsync(
+ normalizedSignerAddress,
+ normalizedValidatorAddress,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return isValidSignature;
+ }
+ /**
+ * Check whether the hash is pre-signed on-chain.
+ * @param hash Hash to check if pre-signed
+ * @param signerAddress Address that should have signed the given hash.
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns Whether the hash is pre-signed.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async isPreSignedAsync(hash: string, signerAddress: string, methodOpts: MethodOpts = {}): Promise<boolean> {
+ assert.isHexString('hash', hash);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ if (!_.isUndefined(methodOpts)) {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ }
+ const exchangeInstance = await this._getExchangeContractAsync();
+
+ const txData = {};
+ const isPreSigned = await exchangeInstance.preSigned.callAsync(
+ hash,
+ signerAddress,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return isPreSigned;
+ }
+ /**
+ * Checks if transaction is already executed.
+ * @param transactionHash Transaction hash to check
+ * @param signerAddress Address that should have signed the given hash.
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns If transaction is already executed.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async isTransactionExecutedAsync(transactionHash: string, methodOpts: MethodOpts = {}): Promise<boolean> {
+ assert.isHexString('transactionHash', transactionHash);
+ if (!_.isUndefined(methodOpts)) {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ }
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const txData = {};
+ const isExecuted = await exchangeInstance.transactions.callAsync(
+ transactionHash,
+ txData,
+ methodOpts.defaultBlock,
+ );
+ return isExecuted;
+ }
+ /**
+ * Get order info
+ * @param order Order
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns Order info
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async getOrderInfoAsync(order: Order | SignedOrder, methodOpts: MethodOpts = {}): Promise<OrderInfo> {
+ assert.doesConformToSchema('order', order, schemas.orderSchema);
+ if (!_.isUndefined(methodOpts)) {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ }
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const txData = {};
+ const orderInfo = await exchangeInstance.getOrderInfo.callAsync(order, txData, methodOpts.defaultBlock);
+ return orderInfo;
+ }
+ /**
+ * Get order info for multiple orders
+ * @param orders Orders
+ * @param methodOpts Optional arguments this method accepts.
+ * @returns Array of Order infos
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async getOrdersInfoAsync(
+ orders: Array<Order | SignedOrder>,
+ methodOpts: MethodOpts = {},
+ ): Promise<OrderInfo[]> {
+ assert.doesConformToSchema('orders', orders, schemas.ordersSchema);
+ if (!_.isUndefined(methodOpts)) {
+ assert.doesConformToSchema('methodOpts', methodOpts, methodOptsSchema);
+ }
+ const exchangeInstance = await this._getExchangeContractAsync();
+ const txData = {};
+ const ordersInfo = await exchangeInstance.getOrdersInfo.callAsync(orders, txData, methodOpts.defaultBlock);
+ return ordersInfo;
+ }
+ /**
+ * Cancel a given order.
+ * @param order An object that conforms to the Order or SignedOrder interface. The order you would like to cancel.
+ * @param transactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async cancelOrderAsync(
+ order: Order | SignedOrder,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.doesConformToSchema('order', order, schemas.orderSchema);
+ await assert.isSenderAddressAsync('order.maker', order.makerAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedMakerAddress = order.makerAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.cancelOrder.callAsync(order, {
+ from: normalizedMakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.cancelOrder.sendTransactionAsync(order, {
+ from: normalizedMakerAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ return txHash;
+ }
+ /**
+ * Sets the signature validator approval
+ * @param validatorAddress Validator contract address.
+ * @param isApproved Boolean value to set approval to.
+ * @param senderAddress Sender address.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async setSignatureValidatorApprovalAsync(
+ validatorAddress: string,
+ isApproved: boolean,
+ senderAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.isETHAddressHex('validatorAddress', validatorAddress);
+ assert.isBoolean('isApproved', isApproved);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedSenderAddress = senderAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.setSignatureValidatorApproval.callAsync(validatorAddress, isApproved, {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.setSignatureValidatorApproval.sendTransactionAsync(
+ validatorAddress,
+ isApproved,
+ {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch
+ * and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).
+ * @param targetOrderEpoch Target order epoch.
+ * @param senderAddress Address that should send the transaction.
+ * @param orderTransactionOpts Optional arguments this method accepts.
+ * @return Transaction hash.
+ */
+ @decorators.asyncZeroExErrorHandler
+ public async cancelOrdersUpToAsync(
+ targetOrderEpoch: BigNumber,
+ senderAddress: string,
+ orderTransactionOpts: OrderTransactionOpts = { shouldValidate: true },
+ ): Promise<string> {
+ assert.isBigNumber('targetOrderEpoch', targetOrderEpoch);
+ await assert.isSenderAddressAsync('senderAddress', senderAddress, this._web3Wrapper);
+ assert.doesConformToSchema('orderTransactionOpts', orderTransactionOpts, orderTxOptsSchema, [txOptsSchema]);
+ const normalizedSenderAddress = senderAddress.toLowerCase();
+
+ const exchangeInstance = await this._getExchangeContractAsync();
+ if (orderTransactionOpts.shouldValidate) {
+ await exchangeInstance.cancelOrdersUpTo.callAsync(targetOrderEpoch, {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ }
+ const txHash = await exchangeInstance.cancelOrdersUpTo.sendTransactionAsync(targetOrderEpoch, {
+ from: normalizedSenderAddress,
+ gas: orderTransactionOpts.gasLimit,
+ gasPrice: orderTransactionOpts.gasPrice,
+ });
+ return txHash;
+ }
+ /**
+ * Subscribe to an event type emitted by the Exchange contract.
+ * @param eventName The exchange contract event you would like to subscribe to.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{maker: aUserAddressHex}`
+ * @param callback Callback that gets called when a log is added/removed
+ * @param isVerbose Enable verbose subscription warnings (e.g recoverable network issues encountered)
+ * @return Subscription token used later to unsubscribe
+ */
+ public subscribe<ArgsType extends ExchangeEventArgs>(
+ eventName: ExchangeEvents,
+ indexFilterValues: IndexedFilterValues,
+ callback: EventCallback<ArgsType>,
+ isVerbose: boolean = false,
+ ): string {
+ assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ assert.isFunction('callback', callback);
+ const exchangeContractAddress = this.getContractAddress();
+ const subscriptionToken = this._subscribe<ArgsType>(
+ exchangeContractAddress,
+ eventName,
+ indexFilterValues,
+ artifacts.Exchange.compilerOutput.abi,
+ callback,
+ isVerbose,
+ );
+ return subscriptionToken;
+ }
+ /**
+ * Cancel a subscription
+ * @param subscriptionToken Subscription token returned by `subscribe()`
+ */
+ public unsubscribe(subscriptionToken: string): void {
+ this._unsubscribe(subscriptionToken);
+ }
+ /**
+ * Cancels all existing subscriptions
+ */
+ public unsubscribeAll(): void {
+ super._unsubscribeAll();
+ }
+ /**
+ * Gets historical logs without creating a subscription
+ * @param eventName The exchange contract event you would like to subscribe to.
+ * @param blockRange Block range to get logs from.
+ * @param indexFilterValues An object where the keys are indexed args returned by the event and
+ * the value is the value you are interested in. E.g `{_from: aUserAddressHex}`
+ * @return Array of logs that match the parameters
+ */
+ public async getLogsAsync<ArgsType extends ExchangeEventArgs>(
+ eventName: ExchangeEvents,
+ blockRange: BlockRange,
+ indexFilterValues: IndexedFilterValues,
+ ): Promise<Array<LogWithDecodedArgs<ArgsType>>> {
+ assert.doesBelongToStringEnum('eventName', eventName, ExchangeEvents);
+ assert.doesConformToSchema('blockRange', blockRange, schemas.blockRangeSchema);
+ assert.doesConformToSchema('indexFilterValues', indexFilterValues, schemas.indexFilterValuesSchema);
+ const exchangeContractAddress = this.getContractAddress();
+ const logs = await this._getLogsAsync<ArgsType>(
+ exchangeContractAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ artifacts.Exchange.compilerOutput.abi,
+ );
+ return logs;
+ }
+ /**
+ * Retrieves the Ethereum address of the Exchange contract deployed on the network
+ * that the user-passed web3 provider is connected to.
+ * @returns The Ethereum address of the Exchange contract being used.
+ */
+ public getContractAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.Exchange, this._contractAddressIfExists);
+ return contractAddress;
+ }
+ /**
+ * Returns the ZRX token address used by the exchange contract.
+ * @return Address of ZRX token
+ */
+ public getZRXTokenAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.ZRXToken, this._zrxContractAddressIfExists);
+ return contractAddress;
+ }
+ /**
+ * Returns the ZRX asset data used by the exchange contract.
+ * @return ZRX asset data
+ */
+ public getZRXAssetData(): string {
+ const zrxTokenAddress = this.getZRXTokenAddress();
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxTokenAddress);
+ return zrxAssetData;
+ }
+ // tslint:disable:no-unused-variable
+ private _invalidateContractInstances(): void {
+ this.unsubscribeAll();
+ delete this._exchangeContractIfExists;
+ }
+ // tslint:enable:no-unused-variable
+ private async _getExchangeContractAsync(): Promise<ExchangeContract> {
+ if (!_.isUndefined(this._exchangeContractIfExists)) {
+ return this._exchangeContractIfExists;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.Exchange,
+ this._contractAddressIfExists,
+ );
+ const contractInstance = new ExchangeContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ this._exchangeContractIfExists = contractInstance;
+ return this._exchangeContractIfExists;
+ }
+} // tslint:disable:max-file-line-count
diff --git a/packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts b/packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts
new file mode 100644
index 000000000..13ef0fe01
--- /dev/null
+++ b/packages/contract-wrappers/src/contract_wrappers/forwarder_wrapper.ts
@@ -0,0 +1,220 @@
+import { schemas } from '@0xproject/json-schemas';
+import { AssetProxyId, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { ContractAbi } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { orderTxOptsSchema } from '../schemas/order_tx_opts_schema';
+import { txOptsSchema } from '../schemas/tx_opts_schema';
+import { TransactionOpts } from '../types';
+import { assert } from '../utils/assert';
+import { calldataOptimizationUtils } from '../utils/calldata_optimization_utils';
+import { constants } from '../utils/constants';
+
+import { ContractWrapper } from './contract_wrapper';
+import { ForwarderContract } from './generated/forwarder';
+
+/**
+ * This class includes the functionality related to interacting with the Forwarder contract.
+ */
+export class ForwarderWrapper extends ContractWrapper {
+ public abi: ContractAbi = artifacts.Forwarder.compilerOutput.abi;
+ private _forwarderContractIfExists?: ForwarderContract;
+ private _contractAddressIfExists?: string;
+ private _zrxContractAddressIfExists?: string;
+ constructor(
+ web3Wrapper: Web3Wrapper,
+ networkId: number,
+ contractAddressIfExists?: string,
+ zrxContractAddressIfExists?: string,
+ ) {
+ super(web3Wrapper, networkId);
+ this._contractAddressIfExists = contractAddressIfExists;
+ this._zrxContractAddressIfExists = zrxContractAddressIfExists;
+ }
+ /**
+ * Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.
+ * Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.
+ * 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).
+ * Any ETH not spent will be refunded to sender.
+ * @param signedOrders An array of objects that conform to the SignedOrder interface. All orders must specify the same makerAsset.
+ * All orders must specify WETH as the takerAsset
+ * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param ethAmount The amount of eth to send with the transaction (in wei).
+ * @param signedFeeOrders An array of objects that conform to the SignedOrder interface. All orders must specify ZRX as makerAsset and WETH as takerAsset.
+ * Used to purchase ZRX for primary order fees.
+ * @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ * Defaults to 0.
+ * @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async marketSellOrdersWithEthAsync(
+ signedOrders: SignedOrder[],
+ takerAddress: string,
+ ethAmount: BigNumber,
+ signedFeeOrders: SignedOrder[] = [],
+ feePercentage: BigNumber = constants.ZERO_AMOUNT,
+ feeRecipientAddress: string = constants.NULL_ADDRESS,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ // type assertions
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.isBigNumber('ethAmount', ethAmount);
+ assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('feePercentage', feePercentage);
+ assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ // other assertions
+ assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
+ assert.feeOrdersCanBeUsedForForwarderContract(
+ signedFeeOrders,
+ this.getZRXTokenAddress(),
+ this.getEtherTokenAddress(),
+ );
+ // lowercase input addresses
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+ const normalizedFeeRecipientAddress = feeRecipientAddress.toLowerCase();
+ // optimize orders
+ const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
+ const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
+ // send transaction
+ const forwarderContractInstance = await this._getForwarderContractAsync();
+ const txHash = await forwarderContractInstance.marketSellOrdersWithEth.sendTransactionAsync(
+ optimizedMarketOrders,
+ _.map(optimizedMarketOrders, order => order.signature),
+ optimizedFeeOrders,
+ _.map(optimizedFeeOrders, order => order.signature),
+ feePercentage,
+ feeRecipientAddress,
+ {
+ value: ethAmount,
+ from: normalizedTakerAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Attempt to purchase makerAssetFillAmount of makerAsset by selling ethAmount provided with transaction.
+ * Any ZRX required to pay fees for primary orders will automatically be purchased by the contract.
+ * Any ETH not spent will be refunded to sender.
+ * @param signedOrders An array of objects that conform to the SignedOrder interface. All orders must specify the same makerAsset.
+ * All orders must specify WETH as the takerAsset
+ * @param makerAssetFillAmount The amount of the order (in taker asset baseUnits) that you wish to fill.
+ * @param takerAddress The user Ethereum address who would like to fill this order. Must be available via the supplied
+ * Provider provided at instantiation.
+ * @param ethAmount The amount of eth to send with the transaction (in wei).
+ * @param signedFeeOrders An array of objects that conform to the SignedOrder interface. All orders must specify ZRX as makerAsset and WETH as takerAsset.
+ * Used to purchase ZRX for primary order fees.
+ * @param feePercentage The percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ * Defaults to 0.
+ * @param feeRecipientAddress The address that will receive ETH when signedFeeOrders are filled.
+ * @param txOpts Transaction parameters.
+ * @return Transaction hash.
+ */
+ public async marketBuyOrdersWithEthAsync(
+ signedOrders: SignedOrder[],
+ makerAssetFillAmount: BigNumber,
+ takerAddress: string,
+ ethAmount: BigNumber,
+ signedFeeOrders: SignedOrder[] = [],
+ feePercentage: BigNumber = constants.ZERO_AMOUNT,
+ feeRecipientAddress: string = constants.NULL_ADDRESS,
+ txOpts: TransactionOpts = {},
+ ): Promise<string> {
+ // type assertions
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('makerAssetFillAmount', makerAssetFillAmount);
+ await assert.isSenderAddressAsync('takerAddress', takerAddress, this._web3Wrapper);
+ assert.isBigNumber('ethAmount', ethAmount);
+ assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
+ assert.isBigNumber('feePercentage', feePercentage);
+ assert.isETHAddressHex('feeRecipientAddress', feeRecipientAddress);
+ assert.doesConformToSchema('txOpts', txOpts, txOptsSchema);
+ // other assertions
+ assert.ordersCanBeUsedForForwarderContract(signedOrders, this.getEtherTokenAddress());
+ assert.feeOrdersCanBeUsedForForwarderContract(
+ signedFeeOrders,
+ this.getZRXTokenAddress(),
+ this.getEtherTokenAddress(),
+ );
+ // lowercase input addresses
+ const normalizedTakerAddress = takerAddress.toLowerCase();
+ const normalizedFeeRecipientAddress = feeRecipientAddress.toLowerCase();
+ // optimize orders
+ const optimizedMarketOrders = calldataOptimizationUtils.optimizeForwarderOrders(signedOrders);
+ const optimizedFeeOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(signedFeeOrders);
+ // send transaction
+ const forwarderContractInstance = await this._getForwarderContractAsync();
+ const txHash = await forwarderContractInstance.marketBuyOrdersWithEth.sendTransactionAsync(
+ optimizedMarketOrders,
+ makerAssetFillAmount,
+ _.map(optimizedMarketOrders, order => order.signature),
+ optimizedFeeOrders,
+ _.map(optimizedFeeOrders, order => order.signature),
+ feePercentage,
+ feeRecipientAddress,
+ {
+ value: ethAmount,
+ from: normalizedTakerAddress,
+ gas: txOpts.gasLimit,
+ gasPrice: txOpts.gasPrice,
+ },
+ );
+ return txHash;
+ }
+ /**
+ * Retrieves the Ethereum address of the Forwarder contract deployed on the network
+ * that the user-passed web3 provider is connected to.
+ * @returns The Ethereum address of the Forwarder contract being used.
+ */
+ public getContractAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.Forwarder, this._contractAddressIfExists);
+ return contractAddress;
+ }
+ /**
+ * Returns the ZRX token address used by the forwarder contract.
+ * @return Address of ZRX token
+ */
+ public getZRXTokenAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.ZRXToken, this._zrxContractAddressIfExists);
+ return contractAddress;
+ }
+ /**
+ * Returns the Ether token address used by the forwarder contract.
+ * @return Address of Ether token
+ */
+ public getEtherTokenAddress(): string {
+ const contractAddress = this._getContractAddress(artifacts.EtherToken);
+ return contractAddress;
+ }
+ // HACK: We don't want this method to be visible to the other units within that package but not to the end user.
+ // TS doesn't give that possibility and therefore we make it private and access it over an any cast. Because of that tslint sees it as unused.
+ // tslint:disable-next-line:no-unused-variable
+ private _invalidateContractInstance(): void {
+ delete this._forwarderContractIfExists;
+ }
+ private async _getForwarderContractAsync(): Promise<ForwarderContract> {
+ if (!_.isUndefined(this._forwarderContractIfExists)) {
+ return this._forwarderContractIfExists;
+ }
+ const [abi, address] = await this._getContractAbiAndAddressFromArtifactsAsync(
+ artifacts.Forwarder,
+ this._contractAddressIfExists,
+ );
+ const contractInstance = new ForwarderContract(
+ abi,
+ address,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ this._forwarderContractIfExists = contractInstance;
+ return this._forwarderContractIfExists;
+ }
+}
diff --git a/packages/contract-wrappers/src/globals.d.ts b/packages/contract-wrappers/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/contract-wrappers/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/contract-wrappers/src/index.ts b/packages/contract-wrappers/src/index.ts
new file mode 100644
index 000000000..1986e0004
--- /dev/null
+++ b/packages/contract-wrappers/src/index.ts
@@ -0,0 +1,82 @@
+export { ContractWrappers } from './contract_wrappers';
+export { ERC20TokenWrapper } from './contract_wrappers/erc20_token_wrapper';
+export { ERC721TokenWrapper } from './contract_wrappers/erc721_token_wrapper';
+export { EtherTokenWrapper } from './contract_wrappers/ether_token_wrapper';
+export { ExchangeWrapper } from './contract_wrappers/exchange_wrapper';
+export { ERC20ProxyWrapper } from './contract_wrappers/erc20_proxy_wrapper';
+export { ERC721ProxyWrapper } from './contract_wrappers/erc721_proxy_wrapper';
+export { ForwarderWrapper } from './contract_wrappers/forwarder_wrapper';
+
+export {
+ ContractWrappersError,
+ EventCallback,
+ ContractEvent,
+ Token,
+ IndexedFilterValues,
+ BlockRange,
+ OrderFillRequest,
+ ContractEventArgs,
+ ContractWrappersConfig,
+ MethodOpts,
+ OrderTransactionOpts,
+ TransactionOpts,
+ LogEvent,
+ DecodedLogEvent,
+ OnOrderStateChangeCallback,
+ OrderStatus,
+ OrderInfo,
+} from './types';
+
+export {
+ Order,
+ SignedOrder,
+ ECSignature,
+ OrderStateValid,
+ OrderStateInvalid,
+ OrderState,
+ AssetProxyId,
+} from '@0xproject/types';
+
+export {
+ BlockParamLiteral,
+ FilterObject,
+ BlockParam,
+ ContractEventArg,
+ LogWithDecodedArgs,
+ Provider,
+ TransactionReceipt,
+ TransactionReceiptWithDecodedLogs,
+} from 'ethereum-types';
+
+export {
+ WETH9Events,
+ WETH9WithdrawalEventArgs,
+ WETH9ApprovalEventArgs,
+ WETH9EventArgs,
+ WETH9DepositEventArgs,
+ WETH9TransferEventArgs,
+} from './contract_wrappers/generated/weth9';
+
+export {
+ ERC20TokenTransferEventArgs,
+ ERC20TokenApprovalEventArgs,
+ ERC20TokenEvents,
+ ERC20TokenEventArgs,
+} from './contract_wrappers/generated/erc20_token';
+
+export {
+ ERC721TokenApprovalEventArgs,
+ ERC721TokenApprovalForAllEventArgs,
+ ERC721TokenTransferEventArgs,
+ ERC721TokenEvents,
+ ERC721TokenEventArgs,
+} from './contract_wrappers/generated/erc721_token';
+
+export {
+ ExchangeCancelUpToEventArgs,
+ ExchangeAssetProxyRegisteredEventArgs,
+ ExchangeFillEventArgs,
+ ExchangeCancelEventArgs,
+ ExchangeEventArgs,
+ ExchangeEvents,
+} from './contract_wrappers/generated/exchange';
diff --git a/packages/deployer/src/monorepo_scripts/postpublish.ts b/packages/contract-wrappers/src/monorepo_scripts/postpublish.ts
index dcb99d0f7..dcb99d0f7 100644
--- a/packages/deployer/src/monorepo_scripts/postpublish.ts
+++ b/packages/contract-wrappers/src/monorepo_scripts/postpublish.ts
diff --git a/packages/contract-wrappers/src/schemas/contract_wrappers_config_schema.ts b/packages/contract-wrappers/src/schemas/contract_wrappers_config_schema.ts
new file mode 100644
index 000000000..ac248b2d4
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/contract_wrappers_config_schema.ts
@@ -0,0 +1,5 @@
+export const ContractWrappersConfigSchema = {
+ id: '/ContractWrappersConfig',
+ oneOf: [{ $ref: '/ZeroExContractPrivateNetworkConfig' }, { $ref: '/ZeroExContractPublicNetworkConfig' }],
+ type: 'object',
+};
diff --git a/packages/contract-wrappers/src/schemas/contract_wrappers_private_network_config_schema.ts b/packages/contract-wrappers/src/schemas/contract_wrappers_private_network_config_schema.ts
new file mode 100644
index 000000000..904690ae7
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/contract_wrappers_private_network_config_schema.ts
@@ -0,0 +1,36 @@
+export const contractWrappersPrivateNetworkConfigSchema = {
+ id: '/ZeroExContractPrivateNetworkConfig',
+ properties: {
+ networkId: {
+ type: 'number',
+ minimum: 1,
+ },
+ gasPrice: { $ref: '/numberSchema' },
+ zrxContractAddress: { $ref: '/addressSchema' },
+ exchangeContractAddress: { $ref: '/addressSchema' },
+ erc20ProxyContractAddress: { $ref: '/addressSchema' },
+ erc721ProxyContractAddress: { $ref: '/addressSchema' },
+ blockPollingIntervalMs: { type: 'number' },
+ orderWatcherConfig: {
+ type: 'object',
+ properties: {
+ pollingIntervalMs: {
+ type: 'number',
+ minimum: 0,
+ },
+ numConfirmations: {
+ type: 'number',
+ minimum: 0,
+ },
+ },
+ },
+ },
+ type: 'object',
+ required: [
+ 'networkId',
+ 'zrxContractAddress',
+ 'exchangeContractAddress',
+ 'erc20ProxyContractAddress',
+ 'erc721ProxyContractAddress',
+ ],
+};
diff --git a/packages/contract-wrappers/src/schemas/contract_wrappers_public_network_config_schema.ts b/packages/contract-wrappers/src/schemas/contract_wrappers_public_network_config_schema.ts
new file mode 100644
index 000000000..5cd008ae0
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/contract_wrappers_public_network_config_schema.ts
@@ -0,0 +1,44 @@
+const networkNameToId: { [networkName: string]: number } = {
+ mainnet: 1,
+ ropsten: 3,
+ rinkeby: 4,
+ kovan: 42,
+ ganache: 50,
+};
+
+export const contractWrappersPublicNetworkConfigSchema = {
+ id: '/ZeroExContractPublicNetworkConfig',
+ properties: {
+ networkId: {
+ type: 'number',
+ enum: [
+ networkNameToId.mainnet,
+ networkNameToId.kovan,
+ networkNameToId.ropsten,
+ networkNameToId.rinkeby,
+ networkNameToId.ganache,
+ ],
+ },
+ gasPrice: { $ref: '/numberSchema' },
+ zrxContractAddress: { $ref: '/addressSchema' },
+ exchangeContractAddress: { $ref: '/addressSchema' },
+ erc20ProxyContractAddress: { $ref: '/addressSchema' },
+ erc721ProxyContractAddress: { $ref: '/addressSchema' },
+ blockPollingIntervalMs: { type: 'number' },
+ orderWatcherConfig: {
+ type: 'object',
+ properties: {
+ pollingIntervalMs: {
+ type: 'number',
+ minimum: 0,
+ },
+ numConfirmations: {
+ type: 'number',
+ minimum: 0,
+ },
+ },
+ },
+ },
+ type: 'object',
+ required: ['networkId'],
+};
diff --git a/packages/contract-wrappers/src/schemas/method_opts_schema.ts b/packages/contract-wrappers/src/schemas/method_opts_schema.ts
new file mode 100644
index 000000000..83003f818
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/method_opts_schema.ts
@@ -0,0 +1,7 @@
+export const methodOptsSchema = {
+ id: '/MethodOpts',
+ properties: {
+ defaultBlock: { $ref: '/blockParamSchema' },
+ },
+ type: 'object',
+};
diff --git a/packages/contract-wrappers/src/schemas/order_tx_opts_schema.ts b/packages/contract-wrappers/src/schemas/order_tx_opts_schema.ts
new file mode 100644
index 000000000..31ad759d5
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/order_tx_opts_schema.ts
@@ -0,0 +1,8 @@
+export const orderTxOptsSchema = {
+ id: '/OrderTxOpts',
+ allOf: [{ $ref: '/TxOpts' }],
+ properties: {
+ shouldValidate: { type: 'boolean' },
+ },
+ type: 'object',
+};
diff --git a/packages/contract-wrappers/src/schemas/tx_opts_schema.ts b/packages/contract-wrappers/src/schemas/tx_opts_schema.ts
new file mode 100644
index 000000000..83c819be2
--- /dev/null
+++ b/packages/contract-wrappers/src/schemas/tx_opts_schema.ts
@@ -0,0 +1,8 @@
+export const txOptsSchema = {
+ id: '/TxOpts',
+ properties: {
+ gasPrice: { $ref: '/numberSchema' },
+ gasLimit: { type: 'number' },
+ },
+ type: 'object',
+};
diff --git a/packages/contract-wrappers/src/types.ts b/packages/contract-wrappers/src/types.ts
new file mode 100644
index 000000000..2b3cdc591
--- /dev/null
+++ b/packages/contract-wrappers/src/types.ts
@@ -0,0 +1,190 @@
+import { BigNumber } from '@0xproject/utils';
+
+import { OrderState, SignedOrder } from '@0xproject/types';
+import { BlockParam, ContractEventArg, DecodedLogArgs, LogEntryEvent, LogWithDecodedArgs } from 'ethereum-types';
+
+import { ERC20TokenEventArgs, ERC20TokenEvents } from './contract_wrappers/generated/erc20_token';
+import { ERC721TokenEventArgs, ERC721TokenEvents } from './contract_wrappers/generated/erc721_token';
+import { ExchangeEventArgs, ExchangeEvents } from './contract_wrappers/generated/exchange';
+import { WETH9EventArgs, WETH9Events } from './contract_wrappers/generated/weth9';
+
+export enum ExchangeWrapperError {
+ AssetDataMismatch = 'ASSET_DATA_MISMATCH',
+}
+
+export enum ContractWrappersError {
+ ExchangeContractDoesNotExist = 'EXCHANGE_CONTRACT_DOES_NOT_EXIST',
+ ZRXContractDoesNotExist = 'ZRX_CONTRACT_DOES_NOT_EXIST',
+ EtherTokenContractDoesNotExist = 'ETHER_TOKEN_CONTRACT_DOES_NOT_EXIST',
+ ERC20ProxyContractDoesNotExist = 'ERC20_PROXY_CONTRACT_DOES_NOT_EXIST',
+ ERC721ProxyContractDoesNotExist = 'ERC721_PROXY_CONTRACT_DOES_NOT_EXIST',
+ ERC20TokenContractDoesNotExist = 'ERC20_TOKEN_CONTRACT_DOES_NOT_EXIST',
+ ERC721TokenContractDoesNotExist = 'ERC721_TOKEN_CONTRACT_DOES_NOT_EXIST',
+ ContractNotDeployedOnNetwork = 'CONTRACT_NOT_DEPLOYED_ON_NETWORK',
+ InsufficientAllowanceForTransfer = 'INSUFFICIENT_ALLOWANCE_FOR_TRANSFER',
+ InsufficientBalanceForTransfer = 'INSUFFICIENT_BALANCE_FOR_TRANSFER',
+ InsufficientEthBalanceForDeposit = 'INSUFFICIENT_ETH_BALANCE_FOR_DEPOSIT',
+ InsufficientWEthBalanceForWithdrawal = 'INSUFFICIENT_WETH_BALANCE_FOR_WITHDRAWAL',
+ InvalidJump = 'INVALID_JUMP',
+ OutOfGas = 'OUT_OF_GAS',
+ SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
+ SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
+ ERC721OwnerNotFound = 'ERC_721_OWNER_NOT_FOUND',
+ ERC721NoApproval = 'ERC_721_NO_APPROVAL',
+}
+
+export enum InternalContractWrappersError {
+ NoAbiDecoder = 'NO_ABI_DECODER',
+}
+
+export type LogEvent = LogEntryEvent;
+export interface DecodedLogEvent<ArgsType extends DecodedLogArgs> {
+ isRemoved: boolean;
+ log: LogWithDecodedArgs<ArgsType>;
+}
+
+export type EventCallback<ArgsType extends DecodedLogArgs> = (
+ err: null | Error,
+ log?: DecodedLogEvent<ArgsType>,
+) => void;
+
+export interface ContractEvent {
+ logIndex: number;
+ transactionIndex: number;
+ transactionHash: string;
+ blockHash: string;
+ blockNumber: number;
+ address: string;
+ type: string;
+ event: string;
+ args: ContractEventArgs;
+}
+
+export type ContractEventArgs = ExchangeEventArgs | ERC20TokenEventArgs | ERC721TokenEventArgs | WETH9EventArgs;
+
+// [address, name, symbol, decimals, ipfsHash, swarmHash]
+export type TokenMetadata = [string, string, string, number, string, string];
+
+export interface Token {
+ name: string;
+ address: string;
+ symbol: string;
+ decimals: number;
+}
+
+export interface TxOpts {
+ from: string;
+ gas?: number;
+ value?: BigNumber;
+ gasPrice?: BigNumber;
+}
+
+export interface TokenAddressBySymbol {
+ [symbol: string]: string;
+}
+
+export type ContractEvents = ERC20TokenEvents | ERC721TokenEvents | ExchangeEvents | WETH9Events;
+
+export interface IndexedFilterValues {
+ [index: string]: ContractEventArg;
+}
+
+export interface BlockRange {
+ fromBlock: BlockParam;
+ toBlock: BlockParam;
+}
+
+export interface OrderFillRequest {
+ signedOrder: SignedOrder;
+ takerAssetFillAmount: BigNumber;
+}
+
+export type AsyncMethod = (...args: any[]) => Promise<any>;
+export type SyncMethod = (...args: any[]) => any;
+
+/**
+ * networkId: The id of the underlying ethereum network your provider is connected to. (1-mainnet, 3-ropsten, 4-rinkeby, 42-kovan, 50-testrpc)
+ * gasPrice: Gas price to use with every transaction
+ * exchangeContractAddress: The address of an exchange contract to use
+ * zrxContractAddress: The address of the ZRX contract to use
+ * erc20ProxyContractAddress: The address of the erc20 token transfer proxy contract to use
+ * erc721ProxyContractAddress: The address of the erc721 token transfer proxy contract to use
+ * forwarderContractAddress: The address of the forwarder contract to use
+ * orderWatcherConfig: All the configs related to the orderWatcher
+ * blockPollingIntervalMs: The interval to use for block polling in event watching methods (defaults to 1000)
+ */
+export interface ContractWrappersConfig {
+ networkId: number;
+ gasPrice?: BigNumber;
+ exchangeContractAddress?: string;
+ zrxContractAddress?: string;
+ erc20ProxyContractAddress?: string;
+ erc721ProxyContractAddress?: string;
+ forwarderContractAddress?: string;
+ blockPollingIntervalMs?: number;
+}
+
+/**
+ * expectedFillTakerTokenAmount: If specified, the validation method will ensure that the
+ * supplied order maker has a sufficient allowance/balance to fill this amount of the order's
+ * takerTokenAmount. If not specified, the validation method ensures that the maker has a sufficient
+ * allowance/balance to fill the entire remaining order amount.
+ */
+export interface ValidateOrderFillableOpts {
+ expectedFillTakerTokenAmount?: BigNumber;
+}
+
+/**
+ * defaultBlock: The block up to which to query the blockchain state. Setting this to a historical block number
+ * let's the user query the blockchain's state at an arbitrary point in time. In order for this to work, the
+ * backing Ethereum node must keep the entire historical state of the chain (e.g setting `--pruning=archive`
+ * flag when running Parity).
+ */
+export interface MethodOpts {
+ defaultBlock?: BlockParam;
+}
+
+/**
+ * gasPrice: Gas price in Wei to use for a transaction
+ * gasLimit: The amount of gas to send with a transaction (in Gwei)
+ */
+export interface TransactionOpts {
+ gasPrice?: BigNumber;
+ gasLimit?: number;
+}
+
+/**
+ * shouldValidate: Flag indicating whether the library should make attempts to validate a transaction before
+ * broadcasting it. For example, order has a valid signature, maker has sufficient funds, etc. Default=true.
+ */
+export interface OrderTransactionOpts extends TransactionOpts {
+ shouldValidate?: boolean;
+}
+
+export enum TradeSide {
+ Maker = 'maker',
+ Taker = 'taker',
+}
+
+export enum TransferType {
+ Trade = 'trade',
+ Fee = 'fee',
+}
+
+export type OnOrderStateChangeCallback = (err: Error | null, orderState?: OrderState) => void;
+
+export interface OrderInfo {
+ orderStatus: OrderStatus;
+ orderHash: string;
+ orderTakerAssetFilledAmount: BigNumber;
+}
+
+export enum OrderStatus {
+ INVALID = 0,
+ INVALID_MAKER_ASSET_AMOUNT,
+ INVALID_TAKER_ASSET_AMOUNT,
+ FILLABLE,
+ EXPIRED,
+ FULLY_FILLED,
+ CANCELLED,
+}
diff --git a/packages/contract-wrappers/src/utils/assert.ts b/packages/contract-wrappers/src/utils/assert.ts
new file mode 100644
index 000000000..183642170
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/assert.ts
@@ -0,0 +1,90 @@
+import { assert as sharedAssert } from '@0xproject/assert';
+// HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here
+import { Schema } from '@0xproject/json-schemas'; // tslint:disable-line:no-unused-variable
+import { assetDataUtils, isValidSignatureAsync } from '@0xproject/order-utils';
+import { ECSignature, Order } from '@0xproject/types'; // tslint:disable-line:no-unused-variable
+import { BigNumber } from '@0xproject/utils'; // tslint:disable-line:no-unused-variable
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+
+export const assert = {
+ ...sharedAssert,
+ async isValidSignatureAsync(
+ provider: Provider,
+ orderHash: string,
+ signature: string,
+ signerAddress: string,
+ ): Promise<void> {
+ const isValid = await isValidSignatureAsync(provider, orderHash, signature, signerAddress);
+ sharedAssert.assert(isValid, `Expected order with hash '${orderHash}' to have a valid signature`);
+ },
+ isValidSubscriptionToken(variableName: string, subscriptionToken: string): void {
+ const uuidRegex = new RegExp('^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$');
+ const isValid = uuidRegex.test(subscriptionToken);
+ sharedAssert.assert(isValid, `Expected ${variableName} to be a valid subscription token`);
+ },
+ async isSenderAddressAsync(
+ variableName: string,
+ senderAddressHex: string,
+ web3Wrapper: Web3Wrapper,
+ ): Promise<void> {
+ sharedAssert.isETHAddressHex(variableName, senderAddressHex);
+ const isSenderAddressAvailable = await web3Wrapper.isSenderAddressAvailableAsync(senderAddressHex);
+ sharedAssert.assert(
+ isSenderAddressAvailable,
+ `Specified ${variableName} ${senderAddressHex} isn't available through the supplied web3 provider`,
+ );
+ },
+ ordersCanBeUsedForForwarderContract(orders: Order[], etherTokenAddress: string): void {
+ sharedAssert.assert(!_.isEmpty(orders), 'Expected at least 1 signed order. Found no orders');
+ assert.ordersHaveAtMostOneUniqueValueForProperty(orders, 'makerAssetData');
+ assert.allTakerAssetDatasAreErc20Token(orders, etherTokenAddress);
+ assert.allTakerAddressesAreNull(orders);
+ },
+ feeOrdersCanBeUsedForForwarderContract(orders: Order[], zrxTokenAddress: string, etherTokenAddress: string): void {
+ if (!_.isEmpty(orders)) {
+ assert.allMakerAssetDatasAreErc20Token(orders, zrxTokenAddress);
+ assert.allTakerAssetDatasAreErc20Token(orders, etherTokenAddress);
+ }
+ },
+ allTakerAddressesAreNull(orders: Order[]): void {
+ assert.ordersHaveAtMostOneUniqueValueForProperty(orders, 'takerAddress', constants.NULL_ADDRESS);
+ },
+ allMakerAssetDatasAreErc20Token(orders: Order[], tokenAddress: string): void {
+ assert.ordersHaveAtMostOneUniqueValueForProperty(
+ orders,
+ 'makerAssetData',
+ assetDataUtils.encodeERC20AssetData(tokenAddress),
+ );
+ },
+ allTakerAssetDatasAreErc20Token(orders: Order[], tokenAddress: string): void {
+ assert.ordersHaveAtMostOneUniqueValueForProperty(
+ orders,
+ 'takerAssetData',
+ assetDataUtils.encodeERC20AssetData(tokenAddress),
+ );
+ },
+ /*
+ * Asserts that all the orders have the same value for the provided propertyName
+ * If the value parameter is provided, this asserts that all orders have the prope
+ */
+ ordersHaveAtMostOneUniqueValueForProperty(orders: Order[], propertyName: string, value?: any): void {
+ const allValues = _.map(orders, order => _.get(order, propertyName));
+ sharedAssert.hasAtMostOneUniqueValue(
+ allValues,
+ `Expected all orders to have the same ${propertyName} field. Found the following ${propertyName} values: ${JSON.stringify(
+ allValues,
+ )}`,
+ );
+ if (!_.isUndefined(value)) {
+ const firstValue = _.head(allValues);
+ sharedAssert.assert(
+ firstValue === value,
+ `Expected all orders to have a ${propertyName} field with value: ${value}. Found: ${firstValue}`,
+ );
+ }
+ },
+};
diff --git a/packages/contract-wrappers/src/utils/calldata_optimization_utils.ts b/packages/contract-wrappers/src/utils/calldata_optimization_utils.ts
new file mode 100644
index 000000000..3172cf531
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/calldata_optimization_utils.ts
@@ -0,0 +1,44 @@
+import { SignedOrder } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+
+export const calldataOptimizationUtils = {
+ /**
+ * Takes an array of orders and outputs an array of equivalent orders where all takerAssetData are '0x' and
+ * all makerAssetData are '0x' except for that of the first order, which retains its original value
+ * @param orders An array of SignedOrder objects
+ * @returns optimized orders
+ */
+ optimizeForwarderOrders(orders: SignedOrder[]): SignedOrder[] {
+ const optimizedOrders = _.map(orders, (order, index) =>
+ transformOrder(order, {
+ makerAssetData: index === 0 ? order.makerAssetData : constants.NULL_BYTES,
+ takerAssetData: constants.NULL_BYTES,
+ }),
+ );
+ return optimizedOrders;
+ },
+ /**
+ * Takes an array of orders and outputs an array of equivalent orders where all takerAssetData are '0x' and
+ * all makerAssetData are '0x'
+ * @param orders An array of SignedOrder objects
+ * @returns optimized orders
+ */
+ optimizeForwarderFeeOrders(orders: SignedOrder[]): SignedOrder[] {
+ const optimizedOrders = _.map(orders, (order, index) =>
+ transformOrder(order, {
+ makerAssetData: constants.NULL_BYTES,
+ takerAssetData: constants.NULL_BYTES,
+ }),
+ );
+ return optimizedOrders;
+ },
+};
+
+const transformOrder = (order: SignedOrder, partialOrder: Partial<SignedOrder>) => {
+ return {
+ ...order,
+ ...partialOrder,
+ };
+};
diff --git a/packages/contract-wrappers/src/utils/constants.ts b/packages/contract-wrappers/src/utils/constants.ts
new file mode 100644
index 000000000..2df11538c
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/constants.ts
@@ -0,0 +1,15 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const constants = {
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ NULL_BYTES: '0x',
+ TESTRPC_NETWORK_ID: 50,
+ INVALID_JUMP_PATTERN: 'invalid JUMP at',
+ REVERT: 'revert',
+ OUT_OF_GAS_PATTERN: 'out of gas',
+ INVALID_TAKER_FORMAT: 'instance.taker is not of a type(s) string',
+ // tslint:disable-next-line:custom-no-magic-numbers
+ UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
+ DEFAULT_BLOCK_POLLING_INTERVAL: 1000,
+ ZERO_AMOUNT: new BigNumber(0),
+};
diff --git a/packages/contract-wrappers/src/utils/decorators.ts b/packages/contract-wrappers/src/utils/decorators.ts
new file mode 100644
index 000000000..6e77450e8
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/decorators.ts
@@ -0,0 +1,96 @@
+import { RevertReason } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { AsyncMethod, ContractWrappersError, SyncMethod } from '../types';
+
+import { constants } from './constants';
+
+type ErrorTransformer = (err: Error) => Error;
+
+const contractCallErrorTransformer = (error: Error) => {
+ if (_.includes(error.message, constants.INVALID_JUMP_PATTERN)) {
+ return new Error(ContractWrappersError.InvalidJump);
+ }
+ if (_.includes(error.message, constants.OUT_OF_GAS_PATTERN)) {
+ return new Error(ContractWrappersError.OutOfGas);
+ }
+ if (_.includes(error.message, constants.REVERT)) {
+ const revertReason = error.message.split(constants.REVERT)[1].trim();
+ return new Error(revertReason);
+ }
+ return error;
+};
+
+const schemaErrorTransformer = (error: Error) => {
+ if (_.includes(error.message, constants.INVALID_TAKER_FORMAT)) {
+ const errMsg =
+ 'Order taker must be of type string. If you want anyone to be able to fill an order - pass ZeroEx.NULL_ADDRESS';
+ return new Error(errMsg);
+ }
+ return error;
+};
+
+/**
+ * Source: https://stackoverflow.com/a/29837695/3546986
+ */
+const asyncErrorHandlerFactory = (errorTransformer: ErrorTransformer) => {
+ const asyncErrorHandlingDecorator = (
+ _target: object,
+ _key: string | symbol,
+ descriptor: TypedPropertyDescriptor<AsyncMethod>,
+ ) => {
+ const originalMethod = descriptor.value as AsyncMethod;
+
+ // Do not use arrow syntax here. Use a function expression in
+ // order to use the correct value of `this` in this method
+ // tslint:disable-next-line:only-arrow-functions
+ descriptor.value = async function(...args: any[]): Promise<any> {
+ try {
+ const result = await originalMethod.apply(this, args);
+ return result;
+ } catch (error) {
+ const transformedError = errorTransformer(error);
+ throw transformedError;
+ }
+ };
+
+ return descriptor;
+ };
+
+ return asyncErrorHandlingDecorator;
+};
+
+const syncErrorHandlerFactory = (errorTransformer: ErrorTransformer) => {
+ const syncErrorHandlingDecorator = (
+ _target: object,
+ _key: string | symbol,
+ descriptor: TypedPropertyDescriptor<SyncMethod>,
+ ) => {
+ const originalMethod = descriptor.value as SyncMethod;
+
+ // Do not use arrow syntax here. Use a function expression in
+ // order to use the correct value of `this` in this method
+ // tslint:disable-next-line:only-arrow-functions
+ descriptor.value = function(...args: any[]): any {
+ try {
+ const result = originalMethod.apply(this, args);
+ return result;
+ } catch (error) {
+ const transformedError = errorTransformer(error);
+ throw transformedError;
+ }
+ };
+
+ return descriptor;
+ };
+
+ return syncErrorHandlingDecorator;
+};
+
+// _.flow(f, g) = f ∘ g
+const zeroExErrorTransformer = _.flow(schemaErrorTransformer, contractCallErrorTransformer);
+
+export const decorators = {
+ asyncZeroExErrorHandler: asyncErrorHandlerFactory(zeroExErrorTransformer),
+ syncZeroExErrorHandler: syncErrorHandlerFactory(zeroExErrorTransformer),
+};
diff --git a/packages/contract-wrappers/src/utils/exchange_transfer_simulator.ts b/packages/contract-wrappers/src/utils/exchange_transfer_simulator.ts
new file mode 100644
index 000000000..279f2a796
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/exchange_transfer_simulator.ts
@@ -0,0 +1,111 @@
+import { ExchangeContractErrs } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { AbstractBalanceAndProxyAllowanceLazyStore } from '../abstract/abstract_balance_and_proxy_allowance_lazy_store';
+import { TradeSide, TransferType } from '../types';
+import { constants } from '../utils/constants';
+
+enum FailureReason {
+ Balance = 'balance',
+ ProxyAllowance = 'proxyAllowance',
+}
+
+const ERR_MSG_MAPPING = {
+ [FailureReason.Balance]: {
+ [TradeSide.Maker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerBalance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeBalance,
+ },
+ [TradeSide.Taker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerBalance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeBalance,
+ },
+ },
+ [FailureReason.ProxyAllowance]: {
+ [TradeSide.Maker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerAllowance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeAllowance,
+ },
+ [TradeSide.Taker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerAllowance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeAllowance,
+ },
+ },
+};
+
+export class ExchangeTransferSimulator {
+ private _store: AbstractBalanceAndProxyAllowanceLazyStore;
+ private static _throwValidationError(
+ failureReason: FailureReason,
+ tradeSide: TradeSide,
+ transferType: TransferType,
+ ): never {
+ const errMsg = ERR_MSG_MAPPING[failureReason][tradeSide][transferType];
+ throw new Error(errMsg);
+ }
+ constructor(store: AbstractBalanceAndProxyAllowanceLazyStore) {
+ this._store = store;
+ }
+ /**
+ * Simulates transferFrom call performed by a proxy
+ * @param tokenAddress Address of the token to be transferred
+ * @param from Owner of the transferred tokens
+ * @param to Recipient of the transferred tokens
+ * @param amountInBaseUnits The amount of tokens being transferred
+ * @param tradeSide Is Maker/Taker transferring
+ * @param transferType Is it a fee payment or a value transfer
+ */
+ public async transferFromAsync(
+ tokenAddress: string,
+ from: string,
+ to: string,
+ amountInBaseUnits: BigNumber,
+ tradeSide: TradeSide,
+ transferType: TransferType,
+ ): Promise<void> {
+ // HACK: When simulating an open order (e.g taker is NULL_ADDRESS), we don't want to adjust balances/
+ // allowances for the taker. We do however, want to increase the balance of the maker since the maker
+ // might be relying on those funds to fill subsequent orders or pay the order's fees.
+ if (from === constants.NULL_ADDRESS && tradeSide === TradeSide.Taker) {
+ await this._increaseBalanceAsync(tokenAddress, to, amountInBaseUnits);
+ return;
+ }
+ const balance = await this._store.getBalanceAsync(tokenAddress, from);
+ const proxyAllowance = await this._store.getProxyAllowanceAsync(tokenAddress, from);
+ if (proxyAllowance.lessThan(amountInBaseUnits)) {
+ ExchangeTransferSimulator._throwValidationError(FailureReason.ProxyAllowance, tradeSide, transferType);
+ }
+ if (balance.lessThan(amountInBaseUnits)) {
+ ExchangeTransferSimulator._throwValidationError(FailureReason.Balance, tradeSide, transferType);
+ }
+ await this._decreaseProxyAllowanceAsync(tokenAddress, from, amountInBaseUnits);
+ await this._decreaseBalanceAsync(tokenAddress, from, amountInBaseUnits);
+ await this._increaseBalanceAsync(tokenAddress, to, amountInBaseUnits);
+ }
+ private async _decreaseProxyAllowanceAsync(
+ tokenAddress: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const proxyAllowance = await this._store.getProxyAllowanceAsync(tokenAddress, userAddress);
+ if (!proxyAllowance.eq(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS)) {
+ this._store.setProxyAllowance(tokenAddress, userAddress, proxyAllowance.minus(amountInBaseUnits));
+ }
+ }
+ private async _increaseBalanceAsync(
+ tokenAddress: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const balance = await this._store.getBalanceAsync(tokenAddress, userAddress);
+ this._store.setBalance(tokenAddress, userAddress, balance.plus(amountInBaseUnits));
+ }
+ private async _decreaseBalanceAsync(
+ tokenAddress: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const balance = await this._store.getBalanceAsync(tokenAddress, userAddress);
+ this._store.setBalance(tokenAddress, userAddress, balance.minus(amountInBaseUnits));
+ }
+}
diff --git a/packages/contract-wrappers/src/utils/filter_utils.ts b/packages/contract-wrappers/src/utils/filter_utils.ts
new file mode 100644
index 000000000..0e73987f7
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/filter_utils.ts
@@ -0,0 +1,87 @@
+import { ConstructorAbi, ContractAbi, EventAbi, FallbackAbi, FilterObject, LogEntry, MethodAbi } from 'ethereum-types';
+import * as ethUtil from 'ethereumjs-util';
+import * as jsSHA3 from 'js-sha3';
+import * as _ from 'lodash';
+import * as uuid from 'uuid/v4';
+
+import { BlockRange, ContractEvents, IndexedFilterValues } from '../types';
+
+const TOPIC_LENGTH = 32;
+
+export const filterUtils = {
+ generateUUID(): string {
+ return uuid();
+ },
+ getFilter(
+ address: string,
+ eventName: ContractEvents,
+ indexFilterValues: IndexedFilterValues,
+ abi: ContractAbi,
+ blockRange?: BlockRange,
+ ): FilterObject {
+ const eventAbi = _.find(abi, { name: eventName }) as EventAbi;
+ const eventSignature = filterUtils.getEventSignatureFromAbiByName(eventAbi);
+ const topicForEventSignature = ethUtil.addHexPrefix(jsSHA3.keccak256(eventSignature));
+ const topicsForIndexedArgs = filterUtils.getTopicsForIndexedArgs(eventAbi, indexFilterValues);
+ const topics = [topicForEventSignature, ...topicsForIndexedArgs];
+ let filter: FilterObject = {
+ address,
+ topics,
+ };
+ if (!_.isUndefined(blockRange)) {
+ filter = {
+ ...blockRange,
+ ...filter,
+ };
+ }
+ return filter;
+ },
+ getEventSignatureFromAbiByName(eventAbi: EventAbi): string {
+ const types = _.map(eventAbi.inputs, 'type');
+ const signature = `${eventAbi.name}(${types.join(',')})`;
+ return signature;
+ },
+ getTopicsForIndexedArgs(abi: EventAbi, indexFilterValues: IndexedFilterValues): Array<string | null> {
+ const topics: Array<string | null> = [];
+ for (const eventInput of abi.inputs) {
+ if (!eventInput.indexed) {
+ continue;
+ }
+ if (_.isUndefined(indexFilterValues[eventInput.name])) {
+ // Null is a wildcard topic in a JSON-RPC call
+ topics.push(null);
+ } else {
+ const value = indexFilterValues[eventInput.name] as string;
+ const buffer = ethUtil.toBuffer(value);
+ const paddedBuffer = ethUtil.setLengthLeft(buffer, TOPIC_LENGTH);
+ const topic = ethUtil.bufferToHex(paddedBuffer);
+ topics.push(topic);
+ }
+ }
+ return topics;
+ },
+ matchesFilter(log: LogEntry, filter: FilterObject): boolean {
+ if (!_.isUndefined(filter.address) && log.address !== filter.address) {
+ return false;
+ }
+ if (!_.isUndefined(filter.topics)) {
+ return filterUtils.doesMatchTopics(log.topics, filter.topics);
+ }
+ return true;
+ },
+ doesMatchTopics(logTopics: string[], filterTopics: Array<string[] | string | null>): boolean {
+ const matchesTopic = _.zipWith(logTopics, filterTopics, filterUtils.matchesTopic.bind(filterUtils));
+ const doesMatchTopics = _.every(matchesTopic);
+ return doesMatchTopics;
+ },
+ matchesTopic(logTopic: string, filterTopic: string[] | string | null): boolean {
+ if (_.isArray(filterTopic)) {
+ return _.includes(filterTopic, logTopic);
+ }
+ if (_.isString(filterTopic)) {
+ return filterTopic === logTopic;
+ }
+ // null topic is a wildcard
+ return true;
+ },
+};
diff --git a/packages/contract-wrappers/src/utils/utils.ts b/packages/contract-wrappers/src/utils/utils.ts
new file mode 100644
index 000000000..689a7ee0a
--- /dev/null
+++ b/packages/contract-wrappers/src/utils/utils.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const utils = {
+ getCurrentUnixTimestampSec(): BigNumber {
+ const milisecondsInSecond = 1000;
+ return new BigNumber(Date.now() / milisecondsInSecond).round();
+ },
+ getCurrentUnixTimestampMs(): BigNumber {
+ return new BigNumber(Date.now());
+ },
+};
diff --git a/packages/contract-wrappers/test/artifacts_test.ts b/packages/contract-wrappers/test/artifacts_test.ts
new file mode 100644
index 000000000..c05d513b3
--- /dev/null
+++ b/packages/contract-wrappers/test/artifacts_test.ts
@@ -0,0 +1,43 @@
+import { web3Factory } from '@0xproject/dev-utils';
+
+import { ContractWrappers } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+
+chaiSetup.configure();
+
+// Those tests are slower cause they're talking to a remote node
+const TIMEOUT = 10000;
+
+// TODO: Re-enable those tests after final kovan and ropsten deployments are done.
+describe.skip('Artifacts', () => {
+ describe('contracts are deployed on kovan', () => {
+ const kovanRpcUrl = constants.KOVAN_RPC_URL;
+ const provider = web3Factory.getRpcProvider({ rpcUrl: kovanRpcUrl });
+ const config = {
+ networkId: constants.KOVAN_NETWORK_ID,
+ };
+ const contractWrappers = new ContractWrappers(provider, config);
+ it('erc20 proxy contract is deployed', async () => {
+ await (contractWrappers.erc20Proxy as any)._getTokenTransferProxyContractAsync();
+ }).timeout(TIMEOUT);
+ it('erc721 proxy contract is deployed', async () => {
+ await (contractWrappers.erc721Proxy as any)._getTokenTransferProxyContractAsync();
+ }).timeout(TIMEOUT);
+ });
+ describe('contracts are deployed on ropsten', () => {
+ const ropstenRpcUrl = constants.ROPSTEN_RPC_URL;
+ const provider = web3Factory.getRpcProvider({ rpcUrl: ropstenRpcUrl });
+ const config = {
+ networkId: constants.ROPSTEN_NETWORK_ID,
+ };
+ const contractWrappers = new ContractWrappers(provider, config);
+ it('erc20 proxy contract is deployed', async () => {
+ await (contractWrappers.erc20Proxy as any)._getTokenTransferProxyContractAsync();
+ }).timeout(TIMEOUT);
+ it('erc721 proxy contract is deployed', async () => {
+ await (contractWrappers.erc721Proxy as any)._getTokenTransferProxyContractAsync();
+ }).timeout(TIMEOUT);
+ });
+});
diff --git a/packages/contract-wrappers/test/calldata_optimization_utils_test.ts b/packages/contract-wrappers/test/calldata_optimization_utils_test.ts
new file mode 100644
index 000000000..a4cea772f
--- /dev/null
+++ b/packages/contract-wrappers/test/calldata_optimization_utils_test.ts
@@ -0,0 +1,60 @@
+import { orderFactory } from '@0xproject/order-utils';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+import 'mocha';
+
+import { assert } from '../src/utils/assert';
+import { calldataOptimizationUtils } from '../src/utils/calldata_optimization_utils';
+import { constants } from '../src/utils/constants';
+
+import { chaiSetup } from './utils/chai_setup';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+// utility for generating a set of order objects with mostly NULL values
+// except for a specified makerAssetData and takerAssetData
+const FAKE_ORDERS_COUNT = 5;
+const generateFakeOrders = (makerAssetData: string, takerAssetData: string) =>
+ _.map(_.range(FAKE_ORDERS_COUNT), index => {
+ const order = orderFactory.createOrder(
+ constants.NULL_ADDRESS,
+ constants.ZERO_AMOUNT,
+ makerAssetData,
+ constants.ZERO_AMOUNT,
+ takerAssetData,
+ constants.NULL_ADDRESS,
+ );
+ return {
+ ...order,
+ signature: 'dummy signature',
+ };
+ });
+
+describe('calldataOptimizationUtils', () => {
+ const fakeMakerAssetData = 'fakeMakerAssetData';
+ const fakeTakerAssetData = 'fakeTakerAssetData';
+ const orders = generateFakeOrders(fakeMakerAssetData, fakeTakerAssetData);
+ describe('#optimizeForwarderOrders', () => {
+ it('should make makerAssetData `0x` unless first order', () => {
+ const optimizedOrders = calldataOptimizationUtils.optimizeForwarderOrders(orders);
+ expect(optimizedOrders[0].makerAssetData).to.equal(fakeMakerAssetData);
+ const ordersWithoutHead = _.slice(optimizedOrders, 1);
+ _.forEach(ordersWithoutHead, order => expect(order.makerAssetData).to.equal(constants.NULL_BYTES));
+ });
+ it('should make all takerAssetData `0x`', () => {
+ const optimizedOrders = calldataOptimizationUtils.optimizeForwarderOrders(orders);
+ _.forEach(optimizedOrders, order => expect(order.takerAssetData).to.equal(constants.NULL_BYTES));
+ });
+ });
+ describe('#optimizeForwarderFeeOrders', () => {
+ it('should make all makerAssetData `0x`', () => {
+ const optimizedOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(orders);
+ _.forEach(optimizedOrders, order => expect(order.makerAssetData).to.equal(constants.NULL_BYTES));
+ });
+ it('should make all takerAssetData `0x`', () => {
+ const optimizedOrders = calldataOptimizationUtils.optimizeForwarderFeeOrders(orders);
+ _.forEach(optimizedOrders, order => expect(order.takerAssetData).to.equal(constants.NULL_BYTES));
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/erc20_proxy_wrapper_test.ts b/packages/contract-wrappers/test/erc20_proxy_wrapper_test.ts
new file mode 100644
index 000000000..6bf9f1e25
--- /dev/null
+++ b/packages/contract-wrappers/test/erc20_proxy_wrapper_test.ts
@@ -0,0 +1,35 @@
+import * as chai from 'chai';
+
+import { ContractWrappers } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { provider } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('ERC20ProxyWrapper', () => {
+ let contractWrappers: ContractWrappers;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, config);
+ });
+ describe('#isAuthorizedAsync', () => {
+ it('should return false if the address is not authorized', async () => {
+ const isAuthorized = await contractWrappers.erc20Proxy.isAuthorizedAsync(constants.NULL_ADDRESS);
+ expect(isAuthorized).to.be.false();
+ });
+ });
+ describe('#getAuthorizedAddressesAsync', () => {
+ it('should return the list of authorized addresses', async () => {
+ const authorizedAddresses = await contractWrappers.erc20Proxy.getAuthorizedAddressesAsync();
+ for (const authorizedAddress of authorizedAddresses) {
+ const isAuthorized = await contractWrappers.erc20Proxy.isAuthorizedAsync(authorizedAddress);
+ expect(isAuthorized).to.be.true();
+ }
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/erc20_wrapper_test.ts b/packages/contract-wrappers/test/erc20_wrapper_test.ts
new file mode 100644
index 000000000..cf7ac527e
--- /dev/null
+++ b/packages/contract-wrappers/test/erc20_wrapper_test.ts
@@ -0,0 +1,658 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { EmptyWalletSubprovider, Web3ProviderEngine } from '@0xproject/subproviders';
+import { DoneCallback } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { Provider } from 'ethereum-types';
+import 'mocha';
+
+import {
+ BlockParamLiteral,
+ BlockRange,
+ ContractWrappers,
+ ContractWrappersError,
+ DecodedLogEvent,
+ ERC20TokenApprovalEventArgs,
+ ERC20TokenEvents,
+ ERC20TokenTransferEventArgs,
+} from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ERC20Wrapper', () => {
+ let contractWrappers: ContractWrappers;
+ let userAddresses: string[];
+ let tokens: string[];
+ let coinbase: string;
+ let addressWithoutFunds: string;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, config);
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ tokens = tokenUtils.getDummyERC20TokenAddresses();
+ coinbase = userAddresses[0];
+ addressWithoutFunds = userAddresses[1];
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#transferAsync', () => {
+ let tokenAddress: string;
+ let transferAmount: BigNumber;
+ before(() => {
+ tokenAddress = tokens[0];
+ transferAmount = new BigNumber(42);
+ });
+ it('should successfully transfer tokens', async () => {
+ const fromAddress = coinbase;
+ const toAddress = addressWithoutFunds;
+ const preBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, toAddress);
+ expect(preBalance).to.be.bignumber.equal(0);
+ await contractWrappers.erc20Token.transferAsync(tokenAddress, fromAddress, toAddress, transferAmount);
+ const postBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, toAddress);
+ return expect(postBalance).to.be.bignumber.equal(transferAmount);
+ });
+ it('should fail to transfer tokens if fromAddress has an insufficient balance', async () => {
+ const fromAddress = addressWithoutFunds;
+ const toAddress = coinbase;
+ return expect(
+ contractWrappers.erc20Token.transferAsync(tokenAddress, fromAddress, toAddress, transferAmount),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientBalanceForTransfer);
+ });
+ it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
+ const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
+ const fromAddress = coinbase;
+ const toAddress = coinbase;
+ return expect(
+ contractWrappers.erc20Token.transferAsync(
+ nonExistentTokenAddress,
+ fromAddress,
+ toAddress,
+ transferAmount,
+ ),
+ ).to.be.rejectedWith(ContractWrappersError.ERC20TokenContractDoesNotExist);
+ });
+ });
+ describe('#transferFromAsync', () => {
+ let tokenAddress: string;
+ let toAddress: string;
+ let senderAddress: string;
+ before(async () => {
+ tokenAddress = tokens[0];
+ toAddress = addressWithoutFunds;
+ senderAddress = userAddresses[2];
+ });
+ it('should fail to transfer tokens if fromAddress has insufficient allowance set', async () => {
+ const fromAddress = coinbase;
+ const transferAmount = new BigNumber(42);
+
+ const fromAddressBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, fromAddress);
+ expect(fromAddressBalance).to.be.bignumber.greaterThan(transferAmount);
+
+ const fromAddressAllowance = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ fromAddress,
+ toAddress,
+ );
+ expect(fromAddressAllowance).to.be.bignumber.equal(0);
+
+ return expect(
+ contractWrappers.erc20Token.transferFromAsync(
+ tokenAddress,
+ fromAddress,
+ toAddress,
+ senderAddress,
+ transferAmount,
+ ),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientAllowanceForTransfer);
+ });
+ it('[regression] should fail to transfer tokens if set allowance for toAddress instead of senderAddress', async () => {
+ const fromAddress = coinbase;
+ const transferAmount = new BigNumber(42);
+
+ await contractWrappers.erc20Token.setAllowanceAsync(tokenAddress, fromAddress, toAddress, transferAmount);
+
+ return expect(
+ contractWrappers.erc20Token.transferFromAsync(
+ tokenAddress,
+ fromAddress,
+ toAddress,
+ senderAddress,
+ transferAmount,
+ ),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientAllowanceForTransfer);
+ });
+ it('should fail to transfer tokens if fromAddress has insufficient balance', async () => {
+ const fromAddress = addressWithoutFunds;
+ const transferAmount = new BigNumber(42);
+
+ const fromAddressBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, fromAddress);
+ expect(fromAddressBalance).to.be.bignumber.equal(0);
+
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ fromAddress,
+ senderAddress,
+ transferAmount,
+ );
+ const fromAddressAllowance = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ fromAddress,
+ senderAddress,
+ );
+ expect(fromAddressAllowance).to.be.bignumber.equal(transferAmount);
+
+ return expect(
+ contractWrappers.erc20Token.transferFromAsync(
+ tokenAddress,
+ fromAddress,
+ toAddress,
+ senderAddress,
+ transferAmount,
+ ),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientBalanceForTransfer);
+ });
+ it('should successfully transfer tokens', async () => {
+ const fromAddress = coinbase;
+
+ const preBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, toAddress);
+ expect(preBalance).to.be.bignumber.equal(0);
+
+ const transferAmount = new BigNumber(42);
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ fromAddress,
+ senderAddress,
+ transferAmount,
+ );
+
+ await contractWrappers.erc20Token.transferFromAsync(
+ tokenAddress,
+ fromAddress,
+ toAddress,
+ senderAddress,
+ transferAmount,
+ );
+ const postBalance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, toAddress);
+ return expect(postBalance).to.be.bignumber.equal(transferAmount);
+ });
+ it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
+ const fromAddress = coinbase;
+ const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
+ return expect(
+ contractWrappers.erc20Token.transferFromAsync(
+ nonExistentTokenAddress,
+ fromAddress,
+ toAddress,
+ senderAddress,
+ new BigNumber(42),
+ ),
+ ).to.be.rejectedWith(ContractWrappersError.ERC20TokenContractDoesNotExist);
+ });
+ });
+ describe('#getBalanceAsync', () => {
+ describe('With provider with accounts', () => {
+ it('should return the balance for an existing ERC20 token', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const balance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, ownerAddress);
+ const expectedBalance = new BigNumber('1000000000000000000000000000');
+ return expect(balance).to.be.bignumber.equal(expectedBalance);
+ });
+ it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
+ const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
+ const ownerAddress = coinbase;
+ return expect(
+ contractWrappers.erc20Token.getBalanceAsync(nonExistentTokenAddress, ownerAddress),
+ ).to.be.rejectedWith(ContractWrappersError.ERC20TokenContractDoesNotExist);
+ });
+ it('should return a balance of 0 for a non-existent owner address', async () => {
+ const tokenAddress = tokens[0];
+ const nonExistentOwner = '0x198c6ad858f213fb31b6fe809e25040e6b964593';
+ const balance = await contractWrappers.erc20Token.getBalanceAsync(tokenAddress, nonExistentOwner);
+ const expectedBalance = new BigNumber(0);
+ return expect(balance).to.be.bignumber.equal(expectedBalance);
+ });
+ });
+ describe('With provider without accounts', () => {
+ let zeroExContractWithoutAccounts: ContractWrappers;
+ before(async () => {
+ const emptyWalletProvider = addEmptyWalletSubprovider(provider);
+ zeroExContractWithoutAccounts = new ContractWrappers(emptyWalletProvider, config);
+ });
+ it('should return balance even when called with provider instance without addresses', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const balance = await zeroExContractWithoutAccounts.erc20Token.getBalanceAsync(
+ tokenAddress,
+ ownerAddress,
+ );
+ const expectedBalance = new BigNumber('1000000000000000000000000000');
+ return expect(balance).to.be.bignumber.equal(expectedBalance);
+ });
+ });
+ });
+ describe('#setAllowanceAsync', () => {
+ it("should set the spender's allowance", async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const spenderAddress = addressWithoutFunds;
+
+ const allowanceBeforeSet = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ const expectedAllowanceBeforeAllowanceSet = new BigNumber(0);
+ expect(allowanceBeforeSet).to.be.bignumber.equal(expectedAllowanceBeforeAllowanceSet);
+
+ const amountInBaseUnits = new BigNumber(50);
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ amountInBaseUnits,
+ );
+
+ const allowanceAfterSet = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ const expectedAllowanceAfterAllowanceSet = amountInBaseUnits;
+ return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet);
+ });
+ });
+ describe('#setUnlimitedAllowanceAsync', () => {
+ it("should set the unlimited spender's allowance", async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const spenderAddress = addressWithoutFunds;
+
+ await contractWrappers.erc20Token.setUnlimitedAllowanceAsync(tokenAddress, ownerAddress, spenderAddress);
+ const allowance = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ return expect(allowance).to.be.bignumber.equal(
+ contractWrappers.erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ });
+ it('should reduce the gas cost for transfers including tokens with unlimited allowance support', async () => {
+ const transferAmount = new BigNumber(5);
+ const zrxAddress = tokenUtils.getProtocolTokenAddress();
+ const [, userWithNormalAllowance, userWithUnlimitedAllowance] = userAddresses;
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ zrxAddress,
+ coinbase,
+ userWithNormalAllowance,
+ transferAmount,
+ );
+ await contractWrappers.erc20Token.setUnlimitedAllowanceAsync(
+ zrxAddress,
+ coinbase,
+ userWithUnlimitedAllowance,
+ );
+
+ const initBalanceWithNormalAllowance = await web3Wrapper.getBalanceInWeiAsync(userWithNormalAllowance);
+ const initBalanceWithUnlimitedAllowance = await web3Wrapper.getBalanceInWeiAsync(
+ userWithUnlimitedAllowance,
+ );
+
+ await contractWrappers.erc20Token.transferFromAsync(
+ zrxAddress,
+ coinbase,
+ userWithNormalAllowance,
+ userWithNormalAllowance,
+ transferAmount,
+ );
+ await contractWrappers.erc20Token.transferFromAsync(
+ zrxAddress,
+ coinbase,
+ userWithUnlimitedAllowance,
+ userWithUnlimitedAllowance,
+ transferAmount,
+ );
+
+ const finalBalanceWithNormalAllowance = await web3Wrapper.getBalanceInWeiAsync(userWithNormalAllowance);
+ const finalBalanceWithUnlimitedAllowance = await web3Wrapper.getBalanceInWeiAsync(
+ userWithUnlimitedAllowance,
+ );
+
+ const normalGasCost = initBalanceWithNormalAllowance.minus(finalBalanceWithNormalAllowance);
+ const unlimitedGasCost = initBalanceWithUnlimitedAllowance.minus(finalBalanceWithUnlimitedAllowance);
+
+ // In theory the gas cost with unlimited allowance should be smaller, but with testrpc it's actually bigger.
+ // This needs to be investigated in ethereumjs-vm. This test is essentially a repro.
+ // TODO: Make this test pass with inverted assertion.
+ expect(unlimitedGasCost.toNumber()).to.be.gt(normalGasCost.toNumber());
+ });
+ });
+ describe('#getAllowanceAsync', () => {
+ describe('With provider with accounts', () => {
+ it('should get the proxy allowance', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const spenderAddress = addressWithoutFunds;
+
+ const amountInBaseUnits = new BigNumber(50);
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ amountInBaseUnits,
+ );
+
+ const allowance = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ const expectedAllowance = amountInBaseUnits;
+ return expect(allowance).to.be.bignumber.equal(expectedAllowance);
+ });
+ it('should return 0 if no allowance set yet', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const spenderAddress = addressWithoutFunds;
+ const allowance = await contractWrappers.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ const expectedAllowance = new BigNumber(0);
+ return expect(allowance).to.be.bignumber.equal(expectedAllowance);
+ });
+ });
+ describe('With provider without accounts', () => {
+ let zeroExContractWithoutAccounts: ContractWrappers;
+ before(async () => {
+ const emptyWalletProvider = addEmptyWalletSubprovider(provider);
+ zeroExContractWithoutAccounts = new ContractWrappers(emptyWalletProvider, config);
+ });
+ it('should get the proxy allowance', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+ const spenderAddress = addressWithoutFunds;
+
+ const amountInBaseUnits = new BigNumber(50);
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ amountInBaseUnits,
+ );
+
+ const allowance = await zeroExContractWithoutAccounts.erc20Token.getAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ spenderAddress,
+ );
+ const expectedAllowance = amountInBaseUnits;
+ return expect(allowance).to.be.bignumber.equal(expectedAllowance);
+ });
+ });
+ });
+ describe('#getProxyAllowanceAsync', () => {
+ it('should get the proxy allowance', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+
+ const amountInBaseUnits = new BigNumber(50);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(tokenAddress, ownerAddress, amountInBaseUnits);
+
+ const allowance = await contractWrappers.erc20Token.getProxyAllowanceAsync(tokenAddress, ownerAddress);
+ const expectedAllowance = amountInBaseUnits;
+ return expect(allowance).to.be.bignumber.equal(expectedAllowance);
+ });
+ });
+ describe('#setProxyAllowanceAsync', () => {
+ it('should set the proxy allowance', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+
+ const allowanceBeforeSet = await contractWrappers.erc20Token.getProxyAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ );
+ const expectedAllowanceBeforeAllowanceSet = new BigNumber(0);
+ expect(allowanceBeforeSet).to.be.bignumber.equal(expectedAllowanceBeforeAllowanceSet);
+
+ const amountInBaseUnits = new BigNumber(50);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(tokenAddress, ownerAddress, amountInBaseUnits);
+
+ const allowanceAfterSet = await contractWrappers.erc20Token.getProxyAllowanceAsync(
+ tokenAddress,
+ ownerAddress,
+ );
+ const expectedAllowanceAfterAllowanceSet = amountInBaseUnits;
+ return expect(allowanceAfterSet).to.be.bignumber.equal(expectedAllowanceAfterAllowanceSet);
+ });
+ });
+ describe('#setUnlimitedProxyAllowanceAsync', () => {
+ it('should set the unlimited proxy allowance', async () => {
+ const tokenAddress = tokens[0];
+ const ownerAddress = coinbase;
+
+ await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(tokenAddress, ownerAddress);
+ const allowance = await contractWrappers.erc20Token.getProxyAllowanceAsync(tokenAddress, ownerAddress);
+ return expect(allowance).to.be.bignumber.equal(
+ contractWrappers.erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ });
+ });
+ describe('#subscribe', () => {
+ const indexFilterValues = {};
+ let tokenAddress: string;
+ const transferAmount = new BigNumber(42);
+ const allowanceAmount = new BigNumber(42);
+ before(() => {
+ tokenAddress = tokens[0];
+ });
+ afterEach(() => {
+ contractWrappers.erc20Token.unsubscribeAll();
+ });
+ // Hack: Mocha does not allow a test to be both async and have a `done` callback
+ // Since we need to await the receipt of the event in the `subscribe` callback,
+ // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
+ // wrap the rest of the test in an async block
+ // Source: https://github.com/mochajs/mocha/issues/2407
+ it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC20TokenTransferEventArgs>) => {
+ expect(logEvent.isRemoved).to.be.false();
+ expect(logEvent.log.logIndex).to.be.equal(0);
+ expect(logEvent.log.transactionIndex).to.be.equal(0);
+ expect(logEvent.log.blockNumber).to.be.a('number');
+ const args = logEvent.log.args;
+ expect(args._from).to.be.equal(coinbase);
+ expect(args._to).to.be.equal(addressWithoutFunds);
+ expect(args._value).to.be.bignumber.equal(transferAmount);
+ },
+ );
+ contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Transfer,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ tokenAddress,
+ coinbase,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ })().catch(done);
+ });
+ it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC20TokenApprovalEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ const args = logEvent.log.args;
+ expect(args._owner).to.be.equal(coinbase);
+ expect(args._spender).to.be.equal(addressWithoutFunds);
+ expect(args._value).to.be.bignumber.equal(allowanceAmount);
+ },
+ );
+ contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Approval,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ tokenAddress,
+ coinbase,
+ addressWithoutFunds,
+ allowanceAmount,
+ );
+ })().catch(done);
+ });
+ it('Outstanding subscriptions are cancelled when contractWrappers.setProvider called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (_logEvent: DecodedLogEvent<ERC20TokenApprovalEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Transfer,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ const callbackToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)();
+ contractWrappers.setProvider(provider, constants.TESTRPC_NETWORK_ID);
+ contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Transfer,
+ indexFilterValues,
+ callbackToBeCalled,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ tokenAddress,
+ coinbase,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ })().catch(done);
+ });
+ it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (_logEvent: DecodedLogEvent<ERC20TokenApprovalEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ const subscriptionToken = contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Transfer,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ contractWrappers.erc20Token.unsubscribe(subscriptionToken);
+ await contractWrappers.erc20Token.transferAsync(
+ tokenAddress,
+ coinbase,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ done();
+ })().catch(done);
+ });
+ });
+ describe('#getLogsAsync', () => {
+ let tokenAddress: string;
+ let tokenTransferProxyAddress: string;
+ const blockRange: BlockRange = {
+ fromBlock: 0,
+ toBlock: BlockParamLiteral.Latest,
+ };
+ let txHash: string;
+ before(() => {
+ tokenAddress = tokens[0];
+ tokenTransferProxyAddress = contractWrappers.erc20Proxy.getContractAddress();
+ });
+ it('should get logs with decoded args emitted by Approval', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = ERC20TokenEvents.Approval;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.erc20Token.getLogsAsync<ERC20TokenApprovalEventArgs>(
+ tokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(logs[0].event).to.be.equal(eventName);
+ expect(args._owner).to.be.equal(coinbase);
+ expect(args._spender).to.be.equal(tokenTransferProxyAddress);
+ expect(args._value).to.be.bignumber.equal(contractWrappers.erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ });
+ it('should only get the logs with the correct event name', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const differentEventName = ERC20TokenEvents.Transfer;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.erc20Token.getLogsAsync(
+ tokenAddress,
+ differentEventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(0);
+ });
+ it('should only get the logs with the correct indexed fields', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(tokenAddress, coinbase);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
+ tokenAddress,
+ addressWithoutFunds,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = ERC20TokenEvents.Approval;
+ const indexFilterValues = {
+ _owner: coinbase,
+ };
+ const logs = await contractWrappers.erc20Token.getLogsAsync<ERC20TokenApprovalEventArgs>(
+ tokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(args._owner).to.be.equal(coinbase);
+ });
+ });
+});
+// tslint:disable:max-file-line-count
+
+function addEmptyWalletSubprovider(p: Provider): Provider {
+ const providerEngine = new Web3ProviderEngine();
+ providerEngine.addProvider(new EmptyWalletSubprovider());
+ const currentSubproviders = (p as any)._providers;
+ for (const subprovider of currentSubproviders) {
+ providerEngine.addProvider(subprovider);
+ }
+ providerEngine.start();
+ return providerEngine;
+}
diff --git a/packages/contract-wrappers/test/erc721_proxy_wrapper_test.ts b/packages/contract-wrappers/test/erc721_proxy_wrapper_test.ts
new file mode 100644
index 000000000..9473d930b
--- /dev/null
+++ b/packages/contract-wrappers/test/erc721_proxy_wrapper_test.ts
@@ -0,0 +1,35 @@
+import * as chai from 'chai';
+
+import { ContractWrappers } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { provider } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('ERC721ProxyWrapper', () => {
+ let contractWrappers: ContractWrappers;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, config);
+ });
+ describe('#isAuthorizedAsync', () => {
+ it('should return false if the address is not authorized', async () => {
+ const isAuthorized = await contractWrappers.erc721Proxy.isAuthorizedAsync(constants.NULL_ADDRESS);
+ expect(isAuthorized).to.be.false();
+ });
+ });
+ describe('#getAuthorizedAddressesAsync', () => {
+ it('should return the list of authorized addresses', async () => {
+ const authorizedAddresses = await contractWrappers.erc721Proxy.getAuthorizedAddressesAsync();
+ for (const authorizedAddress of authorizedAddresses) {
+ const isAuthorized = await contractWrappers.erc721Proxy.isAuthorizedAsync(authorizedAddress);
+ expect(isAuthorized).to.be.true();
+ }
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/erc721_wrapper_test.ts b/packages/contract-wrappers/test/erc721_wrapper_test.ts
new file mode 100644
index 000000000..f005ac2e0
--- /dev/null
+++ b/packages/contract-wrappers/test/erc721_wrapper_test.ts
@@ -0,0 +1,471 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { EmptyWalletSubprovider, Web3ProviderEngine } from '@0xproject/subproviders';
+import { DoneCallback } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { Provider } from 'ethereum-types';
+import 'mocha';
+
+import {
+ BlockParamLiteral,
+ BlockRange,
+ ContractWrappers,
+ ContractWrappersError,
+ DecodedLogEvent,
+ ERC721TokenApprovalEventArgs,
+ ERC721TokenApprovalForAllEventArgs,
+ ERC721TokenEvents,
+ ERC721TokenTransferEventArgs,
+} from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ERC721Wrapper', () => {
+ let contractWrappers: ContractWrappers;
+ let userAddresses: string[];
+ let tokens: string[];
+ let ownerAddress: string;
+ let tokenAddress: string;
+ let anotherOwnerAddress: string;
+ let operatorAddress: string;
+ let approvedAddress: string;
+ let receiverAddress: string;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, config);
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ tokens = tokenUtils.getDummyERC721TokenAddresses();
+ tokenAddress = tokens[0];
+ [ownerAddress, operatorAddress, anotherOwnerAddress, approvedAddress, receiverAddress] = userAddresses;
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#transferFromAsync', () => {
+ it('should fail to transfer NFT if fromAddress has no approvals set', async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ return expect(
+ contractWrappers.erc721Token.transferFromAsync(tokenAddress, receiverAddress, approvedAddress, tokenId),
+ ).to.be.rejectedWith(ContractWrappersError.ERC721NoApproval);
+ });
+ it('should successfully transfer tokens when sender is an approved address', async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ let txHash = await contractWrappers.erc721Token.setApprovalAsync(tokenAddress, approvedAddress, tokenId);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const owner = await contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, tokenId);
+ expect(owner).to.be.equal(ownerAddress);
+ txHash = await contractWrappers.erc721Token.transferFromAsync(
+ tokenAddress,
+ receiverAddress,
+ approvedAddress,
+ tokenId,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const newOwner = await contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, tokenId);
+ expect(newOwner).to.be.equal(receiverAddress);
+ });
+ it('should successfully transfer tokens when sender is an approved operator', async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ const isApprovedForAll = true;
+ let txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const owner = await contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, tokenId);
+ expect(owner).to.be.equal(ownerAddress);
+ txHash = await contractWrappers.erc721Token.transferFromAsync(
+ tokenAddress,
+ receiverAddress,
+ operatorAddress,
+ tokenId,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const newOwner = await contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, tokenId);
+ expect(newOwner).to.be.equal(receiverAddress);
+ });
+ });
+ describe('#getTokenCountAsync', () => {
+ describe('With provider with accounts', () => {
+ it('should return the count for an existing ERC721 token', async () => {
+ let tokenCount = await contractWrappers.erc721Token.getTokenCountAsync(tokenAddress, ownerAddress);
+ expect(tokenCount).to.be.bignumber.equal(0);
+ await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ tokenCount = await contractWrappers.erc721Token.getTokenCountAsync(tokenAddress, ownerAddress);
+ expect(tokenCount).to.be.bignumber.equal(1);
+ });
+ it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
+ const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
+ return expect(
+ contractWrappers.erc721Token.getTokenCountAsync(nonExistentTokenAddress, ownerAddress),
+ ).to.be.rejectedWith(ContractWrappersError.ERC721TokenContractDoesNotExist);
+ });
+ it('should return a balance of 0 for a non-existent owner address', async () => {
+ const nonExistentOwner = '0x198c6ad858f213fb31b6fe809e25040e6b964593';
+ const balance = await contractWrappers.erc721Token.getTokenCountAsync(tokenAddress, nonExistentOwner);
+ const expectedBalance = new BigNumber(0);
+ return expect(balance).to.be.bignumber.equal(expectedBalance);
+ });
+ });
+ describe('With provider without accounts', () => {
+ let zeroExContractWithoutAccounts: ContractWrappers;
+ before(async () => {
+ const emptyWalletProvider = addEmptyWalletSubprovider(provider);
+ zeroExContractWithoutAccounts = new ContractWrappers(emptyWalletProvider, config);
+ });
+ it('should return balance even when called with provider instance without addresses', async () => {
+ const balance = await zeroExContractWithoutAccounts.erc721Token.getTokenCountAsync(
+ tokenAddress,
+ ownerAddress,
+ );
+ return expect(balance).to.be.bignumber.equal(0);
+ });
+ });
+ });
+ describe('#getOwnerOfAsync', () => {
+ it('should return the owner for an existing ERC721 token', async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ const tokenOwner = await contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, tokenId);
+ expect(tokenOwner).to.be.bignumber.equal(ownerAddress);
+ });
+ it('should throw a CONTRACT_DOES_NOT_EXIST error for a non-existent token contract', async () => {
+ const nonExistentTokenAddress = '0x9dd402f14d67e001d8efbe6583e51bf9706aa065';
+ const fakeTokenId = new BigNumber(42);
+ return expect(
+ contractWrappers.erc721Token.getOwnerOfAsync(nonExistentTokenAddress, fakeTokenId),
+ ).to.be.rejectedWith(ContractWrappersError.ERC721TokenContractDoesNotExist);
+ });
+ it('should return undefined not 0 for a non-existent ERC721', async () => {
+ const fakeTokenId = new BigNumber(42);
+ return expect(contractWrappers.erc721Token.getOwnerOfAsync(tokenAddress, fakeTokenId)).to.be.rejectedWith(
+ ContractWrappersError.ERC721OwnerNotFound,
+ );
+ });
+ });
+ describe('#setApprovalForAllAsync/isApprovedForAllAsync', () => {
+ it('should check if operator address is approved', async () => {
+ let isApprovedForAll = await contractWrappers.erc721Token.isApprovedForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ );
+ expect(isApprovedForAll).to.be.false();
+ // set
+ isApprovedForAll = true;
+ let txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ isApprovedForAll = await contractWrappers.erc721Token.isApprovedForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ );
+ expect(isApprovedForAll).to.be.true();
+ // unset
+ txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ false,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ isApprovedForAll = await contractWrappers.erc721Token.isApprovedForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ );
+ expect(isApprovedForAll).to.be.false();
+ });
+ });
+ describe('#setProxyApprovalForAllAsync/isProxyApprovedForAllAsync', () => {
+ it('should check if proxy address is approved', async () => {
+ let isApprovedForAll = true;
+ const txHash = await contractWrappers.erc721Token.setProxyApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ isApprovedForAll = await contractWrappers.erc721Token.isProxyApprovedForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ );
+ expect(isApprovedForAll).to.be.true();
+ });
+ });
+ describe('#setApprovalAsync/getApprovedIfExistsAsync', () => {
+ it("should set the spender's approval", async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+
+ const approvalBeforeSet = await contractWrappers.erc721Token.getApprovedIfExistsAsync(
+ tokenAddress,
+ tokenId,
+ );
+ expect(approvalBeforeSet).to.be.undefined();
+ await contractWrappers.erc721Token.setApprovalAsync(tokenAddress, approvedAddress, tokenId);
+ const approvalAfterSet = await contractWrappers.erc721Token.getApprovedIfExistsAsync(tokenAddress, tokenId);
+ expect(approvalAfterSet).to.be.equal(approvedAddress);
+ });
+ });
+ describe('#setProxyApprovalAsync/isProxyApprovedAsync', () => {
+ it('should set the proxy approval', async () => {
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+
+ const approvalBeforeSet = await contractWrappers.erc721Token.isProxyApprovedAsync(tokenAddress, tokenId);
+ expect(approvalBeforeSet).to.be.false();
+ await contractWrappers.erc721Token.setProxyApprovalAsync(tokenAddress, tokenId);
+ const approvalAfterSet = await contractWrappers.erc721Token.isProxyApprovedAsync(tokenAddress, tokenId);
+ expect(approvalAfterSet).to.be.true();
+ });
+ });
+ describe('#subscribe', () => {
+ const indexFilterValues = {};
+ afterEach(() => {
+ contractWrappers.erc721Token.unsubscribeAll();
+ });
+ // Hack: Mocha does not allow a test to be both async and have a `done` callback
+ // Since we need to await the receipt of the event in the `subscribe` callback,
+ // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
+ // wrap the rest of the test in an async block
+ // Source: https://github.com/mochajs/mocha/issues/2407
+ it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC721TokenTransferEventArgs>) => {
+ expect(logEvent.isRemoved).to.be.false();
+ expect(logEvent.log.logIndex).to.be.equal(0);
+ expect(logEvent.log.transactionIndex).to.be.equal(0);
+ expect(logEvent.log.blockNumber).to.be.a('number');
+ const args = logEvent.log.args;
+ expect(args._from).to.be.equal(ownerAddress);
+ expect(args._to).to.be.equal(receiverAddress);
+ expect(args._tokenId).to.be.bignumber.equal(tokenId);
+ },
+ );
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ const isApprovedForAll = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ contractWrappers.erc721Token.subscribe(
+ tokenAddress,
+ ERC721TokenEvents.Transfer,
+ indexFilterValues,
+ callback,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await contractWrappers.erc721Token.transferFromAsync(
+ tokenAddress,
+ receiverAddress,
+ operatorAddress,
+ tokenId,
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ })().catch(done);
+ });
+ it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC721TokenApprovalEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ const args = logEvent.log.args;
+ expect(args._owner).to.be.equal(ownerAddress);
+ expect(args._approved).to.be.equal(approvedAddress);
+ expect(args._tokenId).to.be.bignumber.equal(tokenId);
+ },
+ );
+ contractWrappers.erc721Token.subscribe(
+ tokenAddress,
+ ERC721TokenEvents.Approval,
+ indexFilterValues,
+ callback,
+ );
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await contractWrappers.erc721Token.setApprovalAsync(tokenAddress, approvedAddress, tokenId),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ })().catch(done);
+ });
+ it('Outstanding subscriptions are cancelled when contractWrappers.setProvider called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC721TokenApprovalEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ contractWrappers.erc721Token.subscribe(
+ tokenAddress,
+ ERC721TokenEvents.Transfer,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ const callbackToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)();
+ contractWrappers.setProvider(provider, constants.TESTRPC_NETWORK_ID);
+ contractWrappers.erc721Token.subscribe(
+ tokenAddress,
+ ERC721TokenEvents.Approval,
+ indexFilterValues,
+ callbackToBeCalled,
+ );
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await contractWrappers.erc721Token.setApprovalAsync(tokenAddress, approvedAddress, tokenId),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ done();
+ })().catch(done);
+ });
+ it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ERC721TokenApprovalForAllEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ const subscriptionToken = contractWrappers.erc721Token.subscribe(
+ tokenAddress,
+ ERC721TokenEvents.ApprovalForAll,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ contractWrappers.erc721Token.unsubscribe(subscriptionToken);
+
+ const tokenId = await tokenUtils.mintDummyERC721Async(tokenAddress, ownerAddress);
+ const isApproved = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApproved,
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ done();
+ })().catch(done);
+ });
+ });
+ describe('#getLogsAsync', () => {
+ let tokenTransferProxyAddress: string;
+ const blockRange: BlockRange = {
+ fromBlock: 0,
+ toBlock: BlockParamLiteral.Latest,
+ };
+ let txHash: string;
+ before(() => {
+ tokenTransferProxyAddress = contractWrappers.erc721Proxy.getContractAddress();
+ });
+ it('should get logs with decoded args emitted by ApprovalForAll', async () => {
+ const isApprovedForAll = true;
+ txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = ERC721TokenEvents.ApprovalForAll;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.erc721Token.getLogsAsync<ERC721TokenApprovalForAllEventArgs>(
+ tokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(logs[0].event).to.be.equal(eventName);
+ expect(args._owner).to.be.equal(ownerAddress);
+ expect(args._operator).to.be.equal(operatorAddress);
+ expect(args._approved).to.be.equal(isApprovedForAll);
+ });
+ it('should only get the logs with the correct event name', async () => {
+ const isApprovedForAll = true;
+ txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const differentEventName = ERC721TokenEvents.Transfer;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.erc721Token.getLogsAsync(
+ tokenAddress,
+ differentEventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(0);
+ });
+ it('should only get the logs with the correct indexed fields', async () => {
+ const isApprovedForAll = true;
+ txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ ownerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ txHash = await contractWrappers.erc721Token.setApprovalForAllAsync(
+ tokenAddress,
+ anotherOwnerAddress,
+ operatorAddress,
+ isApprovedForAll,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = ERC721TokenEvents.ApprovalForAll;
+ const indexFilterValues = {
+ _owner: anotherOwnerAddress,
+ };
+ const logs = await contractWrappers.erc721Token.getLogsAsync<ERC721TokenApprovalForAllEventArgs>(
+ tokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(args._owner).to.be.equal(anotherOwnerAddress);
+ });
+ });
+});
+// tslint:disable:max-file-line-count
+
+function addEmptyWalletSubprovider(p: Provider): Provider {
+ const providerEngine = new Web3ProviderEngine();
+ providerEngine.addProvider(new EmptyWalletSubprovider());
+ const currentSubproviders = (p as any)._providers;
+ for (const subprovider of currentSubproviders) {
+ providerEngine.addProvider(subprovider);
+ }
+ providerEngine.start();
+ return providerEngine;
+}
diff --git a/packages/contract-wrappers/test/ether_token_wrapper_test.ts b/packages/contract-wrappers/test/ether_token_wrapper_test.ts
new file mode 100644
index 000000000..48bd6d3f6
--- /dev/null
+++ b/packages/contract-wrappers/test/ether_token_wrapper_test.ts
@@ -0,0 +1,432 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { DoneCallback } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import 'mocha';
+
+import {
+ BlockParamLiteral,
+ BlockRange,
+ ContractWrappers,
+ ContractWrappersError,
+ DecodedLogEvent,
+ WETH9ApprovalEventArgs,
+ WETH9DepositEventArgs,
+ WETH9Events,
+ WETH9TransferEventArgs,
+ WETH9WithdrawalEventArgs,
+} from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+// Since the address depositing/withdrawing ETH/WETH also needs to pay gas costs for the transaction,
+// a small amount of ETH will be used to pay this gas cost. We therefore check that the difference between
+// the expected balance and actual balance (given the amount of ETH deposited), only deviates by the amount
+// required to pay gas costs.
+const MAX_REASONABLE_GAS_COST_IN_WEI = 62517;
+
+describe('EtherTokenWrapper', () => {
+ let contractWrappers: ContractWrappers;
+ let userAddresses: string[];
+ let addressWithETH: string;
+ let wethContractAddress: string;
+ let depositWeiAmount: BigNumber;
+ const decimalPlaces = 7;
+ let addressWithoutFunds: string;
+ const gasPrice = new BigNumber(1);
+ const zeroExConfig = {
+ gasPrice,
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ const transferAmount = new BigNumber(42);
+ const allowanceAmount = new BigNumber(42);
+ const depositAmount = new BigNumber(42);
+ const withdrawalAmount = new BigNumber(42);
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, zeroExConfig);
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ addressWithETH = userAddresses[0];
+ wethContractAddress = contractWrappers.etherToken.getContractAddressIfExists() as string;
+ depositWeiAmount = Web3Wrapper.toWei(new BigNumber(5));
+ addressWithoutFunds = userAddresses[1];
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#getContractAddressIfExists', async () => {
+ it('should return contract address if connected to a known network', () => {
+ const contractAddressIfExists = contractWrappers.etherToken.getContractAddressIfExists();
+ expect(contractAddressIfExists).to.not.be.undefined();
+ });
+ it('should throw if connected to a private network and contract addresses are not specified', () => {
+ const UNKNOWN_NETWORK_NETWORK_ID = 10;
+ expect(
+ () =>
+ new ContractWrappers(provider, {
+ networkId: UNKNOWN_NETWORK_NETWORK_ID,
+ } as any),
+ ).to.throw();
+ });
+ });
+ describe('#depositAsync', () => {
+ it('should successfully deposit ETH and issue Wrapped ETH tokens', async () => {
+ const preETHBalance = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+ const preWETHBalance = await contractWrappers.erc20Token.getBalanceAsync(
+ wethContractAddress,
+ addressWithETH,
+ );
+ expect(preETHBalance).to.be.bignumber.gt(0);
+ expect(preWETHBalance).to.be.bignumber.equal(0);
+
+ const txHash = await contractWrappers.etherToken.depositAsync(
+ wethContractAddress,
+ depositWeiAmount,
+ addressWithETH,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+
+ const postETHBalanceInWei = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+ const postWETHBalanceInBaseUnits = await contractWrappers.erc20Token.getBalanceAsync(
+ wethContractAddress,
+ addressWithETH,
+ );
+
+ expect(postWETHBalanceInBaseUnits).to.be.bignumber.equal(depositWeiAmount);
+ const remainingETHInWei = preETHBalance.minus(depositWeiAmount);
+ const gasCost = remainingETHInWei.minus(postETHBalanceInWei);
+ expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
+ });
+ it('should throw if user has insufficient ETH balance for deposit', async () => {
+ const preETHBalance = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+
+ const extraETHBalance = Web3Wrapper.toWei(new BigNumber(5));
+ const overETHBalanceinWei = preETHBalance.add(extraETHBalance);
+
+ return expect(
+ contractWrappers.etherToken.depositAsync(wethContractAddress, overETHBalanceinWei, addressWithETH),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientEthBalanceForDeposit);
+ });
+ });
+ describe('#withdrawAsync', () => {
+ it('should successfully withdraw ETH in return for Wrapped ETH tokens', async () => {
+ const ETHBalanceInWei = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+
+ await contractWrappers.etherToken.depositAsync(wethContractAddress, depositWeiAmount, addressWithETH);
+
+ const expectedPreETHBalance = ETHBalanceInWei.minus(depositWeiAmount);
+ const preETHBalance = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+ const preWETHBalance = await contractWrappers.erc20Token.getBalanceAsync(
+ wethContractAddress,
+ addressWithETH,
+ );
+ let gasCost = expectedPreETHBalance.minus(preETHBalance);
+ expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
+ expect(preWETHBalance).to.be.bignumber.equal(depositWeiAmount);
+
+ const txHash = await contractWrappers.etherToken.withdrawAsync(
+ wethContractAddress,
+ depositWeiAmount,
+ addressWithETH,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+
+ const postETHBalance = await web3Wrapper.getBalanceInWeiAsync(addressWithETH);
+ const postWETHBalanceInBaseUnits = await contractWrappers.erc20Token.getBalanceAsync(
+ wethContractAddress,
+ addressWithETH,
+ );
+
+ expect(postWETHBalanceInBaseUnits).to.be.bignumber.equal(0);
+ const expectedETHBalance = preETHBalance.add(depositWeiAmount).round(decimalPlaces);
+ gasCost = expectedETHBalance.minus(postETHBalance);
+ expect(gasCost).to.be.bignumber.lte(MAX_REASONABLE_GAS_COST_IN_WEI);
+ });
+ it('should throw if user has insufficient WETH balance for withdrawal', async () => {
+ const preWETHBalance = await contractWrappers.erc20Token.getBalanceAsync(
+ wethContractAddress,
+ addressWithETH,
+ );
+ expect(preWETHBalance).to.be.bignumber.equal(0);
+
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const overWETHBalance = preWETHBalance.add(999999999);
+
+ return expect(
+ contractWrappers.etherToken.withdrawAsync(wethContractAddress, overWETHBalance, addressWithETH),
+ ).to.be.rejectedWith(ContractWrappersError.InsufficientWEthBalanceForWithdrawal);
+ });
+ });
+ describe('#subscribe', () => {
+ const indexFilterValues = {};
+ let etherTokenAddress: string;
+ before(async () => {
+ etherTokenAddress = tokenUtils.getWethTokenAddress();
+ });
+ afterEach(() => {
+ contractWrappers.etherToken.unsubscribeAll();
+ });
+ // Hack: Mocha does not allow a test to be both async and have a `done` callback
+ // Since we need to await the receipt of the event in the `subscribe` callback,
+ // we do need both. A hack is to make the top-level async fn w/ a done callback and then
+ // wrap the rest of the test in an async block
+ // Source: https://github.com/mochajs/mocha/issues/2407
+ it('Should receive the Transfer event when tokens are transfered', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<WETH9TransferEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ expect(logEvent.log.logIndex).to.be.equal(0);
+ expect(logEvent.log.transactionIndex).to.be.equal(0);
+ expect(logEvent.log.blockNumber).to.be.a('number');
+ const args = logEvent.log.args;
+ expect(args._from).to.be.equal(addressWithETH);
+ expect(args._to).to.be.equal(addressWithoutFunds);
+ expect(args._value).to.be.bignumber.equal(transferAmount);
+ },
+ );
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Transfer,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ etherTokenAddress,
+ addressWithETH,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ })().catch(done);
+ });
+ it('Should receive the Approval event when allowance is being set', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<WETH9ApprovalEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ const args = logEvent.log.args;
+ expect(args._owner).to.be.equal(addressWithETH);
+ expect(args._spender).to.be.equal(addressWithoutFunds);
+ expect(args._value).to.be.bignumber.equal(allowanceAmount);
+ },
+ );
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Approval,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.erc20Token.setAllowanceAsync(
+ etherTokenAddress,
+ addressWithETH,
+ addressWithoutFunds,
+ allowanceAmount,
+ );
+ })().catch(done);
+ });
+ it('Should receive the Deposit event when ether is being deposited', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<WETH9DepositEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ const args = logEvent.log.args;
+ expect(args._owner).to.be.equal(addressWithETH);
+ expect(args._value).to.be.bignumber.equal(depositAmount);
+ },
+ );
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Deposit,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
+ })().catch(done);
+ });
+ it('Should receive the Withdrawal event when ether is being withdrawn', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<WETH9WithdrawalEventArgs>) => {
+ expect(logEvent).to.not.be.undefined();
+ expect(logEvent.isRemoved).to.be.false();
+ const args = logEvent.log.args;
+ expect(args._owner).to.be.equal(addressWithETH);
+ expect(args._value).to.be.bignumber.equal(depositAmount);
+ },
+ );
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Withdrawal,
+ indexFilterValues,
+ callback,
+ );
+ await contractWrappers.etherToken.withdrawAsync(etherTokenAddress, withdrawalAmount, addressWithETH);
+ })().catch(done);
+ });
+ it('should cancel outstanding subscriptions when ZeroEx.setProvider is called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (_logEvent: DecodedLogEvent<WETH9ApprovalEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Transfer,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ const callbackToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)();
+ contractWrappers.setProvider(provider, constants.TESTRPC_NETWORK_ID);
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
+ contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Transfer,
+ indexFilterValues,
+ callbackToBeCalled,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ etherTokenAddress,
+ addressWithETH,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ })().catch(done);
+ });
+ it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (_logEvent: DecodedLogEvent<WETH9ApprovalEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, transferAmount, addressWithETH);
+ const subscriptionToken = contractWrappers.etherToken.subscribe(
+ etherTokenAddress,
+ WETH9Events.Transfer,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ contractWrappers.etherToken.unsubscribe(subscriptionToken);
+ await contractWrappers.erc20Token.transferAsync(
+ etherTokenAddress,
+ addressWithETH,
+ addressWithoutFunds,
+ transferAmount,
+ );
+ done();
+ })().catch(done);
+ });
+ });
+ describe('#getLogsAsync', () => {
+ let etherTokenAddress: string;
+ let erc20ProxyAddress: string;
+ let blockRange: BlockRange;
+ let txHash: string;
+ before(async () => {
+ addressWithETH = userAddresses[0];
+ etherTokenAddress = tokenUtils.getWethTokenAddress();
+ erc20ProxyAddress = contractWrappers.erc20Proxy.getContractAddress();
+ // Start the block range after all migrations to avoid unexpected logs
+ const currentBlock = await web3Wrapper.getBlockNumberAsync();
+ const fromBlock = currentBlock + 1;
+ blockRange = {
+ fromBlock,
+ toBlock: BlockParamLiteral.Latest,
+ };
+ });
+ it('should get logs with decoded args emitted by Approval', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
+ etherTokenAddress,
+ addressWithETH,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = WETH9Events.Approval;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.etherToken.getLogsAsync<WETH9ApprovalEventArgs>(
+ etherTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(logs[0].event).to.be.equal(eventName);
+ expect(args._owner).to.be.equal(addressWithETH);
+ expect(args._spender).to.be.equal(erc20ProxyAddress);
+ expect(args._value).to.be.bignumber.equal(contractWrappers.erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ });
+ it('should get logs with decoded args emitted by Deposit', async () => {
+ await contractWrappers.etherToken.depositAsync(etherTokenAddress, depositAmount, addressWithETH);
+ const eventName = WETH9Events.Deposit;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.etherToken.getLogsAsync<WETH9DepositEventArgs>(
+ etherTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(logs[0].event).to.be.equal(eventName);
+ expect(args._owner).to.be.equal(addressWithETH);
+ expect(args._value).to.be.bignumber.equal(depositAmount);
+ });
+ it('should only get the logs with the correct event name', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
+ etherTokenAddress,
+ addressWithETH,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const differentEventName = WETH9Events.Transfer;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.etherToken.getLogsAsync(
+ etherTokenAddress,
+ differentEventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(0);
+ });
+ it('should only get the logs with the correct indexed fields', async () => {
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
+ etherTokenAddress,
+ addressWithETH,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ txHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
+ etherTokenAddress,
+ addressWithoutFunds,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const eventName = WETH9Events.Approval;
+ const indexFilterValues = {
+ _owner: addressWithETH,
+ };
+ const logs = await contractWrappers.etherToken.getLogsAsync<WETH9ApprovalEventArgs>(
+ etherTokenAddress,
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(args._owner).to.be.equal(addressWithETH);
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/exchange_wrapper_test.ts b/packages/contract-wrappers/test/exchange_wrapper_test.ts
new file mode 100644
index 000000000..fa3b49eb9
--- /dev/null
+++ b/packages/contract-wrappers/test/exchange_wrapper_test.ts
@@ -0,0 +1,526 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { FillScenarios } from '@0xproject/fill-scenarios';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { DoneCallback, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { BlockParamLiteral } from 'ethereum-types';
+import 'mocha';
+
+import {
+ ContractWrappers,
+ DecodedLogEvent,
+ ExchangeCancelEventArgs,
+ ExchangeEvents,
+ ExchangeFillEventArgs,
+ OrderStatus,
+} from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ExchangeWrapper', () => {
+ let contractWrappers: ContractWrappers;
+ let userAddresses: string[];
+ let zrxTokenAddress: string;
+ let fillScenarios: FillScenarios;
+ let exchangeContractAddress: string;
+ let makerTokenAddress: string;
+ let takerTokenAddress: string;
+ let coinbase: string;
+ let makerAddress: string;
+ let anotherMakerAddress: string;
+ let takerAddress: string;
+ let makerAssetData: string;
+ let takerAssetData: string;
+ let feeRecipient: string;
+ let txHash: string;
+ const fillableAmount = new BigNumber(5);
+ const takerTokenFillAmount = new BigNumber(5);
+ let signedOrder: SignedOrder;
+ let anotherSignedOrder: SignedOrder;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ blockPollingIntervalMs: 0,
+ };
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ contractWrappers = new ContractWrappers(provider, config);
+ exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
+ [coinbase, makerAddress, takerAddress, feeRecipient, anotherMakerAddress] = userAddresses;
+ [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('fill order(s)', () => {
+ describe('#fillOrderAsync', () => {
+ it('should fill a valid order', async () => {
+ txHash = await contractWrappers.exchange.fillOrderAsync(
+ signedOrder,
+ takerTokenFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#fillOrderNoThrowAsync', () => {
+ it('should fill a valid order', async () => {
+ txHash = await contractWrappers.exchange.fillOrderNoThrowAsync(
+ signedOrder,
+ takerTokenFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const orderInfo = await contractWrappers.exchange.getOrderInfoAsync(signedOrder);
+ expect(orderInfo.orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+ describe('#fillOrKillOrderAsync', () => {
+ it('should fill or kill a valid order', async () => {
+ txHash = await contractWrappers.exchange.fillOrKillOrderAsync(
+ signedOrder,
+ takerTokenFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#batchFillOrdersAsync', () => {
+ it('should fill a batch of valid orders', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount];
+ txHash = await contractWrappers.exchange.batchFillOrdersAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#marketBuyOrdersAsync', () => {
+ it('should maker buy', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const makerAssetFillAmount = takerTokenFillAmount;
+ txHash = await contractWrappers.exchange.marketBuyOrdersAsync(
+ signedOrders,
+ makerAssetFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#marketBuyOrdersNoThrowAsync', () => {
+ it('should no throw maker buy', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const makerAssetFillAmount = takerTokenFillAmount;
+ txHash = await contractWrappers.exchange.marketBuyOrdersNoThrowAsync(
+ signedOrders,
+ makerAssetFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const orderInfo = await contractWrappers.exchange.getOrderInfoAsync(signedOrder);
+ expect(orderInfo.orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+ describe('#marketSellOrdersAsync', () => {
+ it('should maker sell', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const takerAssetFillAmount = takerTokenFillAmount;
+ txHash = await contractWrappers.exchange.marketSellOrdersAsync(
+ signedOrders,
+ takerAssetFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#marketSellOrdersNoThrowAsync', () => {
+ it('should no throw maker sell', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const takerAssetFillAmount = takerTokenFillAmount;
+ txHash = await contractWrappers.exchange.marketSellOrdersNoThrowAsync(
+ signedOrders,
+ takerAssetFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const orderInfo = await contractWrappers.exchange.getOrderInfoAsync(signedOrder);
+ expect(orderInfo.orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+ describe('#batchFillOrdersNoThrowAsync', () => {
+ it('should fill a batch of valid orders', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount];
+ txHash = await contractWrappers.exchange.batchFillOrdersNoThrowAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ let orderInfo = await contractWrappers.exchange.getOrderInfoAsync(signedOrder);
+ expect(orderInfo.orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ orderInfo = await contractWrappers.exchange.getOrderInfoAsync(anotherSignedOrder);
+ expect(orderInfo.orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+ describe('#batchFillOrKillOrdersAsync', () => {
+ it('should fill or kill a batch of valid orders', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const takerAssetFillAmounts = [takerTokenFillAmount, takerTokenFillAmount];
+ txHash = await contractWrappers.exchange.batchFillOrKillOrdersAsync(
+ signedOrders,
+ takerAssetFillAmounts,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#matchOrdersAsync', () => {
+ it('should match two valid ordersr', async () => {
+ const matchingSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ takerAssetData,
+ makerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ txHash = await contractWrappers.exchange.matchOrdersAsync(
+ signedOrder,
+ matchingSignedOrder,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ });
+ describe('cancel order(s)', () => {
+ describe('#cancelOrderAsync', () => {
+ it('should cancel a valid order', async () => {
+ txHash = await contractWrappers.exchange.cancelOrderAsync(signedOrder);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#batchCancelOrdersAsync', () => {
+ it('should cancel a batch of valid orders', async () => {
+ const orders = [signedOrder, anotherSignedOrder];
+ txHash = await contractWrappers.exchange.batchCancelOrdersAsync(orders);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#cancelOrdersUpTo/getOrderEpochAsync', () => {
+ it('should cancel orders up to target order epoch', async () => {
+ const targetOrderEpoch = new BigNumber(42);
+ txHash = await contractWrappers.exchange.cancelOrdersUpToAsync(targetOrderEpoch, makerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const orderEpoch = await contractWrappers.exchange.getOrderEpochAsync(
+ makerAddress,
+ constants.NULL_ADDRESS,
+ );
+ expect(orderEpoch).to.be.bignumber.equal(targetOrderEpoch.plus(1));
+ });
+ });
+ });
+ describe('#getZRXAssetData', () => {
+ it('should get the asset data', () => {
+ const ZRX_ASSET_DATA = contractWrappers.exchange.getZRXAssetData();
+ const ASSET_DATA_HEX_LENGTH = 74;
+ expect(ZRX_ASSET_DATA).to.have.length(ASSET_DATA_HEX_LENGTH);
+ });
+ });
+ describe('#getOrderInfoAsync', () => {
+ it('should get the order info', async () => {
+ const orderInfo = await contractWrappers.exchange.getOrderInfoAsync(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expect(orderInfo.orderHash).to.be.equal(orderHash);
+ });
+ });
+ describe('#getOrdersInfoAsync', () => {
+ it('should get the orders info', async () => {
+ const ordersInfo = await contractWrappers.exchange.getOrdersInfoAsync([signedOrder, anotherSignedOrder]);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expect(ordersInfo[0].orderHash).to.be.equal(orderHash);
+ const anotherOrderHash = orderHashUtils.getOrderHashHex(anotherSignedOrder);
+ expect(ordersInfo[1].orderHash).to.be.equal(anotherOrderHash);
+ });
+ });
+ describe('#isValidSignature', () => {
+ it('should check if the signature is valid', async () => {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ let isValid = await contractWrappers.exchange.isValidSignatureAsync(
+ orderHash,
+ signedOrder.makerAddress,
+ signedOrder.signature,
+ );
+ expect(isValid).to.be.true();
+ isValid = await contractWrappers.exchange.isValidSignatureAsync(
+ orderHash,
+ signedOrder.takerAddress,
+ signedOrder.signature,
+ );
+ expect(isValid).to.be.false();
+ });
+ });
+ describe('#isAllowedValidatorAsync', () => {
+ it('should check if the validator is allowed', async () => {
+ const signerAddress = makerAddress;
+ const validatorAddress = constants.NULL_ADDRESS;
+ const isAllowed = await contractWrappers.exchange.isAllowedValidatorAsync(signerAddress, validatorAddress);
+ expect(isAllowed).to.be.false();
+ });
+ });
+ describe('#setSignatureValidatorApproval', () => {
+ it('should set signature validator approval', async () => {
+ const validatorAddress = constants.NULL_ADDRESS;
+ const isApproved = true;
+ const senderAddress = makerAddress;
+ txHash = await contractWrappers.exchange.setSignatureValidatorApprovalAsync(
+ validatorAddress,
+ isApproved,
+ senderAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ });
+ });
+ describe('#isTransactionExecutedAsync', () => {
+ it('should check if the transaction is executed', async () => {
+ const transactionHash = '0x0000000000000000000000000000000000000000000000000000000000000000';
+ const isExecuted = await contractWrappers.exchange.isTransactionExecutedAsync(transactionHash);
+ expect(isExecuted).to.be.false();
+ });
+ });
+ describe('#getAssetProxyBySignatureAsync', () => {
+ it('should fill or kill a valid order', async () => {
+ const erc20ProxyId = await contractWrappers.erc20Proxy.getProxyIdAsync();
+ const erc20ProxyAddressById = await contractWrappers.exchange.getAssetProxyBySignatureAsync(erc20ProxyId);
+ const erc20ProxyAddress = contractWrappers.erc20Proxy.getContractAddress();
+ expect(erc20ProxyAddressById).to.be.equal(erc20ProxyAddress);
+ const erc721ProxyId = await contractWrappers.erc721Proxy.getProxyIdAsync();
+ const erc721ProxyAddressById = await contractWrappers.exchange.getAssetProxyBySignatureAsync(erc721ProxyId);
+ const erc721ProxyAddress = contractWrappers.erc721Proxy.getContractAddress();
+ expect(erc721ProxyAddressById).to.be.equal(erc721ProxyAddress);
+ });
+ });
+ describe('#preSignAsync/isPreSignedAsync', () => {
+ it('should preSign the hash', async () => {
+ const senderAddress = takerAddress;
+ const hash = orderHashUtils.getOrderHashHex(signedOrder);
+ const signerAddress = signedOrder.makerAddress;
+ let isPreSigned = await contractWrappers.exchange.isPreSignedAsync(hash, signerAddress);
+ expect(isPreSigned).to.be.false();
+ txHash = await contractWrappers.exchange.preSignAsync(
+ hash,
+ signerAddress,
+ signedOrder.signature,
+ senderAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ isPreSigned = await contractWrappers.exchange.isPreSignedAsync(hash, signerAddress);
+ expect(isPreSigned).to.be.true();
+ });
+ });
+ describe('#getVersionAsync', () => {
+ it('should return version the hash', async () => {
+ const version = await contractWrappers.exchange.getVersionAsync();
+ const VERSION = '2.0.1-alpha';
+ expect(version).to.be.equal(VERSION);
+ });
+ });
+ describe('#subscribe', () => {
+ const indexFilterValues = {};
+ const takerTokenFillAmountInBaseUnits = new BigNumber(1);
+ beforeEach(async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ });
+ afterEach(async () => {
+ contractWrappers.exchange.unsubscribeAll();
+ });
+ // Hack: Mocha does not allow a test to be both async and have a `done` callback
+ // Since we need to await the receipt of the event in the `subscribe` callback,
+ // we do need both. A hack is to make the top-level a sync fn w/ a done callback and then
+ // wrap the rest of the test in an async block
+ // Source: https://github.com/mochajs/mocha/issues/2407
+ it('Should receive the Fill event when an order is filled', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ExchangeFillEventArgs>) => {
+ expect(logEvent.log.event).to.be.equal(ExchangeEvents.Fill);
+ },
+ );
+ contractWrappers.exchange.subscribe(ExchangeEvents.Fill, indexFilterValues, callback);
+ await contractWrappers.exchange.fillOrderAsync(
+ signedOrder,
+ takerTokenFillAmountInBaseUnits,
+ takerAddress,
+ );
+ })().catch(done);
+ });
+ it('Should receive the LogCancel event when an order is cancelled', (done: DoneCallback) => {
+ (async () => {
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ExchangeCancelEventArgs>) => {
+ expect(logEvent.log.event).to.be.equal(ExchangeEvents.Cancel);
+ },
+ );
+ contractWrappers.exchange.subscribe(ExchangeEvents.Cancel, indexFilterValues, callback);
+ await contractWrappers.exchange.cancelOrderAsync(signedOrder);
+ })().catch(done);
+ });
+ it('Outstanding subscriptions are cancelled when contractWrappers.setProvider called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ExchangeFillEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ contractWrappers.exchange.subscribe(ExchangeEvents.Fill, indexFilterValues, callbackNeverToBeCalled);
+
+ contractWrappers.setProvider(provider, constants.TESTRPC_NETWORK_ID);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (logEvent: DecodedLogEvent<ExchangeFillEventArgs>) => {
+ expect(logEvent.log.event).to.be.equal(ExchangeEvents.Fill);
+ },
+ );
+ contractWrappers.exchange.subscribe(ExchangeEvents.Fill, indexFilterValues, callback);
+ await contractWrappers.exchange.fillOrderAsync(
+ signedOrder,
+ takerTokenFillAmountInBaseUnits,
+ takerAddress,
+ );
+ })().catch(done);
+ });
+ it('Should cancel subscription when unsubscribe called', (done: DoneCallback) => {
+ (async () => {
+ const callbackNeverToBeCalled = callbackErrorReporter.reportNodeCallbackErrors(done)(
+ (_logEvent: DecodedLogEvent<ExchangeFillEventArgs>) => {
+ done(new Error('Expected this subscription to have been cancelled'));
+ },
+ );
+ const subscriptionToken = contractWrappers.exchange.subscribe(
+ ExchangeEvents.Fill,
+ indexFilterValues,
+ callbackNeverToBeCalled,
+ );
+ contractWrappers.exchange.unsubscribe(subscriptionToken);
+ await contractWrappers.exchange.fillOrderAsync(
+ signedOrder,
+ takerTokenFillAmountInBaseUnits,
+ takerAddress,
+ );
+ done();
+ })().catch(done);
+ });
+ });
+ describe('#getZRXTokenAddressAsync', () => {
+ it('gets the same token as is in token registry', () => {
+ const zrxAddressFromExchangeWrapper = contractWrappers.exchange.getZRXTokenAddress();
+ const zrxAddress = tokenUtils.getProtocolTokenAddress();
+ expect(zrxAddressFromExchangeWrapper).to.equal(zrxAddress);
+ });
+ });
+ describe('#getLogsAsync', () => {
+ const blockRange = {
+ fromBlock: 0,
+ toBlock: BlockParamLiteral.Latest,
+ };
+ it('should get logs with decoded args emitted by Fill', async () => {
+ txHash = await contractWrappers.exchange.fillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress);
+ const eventName = ExchangeEvents.Fill;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.exchange.getLogsAsync(eventName, blockRange, indexFilterValues);
+ expect(logs).to.have.length(1);
+ expect(logs[0].event).to.be.equal(eventName);
+ });
+ it('should only get the logs with the correct event name', async () => {
+ txHash = await contractWrappers.exchange.fillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const differentEventName = ExchangeEvents.Cancel;
+ const indexFilterValues = {};
+ const logs = await contractWrappers.exchange.getLogsAsync(
+ differentEventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(0);
+ });
+ it('should only get the logs with the correct indexed fields', async () => {
+ txHash = await contractWrappers.exchange.fillOrderAsync(signedOrder, takerTokenFillAmount, takerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const signedOrderWithAnotherMakerAddress = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ anotherMakerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ txHash = await contractWrappers.exchange.fillOrderAsync(
+ signedOrderWithAnotherMakerAddress,
+ takerTokenFillAmount,
+ takerAddress,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+
+ const eventName = ExchangeEvents.Fill;
+ const indexFilterValues = {
+ makerAddress: anotherMakerAddress,
+ };
+ const logs = await contractWrappers.exchange.getLogsAsync<ExchangeFillEventArgs>(
+ eventName,
+ blockRange,
+ indexFilterValues,
+ );
+ expect(logs).to.have.length(1);
+ const args = logs[0].args;
+ expect(args.makerAddress).to.be.equal(anotherMakerAddress);
+ });
+ });
+}); // tslint:disable:max-file-line-count
diff --git a/packages/contract-wrappers/test/forwarder_wrapper_test.ts b/packages/contract-wrappers/test/forwarder_wrapper_test.ts
new file mode 100644
index 000000000..3f3b40e0b
--- /dev/null
+++ b/packages/contract-wrappers/test/forwarder_wrapper_test.ts
@@ -0,0 +1,130 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { FillScenarios } from '@0xproject/fill-scenarios';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { DoneCallback, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { BlockParamLiteral } from 'ethereum-types';
+import 'mocha';
+
+import {
+ ContractWrappers,
+ DecodedLogEvent,
+ ExchangeCancelEventArgs,
+ ExchangeEvents,
+ ExchangeFillEventArgs,
+ OrderStatus,
+} from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ForwarderWrapper', () => {
+ const contractWrappersConfig = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ blockPollingIntervalMs: 0,
+ };
+ const fillableAmount = new BigNumber(5);
+ const takerTokenFillAmount = new BigNumber(5);
+ let contractWrappers: ContractWrappers;
+ let fillScenarios: FillScenarios;
+ let forwarderContractAddress: string;
+ let exchangeContractAddress: string;
+ let zrxTokenAddress: string;
+ let userAddresses: string[];
+ let coinbase: string;
+ let makerAddress: string;
+ let takerAddress: string;
+ let feeRecipient: string;
+ let anotherMakerAddress: string;
+ let makerTokenAddress: string;
+ let takerTokenAddress: string;
+ let makerAssetData: string;
+ let takerAssetData: string;
+ let signedOrder: SignedOrder;
+ let anotherSignedOrder: SignedOrder;
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ contractWrappers = new ContractWrappers(provider, contractWrappersConfig);
+ forwarderContractAddress = contractWrappers.forwarder.getContractAddress();
+ exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
+ [coinbase, makerAddress, takerAddress, feeRecipient, anotherMakerAddress] = userAddresses;
+ [makerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ takerTokenAddress = tokenUtils.getWethTokenAddress();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ constants.NULL_ADDRESS,
+ fillableAmount,
+ );
+ anotherSignedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ constants.NULL_ADDRESS,
+ fillableAmount,
+ );
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#marketBuyOrdersWithEthAsync', () => {
+ it('should market buy orders with eth', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const makerAssetFillAmount = signedOrder.makerAssetAmount.plus(anotherSignedOrder.makerAssetAmount);
+ const txHash = await contractWrappers.forwarder.marketBuyOrdersWithEthAsync(
+ signedOrders,
+ makerAssetFillAmount,
+ takerAddress,
+ makerAssetFillAmount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const ordersInfo = await contractWrappers.exchange.getOrdersInfoAsync([signedOrder, anotherSignedOrder]);
+ expect(ordersInfo[0].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+ describe('#marketSellOrdersWithEthAsync', () => {
+ it('should market sell orders with eth', async () => {
+ const signedOrders = [signedOrder, anotherSignedOrder];
+ const makerAssetFillAmount = signedOrder.makerAssetAmount.plus(anotherSignedOrder.makerAssetAmount);
+ const txHash = await contractWrappers.forwarder.marketSellOrdersWithEthAsync(
+ signedOrders,
+ takerAddress,
+ makerAssetFillAmount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ const ordersInfo = await contractWrappers.exchange.getOrdersInfoAsync([signedOrder, anotherSignedOrder]);
+ expect(ordersInfo[0].orderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ expect(ordersInfo[1].orderStatus).to.be.equal(OrderStatus.FILLABLE);
+ expect(ordersInfo[1].orderTakerAssetFilledAmount).to.be.bignumber.equal(new BigNumber(4)); // only 95% of ETH is sold
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/global_hooks.ts b/packages/contract-wrappers/test/global_hooks.ts
new file mode 100644
index 000000000..05b23d5b8
--- /dev/null
+++ b/packages/contract-wrappers/test/global_hooks.ts
@@ -0,0 +1,17 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { runV2MigrationsAsync } from '@0xproject/migrations';
+
+import { provider } from './utils/web3_wrapper';
+
+before('migrate contracts', async function(): Promise<void> {
+ // HACK: Since the migrations take longer then our global mocha timeout limit
+ // we manually increase it for this before hook.
+ const mochaTestTimeoutMs = 50000;
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
+ const txDefaults = {
+ gas: devConstants.GAS_LIMIT,
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+ const artifactsDir = `../migrations/artifacts/2.0.0`;
+ await runV2MigrationsAsync(provider, artifactsDir, txDefaults);
+});
diff --git a/packages/contract-wrappers/test/subscription_test.ts b/packages/contract-wrappers/test/subscription_test.ts
new file mode 100644
index 000000000..80d17576f
--- /dev/null
+++ b/packages/contract-wrappers/test/subscription_test.ts
@@ -0,0 +1,72 @@
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { DoneCallback } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+import 'mocha';
+import * as Sinon from 'sinon';
+
+import { ContractWrappers, DecodedLogEvent, ERC20TokenApprovalEventArgs, ERC20TokenEvents, Token } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { tokenUtils } from './utils/token_utils';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('SubscriptionTest', () => {
+ let contractWrappers: ContractWrappers;
+ let userAddresses: string[];
+ let coinbase: string;
+ let addressWithoutFunds: string;
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ before(async () => {
+ contractWrappers = new ContractWrappers(provider, config);
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ coinbase = userAddresses[0];
+ addressWithoutFunds = userAddresses[1];
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#subscribe', () => {
+ const indexFilterValues = {};
+ let tokenAddress: string;
+ const allowanceAmount = new BigNumber(42);
+ let stubs: Sinon.SinonStub[] = [];
+ before(() => {
+ const tokenAddresses = tokenUtils.getDummyERC20TokenAddresses();
+ tokenAddress = tokenAddresses[0];
+ });
+ afterEach(() => {
+ contractWrappers.erc20Token.unsubscribeAll();
+ _.each(stubs, s => s.restore());
+ stubs = [];
+ });
+ it('Should allow unsubscribeAll to be called successfully after an error', (done: DoneCallback) => {
+ (async () => {
+ const callback = (err: Error | null, _logEvent?: DecodedLogEvent<ERC20TokenApprovalEventArgs>) =>
+ _.noop;
+ contractWrappers.erc20Token.subscribe(
+ tokenAddress,
+ ERC20TokenEvents.Approval,
+ indexFilterValues,
+ callback,
+ );
+ stubs = [
+ Sinon.stub((contractWrappers as any)._web3Wrapper, 'getBlockAsync').throws(
+ new Error('JSON RPC error'),
+ ),
+ ];
+ contractWrappers.erc20Token.unsubscribeAll();
+ done();
+ })().catch(done);
+ });
+ });
+});
diff --git a/packages/contract-wrappers/test/utils/chai_setup.ts b/packages/contract-wrappers/test/utils/chai_setup.ts
new file mode 100644
index 000000000..1a8733093
--- /dev/null
+++ b/packages/contract-wrappers/test/utils/chai_setup.ts
@@ -0,0 +1,13 @@
+import * as chai from 'chai';
+import chaiAsPromised = require('chai-as-promised');
+import ChaiBigNumber = require('chai-bignumber');
+import * as dirtyChai from 'dirty-chai';
+
+export const chaiSetup = {
+ configure(): void {
+ chai.config.includeStack = true;
+ chai.use(ChaiBigNumber());
+ chai.use(dirtyChai);
+ chai.use(chaiAsPromised);
+ },
+};
diff --git a/packages/contract-wrappers/test/utils/constants.ts b/packages/contract-wrappers/test/utils/constants.ts
new file mode 100644
index 000000000..60c3370a2
--- /dev/null
+++ b/packages/contract-wrappers/test/utils/constants.ts
@@ -0,0 +1,18 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const constants = {
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ ROPSTEN_NETWORK_ID: 3,
+ KOVAN_NETWORK_ID: 42,
+ TESTRPC_NETWORK_ID: 50,
+ AWAIT_TRANSACTION_MINED_MS: 0,
+ KOVAN_RPC_URL: 'https://kovan.infura.io/',
+ ROPSTEN_RPC_URL: 'https://ropsten.infura.io/',
+ ZRX_DECIMALS: 18,
+ DUMMY_TOKEN_NAME: '',
+ DUMMY_TOKEN_SYMBOL: '',
+ DUMMY_TOKEN_DECIMALS: 18,
+ DUMMY_TOKEN_TOTAL_SUPPLY: new BigNumber(10 ** 27), // tslint:disable-line:custom-no-magic-numbers
+ NUM_DUMMY_ERC20_TO_DEPLOY: 3,
+ NUM_DUMMY_ERC721_TO_DEPLOY: 1,
+};
diff --git a/packages/contract-wrappers/test/utils/token_utils.ts b/packages/contract-wrappers/test/utils/token_utils.ts
new file mode 100644
index 000000000..06a82ff6e
--- /dev/null
+++ b/packages/contract-wrappers/test/utils/token_utils.ts
@@ -0,0 +1,47 @@
+import { generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+
+import { artifacts } from '../../src/artifacts';
+import { DummyERC721TokenContract } from '../../src/contract_wrappers/generated/dummy_erc721_token';
+
+import { constants } from './constants';
+import { provider, txDefaults, web3Wrapper } from './web3_wrapper';
+
+// Those addresses come from migrations. They're deterministic so it's relatively safe to hard-code them here.
+// Before we were fetching them from the TokenRegistry but now we can't as it's deprecated and removed.
+const DUMMY_ERC_20_ADRESSES = [
+ '0x6dfff22588be9b3ef8cf0ad6dc9b84796f9fb45f',
+ '0xcfc18cec799fbd1793b5c43e773c98d4d61cc2db',
+ '0xf22469f31527adc53284441bae1665a7b9214dba',
+ '0x10add991de718a69dec2117cb6aa28098836511b',
+ '0x8d61158a366019ac78db4149d75fff9dda51160d',
+];
+
+const DUMMY_ERC_721_ADRESSES = ['0x131855dda0aaff096f6854854c55a4debf61077a'];
+
+export const tokenUtils = {
+ getProtocolTokenAddress(): string {
+ return artifacts.ZRXToken.networks[constants.TESTRPC_NETWORK_ID].address;
+ },
+ getWethTokenAddress(): string {
+ return artifacts.EtherToken.networks[constants.TESTRPC_NETWORK_ID].address;
+ },
+ getDummyERC20TokenAddresses(): string[] {
+ return DUMMY_ERC_20_ADRESSES;
+ },
+ getDummyERC721TokenAddresses(): string[] {
+ return DUMMY_ERC_721_ADRESSES;
+ },
+ async mintDummyERC721Async(address: string, tokenOwner: string): Promise<BigNumber> {
+ const erc721 = new DummyERC721TokenContract(
+ artifacts.DummyERC721Token.compilerOutput.abi,
+ address,
+ provider,
+ txDefaults,
+ );
+ const tokenId = generatePseudoRandomSalt();
+ const txHash = await erc721.mint.sendTransactionAsync(tokenOwner, tokenId);
+ web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ return tokenId;
+ },
+};
diff --git a/packages/contract-wrappers/test/utils/web3_wrapper.ts b/packages/contract-wrappers/test/utils/web3_wrapper.ts
new file mode 100644
index 000000000..02c8c5918
--- /dev/null
+++ b/packages/contract-wrappers/test/utils/web3_wrapper.ts
@@ -0,0 +1,12 @@
+import { devConstants, web3Factory } from '@0xproject/dev-utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+
+const txDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ gas: devConstants.GAS_LIMIT,
+};
+const provider: Provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+const web3Wrapper = new Web3Wrapper(provider);
+
+export { provider, web3Wrapper, txDefaults };
diff --git a/packages/contract-wrappers/tsconfig.json b/packages/contract-wrappers/tsconfig.json
new file mode 100644
index 000000000..e35816553
--- /dev/null
+++ b/packages/contract-wrappers/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["./src/**/*", "./test/**/*"]
+}
diff --git a/packages/deployer/tslint.json b/packages/contract-wrappers/tslint.json
index ffaefe83a..ffaefe83a 100644
--- a/packages/deployer/tslint.json
+++ b/packages/contract-wrappers/tslint.json
diff --git a/packages/contract_templates/README.md b/packages/contract_templates/README.md
new file mode 100644
index 000000000..e5f4b09d1
--- /dev/null
+++ b/packages/contract_templates/README.md
@@ -0,0 +1,17 @@
+These templates are used with [abi-gen](https://github.com/0xProject/0x-monorepo/tree/development/packages/abi-gen).
+
+To successfully compile the generated TypeScript contract wrappers, you must:
+
+* Install the packages on which the main contract template directly depends: `yarn add @0xproject/base-contract @0xproject/sol-compiler @0xproject/utils @0xproject/web3-wrapper ethereum-types ethers lodash`
+* Install the packages on which the main contract template *in*directly depends: `yarn add @types/lodash`
+* Ensure that your TypeScript configuration includes the following:
+
+```
+"compilerOptions": {
+ "lib": ["ES2015"],
+ "typeRoots": [
+ "node_modules/@0xproject/typescript-typings/types",
+ "node_modules/@types"
+ ]
+}
+```
diff --git a/packages/contract_templates/contract.handlebars b/packages/contract_templates/contract.handlebars
index 08310c8f2..0810c4d90 100644
--- a/packages/contract_templates/contract.handlebars
+++ b/packages/contract_templates/contract.handlebars
@@ -1,21 +1,18 @@
-/**
- * This file is auto-generated using abi-gen. Don't edit directly.
- * Templates can be found at https://github.com/0xProject/0x-monorepo/tree/development/packages/contract_templates.
- */
-// tslint:disable:no-consecutive-blank-lines
-// tslint:disable-next-line:no-unused-variable
+// tslint:disable:no-consecutive-blank-lines ordered-imports align trailing-comma whitespace class-name
+// tslint:disable:no-unused-variable
import { BaseContract } from '@0xproject/base-contract';
-import { BlockParam, BlockParamLiteral, CallData, ContractAbi, DataItem, MethodAbi, TxData, TxDataPayable } from '@0xproject/types';
-import { BigNumber, classUtils, promisify } from '@0xproject/utils';
+import { ContractArtifact } from '@0xproject/sol-compiler';
+import { BlockParam, BlockParamLiteral, CallData, ContractAbi, DataItem, DecodedLogArgs, MethodAbi, Provider, TxData, TxDataPayable } from 'ethereum-types';
+import { BigNumber, classUtils, logUtils, promisify } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as ethersContracts from 'ethers-contracts';
+import * as ethers from 'ethers';
import * as _ from 'lodash';
-import * as Web3 from 'web3';
+// tslint:enable:no-unused-variable
{{#if events}}
-export type {{contractName}}ContractEventArgs =
+export type {{contractName}}EventArgs =
{{#each events}}
- | {{name}}ContractEventArgs{{#if @last}};{{/if}}
+ | {{@root.contractName}}{{name}}EventArgs{{#if @last}};{{/if}}
{{/each}}
export enum {{contractName}}Events {
@@ -30,7 +27,9 @@ export enum {{contractName}}Events {
{{/each}}
{{/if}}
+/* istanbul ignore next */
// tslint:disable:no-parameter-reassignment
+// tslint:disable-next-line:class-name
export class {{contractName}}Contract extends BaseContract {
{{#each methods}}
{{#this.constant}}
@@ -40,8 +39,49 @@ export class {{contractName}}Contract extends BaseContract {
{{> tx contractName=../contractName}}
{{/this.constant}}
{{/each}}
- constructor(web3Wrapper: Web3Wrapper, abi: ContractAbi, address: string) {
- super(web3Wrapper, abi, address);
- classUtils.bindAll(this, ['_ethersInterface', 'address', 'abi', '_web3Wrapper']);
+ public static async deployFrom0xArtifactAsync(
+ artifact: ContractArtifact,
+ provider: Provider,
+ txDefaults: Partial<TxData>,
+ {{> typed_params inputs=ctor.inputs}}
+ ): Promise<{{contractName}}Contract> {
+ if (_.isUndefined(artifact.compilerOutput)) {
+ throw new Error('Compiler output not found in the artifact file');
+ }
+ const bytecode = artifact.compilerOutput.evm.bytecode.object;
+ const abi = artifact.compilerOutput.abi;
+ return {{contractName}}Contract.deployAsync(bytecode, abi, provider, txDefaults, {{> params inputs=ctor.inputs}});
+ }
+ public static async deployAsync(
+ bytecode: string,
+ abi: ContractAbi,
+ provider: Provider,
+ txDefaults: Partial<TxData>,
+ {{> typed_params inputs=ctor.inputs}}
+ ): Promise<{{contractName}}Contract> {
+ const constructorAbi = BaseContract._lookupConstructorAbi(abi);
+ [{{> params inputs=ctor.inputs}}] = BaseContract._formatABIDataItemList(
+ constructorAbi.inputs,
+ [{{> params inputs=ctor.inputs}}],
+ BaseContract._bigNumberToString,
+ );
+ const txData = ethers.Contract.getDeployTransaction(bytecode, abi, {{> params inputs=ctor.inputs}});
+ const web3Wrapper = new Web3Wrapper(provider);
+ const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync(
+ txData,
+ txDefaults,
+ web3Wrapper.estimateGasAsync.bind(web3Wrapper),
+ );
+ const txHash = await web3Wrapper.sendTransactionAsync(txDataWithDefaults);
+ logUtils.log(`transactionHash: ${txHash}`);
+ const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ logUtils.log(`{{contractName}} successfully deployed at ${txReceipt.contractAddress}`);
+ const contractInstance = new {{contractName}}Contract(abi, txReceipt.contractAddress as string, provider, txDefaults);
+ contractInstance.constructorArgs = [{{> params inputs=ctor.inputs}}];
+ return contractInstance;
+ }
+ constructor(abi: ContractAbi, address: string, provider: Provider, txDefaults?: Partial<TxData>) {
+ super('{{contractName}}', abi, address, provider, txDefaults);
+ classUtils.bindAll(this, ['_ethersInterfacesByFunctionSignature', 'address', 'abi', '_web3Wrapper']);
}
} // tslint:disable:max-file-line-count
diff --git a/packages/contract_templates/partials/call.handlebars b/packages/contract_templates/partials/call.handlebars
index cfb9bea82..7c9c934c3 100644
--- a/packages/contract_templates/partials/call.handlebars
+++ b/packages/contract_templates/partials/call.handlebars
@@ -1,3 +1,3 @@
-public {{this.name}} = {
+public {{this.tsName}} = {
{{> callAsync}}
};
diff --git a/packages/contract_templates/partials/callAsync.handlebars b/packages/contract_templates/partials/callAsync.handlebars
index e3fc2bdf9..94752691d 100644
--- a/packages/contract_templates/partials/callAsync.handlebars
+++ b/packages/contract_templates/partials/callAsync.handlebars
@@ -1,25 +1,29 @@
-{{#hasReturnValue}}
async callAsync(
{{> typed_params inputs=inputs}}
callData: Partial<CallData> = {},
defaultBlock?: BlockParam,
): Promise<{{> return_type outputs=outputs}}> {
- const self = this as {{contractName}}Contract;
- const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
- [{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
- const encodedData = self._ethersInterface.functions.{{this.name}}(
+ const self = this as any as {{contractName}}Contract;
+ const functionSignature = '{{this.functionSignature}}';
+ const inputAbi = self._lookupAbi(functionSignature).inputs;
+ [{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
+ BaseContract.strictArgumentEncodingCheck(inputAbi, [{{> params inputs=inputs}}]);
+ const ethersFunction = self._lookupEthersInterface(functionSignature).functions.{{this.name}}(
{{> params inputs=inputs}}
- ).data;
- const callDataWithDefaults = await self._applyDefaultsToTxDataAsync(
+ ) as ethers.CallDescription;
+ const encodedData = ethersFunction.data;
+ const callDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync(
{
+ to: self.address,
+ ...callData,
data: encodedData,
- }
- )
+ },
+ self._web3Wrapper.getContractDefaults(),
+ );
const rawCallResult = await self._web3Wrapper.callAsync(callDataWithDefaults, defaultBlock);
+ let resultArray = ethersFunction.parse(rawCallResult);
const outputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).outputs;
- const outputParamsTypes = _.map(outputAbi, 'type');
- let resultArray = ethersContracts.Interface.decodeParams(outputParamsTypes, rawCallResult) as any;
- resultArray = BaseContract._transformABIData(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
+ resultArray = BaseContract._formatABIDataItemList(outputAbi, resultArray, BaseContract._lowercaseAddress.bind(this));
+ resultArray = BaseContract._formatABIDataItemList(outputAbi, resultArray, BaseContract._bnToBigNumber.bind(this));
return resultArray{{#singleReturnValue}}[0]{{/singleReturnValue}};
},
-{{/hasReturnValue}}
diff --git a/packages/contract_templates/partials/event.handlebars b/packages/contract_templates/partials/event.handlebars
index 3c6100e4f..61d523ca2 100644
--- a/packages/contract_templates/partials/event.handlebars
+++ b/packages/contract_templates/partials/event.handlebars
@@ -1,4 +1,4 @@
-export interface {{name}}ContractEventArgs {
+export interface {{@root.contractName}}{{name}}EventArgs extends DecodedLogArgs {
{{#each inputs}}
{{name}}: {{#returnType type components}}{{/returnType}};
{{/each}}
diff --git a/packages/contract_templates/partials/params.handlebars b/packages/contract_templates/partials/params.handlebars
index ac5d4ae85..2d9bb8ed9 100644
--- a/packages/contract_templates/partials/params.handlebars
+++ b/packages/contract_templates/partials/params.handlebars
@@ -1,3 +1,3 @@
{{#each inputs}}
-{{name}},
+{{name}}{{#if @last}}{{else}},{{/if}}
{{/each}}
diff --git a/packages/contract_templates/partials/return_type.handlebars b/packages/contract_templates/partials/return_type.handlebars
index 9dd509953..77d96e8c4 100644
--- a/packages/contract_templates/partials/return_type.handlebars
+++ b/packages/contract_templates/partials/return_type.handlebars
@@ -1,6 +1,6 @@
{{#if outputs.length}}
{{#singleReturnValue}}
-{{#returnType outputs.0.type components}}{{/returnType}}
+{{#returnType outputs.0.type outputs.0.components}}{{/returnType}}
{{/singleReturnValue}}
{{^singleReturnValue}}
[{{#each outputs}}{{#returnType type components}}{{/returnType}}{{#unless @last}}, {{/unless}}{{/each}}]
diff --git a/packages/contract_templates/partials/tx.handlebars b/packages/contract_templates/partials/tx.handlebars
index f76de3a70..4340d662e 100644
--- a/packages/contract_templates/partials/tx.handlebars
+++ b/packages/contract_templates/partials/tx.handlebars
@@ -1,4 +1,4 @@
-public {{this.name}} = {
+public {{this.tsName}} = {
async sendTransactionAsync(
{{> typed_params inputs=inputs}}
{{#this.payable}}
@@ -8,18 +8,21 @@ public {{this.name}} = {
txData: Partial<TxData> = {},
{{/this.payable}}
): Promise<string> {
- const self = this as {{contractName}}Contract;
- const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
- [{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
- const encodedData = self._ethersInterface.functions.{{this.name}}(
+ const self = this as any as {{contractName}}Contract;
+ const inputAbi = self._lookupAbi('{{this.functionSignature}}').inputs;
+ [{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
+ BaseContract.strictArgumentEncodingCheck(inputAbi, [{{> params inputs=inputs}}]);
+ const encodedData = self._lookupEthersInterface('{{this.functionSignature}}').functions.{{this.name}}(
{{> params inputs=inputs}}
- ).data
- const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
+ ).data;
+ const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync(
{
+ to: self.address,
...txData,
data: encodedData,
},
- self.{{this.name}}.estimateGasAsync.bind(
+ self._web3Wrapper.getContractDefaults(),
+ self.{{this.tsName}}.estimateGasAsync.bind(
self,
{{> params inputs=inputs}}
),
@@ -31,17 +34,19 @@ public {{this.name}} = {
{{> typed_params inputs=inputs}}
txData: Partial<TxData> = {},
): Promise<number> {
- const self = this as {{contractName}}Contract;
- const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
- [{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(this));
- const encodedData = self._ethersInterface.functions.{{this.name}}(
+ const self = this as any as {{contractName}}Contract;
+ const inputAbi = self._lookupAbi('{{this.functionSignature}}').inputs;
+ [{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString);
+ const encodedData = self._lookupEthersInterface('{{this.functionSignature}}').functions.{{this.name}}(
{{> params inputs=inputs}}
- ).data
- const txDataWithDefaults = await self._applyDefaultsToTxDataAsync(
+ ).data;
+ const txDataWithDefaults = await BaseContract._applyDefaultsToTxDataAsync(
{
+ to: self.address,
...txData,
data: encodedData,
- }
+ },
+ self._web3Wrapper.getContractDefaults(),
);
const gas = await self._web3Wrapper.estimateGasAsync(txDataWithDefaults);
return gas;
@@ -49,12 +54,12 @@ public {{this.name}} = {
getABIEncodedTransactionData(
{{> typed_params inputs=inputs}}
): string {
- const self = this as {{contractName}}Contract;
- const inputAbi = (_.find(self.abi, {name: '{{this.name}}'}) as MethodAbi).inputs;
- [{{> params inputs=inputs}}] = BaseContract._transformABIData(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString.bind(self));
- const abiEncodedTransactionData = self._ethersInterface.functions.{{this.name}}(
+ const self = this as any as {{contractName}}Contract;
+ const inputAbi = self._lookupAbi('{{this.functionSignature}}').inputs;
+ [{{> params inputs=inputs}}] = BaseContract._formatABIDataItemList(inputAbi, [{{> params inputs=inputs}}], BaseContract._bigNumberToString);
+ const abiEncodedTransactionData = self._lookupEthersInterface('{{this.functionSignature}}').functions.{{this.name}}(
{{> params inputs=inputs}}
- ).data
+ ).data;
return abiEncodedTransactionData;
},
{{> callAsync}}
diff --git a/packages/contracts/.solhint.json b/packages/contracts/.solhint.json
new file mode 100644
index 000000000..076afe9f3
--- /dev/null
+++ b/packages/contracts/.solhint.json
@@ -0,0 +1,20 @@
+{
+ "extends": "default",
+ "rules": {
+ "avoid-low-level-calls": false,
+ "avoid-tx-origin": "warn",
+ "bracket-align": false,
+ "code-complexity": false,
+ "const-name-snakecase": "error",
+ "expression-indent": "error",
+ "function-max-lines": false,
+ "func-order": "error",
+ "indent": ["error", 4],
+ "max-line-length": ["warn", 160],
+ "no-inline-assembly": false,
+ "quotes": ["error", "double"],
+ "separate-by-one-line-in-contract": "error",
+ "space-after-comma": "error",
+ "statement-indent": "error"
+ }
+}
diff --git a/packages/contracts/README.md b/packages/contracts/README.md
index 7628b057b..2e6376f39 100644
--- a/packages/contracts/README.md
+++ b/packages/contracts/README.md
@@ -34,14 +34,16 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=contracts yarn build
```
-or
+Or continuously rebuild on change:
```bash
-yarn build:watch
+PKG=contracts yarn watch
```
### Clean
@@ -58,17 +60,55 @@ yarn lint
### Run Tests
-Before running the tests, you will need to spin up a [TestRPC](https://www.npmjs.com/package/ethereumjs-testrpc) instance.
+```bash
+yarn test
+```
-In a separate terminal, start TestRPC (a convenience command is provided as part of the [0x.js monorepo](https://github.com/0xProject/0x-monorepo))
+#### Testing options
+
+###### Revert stack traces
+
+If you want to see helpful stack traces (incl. line number, code snippet) for smart contract reverts, run the tests with:
-```bash
-cd ../..
-yarn testrpc
```
+yarn test:trace
+```
+
+**Note:** This currently slows down the test runs and is therefore not enabled by default.
+
+###### Backing Ethereum node
-Then in your main terminal run
+By default, our tests run against an in-process [Ganache](https://github.com/trufflesuite/ganache-core) instance. In order to run the tests against [Geth](https://github.com/ethereum/go-ethereum), first follow the instructions in the README for the devnet package to start the devnet Geth node. Then run:
```bash
-yarn test
+TEST_PROVIDER=geth yarn test
+```
+
+###### Code coverage
+
+In order to see the Solidity code coverage output generated by `@0xproject/sol-cov`, run:
+
```
+yarn test:coverage
+```
+
+###### Gas profiler
+
+In order to profile the gas costs for a specific smart contract call/transaction, you can run the tests in `profiler` mode.
+
+**Note:** Traces emitted by ganache have incorrect gas costs so we recommend using Geth for profiling.
+
+```
+TEST_PROVIDER=geth yarn test:profiler
+```
+
+You'll see a warning that you need to explicitly enable and disable the profiler before and after the block of code you want to profile.
+
+```typescript
+import { profiler } from './utils/profiler';
+profiler.start();
+// Some call to a smart contract
+profiler.stop();
+```
+
+Without explicitly starting and stopping the profiler, the profiler output will be too busy, and therefore unusable.
diff --git a/packages/contracts/compiler.json b/packages/contracts/compiler.json
new file mode 100644
index 000000000..ad35fc5b3
--- /dev/null
+++ b/packages/contracts/compiler.json
@@ -0,0 +1,54 @@
+{
+ "artifactsDir": "../migrations/artifacts/2.0.0",
+ "contractsDir": "src/contracts",
+ "compilerSettings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ },
+ "contracts": [
+ "AssetProxyOwner",
+ "DummyERC20Token",
+ "DummyERC721Receiver",
+ "DummyERC721Token",
+ "ERC20Proxy",
+ "ERC20Token",
+ "ERC721Token",
+ "ERC721Proxy",
+ "Exchange",
+ "ExchangeWrapper",
+ "Forwarder",
+ "IAssetData",
+ "IAssetProxy",
+ "IValidator",
+ "IWallet",
+ "MixinAuthorizable",
+ "MultiSigWallet",
+ "MultiSigWalletWithTimeLock",
+ "TestAssetProxyOwner",
+ "TestAssetProxyDispatcher",
+ "TestConstants",
+ "TestLibBytes",
+ "TestLibs",
+ "TestExchangeInternals",
+ "TestSignatureValidator",
+ "TokenRegistry",
+ "Validator",
+ "Wallet",
+ "WETH9",
+ "Whitelist",
+ "ZRXToken"
+ ]
+}
diff --git a/packages/contracts/globals.d.ts b/packages/contracts/globals.d.ts
index c6597054a..94e63a32d 100644
--- a/packages/contracts/globals.d.ts
+++ b/packages/contracts/globals.d.ts
@@ -1,35 +1,6 @@
-declare module 'chai-bignumber';
-declare module 'dirty-chai';
-
-// HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
-// interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
-// disallow `namespace`, we disable tslint for the following.
-/* tslint:disable */
-declare namespace Chai {
- interface Assertion {
- bignumber: Assertion;
- }
-}
-/* tslint:enable */
-
declare module '*.json' {
const json: any;
/* tslint:disable */
export default json;
/* tslint:enable */
}
-
-declare module 'solc' {
- export function compile(sources: any, optimizerEnabled: number, findImports: (importPath: string) => any): any;
- export function setupMethods(solcBin: any): any;
-}
-
-declare module 'web3-eth-abi' {
- export function encodeParameters(typesArray: string[], parameters: any[]): string;
-}
-
-declare module 'ethereumjs-abi' {
- const soliditySHA3: (argTypes: string[], args: any[]) => Buffer;
- const soliditySHA256: (argTypes: string[], args: any[]) => Buffer;
- const methodID: (name: string, types: string[]) => Buffer;
-}
diff --git a/packages/contracts/globalsAugment.d.ts b/packages/contracts/globalsAugment.d.ts
deleted file mode 100644
index 9b16ce2ad..000000000
--- a/packages/contracts/globalsAugment.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-
-// HACK: This module overrides the Chai namespace so that we can use BigNumber types inside.
-// Source: https://github.com/Microsoft/TypeScript/issues/7352#issuecomment-191547232
-declare global {
- // HACK: In order to merge the bignumber declaration added by chai-bignumber to the chai Assertion
- // interface we must use `namespace` as the Chai definitelyTyped definition does. Since we otherwise
- // disallow `namespace`, we disable tslint for the following.
- /* tslint:disable */
- namespace Chai {
- interface NumberComparer {
- (value: number | BigNumber, message?: string): Assertion;
- }
- interface NumericComparison {
- greaterThan: NumberComparer;
- }
- }
- /* tslint:enable */
-}
diff --git a/packages/contracts/migrations/config/multisig_sample.ts b/packages/contracts/migrations/config/multisig_sample.ts
deleted file mode 100644
index bc2502fca..000000000
--- a/packages/contracts/migrations/config/multisig_sample.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { MultiSigConfigByNetwork } from '../types';
-
-// Make a copy of this file named `multisig.js` and input custom params as needed
-export const multiSig: MultiSigConfigByNetwork = {
- kovan: {
- owners: [],
- confirmationsRequired: 0,
- secondsRequired: 0,
- },
-};
diff --git a/packages/contracts/migrations/config/token_info.ts b/packages/contracts/migrations/config/token_info.ts
deleted file mode 100644
index 5fd3db144..000000000
--- a/packages/contracts/migrations/config/token_info.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { constants } from '../../util/constants';
-import { Token } from '../types';
-
-export const tokenInfo: Token[] = [
- {
- name: 'Augur Reputation Token',
- symbol: 'REP',
- decimals: 18,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
- },
- {
- name: 'Digix DAO Token',
- symbol: 'DGD',
- decimals: 18,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
- },
- {
- name: 'Golem Network Token',
- symbol: 'GNT',
- decimals: 18,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
- },
- {
- name: 'MakerDAO',
- symbol: 'MKR',
- decimals: 18,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
- },
- {
- name: 'Melon Token',
- symbol: 'MLN',
- decimals: 18,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
- },
-];
diff --git a/packages/contracts/migrations/index.ts b/packages/contracts/migrations/index.ts
deleted file mode 100644
index 47ae7044d..000000000
--- a/packages/contracts/migrations/index.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { Deployer } from '@0xproject/deployer';
-import { devConstants } from '@0xproject/dev-utils';
-import * as path from 'path';
-
-import { constants } from '../util/constants';
-
-import { runMigrationsAsync } from './migrate';
-
-const deployerOpts = {
- artifactsDir: path.resolve('src', 'artifacts'),
- jsonrpcUrl: devConstants.RPC_URL,
- networkId: constants.TESTRPC_NETWORK_ID,
- defaults: {
- gas: devConstants.GAS_ESTIMATE,
- },
-};
-
-export const deployer = new Deployer(deployerOpts);
-
-runMigrationsAsync(deployer).catch(console.log);
diff --git a/packages/contracts/migrations/migrate.ts b/packages/contracts/migrations/migrate.ts
deleted file mode 100644
index cff8af0ab..000000000
--- a/packages/contracts/migrations/migrate.ts
+++ /dev/null
@@ -1,90 +0,0 @@
-import { Deployer } from '@0xproject/deployer';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { constants } from '../util/constants';
-import { ContractName } from '../util/types';
-
-import { tokenInfo } from './config/token_info';
-
-/**
- * Custom migrations should be defined in this function. This will be called with the CLI 'migrate' command.
- * Migrations could be written to run in parallel, but if you want contract addresses to be created deterministically,
- * the migration should be written to run synchronously.
- * @param deployer Deployer instance.
- */
-export const runMigrationsAsync = async (deployer: Deployer) => {
- const web3Wrapper: Web3Wrapper = deployer.web3Wrapper;
- const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
-
- const tokenTransferProxy = await deployer.deployAndSaveAsync(ContractName.TokenTransferProxy);
- const zrxToken = await deployer.deployAndSaveAsync(ContractName.ZRXToken);
- const etherToken = await deployer.deployAndSaveAsync(ContractName.EtherToken);
- const tokenReg = await deployer.deployAndSaveAsync(ContractName.TokenRegistry);
-
- const exchangeArgs = [zrxToken.address, tokenTransferProxy.address];
- const owners = [accounts[0], accounts[1]];
- const confirmationsRequired = new BigNumber(2);
- const secondsRequired = new BigNumber(0);
- const multiSigArgs = [owners, confirmationsRequired, secondsRequired, tokenTransferProxy.address];
- const exchange = await deployer.deployAndSaveAsync(ContractName.Exchange, exchangeArgs);
- const multiSig = await deployer.deployAndSaveAsync(
- ContractName.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,
- multiSigArgs,
- );
-
- const owner = accounts[0];
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner });
- await tokenTransferProxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: owner });
- const addTokenGasEstimate = await tokenReg.addToken.estimateGasAsync(
- zrxToken.address,
- tokenInfo[0].name,
- tokenInfo[0].symbol,
- tokenInfo[0].decimals,
- tokenInfo[0].ipfsHash,
- tokenInfo[0].swarmHash,
- { from: owner },
- );
- await tokenReg.addToken.sendTransactionAsync(
- zrxToken.address,
- '0x Protocol Token',
- 'ZRX',
- 18,
- constants.NULL_BYTES,
- constants.NULL_BYTES,
- {
- from: owner,
- gas: addTokenGasEstimate,
- },
- );
- await tokenReg.addToken.sendTransactionAsync(
- etherToken.address,
- 'Ether Token',
- 'WETH',
- 18,
- constants.NULL_BYTES,
- constants.NULL_BYTES,
- {
- from: owner,
- gas: addTokenGasEstimate,
- },
- );
- for (const token of tokenInfo) {
- const totalSupply = new BigNumber(0);
- const args = [token.name, token.symbol, token.decimals, totalSupply];
- const dummyToken = await deployer.deployAsync(ContractName.DummyToken, args);
- await tokenReg.addToken.sendTransactionAsync(
- dummyToken.address,
- token.name,
- token.symbol,
- token.decimals,
- token.ipfsHash,
- token.swarmHash,
- {
- from: owner,
- gas: addTokenGasEstimate,
- },
- );
- }
-};
diff --git a/packages/contracts/migrations/types.ts b/packages/contracts/migrations/types.ts
deleted file mode 100644
index 58d1e5b4f..000000000
--- a/packages/contracts/migrations/types.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export interface MultiSigConfig {
- owners: string[];
- confirmationsRequired: number;
- secondsRequired: number;
-}
-
-export interface MultiSigConfigByNetwork {
- [networkName: string]: MultiSigConfig;
-}
-
-export interface Token {
- address?: string;
- name: string;
- symbol: string;
- decimals: number;
- ipfsHash: string;
- swarmHash: string;
-}
-
-export interface TokenInfoByNetwork {
- development: Token[];
- live: Token[];
-}
diff --git a/packages/contracts/package.json b/packages/contracts/package.json
index 9d7a6c87c..799f72d9e 100644
--- a/packages/contracts/package.json
+++ b/packages/contracts/package.json
@@ -1,34 +1,39 @@
{
"private": true,
"name": "contracts",
- "version": "2.1.20",
+ "version": "2.1.40",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Smart contract components of 0x protocol",
"main": "index.js",
"directories": {
"test": "test"
},
"scripts": {
- "build:watch": "tsc -w",
- "prebuild": "run-s clean compile copy_artifacts generate_contract_wrappers",
- "copy_artifacts": "copyfiles './src/artifacts/**/*' ./lib",
- "build": "tsc",
- "test": "run-s build run_mocha",
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc",
+ "pre_build": "run-s compile copy_artifacts generate_contract_wrappers",
+ "copy_artifacts": "copyfiles -u 4 '../migrations/artifacts/2.0.0/**/*' ./lib/artifacts;",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
"test:coverage": "SOLIDITY_COVERAGE=true run-s build run_mocha coverage:report:text coverage:report:lcov",
- "run_mocha": "mocha 'lib/test/**/*.js' --timeout 100000 --bail --exit",
- "compile:comment": "Yarn workspaces do not link binaries correctly so we need to reference them directly https://github.com/yarnpkg/yarn/issues/3846",
- "compile": "node ../deployer/lib/src/cli.js compile --contracts ${npm_package_config_contracts} --contracts-dir src/contracts --artifacts-dir src/artifacts",
- "clean": "shx rm -rf ./lib",
- "generate_contract_wrappers": "node ../abi-gen/lib/index.js --abis ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers/generated --backend ethers && prettier --write 'src/contract_wrappers/generated/**.ts'",
- "migrate": "yarn build && yarn compile && node ./lib/migrations/index.js",
- "lint": "tslint --project . 'migrations/**/*.ts' 'test/**/*.ts' 'util/**/*.ts' 'deploy/**/*.ts'",
+ "test:profiler": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html",
+ "test:trace": "SOLIDITY_REVERT_TRACE=true run-s build run_mocha",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit",
+ "compile": "sol-compiler --contracts-dir src",
+ "clean": "shx rm -rf lib generated_contract_wrappers",
+ "generate_contract_wrappers": "abi-gen --abis ${npm_package_config_abis} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output generated_contract_wrappers --backend ethers",
+ "lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/* --exclude **/lib/**/* && yarn lint-contracts",
"coverage:report:text": "istanbul report text",
"coverage:report:html": "istanbul report html && open coverage/index.html",
+ "profiler:report:html": "istanbul report html && open coverage/index.html",
"coverage:report:lcov": "istanbul report lcov",
- "test:circleci": "yarn test:coverage"
+ "test:circleci": "yarn test",
+ "lint-contracts": "solhint src/2.0.0/**/**/**/**/*.sol"
},
"config": {
- "abis": "src/artifacts/@(DummyToken|TokenTransferProxy|Exchange|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|Arbitrage|EtherDelta|AccountLevels).json",
- "contracts": "Exchange,DummyToken,ZRXToken,Token,WETH9,TokenTransferProxy,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,MaliciousToken,TokenRegistry,Arbitrage,EtherDelta,AccountLevels"
+ "abis": "../migrations/artifacts/2.0.0/@(AssetProxyOwner|DummyERC20Token|DummyERC721Receiver|DummyERC721Token|ERC20Proxy|ERC721Proxy|Forwarder|Exchange|ExchangeWrapper|IAssetData|IAssetProxy|MixinAuthorizable|MultiSigWallet|MultiSigWalletWithTimeLock|TestAssetProxyOwner|TestAssetProxyDispatcher|TestConstants|TestExchangeInternals|TestLibBytes|TestLibs|TestSignatureValidator|Validator|Wallet|TokenRegistry|Whitelist|WETH9|ZRXToken).json"
},
"repository": {
"type": "git",
@@ -41,46 +46,46 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/contracts/README.md",
"devDependencies": {
- "@0xproject/dev-utils": "^0.3.3",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/bluebird": "^3.5.3",
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/sol-cov": "^2.0.0",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/bn.js": "^4.11.0",
+ "@types/ethereumjs-abi": "^0.6.0",
"@types/lodash": "4.14.104",
"@types/node": "^8.0.53",
- "@types/request-promise-native": "^1.0.2",
"@types/yargs": "^10.0.0",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"chai-bignumber": "^2.0.1",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
- "prettier": "^1.11.1",
"shx": "^0.2.2",
- "solc": "^0.4.18",
- "tslint": "5.8.0",
- "types-bn": "^0.0.1",
- "types-ethereumjs-util": "0xProject/types-ethereumjs-util",
- "typescript": "2.7.1",
+ "solc": "^0.4.24",
+ "solhint": "^1.2.1",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2",
"yargs": "^10.0.3"
},
"dependencies": {
- "0x.js": "^0.34.0",
- "@0xproject/deployer": "^0.3.4",
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "@0xproject/web3-wrapper": "^0.4.0",
- "bluebird": "^3.5.0",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@types/js-combinatorics": "^0.5.29",
"bn.js": "^4.11.8",
- "ethereumjs-abi": "^0.6.4",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-abi": "0.6.5",
"ethereumjs-util": "^5.1.1",
- "ethers-contracts": "^2.2.1",
- "isomorphic-fetch": "^2.2.1",
- "lodash": "^4.17.4",
- "request": "^2.81.0",
- "web3": "^0.20.0",
- "web3-eth-abi": "^1.0.0-beta.24"
+ "ethers": "3.0.22",
+ "js-combinatorics": "^0.5.3",
+ "lodash": "^4.17.5"
}
}
diff --git a/packages/contracts/src/1.0.0/Arbitrage/Arbitrage.sol b/packages/contracts/src/1.0.0/Arbitrage/Arbitrage.sol
new file mode 100644
index 000000000..5054afc2f
--- /dev/null
+++ b/packages/contracts/src/1.0.0/Arbitrage/Arbitrage.sol
@@ -0,0 +1,114 @@
+pragma solidity ^0.4.19;
+
+import { IExchange_v1 as Exchange } from "../Exchange/IExchange_v1.sol";
+import { EtherDelta } from "../EtherDelta/EtherDelta.sol";
+import { Ownable_v1 as Ownable } from "../Ownable/Ownable_v1.sol";
+import { IToken_v1 as Token } from "../Token/IToken_v1.sol";
+
+/// @title Arbitrage - Facilitates atomic arbitrage of ERC20 tokens between EtherDelta and 0x Exchange contract.
+/// @author Leonid Logvinov - <leo@0xProject.com>
+contract Arbitrage is Ownable {
+
+ Exchange exchange;
+ EtherDelta etherDelta;
+ address proxyAddress;
+
+ uint256 constant MAX_UINT = 2**256 - 1;
+
+ function Arbitrage(address _exchangeAddress, address _etherDeltaAddress, address _proxyAddress) {
+ exchange = Exchange(_exchangeAddress);
+ etherDelta = EtherDelta(_etherDeltaAddress);
+ proxyAddress = _proxyAddress;
+ }
+
+ /*
+ * Makes token tradeable by setting an allowance for etherDelta and 0x proxy contract.
+ * Also sets an allowance for the owner of the contracts therefore allowing to withdraw tokens.
+ */
+ function setAllowances(address tokenAddress) external onlyOwner {
+ Token token = Token(tokenAddress);
+ token.approve(address(etherDelta), MAX_UINT);
+ token.approve(proxyAddress, MAX_UINT);
+ token.approve(owner, MAX_UINT);
+ }
+
+ /*
+ * Because of the limits on the number of local variables in Solidity we need to compress parameters while loosing
+ * readability. Scheme of the parameter layout:
+ *
+ * addresses
+ * 0..4 orderAddresses
+ * 5 user
+ *
+ * values
+ * 0..5 orderValues
+ * 6 fillTakerTokenAmount
+ * 7 amountGet
+ * 8 amountGive
+ * 9 expires
+ * 10 nonce
+ * 11 amount
+
+ * signature
+ * exchange then etherDelta
+ */
+ function makeAtomicTrade(
+ address[6] addresses, uint[12] values,
+ uint8[2] v, bytes32[2] r, bytes32[2] s
+ ) external onlyOwner {
+ makeExchangeTrade(addresses, values, v, r, s);
+ makeEtherDeltaTrade(addresses, values, v, r, s);
+ }
+
+ function makeEtherDeltaTrade(
+ address[6] addresses, uint[12] values,
+ uint8[2] v, bytes32[2] r, bytes32[2] s
+ ) internal {
+ uint amount = values[11];
+ etherDelta.depositToken(
+ addresses[2], // tokenGet === makerToken
+ values[7] // amountGet
+ );
+ etherDelta.trade(
+ addresses[2], // tokenGet === makerToken
+ values[7], // amountGet
+ addresses[3], // tokenGive === takerToken
+ values[8], // amountGive
+ values[9], // expires
+ values[10], // nonce
+ addresses[5], // user
+ v[1],
+ r[1],
+ s[1],
+ amount
+ );
+ etherDelta.withdrawToken(
+ addresses[3], // tokenGive === tokenToken
+ values[8] // amountGive
+ );
+ }
+
+ function makeExchangeTrade(
+ address[6] addresses, uint[12] values,
+ uint8[2] v, bytes32[2] r, bytes32[2] s
+ ) internal {
+ address[5] memory orderAddresses = [
+ addresses[0], // maker
+ addresses[1], // taker
+ addresses[2], // makerToken
+ addresses[3], // takerToken
+ addresses[4] // feeRecepient
+ ];
+ uint[6] memory orderValues = [
+ values[0], // makerTokenAmount
+ values[1], // takerTokenAmount
+ values[2], // makerFee
+ values[3], // takerFee
+ values[4], // expirationTimestampInSec
+ values[5] // salt
+ ];
+ uint fillTakerTokenAmount = values[6]; // fillTakerTokenAmount
+ // Execute Exchange trade. It either succeeds in full or fails and reverts all the changes.
+ exchange.fillOrKillOrder(orderAddresses, orderValues, fillTakerTokenAmount, v[0], r[0], s[0]);
+ }
+}
diff --git a/packages/contracts/src/contracts/previous/ERC20Token/ERC20Token_v1.sol b/packages/contracts/src/1.0.0/ERC20Token/ERC20Token_v1.sol
index e05ee2d5e..e05ee2d5e 100644
--- a/packages/contracts/src/contracts/previous/ERC20Token/ERC20Token_v1.sol
+++ b/packages/contracts/src/1.0.0/ERC20Token/ERC20Token_v1.sol
diff --git a/packages/contracts/src/contracts/current/tutorials/EtherDelta/AccountLevels.sol b/packages/contracts/src/1.0.0/EtherDelta/AccountLevels.sol
index 8d7a930d3..8d7a930d3 100644
--- a/packages/contracts/src/contracts/current/tutorials/EtherDelta/AccountLevels.sol
+++ b/packages/contracts/src/1.0.0/EtherDelta/AccountLevels.sol
diff --git a/packages/contracts/src/1.0.0/EtherDelta/EtherDelta.sol b/packages/contracts/src/1.0.0/EtherDelta/EtherDelta.sol
new file mode 100644
index 000000000..fe599ca0a
--- /dev/null
+++ b/packages/contracts/src/1.0.0/EtherDelta/EtherDelta.sol
@@ -0,0 +1,168 @@
+pragma solidity ^0.4.19;
+
+import { SafeMath } from "../SafeMath/SafeMath_v1.sol";
+import { AccountLevels } from "./AccountLevels.sol";
+import { Token } from "../Token/Token_v1.sol";
+
+contract EtherDelta is SafeMath {
+ address public admin; //the admin address
+ address public feeAccount; //the account that will receive fees
+ address public accountLevelsAddr; //the address of the AccountLevels contract
+ uint public feeMake; //percentage times (1 ether)
+ uint public feeTake; //percentage times (1 ether)
+ uint public feeRebate; //percentage times (1 ether)
+ mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether)
+ mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature)
+ mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled)
+
+ event Order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user);
+ event Cancel(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s);
+ event Trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give);
+ event Deposit(address token, address user, uint amount, uint balance);
+ event Withdraw(address token, address user, uint amount, uint balance);
+
+ function EtherDelta(address admin_, address feeAccount_, address accountLevelsAddr_, uint feeMake_, uint feeTake_, uint feeRebate_) {
+ admin = admin_;
+ feeAccount = feeAccount_;
+ accountLevelsAddr = accountLevelsAddr_;
+ feeMake = feeMake_;
+ feeTake = feeTake_;
+ feeRebate = feeRebate_;
+ }
+
+ function() {
+ throw;
+ }
+
+ function changeAdmin(address admin_) {
+ if (msg.sender != admin) throw;
+ admin = admin_;
+ }
+
+ function changeAccountLevelsAddr(address accountLevelsAddr_) {
+ if (msg.sender != admin) throw;
+ accountLevelsAddr = accountLevelsAddr_;
+ }
+
+ function changeFeeAccount(address feeAccount_) {
+ if (msg.sender != admin) throw;
+ feeAccount = feeAccount_;
+ }
+
+ function changeFeeMake(uint feeMake_) {
+ if (msg.sender != admin) throw;
+ if (feeMake_ > feeMake) throw;
+ feeMake = feeMake_;
+ }
+
+ function changeFeeTake(uint feeTake_) {
+ if (msg.sender != admin) throw;
+ if (feeTake_ > feeTake || feeTake_ < feeRebate) throw;
+ feeTake = feeTake_;
+ }
+
+ function changeFeeRebate(uint feeRebate_) {
+ if (msg.sender != admin) throw;
+ if (feeRebate_ < feeRebate || feeRebate_ > feeTake) throw;
+ feeRebate = feeRebate_;
+ }
+
+ function deposit() payable {
+ tokens[0][msg.sender] = safeAdd(tokens[0][msg.sender], msg.value);
+ Deposit(0, msg.sender, msg.value, tokens[0][msg.sender]);
+ }
+
+ function withdraw(uint amount) {
+ if (tokens[0][msg.sender] < amount) throw;
+ tokens[0][msg.sender] = safeSub(tokens[0][msg.sender], amount);
+ if (!msg.sender.call.value(amount)()) throw;
+ Withdraw(0, msg.sender, amount, tokens[0][msg.sender]);
+ }
+
+ function depositToken(address token, uint amount) {
+ //remember to call Token(address).approve(this, amount) or this contract will not be able to do the transfer on your behalf.
+ if (token==0) throw;
+ if (!Token(token).transferFrom(msg.sender, this, amount)) throw;
+ tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount);
+ Deposit(token, msg.sender, amount, tokens[token][msg.sender]);
+ }
+
+ function withdrawToken(address token, uint amount) {
+ if (token==0) throw;
+ if (tokens[token][msg.sender] < amount) throw;
+ tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
+ if (!Token(token).transfer(msg.sender, amount)) throw;
+ Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
+ }
+
+ function balanceOf(address token, address user) constant returns (uint) {
+ return tokens[token][user];
+ }
+
+ function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) {
+ bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
+ orders[msg.sender][hash] = true;
+ Order(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender);
+ }
+
+ function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) {
+ //amount is in amountGet terms
+ bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
+ if (!(
+ (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) &&
+ block.number <= expires &&
+ safeAdd(orderFills[user][hash], amount) <= amountGet
+ )) throw;
+ tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount);
+ orderFills[user][hash] = safeAdd(orderFills[user][hash], amount);
+ Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender);
+ }
+
+ function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private {
+ uint feeMakeXfer = safeMul(amount, feeMake) / (1 ether);
+ uint feeTakeXfer = safeMul(amount, feeTake) / (1 ether);
+ uint feeRebateXfer = 0;
+ if (accountLevelsAddr != 0x0) {
+ uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user);
+ if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether);
+ if (accountLevel==2) feeRebateXfer = feeTakeXfer;
+ }
+ tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer));
+ tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer));
+ tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer));
+ tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet);
+ tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet);
+ }
+
+ function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) constant returns(bool) {
+ if (!(
+ tokens[tokenGet][sender] >= amount &&
+ availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount
+ )) return false;
+ return true;
+ }
+
+ function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) {
+ bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
+ if (!(
+ (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) &&
+ block.number <= expires
+ )) return 0;
+ uint available1 = safeSub(amountGet, orderFills[user][hash]);
+ uint available2 = safeMul(tokens[tokenGive][user], amountGet) / amountGive;
+ if (available1<available2) return available1;
+ return available2;
+ }
+
+ function amountFilled(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) {
+ bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
+ return orderFills[user][hash];
+ }
+
+ function cancelOrder(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) {
+ bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
+ if (!(orders[msg.sender][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == msg.sender)) throw;
+ orderFills[msg.sender][hash] = amountGet;
+ Cancel(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender, v, r, s);
+ }
+}
diff --git a/packages/contracts/src/1.0.0/Exchange/Exchange_v1.sol b/packages/contracts/src/1.0.0/Exchange/Exchange_v1.sol
new file mode 100644
index 000000000..3f8e7368d
--- /dev/null
+++ b/packages/contracts/src/1.0.0/Exchange/Exchange_v1.sol
@@ -0,0 +1,602 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.14;
+
+import { TokenTransferProxy_v1 as TokenTransferProxy } from "../TokenTransferProxy/TokenTransferProxy_v1.sol";
+import { Token_v1 as Token } from "../Token/Token_v1.sol";
+import { SafeMath_v1 as SafeMath } from "../SafeMath/SafeMath_v1.sol";
+
+/// @title Exchange - Facilitates exchange of ERC20 tokens.
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract Exchange_v1 is SafeMath {
+
+ // Error Codes
+ enum Errors {
+ ORDER_EXPIRED, // Order has already expired
+ ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
+ ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
+ INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
+ }
+
+ string constant public VERSION = "1.0.0";
+ uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas
+
+ address public ZRX_TOKEN_CONTRACT;
+ address public TOKEN_TRANSFER_PROXY_CONTRACT;
+
+ // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
+ mapping (bytes32 => uint) public filled;
+ mapping (bytes32 => uint) public cancelled;
+
+ event LogFill(
+ address indexed maker,
+ address taker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint filledMakerTokenAmount,
+ uint filledTakerTokenAmount,
+ uint paidMakerFee,
+ uint paidTakerFee,
+ bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
+ bytes32 orderHash
+ );
+
+ event LogCancel(
+ address indexed maker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint cancelledMakerTokenAmount,
+ uint cancelledTakerTokenAmount,
+ bytes32 indexed tokens,
+ bytes32 orderHash
+ );
+
+ event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
+
+ struct Order {
+ address maker;
+ address taker;
+ address makerToken;
+ address takerToken;
+ address feeRecipient;
+ uint makerTokenAmount;
+ uint takerTokenAmount;
+ uint makerFee;
+ uint takerFee;
+ uint expirationTimestampInSec;
+ bytes32 orderHash;
+ }
+
+ function Exchange_v1(address _zrxToken, address _tokenTransferProxy) {
+ ZRX_TOKEN_CONTRACT = _zrxToken;
+ TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
+ }
+
+ /*
+ * Core exchange functions
+ */
+
+ /// @dev Fills the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Total amount of takerToken filled in trade.
+ function fillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ returns (uint filledTakerTokenAmount)
+ {
+ Order memory order = Order({
+ maker: orderAddresses[0],
+ taker: orderAddresses[1],
+ makerToken: orderAddresses[2],
+ takerToken: orderAddresses[3],
+ feeRecipient: orderAddresses[4],
+ makerTokenAmount: orderValues[0],
+ takerTokenAmount: orderValues[1],
+ makerFee: orderValues[2],
+ takerFee: orderValues[3],
+ expirationTimestampInSec: orderValues[4],
+ orderHash: getOrderHash(orderAddresses, orderValues)
+ });
+
+ require(order.taker == address(0) || order.taker == msg.sender);
+ require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);
+ require(isValidSignature(
+ order.maker,
+ order.orderHash,
+ v,
+ r,
+ s
+ ));
+
+ if (block.timestamp >= order.expirationTimestampInSec) {
+ LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
+ return 0;
+ }
+
+ uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
+ filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
+ if (filledTakerTokenAmount == 0) {
+ LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
+ return 0;
+ }
+
+ if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
+ LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
+ return 0;
+ }
+
+ if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
+ LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
+ return 0;
+ }
+
+ uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
+ uint paidMakerFee;
+ uint paidTakerFee;
+ filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
+ require(transferViaTokenTransferProxy(
+ order.makerToken,
+ order.maker,
+ msg.sender,
+ filledMakerTokenAmount
+ ));
+ require(transferViaTokenTransferProxy(
+ order.takerToken,
+ msg.sender,
+ order.maker,
+ filledTakerTokenAmount
+ ));
+ if (order.feeRecipient != address(0)) {
+ if (order.makerFee > 0) {
+ paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
+ require(transferViaTokenTransferProxy(
+ ZRX_TOKEN_CONTRACT,
+ order.maker,
+ order.feeRecipient,
+ paidMakerFee
+ ));
+ }
+ if (order.takerFee > 0) {
+ paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
+ require(transferViaTokenTransferProxy(
+ ZRX_TOKEN_CONTRACT,
+ msg.sender,
+ order.feeRecipient,
+ paidTakerFee
+ ));
+ }
+ }
+
+ LogFill(
+ order.maker,
+ msg.sender,
+ order.feeRecipient,
+ order.makerToken,
+ order.takerToken,
+ filledMakerTokenAmount,
+ filledTakerTokenAmount,
+ paidMakerFee,
+ paidTakerFee,
+ keccak256(order.makerToken, order.takerToken),
+ order.orderHash
+ );
+ return filledTakerTokenAmount;
+ }
+
+ /// @dev Cancels the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
+ /// @return Amount of takerToken cancelled.
+ function cancelOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint cancelTakerTokenAmount)
+ public
+ returns (uint)
+ {
+ Order memory order = Order({
+ maker: orderAddresses[0],
+ taker: orderAddresses[1],
+ makerToken: orderAddresses[2],
+ takerToken: orderAddresses[3],
+ feeRecipient: orderAddresses[4],
+ makerTokenAmount: orderValues[0],
+ takerTokenAmount: orderValues[1],
+ makerFee: orderValues[2],
+ takerFee: orderValues[3],
+ expirationTimestampInSec: orderValues[4],
+ orderHash: getOrderHash(orderAddresses, orderValues)
+ });
+
+ require(order.maker == msg.sender);
+ require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);
+
+ if (block.timestamp >= order.expirationTimestampInSec) {
+ LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
+ return 0;
+ }
+
+ uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
+ uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
+ if (cancelledTakerTokenAmount == 0) {
+ LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
+ return 0;
+ }
+
+ cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);
+
+ LogCancel(
+ order.maker,
+ order.feeRecipient,
+ order.makerToken,
+ order.takerToken,
+ getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
+ cancelledTakerTokenAmount,
+ keccak256(order.makerToken, order.takerToken),
+ order.orderHash
+ );
+ return cancelledTakerTokenAmount;
+ }
+
+ /*
+ * Wrapper functions
+ */
+
+ /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ function fillOrKillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ {
+ require(fillOrder(
+ orderAddresses,
+ orderValues,
+ fillTakerTokenAmount,
+ false,
+ v,
+ r,
+ s
+ ) == fillTakerTokenAmount);
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ fillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ fillTakerTokenAmounts[i],
+ shouldThrowOnInsufficientBalanceOrAllowance,
+ v[i],
+ r[i],
+ s[i]
+ );
+ }
+ }
+
+ /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrKillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ fillOrKillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ fillTakerTokenAmounts[i],
+ v[i],
+ r[i],
+ s[i]
+ );
+ }
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ /// @return Total amount of fillTakerTokenAmount filled in orders.
+ function fillOrdersUpTo(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ returns (uint)
+ {
+ uint filledTakerTokenAmount = 0;
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
+ filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
+ shouldThrowOnInsufficientBalanceOrAllowance,
+ v[i],
+ r[i],
+ s[i]
+ ));
+ if (filledTakerTokenAmount == fillTakerTokenAmount) break;
+ }
+ return filledTakerTokenAmount;
+ }
+
+ /// @dev Synchronously cancels multiple orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
+ function batchCancelOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] cancelTakerTokenAmounts)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ cancelOrder(
+ orderAddresses[i],
+ orderValues[i],
+ cancelTakerTokenAmounts[i]
+ );
+ }
+ }
+
+ /*
+ * Constant public functions
+ */
+
+ /// @dev Calculates Keccak-256 hash of order with specified parameters.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @return Keccak-256 hash of order.
+ function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
+ public
+ constant
+ returns (bytes32)
+ {
+ return keccak256(
+ address(this),
+ orderAddresses[0], // maker
+ orderAddresses[1], // taker
+ orderAddresses[2], // makerToken
+ orderAddresses[3], // takerToken
+ orderAddresses[4], // feeRecipient
+ orderValues[0], // makerTokenAmount
+ orderValues[1], // takerTokenAmount
+ orderValues[2], // makerFee
+ orderValues[3], // takerFee
+ orderValues[4], // expirationTimestampInSec
+ orderValues[5] // salt
+ );
+ }
+
+ /// @dev Verifies that an order signature is valid.
+ /// @param signer address of signer.
+ /// @param hash Signed Keccak-256 hash.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ address signer,
+ bytes32 hash,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ constant
+ returns (bool)
+ {
+ return signer == ecrecover(
+ keccak256("\x19Ethereum Signed Message:\n32", hash),
+ v,
+ r,
+ s
+ );
+ }
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function isRoundingError(uint numerator, uint denominator, uint target)
+ public
+ constant
+ returns (bool)
+ {
+ uint remainder = mulmod(target, numerator, denominator);
+ if (remainder == 0) return false; // No rounding error.
+
+ uint errPercentageTimes1000000 = safeDiv(
+ safeMul(remainder, 1000000),
+ safeMul(numerator, target)
+ );
+ return errPercentageTimes1000000 > 1000;
+ }
+
+ /// @dev Calculates partial value given a numerator and denominator.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to calculate partial of.
+ /// @return Partial value of target.
+ function getPartialAmount(uint numerator, uint denominator, uint target)
+ public
+ constant
+ returns (uint)
+ {
+ return safeDiv(safeMul(numerator, target), denominator);
+ }
+
+ /// @dev Calculates the sum of values already filled and cancelled for a given order.
+ /// @param orderHash The Keccak-256 hash of the given order.
+ /// @return Sum of values already filled and cancelled.
+ function getUnavailableTakerTokenAmount(bytes32 orderHash)
+ public
+ constant
+ returns (uint)
+ {
+ return safeAdd(filled[orderHash], cancelled[orderHash]);
+ }
+
+
+ /*
+ * Internal functions
+ */
+
+ /// @dev Transfers a token using TokenTransferProxy transferFrom function.
+ /// @param token Address of token to transferFrom.
+ /// @param from Address transfering token.
+ /// @param to Address receiving token.
+ /// @param value Amount of token to transfer.
+ /// @return Success of token transfer.
+ function transferViaTokenTransferProxy(
+ address token,
+ address from,
+ address to,
+ uint value)
+ internal
+ returns (bool)
+ {
+ return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
+ }
+
+ /// @dev Checks if any order transfers will fail.
+ /// @param order Order struct of params that will be checked.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @return Predicted result of transfers.
+ function isTransferable(Order order, uint fillTakerTokenAmount)
+ internal
+ constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
+ returns (bool)
+ {
+ address taker = msg.sender;
+ uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
+
+ if (order.feeRecipient != address(0)) {
+ bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
+ bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
+ uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
+ uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
+ uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
+ uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;
+
+ if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
+ || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
+ || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
+ || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
+ ) return false;
+
+ if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
+ || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
+ ) return false;
+ if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
+ || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
+ ) return false;
+ } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
+ || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
+ || getBalance(order.takerToken, taker) < fillTakerTokenAmount
+ || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
+ ) return false;
+
+ return true;
+ }
+
+ /// @dev Get token balance of an address.
+ /// @param token Address of token.
+ /// @param owner Address of owner.
+ /// @return Token balance of owner.
+ function getBalance(address token, address owner)
+ internal
+ constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
+ returns (uint)
+ {
+ return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
+ }
+
+ /// @dev Get allowance of token given to TokenTransferProxy by an address.
+ /// @param token Address of token.
+ /// @param owner Address of owner.
+ /// @return Allowance of token given to TokenTransferProxy by owner.
+ function getAllowance(address token, address owner)
+ internal
+ constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
+ returns (uint)
+ {
+ return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
+ }
+}
diff --git a/packages/contracts/src/1.0.0/Exchange/IExchange_v1.sol b/packages/contracts/src/1.0.0/Exchange/IExchange_v1.sol
new file mode 100644
index 000000000..ec4bce7b0
--- /dev/null
+++ b/packages/contracts/src/1.0.0/Exchange/IExchange_v1.sol
@@ -0,0 +1,226 @@
+pragma solidity ^0.4.19;
+
+contract IExchange_v1 {
+
+ // Error Codes
+ enum Errors {
+ ORDER_EXPIRED, // Order has already expired
+ ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
+ ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
+ INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
+ }
+
+ event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
+
+ event LogFill(
+ address indexed maker,
+ address taker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint filledMakerTokenAmount,
+ uint filledTakerTokenAmount,
+ uint paidMakerFee,
+ uint paidTakerFee,
+ bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
+ bytes32 orderHash
+ );
+
+ event LogCancel(
+ address indexed maker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint cancelledMakerTokenAmount,
+ uint cancelledTakerTokenAmount,
+ bytes32 indexed tokens,
+ bytes32 orderHash
+ );
+
+ function ZRX_TOKEN_CONTRACT()
+ public view
+ returns (address);
+
+ function TOKEN_TRANSFER_PROXY_CONTRACT()
+ public view
+ returns (address);
+
+ function EXTERNAL_QUERY_GAS_LIMIT()
+ public view
+ returns (uint16);
+
+ function VERSION()
+ public view
+ returns (string);
+
+ function filled(bytes32)
+ public view
+ returns (uint256);
+
+ function cancelled(bytes32)
+ public view
+ returns (uint256);
+
+ /// @dev Calculates the sum of values already filled and cancelled for a given order.
+ /// @param orderHash The Keccak-256 hash of the given order.
+ /// @return Sum of values already filled and cancelled.
+ function getUnavailableTakerTokenAmount(bytes32 orderHash)
+ public constant
+ returns (uint);
+
+ /// @dev Calculates partial value given a numerator and denominator.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to calculate partial of.
+ /// @return Partial value of target.
+ function getPartialAmount(uint numerator, uint denominator, uint target)
+ public constant
+ returns (uint);
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function isRoundingError(uint numerator, uint denominator, uint target)
+ public constant
+ returns (bool);
+
+ /// @dev Calculates Keccak-256 hash of order with specified parameters.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @return Keccak-256 hash of order.
+ function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
+ public
+ constant
+ returns (bytes32);
+
+ /// @dev Verifies that an order signature is valid.
+ /// @param signer address of signer.
+ /// @param hash Signed Keccak-256 hash.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ address signer,
+ bytes32 hash,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public constant
+ returns (bool);
+
+ /// @dev Fills the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Total amount of takerToken filled in trade.
+ function fillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ returns (uint filledTakerTokenAmount);
+
+ /// @dev Cancels the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
+ /// @return Amount of takerToken cancelled.
+ function cancelOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint cancelTakerTokenAmount)
+ public
+ returns (uint);
+
+
+ /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ function fillOrKillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public;
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public;
+
+ /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrKillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public;
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ /// @return Total amount of fillTakerTokenAmount filled in orders.
+ function fillOrdersUpTo(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ returns (uint);
+
+ /// @dev Synchronously cancels multiple orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
+ function batchCancelOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] cancelTakerTokenAmounts)
+ public;
+}
diff --git a/packages/contracts/src/1.0.0/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol b/packages/contracts/src/1.0.0/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol
new file mode 100644
index 000000000..aee722c53
--- /dev/null
+++ b/packages/contracts/src/1.0.0/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol
@@ -0,0 +1,82 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.10;
+
+import "../../2.0.0/multisig/MultiSigWalletWithTimeLock.sol";
+
+contract MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress is MultiSigWalletWithTimeLock {
+
+ address public TOKEN_TRANSFER_PROXY_CONTRACT;
+
+ modifier validRemoveAuthorizedAddressTx(uint transactionId) {
+ Transaction storage tx = transactions[transactionId];
+ require(tx.destination == TOKEN_TRANSFER_PROXY_CONTRACT);
+ require(isFunctionRemoveAuthorizedAddress(tx.data));
+ _;
+ }
+
+ /// @dev Contract constructor sets initial owners, required number of confirmations, time lock, and tokenTransferProxy address.
+ /// @param _owners List of initial owners.
+ /// @param _required Number of required confirmations.
+ /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
+ /// @param _tokenTransferProxy Address of TokenTransferProxy contract.
+ function MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(
+ address[] _owners,
+ uint _required,
+ uint _secondsTimeLocked,
+ address _tokenTransferProxy)
+ public
+ MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)
+ {
+ TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
+ }
+
+ /// @dev Allows execution of removeAuthorizedAddress without time lock.
+ /// @param transactionId Transaction ID.
+ function executeRemoveAuthorizedAddress(uint transactionId)
+ public
+ notExecuted(transactionId)
+ fullyConfirmed(transactionId)
+ validRemoveAuthorizedAddressTx(transactionId)
+ {
+ Transaction storage tx = transactions[transactionId];
+ tx.executed = true;
+ if (tx.destination.call.value(tx.value)(tx.data))
+ Execution(transactionId);
+ else {
+ ExecutionFailure(transactionId);
+ tx.executed = false;
+ }
+ }
+
+ /// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function signature.
+ /// @param data Transaction data.
+ /// @return Successful if data is a call to removeAuthorizedAddress.
+ function isFunctionRemoveAuthorizedAddress(bytes data)
+ public
+ constant
+ returns (bool)
+ {
+ bytes4 removeAuthorizedAddressSignature = bytes4(sha3("removeAuthorizedAddress(address)"));
+ for (uint i = 0; i < 4; i++) {
+ require(data[i] == removeAuthorizedAddressSignature[i]);
+ }
+ return true;
+ }
+}
diff --git a/packages/contracts/src/1.0.0/Ownable/IOwnable_v1.sol b/packages/contracts/src/1.0.0/Ownable/IOwnable_v1.sol
new file mode 100644
index 000000000..7e22d544d
--- /dev/null
+++ b/packages/contracts/src/1.0.0/Ownable/IOwnable_v1.sol
@@ -0,0 +1,18 @@
+pragma solidity ^0.4.19;
+
+/*
+ * Ownable
+ *
+ * Base contract with an owner.
+ * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
+ */
+
+contract IOwnable_v1 {
+
+ function owner()
+ public view
+ returns (address);
+
+ function transferOwnership(address newOwner)
+ public;
+}
diff --git a/packages/contracts/src/contracts/previous/Ownable/Ownable_v1.sol b/packages/contracts/src/1.0.0/Ownable/Ownable_v1.sol
index c87438fa4..c87438fa4 100644
--- a/packages/contracts/src/contracts/previous/Ownable/Ownable_v1.sol
+++ b/packages/contracts/src/1.0.0/Ownable/Ownable_v1.sol
diff --git a/packages/contracts/src/contracts/previous/SafeMath/SafeMath_v1.sol b/packages/contracts/src/1.0.0/SafeMath/SafeMath_v1.sol
index 341d611ec..341d611ec 100644
--- a/packages/contracts/src/contracts/previous/SafeMath/SafeMath_v1.sol
+++ b/packages/contracts/src/1.0.0/SafeMath/SafeMath_v1.sol
diff --git a/packages/contracts/src/contracts/previous/Token/Token_v1.sol b/packages/contracts/src/1.0.0/Token/Token_v1.sol
index de619fb7e..de619fb7e 100644
--- a/packages/contracts/src/contracts/previous/Token/Token_v1.sol
+++ b/packages/contracts/src/1.0.0/Token/Token_v1.sol
diff --git a/packages/contracts/src/1.0.0/TokenRegistry/ITokenRegistery.sol b/packages/contracts/src/1.0.0/TokenRegistry/ITokenRegistery.sol
new file mode 100644
index 000000000..b8bdaf3b9
--- /dev/null
+++ b/packages/contracts/src/1.0.0/TokenRegistry/ITokenRegistery.sol
@@ -0,0 +1,195 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.21;
+
+import { IOwnable_v1 as IOwnable } from "../Ownable/IOwnable_v1.sol";
+
+/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract ITokenRegistery is IOwnable {
+
+ event LogAddToken(
+ address indexed token,
+ string name,
+ string symbol,
+ uint8 decimals,
+ bytes ipfsHash,
+ bytes swarmHash
+ );
+
+ event LogRemoveToken(
+ address indexed token,
+ string name,
+ string symbol,
+ uint8 decimals,
+ bytes ipfsHash,
+ bytes swarmHash
+ );
+
+ event LogTokenNameChange(
+ address indexed token,
+ string oldName,
+ string newName
+ );
+
+ event LogTokenSymbolChange(
+ address indexed token,
+ string oldSymbol,
+ string newSymbol
+ );
+
+ event LogTokenIpfsHashChange(
+ address indexed token,
+ bytes oldIpfsHash,
+ bytes newIpfsHash
+ );
+
+ event LogTokenSwarmHashChange(
+ address indexed token,
+ bytes oldSwarmHash,
+ bytes newSwarmHash
+ );
+
+ function tokens(address tokenAddress)
+ public view
+ returns (
+ address token,
+ string name,
+ string symbol,
+ uint8 decimals,
+ bytes ipfsHash,
+ bytes swarmHash
+ );
+
+ function tokenAddresses(uint256 index)
+ public view
+ returns (address);
+
+
+ /// @dev Allows owner to add a new token to the registry.
+ /// @param _token Address of new token.
+ /// @param _name Name of new token.
+ /// @param _symbol Symbol for new token.
+ /// @param _decimals Number of decimals, divisibility of new token.
+ /// @param _ipfsHash IPFS hash of token icon.
+ /// @param _swarmHash Swarm hash of token icon.
+ function addToken(
+ address _token,
+ string _name,
+ string _symbol,
+ uint8 _decimals,
+ bytes _ipfsHash,
+ bytes _swarmHash)
+ public;
+
+ /// @dev Allows owner to remove an existing token from the registry.
+ /// @param _token Address of existing token.
+ function removeToken(address _token, uint _index)
+ public;
+
+ /// @dev Allows owner to modify an existing token's name.
+ /// @param _token Address of existing token.
+ /// @param _name New name.
+ function setTokenName(address _token, string _name)
+ public;
+
+ /// @dev Allows owner to modify an existing token's symbol.
+ /// @param _token Address of existing token.
+ /// @param _symbol New symbol.
+ function setTokenSymbol(address _token, string _symbol)
+ public;
+
+ /// @dev Allows owner to modify an existing token's IPFS hash.
+ /// @param _token Address of existing token.
+ /// @param _ipfsHash New IPFS hash.
+ function setTokenIpfsHash(address _token, bytes _ipfsHash)
+ public;
+
+ /// @dev Allows owner to modify an existing token's Swarm hash.
+ /// @param _token Address of existing token.
+ /// @param _swarmHash New Swarm hash.
+ function setTokenSwarmHash(address _token, bytes _swarmHash)
+ public;
+
+ /*
+ * Web3 call functions
+ */
+
+ /// @dev Provides a registered token's address when given the token symbol.
+ /// @param _symbol Symbol of registered token.
+ /// @return Token's address.
+ function getTokenAddressBySymbol(string _symbol)
+ public constant
+ returns (address);
+
+ /// @dev Provides a registered token's address when given the token name.
+ /// @param _name Name of registered token.
+ /// @return Token's address.
+ function getTokenAddressByName(string _name)
+ public constant
+ returns (address);
+
+ /// @dev Provides a registered token's metadata, looked up by address.
+ /// @param _token Address of registered token.
+ /// @return Token metadata.
+ function getTokenMetaData(address _token)
+ public constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ );
+
+ /// @dev Provides a registered token's metadata, looked up by name.
+ /// @param _name Name of registered token.
+ /// @return Token metadata.
+ function getTokenByName(string _name)
+ public constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ );
+
+ /// @dev Provides a registered token's metadata, looked up by symbol.
+ /// @param _symbol Symbol of registered token.
+ /// @return Token metadata.
+ function getTokenBySymbol(string _symbol)
+ public constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ );
+
+ /// @dev Returns an array containing all token addresses.
+ /// @return Array of token addresses.
+ function getTokenAddresses()
+ public constant
+ returns (address[]);
+}
diff --git a/packages/contracts/src/1.0.0/TokenRegistry/TokenRegistry.sol b/packages/contracts/src/1.0.0/TokenRegistry/TokenRegistry.sol
new file mode 100644
index 000000000..7417a10a3
--- /dev/null
+++ b/packages/contracts/src/1.0.0/TokenRegistry/TokenRegistry.sol
@@ -0,0 +1,308 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.11;
+
+import { Ownable_v1 as Ownable } from "../Ownable/Ownable_v1.sol";
+
+/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract TokenRegistry is Ownable {
+
+ event LogAddToken(
+ address indexed token,
+ string name,
+ string symbol,
+ uint8 decimals,
+ bytes ipfsHash,
+ bytes swarmHash
+ );
+
+ event LogRemoveToken(
+ address indexed token,
+ string name,
+ string symbol,
+ uint8 decimals,
+ bytes ipfsHash,
+ bytes swarmHash
+ );
+
+ event LogTokenNameChange(address indexed token, string oldName, string newName);
+ event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);
+ event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);
+ event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);
+
+ mapping (address => TokenMetadata) public tokens;
+ mapping (string => address) tokenBySymbol;
+ mapping (string => address) tokenByName;
+
+ address[] public tokenAddresses;
+
+ struct TokenMetadata {
+ address token;
+ string name;
+ string symbol;
+ uint8 decimals;
+ bytes ipfsHash;
+ bytes swarmHash;
+ }
+
+ modifier tokenExists(address _token) {
+ require(tokens[_token].token != address(0));
+ _;
+ }
+
+ modifier tokenDoesNotExist(address _token) {
+ require(tokens[_token].token == address(0));
+ _;
+ }
+
+ modifier nameDoesNotExist(string _name) {
+ require(tokenByName[_name] == address(0));
+ _;
+ }
+
+ modifier symbolDoesNotExist(string _symbol) {
+ require(tokenBySymbol[_symbol] == address(0));
+ _;
+ }
+
+ modifier addressNotNull(address _address) {
+ require(_address != address(0));
+ _;
+ }
+
+
+ /// @dev Allows owner to add a new token to the registry.
+ /// @param _token Address of new token.
+ /// @param _name Name of new token.
+ /// @param _symbol Symbol for new token.
+ /// @param _decimals Number of decimals, divisibility of new token.
+ /// @param _ipfsHash IPFS hash of token icon.
+ /// @param _swarmHash Swarm hash of token icon.
+ function addToken(
+ address _token,
+ string _name,
+ string _symbol,
+ uint8 _decimals,
+ bytes _ipfsHash,
+ bytes _swarmHash)
+ public
+ onlyOwner
+ tokenDoesNotExist(_token)
+ addressNotNull(_token)
+ symbolDoesNotExist(_symbol)
+ nameDoesNotExist(_name)
+ {
+ tokens[_token] = TokenMetadata({
+ token: _token,
+ name: _name,
+ symbol: _symbol,
+ decimals: _decimals,
+ ipfsHash: _ipfsHash,
+ swarmHash: _swarmHash
+ });
+ tokenAddresses.push(_token);
+ tokenBySymbol[_symbol] = _token;
+ tokenByName[_name] = _token;
+ LogAddToken(
+ _token,
+ _name,
+ _symbol,
+ _decimals,
+ _ipfsHash,
+ _swarmHash
+ );
+ }
+
+ /// @dev Allows owner to remove an existing token from the registry.
+ /// @param _token Address of existing token.
+ function removeToken(address _token, uint _index)
+ public
+ onlyOwner
+ tokenExists(_token)
+ {
+ require(tokenAddresses[_index] == _token);
+
+ tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];
+ tokenAddresses.length -= 1;
+
+ TokenMetadata storage token = tokens[_token];
+ LogRemoveToken(
+ token.token,
+ token.name,
+ token.symbol,
+ token.decimals,
+ token.ipfsHash,
+ token.swarmHash
+ );
+ delete tokenBySymbol[token.symbol];
+ delete tokenByName[token.name];
+ delete tokens[_token];
+ }
+
+ /// @dev Allows owner to modify an existing token's name.
+ /// @param _token Address of existing token.
+ /// @param _name New name.
+ function setTokenName(address _token, string _name)
+ public
+ onlyOwner
+ tokenExists(_token)
+ nameDoesNotExist(_name)
+ {
+ TokenMetadata storage token = tokens[_token];
+ LogTokenNameChange(_token, token.name, _name);
+ delete tokenByName[token.name];
+ tokenByName[_name] = _token;
+ token.name = _name;
+ }
+
+ /// @dev Allows owner to modify an existing token's symbol.
+ /// @param _token Address of existing token.
+ /// @param _symbol New symbol.
+ function setTokenSymbol(address _token, string _symbol)
+ public
+ onlyOwner
+ tokenExists(_token)
+ symbolDoesNotExist(_symbol)
+ {
+ TokenMetadata storage token = tokens[_token];
+ LogTokenSymbolChange(_token, token.symbol, _symbol);
+ delete tokenBySymbol[token.symbol];
+ tokenBySymbol[_symbol] = _token;
+ token.symbol = _symbol;
+ }
+
+ /// @dev Allows owner to modify an existing token's IPFS hash.
+ /// @param _token Address of existing token.
+ /// @param _ipfsHash New IPFS hash.
+ function setTokenIpfsHash(address _token, bytes _ipfsHash)
+ public
+ onlyOwner
+ tokenExists(_token)
+ {
+ TokenMetadata storage token = tokens[_token];
+ LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);
+ token.ipfsHash = _ipfsHash;
+ }
+
+ /// @dev Allows owner to modify an existing token's Swarm hash.
+ /// @param _token Address of existing token.
+ /// @param _swarmHash New Swarm hash.
+ function setTokenSwarmHash(address _token, bytes _swarmHash)
+ public
+ onlyOwner
+ tokenExists(_token)
+ {
+ TokenMetadata storage token = tokens[_token];
+ LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);
+ token.swarmHash = _swarmHash;
+ }
+
+ /*
+ * Web3 call functions
+ */
+
+ /// @dev Provides a registered token's address when given the token symbol.
+ /// @param _symbol Symbol of registered token.
+ /// @return Token's address.
+ function getTokenAddressBySymbol(string _symbol) constant returns (address) {
+ return tokenBySymbol[_symbol];
+ }
+
+ /// @dev Provides a registered token's address when given the token name.
+ /// @param _name Name of registered token.
+ /// @return Token's address.
+ function getTokenAddressByName(string _name) constant returns (address) {
+ return tokenByName[_name];
+ }
+
+ /// @dev Provides a registered token's metadata, looked up by address.
+ /// @param _token Address of registered token.
+ /// @return Token metadata.
+ function getTokenMetaData(address _token)
+ public
+ constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ )
+ {
+ TokenMetadata memory token = tokens[_token];
+ return (
+ token.token,
+ token.name,
+ token.symbol,
+ token.decimals,
+ token.ipfsHash,
+ token.swarmHash
+ );
+ }
+
+ /// @dev Provides a registered token's metadata, looked up by name.
+ /// @param _name Name of registered token.
+ /// @return Token metadata.
+ function getTokenByName(string _name)
+ public
+ constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ )
+ {
+ address _token = tokenByName[_name];
+ return getTokenMetaData(_token);
+ }
+
+ /// @dev Provides a registered token's metadata, looked up by symbol.
+ /// @param _symbol Symbol of registered token.
+ /// @return Token metadata.
+ function getTokenBySymbol(string _symbol)
+ public
+ constant
+ returns (
+ address, //tokenAddress
+ string, //name
+ string, //symbol
+ uint8, //decimals
+ bytes, //ipfsHash
+ bytes //swarmHash
+ )
+ {
+ address _token = tokenBySymbol[_symbol];
+ return getTokenMetaData(_token);
+ }
+
+ /// @dev Returns an array containing all token addresses.
+ /// @return Array of token addresses.
+ function getTokenAddresses()
+ public
+ constant
+ returns (address[])
+ {
+ return tokenAddresses;
+ }
+}
diff --git a/packages/contracts/src/1.0.0/TokenTransferProxy/TokenTransferProxy_v1.sol b/packages/contracts/src/1.0.0/TokenTransferProxy/TokenTransferProxy_v1.sol
new file mode 100644
index 000000000..e3659d8ba
--- /dev/null
+++ b/packages/contracts/src/1.0.0/TokenTransferProxy/TokenTransferProxy_v1.sol
@@ -0,0 +1,115 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.11;
+
+import { Token_v1 as Token } from "../Token/Token_v1.sol";
+import { Ownable_v1 as Ownable } from "../Ownable/Ownable_v1.sol";
+
+/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract TokenTransferProxy_v1 is Ownable {
+
+ /// @dev Only authorized addresses can invoke functions with this modifier.
+ modifier onlyAuthorized {
+ require(authorized[msg.sender]);
+ _;
+ }
+
+ modifier targetAuthorized(address target) {
+ require(authorized[target]);
+ _;
+ }
+
+ modifier targetNotAuthorized(address target) {
+ require(!authorized[target]);
+ _;
+ }
+
+ mapping (address => bool) public authorized;
+ address[] public authorities;
+
+ event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
+ event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
+
+ /*
+ * Public functions
+ */
+
+ /// @dev Authorizes an address.
+ /// @param target Address to authorize.
+ function addAuthorizedAddress(address target)
+ public
+ onlyOwner
+ targetNotAuthorized(target)
+ {
+ authorized[target] = true;
+ authorities.push(target);
+ LogAuthorizedAddressAdded(target, msg.sender);
+ }
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ function removeAuthorizedAddress(address target)
+ public
+ onlyOwner
+ targetAuthorized(target)
+ {
+ delete authorized[target];
+ for (uint i = 0; i < authorities.length; i++) {
+ if (authorities[i] == target) {
+ authorities[i] = authorities[authorities.length - 1];
+ authorities.length -= 1;
+ break;
+ }
+ }
+ LogAuthorizedAddressRemoved(target, msg.sender);
+ }
+
+ /// @dev Calls into ERC20 Token contract, invoking transferFrom.
+ /// @param token Address of token to transfer.
+ /// @param from Address to transfer token from.
+ /// @param to Address to transfer token to.
+ /// @param value Amount of token to transfer.
+ /// @return Success of transfer.
+ function transferFrom(
+ address token,
+ address from,
+ address to,
+ uint value)
+ public
+ onlyAuthorized
+ returns (bool)
+ {
+ return Token(token).transferFrom(from, to, value);
+ }
+
+ /*
+ * Public constant functions
+ */
+
+ /// @dev Gets all authorized addresses.
+ /// @return Array of authorized addresses.
+ function getAuthorizedAddresses()
+ public
+ constant
+ returns (address[])
+ {
+ return authorities;
+ }
+}
diff --git a/packages/contracts/src/1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol b/packages/contracts/src/1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol
new file mode 100644
index 000000000..46379c43d
--- /dev/null
+++ b/packages/contracts/src/1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol
@@ -0,0 +1,52 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.11;
+
+import { ERC20Token_v1 as ERC20Token } from "../ERC20Token/ERC20Token_v1.sol";
+
+contract UnlimitedAllowanceToken_v1 is ERC20Token {
+
+ uint constant MAX_UINT = 2**256 - 1;
+
+ /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.
+ /// @param _from Address to transfer from.
+ /// @param _to Address to transfer to.
+ /// @param _value Amount to transfer.
+ /// @return Success of transfer.
+ function transferFrom(address _from, address _to, uint _value)
+ public
+ returns (bool)
+ {
+ uint allowance = allowed[_from][msg.sender];
+ if (balances[_from] >= _value
+ && allowance >= _value
+ && balances[_to] + _value >= balances[_to]
+ ) {
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ if (allowance < MAX_UINT) {
+ allowed[_from][msg.sender] -= _value;
+ }
+ Transfer(_from, _to, _value);
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/packages/contracts/src/2.0.0/examples/ExchangeWrapper/ExchangeWrapper.sol b/packages/contracts/src/2.0.0/examples/ExchangeWrapper/ExchangeWrapper.sol
new file mode 100644
index 000000000..2fa0e3c5e
--- /dev/null
+++ b/packages/contracts/src/2.0.0/examples/ExchangeWrapper/ExchangeWrapper.sol
@@ -0,0 +1,100 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/interfaces/IExchange.sol";
+import "../../protocol/Exchange/libs/LibOrder.sol";
+
+
+contract ExchangeWrapper {
+
+ // Exchange contract.
+ // solhint-disable-next-line var-name-mixedcase
+ IExchange internal EXCHANGE;
+
+ constructor (address _exchange)
+ public
+ {
+ EXCHANGE = IExchange(_exchange);
+ }
+
+ /// @dev Cancels all orders created by sender with a salt less than or equal to the targetOrderEpoch
+ /// and senderAddress equal to this contract.
+ /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.
+ /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.
+ /// @param makerSignature Proof that maker wishes to call this function with given params.
+ function cancelOrdersUpTo(
+ uint256 targetOrderEpoch,
+ uint256 salt,
+ bytes makerSignature
+ )
+ external
+ {
+ address makerAddress = msg.sender;
+
+ // Encode arguments into byte array.
+ bytes memory data = abi.encodeWithSelector(
+ EXCHANGE.cancelOrdersUpTo.selector,
+ targetOrderEpoch
+ );
+
+ // Call `cancelOrdersUpTo` via `executeTransaction`.
+ EXCHANGE.executeTransaction(
+ salt,
+ makerAddress,
+ data,
+ makerSignature
+ );
+ }
+
+ /// @dev Fills an order using `msg.sender` as the taker.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.
+ /// @param orderSignature Proof that order has been created by maker.
+ /// @param takerSignature Proof that taker wishes to call this function with given params.
+ function fillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ uint256 salt,
+ bytes memory orderSignature,
+ bytes memory takerSignature
+ )
+ public
+ {
+ address takerAddress = msg.sender;
+
+ // Encode arguments into byte array.
+ bytes memory data = abi.encodeWithSelector(
+ EXCHANGE.fillOrder.selector,
+ order,
+ takerAssetFillAmount,
+ orderSignature
+ );
+
+ // Call `fillOrder` via `executeTransaction`.
+ EXCHANGE.executeTransaction(
+ salt,
+ takerAddress,
+ data,
+ takerSignature
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/examples/Validator/Validator.sol b/packages/contracts/src/2.0.0/examples/Validator/Validator.sol
new file mode 100644
index 000000000..72ed528ba
--- /dev/null
+++ b/packages/contracts/src/2.0.0/examples/Validator/Validator.sol
@@ -0,0 +1,56 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../protocol/Exchange/interfaces/IValidator.sol";
+
+
+contract Validator is
+ IValidator
+{
+
+ // The single valid signer for this wallet.
+ // solhint-disable-next-line var-name-mixedcase
+ address internal VALID_SIGNER;
+
+ /// @dev constructs a new `Validator` with a single valid signer.
+ /// @param validSigner The sole, valid signer.
+ constructor (address validSigner) public {
+ VALID_SIGNER = validSigner;
+ }
+
+ /// @dev Verifies that a signature is valid. `signer` must match `VALID_SIGNER`.
+ /// @param hash Message hash that is signed.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof of signing.
+ /// @return Validity of signature.
+ // solhint-disable no-unused-vars
+ function isValidSignature(
+ bytes32 hash,
+ address signerAddress,
+ bytes signature
+ )
+ external
+ view
+ returns (bool isValid)
+ {
+ return (signerAddress == VALID_SIGNER);
+ }
+ // solhint-enable no-unused-vars
+}
diff --git a/packages/contracts/src/2.0.0/examples/Wallet/Wallet.sol b/packages/contracts/src/2.0.0/examples/Wallet/Wallet.sol
new file mode 100644
index 000000000..b75021a31
--- /dev/null
+++ b/packages/contracts/src/2.0.0/examples/Wallet/Wallet.sol
@@ -0,0 +1,65 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../protocol/Exchange/interfaces/IWallet.sol";
+import "../../utils/LibBytes/LibBytes.sol";
+
+
+contract Wallet is
+ IWallet
+{
+ using LibBytes for bytes;
+
+ // The owner of this wallet.
+ // solhint-disable-next-line var-name-mixedcase
+ address internal WALLET_OWNER;
+
+ /// @dev constructs a new `Wallet` with a single owner.
+ /// @param walletOwner The owner of this wallet.
+ constructor (address walletOwner) public {
+ WALLET_OWNER = walletOwner;
+ }
+
+ /// @dev Validates an EIP712 signature.
+ /// The signer must match the owner of this wallet.
+ /// @param hash Message hash that is signed.
+ /// @param eip712Signature Proof of signing.
+ /// @return Validity of signature.
+ function isValidSignature(
+ bytes32 hash,
+ bytes eip712Signature
+ )
+ external
+ view
+ returns (bool isValid)
+ {
+ require(
+ eip712Signature.length == 65,
+ "LENGTH_65_REQUIRED"
+ );
+
+ uint8 v = uint8(eip712Signature[0]);
+ bytes32 r = eip712Signature.readBytes32(1);
+ bytes32 s = eip712Signature.readBytes32(33);
+ address recoveredAddress = ecrecover(hash, v, r, s);
+ isValid = WALLET_OWNER == recoveredAddress;
+ return isValid;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/examples/Whitelist/Whitelist.sol b/packages/contracts/src/2.0.0/examples/Whitelist/Whitelist.sol
new file mode 100644
index 000000000..60cac26ea
--- /dev/null
+++ b/packages/contracts/src/2.0.0/examples/Whitelist/Whitelist.sol
@@ -0,0 +1,136 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/interfaces/IExchange.sol";
+import "../../protocol/Exchange/libs/LibOrder.sol";
+import "../../utils/Ownable/Ownable.sol";
+
+
+contract Whitelist is
+ Ownable
+{
+
+ // Mapping of address => whitelist status.
+ mapping (address => bool) public isWhitelisted;
+
+ // Exchange contract.
+ // solhint-disable var-name-mixedcase
+ IExchange internal EXCHANGE;
+ bytes internal TX_ORIGIN_SIGNATURE;
+ // solhint-enable var-name-mixedcase
+
+ byte constant internal VALIDATOR_SIGNATURE_BYTE = "\x06";
+
+ constructor (address _exchange)
+ public
+ {
+ EXCHANGE = IExchange(_exchange);
+ TX_ORIGIN_SIGNATURE = abi.encodePacked(address(this), VALIDATOR_SIGNATURE_BYTE);
+ }
+
+ /// @dev Adds or removes an address from the whitelist.
+ /// @param target Address to add or remove from whitelist.
+ /// @param isApproved Whitelist status to assign to address.
+ function updateWhitelistStatus(
+ address target,
+ bool isApproved
+ )
+ external
+ onlyOwner
+ {
+ isWhitelisted[target] = isApproved;
+ }
+
+ /// @dev Verifies signer is same as signer of current Ethereum transaction.
+ /// NOTE: This function can currently be used to validate signatures coming from outside of this contract.
+ /// Extra safety checks can be added for a production contract.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof of signing.
+ /// @return Validity of order signature.
+ // solhint-disable no-unused-vars
+ function isValidSignature(
+ bytes32 hash,
+ address signerAddress,
+ bytes signature
+ )
+ external
+ view
+ returns (bool isValid)
+ {
+ // solhint-disable-next-line avoid-tx-origin
+ return signerAddress == tx.origin;
+ }
+ // solhint-enable no-unused-vars
+
+ /// @dev Fills an order using `msg.sender` as the taker.
+ /// The transaction will revert if both the maker and taker are not whitelisted.
+ /// Orders should specify this contract as the `senderAddress` in order to gaurantee
+ /// that both maker and taker have been whitelisted.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.
+ /// @param orderSignature Proof that order has been created by maker.
+ function fillOrderIfWhitelisted(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ uint256 salt,
+ bytes memory orderSignature
+ )
+ public
+ {
+ address takerAddress = msg.sender;
+
+ // This contract must be the entry point for the transaction.
+ require(
+ // solhint-disable-next-line avoid-tx-origin
+ takerAddress == tx.origin,
+ "INVALID_SENDER"
+ );
+
+ // Check if maker is on the whitelist.
+ require(
+ isWhitelisted[order.makerAddress],
+ "MAKER_NOT_WHITELISTED"
+ );
+
+ // Check if taker is on the whitelist.
+ require(
+ isWhitelisted[takerAddress],
+ "TAKER_NOT_WHITELISTED"
+ );
+
+ // Encode arguments into byte array.
+ bytes memory data = abi.encodeWithSelector(
+ EXCHANGE.fillOrder.selector,
+ order,
+ takerAssetFillAmount,
+ orderSignature
+ );
+
+ // Call `fillOrder` via `executeTransaction`.
+ EXCHANGE.executeTransaction(
+ salt,
+ takerAddress,
+ data,
+ TX_ORIGIN_SIGNATURE
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/Forwarder.sol b/packages/contracts/src/2.0.0/forwarder/Forwarder.sol
new file mode 100644
index 000000000..5b88b05b1
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/Forwarder.sol
@@ -0,0 +1,55 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./MixinWeth.sol";
+import "./MixinForwarderCore.sol";
+import "./libs/LibConstants.sol";
+import "./MixinAssets.sol";
+import "./MixinExchangeWrapper.sol";
+
+
+// solhint-disable no-empty-blocks
+contract Forwarder is
+ LibConstants,
+ MixinWeth,
+ MixinAssets,
+ MixinExchangeWrapper,
+ MixinForwarderCore
+{
+
+ constructor (
+ address _exchange,
+ address _etherToken,
+ address _zrxToken,
+ bytes memory _zrxAssetData,
+ bytes memory _wethAssetData
+ )
+ public
+ LibConstants(
+ _exchange,
+ _etherToken,
+ _zrxToken,
+ _zrxAssetData,
+ _wethAssetData
+ )
+ MixinForwarderCore()
+ {}
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/MixinAssets.sol b/packages/contracts/src/2.0.0/forwarder/MixinAssets.sol
new file mode 100644
index 000000000..e06f9a8e3
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/MixinAssets.sol
@@ -0,0 +1,144 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../utils/LibBytes/LibBytes.sol";
+import "../utils/Ownable/Ownable.sol";
+import "../tokens/ERC20Token/IERC20Token.sol";
+import "../tokens/ERC721Token/IERC721Token.sol";
+import "./libs/LibConstants.sol";
+import "./mixins/MAssets.sol";
+
+
+contract MixinAssets is
+ Ownable,
+ LibConstants,
+ MAssets
+{
+
+ using LibBytes for bytes;
+
+ bytes4 constant internal ERC20_TRANSFER_SELECTOR = bytes4(keccak256("transfer(address,uint256)"));
+
+ /// @dev Withdraws assets from this contract. The contract requires a ZRX balance in order to
+ /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be
+ /// used to withdraw assets that were accidentally sent to this contract.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of ERC20 token to withdraw.
+ function withdrawAsset(
+ bytes assetData,
+ uint256 amount
+ )
+ external
+ onlyOwner
+ {
+ transferAssetToSender(assetData, amount);
+ }
+
+ /// @dev Transfers given amount of asset to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferAssetToSender(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal
+ {
+ bytes4 proxyId = assetData.readBytes4(0);
+
+ if (proxyId == ERC20_DATA_ID) {
+ transferERC20Token(assetData, amount);
+ } else if (proxyId == ERC721_DATA_ID) {
+ transferERC721Token(assetData, amount);
+ } else {
+ revert("UNSUPPORTED_TOKEN_PROXY");
+ }
+ }
+
+ /// @dev Decodes ERC20 assetData and transfers given amount to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferERC20Token(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal
+ {
+ address token = assetData.readAddress(16);
+
+ // Transfer tokens.
+ // We do a raw call so we can check the success separate
+ // from the return data.
+ bool success = token.call(abi.encodeWithSelector(
+ ERC20_TRANSFER_SELECTOR,
+ msg.sender,
+ amount
+ ));
+ require(
+ success,
+ "TRANSFER_FAILED"
+ );
+
+ // Check return data.
+ // If there is no return data, we assume the token incorrectly
+ // does not return a bool. In this case we expect it to revert
+ // on failure, which was handled above.
+ // If the token does return data, we require that it is a single
+ // value that evaluates to true.
+ assembly {
+ if returndatasize {
+ success := 0
+ if eq(returndatasize, 32) {
+ // First 64 bytes of memory are reserved scratch space
+ returndatacopy(0, 0, 32)
+ success := mload(0)
+ }
+ }
+ }
+ require(
+ success,
+ "TRANSFER_FAILED"
+ );
+ }
+
+ /// @dev Decodes ERC721 assetData and transfers given amount to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferERC721Token(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal
+ {
+ require(
+ amount == 1,
+ "INVALID_AMOUNT"
+ );
+ // Decode asset data.
+ address token = assetData.readAddress(16);
+ uint256 tokenId = assetData.readUint256(36);
+
+ // Perform transfer.
+ IERC721Token(token).transferFrom(
+ address(this),
+ msg.sender,
+ tokenId
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/MixinExchangeWrapper.sol b/packages/contracts/src/2.0.0/forwarder/MixinExchangeWrapper.sol
new file mode 100644
index 000000000..4584bb840
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/MixinExchangeWrapper.sol
@@ -0,0 +1,263 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibConstants.sol";
+import "./mixins/MExchangeWrapper.sol";
+import "../protocol/Exchange/libs/LibAbiEncoder.sol";
+import "../protocol/Exchange/libs/LibOrder.sol";
+import "../protocol/Exchange/libs/LibFillResults.sol";
+import "../protocol/Exchange/libs/LibMath.sol";
+
+
+contract MixinExchangeWrapper is
+ LibAbiEncoder,
+ LibFillResults,
+ LibMath,
+ LibConstants,
+ MExchangeWrapper
+{
+
+ /// @dev Fills the input order.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrderNoThrow(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ internal
+ returns (FillResults memory fillResults)
+ {
+ // ABI encode calldata for `fillOrder`
+ bytes memory fillOrderCalldata = abiEncodeFillOrder(
+ order,
+ takerAssetFillAmount,
+ signature
+ );
+
+ address exchange = address(EXCHANGE);
+
+ // Call `fillOrder` and handle any exceptions gracefully
+ assembly {
+ let success := call(
+ gas, // forward all gas, TODO: look into gas consumption of assert/throw
+ exchange, // call address of Exchange contract
+ 0, // transfer 0 wei
+ add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)
+ mload(fillOrderCalldata), // length of input
+ fillOrderCalldata, // write output over input
+ 128 // output size is 128 bytes
+ )
+ switch success
+ case 0 {
+ mstore(fillResults, 0)
+ mstore(add(fillResults, 32), 0)
+ mstore(add(fillResults, 64), 0)
+ mstore(add(fillResults, 96), 0)
+ }
+ case 1 {
+ mstore(fillResults, mload(fillOrderCalldata))
+ mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))
+ mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))
+ mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))
+ }
+ }
+ return fillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param wethSellAmount Desired amount of WETH to sell.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellWeth(
+ LibOrder.Order[] memory orders,
+ uint256 wethSellAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory makerAssetData = orders[0].makerAssetData;
+ bytes memory wethAssetData = WETH_ASSET_DATA;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being bought by taker is the same for each order.
+ // We assume that asset being sold by taker is WETH for each order.
+ orders[i].makerAssetData = makerAssetData;
+ orders[i].takerAssetData = wethAssetData;
+
+ // Calculate the remaining amount of WETH to sell
+ uint256 remainingTakerAssetFillAmount = safeSub(wethSellAmount, totalFillResults.takerAssetFilledAmount);
+
+ // Attempt to sell the remaining amount of WETH
+ FillResults memory singleFillResults = fillOrderNoThrow(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of takerAsset has been sold
+ if (totalFillResults.takerAssetFilledAmount >= wethSellAmount) {
+ break;
+ }
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// The asset being sold by taker must always be WETH.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyExactAmountWithWeth(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory makerAssetData = orders[0].makerAssetData;
+ bytes memory wethAssetData = WETH_ASSET_DATA;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being bought by taker is the same for each order.
+ // We assume that asset being sold by taker is WETH for each order.
+ orders[i].makerAssetData = makerAssetData;
+ orders[i].takerAssetData = wethAssetData;
+
+ // Calculate the remaining amount of makerAsset to buy
+ uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);
+
+ // Convert the remaining amount of makerAsset to buy into remaining amount
+ // of takerAsset to sell, assuming entire amount can be sold in the current order
+ uint256 remainingTakerAssetFillAmount = getPartialAmount(
+ orders[i].takerAssetAmount,
+ orders[i].makerAssetAmount,
+ remainingMakerAssetFillAmount
+ );
+
+ // Attempt to sell the remaining amount of takerAsset
+ FillResults memory singleFillResults = fillOrderNoThrow(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of makerAsset has been bought
+ uint256 makerAssetFilledAmount = totalFillResults.makerAssetFilledAmount;
+ if (makerAssetFilledAmount >= makerAssetFillAmount) {
+ break;
+ }
+ }
+
+ require(
+ makerAssetFilledAmount >= makerAssetFillAmount,
+ "COMPLETE_FILL_FAILED"
+ );
+ return totalFillResults;
+ }
+
+ /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee
+ /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).
+ /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX
+ /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.
+ /// The asset being sold by taker must always be WETH.
+ /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.
+ /// @param zrxBuyAmount Desired amount of ZRX to buy.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return totalFillResults Amounts filled and fees paid by maker and taker.
+ function marketBuyExactZrxWithWeth(
+ LibOrder.Order[] memory orders,
+ uint256 zrxBuyAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (FillResults memory totalFillResults)
+ {
+ // Do nothing if zrxBuyAmount == 0
+ if (zrxBuyAmount == 0) {
+ return totalFillResults;
+ }
+
+ bytes memory zrxAssetData = ZRX_ASSET_DATA;
+ bytes memory wethAssetData = WETH_ASSET_DATA;
+ uint256 zrxPurchased = 0;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // All of these are ZRX/WETH, so we can drop the respective assetData from calldata.
+ orders[i].makerAssetData = zrxAssetData;
+ orders[i].takerAssetData = wethAssetData;
+
+ // Calculate the remaining amount of ZRX to buy.
+ uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, zrxPurchased);
+
+ // Convert the remaining amount of ZRX to buy into remaining amount
+ // of WETH to sell, assuming entire amount can be sold in the current order.
+ uint256 remainingWethSellAmount = getPartialAmount(
+ orders[i].takerAssetAmount,
+ safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees
+ remainingZrxBuyAmount
+ );
+
+ // Attempt to sell the remaining amount of WETH.
+ FillResults memory singleFillResult = fillOrderNoThrow(
+ orders[i],
+ safeAdd(remainingWethSellAmount, 1), // we add 1 wei to the fill amount to make up for rounding errors
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker.
+ addFillResults(totalFillResults, singleFillResult);
+ zrxPurchased = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);
+
+ // Stop execution if the entire amount of ZRX has been bought.
+ if (zrxPurchased >= zrxBuyAmount) {
+ break;
+ }
+ }
+
+ require(
+ zrxPurchased >= zrxBuyAmount,
+ "COMPLETE_FILL_FAILED"
+ );
+ return totalFillResults;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/MixinForwarderCore.sol b/packages/contracts/src/2.0.0/forwarder/MixinForwarderCore.sol
new file mode 100644
index 000000000..93cbf79be
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/MixinForwarderCore.sol
@@ -0,0 +1,213 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibConstants.sol";
+import "./mixins/MWeth.sol";
+import "./mixins/MAssets.sol";
+import "./mixins/MExchangeWrapper.sol";
+import "./interfaces/IForwarderCore.sol";
+import "../utils/LibBytes/LibBytes.sol";
+import "../protocol/Exchange/libs/LibOrder.sol";
+import "../protocol/Exchange/libs/LibFillResults.sol";
+import "../protocol/Exchange/libs/LibMath.sol";
+
+
+contract MixinForwarderCore is
+ LibFillResults,
+ LibMath,
+ LibConstants,
+ MWeth,
+ MAssets,
+ MExchangeWrapper,
+ IForwarderCore
+{
+
+ using LibBytes for bytes;
+
+ /// @dev Constructor approves ERC20 proxy to transfer ZRX and WETH on this contract's behalf.
+ constructor ()
+ public
+ {
+ address proxyAddress = EXCHANGE.getAssetProxy(ERC20_DATA_ID);
+ if (proxyAddress != address(0)) {
+ ETHER_TOKEN.approve(proxyAddress, MAX_UINT);
+ ZRX_TOKEN.approve(proxyAddress, MAX_UINT);
+ }
+ }
+
+ /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.
+ /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.
+ /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).
+ /// Any ETH not spent will be refunded to sender.
+ /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.
+ /// @param feeSignatures Proofs that feeOrders have been created by makers.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ /// @return Amounts filled and fees paid by maker and taker for both sets of orders.
+ function marketSellOrdersWithEth(
+ LibOrder.Order[] memory orders,
+ bytes[] memory signatures,
+ LibOrder.Order[] memory feeOrders,
+ bytes[] memory feeSignatures,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ public
+ payable
+ returns (
+ FillResults memory orderFillResults,
+ FillResults memory feeOrderFillResults
+ )
+ {
+ // Convert ETH to WETH.
+ convertEthToWeth();
+
+ uint256 wethSellAmount;
+ uint256 zrxBuyAmount;
+ uint256 makerAssetAmountPurchased;
+ if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {
+ // Calculate amount of WETH that won't be spent on ETH fees.
+ wethSellAmount = getPartialAmount(
+ PERCENTAGE_DENOMINATOR,
+ safeAdd(PERCENTAGE_DENOMINATOR, feePercentage),
+ msg.value
+ );
+ // Market sell available WETH.
+ // ZRX fees are paid with this contract's balance.
+ orderFillResults = marketSellWeth(
+ orders,
+ wethSellAmount,
+ signatures
+ );
+ // The fee amount must be deducted from the amount transfered back to sender.
+ makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);
+ } else {
+ // 5% of WETH is reserved for filling feeOrders and paying feeRecipient.
+ wethSellAmount = getPartialAmount(
+ MAX_WETH_FILL_PERCENTAGE,
+ PERCENTAGE_DENOMINATOR,
+ msg.value
+ );
+ // Market sell 95% of WETH.
+ // ZRX fees are payed with this contract's balance.
+ orderFillResults = marketSellWeth(
+ orders,
+ wethSellAmount,
+ signatures
+ );
+ // Buy back all ZRX spent on fees.
+ zrxBuyAmount = orderFillResults.takerFeePaid;
+ feeOrderFillResults = marketBuyExactZrxWithWeth(
+ feeOrders,
+ zrxBuyAmount,
+ feeSignatures
+ );
+ makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;
+ }
+
+ // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.
+ // Refund remaining ETH to msg.sender.
+ transferEthFeeAndRefund(
+ orderFillResults.takerAssetFilledAmount,
+ feeOrderFillResults.takerAssetFilledAmount,
+ feePercentage,
+ feeRecipient
+ );
+
+ // Transfer purchased assets to msg.sender.
+ transferAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);
+ }
+
+ /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.
+ /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.
+ /// Any ETH not spent will be refunded to sender.
+ /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.
+ /// @param feeSignatures Proofs that feeOrders have been created by makers.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ /// @return Amounts filled and fees paid by maker and taker for both sets of orders.
+ function marketBuyOrdersWithEth(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures,
+ LibOrder.Order[] memory feeOrders,
+ bytes[] memory feeSignatures,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ public
+ payable
+ returns (
+ FillResults memory orderFillResults,
+ FillResults memory feeOrderFillResults
+ )
+ {
+ // Convert ETH to WETH.
+ convertEthToWeth();
+
+ uint256 zrxBuyAmount;
+ uint256 makerAssetAmountPurchased;
+ if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {
+ // If the makerAsset is ZRX, it is not necessary to pay fees out of this
+ // contracts's ZRX balance because fees are factored into the price of the order.
+ orderFillResults = marketBuyExactZrxWithWeth(
+ orders,
+ makerAssetFillAmount,
+ signatures
+ );
+ // The fee amount must be deducted from the amount transfered back to sender.
+ makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);
+ } else {
+ // Attemp to purchase desired amount of makerAsset.
+ // ZRX fees are payed with this contract's balance.
+ orderFillResults = marketBuyExactAmountWithWeth(
+ orders,
+ makerAssetFillAmount,
+ signatures
+ );
+ // Buy back all ZRX spent on fees.
+ zrxBuyAmount = orderFillResults.takerFeePaid;
+ feeOrderFillResults = marketBuyExactZrxWithWeth(
+ feeOrders,
+ zrxBuyAmount,
+ feeSignatures
+ );
+ makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;
+ }
+
+ // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.
+ // Refund remaining ETH to msg.sender.
+ transferEthFeeAndRefund(
+ orderFillResults.takerAssetFilledAmount,
+ feeOrderFillResults.takerAssetFilledAmount,
+ feePercentage,
+ feeRecipient
+ );
+
+ // Transfer purchased assets to msg.sender.
+ transferAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/MixinWeth.sol b/packages/contracts/src/2.0.0/forwarder/MixinWeth.sol
new file mode 100644
index 000000000..e07940776
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/MixinWeth.sol
@@ -0,0 +1,114 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../protocol/Exchange/libs/LibMath.sol";
+import "./libs/LibConstants.sol";
+import "./mixins/MWeth.sol";
+
+
+contract MixinWeth is
+ LibMath,
+ LibConstants,
+ MWeth
+{
+
+ /// @dev Default payabale function, this allows us to withdraw WETH
+ function ()
+ public
+ payable
+ {
+ require(
+ msg.sender == address(ETHER_TOKEN),
+ "DEFAULT_FUNCTION_WETH_CONTRACT_ONLY"
+ );
+ }
+
+ /// @dev Converts message call's ETH value into WETH.
+ function convertEthToWeth()
+ internal
+ {
+ require(
+ msg.value > 0,
+ "INVALID_MSG_VALUE"
+ );
+ ETHER_TOKEN.deposit.value(msg.value)();
+ }
+
+ /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.
+ /// Refunds any excess ETH to msg.sender.
+ /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.
+ /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ function transferEthFeeAndRefund(
+ uint256 wethSoldExcludingFeeOrders,
+ uint256 wethSoldForZrx,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ internal
+ {
+ // Ensure feePercentage is less than 5%.
+ require(
+ feePercentage <= MAX_FEE_PERCENTAGE,
+ "FEE_PERCENTAGE_TOO_LARGE"
+ );
+
+ // Ensure that no extra WETH owned by this contract has been sold.
+ uint256 wethSold = safeAdd(wethSoldExcludingFeeOrders, wethSoldForZrx);
+ require(
+ wethSold <= msg.value,
+ "OVERSOLD_WETH"
+ );
+
+ // Calculate amount of WETH that hasn't been sold.
+ uint256 wethRemaining = safeSub(msg.value, wethSold);
+
+ // Calculate ETH fee to pay to feeRecipient.
+ uint256 ethFee = getPartialAmount(
+ feePercentage,
+ PERCENTAGE_DENOMINATOR,
+ wethSoldExcludingFeeOrders
+ );
+
+ // Ensure fee is less than amount of WETH remaining.
+ require(
+ ethFee <= wethRemaining,
+ "INSUFFICIENT_ETH_REMAINING"
+ );
+
+ // Do nothing if no WETH remaining
+ if (wethRemaining > 0) {
+ // Convert remaining WETH to ETH
+ ETHER_TOKEN.withdraw(wethRemaining);
+
+ // Pay ETH to feeRecipient
+ if (ethFee > 0) {
+ feeRecipient.transfer(ethFee);
+ }
+
+ // Refund remaining ETH to msg.sender.
+ uint256 ethRefund = safeSub(wethRemaining, ethFee);
+ if (ethRefund > 0) {
+ msg.sender.transfer(ethRefund);
+ }
+ }
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/interfaces/IAssets.sol b/packages/contracts/src/2.0.0/forwarder/interfaces/IAssets.sol
new file mode 100644
index 000000000..1e034c003
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/interfaces/IAssets.sol
@@ -0,0 +1,34 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract IAssets {
+
+ /// @dev Withdraws assets from this contract. The contract requires a ZRX balance in order to
+ /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be
+ /// used to withdraw assets that were accidentally sent to this contract.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of ERC20 token to withdraw.
+ function withdrawAsset(
+ bytes assetData,
+ uint256 amount
+ )
+ external;
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarder.sol b/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarder.sol
new file mode 100644
index 000000000..f5a26e2ba
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarder.sol
@@ -0,0 +1,30 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./IForwarderCore.sol";
+import "./IAssets.sol";
+
+
+// solhint-disable no-empty-blocks
+contract IForwarder is
+ IForwarderCore,
+ IAssets
+{}
diff --git a/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarderCore.sol b/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarderCore.sol
new file mode 100644
index 000000000..3ecbb133b
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/interfaces/IForwarderCore.sol
@@ -0,0 +1,80 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/libs/LibOrder.sol";
+import "../../protocol/Exchange/libs/LibFillResults.sol";
+
+
+contract IForwarderCore {
+
+ /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.
+ /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.
+ /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).
+ /// Any ETH not spent will be refunded to sender.
+ /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.
+ /// @param feeSignatures Proofs that feeOrders have been created by makers.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ /// @return Amounts filled and fees paid by maker and taker for both sets of orders.
+ function marketSellOrdersWithEth(
+ LibOrder.Order[] memory orders,
+ bytes[] memory signatures,
+ LibOrder.Order[] memory feeOrders,
+ bytes[] memory feeSignatures,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ public
+ payable
+ returns (
+ LibFillResults.FillResults memory orderFillResults,
+ LibFillResults.FillResults memory feeOrderFillResults
+ );
+
+ /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.
+ /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.
+ /// Any ETH not spent will be refunded to sender.
+ /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.
+ /// @param feeSignatures Proofs that feeOrders have been created by makers.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ /// @return Amounts filled and fees paid by maker and taker for both sets of orders.
+ function marketBuyOrdersWithEth(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures,
+ LibOrder.Order[] memory feeOrders,
+ bytes[] memory feeSignatures,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ public
+ payable
+ returns (
+ LibFillResults.FillResults memory orderFillResults,
+ LibFillResults.FillResults memory feeOrderFillResults
+ );
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/libs/LibConstants.sol b/packages/contracts/src/2.0.0/forwarder/libs/LibConstants.sol
new file mode 100644
index 000000000..c26d7902c
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/libs/LibConstants.sol
@@ -0,0 +1,58 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../protocol/Exchange/interfaces/IExchange.sol";
+import "../../tokens/EtherToken/IEtherToken.sol";
+import "../../tokens/ERC20Token/IERC20Token.sol";
+
+
+contract LibConstants {
+
+ bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256("ERC20Token(address)"));
+ bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256("ERC721Token(address,uint256)"));
+ uint256 constant internal MAX_UINT = 2**256 - 1;
+ uint256 constant internal PERCENTAGE_DENOMINATOR = 10**18;
+ uint256 constant internal MAX_FEE_PERCENTAGE = 5 * PERCENTAGE_DENOMINATOR / 100; // 5%
+ uint256 constant internal MAX_WETH_FILL_PERCENTAGE = 95 * PERCENTAGE_DENOMINATOR / 100; // 95%
+
+ // solhint-disable var-name-mixedcase
+ IExchange internal EXCHANGE;
+ IEtherToken internal ETHER_TOKEN;
+ IERC20Token internal ZRX_TOKEN;
+ bytes internal ZRX_ASSET_DATA;
+ bytes internal WETH_ASSET_DATA;
+ // solhint-enable var-name-mixedcase
+
+ constructor (
+ address _exchange,
+ address _etherToken,
+ address _zrxToken,
+ bytes memory _zrxAssetData,
+ bytes memory _wethAssetData
+ )
+ public
+ {
+ EXCHANGE = IExchange(_exchange);
+ ETHER_TOKEN = IEtherToken(_etherToken);
+ ZRX_TOKEN = IERC20Token(_zrxToken);
+ ZRX_ASSET_DATA = _zrxAssetData;
+ WETH_ASSET_DATA = _wethAssetData;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/libs/LibForwarderErrors.sol b/packages/contracts/src/2.0.0/forwarder/libs/LibForwarderErrors.sol
new file mode 100644
index 000000000..cdfb77a0b
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/libs/LibForwarderErrors.sol
@@ -0,0 +1,34 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+// solhint-disable
+pragma solidity 0.4.24;
+
+
+/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.
+contract LibForwarderErrors {
+ string constant FEE_PERCENTAGE_TOO_LARGE = "FEE_PROPORTION_TOO_LARGE"; // Provided fee percentage greater than 5%.
+ string constant INSUFFICIENT_ETH_REMAINING = "INSUFFICIENT_ETH_REMAINING"; // Not enough ETH remaining to pay feeRecipient.
+ string constant OVERSOLD_WETH = "OVERSOLD_WETH"; // More WETH sold than provided with current message call.
+ string constant COMPLETE_FILL_FAILED = "COMPLETE_FILL_FAILED"; // Desired purchase amount not completely filled (required for ZRX fees only).
+ string constant TRANSFER_FAILED = "TRANSFER_FAILED"; // Asset transfer failed.
+ string constant UNSUPPORTED_TOKEN_PROXY = "UNSUPPORTED_TOKEN_PROXY"; // Proxy in assetData not supported.
+ string constant DEFAULT_FUNCTION_WETH_CONTRACT_ONLY = "DEFAULT_FUNCTION_WETH_CONTRACT_ONLY"; // Fallback function may only be used for WETH withdrawals.
+ string constant INVALID_MSG_VALUE = "INVALID_MSG_VALUE"; // msg.value must be greater than 0.
+ string constant INVALID_AMOUNT = "INVALID_AMOUNT"; // Amount must equal 1.
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/mixins/MAssets.sol b/packages/contracts/src/2.0.0/forwarder/mixins/MAssets.sol
new file mode 100644
index 000000000..83636432a
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/mixins/MAssets.sol
@@ -0,0 +1,54 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../interfaces/IAssets.sol";
+
+
+contract MAssets is
+ IAssets
+{
+
+ /// @dev Transfers given amount of asset to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferAssetToSender(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal;
+
+ /// @dev Decodes ERC20 assetData and transfers given amount to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferERC20Token(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal;
+
+ /// @dev Decodes ERC721 assetData and transfers given amount to sender.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param amount Amount of asset to transfer to sender.
+ function transferERC721Token(
+ bytes memory assetData,
+ uint256 amount
+ )
+ internal;
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/mixins/MExchangeWrapper.sol b/packages/contracts/src/2.0.0/forwarder/mixins/MExchangeWrapper.sol
new file mode 100644
index 000000000..360dea0e4
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/mixins/MExchangeWrapper.sol
@@ -0,0 +1,87 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/libs/LibOrder.sol";
+import "../../protocol/Exchange/libs/LibFillResults.sol";
+
+
+contract MExchangeWrapper {
+
+ /// @dev Fills the input order.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrderNoThrow(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ internal
+ returns (LibFillResults.FillResults memory fillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param wethSellAmount Desired amount of WETH to sell.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellWeth(
+ LibOrder.Order[] memory orders,
+ uint256 wethSellAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// The asset being sold by taker must always be WETH.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyExactAmountWithWeth(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee
+ /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).
+ /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX
+ /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.
+ /// The asset being sold by taker must always be WETH.
+ /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.
+ /// @param zrxBuyAmount Desired amount of ZRX to buy.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return totalFillResults Amounts filled and fees paid by maker and taker.
+ function marketBuyExactZrxWithWeth(
+ LibOrder.Order[] memory orders,
+ uint256 zrxBuyAmount,
+ bytes[] memory signatures
+ )
+ internal
+ returns (LibFillResults.FillResults memory totalFillResults);
+}
diff --git a/packages/contracts/src/2.0.0/forwarder/mixins/MWeth.sol b/packages/contracts/src/2.0.0/forwarder/mixins/MWeth.sol
new file mode 100644
index 000000000..88e77be4e
--- /dev/null
+++ b/packages/contracts/src/2.0.0/forwarder/mixins/MWeth.sol
@@ -0,0 +1,41 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract MWeth {
+
+ /// @dev Converts message call's ETH value into WETH.
+ function convertEthToWeth()
+ internal;
+
+ /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.
+ /// Refunds any excess ETH to msg.sender.
+ /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.
+ /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.
+ /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.
+ /// @param feeRecipient Address that will receive ETH when orders are filled.
+ function transferEthFeeAndRefund(
+ uint256 wethSoldExcludingFeeOrders,
+ uint256 wethSoldForZrx,
+ uint256 feePercentage,
+ address feeRecipient
+ )
+ internal;
+}
diff --git a/packages/contracts/src/2.0.0/multisig/MultiSigWallet.sol b/packages/contracts/src/2.0.0/multisig/MultiSigWallet.sol
new file mode 100644
index 000000000..eb54fe047
--- /dev/null
+++ b/packages/contracts/src/2.0.0/multisig/MultiSigWallet.sol
@@ -0,0 +1,367 @@
+// solhint-disable
+pragma solidity ^0.4.10;
+
+
+/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
+/// @author Stefan George - <stefan.george@consensys.net>
+contract MultiSigWallet {
+
+ uint constant public MAX_OWNER_COUNT = 50;
+
+ event Confirmation(address indexed sender, uint indexed transactionId);
+ event Revocation(address indexed sender, uint indexed transactionId);
+ event Submission(uint indexed transactionId);
+ event Execution(uint indexed transactionId);
+ event ExecutionFailure(uint indexed transactionId);
+ event Deposit(address indexed sender, uint value);
+ event OwnerAddition(address indexed owner);
+ event OwnerRemoval(address indexed owner);
+ event RequirementChange(uint required);
+
+ mapping (uint => Transaction) public transactions;
+ mapping (uint => mapping (address => bool)) public confirmations;
+ mapping (address => bool) public isOwner;
+ address[] public owners;
+ uint public required;
+ uint public transactionCount;
+
+ struct Transaction {
+ address destination;
+ uint value;
+ bytes data;
+ bool executed;
+ }
+
+ modifier onlyWallet() {
+ if (msg.sender != address(this))
+ throw;
+ _;
+ }
+
+ modifier ownerDoesNotExist(address owner) {
+ if (isOwner[owner])
+ throw;
+ _;
+ }
+
+ modifier ownerExists(address owner) {
+ if (!isOwner[owner])
+ throw;
+ _;
+ }
+
+ modifier transactionExists(uint transactionId) {
+ if (transactions[transactionId].destination == 0)
+ throw;
+ _;
+ }
+
+ modifier confirmed(uint transactionId, address owner) {
+ if (!confirmations[transactionId][owner])
+ throw;
+ _;
+ }
+
+ modifier notConfirmed(uint transactionId, address owner) {
+ if (confirmations[transactionId][owner])
+ throw;
+ _;
+ }
+
+ modifier notExecuted(uint transactionId) {
+ if (transactions[transactionId].executed)
+ throw;
+ _;
+ }
+
+ modifier notNull(address _address) {
+ if (_address == 0)
+ throw;
+ _;
+ }
+
+ modifier validRequirement(uint ownerCount, uint _required) {
+ if ( ownerCount > MAX_OWNER_COUNT
+ || _required > ownerCount
+ || _required == 0
+ || ownerCount == 0)
+ throw;
+ _;
+ }
+
+ /// @dev Fallback function allows to deposit ether.
+ function()
+ payable
+ {
+ if (msg.value > 0)
+ Deposit(msg.sender, msg.value);
+ }
+
+ /*
+ * Public functions
+ */
+ /// @dev Contract constructor sets initial owners and required number of confirmations.
+ /// @param _owners List of initial owners.
+ /// @param _required Number of required confirmations.
+ function MultiSigWallet(address[] _owners, uint _required)
+ public
+ validRequirement(_owners.length, _required)
+ {
+ for (uint i=0; i<_owners.length; i++) {
+ if (isOwner[_owners[i]] || _owners[i] == 0)
+ throw;
+ isOwner[_owners[i]] = true;
+ }
+ owners = _owners;
+ required = _required;
+ }
+
+ /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
+ /// @param owner Address of new owner.
+ function addOwner(address owner)
+ public
+ onlyWallet
+ ownerDoesNotExist(owner)
+ notNull(owner)
+ validRequirement(owners.length + 1, required)
+ {
+ isOwner[owner] = true;
+ owners.push(owner);
+ OwnerAddition(owner);
+ }
+
+ /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
+ /// @param owner Address of owner.
+ function removeOwner(address owner)
+ public
+ onlyWallet
+ ownerExists(owner)
+ {
+ isOwner[owner] = false;
+ for (uint i=0; i<owners.length - 1; i++)
+ if (owners[i] == owner) {
+ owners[i] = owners[owners.length - 1];
+ break;
+ }
+ owners.length -= 1;
+ if (required > owners.length)
+ changeRequirement(owners.length);
+ OwnerRemoval(owner);
+ }
+
+ /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
+ /// @param owner Address of owner to be replaced.
+ /// @param owner Address of new owner.
+ function replaceOwner(address owner, address newOwner)
+ public
+ onlyWallet
+ ownerExists(owner)
+ ownerDoesNotExist(newOwner)
+ {
+ for (uint i=0; i<owners.length; i++)
+ if (owners[i] == owner) {
+ owners[i] = newOwner;
+ break;
+ }
+ isOwner[owner] = false;
+ isOwner[newOwner] = true;
+ OwnerRemoval(owner);
+ OwnerAddition(newOwner);
+ }
+
+ /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
+ /// @param _required Number of required confirmations.
+ function changeRequirement(uint _required)
+ public
+ onlyWallet
+ validRequirement(owners.length, _required)
+ {
+ required = _required;
+ RequirementChange(_required);
+ }
+
+ /// @dev Allows an owner to submit and confirm a transaction.
+ /// @param destination Transaction target address.
+ /// @param value Transaction ether value.
+ /// @param data Transaction data payload.
+ /// @return Returns transaction ID.
+ function submitTransaction(address destination, uint value, bytes data)
+ public
+ returns (uint transactionId)
+ {
+ transactionId = addTransaction(destination, value, data);
+ confirmTransaction(transactionId);
+ }
+
+ /// @dev Allows an owner to confirm a transaction.
+ /// @param transactionId Transaction ID.
+ function confirmTransaction(uint transactionId)
+ public
+ ownerExists(msg.sender)
+ transactionExists(transactionId)
+ notConfirmed(transactionId, msg.sender)
+ {
+ confirmations[transactionId][msg.sender] = true;
+ Confirmation(msg.sender, transactionId);
+ executeTransaction(transactionId);
+ }
+
+ /// @dev Allows an owner to revoke a confirmation for a transaction.
+ /// @param transactionId Transaction ID.
+ function revokeConfirmation(uint transactionId)
+ public
+ ownerExists(msg.sender)
+ confirmed(transactionId, msg.sender)
+ notExecuted(transactionId)
+ {
+ confirmations[transactionId][msg.sender] = false;
+ Revocation(msg.sender, transactionId);
+ }
+
+ /// @dev Allows anyone to execute a confirmed transaction.
+ /// @param transactionId Transaction ID.
+ function executeTransaction(uint transactionId)
+ public
+ notExecuted(transactionId)
+ {
+ if (isConfirmed(transactionId)) {
+ Transaction tx = transactions[transactionId];
+ tx.executed = true;
+ if (tx.destination.call.value(tx.value)(tx.data))
+ Execution(transactionId);
+ else {
+ ExecutionFailure(transactionId);
+ tx.executed = false;
+ }
+ }
+ }
+
+ /// @dev Returns the confirmation status of a transaction.
+ /// @param transactionId Transaction ID.
+ /// @return Confirmation status.
+ function isConfirmed(uint transactionId)
+ public
+ constant
+ returns (bool)
+ {
+ uint count = 0;
+ for (uint i=0; i<owners.length; i++) {
+ if (confirmations[transactionId][owners[i]])
+ count += 1;
+ if (count == required)
+ return true;
+ }
+ }
+
+ /*
+ * Internal functions
+ */
+ /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
+ /// @param destination Transaction target address.
+ /// @param value Transaction ether value.
+ /// @param data Transaction data payload.
+ /// @return Returns transaction ID.
+ function addTransaction(address destination, uint value, bytes data)
+ internal
+ notNull(destination)
+ returns (uint transactionId)
+ {
+ transactionId = transactionCount;
+ transactions[transactionId] = Transaction({
+ destination: destination,
+ value: value,
+ data: data,
+ executed: false
+ });
+ transactionCount += 1;
+ Submission(transactionId);
+ }
+
+ /*
+ * Web3 call functions
+ */
+ /// @dev Returns number of confirmations of a transaction.
+ /// @param transactionId Transaction ID.
+ /// @return Number of confirmations.
+ function getConfirmationCount(uint transactionId)
+ public
+ constant
+ returns (uint count)
+ {
+ for (uint i=0; i<owners.length; i++)
+ if (confirmations[transactionId][owners[i]])
+ count += 1;
+ }
+
+ /// @dev Returns total number of transactions after filers are applied.
+ /// @param pending Include pending transactions.
+ /// @param executed Include executed transactions.
+ /// @return Total number of transactions after filters are applied.
+ function getTransactionCount(bool pending, bool executed)
+ public
+ constant
+ returns (uint count)
+ {
+ for (uint i=0; i<transactionCount; i++)
+ if ( pending && !transactions[i].executed
+ || executed && transactions[i].executed)
+ count += 1;
+ }
+
+ /// @dev Returns list of owners.
+ /// @return List of owner addresses.
+ function getOwners()
+ public
+ constant
+ returns (address[])
+ {
+ return owners;
+ }
+
+ /// @dev Returns array with owner addresses, which confirmed transaction.
+ /// @param transactionId Transaction ID.
+ /// @return Returns array of owner addresses.
+ function getConfirmations(uint transactionId)
+ public
+ constant
+ returns (address[] _confirmations)
+ {
+ address[] memory confirmationsTemp = new address[](owners.length);
+ uint count = 0;
+ uint i;
+ for (i=0; i<owners.length; i++)
+ if (confirmations[transactionId][owners[i]]) {
+ confirmationsTemp[count] = owners[i];
+ count += 1;
+ }
+ _confirmations = new address[](count);
+ for (i=0; i<count; i++)
+ _confirmations[i] = confirmationsTemp[i];
+ }
+
+ /// @dev Returns list of transaction IDs in defined range.
+ /// @param from Index start position of transaction array.
+ /// @param to Index end position of transaction array.
+ /// @param pending Include pending transactions.
+ /// @param executed Include executed transactions.
+ /// @return Returns array of transaction IDs.
+ function getTransactionIds(uint from, uint to, bool pending, bool executed)
+ public
+ constant
+ returns (uint[] _transactionIds)
+ {
+ uint[] memory transactionIdsTemp = new uint[](transactionCount);
+ uint count = 0;
+ uint i;
+ for (i=0; i<transactionCount; i++)
+ if ( pending && !transactions[i].executed
+ || executed && transactions[i].executed)
+ {
+ transactionIdsTemp[count] = i;
+ count += 1;
+ }
+ _transactionIds = new uint[](to - from);
+ for (i=from; i<to; i++)
+ _transactionIds[i - from] = transactionIdsTemp[i];
+ }
+}
diff --git a/packages/contracts/src/2.0.0/multisig/MultiSigWalletWithTimeLock.sol b/packages/contracts/src/2.0.0/multisig/MultiSigWalletWithTimeLock.sol
new file mode 100644
index 000000000..8c5e6e1e6
--- /dev/null
+++ b/packages/contracts/src/2.0.0/multisig/MultiSigWalletWithTimeLock.sol
@@ -0,0 +1,134 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+// solhint-disable
+pragma solidity ^0.4.10;
+
+import "./MultiSigWallet.sol";
+
+
+/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.
+/// @author Amir Bandeali - <amir@0xProject.com>
+contract MultiSigWalletWithTimeLock is MultiSigWallet {
+
+ event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);
+ event TimeLockChange(uint secondsTimeLocked);
+
+ uint public secondsTimeLocked;
+
+ mapping (uint => uint) public confirmationTimes;
+
+ modifier notFullyConfirmed(uint transactionId) {
+ require(!isConfirmed(transactionId));
+ _;
+ }
+
+ modifier fullyConfirmed(uint transactionId) {
+ require(isConfirmed(transactionId));
+ _;
+ }
+
+ modifier pastTimeLock(uint transactionId) {
+ require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);
+ _;
+ }
+
+ /*
+ * Public functions
+ */
+
+ /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.
+ /// @param _owners List of initial owners.
+ /// @param _required Number of required confirmations.
+ /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
+ function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)
+ public
+ MultiSigWallet(_owners, _required)
+ {
+ secondsTimeLocked = _secondsTimeLocked;
+ }
+
+ /// @dev Changes the duration of the time lock for transactions.
+ /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
+ function changeTimeLock(uint _secondsTimeLocked)
+ public
+ onlyWallet
+ {
+ secondsTimeLocked = _secondsTimeLocked;
+ TimeLockChange(_secondsTimeLocked);
+ }
+
+ /// @dev Allows an owner to confirm a transaction.
+ /// @param transactionId Transaction ID.
+ function confirmTransaction(uint transactionId)
+ public
+ ownerExists(msg.sender)
+ transactionExists(transactionId)
+ notConfirmed(transactionId, msg.sender)
+ notFullyConfirmed(transactionId)
+ {
+ confirmations[transactionId][msg.sender] = true;
+ Confirmation(msg.sender, transactionId);
+ if (isConfirmed(transactionId)) {
+ setConfirmationTime(transactionId, block.timestamp);
+ }
+ }
+
+ /// @dev Allows an owner to revoke a confirmation for a transaction.
+ /// @param transactionId Transaction ID.
+ function revokeConfirmation(uint transactionId)
+ public
+ ownerExists(msg.sender)
+ confirmed(transactionId, msg.sender)
+ notExecuted(transactionId)
+ notFullyConfirmed(transactionId)
+ {
+ confirmations[transactionId][msg.sender] = false;
+ Revocation(msg.sender, transactionId);
+ }
+
+ /// @dev Allows anyone to execute a confirmed transaction.
+ /// @param transactionId Transaction ID.
+ function executeTransaction(uint transactionId)
+ public
+ notExecuted(transactionId)
+ fullyConfirmed(transactionId)
+ pastTimeLock(transactionId)
+ {
+ Transaction storage tx = transactions[transactionId];
+ tx.executed = true;
+ if (tx.destination.call.value(tx.value)(tx.data))
+ Execution(transactionId);
+ else {
+ ExecutionFailure(transactionId);
+ tx.executed = false;
+ }
+ }
+
+ /*
+ * Internal functions
+ */
+
+ /// @dev Sets the time of when a submission first passed.
+ function setConfirmationTime(uint transactionId, uint confirmationTime)
+ internal
+ {
+ confirmationTimes[transactionId] = confirmationTime;
+ ConfirmationTimeSet(transactionId, confirmationTime);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol
new file mode 100644
index 000000000..b5cec6b64
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC20Proxy.sol
@@ -0,0 +1,133 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/LibBytes/LibBytes.sol";
+import "./MixinAuthorizable.sol";
+
+
+contract ERC20Proxy is
+ MixinAuthorizable
+{
+ // Id of this proxy.
+ bytes4 constant internal PROXY_ID = bytes4(keccak256("ERC20Token(address)"));
+
+ // solhint-disable-next-line payable-fallback
+ function ()
+ external
+ {
+ assembly {
+ // The first 4 bytes of calldata holds the function selector
+ let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)
+
+ // `transferFrom` will be called with the following parameters:
+ // assetData Encoded byte array.
+ // from Address to transfer asset from.
+ // to Address to transfer asset to.
+ // amount Amount of asset to transfer.
+ // bytes4(keccak256("transferFrom(bytes,address,address,uint256)")) = 0xa85e59e4
+ if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {
+
+ // To lookup a value in a mapping, we load from the storage location keccak256(k, p),
+ // where k is the key left padded to 32 bytes and p is the storage slot
+ let start := mload(64)
+ mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))
+ mstore(add(start, 32), authorized_slot)
+
+ // Revert if authorized[msg.sender] == false
+ if iszero(sload(keccak256(start, 64))) {
+ // Revert with `Error("SENDER_NOT_AUTHORIZED")`
+ mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
+ mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)
+ mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)
+ mstore(96, 0)
+ revert(0, 100)
+ }
+
+ /////// Token contract address ///////
+ // The token address is found as follows:
+ // * It is stored at offset 4 in `assetData` contents.
+ // * This is stored at offset 32 from `assetData`.
+ // * The offset to `assetData` from Params is stored at offset
+ // 4 in calldata.
+ // * The offset of Params in calldata is 4.
+ // So we read location 4 and add 32 + 4 + 4 to it.
+ let token := calldataload(add(calldataload(4), 40))
+
+ /////// Setup Header Area ///////
+ // This area holds the 4-byte `transferFrom` selector.
+ // Any trailing data in transferFromSelector will be
+ // overwritten in the next `mstore` call.
+ mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
+
+ /////// Setup Params Area ///////
+ // We copy the fields `from`, `to` and `amount` in bulk
+ // from our own calldata to the new calldata.
+ calldatacopy(4, 36, 96)
+
+ /////// Call `token.transferFrom` using the calldata ///////
+ let success := call(
+ gas, // forward all gas
+ token, // call address of token contract
+ 0, // don't send any ETH
+ 0, // pointer to start of input
+ 100, // length of input
+ 0, // write output over input
+ 32 // output size should be 32 bytes
+ )
+
+ /////// Check return data. ///////
+ // If there is no return data, we assume the token incorrectly
+ // does not return a bool. In this case we expect it to revert
+ // on failure, which was handled above.
+ // If the token does return data, we require that it is a single
+ // nonzero 32 bytes value.
+ // So the transfer succeeded if the call succeeded and either
+ // returned nothing, or returned a non-zero 32 byte value.
+ success := and(success, or(
+ iszero(returndatasize),
+ and(
+ eq(returndatasize, 32),
+ gt(mload(0), 0)
+ )
+ ))
+ if success {
+ return(0, 0)
+ }
+
+ // Revert with `Error("TRANSFER_FAILED")`
+ mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
+ mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)
+ mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)
+ mstore(96, 0)
+ revert(0, 100)
+ }
+ }
+ }
+
+ /// @dev Gets the proxy id associated with the proxy address.
+ /// @return Proxy id.
+ function getProxyId()
+ external
+ pure
+ returns (bytes4)
+ {
+ return PROXY_ID;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC721Proxy.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC721Proxy.sol
new file mode 100644
index 000000000..6a70c9f60
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/ERC721Proxy.sol
@@ -0,0 +1,167 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/LibBytes/LibBytes.sol";
+import "./MixinAuthorizable.sol";
+
+
+contract ERC721Proxy is
+ MixinAuthorizable
+{
+ // Id of this proxy.
+ bytes4 constant internal PROXY_ID = bytes4(keccak256("ERC721Token(address,uint256)"));
+
+ // solhint-disable-next-line payable-fallback
+ function ()
+ external
+ {
+ assembly {
+ // The first 4 bytes of calldata holds the function selector
+ let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)
+
+ // `transferFrom` will be called with the following parameters:
+ // assetData Encoded byte array.
+ // from Address to transfer asset from.
+ // to Address to transfer asset to.
+ // amount Amount of asset to transfer.
+ // bytes4(keccak256("transferFrom(bytes,address,address,uint256)")) = 0xa85e59e4
+ if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {
+
+ // To lookup a value in a mapping, we load from the storage location keccak256(k, p),
+ // where k is the key left padded to 32 bytes and p is the storage slot
+ let start := mload(64)
+ mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))
+ mstore(add(start, 32), authorized_slot)
+
+ // Revert if authorized[msg.sender] == false
+ if iszero(sload(keccak256(start, 64))) {
+ // Revert with `Error("SENDER_NOT_AUTHORIZED")`
+ mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
+ mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)
+ mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)
+ mstore(96, 0)
+ revert(0, 100)
+ }
+
+ // `transferFrom`.
+ // The function is marked `external`, so no abi decodeding is done for
+ // us. Instead, we expect the `calldata` memory to contain the
+ // following:
+ //
+ // | Area | Offset | Length | Contents |
+ // |----------|--------|---------|-------------------------------------|
+ // | Header | 0 | 4 | function selector |
+ // | Params | | 4 * 32 | function parameters: |
+ // | | 4 | | 1. offset to assetData (*) |
+ // | | 36 | | 2. from |
+ // | | 68 | | 3. to |
+ // | | 100 | | 4. amount |
+ // | Data | | | assetData: |
+ // | | 132 | 32 | assetData Length |
+ // | | 164 | ** | assetData Contents |
+ //
+ // (*): offset is computed from start of function parameters, so offset
+ // by an additional 4 bytes in the calldata.
+ //
+ // WARNING: The ABIv2 specification allows additional padding between
+ // the Params and Data section. This will result in a larger
+ // offset to assetData.
+
+ // Asset data itself is encoded as follows:
+ //
+ // | Area | Offset | Length | Contents |
+ // |----------|--------|---------|-------------------------------------|
+ // | Header | 0 | 4 | function selector |
+ // | Params | | 2 * 32 | function parameters: |
+ // | | 4 | 12 + 20 | 1. token address |
+ // | | 36 | | 2. tokenId |
+
+ // We construct calldata for the `token.transferFrom` ABI.
+ // The layout of this calldata is in the table below.
+ //
+ // | Area | Offset | Length | Contents |
+ // |----------|--------|---------|-------------------------------------|
+ // | Header | 0 | 4 | function selector |
+ // | Params | | 3 * 32 | function parameters: |
+ // | | 4 | | 1. from |
+ // | | 36 | | 2. to |
+ // | | 68 | | 3. tokenId |
+
+ // There exists only 1 of each token.
+ // require(amount == 1, "INVALID_AMOUNT")
+ if sub(calldataload(100), 1) {
+ // Revert with `Error("INVALID_AMOUNT")`
+ mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
+ mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)
+ mstore(64, 0x0000000e494e56414c49445f414d4f554e540000000000000000000000000000)
+ mstore(96, 0)
+ revert(0, 100)
+ }
+
+ /////// Setup Header Area ///////
+ // This area holds the 4-byte `transferFrom` selector.
+ // Any trailing data in transferFromSelector will be
+ // overwritten in the next `mstore` call.
+ mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
+
+ /////// Setup Params Area ///////
+ // We copy the fields `from` and `to` in bulk
+ // from our own calldata to the new calldata.
+ calldatacopy(4, 36, 64)
+
+ // Copy `tokenId` field from our own calldata to the new calldata.
+ let assetDataOffset := calldataload(4)
+ calldatacopy(68, add(assetDataOffset, 72), 32)
+
+ /////// Call `token.transferFrom` using the calldata ///////
+ let token := calldataload(add(assetDataOffset, 40))
+ let success := call(
+ gas, // forward all gas
+ token, // call address of token contract
+ 0, // don't send any ETH
+ 0, // pointer to start of input
+ 100, // length of input
+ 0, // write output to null
+ 0 // output size is 0 bytes
+ )
+ if success {
+ return(0, 0)
+ }
+
+ // Revert with `Error("TRANSFER_FAILED")`
+ mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
+ mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)
+ mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)
+ mstore(96, 0)
+ revert(0, 100)
+ }
+ }
+ }
+
+ /// @dev Gets the proxy id associated with the proxy address.
+ /// @return Proxy id.
+ function getProxyId()
+ external
+ pure
+ returns (bytes4)
+ {
+ return PROXY_ID;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/MixinAuthorizable.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/MixinAuthorizable.sol
new file mode 100644
index 000000000..ff4660a31
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/MixinAuthorizable.sol
@@ -0,0 +1,118 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/Ownable/Ownable.sol";
+import "./mixins/MAuthorizable.sol";
+
+
+contract MixinAuthorizable is
+ Ownable,
+ MAuthorizable
+{
+
+ /// @dev Only authorized addresses can invoke functions with this modifier.
+ modifier onlyAuthorized {
+ require(
+ authorized[msg.sender],
+ "SENDER_NOT_AUTHORIZED"
+ );
+ _;
+ }
+
+ mapping (address => bool) public authorized;
+ address[] public authorities;
+
+ /// @dev Authorizes an address.
+ /// @param target Address to authorize.
+ function addAuthorizedAddress(address target)
+ external
+ onlyOwner
+ {
+ require(
+ !authorized[target],
+ "TARGET_ALREADY_AUTHORIZED"
+ );
+
+ authorized[target] = true;
+ authorities.push(target);
+ emit AuthorizedAddressAdded(target, msg.sender);
+ }
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ function removeAuthorizedAddress(address target)
+ external
+ onlyOwner
+ {
+ require(
+ authorized[target],
+ "TARGET_NOT_AUTHORIZED"
+ );
+
+ delete authorized[target];
+ for (uint256 i = 0; i < authorities.length; i++) {
+ if (authorities[i] == target) {
+ authorities[i] = authorities[authorities.length - 1];
+ authorities.length -= 1;
+ break;
+ }
+ }
+ emit AuthorizedAddressRemoved(target, msg.sender);
+ }
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ /// @param index Index of target in authorities array.
+ function removeAuthorizedAddressAtIndex(
+ address target,
+ uint256 index
+ )
+ external
+ onlyOwner
+ {
+ require(
+ authorized[target],
+ "TARGET_NOT_AUTHORIZED"
+ );
+ require(
+ index < authorities.length,
+ "INDEX_OUT_OF_BOUNDS"
+ );
+ require(
+ authorities[index] == target,
+ "AUTHORIZED_ADDRESS_MISMATCH"
+ );
+
+ delete authorized[target];
+ authorities[index] = authorities[authorities.length - 1];
+ authorities.length -= 1;
+ emit AuthorizedAddressRemoved(target, msg.sender);
+ }
+
+ /// @dev Gets all authorized addresses.
+ /// @return Array of authorized addresses.
+ function getAuthorizedAddresses()
+ external
+ view
+ returns (address[] memory)
+ {
+ return authorities;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetData.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetData.sol
new file mode 100644
index 000000000..3e76e38dd
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetData.sol
@@ -0,0 +1,40 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+// solhint-disable
+pragma solidity 0.4.24;
+
+
+// @dev Interface of the asset proxy's assetData.
+// The asset proxies take an ABI encoded `bytes assetData` as argument.
+// This argument is ABI encoded as one of the methods of this interface.
+interface IAssetData {
+
+ function ERC20Token(address tokenContract)
+ external
+ pure;
+
+ function ERC721Token(
+ address tokenContract,
+ uint256 tokenId,
+ bytes receiverData
+ )
+ external
+ pure;
+
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol
new file mode 100644
index 000000000..3651dd694
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol
@@ -0,0 +1,47 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "./IAuthorizable.sol";
+
+
+contract IAssetProxy is
+ IAuthorizable
+{
+
+ /// @dev Transfers assets. Either succeeds or throws.
+ /// @param assetData Byte array encoded for the respective asset proxy.
+ /// @param from Address to transfer asset from.
+ /// @param to Address to transfer asset to.
+ /// @param amount Amount of asset to transfer.
+ function transferFrom(
+ bytes assetData,
+ address from,
+ address to,
+ uint256 amount
+ )
+ external;
+
+ /// @dev Gets the proxy id associated with the proxy address.
+ /// @return Proxy id.
+ function getProxyId()
+ external
+ pure
+ returns (bytes4);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol
new file mode 100644
index 000000000..8fac43a47
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol
@@ -0,0 +1,53 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../../utils/Ownable/IOwnable.sol";
+
+
+contract IAuthorizable is
+ IOwnable
+{
+
+ /// @dev Authorizes an address.
+ /// @param target Address to authorize.
+ function addAuthorizedAddress(address target)
+ external;
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ function removeAuthorizedAddress(address target)
+ external;
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ /// @param index Index of target in authorities array.
+ function removeAuthorizedAddressAtIndex(
+ address target,
+ uint256 index
+ )
+ external;
+
+ /// @dev Gets all authorized addresses.
+ /// @return Array of authorized addresses.
+ function getAuthorizedAddresses()
+ external
+ view
+ returns (address[] memory);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/libs/LibAssetProxyErrors.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/libs/LibAssetProxyErrors.sol
new file mode 100644
index 000000000..1d9a70cc1
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/libs/LibAssetProxyErrors.sol
@@ -0,0 +1,38 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+// solhint-disable
+pragma solidity 0.4.24;
+
+
+/// @dev This contract documents the revert reasons used in the AssetProxy contracts.
+/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.
+contract LibAssetProxyErrors {
+
+ /// Authorizable errors ///
+ string constant SENDER_NOT_AUTHORIZED = "SENDER_NOT_AUTHORIZED"; // Sender not authorized to call this method.
+ string constant TARGET_NOT_AUTHORIZED = "TARGET_NOT_AUTHORIZED"; // Target address not authorized to call this method.
+ string constant TARGET_ALREADY_AUTHORIZED = "TARGET_ALREADY_AUTHORIZED"; // Target address must not already be authorized.
+ string constant INDEX_OUT_OF_BOUNDS = "INDEX_OUT_OF_BOUNDS"; // Specified array index is out of bounds.
+ string constant AUTHORIZED_ADDRESS_MISMATCH = "AUTHORIZED_ADDRESS_MISMATCH"; // Address at index does not match given target address.
+
+ /// Transfer errors ///
+ string constant INVALID_AMOUNT = "INVALID_AMOUNT"; // Transfer amount must equal 1.
+ string constant TRANSFER_FAILED = "TRANSFER_FAILED"; // Transfer failed.
+ string constant LENGTH_GREATER_THAN_131_REQUIRED = "LENGTH_GREATER_THAN_131_REQUIRED"; // Byte array must have a length greater than 0.
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol b/packages/contracts/src/2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol
new file mode 100644
index 000000000..8afc8c8d8
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol
@@ -0,0 +1,42 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../interfaces/IAuthorizable.sol";
+
+
+contract MAuthorizable is
+ IAuthorizable
+{
+
+ // Event logged when a new address is authorized.
+ event AuthorizedAddressAdded(
+ address indexed target,
+ address indexed caller
+ );
+
+ // Event logged when a currently authorized address is unauthorized.
+ event AuthorizedAddressRemoved(
+ address indexed target,
+ address indexed caller
+ );
+
+ /// @dev Only authorized addresses can invoke functions with this modifier.
+ modifier onlyAuthorized { revert(); _; }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol b/packages/contracts/src/2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol
new file mode 100644
index 000000000..8b7333646
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol
@@ -0,0 +1,119 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.10;
+
+import "../../multisig/MultiSigWalletWithTimeLock.sol";
+
+
+contract AssetProxyOwner is
+ MultiSigWalletWithTimeLock
+{
+
+ event AssetProxyRegistration(address assetProxyContract, bool isRegistered);
+
+ // Mapping of AssetProxy contract address =>
+ // if this contract is allowed to call the AssetProxy's `removeAuthorizedAddressAtIndex` method without a time lock.
+ mapping (address => bool) public isAssetProxyRegistered;
+
+ bytes4 constant internal REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR = bytes4(keccak256("removeAuthorizedAddressAtIndex(address,uint256)"));
+
+ /// @dev Function will revert if the transaction does not call `removeAuthorizedAddressAtIndex`
+ /// on an approved AssetProxy contract.
+ modifier validRemoveAuthorizedAddressAtIndexTx(uint256 transactionId) {
+ Transaction storage tx = transactions[transactionId];
+ require(isAssetProxyRegistered[tx.destination]);
+ require(readBytes4(tx.data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR);
+ _;
+ }
+
+ /// @dev Contract constructor sets initial owners, required number of confirmations,
+ /// time lock, and list of AssetProxy addresses.
+ /// @param _owners List of initial owners.
+ /// @param _assetProxyContracts Array of AssetProxy contract addresses.
+ /// @param _required Number of required confirmations.
+ /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
+ function AssetProxyOwner(
+ address[] memory _owners,
+ address[] memory _assetProxyContracts,
+ uint256 _required,
+ uint256 _secondsTimeLocked
+ )
+ public
+ MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)
+ {
+ for (uint256 i = 0; i < _assetProxyContracts.length; i++) {
+ address assetProxy = _assetProxyContracts[i];
+ require(assetProxy != address(0));
+ isAssetProxyRegistered[assetProxy] = true;
+ }
+ }
+
+ /// @dev Registers or deregisters an AssetProxy to be able to execute
+ /// `removeAuthorizedAddressAtIndex` without a timelock.
+ /// @param assetProxyContract Address of AssetProxy contract.
+ /// @param isRegistered Status of approval for AssetProxy contract.
+ function registerAssetProxy(address assetProxyContract, bool isRegistered)
+ public
+ onlyWallet
+ notNull(assetProxyContract)
+ {
+ isAssetProxyRegistered[assetProxyContract] = isRegistered;
+ AssetProxyRegistration(assetProxyContract, isRegistered);
+ }
+
+ /// @dev Allows execution of `removeAuthorizedAddressAtIndex` without time lock.
+ /// @param transactionId Transaction ID.
+ function executeRemoveAuthorizedAddressAtIndex(uint256 transactionId)
+ public
+ notExecuted(transactionId)
+ fullyConfirmed(transactionId)
+ validRemoveAuthorizedAddressAtIndexTx(transactionId)
+ {
+ Transaction storage tx = transactions[transactionId];
+ tx.executed = true;
+ // solhint-disable-next-line avoid-call-value
+ if (tx.destination.call.value(tx.value)(tx.data))
+ Execution(transactionId);
+ else {
+ ExecutionFailure(transactionId);
+ tx.executed = false;
+ }
+ }
+
+ /// @dev Reads an unpadded bytes4 value from a position in a byte array.
+ /// @param b Byte array containing a bytes4 value.
+ /// @param index Index in byte array of bytes4 value.
+ /// @return bytes4 value from byte array.
+ function readBytes4(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ returns (bytes4 result)
+ {
+ require(b.length >= index + 4);
+ assembly {
+ result := mload(add(b, 32))
+ // Solidity does not require us to clean the trailing bytes.
+ // We do it anyway
+ result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
+ }
+ return result;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/Exchange.sol b/packages/contracts/src/2.0.0/protocol/Exchange/Exchange.sol
new file mode 100644
index 000000000..7507d3da1
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/Exchange.sol
@@ -0,0 +1,54 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibConstants.sol";
+import "./MixinExchangeCore.sol";
+import "./MixinSignatureValidator.sol";
+import "./MixinWrapperFunctions.sol";
+import "./MixinAssetProxyDispatcher.sol";
+import "./MixinTransactions.sol";
+import "./MixinMatchOrders.sol";
+
+
+// solhint-disable no-empty-blocks
+contract Exchange is
+ MixinExchangeCore,
+ MixinMatchOrders,
+ MixinSignatureValidator,
+ MixinTransactions,
+ MixinAssetProxyDispatcher,
+ MixinWrapperFunctions
+{
+
+ string constant public VERSION = "2.0.1-alpha";
+
+ // Mixins are instantiated in the order they are inherited
+ constructor (bytes memory _zrxAssetData)
+ public
+ LibConstants(_zrxAssetData) // @TODO: Remove when we deploy.
+ MixinExchangeCore()
+ MixinMatchOrders()
+ MixinSignatureValidator()
+ MixinTransactions()
+ MixinAssetProxyDispatcher()
+ MixinWrapperFunctions()
+ {}
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol
new file mode 100644
index 000000000..e9f882194
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol
@@ -0,0 +1,177 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/Ownable/Ownable.sol";
+import "../../utils/LibBytes/LibBytes.sol";
+import "./mixins/MAssetProxyDispatcher.sol";
+import "../AssetProxy/interfaces/IAssetProxy.sol";
+
+
+contract MixinAssetProxyDispatcher is
+ Ownable,
+ MAssetProxyDispatcher
+{
+ using LibBytes for bytes;
+
+ // Mapping from Asset Proxy Id's to their respective Asset Proxy
+ mapping (bytes4 => IAssetProxy) public assetProxies;
+
+ /// @dev Registers an asset proxy to its asset proxy id.
+ /// Once an asset proxy is registered, it cannot be unregistered.
+ /// @param assetProxy Address of new asset proxy to register.
+ function registerAssetProxy(address assetProxy)
+ external
+ onlyOwner
+ {
+ IAssetProxy assetProxyContract = IAssetProxy(assetProxy);
+
+ // Ensure that no asset proxy exists with current id.
+ bytes4 assetProxyId = assetProxyContract.getProxyId();
+ address currentAssetProxy = assetProxies[assetProxyId];
+ require(
+ currentAssetProxy == address(0),
+ "ASSET_PROXY_ALREADY_EXISTS"
+ );
+
+ // Add asset proxy and log registration.
+ assetProxies[assetProxyId] = assetProxyContract;
+ emit AssetProxyRegistered(
+ assetProxyId,
+ assetProxy
+ );
+ }
+
+ /// @dev Gets an asset proxy.
+ /// @param assetProxyId Id of the asset proxy.
+ /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.
+ function getAssetProxy(bytes4 assetProxyId)
+ external
+ view
+ returns (address)
+ {
+ return assetProxies[assetProxyId];
+ }
+
+ /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
+ /// @param assetData Byte array encoded for the asset.
+ /// @param from Address to transfer token from.
+ /// @param to Address to transfer token to.
+ /// @param amount Amount of token to transfer.
+ function dispatchTransferFrom(
+ bytes memory assetData,
+ address from,
+ address to,
+ uint256 amount
+ )
+ internal
+ {
+ // Do nothing if no amount should be transferred.
+ if (amount > 0) {
+ // Ensure assetData length is valid
+ require(
+ assetData.length > 3,
+ "LENGTH_GREATER_THAN_3_REQUIRED"
+ );
+
+ // Lookup assetProxy
+ bytes4 assetProxyId;
+ assembly {
+ assetProxyId := and(mload(
+ add(assetData, 32)),
+ 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000
+ )
+ }
+ address assetProxy = assetProxies[assetProxyId];
+
+ // Ensure that assetProxy exists
+ require(
+ assetProxy != address(0),
+ "ASSET_PROXY_DOES_NOT_EXIST"
+ );
+
+ // We construct calldata for the `assetProxy.transferFrom` ABI.
+ // The layout of this calldata is in the table below.
+ //
+ // | Area | Offset | Length | Contents |
+ // | -------- |--------|---------|-------------------------------------------- |
+ // | Header | 0 | 4 | function selector |
+ // | Params | | 4 * 32 | function parameters: |
+ // | | 4 | | 1. offset to assetData (*) |
+ // | | 36 | | 2. from |
+ // | | 68 | | 3. to |
+ // | | 100 | | 4. amount |
+ // | Data | | | assetData: |
+ // | | 132 | 32 | assetData Length |
+ // | | 164 | ** | assetData Contents |
+
+ assembly {
+ /////// Setup State ///////
+ // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).
+ let cdStart := mload(64)
+ // `dataAreaLength` is the total number of words needed to store `assetData`
+ // As-per the ABI spec, this value is padded up to the nearest multiple of 32,
+ // and includes 32-bytes for length.
+ let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)
+ // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.
+ let cdEnd := add(cdStart, add(132, dataAreaLength))
+
+
+ /////// Setup Header Area ///////
+ // This area holds the 4-byte `transferFromSelector`.
+ // bytes4(keccak256("transferFrom(bytes,address,address,uint256)")) = 0xa85e59e4
+ mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)
+
+ /////// Setup Params Area ///////
+ // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.
+ // Notes:
+ // 1. The offset to `assetData` is the length of the Params Area (128 bytes).
+ // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.
+ mstore(add(cdStart, 4), 128)
+ mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))
+ mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))
+ mstore(add(cdStart, 100), amount)
+
+ /////// Setup Data Area ///////
+ // This area holds `assetData`.
+ let dataArea := add(cdStart, 132)
+ // solhint-disable-next-line no-empty-blocks
+ for {} lt(dataArea, cdEnd) {} {
+ mstore(dataArea, mload(assetData))
+ dataArea := add(dataArea, 32)
+ assetData := add(assetData, 32)
+ }
+
+ /////// Call `assetProxy.transferFrom` using the constructed calldata ///////
+ let success := call(
+ gas, // forward all gas
+ assetProxy, // call address of asset proxy
+ 0, // don't send any ETH
+ cdStart, // pointer to start of input
+ sub(cdEnd, cdStart), // length of input
+ cdStart, // write output over input
+ 512 // reserve 512 bytes for output
+ )
+ if iszero(success) {
+ revert(cdStart, returndatasize())
+ }
+ }
+ }
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol
new file mode 100644
index 000000000..ab5c6e507
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinExchangeCore.sol
@@ -0,0 +1,435 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibConstants.sol";
+import "./libs/LibFillResults.sol";
+import "./libs/LibOrder.sol";
+import "./libs/LibMath.sol";
+import "./mixins/MExchangeCore.sol";
+import "./mixins/MSignatureValidator.sol";
+import "./mixins/MTransactions.sol";
+import "./mixins/MAssetProxyDispatcher.sol";
+
+
+contract MixinExchangeCore is
+ LibConstants,
+ LibMath,
+ LibOrder,
+ LibFillResults,
+ MAssetProxyDispatcher,
+ MExchangeCore,
+ MSignatureValidator,
+ MTransactions
+{
+ // Mapping of orderHash => amount of takerAsset already bought by maker
+ mapping (bytes32 => uint256) public filled;
+
+ // Mapping of orderHash => cancelled
+ mapping (bytes32 => bool) public cancelled;
+
+ // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable
+ // Orders with specified senderAddress and with a salt less than their epoch are considered cancelled
+ mapping (address => mapping (address => uint256)) public orderEpoch;
+
+ /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch
+ /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).
+ /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.
+ function cancelOrdersUpTo(uint256 targetOrderEpoch)
+ external
+ {
+ address makerAddress = getCurrentContextAddress();
+ // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.
+ // This allows external filter contracts to add rules to how orders are cancelled via this function.
+ address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;
+
+ // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1
+ uint256 newOrderEpoch = targetOrderEpoch + 1;
+ uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];
+
+ // Ensure orderEpoch is monotonically increasing
+ require(
+ newOrderEpoch > oldOrderEpoch,
+ "INVALID_NEW_ORDER_EPOCH"
+ );
+
+ // Update orderEpoch
+ orderEpoch[makerAddress][senderAddress] = newOrderEpoch;
+ emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);
+ }
+
+ /// @dev Fills the input order.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrder(
+ Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (FillResults memory fillResults)
+ {
+ // Fetch order info
+ OrderInfo memory orderInfo = getOrderInfo(order);
+
+ // Fetch taker address
+ address takerAddress = getCurrentContextAddress();
+
+ // Get amount of takerAsset to fill
+ uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);
+ uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);
+
+ // Validate context
+ assertValidFill(
+ order,
+ orderInfo,
+ takerAddress,
+ takerAssetFillAmount,
+ takerAssetFilledAmount,
+ signature
+ );
+
+ // Compute proportional fill amounts
+ fillResults = calculateFillResults(order, takerAssetFilledAmount);
+
+ // Update exchange internal state
+ updateFilledState(
+ order,
+ takerAddress,
+ orderInfo.orderHash,
+ orderInfo.orderTakerAssetFilledAmount,
+ fillResults
+ );
+
+ // Settle order
+ settleOrder(order, takerAddress, fillResults);
+
+ return fillResults;
+ }
+
+ /// @dev After calling, the order can not be filled anymore.
+ /// Throws if order is invalid or sender does not have permission to cancel.
+ /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.
+ function cancelOrder(Order memory order)
+ public
+ {
+ // Fetch current order status
+ OrderInfo memory orderInfo = getOrderInfo(order);
+
+ // Validate context
+ assertValidCancel(order, orderInfo);
+
+ // Perform cancel
+ updateCancelledState(order, orderInfo.orderHash);
+ }
+
+ /// @dev Gets information about an order: status, hash, and amount filled.
+ /// @param order Order to gather information on.
+ /// @return OrderInfo Information about the order and its state.
+ /// See LibOrder.OrderInfo for a complete description.
+ function getOrderInfo(Order memory order)
+ public
+ view
+ returns (OrderInfo memory orderInfo)
+ {
+ // Compute the order hash
+ orderInfo.orderHash = getOrderHash(order);
+
+ // Fetch filled amount
+ orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];
+
+ // If order.makerAssetAmount is zero, we also reject the order.
+ // While the Exchange contract handles them correctly, they create
+ // edge cases in the supporting infrastructure because they have
+ // an 'infinite' price when computed by a simple division.
+ if (order.makerAssetAmount == 0) {
+ orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);
+ return orderInfo;
+ }
+
+ // If order.takerAssetAmount is zero, then the order will always
+ // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount
+ // Instead of distinguishing between unfilled and filled zero taker
+ // amount orders, we choose not to support them.
+ if (order.takerAssetAmount == 0) {
+ orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);
+ return orderInfo;
+ }
+
+ // Validate order availability
+ if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {
+ orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);
+ return orderInfo;
+ }
+
+ // Validate order expiration
+ // solhint-disable-next-line not-rely-on-time
+ if (block.timestamp >= order.expirationTimeSeconds) {
+ orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);
+ return orderInfo;
+ }
+
+ // Check if order has been cancelled
+ if (cancelled[orderInfo.orderHash]) {
+ orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);
+ return orderInfo;
+ }
+ if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {
+ orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);
+ return orderInfo;
+ }
+
+ // All other statuses are ruled out: order is Fillable
+ orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);
+ return orderInfo;
+ }
+
+ /// @dev Updates state with results of a fill order.
+ /// @param order that was filled.
+ /// @param takerAddress Address of taker who filled the order.
+ /// @param orderTakerAssetFilledAmount Amount of order already filled.
+ function updateFilledState(
+ Order memory order,
+ address takerAddress,
+ bytes32 orderHash,
+ uint256 orderTakerAssetFilledAmount,
+ FillResults memory fillResults
+ )
+ internal
+ {
+ // Update state
+ filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);
+
+ // Log order
+ emit Fill(
+ order.makerAddress,
+ order.feeRecipientAddress,
+ takerAddress,
+ msg.sender,
+ fillResults.makerAssetFilledAmount,
+ fillResults.takerAssetFilledAmount,
+ fillResults.makerFeePaid,
+ fillResults.takerFeePaid,
+ orderHash,
+ order.makerAssetData,
+ order.takerAssetData
+ );
+ }
+
+ /// @dev Updates state with results of cancelling an order.
+ /// State is only updated if the order is currently fillable.
+ /// Otherwise, updating state would have no effect.
+ /// @param order that was cancelled.
+ /// @param orderHash Hash of order that was cancelled.
+ function updateCancelledState(
+ Order memory order,
+ bytes32 orderHash
+ )
+ internal
+ {
+ // Perform cancel
+ cancelled[orderHash] = true;
+
+ // Log cancel
+ emit Cancel(
+ order.makerAddress,
+ order.feeRecipientAddress,
+ msg.sender,
+ orderHash,
+ order.makerAssetData,
+ order.takerAssetData
+ );
+ }
+
+ /// @dev Validates context for fillOrder. Succeeds or throws.
+ /// @param order to be filled.
+ /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.
+ /// @param takerAddress Address of order taker.
+ /// @param takerAssetFillAmount Desired amount of order to fill by taker.
+ /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.
+ /// @param signature Proof that the orders was created by its maker.
+ function assertValidFill(
+ Order memory order,
+ OrderInfo memory orderInfo,
+ address takerAddress,
+ uint256 takerAssetFillAmount,
+ uint256 takerAssetFilledAmount,
+ bytes memory signature
+ )
+ internal
+ view
+ {
+ // An order can only be filled if its status is FILLABLE.
+ require(
+ orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),
+ "ORDER_UNFILLABLE"
+ );
+
+ // Revert if fill amount is invalid
+ require(
+ takerAssetFillAmount != 0,
+ "INVALID_TAKER_AMOUNT"
+ );
+
+ // Validate sender is allowed to fill this order
+ if (order.senderAddress != address(0)) {
+ require(
+ order.senderAddress == msg.sender,
+ "INVALID_SENDER"
+ );
+ }
+
+ // Validate taker is allowed to fill this order
+ if (order.takerAddress != address(0)) {
+ require(
+ order.takerAddress == takerAddress,
+ "INVALID_TAKER"
+ );
+ }
+
+ // Validate Maker signature (check only if first time seen)
+ if (orderInfo.orderTakerAssetFilledAmount == 0) {
+ require(
+ isValidSignature(
+ orderInfo.orderHash,
+ order.makerAddress,
+ signature
+ ),
+ "INVALID_ORDER_SIGNATURE"
+ );
+ }
+
+ // Validate fill order rounding
+ require(
+ !isRoundingError(
+ takerAssetFilledAmount,
+ order.takerAssetAmount,
+ order.makerAssetAmount
+ ),
+ "ROUNDING_ERROR"
+ );
+ }
+
+ /// @dev Validates context for cancelOrder. Succeeds or throws.
+ /// @param order to be cancelled.
+ /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.
+ function assertValidCancel(
+ Order memory order,
+ OrderInfo memory orderInfo
+ )
+ internal
+ view
+ {
+ // Ensure order is valid
+ // An order can only be cancelled if its status is FILLABLE.
+ require(
+ orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),
+ "ORDER_UNFILLABLE"
+ );
+
+ // Validate sender is allowed to cancel this order
+ if (order.senderAddress != address(0)) {
+ require(
+ order.senderAddress == msg.sender,
+ "INVALID_SENDER"
+ );
+ }
+
+ // Validate transaction signed by maker
+ address makerAddress = getCurrentContextAddress();
+ require(
+ order.makerAddress == makerAddress,
+ "INVALID_MAKER"
+ );
+ }
+
+ /// @dev Calculates amounts filled and fees paid by maker and taker.
+ /// @param order to be filled.
+ /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function calculateFillResults(
+ Order memory order,
+ uint256 takerAssetFilledAmount
+ )
+ internal
+ pure
+ returns (FillResults memory fillResults)
+ {
+ // Compute proportional transfer amounts
+ fillResults.takerAssetFilledAmount = takerAssetFilledAmount;
+ fillResults.makerAssetFilledAmount = getPartialAmount(
+ takerAssetFilledAmount,
+ order.takerAssetAmount,
+ order.makerAssetAmount
+ );
+ fillResults.makerFeePaid = getPartialAmount(
+ takerAssetFilledAmount,
+ order.takerAssetAmount,
+ order.makerFee
+ );
+ fillResults.takerFeePaid = getPartialAmount(
+ takerAssetFilledAmount,
+ order.takerAssetAmount,
+ order.takerFee
+ );
+
+ return fillResults;
+ }
+
+ /// @dev Settles an order by transferring assets between counterparties.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAddress Address selling takerAsset and buying makerAsset.
+ /// @param fillResults Amounts to be filled and fees paid by maker and taker.
+ function settleOrder(
+ LibOrder.Order memory order,
+ address takerAddress,
+ LibFillResults.FillResults memory fillResults
+ )
+ private
+ {
+ bytes memory zrxAssetData = ZRX_ASSET_DATA;
+ dispatchTransferFrom(
+ order.makerAssetData,
+ order.makerAddress,
+ takerAddress,
+ fillResults.makerAssetFilledAmount
+ );
+ dispatchTransferFrom(
+ order.takerAssetData,
+ takerAddress,
+ order.makerAddress,
+ fillResults.takerAssetFilledAmount
+ );
+ dispatchTransferFrom(
+ zrxAssetData,
+ order.makerAddress,
+ order.feeRecipientAddress,
+ fillResults.makerFeePaid
+ );
+ dispatchTransferFrom(
+ zrxAssetData,
+ takerAddress,
+ order.feeRecipientAddress,
+ fillResults.takerFeePaid
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinMatchOrders.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinMatchOrders.sol
new file mode 100644
index 000000000..56b309a1b
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinMatchOrders.sol
@@ -0,0 +1,299 @@
+/*
+ Copyright 2018 ZeroEx Intl.
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibConstants.sol";
+import "./libs/LibMath.sol";
+import "./libs/LibOrder.sol";
+import "./libs/LibFillResults.sol";
+import "./mixins/MExchangeCore.sol";
+import "./mixins/MMatchOrders.sol";
+import "./mixins/MTransactions.sol";
+import "./mixins/MAssetProxyDispatcher.sol";
+
+
+contract MixinMatchOrders is
+ LibConstants,
+ LibMath,
+ MAssetProxyDispatcher,
+ MExchangeCore,
+ MMatchOrders,
+ MTransactions
+{
+ /// @dev Match two complementary orders that have a profitable spread.
+ /// Each order is filled at their respective price point. However, the calculations are
+ /// carried out as though the orders are both being filled at the right order's price point.
+ /// The profit made by the left order goes to the taker (who matched the two orders).
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ /// @param leftSignature Proof that order was created by the left maker.
+ /// @param rightSignature Proof that order was created by the right maker.
+ /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.
+ function matchOrders(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder,
+ bytes memory leftSignature,
+ bytes memory rightSignature
+ )
+ public
+ returns (LibFillResults.MatchedFillResults memory matchedFillResults)
+ {
+ // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.
+ // If this assumption isn't true, the match will fail at signature validation.
+ rightOrder.makerAssetData = leftOrder.takerAssetData;
+ rightOrder.takerAssetData = leftOrder.makerAssetData;
+
+ // Get left & right order info
+ LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);
+ LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);
+
+ // Fetch taker address
+ address takerAddress = getCurrentContextAddress();
+
+ // Either our context is valid or we revert
+ assertValidMatch(leftOrder, rightOrder);
+
+ // Compute proportional fill amounts
+ matchedFillResults = calculateMatchedFillResults(
+ leftOrder,
+ rightOrder,
+ leftOrderInfo.orderTakerAssetFilledAmount,
+ rightOrderInfo.orderTakerAssetFilledAmount
+ );
+
+ // Validate fill contexts
+ assertValidFill(
+ leftOrder,
+ leftOrderInfo,
+ takerAddress,
+ matchedFillResults.left.takerAssetFilledAmount,
+ matchedFillResults.left.takerAssetFilledAmount,
+ leftSignature
+ );
+ assertValidFill(
+ rightOrder,
+ rightOrderInfo,
+ takerAddress,
+ matchedFillResults.right.takerAssetFilledAmount,
+ matchedFillResults.right.takerAssetFilledAmount,
+ rightSignature
+ );
+
+ // Update exchange state
+ updateFilledState(
+ leftOrder,
+ takerAddress,
+ leftOrderInfo.orderHash,
+ leftOrderInfo.orderTakerAssetFilledAmount,
+ matchedFillResults.left
+ );
+ updateFilledState(
+ rightOrder,
+ takerAddress,
+ rightOrderInfo.orderHash,
+ rightOrderInfo.orderTakerAssetFilledAmount,
+ matchedFillResults.right
+ );
+
+ // Settle matched orders. Succeeds or throws.
+ settleMatchedOrders(
+ leftOrder,
+ rightOrder,
+ takerAddress,
+ matchedFillResults
+ );
+
+ return matchedFillResults;
+ }
+
+ /// @dev Validates context for matchOrders. Succeeds or throws.
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ function assertValidMatch(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder
+ )
+ internal
+ pure
+ {
+ // Make sure there is a profitable spread.
+ // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater
+ // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).
+ // This is satisfied by the equations below:
+ // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>
+ // AND
+ // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>
+ // These equations can be combined to get the following:
+ require(
+ safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=
+ safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),
+ "NEGATIVE_SPREAD_REQUIRED"
+ );
+ }
+
+ /// @dev Calculates fill amounts for the matched orders.
+ /// Each order is filled at their respective price point. However, the calculations are
+ /// carried out as though the orders are both being filled at the right order's price point.
+ /// The profit made by the leftOrder order goes to the taker (who matched the two orders).
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.
+ /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.
+ /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.
+ function calculateMatchedFillResults(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder,
+ uint256 leftOrderTakerAssetFilledAmount,
+ uint256 rightOrderTakerAssetFilledAmount
+ )
+ internal
+ pure
+ returns (LibFillResults.MatchedFillResults memory matchedFillResults)
+ {
+ // We settle orders at the exchange rate of the right order.
+ // The amount saved by the left maker goes to the taker.
+ // Either the left or right order will be fully filled; possibly both.
+ // The left order is fully filled iff the right order can sell more than left can buy.
+ // That is: the amount required to fill the left order is less than or equal to
+ // the amount we can spend from the right order:
+ // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>
+ // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>
+ // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>
+ uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);
+ uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);
+ uint256 leftTakerAssetFilledAmount;
+ uint256 rightTakerAssetFilledAmount;
+ if (
+ safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=
+ safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)
+ ) {
+ // Left order will be fully filled: maximally fill left
+ leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;
+
+ // The right order receives an amount proportional to how much was spent.
+ rightTakerAssetFilledAmount = getPartialAmount(
+ rightOrder.takerAssetAmount,
+ rightOrder.makerAssetAmount,
+ leftTakerAssetFilledAmount
+ );
+ } else {
+ // Right order will be fully filled: maximally fill right
+ rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;
+
+ // The left order receives an amount proportional to how much was spent.
+ leftTakerAssetFilledAmount = getPartialAmount(
+ rightOrder.makerAssetAmount,
+ rightOrder.takerAssetAmount,
+ rightTakerAssetFilledAmount
+ );
+ }
+
+ // Calculate fill results for left order
+ matchedFillResults.left = calculateFillResults(
+ leftOrder,
+ leftTakerAssetFilledAmount
+ );
+
+ // Calculate fill results for right order
+ matchedFillResults.right = calculateFillResults(
+ rightOrder,
+ rightTakerAssetFilledAmount
+ );
+
+ // Calculate amount given to taker
+ matchedFillResults.leftMakerAssetSpreadAmount = safeSub(
+ matchedFillResults.left.makerAssetFilledAmount,
+ matchedFillResults.right.takerAssetFilledAmount
+ );
+
+ // Return fill results
+ return matchedFillResults;
+ }
+
+ /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.
+ /// @param leftOrder First matched order.
+ /// @param rightOrder Second matched order.
+ /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.
+ /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.
+ function settleMatchedOrders(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder,
+ address takerAddress,
+ LibFillResults.MatchedFillResults memory matchedFillResults
+ )
+ private
+ {
+ bytes memory zrxAssetData = ZRX_ASSET_DATA;
+ // Order makers and taker
+ dispatchTransferFrom(
+ leftOrder.makerAssetData,
+ leftOrder.makerAddress,
+ rightOrder.makerAddress,
+ matchedFillResults.right.takerAssetFilledAmount
+ );
+ dispatchTransferFrom(
+ rightOrder.makerAssetData,
+ rightOrder.makerAddress,
+ leftOrder.makerAddress,
+ matchedFillResults.left.takerAssetFilledAmount
+ );
+ dispatchTransferFrom(
+ leftOrder.makerAssetData,
+ leftOrder.makerAddress,
+ takerAddress,
+ matchedFillResults.leftMakerAssetSpreadAmount
+ );
+
+ // Maker fees
+ dispatchTransferFrom(
+ zrxAssetData,
+ leftOrder.makerAddress,
+ leftOrder.feeRecipientAddress,
+ matchedFillResults.left.makerFeePaid
+ );
+ dispatchTransferFrom(
+ zrxAssetData,
+ rightOrder.makerAddress,
+ rightOrder.feeRecipientAddress,
+ matchedFillResults.right.makerFeePaid
+ );
+
+ // Taker fees
+ if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {
+ dispatchTransferFrom(
+ zrxAssetData,
+ takerAddress,
+ leftOrder.feeRecipientAddress,
+ safeAdd(
+ matchedFillResults.left.takerFeePaid,
+ matchedFillResults.right.takerFeePaid
+ )
+ );
+ } else {
+ dispatchTransferFrom(
+ zrxAssetData,
+ takerAddress,
+ leftOrder.feeRecipientAddress,
+ matchedFillResults.left.takerFeePaid
+ );
+ dispatchTransferFrom(
+ zrxAssetData,
+ takerAddress,
+ rightOrder.feeRecipientAddress,
+ matchedFillResults.right.takerFeePaid
+ );
+ }
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol
new file mode 100644
index 000000000..44de54817
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol
@@ -0,0 +1,260 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/LibBytes/LibBytes.sol";
+import "./mixins/MSignatureValidator.sol";
+import "./mixins/MTransactions.sol";
+import "./interfaces/IWallet.sol";
+import "./interfaces/IValidator.sol";
+
+
+contract MixinSignatureValidator is
+ MSignatureValidator,
+ MTransactions
+{
+ using LibBytes for bytes;
+
+ // Mapping of hash => signer => signed
+ mapping (bytes32 => mapping (address => bool)) public preSigned;
+
+ // Mapping of signer => validator => approved
+ mapping (address => mapping (address => bool)) public allowedValidators;
+
+ /// @dev Approves a hash on-chain using any valid signature type.
+ /// After presigning a hash, the preSign signature type will become valid for that hash and signer.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof that the hash has been signed by signer.
+ function preSign(
+ bytes32 hash,
+ address signerAddress,
+ bytes signature
+ )
+ external
+ {
+ require(
+ isValidSignature(
+ hash,
+ signerAddress,
+ signature
+ ),
+ "INVALID_SIGNATURE"
+ );
+ preSigned[hash][signerAddress] = true;
+ }
+
+ /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.
+ /// @param validatorAddress Address of Validator contract.
+ /// @param approval Approval or disapproval of Validator contract.
+ function setSignatureValidatorApproval(
+ address validatorAddress,
+ bool approval
+ )
+ external
+ {
+ address signerAddress = getCurrentContextAddress();
+ allowedValidators[signerAddress][validatorAddress] = approval;
+ emit SignatureValidatorApproval(
+ signerAddress,
+ validatorAddress,
+ approval
+ );
+ }
+
+ /// @dev Verifies that a hash has been signed by the given signer.
+ /// @param hash Any 32 byte hash.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof that the hash has been signed by signer.
+ /// @return True if the address recovered from the provided signature matches the input signer address.
+ function isValidSignature(
+ bytes32 hash,
+ address signerAddress,
+ bytes memory signature
+ )
+ public
+ view
+ returns (bool isValid)
+ {
+ require(
+ signature.length > 0,
+ "LENGTH_GREATER_THAN_0_REQUIRED"
+ );
+
+ // Pop last byte off of signature byte array.
+ uint8 signatureTypeRaw = uint8(signature.popLastByte());
+
+ // Ensure signature is supported
+ require(
+ signatureTypeRaw < uint8(SignatureType.NSignatureTypes),
+ "SIGNATURE_UNSUPPORTED"
+ );
+
+ SignatureType signatureType = SignatureType(signatureTypeRaw);
+
+ // Variables are not scoped in Solidity.
+ uint8 v;
+ bytes32 r;
+ bytes32 s;
+ address recovered;
+
+ // Always illegal signature.
+ // This is always an implicit option since a signer can create a
+ // signature array with invalid type or length. We may as well make
+ // it an explicit option. This aids testing and analysis. It is
+ // also the initialization value for the enum type.
+ if (signatureType == SignatureType.Illegal) {
+ revert("SIGNATURE_ILLEGAL");
+
+ // Always invalid signature.
+ // Like Illegal, this is always implicitly available and therefore
+ // offered explicitly. It can be implicitly created by providing
+ // a correctly formatted but incorrect signature.
+ } else if (signatureType == SignatureType.Invalid) {
+ require(
+ signature.length == 0,
+ "LENGTH_0_REQUIRED"
+ );
+ isValid = false;
+ return isValid;
+
+ // Signature using EIP712
+ } else if (signatureType == SignatureType.EIP712) {
+ require(
+ signature.length == 65,
+ "LENGTH_65_REQUIRED"
+ );
+ v = uint8(signature[0]);
+ r = signature.readBytes32(1);
+ s = signature.readBytes32(33);
+ recovered = ecrecover(
+ hash,
+ v,
+ r,
+ s
+ );
+ isValid = signerAddress == recovered;
+ return isValid;
+
+ // Signed using web3.eth_sign
+ } else if (signatureType == SignatureType.EthSign) {
+ require(
+ signature.length == 65,
+ "LENGTH_65_REQUIRED"
+ );
+ v = uint8(signature[0]);
+ r = signature.readBytes32(1);
+ s = signature.readBytes32(33);
+ recovered = ecrecover(
+ keccak256(abi.encodePacked(
+ "\x19Ethereum Signed Message:\n32",
+ hash
+ )),
+ v,
+ r,
+ s
+ );
+ isValid = signerAddress == recovered;
+ return isValid;
+
+ // Implicitly signed by caller.
+ // The signer has initiated the call. In the case of non-contract
+ // accounts it means the transaction itself was signed.
+ // Example: let's say for a particular operation three signatures
+ // A, B and C are required. To submit the transaction, A and B can
+ // give a signature to C, who can then submit the transaction using
+ // `Caller` for his own signature. Or A and C can sign and B can
+ // submit using `Caller`. Having `Caller` allows this flexibility.
+ } else if (signatureType == SignatureType.Caller) {
+ require(
+ signature.length == 0,
+ "LENGTH_0_REQUIRED"
+ );
+ isValid = signerAddress == msg.sender;
+ return isValid;
+
+ // Signature verified by wallet contract.
+ // If used with an order, the maker of the order is the wallet contract.
+ } else if (signatureType == SignatureType.Wallet) {
+ isValid = IWallet(signerAddress).isValidSignature(hash, signature);
+ return isValid;
+
+ // Signature verified by validator contract.
+ // If used with an order, the maker of the order can still be an EOA.
+ // A signature using this type should be encoded as:
+ // | Offset | Length | Contents |
+ // | 0x00 | x | Signature to validate |
+ // | 0x00 + x | 20 | Address of validator contract |
+ // | 0x14 + x | 1 | Signature type is always "\x06" |
+ } else if (signatureType == SignatureType.Validator) {
+ // Pop last 20 bytes off of signature byte array.
+ address validatorAddress = signature.popLast20Bytes();
+
+ // Ensure signer has approved validator.
+ if (!allowedValidators[signerAddress][validatorAddress]) {
+ return false;
+ }
+ isValid = IValidator(validatorAddress).isValidSignature(
+ hash,
+ signerAddress,
+ signature
+ );
+ return isValid;
+
+ // Signer signed hash previously using the preSign function.
+ } else if (signatureType == SignatureType.PreSigned) {
+ isValid = preSigned[hash][signerAddress];
+ return isValid;
+
+ // Signature from Trezor hardware wallet.
+ // It differs from web3.eth_sign in the encoding of message length
+ // (Bitcoin varint encoding vs ascii-decimal, the latter is not
+ // self-terminating which leads to ambiguities).
+ // See also:
+ // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
+ // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602
+ // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36
+ } else if (signatureType == SignatureType.Trezor) {
+ require(
+ signature.length == 65,
+ "LENGTH_65_REQUIRED"
+ );
+ v = uint8(signature[0]);
+ r = signature.readBytes32(1);
+ s = signature.readBytes32(33);
+ recovered = ecrecover(
+ keccak256(abi.encodePacked(
+ "\x19Ethereum Signed Message:\n\x20",
+ hash
+ )),
+ v,
+ r,
+ s
+ );
+ isValid = signerAddress == recovered;
+ return isValid;
+ }
+
+ // Anything else is illegal (We do not return false because
+ // the signature may actually be valid, just not in a format
+ // that we currently support. In this case returning false
+ // may lead the caller to incorrectly believe that the
+ // signature was invalid.)
+ revert("SIGNATURE_UNSUPPORTED");
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinTransactions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinTransactions.sol
new file mode 100644
index 000000000..821d30279
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinTransactions.sol
@@ -0,0 +1,161 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+pragma solidity 0.4.24;
+
+import "./libs/LibExchangeErrors.sol";
+import "./mixins/MSignatureValidator.sol";
+import "./mixins/MTransactions.sol";
+import "./libs/LibEIP712.sol";
+
+
+contract MixinTransactions is
+ LibEIP712,
+ MSignatureValidator,
+ MTransactions
+{
+
+ // Mapping of transaction hash => executed
+ // This prevents transactions from being executed more than once.
+ mapping (bytes32 => bool) public transactions;
+
+ // Address of current transaction signer
+ address public currentContextAddress;
+
+ // Hash for the EIP712 ZeroEx Transaction Schema
+ bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(
+ "ZeroExTransaction(",
+ "uint256 salt,",
+ "address signerAddress,",
+ "bytes data",
+ ")"
+ ));
+
+ /// @dev Executes an exchange method call in the context of signer.
+ /// @param salt Arbitrary number to ensure uniqueness of transaction hash.
+ /// @param signerAddress Address of transaction signer.
+ /// @param data AbiV2 encoded calldata.
+ /// @param signature Proof of signer transaction by signer.
+ function executeTransaction(
+ uint256 salt,
+ address signerAddress,
+ bytes data,
+ bytes signature
+ )
+ external
+ {
+ // Prevent reentrancy
+ require(
+ currentContextAddress == address(0),
+ "REENTRANCY_ILLEGAL"
+ );
+
+ bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(
+ salt,
+ signerAddress,
+ data
+ ));
+
+ // Validate transaction has not been executed
+ require(
+ !transactions[transactionHash],
+ "INVALID_TX_HASH"
+ );
+
+ // Transaction always valid if signer is sender of transaction
+ if (signerAddress != msg.sender) {
+ // Validate signature
+ require(
+ isValidSignature(
+ transactionHash,
+ signerAddress,
+ signature
+ ),
+ "INVALID_TX_SIGNATURE"
+ );
+
+ // Set the current transaction signer
+ currentContextAddress = signerAddress;
+ }
+
+ // Execute transaction
+ transactions[transactionHash] = true;
+ require(
+ address(this).delegatecall(data),
+ "FAILED_EXECUTION"
+ );
+
+ // Reset current transaction signer if it was previously updated
+ if (signerAddress != msg.sender) {
+ currentContextAddress = address(0);
+ }
+ }
+
+ /// @dev Calculates EIP712 hash of the Transaction.
+ /// @param salt Arbitrary number to ensure uniqueness of transaction hash.
+ /// @param signerAddress Address of transaction signer.
+ /// @param data AbiV2 encoded calldata.
+ /// @return EIP712 hash of the Transaction.
+ function hashZeroExTransaction(
+ uint256 salt,
+ address signerAddress,
+ bytes memory data
+ )
+ internal
+ pure
+ returns (bytes32 result)
+ {
+ bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;
+ bytes32 dataHash = keccak256(data);
+
+ // Assembly for more efficiently computing:
+ // keccak256(abi.encodePacked(
+ // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,
+ // salt,
+ // bytes32(signerAddress),
+ // keccak256(data)
+ // ));
+
+ assembly {
+ // Load free memory pointer
+ let memPtr := mload(64)
+
+ mstore(memPtr, schemaHash) // hash of schema
+ mstore(add(memPtr, 32), salt) // salt
+ mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress
+ mstore(add(memPtr, 96), dataHash) // hash of data
+
+ // Compute hash
+ result := keccak256(memPtr, 128)
+ }
+ return result;
+ }
+
+ /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).
+ /// If calling a fill function, this address will represent the taker.
+ /// If calling a cancel function, this address will represent the maker.
+ /// @return Signer of 0x transaction if entry point is `executeTransaction`.
+ /// `msg.sender` if entry point is any other function.
+ function getCurrentContextAddress()
+ internal
+ view
+ returns (address)
+ {
+ address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;
+ return contextAddress;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol
new file mode 100644
index 000000000..86194f461
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/MixinWrapperFunctions.sol
@@ -0,0 +1,403 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./libs/LibMath.sol";
+import "./libs/LibOrder.sol";
+import "./libs/LibFillResults.sol";
+import "./libs/LibAbiEncoder.sol";
+import "./mixins/MExchangeCore.sol";
+
+
+contract MixinWrapperFunctions is
+ LibMath,
+ LibFillResults,
+ LibAbiEncoder,
+ MExchangeCore
+{
+
+ /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ function fillOrKillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (FillResults memory fillResults)
+ {
+ fillResults = fillOrder(
+ order,
+ takerAssetFillAmount,
+ signature
+ );
+ require(
+ fillResults.takerAssetFilledAmount == takerAssetFillAmount,
+ "COMPLETE_FILL_FAILED"
+ );
+ return fillResults;
+ }
+
+ /// @dev Fills the input order.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrderNoThrow(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (FillResults memory fillResults)
+ {
+ // ABI encode calldata for `fillOrder`
+ bytes memory fillOrderCalldata = abiEncodeFillOrder(
+ order,
+ takerAssetFillAmount,
+ signature
+ );
+
+ // Delegate to `fillOrder` and handle any exceptions gracefully
+ assembly {
+ let success := delegatecall(
+ gas, // forward all gas, TODO: look into gas consumption of assert/throw
+ address, // call address of this contract
+ add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)
+ mload(fillOrderCalldata), // length of input
+ fillOrderCalldata, // write output over input
+ 128 // output size is 128 bytes
+ )
+ switch success
+ case 0 {
+ mstore(fillResults, 0)
+ mstore(add(fillResults, 32), 0)
+ mstore(add(fillResults, 64), 0)
+ mstore(add(fillResults, 96), 0)
+ }
+ case 1 {
+ mstore(fillResults, mload(fillOrderCalldata))
+ mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))
+ mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))
+ mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))
+ }
+ }
+ return fillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrder.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.
+ function batchFillOrders(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+ FillResults memory singleFillResults = fillOrder(
+ orders[i],
+ takerAssetFillAmounts[i],
+ signatures[i]
+ );
+ addFillResults(totalFillResults, singleFillResults);
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrKill.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.
+ function batchFillOrKillOrders(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+ FillResults memory singleFillResults = fillOrKillOrder(
+ orders[i],
+ takerAssetFillAmounts[i],
+ signatures[i]
+ );
+ addFillResults(totalFillResults, singleFillResults);
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Fills an order with specified parameters and ECDSA signature.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.
+ function batchFillOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+ FillResults memory singleFillResults = fillOrderNoThrow(
+ orders[i],
+ takerAssetFillAmounts[i],
+ signatures[i]
+ );
+ addFillResults(totalFillResults, singleFillResults);
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellOrders(
+ LibOrder.Order[] memory orders,
+ uint256 takerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory takerAssetData = orders[0].takerAssetData;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being sold by taker is the same for each order.
+ // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.
+ orders[i].takerAssetData = takerAssetData;
+
+ // Calculate the remaining amount of takerAsset to sell
+ uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);
+
+ // Attempt to sell the remaining amount of takerAsset
+ FillResults memory singleFillResults = fillOrder(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of takerAsset has been sold
+ if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {
+ break;
+ }
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256 takerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory takerAssetData = orders[0].takerAssetData;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being sold by taker is the same for each order.
+ // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.
+ orders[i].takerAssetData = takerAssetData;
+
+ // Calculate the remaining amount of takerAsset to sell
+ uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);
+
+ // Attempt to sell the remaining amount of takerAsset
+ FillResults memory singleFillResults = fillOrderNoThrow(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of takerAsset has been sold
+ if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {
+ break;
+ }
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyOrders(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory makerAssetData = orders[0].makerAssetData;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being bought by taker is the same for each order.
+ // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.
+ orders[i].makerAssetData = makerAssetData;
+
+ // Calculate the remaining amount of makerAsset to buy
+ uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);
+
+ // Convert the remaining amount of makerAsset to buy into remaining amount
+ // of takerAsset to sell, assuming entire amount can be sold in the current order
+ uint256 remainingTakerAssetFillAmount = getPartialAmount(
+ orders[i].takerAssetAmount,
+ orders[i].makerAssetAmount,
+ remainingMakerAssetFillAmount
+ );
+
+ // Attempt to sell the remaining amount of takerAsset
+ FillResults memory singleFillResults = fillOrder(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of makerAsset has been bought
+ if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {
+ break;
+ }
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (FillResults memory totalFillResults)
+ {
+ bytes memory makerAssetData = orders[0].makerAssetData;
+
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+
+ // We assume that asset being bought by taker is the same for each order.
+ // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.
+ orders[i].makerAssetData = makerAssetData;
+
+ // Calculate the remaining amount of makerAsset to buy
+ uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);
+
+ // Convert the remaining amount of makerAsset to buy into remaining amount
+ // of takerAsset to sell, assuming entire amount can be sold in the current order
+ uint256 remainingTakerAssetFillAmount = getPartialAmount(
+ orders[i].takerAssetAmount,
+ orders[i].makerAssetAmount,
+ remainingMakerAssetFillAmount
+ );
+
+ // Attempt to sell the remaining amount of takerAsset
+ FillResults memory singleFillResults = fillOrderNoThrow(
+ orders[i],
+ remainingTakerAssetFillAmount,
+ signatures[i]
+ );
+
+ // Update amounts filled and fees paid by maker and taker
+ addFillResults(totalFillResults, singleFillResults);
+
+ // Stop execution if the entire amount of makerAsset has been bought
+ if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {
+ break;
+ }
+ }
+ return totalFillResults;
+ }
+
+ /// @dev Synchronously cancels multiple orders in a single transaction.
+ /// @param orders Array of order specifications.
+ function batchCancelOrders(LibOrder.Order[] memory orders)
+ public
+ {
+ uint256 ordersLength = orders.length;
+ for (uint256 i = 0; i != ordersLength; i++) {
+ cancelOrder(orders[i]);
+ }
+ }
+
+ /// @dev Fetches information for all passed in orders.
+ /// @param orders Array of order specifications.
+ /// @return Array of OrderInfo instances that correspond to each order.
+ function getOrdersInfo(LibOrder.Order[] memory orders)
+ public
+ view
+ returns (LibOrder.OrderInfo[] memory)
+ {
+ uint256 ordersLength = orders.length;
+ LibOrder.OrderInfo[] memory ordersInfo = new LibOrder.OrderInfo[](ordersLength);
+ for (uint256 i = 0; i != ordersLength; i++) {
+ ordersInfo[i] = getOrderInfo(orders[i]);
+ }
+ return ordersInfo;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol
new file mode 100644
index 000000000..8db8d6f6c
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol
@@ -0,0 +1,37 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract IAssetProxyDispatcher {
+
+ /// @dev Registers an asset proxy to its asset proxy id.
+ /// Once an asset proxy is registered, it cannot be unregistered.
+ /// @param assetProxy Address of new asset proxy to register.
+ function registerAssetProxy(address assetProxy)
+ external;
+
+ /// @dev Gets an asset proxy.
+ /// @param assetProxyId Id of the asset proxy.
+ /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.
+ function getAssetProxy(bytes4 assetProxyId)
+ external
+ view
+ returns (address);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchange.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchange.sol
new file mode 100644
index 000000000..b92abba04
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchange.sol
@@ -0,0 +1,38 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./IExchangeCore.sol";
+import "./IMatchOrders.sol";
+import "./ISignatureValidator.sol";
+import "./ITransactions.sol";
+import "./IAssetProxyDispatcher.sol";
+import "./IWrapperFunctions.sol";
+
+
+// solhint-disable no-empty-blocks
+contract IExchange is
+ IExchangeCore,
+ IMatchOrders,
+ ISignatureValidator,
+ ITransactions,
+ IAssetProxyDispatcher,
+ IWrapperFunctions
+{}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol
new file mode 100644
index 000000000..9995e0385
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol
@@ -0,0 +1,60 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../libs/LibOrder.sol";
+import "../libs/LibFillResults.sol";
+
+
+contract IExchangeCore {
+
+ /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch
+ /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).
+ /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.
+ function cancelOrdersUpTo(uint256 targetOrderEpoch)
+ external;
+
+ /// @dev Fills the input order.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (LibFillResults.FillResults memory fillResults);
+
+ /// @dev After calling, the order can not be filled anymore.
+ /// @param order Order struct containing order specifications.
+ function cancelOrder(LibOrder.Order memory order)
+ public;
+
+ /// @dev Gets information about an order: status, hash, and amount filled.
+ /// @param order Order to gather information on.
+ /// @return OrderInfo Information about the order and its state.
+ /// See LibOrder.OrderInfo for a complete description.
+ function getOrderInfo(LibOrder.Order memory order)
+ public
+ view
+ returns (LibOrder.OrderInfo memory orderInfo);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol
new file mode 100644
index 000000000..73447f3ae
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol
@@ -0,0 +1,44 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../libs/LibOrder.sol";
+import "../libs/LibFillResults.sol";
+
+
+contract IMatchOrders {
+
+ /// @dev Match two complementary orders that have a profitable spread.
+ /// Each order is filled at their respective price point. However, the calculations are
+ /// carried out as though the orders are both being filled at the right order's price point.
+ /// The profit made by the left order goes to the taker (who matched the two orders).
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ /// @param leftSignature Proof that order was created by the left maker.
+ /// @param rightSignature Proof that order was created by the right maker.
+ /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.
+ function matchOrders(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder,
+ bytes memory leftSignature,
+ bytes memory rightSignature
+ )
+ public
+ returns (LibFillResults.MatchedFillResults memory matchedFillResults);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol
new file mode 100644
index 000000000..1fd0eccf0
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol
@@ -0,0 +1,57 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract ISignatureValidator {
+
+ /// @dev Approves a hash on-chain using any valid signature type.
+ /// After presigning a hash, the preSign signature type will become valid for that hash and signer.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof that the hash has been signed by signer.
+ function preSign(
+ bytes32 hash,
+ address signerAddress,
+ bytes signature
+ )
+ external;
+
+ /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.
+ /// @param validatorAddress Address of Validator contract.
+ /// @param approval Approval or disapproval of Validator contract.
+ function setSignatureValidatorApproval(
+ address validatorAddress,
+ bool approval
+ )
+ external;
+
+ /// @dev Verifies that a signature is valid.
+ /// @param hash Message hash that is signed.
+ /// @param signerAddress Address of signer.
+ /// @param signature Proof of signing.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ bytes32 hash,
+ address signerAddress,
+ bytes memory signature
+ )
+ public
+ view
+ returns (bool isValid);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ITransactions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ITransactions.sol
new file mode 100644
index 000000000..4446c55ce
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/ITransactions.sol
@@ -0,0 +1,35 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+pragma solidity 0.4.24;
+
+
+contract ITransactions {
+
+ /// @dev Executes an exchange method call in the context of signer.
+ /// @param salt Arbitrary number to ensure uniqueness of transaction hash.
+ /// @param signerAddress Address of transaction signer.
+ /// @param data AbiV2 encoded calldata.
+ /// @param signature Proof of signer transaction by signer.
+ function executeTransaction(
+ uint256 salt,
+ address signerAddress,
+ bytes data,
+ bytes signature
+ )
+ external;
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IValidator.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IValidator.sol
new file mode 100644
index 000000000..2dd69100c
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IValidator.sol
@@ -0,0 +1,37 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract IValidator {
+
+ /// @dev Verifies that a signature is valid.
+ /// @param hash Message hash that is signed.
+ /// @param signerAddress Address that should have signed the given hash.
+ /// @param signature Proof of signing.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ bytes32 hash,
+ address signerAddress,
+ bytes signature
+ )
+ external
+ view
+ returns (bool isValid);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWallet.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWallet.sol
new file mode 100644
index 000000000..c97161ca6
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWallet.sol
@@ -0,0 +1,35 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract IWallet {
+
+ /// @dev Verifies that a signature is valid.
+ /// @param hash Message hash that is signed.
+ /// @param signature Proof of signing.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ bytes32 hash,
+ bytes signature
+ )
+ external
+ view
+ returns (bool isValid);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol
new file mode 100644
index 000000000..56a533646
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol
@@ -0,0 +1,160 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../libs/LibOrder.sol";
+import "../libs/LibFillResults.sol";
+
+
+contract IWrapperFunctions {
+
+ /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.
+ /// @param order LibOrder.Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ function fillOrKillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (LibFillResults.FillResults memory fillResults);
+
+ /// @dev Fills an order with specified parameters and ECDSA signature.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param order LibOrder.Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return Amounts filled and fees paid by maker and taker.
+ function fillOrderNoThrow(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ returns (LibFillResults.FillResults memory fillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrder.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function batchFillOrders(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrKill.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function batchFillOrKillOrders(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Fills an order with specified parameters and ECDSA signature.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function batchFillOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256[] memory takerAssetFillAmounts,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signatures Proofs that orders have been created by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellOrders(
+ LibOrder.Order[] memory orders,
+ uint256 takerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketSellOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256 takerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyOrders(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.
+ /// Returns false if the transaction would otherwise revert.
+ /// @param orders Array of order specifications.
+ /// @param makerAssetFillAmount Desired amount of makerAsset to buy.
+ /// @param signatures Proofs that orders have been signed by makers.
+ /// @return Amounts filled and fees paid by makers and taker.
+ function marketBuyOrdersNoThrow(
+ LibOrder.Order[] memory orders,
+ uint256 makerAssetFillAmount,
+ bytes[] memory signatures
+ )
+ public
+ returns (LibFillResults.FillResults memory totalFillResults);
+
+ /// @dev Synchronously cancels multiple orders in a single transaction.
+ /// @param orders Array of order specifications.
+ function batchCancelOrders(LibOrder.Order[] memory orders)
+ public;
+
+ /// @dev Fetches information for all passed in orders
+ /// @param orders Array of order specifications.
+ /// @return Array of OrderInfo instances that correspond to each order.
+ function getOrdersInfo(LibOrder.Order[] memory orders)
+ public
+ view
+ returns (LibOrder.OrderInfo[] memory);
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol
new file mode 100644
index 000000000..4aad37709
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol
@@ -0,0 +1,215 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "./LibOrder.sol";
+
+
+contract LibAbiEncoder {
+
+ /// @dev ABI encodes calldata for `fillOrder`.
+ /// @param order Order struct containing order specifications.
+ /// @param takerAssetFillAmount Desired amount of takerAsset to sell.
+ /// @param signature Proof that order has been created by maker.
+ /// @return ABI encoded calldata for `fillOrder`.
+ function abiEncodeFillOrder(
+ LibOrder.Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ internal
+ pure
+ returns (bytes memory fillOrderCalldata)
+ {
+ // We need to call MExchangeCore.fillOrder using a delegatecall in
+ // assembly so that we can intercept a call that throws. For this, we
+ // need the input encoded in memory in the Ethereum ABIv2 format [1].
+
+ // | Area | Offset | Length | Contents |
+ // | -------- |--------|---------|-------------------------------------------- |
+ // | Header | 0x00 | 4 | function selector |
+ // | Params | | 3 * 32 | function parameters: |
+ // | | 0x00 | | 1. offset to order (*) |
+ // | | 0x20 | | 2. takerAssetFillAmount |
+ // | | 0x40 | | 3. offset to signature (*) |
+ // | Data | | 12 * 32 | order: |
+ // | | 0x000 | | 1. senderAddress |
+ // | | 0x020 | | 2. makerAddress |
+ // | | 0x040 | | 3. takerAddress |
+ // | | 0x060 | | 4. feeRecipientAddress |
+ // | | 0x080 | | 5. makerAssetAmount |
+ // | | 0x0A0 | | 6. takerAssetAmount |
+ // | | 0x0C0 | | 7. makerFeeAmount |
+ // | | 0x0E0 | | 8. takerFeeAmount |
+ // | | 0x100 | | 9. expirationTimeSeconds |
+ // | | 0x120 | | 10. salt |
+ // | | 0x140 | | 11. Offset to makerAssetData (*) |
+ // | | 0x160 | | 12. Offset to takerAssetData (*) |
+ // | | 0x180 | 32 | makerAssetData Length |
+ // | | 0x1A0 | ** | makerAssetData Contents |
+ // | | 0x1C0 | 32 | takerAssetData Length |
+ // | | 0x1E0 | ** | takerAssetData Contents |
+ // | | 0x200 | 32 | signature Length |
+ // | | 0x220 | ** | signature Contents |
+
+ // * Offsets are calculated from the beginning of the current area: Header, Params, Data:
+ // An offset stored in the Params area is calculated from the beginning of the Params section.
+ // An offset stored in the Data area is calculated from the beginning of the Data section.
+
+ // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.
+
+ // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html
+
+ assembly {
+
+ // Areas below may use the following variables:
+ // 1. <area>Start -- Start of this area in memory
+ // 2. <area>End -- End of this area in memory. This value may
+ // be precomputed (before writing contents),
+ // or it may be computed as contents are written.
+ // 3. <area>Offset -- Current offset into area. If an area's End
+ // is precomputed, this variable tracks the
+ // offsets of contents as they are written.
+
+ /////// Setup Header Area ///////
+ // Load free memory pointer
+ fillOrderCalldata := mload(0x40)
+ // bytes4(keccak256("fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)"))
+ // = 0xb4be83d5
+ // Leave 0x20 bytes to store the length
+ mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)
+ let headerAreaEnd := add(fillOrderCalldata, 0x24)
+
+ /////// Setup Params Area ///////
+ // This area is preallocated and written to later.
+ // This is because we need to fill in offsets that have not yet been calculated.
+ let paramsAreaStart := headerAreaEnd
+ let paramsAreaEnd := add(paramsAreaStart, 0x60)
+ let paramsAreaOffset := paramsAreaStart
+
+ /////// Setup Data Area ///////
+ let dataAreaStart := paramsAreaEnd
+ let dataAreaEnd := dataAreaStart
+
+ // Offset from the source data we're reading from
+ let sourceOffset := order
+ // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.
+ let arrayLenBytes := 0
+ let arrayLenWords := 0
+
+ /////// Write order Struct ///////
+ // Write memory location of Order, relative to the start of the
+ // parameter list, then increment the paramsAreaOffset respectively.
+ mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
+ paramsAreaOffset := add(paramsAreaOffset, 0x20)
+
+ // Write values for each field in the order
+ // It would be nice to use a loop, but we save on gas by writing
+ // the stores sequentially.
+ mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress
+ mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress
+ mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress
+ mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress
+ mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount
+ mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount
+ mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount
+ mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount
+ mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds
+ mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt
+ mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData
+ mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData
+ dataAreaEnd := add(dataAreaEnd, 0x180)
+ sourceOffset := add(sourceOffset, 0x180)
+
+ // Write offset to <order.makerAssetData>
+ mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))
+
+ // Calculate length of <order.makerAssetData>
+ sourceOffset := mload(add(order, 0x140)) // makerAssetData
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of <order.makerAssetData>
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of <order.makerAssetData>
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ // Write offset to <order.takerAssetData>
+ mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))
+
+ // Calculate length of <order.takerAssetData>
+ sourceOffset := mload(add(order, 0x160)) // takerAssetData
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of <order.takerAssetData>
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of <order.takerAssetData>
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ /////// Write takerAssetFillAmount ///////
+ mstore(paramsAreaOffset, takerAssetFillAmount)
+ paramsAreaOffset := add(paramsAreaOffset, 0x20)
+
+ /////// Write signature ///////
+ // Write offset to paramsArea
+ mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))
+
+ // Calculate length of signature
+ sourceOffset := signature
+ arrayLenBytes := mload(sourceOffset)
+ sourceOffset := add(sourceOffset, 0x20)
+ arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)
+
+ // Write length of signature
+ mstore(dataAreaEnd, arrayLenBytes)
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+
+ // Write contents of signature
+ for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {
+ mstore(dataAreaEnd, mload(sourceOffset))
+ dataAreaEnd := add(dataAreaEnd, 0x20)
+ sourceOffset := add(sourceOffset, 0x20)
+ }
+
+ // Set length of calldata
+ mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))
+
+ // Increment free memory pointer
+ mstore(0x40, dataAreaEnd)
+ }
+
+ return fillOrderCalldata;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibConstants.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibConstants.sol
new file mode 100644
index 000000000..8d2732cd3
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibConstants.sol
@@ -0,0 +1,49 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+// solhint-disable max-line-length
+contract LibConstants {
+
+ // Asset data for ZRX token. Used for fee transfers.
+ // @TODO: Hardcode constant when we deploy. Currently
+ // not constant to make testing easier.
+
+ // The proxyId for ZRX_ASSET_DATA is bytes4(keccak256("ERC20Token(address)")) = 0xf47261b0
+
+ // Kovan ZRX address is 0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570.
+ // The ABI encoded proxyId and address is 0xf47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac68346570
+ // bytes constant public ZRX_ASSET_DATA = "\xf4\x72\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xf6\xc0\xff\x1d\x68\xb9\x64\x90\x1f\x98\x6d\x4c\x9f\xa3\xac\x68\x34\x65\x70";
+
+ // Mainnet ZRX address is 0xe41d2489571d322189246dafa5ebde1f4699f498.
+ // The ABI encoded proxyId and address is 0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498
+ // bytes constant public ZRX_ASSET_DATA = "\xf4\x72\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x1d\x24\x89\x57\x1d\x32\x21\x89\x24\x6d\xaf\xa5\xeb\xde\x1f\x46\x99\xf4\x98";
+
+ // solhint-disable-next-line var-name-mixedcase
+ bytes public ZRX_ASSET_DATA;
+
+ // @TODO: Remove when we deploy.
+ constructor (bytes memory zrxAssetData)
+ public
+ {
+ ZRX_ASSET_DATA = zrxAssetData;
+ }
+}
+// solhint-enable max-line-length
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibEIP712.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibEIP712.sol
new file mode 100644
index 000000000..b02f7632e
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibEIP712.sol
@@ -0,0 +1,86 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract LibEIP712 {
+ // EIP191 header for EIP712 prefix
+ string constant internal EIP191_HEADER = "\x19\x01";
+
+ // EIP712 Domain Name value
+ string constant internal EIP712_DOMAIN_NAME = "0x Protocol";
+
+ // EIP712 Domain Version value
+ string constant internal EIP712_DOMAIN_VERSION = "2";
+
+ // Hash of the EIP712 Domain Separator Schema
+ bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(
+ "EIP712Domain(",
+ "string name,",
+ "string version,",
+ "address verifyingContract",
+ ")"
+ ));
+
+ // Hash of the EIP712 Domain Separator data
+ // solhint-disable-next-line var-name-mixedcase
+ bytes32 public EIP712_DOMAIN_HASH;
+
+ constructor ()
+ public
+ {
+ EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(
+ EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
+ keccak256(bytes(EIP712_DOMAIN_NAME)),
+ keccak256(bytes(EIP712_DOMAIN_VERSION)),
+ bytes32(address(this))
+ ));
+ }
+
+ /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.
+ /// @param hashStruct The EIP712 hash struct.
+ /// @return EIP712 hash applied to this EIP712 Domain.
+ function hashEIP712Message(bytes32 hashStruct)
+ internal
+ view
+ returns (bytes32 result)
+ {
+ bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;
+
+ // Assembly for more efficient computing:
+ // keccak256(abi.encodePacked(
+ // EIP191_HEADER,
+ // EIP712_DOMAIN_HASH,
+ // hashStruct
+ // ));
+
+ assembly {
+ // Load free memory pointer
+ let memPtr := mload(64)
+
+ mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header
+ mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash
+ mstore(add(memPtr, 34), hashStruct) // Hash of struct
+
+ // Compute hash
+ result := keccak256(memPtr, 66)
+ }
+ return result;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol
new file mode 100644
index 000000000..a0f75bc06
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol
@@ -0,0 +1,70 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+// solhint-disable
+pragma solidity 0.4.24;
+
+
+/// @dev This contract documents the revert reasons used in the Exchange contract.
+/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.
+contract LibExchangeErrors {
+
+ /// Order validation errors ///
+ string constant ORDER_UNFILLABLE = "ORDER_UNFILLABLE"; // Order cannot be filled.
+ string constant INVALID_MAKER = "INVALID_MAKER"; // Invalid makerAddress.
+ string constant INVALID_TAKER = "INVALID_TAKER"; // Invalid takerAddress.
+ string constant INVALID_SENDER = "INVALID_SENDER"; // Invalid `msg.sender`.
+ string constant INVALID_ORDER_SIGNATURE = "INVALID_ORDER_SIGNATURE"; // Signature validation failed.
+
+ /// fillOrder validation errors ///
+ string constant INVALID_TAKER_AMOUNT = "INVALID_TAKER_AMOUNT"; // takerAssetFillAmount cannot equal 0.
+ string constant ROUNDING_ERROR = "ROUNDING_ERROR"; // Rounding error greater than 0.1% of takerAssetFillAmount.
+
+ /// Signature validation errors ///
+ string constant INVALID_SIGNATURE = "INVALID_SIGNATURE"; // Signature validation failed.
+ string constant SIGNATURE_ILLEGAL = "SIGNATURE_ILLEGAL"; // Signature type is illegal.
+ string constant SIGNATURE_UNSUPPORTED = "SIGNATURE_UNSUPPORTED"; // Signature type unsupported.
+
+ /// cancelOrdersUptTo errors ///
+ string constant INVALID_NEW_ORDER_EPOCH = "INVALID_NEW_ORDER_EPOCH"; // Specified salt must be greater than or equal to existing orderEpoch.
+
+ /// fillOrKillOrder errors ///
+ string constant COMPLETE_FILL_FAILED = "COMPLETE_FILL_FAILED"; // Desired takerAssetFillAmount could not be completely filled.
+
+ /// matchOrders errors ///
+ string constant NEGATIVE_SPREAD_REQUIRED = "NEGATIVE_SPREAD_REQUIRED"; // Matched orders must have a negative spread.
+
+ /// Transaction errors ///
+ string constant REENTRANCY_ILLEGAL = "REENTRANCY_ILLEGAL"; // Recursive reentrancy is not allowed.
+ string constant INVALID_TX_HASH = "INVALID_TX_HASH"; // Transaction has already been executed.
+ string constant INVALID_TX_SIGNATURE = "INVALID_TX_SIGNATURE"; // Signature validation failed.
+ string constant FAILED_EXECUTION = "FAILED_EXECUTION"; // Transaction execution failed.
+
+ /// registerAssetProxy errors ///
+ string constant ASSET_PROXY_ALREADY_EXISTS = "ASSET_PROXY_ALREADY_EXISTS"; // AssetProxy with same id already exists.
+
+ /// dispatchTransferFrom errors ///
+ string constant ASSET_PROXY_DOES_NOT_EXIST = "ASSET_PROXY_DOES_NOT_EXIST"; // No assetProxy registered at given id.
+ string constant TRANSFER_FAILED = "TRANSFER_FAILED"; // Asset transfer unsuccesful.
+
+ /// Length validation errors ///
+ string constant LENGTH_GREATER_THAN_0_REQUIRED = "LENGTH_GREATER_THAN_0_REQUIRED"; // Byte array must have a length greater than 0.
+ string constant LENGTH_GREATER_THAN_3_REQUIRED = "LENGTH_GREATER_THAN_3_REQUIRED"; // Byte array must have a length greater than 3.
+ string constant LENGTH_0_REQUIRED = "LENGTH_0_REQUIRED"; // Byte array must have a length of 0.
+ string constant LENGTH_65_REQUIRED = "LENGTH_65_REQUIRED"; // Byte array must have a length of 65.
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibFillResults.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibFillResults.sol
new file mode 100644
index 000000000..1b4181d94
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibFillResults.sol
@@ -0,0 +1,54 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../../utils/SafeMath/SafeMath.sol";
+
+
+contract LibFillResults is
+ SafeMath
+{
+
+ struct FillResults {
+ uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.
+ uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.
+ uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).
+ uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).
+ }
+
+ struct MatchedFillResults {
+ FillResults left; // Amounts filled and fees paid of left order.
+ FillResults right; // Amounts filled and fees paid of right order.
+ uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.
+ }
+
+ /// @dev Adds properties of both FillResults instances.
+ /// Modifies the first FillResults instance specified.
+ /// @param totalFillResults Fill results instance that will be added onto.
+ /// @param singleFillResults Fill results instance that will be added to totalFillResults.
+ function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
+ internal
+ pure
+ {
+ totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);
+ totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);
+ totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);
+ totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol
new file mode 100644
index 000000000..fa09da6ac
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibMath.sol
@@ -0,0 +1,75 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../../utils/SafeMath/SafeMath.sol";
+
+
+contract LibMath is
+ SafeMath
+{
+
+ /// @dev Calculates partial value given a numerator and denominator.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to calculate partial of.
+ /// @return Partial value of target.
+ function getPartialAmount(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ internal
+ pure
+ returns (uint256 partialAmount)
+ {
+ partialAmount = safeDiv(
+ safeMul(numerator, target),
+ denominator
+ );
+ return partialAmount;
+ }
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function isRoundingError(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ internal
+ pure
+ returns (bool isError)
+ {
+ uint256 remainder = mulmod(target, numerator, denominator);
+ if (remainder == 0) {
+ return false; // No rounding error.
+ }
+
+ uint256 errPercentageTimes1000000 = safeDiv(
+ safeMul(remainder, 1000000),
+ safeMul(numerator, target)
+ );
+ isError = errPercentageTimes1000000 > 1000;
+ return isError;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibOrder.sol b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibOrder.sol
new file mode 100644
index 000000000..68f4f5f1b
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/libs/LibOrder.sol
@@ -0,0 +1,146 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "./LibEIP712.sol";
+
+
+contract LibOrder is
+ LibEIP712
+{
+
+ // Hash for the EIP712 Order Schema
+ bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(
+ "Order(",
+ "address makerAddress,",
+ "address takerAddress,",
+ "address feeRecipientAddress,",
+ "address senderAddress,",
+ "uint256 makerAssetAmount,",
+ "uint256 takerAssetAmount,",
+ "uint256 makerFee,",
+ "uint256 takerFee,",
+ "uint256 expirationTimeSeconds,",
+ "uint256 salt,",
+ "bytes makerAssetData,",
+ "bytes takerAssetData",
+ ")"
+ ));
+
+ // A valid order remains fillable until it is expired, fully filled, or cancelled.
+ // An order's state is unaffected by external factors, like account balances.
+ enum OrderStatus {
+ INVALID, // Default value
+ INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount
+ INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount
+ FILLABLE, // Order is fillable
+ EXPIRED, // Order has already expired
+ FULLY_FILLED, // Order is fully filled
+ CANCELLED // Order has been cancelled
+ }
+
+ // solhint-disable max-line-length
+ struct Order {
+ address makerAddress; // Address that created the order.
+ address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order.
+ address feeRecipientAddress; // Address that will recieve fees when order is filled.
+ address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.
+ uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0.
+ uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0.
+ uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.
+ uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.
+ uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires.
+ uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash.
+ bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.
+ bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.
+ }
+ // solhint-enable max-line-length
+
+ struct OrderInfo {
+ uint8 orderStatus; // Status that describes order's validity and fillability.
+ bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).
+ uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.
+ }
+
+ /// @dev Calculates Keccak-256 hash of the order.
+ /// @param order The order structure.
+ /// @return Keccak-256 EIP712 hash of the order.
+ function getOrderHash(Order memory order)
+ internal
+ view
+ returns (bytes32 orderHash)
+ {
+ orderHash = hashEIP712Message(hashOrder(order));
+ return orderHash;
+ }
+
+ /// @dev Calculates EIP712 hash of the order.
+ /// @param order The order structure.
+ /// @return EIP712 hash of the order.
+ function hashOrder(Order memory order)
+ internal
+ pure
+ returns (bytes32 result)
+ {
+ bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;
+ bytes32 makerAssetDataHash = keccak256(order.makerAssetData);
+ bytes32 takerAssetDataHash = keccak256(order.takerAssetData);
+
+ // Assembly for more efficiently computing:
+ // keccak256(abi.encodePacked(
+ // EIP712_ORDER_SCHEMA_HASH,
+ // bytes32(order.makerAddress),
+ // bytes32(order.takerAddress),
+ // bytes32(order.feeRecipientAddress),
+ // bytes32(order.senderAddress),
+ // order.makerAssetAmount,
+ // order.takerAssetAmount,
+ // order.makerFee,
+ // order.takerFee,
+ // order.expirationTimeSeconds,
+ // order.salt,
+ // keccak256(order.makerAssetData),
+ // keccak256(order.takerAssetData)
+ // ));
+
+ assembly {
+ // Calculate memory addresses that will be swapped out before hashing
+ let pos1 := sub(order, 32)
+ let pos2 := add(order, 320)
+ let pos3 := add(order, 352)
+
+ // Backup
+ let temp1 := mload(pos1)
+ let temp2 := mload(pos2)
+ let temp3 := mload(pos3)
+
+ // Hash in place
+ mstore(pos1, schemaHash)
+ mstore(pos2, makerAssetDataHash)
+ mstore(pos3, takerAssetDataHash)
+ result := keccak256(pos1, 416)
+
+ // Restore
+ mstore(pos1, temp1)
+ mstore(pos2, temp2)
+ mstore(pos3, temp3)
+ }
+ return result;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol
new file mode 100644
index 000000000..c6904300a
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol
@@ -0,0 +1,46 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../interfaces/IAssetProxyDispatcher.sol";
+
+
+contract MAssetProxyDispatcher is
+ IAssetProxyDispatcher
+{
+
+ // Logs registration of new asset proxy
+ event AssetProxyRegistered(
+ bytes4 id, // Id of new registered AssetProxy.
+ address assetProxy // Address of new registered AssetProxy.
+ );
+
+ /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.
+ /// @param assetData Byte array encoded for the asset.
+ /// @param from Address to transfer token from.
+ /// @param to Address to transfer token to.
+ /// @param amount Amount of token to transfer.
+ function dispatchTransferFrom(
+ bytes memory assetData,
+ address from,
+ address to,
+ uint256 amount
+ )
+ internal;
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MExchangeCore.sol b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MExchangeCore.sol
new file mode 100644
index 000000000..c165b647c
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MExchangeCore.sol
@@ -0,0 +1,127 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../libs/LibOrder.sol";
+import "../libs/LibFillResults.sol";
+import "../interfaces/IExchangeCore.sol";
+
+
+contract MExchangeCore is
+ IExchangeCore
+{
+ // Fill event is emitted whenever an order is filled.
+ event Fill(
+ address indexed makerAddress, // Address that created the order.
+ address indexed feeRecipientAddress, // Address that received fees.
+ address takerAddress, // Address that filled the order.
+ address senderAddress, // Address that called the Exchange contract (msg.sender).
+ uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker.
+ uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.
+ uint256 makerFeePaid, // Amount of ZRX paid to feeRecipient by maker.
+ uint256 takerFeePaid, // Amount of ZRX paid to feeRecipient by taker.
+ bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).
+ bytes makerAssetData, // Encoded data specific to makerAsset.
+ bytes takerAssetData // Encoded data specific to takerAsset.
+ );
+
+ // Cancel event is emitted whenever an individual order is cancelled.
+ event Cancel(
+ address indexed makerAddress, // Address that created the order.
+ address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled.
+ address senderAddress, // Address that called the Exchange contract (msg.sender).
+ bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).
+ bytes makerAssetData, // Encoded data specific to makerAsset.
+ bytes takerAssetData // Encoded data specific to takerAsset.
+ );
+
+ // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.
+ event CancelUpTo(
+ address indexed makerAddress, // Orders cancelled must have been created by this address.
+ address indexed senderAddress, // Orders cancelled must have a `senderAddress` equal to this address.
+ uint256 orderEpoch // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.
+ );
+
+ /// @dev Updates state with results of a fill order.
+ /// @param order that was filled.
+ /// @param takerAddress Address of taker who filled the order.
+ /// @param orderTakerAssetFilledAmount Amount of order already filled.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function updateFilledState(
+ LibOrder.Order memory order,
+ address takerAddress,
+ bytes32 orderHash,
+ uint256 orderTakerAssetFilledAmount,
+ LibFillResults.FillResults memory fillResults
+ )
+ internal;
+
+ /// @dev Updates state with results of cancelling an order.
+ /// State is only updated if the order is currently fillable.
+ /// Otherwise, updating state would have no effect.
+ /// @param order that was cancelled.
+ /// @param orderHash Hash of order that was cancelled.
+ function updateCancelledState(
+ LibOrder.Order memory order,
+ bytes32 orderHash
+ )
+ internal;
+
+ /// @dev Validates context for fillOrder. Succeeds or throws.
+ /// @param order to be filled.
+ /// @param orderInfo Status, orderHash, and amount already filled of order.
+ /// @param takerAddress Address of order taker.
+ /// @param takerAssetFillAmount Desired amount of order to fill by taker.
+ /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.
+ /// @param signature Proof that the orders was created by its maker.
+ function assertValidFill(
+ LibOrder.Order memory order,
+ LibOrder.OrderInfo memory orderInfo,
+ address takerAddress,
+ uint256 takerAssetFillAmount,
+ uint256 takerAssetFilledAmount,
+ bytes memory signature
+ )
+ internal
+ view;
+
+ /// @dev Validates context for cancelOrder. Succeeds or throws.
+ /// @param order to be cancelled.
+ /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.
+ function assertValidCancel(
+ LibOrder.Order memory order,
+ LibOrder.OrderInfo memory orderInfo
+ )
+ internal
+ view;
+
+ /// @dev Calculates amounts filled and fees paid by maker and taker.
+ /// @param order to be filled.
+ /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function calculateFillResults(
+ LibOrder.Order memory order,
+ uint256 takerAssetFilledAmount
+ )
+ internal
+ pure
+ returns (LibFillResults.FillResults memory fillResults);
+
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MMatchOrders.sol b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MMatchOrders.sol
new file mode 100644
index 000000000..a31ec1585
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MMatchOrders.sol
@@ -0,0 +1,59 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../libs/LibOrder.sol";
+import "../libs/LibFillResults.sol";
+import "../interfaces/IMatchOrders.sol";
+
+
+contract MMatchOrders is
+ IMatchOrders
+{
+
+ /// @dev Validates context for matchOrders. Succeeds or throws.
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ function assertValidMatch(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder
+ )
+ internal
+ pure;
+
+ /// @dev Calculates fill amounts for the matched orders.
+ /// Each order is filled at their respective price point. However, the calculations are
+ /// carried out as though the orders are both being filled at the right order's price point.
+ /// The profit made by the leftOrder order goes to the taker (who matched the two orders).
+ /// @param leftOrder First order to match.
+ /// @param rightOrder Second order to match.
+ /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.
+ /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.
+ /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.
+ function calculateMatchedFillResults(
+ LibOrder.Order memory leftOrder,
+ LibOrder.Order memory rightOrder,
+ uint256 leftOrderTakerAssetFilledAmount,
+ uint256 rightOrderTakerAssetFilledAmount
+ )
+ internal
+ pure
+ returns (LibFillResults.MatchedFillResults memory matchedFillResults);
+
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol
new file mode 100644
index 000000000..f14f2ba00
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol
@@ -0,0 +1,46 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../interfaces/ISignatureValidator.sol";
+
+
+contract MSignatureValidator is
+ ISignatureValidator
+{
+ event SignatureValidatorApproval(
+ address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.
+ address indexed validatorAddress, // Address of signature validator contract.
+ bool approved // Approval or disapproval of validator contract.
+ );
+
+ // Allowed signature types.
+ enum SignatureType {
+ Illegal, // 0x00, default value
+ Invalid, // 0x01
+ EIP712, // 0x02
+ EthSign, // 0x03
+ Caller, // 0x04
+ Wallet, // 0x05
+ Validator, // 0x06
+ PreSigned, // 0x07
+ Trezor, // 0x08
+ NSignatureTypes // 0x09, number of signature types. Always leave at end.
+ }
+}
diff --git a/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MTransactions.sol b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MTransactions.sol
new file mode 100644
index 000000000..f2b5e4b16
--- /dev/null
+++ b/packages/contracts/src/2.0.0/protocol/Exchange/mixins/MTransactions.sol
@@ -0,0 +1,36 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+pragma solidity 0.4.24;
+
+import "../interfaces/ITransactions.sol";
+
+
+contract MTransactions is
+ ITransactions
+{
+
+ /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).
+ /// If calling a fill function, this address will represent the taker.
+ /// If calling a cancel function, this address will represent the maker.
+ /// @return Signer of 0x transaction if entry point is `executeTransaction`.
+ /// `msg.sender` if entry point is any other function.
+ function getCurrentContextAddress()
+ internal
+ view
+ returns (address);
+}
diff --git a/packages/contracts/src/2.0.0/test/DummyERC20Token/DummyERC20Token.sol b/packages/contracts/src/2.0.0/test/DummyERC20Token/DummyERC20Token.sol
new file mode 100644
index 000000000..9272b18a8
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/DummyERC20Token/DummyERC20Token.sol
@@ -0,0 +1,60 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../Mintable/Mintable.sol";
+import "../../utils/Ownable/Ownable.sol";
+
+
+contract DummyERC20Token is
+ Mintable,
+ Ownable
+{
+ string public name;
+ string public symbol;
+ uint256 public decimals;
+
+ constructor (
+ string _name,
+ string _symbol,
+ uint256 _decimals,
+ uint256 _totalSupply
+ )
+ public
+ {
+ name = _name;
+ symbol = _symbol;
+ decimals = _decimals;
+ totalSupply = _totalSupply;
+ balances[msg.sender] = _totalSupply;
+ }
+
+ function setBalance(address _target, uint256 _value)
+ public
+ onlyOwner
+ {
+ uint256 currBalance = balanceOf(_target);
+ if (_value < currBalance) {
+ totalSupply = safeSub(totalSupply, safeSub(currBalance, _value));
+ } else {
+ totalSupply = safeAdd(totalSupply, safeSub(_value, currBalance));
+ }
+ balances[_target] = _value;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol b/packages/contracts/src/2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol
new file mode 100644
index 000000000..5dce74a14
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol
@@ -0,0 +1,64 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Smart Contract Solutions, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+pragma solidity 0.4.24;
+
+import "../../tokens/ERC721Token/IERC721Receiver.sol";
+
+
+contract DummyERC721Receiver is
+ IERC721Receiver
+{
+
+ event TokenReceived(
+ address from,
+ uint256 tokenId,
+ bytes data
+ );
+
+ /**
+ * @notice Handle the receipt of an NFT
+ * @dev The ERC721 smart contract calls this function on the recipient
+ * after a `safetransfer`. This function MAY throw to revert and reject the
+ * transfer. This function MUST use 50,000 gas or less. Return of other
+ * than the magic value MUST result in the transaction being reverted.
+ * Note: the contract address is always the message sender.
+ * @param _from The sending address
+ * @param _tokenId The NFT identifier which is being transfered
+ * @param _data Additional data with no specified format
+ * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
+ */
+ function onERC721Received(
+ address _from,
+ uint256 _tokenId,
+ bytes _data
+ )
+ public
+ returns (bytes4)
+ {
+ emit TokenReceived(_from, _tokenId, _data);
+ return ERC721_RECEIVED;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/DummyERC721Token/DummyERC721Token.sol b/packages/contracts/src/2.0.0/test/DummyERC721Token/DummyERC721Token.sol
new file mode 100644
index 000000000..627746a52
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/DummyERC721Token/DummyERC721Token.sol
@@ -0,0 +1,76 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../tokens/ERC721Token/ERC721Token.sol";
+import "../../utils/Ownable/Ownable.sol";
+
+
+// solhint-disable no-empty-blocks
+contract DummyERC721Token is
+ Ownable,
+ ERC721Token
+{
+
+ /**
+ * @dev Constructor passes its arguments to the base ERC721Token constructor
+ * @param name of token
+ * @param symbol of token
+ */
+ constructor (
+ string name,
+ string symbol
+ )
+ public
+ ERC721Token(name, symbol)
+ {}
+
+ /**
+ * @dev Function to mint a new token
+ * @dev Reverts if the given token ID already exists
+ * @param to address the beneficiary that will own the minted token
+ * @param tokenId uint256 ID of the token to be minted by the msg.sender
+ */
+ function mint(address to, uint256 tokenId)
+ public
+ onlyOwner
+ {
+ require(
+ !exists(tokenId),
+ "Token with tokenId already exists."
+ );
+ _mint(to, tokenId);
+ }
+
+ /**
+ * @dev Function to burn a token
+ * @dev Reverts if the given token ID doesn't exist
+ * @param tokenId uint256 ID of the token to be minted by the msg.sender
+ */
+ function burn(address owner, uint256 tokenId)
+ public
+ onlyOwner
+ {
+ require(
+ exists(tokenId),
+ "Token with tokenId does not exist."
+ );
+ _burn(owner, tokenId);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/Mintable/Mintable.sol b/packages/contracts/src/2.0.0/test/Mintable/Mintable.sol
new file mode 100644
index 000000000..767cc8d25
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/Mintable/Mintable.sol
@@ -0,0 +1,43 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol";
+import "../../utils/SafeMath/SafeMath.sol";
+
+
+/*
+ * Mintable
+ * Base contract that creates a mintable UnlimitedAllowanceToken
+ */
+contract Mintable is
+ UnlimitedAllowanceToken,
+ SafeMath
+{
+ function mint(uint256 _value)
+ public
+ {
+ require(
+ _value <= 100000000000000000000,
+ "Minting more than 100000000000000000000 is not allowed."
+ );
+ balances[msg.sender] = safeAdd(_value, balances[msg.sender]);
+ totalSupply = safeAdd(totalSupply, _value);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol b/packages/contracts/src/2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol
new file mode 100644
index 000000000..ad71fc9a1
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol
@@ -0,0 +1,37 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../protocol/Exchange/MixinAssetProxyDispatcher.sol";
+
+
+contract TestAssetProxyDispatcher is
+ MixinAssetProxyDispatcher
+{
+ function publicDispatchTransferFrom(
+ bytes memory assetData,
+ address from,
+ address to,
+ uint256 amount
+ )
+ public
+ {
+ dispatchTransferFrom(assetData, from, to, amount);
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol b/packages/contracts/src/2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol
new file mode 100644
index 000000000..75e782d43
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol
@@ -0,0 +1,72 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.10;
+
+import "../../protocol/AssetProxyOwner/AssetProxyOwner.sol";
+
+
+// solhint-disable no-empty-blocks
+contract TestAssetProxyOwner is
+ AssetProxyOwner
+{
+
+ function TestAssetProxyOwner(
+ address[] memory _owners,
+ address[] memory _assetProxyContracts,
+ uint256 _required,
+ uint256 _secondsTimeLocked
+ )
+ public
+ AssetProxyOwner(_owners, _assetProxyContracts, _required, _secondsTimeLocked)
+ {}
+
+ function testValidRemoveAuthorizedAddressAtIndexTx(uint256 id)
+ public
+ validRemoveAuthorizedAddressAtIndexTx(id)
+ returns (bool)
+ {
+ // Do nothing. We expect reverts through the modifier
+ return true;
+ }
+
+ /// @dev Compares first 4 bytes of byte array to `removeAuthorizedAddressAtIndex` function selector.
+ /// @param data Transaction data.
+ /// @return Successful if data is a call to `removeAuthorizedAddressAtIndex`.
+ function isFunctionRemoveAuthorizedAddressAtIndex(bytes memory data)
+ public
+ returns (bool)
+ {
+ return readBytes4(data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR;
+ }
+
+ /// @dev Reads an unpadded bytes4 value from a position in a byte array.
+ /// @param b Byte array containing a bytes4 value.
+ /// @param index Index in byte array of bytes4 value.
+ /// @return bytes4 value from byte array.
+ function publicReadBytes4(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ returns (bytes4 result)
+ {
+ result = readBytes4(b, index);
+ return result;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestConstants/TestConstants.sol b/packages/contracts/src/2.0.0/test/TestConstants/TestConstants.sol
new file mode 100644
index 000000000..1275d007b
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestConstants/TestConstants.sol
@@ -0,0 +1,57 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/LibBytes/LibBytes.sol";
+
+
+// solhint-disable max-line-length
+contract TestConstants {
+
+ using LibBytes for bytes;
+
+ bytes4 constant internal ERC20_PROXY_ID = bytes4(keccak256("ERC20Token(address)"));
+
+ address constant internal KOVAN_ZRX_ADDRESS = 0x6Ff6C0Ff1d68b964901F986d4C9FA3ac68346570;
+ bytes constant internal KOVAN_ZRX_ASSET_DATA = "\xf4\x72\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x6f\xf6\xc0\xff\x1d\x68\xb9\x64\x90\x1f\x98\x6d\x4c\x9f\xa3\xac\x68\x34\x65\x70";
+
+ address constant internal MAINNET_ZRX_ADDRESS = 0xE41d2489571d322189246DaFA5ebDe1F4699F498;
+ bytes constant public MAINNET_ZRX_ASSET_DATA = "\xf4\x72\x61\xb0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe4\x1d\x24\x89\x57\x1d\x32\x21\x89\x24\x6d\xaf\xa5\xeb\xde\x1f\x46\x99\xf4\x98";
+
+ function assertValidZrxAssetData()
+ public
+ pure
+ returns (bool)
+ {
+ bytes memory kovanZrxAssetData = abi.encodeWithSelector(ERC20_PROXY_ID, KOVAN_ZRX_ADDRESS);
+ require(
+ kovanZrxAssetData.equals(KOVAN_ZRX_ASSET_DATA),
+ "INVALID_KOVAN_ZRX_ASSET_DATA"
+ );
+
+ bytes memory mainetZrxAssetData = abi.encodeWithSelector(ERC20_PROXY_ID, MAINNET_ZRX_ADDRESS);
+ require(
+ mainetZrxAssetData.equals(MAINNET_ZRX_ASSET_DATA),
+ "INVALID_MAINNET_ZRX_ASSET_DATA"
+ );
+
+ return true;
+ }
+}
+// solhint-enable max-line-length \ No newline at end of file
diff --git a/packages/contracts/src/2.0.0/test/TestExchangeInternals/TestExchangeInternals.sol b/packages/contracts/src/2.0.0/test/TestExchangeInternals/TestExchangeInternals.sol
new file mode 100644
index 000000000..d9cec9edc
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestExchangeInternals/TestExchangeInternals.sol
@@ -0,0 +1,121 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/Exchange.sol";
+
+
+// solhint-disable no-empty-blocks
+contract TestExchangeInternals is
+ Exchange
+{
+ constructor ()
+ public
+ Exchange("")
+ {}
+
+ /// @dev Adds properties of both FillResults instances.
+ /// Modifies the first FillResults instance specified.
+ /// Note that this function has been modified from the original
+ // internal version to return the FillResults.
+ /// @param totalFillResults Fill results instance that will be added onto.
+ /// @param singleFillResults Fill results instance that will be added to totalFillResults.
+ /// @return newTotalFillResults The result of adding singleFillResults to totalFilResults.
+ function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
+ public
+ pure
+ returns (FillResults memory)
+ {
+ addFillResults(totalFillResults, singleFillResults);
+ return totalFillResults;
+ }
+
+ /// @dev Calculates amounts filled and fees paid by maker and taker.
+ /// @param order to be filled.
+ /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function publicCalculateFillResults(
+ Order memory order,
+ uint256 takerAssetFilledAmount
+ )
+ public
+ pure
+ returns (FillResults memory fillResults)
+ {
+ return calculateFillResults(order, takerAssetFilledAmount);
+ }
+
+ /// @dev Calculates partial value given a numerator and denominator.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to calculate partial of.
+ /// @return Partial value of target.
+ function publicGetPartialAmount(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ public
+ pure
+ returns (uint256 partialAmount)
+ {
+ return getPartialAmount(numerator, denominator, target);
+ }
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function publicIsRoundingError(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ public
+ pure
+ returns (bool isError)
+ {
+ return isRoundingError(numerator, denominator, target);
+ }
+
+ /// @dev Updates state with results of a fill order.
+ /// @param order that was filled.
+ /// @param takerAddress Address of taker who filled the order.
+ /// @param orderTakerAssetFilledAmount Amount of order already filled.
+ /// @return fillResults Amounts filled and fees paid by maker and taker.
+ function publicUpdateFilledState(
+ Order memory order,
+ address takerAddress,
+ bytes32 orderHash,
+ uint256 orderTakerAssetFilledAmount,
+ FillResults memory fillResults
+ )
+ public
+ {
+ updateFilledState(
+ order,
+ takerAddress,
+ orderHash,
+ orderTakerAssetFilledAmount,
+ fillResults
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestLibBytes/TestLibBytes.sol b/packages/contracts/src/2.0.0/test/TestLibBytes/TestLibBytes.sol
new file mode 100644
index 000000000..00d861e61
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestLibBytes/TestLibBytes.sol
@@ -0,0 +1,269 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../utils/LibBytes/LibBytes.sol";
+
+
+contract TestLibBytes {
+
+ using LibBytes for bytes;
+
+ /// @dev Pops the last byte off of a byte array by modifying its length.
+ /// @param b Byte array that will be modified.
+ /// @return The byte that was popped off.
+ function publicPopLastByte(bytes memory b)
+ public
+ pure
+ returns (bytes memory, bytes1 result)
+ {
+ result = b.popLastByte();
+ return (b, result);
+ }
+
+ /// @dev Pops the last 20 bytes off of a byte array by modifying its length.
+ /// @param b Byte array that will be modified.
+ /// @return The 20 byte address that was popped off.
+ function publicPopLast20Bytes(bytes memory b)
+ public
+ pure
+ returns (bytes memory, address result)
+ {
+ result = b.popLast20Bytes();
+ return (b, result);
+ }
+
+ /// @dev Tests equality of two byte arrays.
+ /// @param lhs First byte array to compare.
+ /// @param rhs Second byte array to compare.
+ /// @return True if arrays are the same. False otherwise.
+ function publicEquals(bytes memory lhs, bytes memory rhs)
+ public
+ pure
+ returns (bool equal)
+ {
+ equal = lhs.equals(rhs);
+ return equal;
+ }
+
+ function publicEqualsPop1(bytes memory lhs, bytes memory rhs)
+ public
+ pure
+ returns (bool equal)
+ {
+ lhs.popLastByte();
+ rhs.popLastByte();
+ equal = lhs.equals(rhs);
+ return equal;
+ }
+
+ /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.
+ /// @param dest Byte array that will be overwritten with source bytes.
+ /// @param source Byte array to copy onto dest bytes.
+ function publicDeepCopyBytes(
+ bytes memory dest,
+ bytes memory source
+ )
+ public
+ pure
+ returns (bytes memory)
+ {
+ LibBytes.deepCopyBytes(dest, source);
+ return dest;
+ }
+
+ /// @dev Reads an address from a position in a byte array.
+ /// @param b Byte array containing an address.
+ /// @param index Index in byte array of address.
+ /// @return address from byte array.
+ function publicReadAddress(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ pure
+ returns (address result)
+ {
+ result = b.readAddress(index);
+ return result;
+ }
+
+ /// @dev Writes an address into a specific position in a byte array.
+ /// @param b Byte array to insert address into.
+ /// @param index Index in byte array of address.
+ /// @param input Address to put into byte array.
+ function publicWriteAddress(
+ bytes memory b,
+ uint256 index,
+ address input
+ )
+ public
+ pure
+ returns (bytes memory)
+ {
+ b.writeAddress(index, input);
+ return b;
+ }
+
+ /// @dev Reads a bytes32 value from a position in a byte array.
+ /// @param b Byte array containing a bytes32 value.
+ /// @param index Index in byte array of bytes32 value.
+ /// @return bytes32 value from byte array.
+ function publicReadBytes32(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ pure
+ returns (bytes32 result)
+ {
+ result = b.readBytes32(index);
+ return result;
+ }
+
+ /// @dev Writes a bytes32 into a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input bytes32 to put into byte array.
+ function publicWriteBytes32(
+ bytes memory b,
+ uint256 index,
+ bytes32 input
+ )
+ public
+ pure
+ returns (bytes memory)
+ {
+ b.writeBytes32(index, input);
+ return b;
+ }
+
+ /// @dev Reads a uint256 value from a position in a byte array.
+ /// @param b Byte array containing a uint256 value.
+ /// @param index Index in byte array of uint256 value.
+ /// @return uint256 value from byte array.
+ function publicReadUint256(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ pure
+ returns (uint256 result)
+ {
+ result = b.readUint256(index);
+ return result;
+ }
+
+ /// @dev Writes a uint256 into a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input uint256 to put into byte array.
+ function publicWriteUint256(
+ bytes memory b,
+ uint256 index,
+ uint256 input
+ )
+ public
+ pure
+ returns (bytes memory)
+ {
+ b.writeUint256(index, input);
+ return b;
+ }
+
+ /// @dev Reads an unpadded bytes4 value from a position in a byte array.
+ /// @param b Byte array containing a bytes4 value.
+ /// @param index Index in byte array of bytes4 value.
+ /// @return bytes4 value from byte array.
+ function publicReadBytes4(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ pure
+ returns (bytes4 result)
+ {
+ result = b.readBytes4(index);
+ return result;
+ }
+
+ /// @dev Reads nested bytes from a specific position.
+ /// @param b Byte array containing nested bytes.
+ /// @param index Index of nested bytes.
+ /// @return result Nested bytes.
+ function publicReadBytesWithLength(
+ bytes memory b,
+ uint256 index
+ )
+ public
+ pure
+ returns (bytes memory result)
+ {
+ result = b.readBytesWithLength(index);
+ return result;
+ }
+
+ /// @dev Inserts bytes at a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input bytes to insert.
+ /// @return b Updated input byte array
+ function publicWriteBytesWithLength(
+ bytes memory b,
+ uint256 index,
+ bytes memory input
+ )
+ public
+ pure
+ returns (bytes memory)
+ {
+ b.writeBytesWithLength(index, input);
+ return b;
+ }
+
+ /// @dev Copies a block of memory from one location to another.
+ /// @param mem Memory contents we want to apply memCopy to
+ /// @param dest Destination offset into <mem>.
+ /// @param source Source offset into <mem>.
+ /// @param length Length of bytes to copy from <source> to <dest>
+ /// @return mem Memory contents after calling memCopy.
+ function testMemcpy(
+ bytes mem,
+ uint256 dest,
+ uint256 source,
+ uint256 length
+ )
+ public // not external, we need input in memory
+ pure
+ returns (bytes)
+ {
+ // Sanity check. Overflows are not checked.
+ require(source + length <= mem.length);
+ require(dest + length <= mem.length);
+
+ // Get pointer to memory contents
+ uint256 offset = mem.contentAddress();
+
+ // Execute memCopy adjusted for memory array location
+ LibBytes.memCopy(offset + dest, offset + source, length);
+
+ // Return modified memory contents
+ return mem;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestLibs/TestLibs.sol b/packages/contracts/src/2.0.0/test/TestLibs/TestLibs.sol
new file mode 100644
index 000000000..4a99dd9c1
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestLibs/TestLibs.sol
@@ -0,0 +1,119 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+pragma experimental ABIEncoderV2;
+
+import "../../protocol/Exchange/libs/LibMath.sol";
+import "../../protocol/Exchange/libs/LibOrder.sol";
+import "../../protocol/Exchange/libs/LibFillResults.sol";
+import "../../protocol/Exchange/libs/LibAbiEncoder.sol";
+
+
+contract TestLibs is
+ LibMath,
+ LibOrder,
+ LibFillResults,
+ LibAbiEncoder
+{
+
+ function publicAbiEncodeFillOrder(
+ Order memory order,
+ uint256 takerAssetFillAmount,
+ bytes memory signature
+ )
+ public
+ pure
+ returns (bytes memory fillOrderCalldata)
+ {
+ fillOrderCalldata = abiEncodeFillOrder(
+ order,
+ takerAssetFillAmount,
+ signature
+ );
+ return fillOrderCalldata;
+ }
+
+ function publicGetPartialAmount(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ public
+ pure
+ returns (uint256 partialAmount)
+ {
+ partialAmount = getPartialAmount(
+ numerator,
+ denominator,
+ target
+ );
+ return partialAmount;
+ }
+
+ function publicIsRoundingError(
+ uint256 numerator,
+ uint256 denominator,
+ uint256 target
+ )
+ public
+ pure
+ returns (bool isError)
+ {
+ isError = isRoundingError(
+ numerator,
+ denominator,
+ target
+ );
+ return isError;
+ }
+
+ function publicGetOrderHash(Order memory order)
+ public
+ view
+ returns (bytes32 orderHash)
+ {
+ orderHash = getOrderHash(order);
+ return orderHash;
+ }
+
+ function getOrderSchemaHash()
+ public
+ pure
+ returns (bytes32)
+ {
+ return EIP712_ORDER_SCHEMA_HASH;
+ }
+
+ function getDomainSeparatorSchemaHash()
+ public
+ pure
+ returns (bytes32)
+ {
+ return EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;
+ }
+
+ function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)
+ public
+ pure
+ returns (FillResults memory)
+ {
+ addFillResults(totalFillResults, singleFillResults);
+ return totalFillResults;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol b/packages/contracts/src/2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol
new file mode 100644
index 000000000..e1a610469
--- /dev/null
+++ b/packages/contracts/src/2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol
@@ -0,0 +1,46 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../../protocol/Exchange/MixinSignatureValidator.sol";
+import "../../protocol/Exchange/MixinTransactions.sol";
+
+
+contract TestSignatureValidator is
+ MixinSignatureValidator,
+ MixinTransactions
+{
+
+ function publicIsValidSignature(
+ bytes32 hash,
+ address signer,
+ bytes memory signature
+ )
+ public
+ view
+ returns (bool isValid)
+ {
+ isValid = isValidSignature(
+ hash,
+ signer,
+ signature
+ );
+ return isValid;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ERC20Token/ERC20Token.sol b/packages/contracts/src/2.0.0/tokens/ERC20Token/ERC20Token.sol
new file mode 100644
index 000000000..d9950145d
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ERC20Token/ERC20Token.sol
@@ -0,0 +1,96 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "./IERC20Token.sol";
+
+
+contract ERC20Token is IERC20Token {
+
+ mapping (address => uint256) internal balances;
+ mapping (address => mapping (address => uint256)) internal allowed;
+
+ uint256 public totalSupply;
+
+ function transfer(address _to, uint256 _value)
+ public
+ returns (bool)
+ {
+ require(
+ balances[msg.sender] >= _value,
+ "ERC20_INSUFFICIENT_BALANCE"
+ );
+ require(
+ balances[_to] + _value >= balances[_to],
+ "OVERFLOW"
+ );
+ balances[msg.sender] -= _value;
+ balances[_to] += _value;
+ emit Transfer(msg.sender, _to, _value);
+ return true;
+ }
+
+ function transferFrom(address _from, address _to, uint256 _value)
+ public
+ returns (bool)
+ {
+ require(
+ balances[_from] >= _value,
+ "ERC20_INSUFFICIENT_BALANCE"
+ );
+ require(
+ allowed[_from][msg.sender] >= _value,
+ "ERC20_INSUFFICIENT_ALLOWANCE"
+ );
+ require(
+ balances[_to] + _value >= balances[_to],
+ "OVERFLOW"
+ );
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ allowed[_from][msg.sender] -= _value;
+ emit Transfer(_from, _to, _value);
+ return true;
+ }
+
+ function approve(address _spender, uint256 _value)
+ public
+ returns (bool)
+ {
+ allowed[msg.sender][_spender] = _value;
+ emit Approval(msg.sender, _spender, _value);
+ return true;
+ }
+
+ function balanceOf(address _owner)
+ public
+ view
+ returns (uint256)
+ {
+ return balances[_owner];
+ }
+
+ function allowance(address _owner, address _spender)
+ public
+ view
+ returns (uint256)
+ {
+ return allowed[_owner][_spender];
+ }
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ERC20Token/IERC20Token.sol b/packages/contracts/src/2.0.0/tokens/ERC20Token/IERC20Token.sol
new file mode 100644
index 000000000..5ee5e1011
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ERC20Token/IERC20Token.sol
@@ -0,0 +1,74 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+contract IERC20Token {
+
+ /// @notice send `value` token to `to` from `msg.sender`
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return Whether the transfer was successful or not
+ function transfer(address _to, uint256 _value)
+ public
+ returns (bool);
+
+ /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`
+ /// @param _from The address of the sender
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return Whether the transfer was successful or not
+ function transferFrom(address _from, address _to, uint256 _value)
+ public
+ returns (bool);
+
+ /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @param _value The amount of wei to be approved for transfer
+ /// @return Whether the approval was successful or not
+ function approve(address _spender, uint256 _value)
+ public
+ returns (bool);
+
+ /// @param _owner The address from which the balance will be retrieved
+ /// @return The balance
+ function balanceOf(address _owner)
+ public view
+ returns (uint256);
+
+ /// @param _owner The address of the account owning tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @return Amount of remaining tokens allowed to spent
+ function allowance(address _owner, address _spender)
+ public view
+ returns (uint256);
+
+ // solhint-disable-next-line no-simple-event-func-name
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _value
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _spender,
+ uint256 _value
+ );
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ERC721Token/ERC721Token.sol b/packages/contracts/src/2.0.0/tokens/ERC721Token/ERC721Token.sol
new file mode 100644
index 000000000..60603aa19
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ERC721Token/ERC721Token.sol
@@ -0,0 +1,407 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Smart Contract Solutions, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+pragma solidity 0.4.24;
+
+import "./IERC721Token.sol";
+import "./IERC721Receiver.sol";
+import "../../utils/SafeMath/SafeMath.sol";
+
+
+/**
+ * @title ERC721 Non-Fungible Token Standard basic implementation
+ * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
+ * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol
+ */
+contract ERC721Token is
+ IERC721Token,
+ SafeMath
+{
+ // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
+ // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
+ bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;
+
+ // Mapping from token ID to owner
+ mapping (uint256 => address) internal tokenOwner;
+
+ // Mapping from token ID to approved address
+ mapping (uint256 => address) internal tokenApprovals;
+
+ // Mapping from owner to number of owned token
+ mapping (address => uint256) internal ownedTokensCount;
+
+ // Mapping from owner to operator approvals
+ mapping (address => mapping (address => bool)) internal operatorApprovals;
+
+ /**
+ * @dev Guarantees msg.sender is owner of the given token
+ * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
+ */
+ modifier onlyOwnerOf(uint256 _tokenId) {
+ require(ownerOf(_tokenId) == msg.sender);
+ _;
+ }
+
+ /**
+ * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
+ * @param _tokenId uint256 ID of the token to validate
+ */
+ modifier canTransfer(uint256 _tokenId) {
+ require(isApprovedOrOwner(msg.sender, _tokenId));
+ _;
+ }
+
+ constructor (
+ string _name,
+ string _symbol)
+ public
+ {
+ name_ = _name;
+ symbol_ = _symbol;
+ }
+
+ /**
+ * @dev Gets the token name
+ * @return string representing the token name
+ */
+ function name()
+ public
+ view
+ returns (string)
+ {
+ return name_;
+ }
+
+ /**
+ * @dev Gets the token symbol
+ * @return string representing the token symbol
+ */
+ function symbol()
+ public
+ view
+ returns (string)
+ {
+ return symbol_;
+ }
+
+ /**
+ * @dev Gets the balance of the specified address
+ * @param _owner address to query the balance of
+ * @return uint256 representing the amount owned by the passed address
+ */
+ function balanceOf(address _owner)
+ public
+ view
+ returns (uint256)
+ {
+ require(_owner != address(0));
+ return ownedTokensCount[_owner];
+ }
+
+ /**
+ * @dev Gets the owner of the specified token ID
+ * @param _tokenId uint256 ID of the token to query the owner of
+ * @return owner address currently marked as the owner of the given token ID
+ */
+ function ownerOf(uint256 _tokenId)
+ public
+ view
+ returns (address)
+ {
+ address owner = tokenOwner[_tokenId];
+ require(owner != address(0));
+ return owner;
+ }
+
+ /**
+ * @dev Returns whether the specified token exists
+ * @param _tokenId uint256 ID of the token to query the existance of
+ * @return whether the token exists
+ */
+ function exists(uint256 _tokenId)
+ public
+ view
+ returns (bool)
+ {
+ address owner = tokenOwner[_tokenId];
+ return owner != address(0);
+ }
+
+ /**
+ * @dev Approves another address to transfer the given token ID
+ * @dev The zero address indicates there is no approved address.
+ * @dev There can only be one approved address per token at a given time.
+ * @dev Can only be called by the token owner or an approved operator.
+ * @param _to address to be approved for the given token ID
+ * @param _tokenId uint256 ID of the token to be approved
+ */
+ function approve(address _to, uint256 _tokenId)
+ public
+ {
+ address owner = ownerOf(_tokenId);
+ require(_to != owner);
+ require(msg.sender == owner || isApprovedForAll(owner, msg.sender));
+
+ if (getApproved(_tokenId) != address(0) || _to != address(0)) {
+ tokenApprovals[_tokenId] = _to;
+ emit Approval(owner, _to, _tokenId);
+ }
+ }
+
+ /**
+ * @dev Gets the approved address for a token ID, or zero if no address set
+ * @param _tokenId uint256 ID of the token to query the approval of
+ * @return address currently approved for a the given token ID
+ */
+ function getApproved(uint256 _tokenId)
+ public
+ view
+ returns (address)
+ {
+ return tokenApprovals[_tokenId];
+ }
+
+ /**
+ * @dev Sets or unsets the approval of a given operator
+ * @dev An operator is allowed to transfer all tokens of the sender on their behalf
+ * @param _to operator address to set the approval
+ * @param _approved representing the status of the approval to be set
+ */
+ function setApprovalForAll(address _to, bool _approved)
+ public
+ {
+ require(_to != msg.sender);
+ operatorApprovals[msg.sender][_to] = _approved;
+ emit ApprovalForAll(msg.sender, _to, _approved);
+ }
+
+ /**
+ * @dev Tells whether an operator is approved by a given owner
+ * @param _owner owner address which you want to query the approval of
+ * @param _operator operator address which you want to query the approval of
+ * @return bool whether the given operator is approved by the given owner
+ */
+ function isApprovedForAll(address _owner, address _operator)
+ public
+ view
+ returns (bool)
+ {
+ return operatorApprovals[_owner][_operator];
+ }
+
+ /**
+ * @dev Transfers the ownership of a given token ID to another address
+ * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
+ * @dev Requires the msg sender to be the owner, approved, or operator
+ * @param _from current owner of the token
+ * @param _to address to receive the ownership of the given token ID
+ * @param _tokenId uint256 ID of the token to be transferred
+ */
+ function transferFrom(address _from, address _to, uint256 _tokenId)
+ public
+ canTransfer(_tokenId)
+ {
+ require(_from != address(0));
+ require(_to != address(0));
+
+ clearApproval(_from, _tokenId);
+ removeTokenFrom(_from, _tokenId);
+ addTokenTo(_to, _tokenId);
+
+ emit Transfer(_from, _to, _tokenId);
+ }
+
+ /**
+ * @dev Safely transfers the ownership of a given token ID to another address
+ * @dev If the target address is a contract, it must implement `onERC721Received`,
+ * which is called upon a safe transfer, and return the magic value
+ * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
+ * the transfer is reverted.
+ * @dev Requires the msg sender to be the owner, approved, or operator
+ * @param _from current owner of the token
+ * @param _to address to receive the ownership of the given token ID
+ * @param _tokenId uint256 ID of the token to be transferred
+ */
+ function safeTransferFrom(
+ address _from,
+ address _to,
+ uint256 _tokenId)
+ public
+ canTransfer(_tokenId)
+ {
+ // solium-disable-next-line arg-overflow
+ safeTransferFrom(_from, _to, _tokenId, "");
+ }
+
+ /**
+ * @dev Safely transfers the ownership of a given token ID to another address
+ * @dev If the target address is a contract, it must implement `onERC721Received`,
+ * which is called upon a safe transfer, and return the magic value
+ * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`; otherwise,
+ * the transfer is reverted.
+ * @dev Requires the msg sender to be the owner, approved, or operator
+ * @param _from current owner of the token
+ * @param _to address to receive the ownership of the given token ID
+ * @param _tokenId uint256 ID of the token to be transferred
+ * @param _data bytes data to send along with a safe transfer check
+ */
+ function safeTransferFrom(
+ address _from,
+ address _to,
+ uint256 _tokenId,
+ bytes _data)
+ public
+ canTransfer(_tokenId)
+ {
+ transferFrom(_from, _to, _tokenId);
+ // solium-disable-next-line arg-overflow
+ require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));
+ }
+
+ /**
+ * @dev Returns whether the given spender can transfer a given token ID
+ * @param _spender address of the spender to query
+ * @param _tokenId uint256 ID of the token to be transferred
+ * @return bool whether the msg.sender is approved for the given token ID,
+ * is an operator of the owner, or is the owner of the token
+ */
+ function isApprovedOrOwner(address _spender, uint256 _tokenId)
+ internal
+ view
+ returns (bool)
+ {
+ address owner = ownerOf(_tokenId);
+ return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);
+ }
+
+ /**
+ * @dev Internal function to mint a new token
+ * @dev Reverts if the given token ID already exists
+ * @param _to The address that will own the minted token
+ * @param _tokenId uint256 ID of the token to be minted by the msg.sender
+ */
+ function _mint(address _to, uint256 _tokenId)
+ internal
+ {
+ require(_to != address(0));
+ addTokenTo(_to, _tokenId);
+ emit Transfer(address(0), _to, _tokenId);
+ }
+
+ /**
+ * @dev Internal function to burn a specific token
+ * @dev Reverts if the token does not exist
+ * @param _tokenId uint256 ID of the token being burned by the msg.sender
+ */
+ function _burn(address _owner, uint256 _tokenId)
+ internal
+ {
+ clearApproval(_owner, _tokenId);
+ removeTokenFrom(_owner, _tokenId);
+ emit Transfer(_owner, address(0), _tokenId);
+ }
+
+ /**
+ * @dev Internal function to clear current approval of a given token ID
+ * @dev Reverts if the given address is not indeed the owner of the token
+ * @param _owner owner of the token
+ * @param _tokenId uint256 ID of the token to be transferred
+ */
+ function clearApproval(address _owner, uint256 _tokenId)
+ internal
+ {
+ require(ownerOf(_tokenId) == _owner);
+ if (tokenApprovals[_tokenId] != address(0)) {
+ tokenApprovals[_tokenId] = address(0);
+ emit Approval(_owner, address(0), _tokenId);
+ }
+ }
+
+ /**
+ * @dev Internal function to add a token ID to the list of a given address
+ * @param _to address representing the new owner of the given token ID
+ * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
+ */
+ function addTokenTo(address _to, uint256 _tokenId)
+ internal
+ {
+ require(tokenOwner[_tokenId] == address(0));
+ tokenOwner[_tokenId] = _to;
+ ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);
+ }
+
+ /**
+ * @dev Internal function to remove a token ID from the list of a given address
+ * @param _from address representing the previous owner of the given token ID
+ * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
+ */
+ function removeTokenFrom(address _from, uint256 _tokenId)
+ internal
+ {
+ require(ownerOf(_tokenId) == _from);
+ ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);
+ tokenOwner[_tokenId] = address(0);
+ }
+
+ /**
+ * @dev Internal function to invoke `onERC721Received` on a target address
+ * @dev The call is not executed if the target address is not a contract
+ * @param _from address representing the previous owner of the given token ID
+ * @param _to target address that will receive the tokens
+ * @param _tokenId uint256 ID of the token to be transferred
+ * @param _data bytes optional data to send along with the call
+ * @return whether the call correctly returned the expected magic value
+ */
+ function checkAndCallSafeTransfer(
+ address _from,
+ address _to,
+ uint256 _tokenId,
+ bytes _data)
+ internal
+ returns (bool)
+ {
+ if (!isContract(_to)) {
+ return true;
+ }
+ bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);
+ return (retval == ERC721_RECEIVED);
+ }
+
+ function isContract(address addr)
+ internal
+ view
+ returns (bool)
+ {
+ uint256 size;
+ // XXX Currently there is no better way to check if there is a contract in an address
+ // than to check the size of the code at that address.
+ // See https://ethereum.stackexchange.com/a/14016/36603
+ // for more details about how this works.
+ // TODO Check this again before the Serenity release, because all addresses will be
+ // contracts then.
+ assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly
+ return size > 0;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Receiver.sol b/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Receiver.sol
new file mode 100644
index 000000000..f2e8f3c88
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Receiver.sol
@@ -0,0 +1,61 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Smart Contract Solutions, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+pragma solidity 0.4.24;
+
+
+/**
+ * @title ERC721 token receiver interface
+ * @dev Interface for any contract that wants to support safeTransfers
+ * rom ERC721 asset contracts.
+ * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol
+ */
+contract IERC721Receiver {
+ /**
+ * @dev Magic value to be returned upon successful reception of an NFT
+ * Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
+ * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
+ */
+ bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;
+
+ /**
+ * @notice Handle the receipt of an NFT
+ * @dev The ERC721 smart contract calls this function on the recipient
+ * after a `safetransfer`. This function MAY throw to revert and reject the
+ * transfer. This function MUST use 50,000 gas or less. Return of other
+ * than the magic value MUST result in the transaction being reverted.
+ * Note: the contract address is always the message sender.
+ * @param _from The sending address
+ * @param _tokenId The NFT identifier which is being transfered
+ * @param _data Additional data with no specified format
+ * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
+ */
+ function onERC721Received(
+ address _from,
+ uint256 _tokenId,
+ bytes _data)
+ public
+ returns (bytes4);
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Token.sol b/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Token.sol
new file mode 100644
index 000000000..4d57ece38
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ERC721Token/IERC721Token.sol
@@ -0,0 +1,118 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Smart Contract Solutions, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+pragma solidity 0.4.24;
+
+
+/**
+ * @title ERC721 Non-Fungible Token Standard basic interface
+ * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
+ * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol
+ */
+contract IERC721Token {
+ string internal name_;
+ string internal symbol_;
+
+ event Transfer(
+ address indexed _from,
+ address indexed _to,
+ uint256 _tokenId
+ );
+
+ event Approval(
+ address indexed _owner,
+ address indexed _approved,
+ uint256 _tokenId
+ );
+
+ event ApprovalForAll(
+ address indexed _owner,
+ address indexed _operator,
+ bool _approved
+ );
+
+ function name()
+ public
+ view
+ returns (string);
+
+ function symbol()
+ public
+ view
+ returns (string);
+
+ function balanceOf(address _owner)
+ public
+ view
+ returns (uint256 _balance);
+
+ function ownerOf(uint256 _tokenId)
+ public
+ view
+ returns (address _owner);
+
+ function exists(uint256 _tokenId)
+ public
+ view
+ returns (bool _exists);
+
+ function approve(address _to, uint256 _tokenId)
+ public;
+
+ function getApproved(uint256 _tokenId)
+ public
+ view
+ returns (address _operator);
+
+ function setApprovalForAll(address _operator, bool _approved)
+ public;
+
+ function isApprovedForAll(address _owner, address _operator)
+ public
+ view
+ returns (bool);
+
+ function transferFrom(
+ address _from,
+ address _to,
+ uint256 _tokenId
+ )
+ public;
+
+ function safeTransferFrom(
+ address _from,
+ address _to,
+ uint256 _tokenId
+ )
+ public;
+
+ function safeTransferFrom(
+ address _from,
+ address _to,
+ uint256 _tokenId,
+ bytes _data
+ )
+ public;
+}
diff --git a/packages/contracts/src/2.0.0/tokens/EtherToken/IEtherToken.sol b/packages/contracts/src/2.0.0/tokens/EtherToken/IEtherToken.sol
new file mode 100644
index 000000000..9e2e68766
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/EtherToken/IEtherToken.sol
@@ -0,0 +1,33 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../ERC20Token/IERC20Token.sol";
+
+
+contract IEtherToken is
+ IERC20Token
+{
+ function deposit()
+ public
+ payable;
+
+ function withdraw(uint256 amount)
+ public;
+}
diff --git a/packages/contracts/src/2.0.0/tokens/EtherToken/WETH9.sol b/packages/contracts/src/2.0.0/tokens/EtherToken/WETH9.sol
new file mode 100644
index 000000000..17876b86d
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/EtherToken/WETH9.sol
@@ -0,0 +1,758 @@
+// Copyright (C) 2015, 2016, 2017 Dapphub
+
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+// solhint-disable
+pragma solidity ^0.4.18;
+
+
+contract WETH9 {
+ string public name = "Wrapped Ether";
+ string public symbol = "WETH";
+ uint8 public decimals = 18;
+
+ event Approval(address indexed _owner, address indexed _spender, uint _value);
+ event Transfer(address indexed _from, address indexed _to, uint _value);
+ event Deposit(address indexed _owner, uint _value);
+ event Withdrawal(address indexed _owner, uint _value);
+
+ mapping (address => uint) public balanceOf;
+ mapping (address => mapping (address => uint)) public allowance;
+
+ function() public payable {
+ deposit();
+ }
+ function deposit() public payable {
+ balanceOf[msg.sender] += msg.value;
+ Deposit(msg.sender, msg.value);
+ }
+ function withdraw(uint wad) public {
+ require(balanceOf[msg.sender] >= wad);
+ balanceOf[msg.sender] -= wad;
+ msg.sender.transfer(wad);
+ Withdrawal(msg.sender, wad);
+ }
+
+ function totalSupply() public view returns (uint) {
+ return this.balance;
+ }
+
+ function approve(address guy, uint wad) public returns (bool) {
+ allowance[msg.sender][guy] = wad;
+ Approval(msg.sender, guy, wad);
+ return true;
+ }
+
+ function transfer(address dst, uint wad) public returns (bool) {
+ return transferFrom(msg.sender, dst, wad);
+ }
+
+ function transferFrom(address src, address dst, uint wad)
+ public
+ returns (bool)
+ {
+ require(balanceOf[src] >= wad);
+
+ if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
+ require(allowance[src][msg.sender] >= wad);
+ allowance[src][msg.sender] -= wad;
+ }
+
+ balanceOf[src] -= wad;
+ balanceOf[dst] += wad;
+
+ Transfer(src, dst, wad);
+
+ return true;
+ }
+}
+
+
+/*
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+*/
diff --git a/packages/contracts/src/2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol b/packages/contracts/src/2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol
new file mode 100644
index 000000000..9feb5c914
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol
@@ -0,0 +1,58 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+import "../ERC20Token/ERC20Token.sol";
+
+
+contract UnlimitedAllowanceToken is ERC20Token {
+
+ uint256 constant internal MAX_UINT = 2**256 - 1;
+
+ /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717
+ /// @param _from Address to transfer from.
+ /// @param _to Address to transfer to.
+ /// @param _value Amount to transfer.
+ /// @return Success of transfer.
+ function transferFrom(address _from, address _to, uint256 _value)
+ public
+ returns (bool)
+ {
+ uint256 allowance = allowed[_from][msg.sender];
+ require(
+ balances[_from] >= _value,
+ "ERC20_INSUFFICIENT_BALANCE"
+ );
+ require(
+ allowance >= _value,
+ "ERC20_INSUFFICIENT_ALLOWANCE"
+ );
+ require(
+ balances[_to] + _value >= balances[_to],
+ "OVERFLOW"
+ );
+ balances[_to] += _value;
+ balances[_from] -= _value;
+ if (allowance < MAX_UINT) {
+ allowed[_from][msg.sender] -= _value;
+ }
+ emit Transfer(_from, _to, _value);
+ return true;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/tokens/ZRXToken/ZRXToken.sol b/packages/contracts/src/2.0.0/tokens/ZRXToken/ZRXToken.sol
new file mode 100644
index 000000000..28c0b2fb3
--- /dev/null
+++ b/packages/contracts/src/2.0.0/tokens/ZRXToken/ZRXToken.sol
@@ -0,0 +1,39 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.11;
+
+// solhint-disable-next-line max-line-length
+import { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from "../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol";
+
+
+contract ZRXToken is UnlimitedAllowanceToken {
+
+ // solhint-disable const-name-snakecase
+ uint8 constant public decimals = 18;
+ uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places
+ string constant public name = "0x Protocol Token";
+ string constant public symbol = "ZRX";
+ // solhint-enableconst-name-snakecase
+
+ function ZRXToken()
+ public
+ {
+ balances[msg.sender] = totalSupply;
+ }
+}
diff --git a/packages/contracts/src/2.0.0/utils/LibBytes/LibBytes.sol b/packages/contracts/src/2.0.0/utils/LibBytes/LibBytes.sol
new file mode 100644
index 000000000..504e950a8
--- /dev/null
+++ b/packages/contracts/src/2.0.0/utils/LibBytes/LibBytes.sol
@@ -0,0 +1,560 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity 0.4.24;
+
+
+library LibBytes {
+
+ using LibBytes for bytes;
+
+ /// @dev Gets the memory address for a byte array.
+ /// @param input Byte array to lookup.
+ /// @return memoryAddress Memory address of byte array. This
+ /// points to the header of the byte array which contains
+ /// the length.
+ function rawAddress(bytes memory input)
+ internal
+ pure
+ returns (uint256 memoryAddress)
+ {
+ assembly {
+ memoryAddress := input
+ }
+ return memoryAddress;
+ }
+
+ /// @dev Gets the memory address for the contents of a byte array.
+ /// @param input Byte array to lookup.
+ /// @return memoryAddress Memory address of the contents of the byte array.
+ function contentAddress(bytes memory input)
+ internal
+ pure
+ returns (uint256 memoryAddress)
+ {
+ assembly {
+ memoryAddress := add(input, 32)
+ }
+ return memoryAddress;
+ }
+
+ /// @dev Copies `length` bytes from memory location `source` to `dest`.
+ /// @param dest memory address to copy bytes to.
+ /// @param source memory address to copy bytes from.
+ /// @param length number of bytes to copy.
+ function memCopy(
+ uint256 dest,
+ uint256 source,
+ uint256 length
+ )
+ internal
+ pure
+ {
+ if (length < 32) {
+ // Handle a partial word by reading destination and masking
+ // off the bits we are interested in.
+ // This correctly handles overlap, zero lengths and source == dest
+ assembly {
+ let mask := sub(exp(256, sub(32, length)), 1)
+ let s := and(mload(source), not(mask))
+ let d := and(mload(dest), mask)
+ mstore(dest, or(s, d))
+ }
+ } else {
+ // Skip the O(length) loop when source == dest.
+ if (source == dest) {
+ return;
+ }
+
+ // For large copies we copy whole words at a time. The final
+ // word is aligned to the end of the range (instead of after the
+ // previous) to handle partial words. So a copy will look like this:
+ //
+ // ####
+ // ####
+ // ####
+ // ####
+ //
+ // We handle overlap in the source and destination range by
+ // changing the copying direction. This prevents us from
+ // overwriting parts of source that we still need to copy.
+ //
+ // This correctly handles source == dest
+ //
+ if (source > dest) {
+ assembly {
+ // We subtract 32 from `sEnd` and `dEnd` because it
+ // is easier to compare with in the loop, and these
+ // are also the addresses we need for copying the
+ // last bytes.
+ length := sub(length, 32)
+ let sEnd := add(source, length)
+ let dEnd := add(dest, length)
+
+ // Remember the last 32 bytes of source
+ // This needs to be done here and not after the loop
+ // because we may have overwritten the last bytes in
+ // source already due to overlap.
+ let last := mload(sEnd)
+
+ // Copy whole words front to back
+ // Note: the first check is always true,
+ // this could have been a do-while loop.
+ // solhint-disable-next-line no-empty-blocks
+ for {} lt(source, sEnd) {} {
+ mstore(dest, mload(source))
+ source := add(source, 32)
+ dest := add(dest, 32)
+ }
+
+ // Write the last 32 bytes
+ mstore(dEnd, last)
+ }
+ } else {
+ assembly {
+ // We subtract 32 from `sEnd` and `dEnd` because those
+ // are the starting points when copying a word at the end.
+ length := sub(length, 32)
+ let sEnd := add(source, length)
+ let dEnd := add(dest, length)
+
+ // Remember the first 32 bytes of source
+ // This needs to be done here and not after the loop
+ // because we may have overwritten the first bytes in
+ // source already due to overlap.
+ let first := mload(source)
+
+ // Copy whole words back to front
+ // We use a signed comparisson here to allow dEnd to become
+ // negative (happens when source and dest < 32). Valid
+ // addresses in local memory will never be larger than
+ // 2**255, so they can be safely re-interpreted as signed.
+ // Note: the first check is always true,
+ // this could have been a do-while loop.
+ // solhint-disable-next-line no-empty-blocks
+ for {} slt(dest, dEnd) {} {
+ mstore(dEnd, mload(sEnd))
+ sEnd := sub(sEnd, 32)
+ dEnd := sub(dEnd, 32)
+ }
+
+ // Write the first 32 bytes
+ mstore(dest, first)
+ }
+ }
+ }
+ }
+
+ /// @dev Returns a slices from a byte array.
+ /// @param b The byte array to take a slice from.
+ /// @param from The starting index for the slice (inclusive).
+ /// @param to The final index for the slice (exclusive).
+ /// @return result The slice containing bytes at indices [from, to)
+ function slice(
+ bytes memory b,
+ uint256 from,
+ uint256 to
+ )
+ internal
+ pure
+ returns (bytes memory result)
+ {
+ require(
+ from <= to,
+ "FROM_LESS_THAN_TO_REQUIRED"
+ );
+ require(
+ to < b.length,
+ "TO_LESS_THAN_LENGTH_REQUIRED"
+ );
+
+ // Create a new bytes structure and copy contents
+ result = new bytes(to - from);
+ memCopy(
+ result.contentAddress(),
+ b.contentAddress() + from,
+ result.length);
+ return result;
+ }
+
+ /// @dev Returns a slice from a byte array without preserving the input.
+ /// @param b The byte array to take a slice from. Will be destroyed in the process.
+ /// @param from The starting index for the slice (inclusive).
+ /// @param to The final index for the slice (exclusive).
+ /// @return result The slice containing bytes at indices [from, to)
+ /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.
+ function sliceDestructive(
+ bytes memory b,
+ uint256 from,
+ uint256 to
+ )
+ internal
+ pure
+ returns (bytes memory result)
+ {
+ require(
+ from <= to,
+ "FROM_LESS_THAN_TO_REQUIRED"
+ );
+ require(
+ to < b.length,
+ "TO_LESS_THAN_LENGTH_REQUIRED"
+ );
+
+ // Create a new bytes structure around [from, to) in-place.
+ assembly {
+ result := add(b, from)
+ mstore(result, sub(to, from))
+ }
+ return result;
+ }
+
+ /// @dev Pops the last byte off of a byte array by modifying its length.
+ /// @param b Byte array that will be modified.
+ /// @return The byte that was popped off.
+ function popLastByte(bytes memory b)
+ internal
+ pure
+ returns (bytes1 result)
+ {
+ require(
+ b.length > 0,
+ "GREATER_THAN_ZERO_LENGTH_REQUIRED"
+ );
+
+ // Store last byte.
+ result = b[b.length - 1];
+
+ assembly {
+ // Decrement length of byte array.
+ let newLen := sub(mload(b), 1)
+ mstore(b, newLen)
+ }
+ return result;
+ }
+
+ /// @dev Pops the last 20 bytes off of a byte array by modifying its length.
+ /// @param b Byte array that will be modified.
+ /// @return The 20 byte address that was popped off.
+ function popLast20Bytes(bytes memory b)
+ internal
+ pure
+ returns (address result)
+ {
+ require(
+ b.length >= 20,
+ "GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED"
+ );
+
+ // Store last 20 bytes.
+ result = readAddress(b, b.length - 20);
+
+ assembly {
+ // Subtract 20 from byte array length.
+ let newLen := sub(mload(b), 20)
+ mstore(b, newLen)
+ }
+ return result;
+ }
+
+ /// @dev Tests equality of two byte arrays.
+ /// @param lhs First byte array to compare.
+ /// @param rhs Second byte array to compare.
+ /// @return True if arrays are the same. False otherwise.
+ function equals(
+ bytes memory lhs,
+ bytes memory rhs
+ )
+ internal
+ pure
+ returns (bool equal)
+ {
+ // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.
+ // We early exit on unequal lengths, but keccak would also correctly
+ // handle this.
+ return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);
+ }
+
+ /// @dev Reads an address from a position in a byte array.
+ /// @param b Byte array containing an address.
+ /// @param index Index in byte array of address.
+ /// @return address from byte array.
+ function readAddress(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ pure
+ returns (address result)
+ {
+ require(
+ b.length >= index + 20, // 20 is length of address
+ "GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED"
+ );
+
+ // Add offset to index:
+ // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
+ // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
+ index += 20;
+
+ // Read address from array memory
+ assembly {
+ // 1. Add index to address of bytes array
+ // 2. Load 32-byte word from memory
+ // 3. Apply 20-byte mask to obtain address
+ result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)
+ }
+ return result;
+ }
+
+ /// @dev Writes an address into a specific position in a byte array.
+ /// @param b Byte array to insert address into.
+ /// @param index Index in byte array of address.
+ /// @param input Address to put into byte array.
+ function writeAddress(
+ bytes memory b,
+ uint256 index,
+ address input
+ )
+ internal
+ pure
+ {
+ require(
+ b.length >= index + 20, // 20 is length of address
+ "GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED"
+ );
+
+ // Add offset to index:
+ // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
+ // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
+ index += 20;
+
+ // Store address into array memory
+ assembly {
+ // The address occupies 20 bytes and mstore stores 32 bytes.
+ // First fetch the 32-byte word where we'll be storing the address, then
+ // apply a mask so we have only the bytes in the word that the address will not occupy.
+ // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.
+
+ // 1. Add index to address of bytes array
+ // 2. Load 32-byte word from memory
+ // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address
+ let neighbors := and(
+ mload(add(b, index)),
+ 0xffffffffffffffffffffffff0000000000000000000000000000000000000000
+ )
+
+ // Make sure input address is clean.
+ // (Solidity does not guarantee this)
+ input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)
+
+ // Store the neighbors and address into memory
+ mstore(add(b, index), xor(input, neighbors))
+ }
+ }
+
+ /// @dev Reads a bytes32 value from a position in a byte array.
+ /// @param b Byte array containing a bytes32 value.
+ /// @param index Index in byte array of bytes32 value.
+ /// @return bytes32 value from byte array.
+ function readBytes32(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ pure
+ returns (bytes32 result)
+ {
+ require(
+ b.length >= index + 32,
+ "GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED"
+ );
+
+ // Arrays are prefixed by a 256 bit length parameter
+ index += 32;
+
+ // Read the bytes32 from array memory
+ assembly {
+ result := mload(add(b, index))
+ }
+ return result;
+ }
+
+ /// @dev Writes a bytes32 into a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input bytes32 to put into byte array.
+ function writeBytes32(
+ bytes memory b,
+ uint256 index,
+ bytes32 input
+ )
+ internal
+ pure
+ {
+ require(
+ b.length >= index + 32,
+ "GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED"
+ );
+
+ // Arrays are prefixed by a 256 bit length parameter
+ index += 32;
+
+ // Read the bytes32 from array memory
+ assembly {
+ mstore(add(b, index), input)
+ }
+ }
+
+ /// @dev Reads a uint256 value from a position in a byte array.
+ /// @param b Byte array containing a uint256 value.
+ /// @param index Index in byte array of uint256 value.
+ /// @return uint256 value from byte array.
+ function readUint256(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ pure
+ returns (uint256 result)
+ {
+ return uint256(readBytes32(b, index));
+ }
+
+ /// @dev Writes a uint256 into a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input uint256 to put into byte array.
+ function writeUint256(
+ bytes memory b,
+ uint256 index,
+ uint256 input
+ )
+ internal
+ pure
+ {
+ writeBytes32(b, index, bytes32(input));
+ }
+
+ /// @dev Reads an unpadded bytes4 value from a position in a byte array.
+ /// @param b Byte array containing a bytes4 value.
+ /// @param index Index in byte array of bytes4 value.
+ /// @return bytes4 value from byte array.
+ function readBytes4(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ pure
+ returns (bytes4 result)
+ {
+ require(
+ b.length >= index + 4,
+ "GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED"
+ );
+ assembly {
+ result := mload(add(b, 32))
+ // Solidity does not require us to clean the trailing bytes.
+ // We do it anyway
+ result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
+ }
+ return result;
+ }
+
+ /// @dev Reads nested bytes from a specific position.
+ /// @dev NOTE: the returned value overlaps with the input value.
+ /// Both should be treated as immutable.
+ /// @param b Byte array containing nested bytes.
+ /// @param index Index of nested bytes.
+ /// @return result Nested bytes.
+ function readBytesWithLength(
+ bytes memory b,
+ uint256 index
+ )
+ internal
+ pure
+ returns (bytes memory result)
+ {
+ // Read length of nested bytes
+ uint256 nestedBytesLength = readUint256(b, index);
+ index += 32;
+
+ // Assert length of <b> is valid, given
+ // length of nested bytes
+ require(
+ b.length >= index + nestedBytesLength,
+ "GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED"
+ );
+
+ // Return a pointer to the byte array as it exists inside `b`
+ assembly {
+ result := add(b, index)
+ }
+ return result;
+ }
+
+ /// @dev Inserts bytes at a specific position in a byte array.
+ /// @param b Byte array to insert <input> into.
+ /// @param index Index in byte array of <input>.
+ /// @param input bytes to insert.
+ function writeBytesWithLength(
+ bytes memory b,
+ uint256 index,
+ bytes memory input
+ )
+ internal
+ pure
+ {
+ // Assert length of <b> is valid, given
+ // length of input
+ require(
+ b.length >= index + 32 + input.length, // 32 bytes to store length
+ "GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED"
+ );
+
+ // Copy <input> into <b>
+ memCopy(
+ b.contentAddress() + index,
+ input.rawAddress(), // includes length of <input>
+ input.length + 32 // +32 bytes to store <input> length
+ );
+ }
+
+ /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.
+ /// @param dest Byte array that will be overwritten with source bytes.
+ /// @param source Byte array to copy onto dest bytes.
+ function deepCopyBytes(
+ bytes memory dest,
+ bytes memory source
+ )
+ internal
+ pure
+ {
+ uint256 sourceLen = source.length;
+ // Dest length must be >= source length, or some bytes would not be copied.
+ require(
+ dest.length >= sourceLen,
+ "GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED"
+ );
+ memCopy(
+ dest.contentAddress(),
+ source.contentAddress(),
+ sourceLen
+ );
+ }
+}
diff --git a/packages/contracts/src/2.0.0/utils/Ownable/IOwnable.sol b/packages/contracts/src/2.0.0/utils/Ownable/IOwnable.sol
new file mode 100644
index 000000000..116b8dc89
--- /dev/null
+++ b/packages/contracts/src/2.0.0/utils/Ownable/IOwnable.sol
@@ -0,0 +1,13 @@
+pragma solidity 0.4.24;
+
+/*
+ * Ownable
+ *
+ * Base contract with an owner.
+ * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
+ */
+
+contract IOwnable {
+ function transferOwnership(address newOwner)
+ public;
+}
diff --git a/packages/contracts/src/2.0.0/utils/Ownable/Ownable.sol b/packages/contracts/src/2.0.0/utils/Ownable/Ownable.sol
new file mode 100644
index 000000000..aca65aad2
--- /dev/null
+++ b/packages/contracts/src/2.0.0/utils/Ownable/Ownable.sol
@@ -0,0 +1,38 @@
+pragma solidity 0.4.24;
+
+/*
+ * Ownable
+ *
+ * Base contract with an owner.
+ * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
+ */
+
+import "./IOwnable.sol";
+
+
+contract Ownable is IOwnable {
+ address public owner;
+
+ constructor ()
+ public
+ {
+ owner = msg.sender;
+ }
+
+ modifier onlyOwner() {
+ require(
+ msg.sender == owner,
+ "ONLY_CONTRACT_OWNER"
+ );
+ _;
+ }
+
+ function transferOwnership(address newOwner)
+ public
+ onlyOwner
+ {
+ if (newOwner != address(0)) {
+ owner = newOwner;
+ }
+ }
+}
diff --git a/packages/contracts/src/2.0.0/utils/SafeMath/SafeMath.sol b/packages/contracts/src/2.0.0/utils/SafeMath/SafeMath.sol
new file mode 100644
index 000000000..63a2a085f
--- /dev/null
+++ b/packages/contracts/src/2.0.0/utils/SafeMath/SafeMath.sol
@@ -0,0 +1,86 @@
+pragma solidity 0.4.24;
+
+
+contract SafeMath {
+ function safeMul(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ if (a == 0) {
+ return 0;
+ }
+ uint256 c = a * b;
+ require(
+ c / a == b,
+ "UINT256_OVERFLOW"
+ );
+ return c;
+ }
+
+ function safeDiv(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ uint256 c = a / b;
+ return c;
+ }
+
+ function safeSub(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ require(
+ b <= a,
+ "UINT256_UNDERFLOW"
+ );
+ return a - b;
+ }
+
+ function safeAdd(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ uint256 c = a + b;
+ require(
+ c >= a,
+ "UINT256_OVERFLOW"
+ );
+ return c;
+ }
+
+ function max64(uint64 a, uint64 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ return a >= b ? a : b;
+ }
+
+ function min64(uint64 a, uint64 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ return a < b ? a : b;
+ }
+
+ function max256(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ return a >= b ? a : b;
+ }
+
+ function min256(uint256 a, uint256 b)
+ internal
+ pure
+ returns (uint256)
+ {
+ return a < b ? a : b;
+ }
+}
diff --git a/packages/contracts/src/contracts/current/multisig/MultiSigWallet/MultiSigWallet.sol b/packages/contracts/src/contracts/current/multisig/MultiSigWallet/MultiSigWallet.sol
deleted file mode 100644
index 79fd92029..000000000
--- a/packages/contracts/src/contracts/current/multisig/MultiSigWallet/MultiSigWallet.sol
+++ /dev/null
@@ -1,365 +0,0 @@
-pragma solidity ^0.4.10;
-
-/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
-/// @author Stefan George - <stefan.george@consensys.net>
-contract MultiSigWallet {
-
- uint constant public MAX_OWNER_COUNT = 50;
-
- event Confirmation(address indexed sender, uint indexed transactionId);
- event Revocation(address indexed sender, uint indexed transactionId);
- event Submission(uint indexed transactionId);
- event Execution(uint indexed transactionId);
- event ExecutionFailure(uint indexed transactionId);
- event Deposit(address indexed sender, uint value);
- event OwnerAddition(address indexed owner);
- event OwnerRemoval(address indexed owner);
- event RequirementChange(uint required);
-
- mapping (uint => Transaction) public transactions;
- mapping (uint => mapping (address => bool)) public confirmations;
- mapping (address => bool) public isOwner;
- address[] public owners;
- uint public required;
- uint public transactionCount;
-
- struct Transaction {
- address destination;
- uint value;
- bytes data;
- bool executed;
- }
-
- modifier onlyWallet() {
- if (msg.sender != address(this))
- throw;
- _;
- }
-
- modifier ownerDoesNotExist(address owner) {
- if (isOwner[owner])
- throw;
- _;
- }
-
- modifier ownerExists(address owner) {
- if (!isOwner[owner])
- throw;
- _;
- }
-
- modifier transactionExists(uint transactionId) {
- if (transactions[transactionId].destination == 0)
- throw;
- _;
- }
-
- modifier confirmed(uint transactionId, address owner) {
- if (!confirmations[transactionId][owner])
- throw;
- _;
- }
-
- modifier notConfirmed(uint transactionId, address owner) {
- if (confirmations[transactionId][owner])
- throw;
- _;
- }
-
- modifier notExecuted(uint transactionId) {
- if (transactions[transactionId].executed)
- throw;
- _;
- }
-
- modifier notNull(address _address) {
- if (_address == 0)
- throw;
- _;
- }
-
- modifier validRequirement(uint ownerCount, uint _required) {
- if ( ownerCount > MAX_OWNER_COUNT
- || _required > ownerCount
- || _required == 0
- || ownerCount == 0)
- throw;
- _;
- }
-
- /// @dev Fallback function allows to deposit ether.
- function()
- payable
- {
- if (msg.value > 0)
- Deposit(msg.sender, msg.value);
- }
-
- /*
- * Public functions
- */
- /// @dev Contract constructor sets initial owners and required number of confirmations.
- /// @param _owners List of initial owners.
- /// @param _required Number of required confirmations.
- function MultiSigWallet(address[] _owners, uint _required)
- public
- validRequirement(_owners.length, _required)
- {
- for (uint i=0; i<_owners.length; i++) {
- if (isOwner[_owners[i]] || _owners[i] == 0)
- throw;
- isOwner[_owners[i]] = true;
- }
- owners = _owners;
- required = _required;
- }
-
- /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
- /// @param owner Address of new owner.
- function addOwner(address owner)
- public
- onlyWallet
- ownerDoesNotExist(owner)
- notNull(owner)
- validRequirement(owners.length + 1, required)
- {
- isOwner[owner] = true;
- owners.push(owner);
- OwnerAddition(owner);
- }
-
- /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
- /// @param owner Address of owner.
- function removeOwner(address owner)
- public
- onlyWallet
- ownerExists(owner)
- {
- isOwner[owner] = false;
- for (uint i=0; i<owners.length - 1; i++)
- if (owners[i] == owner) {
- owners[i] = owners[owners.length - 1];
- break;
- }
- owners.length -= 1;
- if (required > owners.length)
- changeRequirement(owners.length);
- OwnerRemoval(owner);
- }
-
- /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
- /// @param owner Address of owner to be replaced.
- /// @param owner Address of new owner.
- function replaceOwner(address owner, address newOwner)
- public
- onlyWallet
- ownerExists(owner)
- ownerDoesNotExist(newOwner)
- {
- for (uint i=0; i<owners.length; i++)
- if (owners[i] == owner) {
- owners[i] = newOwner;
- break;
- }
- isOwner[owner] = false;
- isOwner[newOwner] = true;
- OwnerRemoval(owner);
- OwnerAddition(newOwner);
- }
-
- /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
- /// @param _required Number of required confirmations.
- function changeRequirement(uint _required)
- public
- onlyWallet
- validRequirement(owners.length, _required)
- {
- required = _required;
- RequirementChange(_required);
- }
-
- /// @dev Allows an owner to submit and confirm a transaction.
- /// @param destination Transaction target address.
- /// @param value Transaction ether value.
- /// @param data Transaction data payload.
- /// @return Returns transaction ID.
- function submitTransaction(address destination, uint value, bytes data)
- public
- returns (uint transactionId)
- {
- transactionId = addTransaction(destination, value, data);
- confirmTransaction(transactionId);
- }
-
- /// @dev Allows an owner to confirm a transaction.
- /// @param transactionId Transaction ID.
- function confirmTransaction(uint transactionId)
- public
- ownerExists(msg.sender)
- transactionExists(transactionId)
- notConfirmed(transactionId, msg.sender)
- {
- confirmations[transactionId][msg.sender] = true;
- Confirmation(msg.sender, transactionId);
- executeTransaction(transactionId);
- }
-
- /// @dev Allows an owner to revoke a confirmation for a transaction.
- /// @param transactionId Transaction ID.
- function revokeConfirmation(uint transactionId)
- public
- ownerExists(msg.sender)
- confirmed(transactionId, msg.sender)
- notExecuted(transactionId)
- {
- confirmations[transactionId][msg.sender] = false;
- Revocation(msg.sender, transactionId);
- }
-
- /// @dev Allows anyone to execute a confirmed transaction.
- /// @param transactionId Transaction ID.
- function executeTransaction(uint transactionId)
- public
- notExecuted(transactionId)
- {
- if (isConfirmed(transactionId)) {
- Transaction tx = transactions[transactionId];
- tx.executed = true;
- if (tx.destination.call.value(tx.value)(tx.data))
- Execution(transactionId);
- else {
- ExecutionFailure(transactionId);
- tx.executed = false;
- }
- }
- }
-
- /// @dev Returns the confirmation status of a transaction.
- /// @param transactionId Transaction ID.
- /// @return Confirmation status.
- function isConfirmed(uint transactionId)
- public
- constant
- returns (bool)
- {
- uint count = 0;
- for (uint i=0; i<owners.length; i++) {
- if (confirmations[transactionId][owners[i]])
- count += 1;
- if (count == required)
- return true;
- }
- }
-
- /*
- * Internal functions
- */
- /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
- /// @param destination Transaction target address.
- /// @param value Transaction ether value.
- /// @param data Transaction data payload.
- /// @return Returns transaction ID.
- function addTransaction(address destination, uint value, bytes data)
- internal
- notNull(destination)
- returns (uint transactionId)
- {
- transactionId = transactionCount;
- transactions[transactionId] = Transaction({
- destination: destination,
- value: value,
- data: data,
- executed: false
- });
- transactionCount += 1;
- Submission(transactionId);
- }
-
- /*
- * Web3 call functions
- */
- /// @dev Returns number of confirmations of a transaction.
- /// @param transactionId Transaction ID.
- /// @return Number of confirmations.
- function getConfirmationCount(uint transactionId)
- public
- constant
- returns (uint count)
- {
- for (uint i=0; i<owners.length; i++)
- if (confirmations[transactionId][owners[i]])
- count += 1;
- }
-
- /// @dev Returns total number of transactions after filers are applied.
- /// @param pending Include pending transactions.
- /// @param executed Include executed transactions.
- /// @return Total number of transactions after filters are applied.
- function getTransactionCount(bool pending, bool executed)
- public
- constant
- returns (uint count)
- {
- for (uint i=0; i<transactionCount; i++)
- if ( pending && !transactions[i].executed
- || executed && transactions[i].executed)
- count += 1;
- }
-
- /// @dev Returns list of owners.
- /// @return List of owner addresses.
- function getOwners()
- public
- constant
- returns (address[])
- {
- return owners;
- }
-
- /// @dev Returns array with owner addresses, which confirmed transaction.
- /// @param transactionId Transaction ID.
- /// @return Returns array of owner addresses.
- function getConfirmations(uint transactionId)
- public
- constant
- returns (address[] _confirmations)
- {
- address[] memory confirmationsTemp = new address[](owners.length);
- uint count = 0;
- uint i;
- for (i=0; i<owners.length; i++)
- if (confirmations[transactionId][owners[i]]) {
- confirmationsTemp[count] = owners[i];
- count += 1;
- }
- _confirmations = new address[](count);
- for (i=0; i<count; i++)
- _confirmations[i] = confirmationsTemp[i];
- }
-
- /// @dev Returns list of transaction IDs in defined range.
- /// @param from Index start position of transaction array.
- /// @param to Index end position of transaction array.
- /// @param pending Include pending transactions.
- /// @param executed Include executed transactions.
- /// @return Returns array of transaction IDs.
- function getTransactionIds(uint from, uint to, bool pending, bool executed)
- public
- constant
- returns (uint[] _transactionIds)
- {
- uint[] memory transactionIdsTemp = new uint[](transactionCount);
- uint count = 0;
- uint i;
- for (i=0; i<transactionCount; i++)
- if ( pending && !transactions[i].executed
- || executed && transactions[i].executed)
- {
- transactionIdsTemp[count] = i;
- count += 1;
- }
- _transactionIds = new uint[](to - from);
- for (i=from; i<to; i++)
- _transactionIds[i - from] = transactionIdsTemp[i];
- }
-}
diff --git a/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol b/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol
deleted file mode 100644
index a545d9813..000000000
--- a/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.10;
-
-import { MultiSigWallet } from "../MultiSigWallet/MultiSigWallet.sol";
-
-/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.
-/// @author Amir Bandeali - <amir@0xProject.com>
-contract MultiSigWalletWithTimeLock is MultiSigWallet {
-
- event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);
- event TimeLockChange(uint secondsTimeLocked);
-
- uint public secondsTimeLocked;
-
- mapping (uint => uint) public confirmationTimes;
-
- modifier notFullyConfirmed(uint transactionId) {
- require(!isConfirmed(transactionId));
- _;
- }
-
- modifier fullyConfirmed(uint transactionId) {
- require(isConfirmed(transactionId));
- _;
- }
-
- modifier pastTimeLock(uint transactionId) {
- require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);
- _;
- }
-
- /*
- * Public functions
- */
-
- /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.
- /// @param _owners List of initial owners.
- /// @param _required Number of required confirmations.
- /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
- function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)
- public
- MultiSigWallet(_owners, _required)
- {
- secondsTimeLocked = _secondsTimeLocked;
- }
-
- /// @dev Changes the duration of the time lock for transactions.
- /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
- function changeTimeLock(uint _secondsTimeLocked)
- public
- onlyWallet
- {
- secondsTimeLocked = _secondsTimeLocked;
- TimeLockChange(_secondsTimeLocked);
- }
-
- /// @dev Allows an owner to confirm a transaction.
- /// @param transactionId Transaction ID.
- function confirmTransaction(uint transactionId)
- public
- ownerExists(msg.sender)
- transactionExists(transactionId)
- notConfirmed(transactionId, msg.sender)
- notFullyConfirmed(transactionId)
- {
- confirmations[transactionId][msg.sender] = true;
- Confirmation(msg.sender, transactionId);
- if (isConfirmed(transactionId)) {
- setConfirmationTime(transactionId, block.timestamp);
- }
- }
-
- /// @dev Allows an owner to revoke a confirmation for a transaction.
- /// @param transactionId Transaction ID.
- function revokeConfirmation(uint transactionId)
- public
- ownerExists(msg.sender)
- confirmed(transactionId, msg.sender)
- notExecuted(transactionId)
- notFullyConfirmed(transactionId)
- {
- confirmations[transactionId][msg.sender] = false;
- Revocation(msg.sender, transactionId);
- }
-
- /// @dev Allows anyone to execute a confirmed transaction.
- /// @param transactionId Transaction ID.
- function executeTransaction(uint transactionId)
- public
- notExecuted(transactionId)
- fullyConfirmed(transactionId)
- pastTimeLock(transactionId)
- {
- Transaction storage tx = transactions[transactionId];
- tx.executed = true;
- if (tx.destination.call.value(tx.value)(tx.data))
- Execution(transactionId);
- else {
- ExecutionFailure(transactionId);
- tx.executed = false;
- }
- }
-
- /*
- * Internal functions
- */
-
- /// @dev Sets the time of when a submission first passed.
- function setConfirmationTime(uint transactionId, uint confirmationTime)
- internal
- {
- confirmationTimes[transactionId] = confirmationTime;
- ConfirmationTimeSet(transactionId, confirmationTime);
- }
-}
diff --git a/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol b/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol
deleted file mode 100644
index 3c6a3d2ef..000000000
--- a/packages/contracts/src/contracts/current/multisig/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.10;
-
-import { MultiSigWalletWithTimeLock } from "../MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol";
-
-contract MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress is MultiSigWalletWithTimeLock {
-
- address public TOKEN_TRANSFER_PROXY_CONTRACT;
-
- modifier validRemoveAuthorizedAddressTx(uint transactionId) {
- Transaction storage tx = transactions[transactionId];
- require(tx.destination == TOKEN_TRANSFER_PROXY_CONTRACT);
- require(isFunctionRemoveAuthorizedAddress(tx.data));
- _;
- }
-
- /// @dev Contract constructor sets initial owners, required number of confirmations, time lock, and tokenTransferProxy address.
- /// @param _owners List of initial owners.
- /// @param _required Number of required confirmations.
- /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
- /// @param _tokenTransferProxy Address of TokenTransferProxy contract.
- function MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(
- address[] _owners,
- uint _required,
- uint _secondsTimeLocked,
- address _tokenTransferProxy)
- public
- MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)
- {
- TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
- }
-
- /// @dev Allows execution of removeAuthorizedAddress without time lock.
- /// @param transactionId Transaction ID.
- function executeRemoveAuthorizedAddress(uint transactionId)
- public
- notExecuted(transactionId)
- fullyConfirmed(transactionId)
- validRemoveAuthorizedAddressTx(transactionId)
- {
- Transaction storage tx = transactions[transactionId];
- tx.executed = true;
- if (tx.destination.call.value(tx.value)(tx.data))
- Execution(transactionId);
- else {
- ExecutionFailure(transactionId);
- tx.executed = false;
- }
- }
-
- /// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function signature.
- /// @param data Transaction data.
- /// @return Successful if data is a call to removeAuthorizedAddress.
- function isFunctionRemoveAuthorizedAddress(bytes data)
- public
- constant
- returns (bool)
- {
- bytes4 removeAuthorizedAddressSignature = bytes4(sha3("removeAuthorizedAddress(address)"));
- for (uint i = 0; i < 4; i++) {
- require(data[i] == removeAuthorizedAddressSignature[i]);
- }
- return true;
- }
-}
diff --git a/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol b/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol
deleted file mode 100644
index 8dacf797c..000000000
--- a/packages/contracts/src/contracts/current/protocol/Exchange/Exchange.sol
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.14;
-
-import { TokenTransferProxy } from "../TokenTransferProxy/TokenTransferProxy.sol";
-import { Token_v1 as Token } from "../../../previous/Token/Token_v1.sol";
-import { SafeMath_v1 as SafeMath } from "../../../previous/SafeMath/SafeMath_v1.sol";
-
-/// @title Exchange - Facilitates exchange of ERC20 tokens.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract Exchange is SafeMath {
-
- // Error Codes
- enum Errors {
- ORDER_EXPIRED, // Order has already expired
- ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
- ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
- INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
- }
-
- string constant public VERSION = "1.0.0";
- uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas
-
- address public ZRX_TOKEN_CONTRACT;
- address public TOKEN_TRANSFER_PROXY_CONTRACT;
-
- // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
- mapping (bytes32 => uint) public filled;
- mapping (bytes32 => uint) public cancelled;
-
- event LogFill(
- address indexed maker,
- address taker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint filledMakerTokenAmount,
- uint filledTakerTokenAmount,
- uint paidMakerFee,
- uint paidTakerFee,
- bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
- bytes32 orderHash
- );
-
- event LogCancel(
- address indexed maker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint cancelledMakerTokenAmount,
- uint cancelledTakerTokenAmount,
- bytes32 indexed tokens,
- bytes32 orderHash
- );
-
- event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
-
- struct Order {
- address maker;
- address taker;
- address makerToken;
- address takerToken;
- address feeRecipient;
- uint makerTokenAmount;
- uint takerTokenAmount;
- uint makerFee;
- uint takerFee;
- uint expirationTimestampInSec;
- bytes32 orderHash;
- }
-
- function Exchange(address _zrxToken, address _tokenTransferProxy) {
- ZRX_TOKEN_CONTRACT = _zrxToken;
- TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
- }
-
- /*
- * Core exchange functions
- */
-
- /// @dev Fills the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Total amount of takerToken filled in trade.
- function fillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- returns (uint filledTakerTokenAmount)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.taker == address(0) || order.taker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);
- require(isValidSignature(
- order.maker,
- order.orderHash,
- v,
- r,
- s
- ));
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
- if (filledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
- LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
- return 0;
- }
-
- if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
- LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
- return 0;
- }
-
- uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
- uint paidMakerFee;
- uint paidTakerFee;
- filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
- require(transferViaTokenTransferProxy(
- order.makerToken,
- order.maker,
- msg.sender,
- filledMakerTokenAmount
- ));
- require(transferViaTokenTransferProxy(
- order.takerToken,
- msg.sender,
- order.maker,
- filledTakerTokenAmount
- ));
- if (order.feeRecipient != address(0)) {
- if (order.makerFee > 0) {
- paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- order.maker,
- order.feeRecipient,
- paidMakerFee
- ));
- }
- if (order.takerFee > 0) {
- paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- msg.sender,
- order.feeRecipient,
- paidTakerFee
- ));
- }
- }
-
- LogFill(
- order.maker,
- msg.sender,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- filledMakerTokenAmount,
- filledTakerTokenAmount,
- paidMakerFee,
- paidTakerFee,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return filledTakerTokenAmount;
- }
-
- /// @dev Cancels the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
- /// @return Amount of takerToken cancelled.
- function cancelOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint cancelTakerTokenAmount)
- public
- returns (uint)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.maker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
- if (cancelledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);
-
- LogCancel(
- order.maker,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
- cancelledTakerTokenAmount,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return cancelledTakerTokenAmount;
- }
-
- /*
- * Wrapper functions
- */
-
- /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- function fillOrKillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- {
- require(fillOrder(
- orderAddresses,
- orderValues,
- fillTakerTokenAmount,
- false,
- v,
- r,
- s
- ) == fillTakerTokenAmount);
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrKillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrKillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- /// @return Total amount of fillTakerTokenAmount filled in orders.
- function fillOrdersUpTo(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- returns (uint)
- {
- uint filledTakerTokenAmount = 0;
- for (uint i = 0; i < orderAddresses.length; i++) {
- require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
- filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
- orderAddresses[i],
- orderValues[i],
- safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- ));
- if (filledTakerTokenAmount == fillTakerTokenAmount) break;
- }
- return filledTakerTokenAmount;
- }
-
- /// @dev Synchronously cancels multiple orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
- function batchCancelOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] cancelTakerTokenAmounts)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- cancelOrder(
- orderAddresses[i],
- orderValues[i],
- cancelTakerTokenAmounts[i]
- );
- }
- }
-
- /*
- * Constant public functions
- */
-
- /// @dev Calculates Keccak-256 hash of order with specified parameters.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @return Keccak-256 hash of order.
- function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
- public
- constant
- returns (bytes32)
- {
- return keccak256(
- address(this),
- orderAddresses[0], // maker
- orderAddresses[1], // taker
- orderAddresses[2], // makerToken
- orderAddresses[3], // takerToken
- orderAddresses[4], // feeRecipient
- orderValues[0], // makerTokenAmount
- orderValues[1], // takerTokenAmount
- orderValues[2], // makerFee
- orderValues[3], // takerFee
- orderValues[4], // expirationTimestampInSec
- orderValues[5] // salt
- );
- }
-
- /// @dev Verifies that an order signature is valid.
- /// @param signer address of signer.
- /// @param hash Signed Keccak-256 hash.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Validity of order signature.
- function isValidSignature(
- address signer,
- bytes32 hash,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- constant
- returns (bool)
- {
- return signer == ecrecover(
- keccak256("\x19Ethereum Signed Message:\n32", hash),
- v,
- r,
- s
- );
- }
-
- /// @dev Checks if rounding error > 0.1%.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to multiply with numerator/denominator.
- /// @return Rounding error is present.
- function isRoundingError(uint numerator, uint denominator, uint target)
- public
- constant
- returns (bool)
- {
- uint remainder = mulmod(target, numerator, denominator);
- if (remainder == 0) return false; // No rounding error.
-
- uint errPercentageTimes1000000 = safeDiv(
- safeMul(remainder, 1000000),
- safeMul(numerator, target)
- );
- return errPercentageTimes1000000 > 1000;
- }
-
- /// @dev Calculates partial value given a numerator and denominator.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to calculate partial of.
- /// @return Partial value of target.
- function getPartialAmount(uint numerator, uint denominator, uint target)
- public
- constant
- returns (uint)
- {
- return safeDiv(safeMul(numerator, target), denominator);
- }
-
- /// @dev Calculates the sum of values already filled and cancelled for a given order.
- /// @param orderHash The Keccak-256 hash of the given order.
- /// @return Sum of values already filled and cancelled.
- function getUnavailableTakerTokenAmount(bytes32 orderHash)
- public
- constant
- returns (uint)
- {
- return safeAdd(filled[orderHash], cancelled[orderHash]);
- }
-
-
- /*
- * Internal functions
- */
-
- /// @dev Transfers a token using TokenTransferProxy transferFrom function.
- /// @param token Address of token to transferFrom.
- /// @param from Address transfering token.
- /// @param to Address receiving token.
- /// @param value Amount of token to transfer.
- /// @return Success of token transfer.
- function transferViaTokenTransferProxy(
- address token,
- address from,
- address to,
- uint value)
- internal
- returns (bool)
- {
- return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
- }
-
- /// @dev Checks if any order transfers will fail.
- /// @param order Order struct of params that will be checked.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @return Predicted result of transfers.
- function isTransferable(Order order, uint fillTakerTokenAmount)
- internal
- constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
- returns (bool)
- {
- address taker = msg.sender;
- uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
-
- if (order.feeRecipient != address(0)) {
- bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
- bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
- uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
- uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;
-
- if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- ) return false;
-
- if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
- ) return false;
- if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
- ) return false;
- } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getBalance(order.takerToken, taker) < fillTakerTokenAmount
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
- ) return false;
-
- return true;
- }
-
- /// @dev Get token balance of an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Token balance of owner.
- function getBalance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
- }
-
- /// @dev Get allowance of token given to TokenTransferProxy by an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Allowance of token given to TokenTransferProxy by owner.
- function getAllowance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
- }
-}
diff --git a/packages/contracts/src/contracts/current/protocol/TokenRegistry/TokenRegistry.sol b/packages/contracts/src/contracts/current/protocol/TokenRegistry/TokenRegistry.sol
deleted file mode 100644
index 3bd2fbfaf..000000000
--- a/packages/contracts/src/contracts/current/protocol/TokenRegistry/TokenRegistry.sol
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.11;
-
-import { Ownable_v1 as Ownable } from "../../../previous/Ownable/Ownable_v1.sol";
-
-/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract TokenRegistry is Ownable {
-
- event LogAddToken(
- address indexed token,
- string name,
- string symbol,
- uint8 decimals,
- bytes ipfsHash,
- bytes swarmHash
- );
-
- event LogRemoveToken(
- address indexed token,
- string name,
- string symbol,
- uint8 decimals,
- bytes ipfsHash,
- bytes swarmHash
- );
-
- event LogTokenNameChange(address indexed token, string oldName, string newName);
- event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);
- event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);
- event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);
-
- mapping (address => TokenMetadata) public tokens;
- mapping (string => address) tokenBySymbol;
- mapping (string => address) tokenByName;
-
- address[] public tokenAddresses;
-
- struct TokenMetadata {
- address token;
- string name;
- string symbol;
- uint8 decimals;
- bytes ipfsHash;
- bytes swarmHash;
- }
-
- modifier tokenExists(address _token) {
- require(tokens[_token].token != address(0));
- _;
- }
-
- modifier tokenDoesNotExist(address _token) {
- require(tokens[_token].token == address(0));
- _;
- }
-
- modifier nameDoesNotExist(string _name) {
- require(tokenByName[_name] == address(0));
- _;
- }
-
- modifier symbolDoesNotExist(string _symbol) {
- require(tokenBySymbol[_symbol] == address(0));
- _;
- }
-
- modifier addressNotNull(address _address) {
- require(_address != address(0));
- _;
- }
-
-
- /// @dev Allows owner to add a new token to the registry.
- /// @param _token Address of new token.
- /// @param _name Name of new token.
- /// @param _symbol Symbol for new token.
- /// @param _decimals Number of decimals, divisibility of new token.
- /// @param _ipfsHash IPFS hash of token icon.
- /// @param _swarmHash Swarm hash of token icon.
- function addToken(
- address _token,
- string _name,
- string _symbol,
- uint8 _decimals,
- bytes _ipfsHash,
- bytes _swarmHash)
- public
- onlyOwner
- tokenDoesNotExist(_token)
- addressNotNull(_token)
- symbolDoesNotExist(_symbol)
- nameDoesNotExist(_name)
- {
- tokens[_token] = TokenMetadata({
- token: _token,
- name: _name,
- symbol: _symbol,
- decimals: _decimals,
- ipfsHash: _ipfsHash,
- swarmHash: _swarmHash
- });
- tokenAddresses.push(_token);
- tokenBySymbol[_symbol] = _token;
- tokenByName[_name] = _token;
- LogAddToken(
- _token,
- _name,
- _symbol,
- _decimals,
- _ipfsHash,
- _swarmHash
- );
- }
-
- /// @dev Allows owner to remove an existing token from the registry.
- /// @param _token Address of existing token.
- function removeToken(address _token, uint _index)
- public
- onlyOwner
- tokenExists(_token)
- {
- require(tokenAddresses[_index] == _token);
-
- tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];
- tokenAddresses.length -= 1;
-
- TokenMetadata storage token = tokens[_token];
- LogRemoveToken(
- token.token,
- token.name,
- token.symbol,
- token.decimals,
- token.ipfsHash,
- token.swarmHash
- );
- delete tokenBySymbol[token.symbol];
- delete tokenByName[token.name];
- delete tokens[_token];
- }
-
- /// @dev Allows owner to modify an existing token's name.
- /// @param _token Address of existing token.
- /// @param _name New name.
- function setTokenName(address _token, string _name)
- public
- onlyOwner
- tokenExists(_token)
- nameDoesNotExist(_name)
- {
- TokenMetadata storage token = tokens[_token];
- LogTokenNameChange(_token, token.name, _name);
- delete tokenByName[token.name];
- tokenByName[_name] = _token;
- token.name = _name;
- }
-
- /// @dev Allows owner to modify an existing token's symbol.
- /// @param _token Address of existing token.
- /// @param _symbol New symbol.
- function setTokenSymbol(address _token, string _symbol)
- public
- onlyOwner
- tokenExists(_token)
- symbolDoesNotExist(_symbol)
- {
- TokenMetadata storage token = tokens[_token];
- LogTokenSymbolChange(_token, token.symbol, _symbol);
- delete tokenBySymbol[token.symbol];
- tokenBySymbol[_symbol] = _token;
- token.symbol = _symbol;
- }
-
- /// @dev Allows owner to modify an existing token's IPFS hash.
- /// @param _token Address of existing token.
- /// @param _ipfsHash New IPFS hash.
- function setTokenIpfsHash(address _token, bytes _ipfsHash)
- public
- onlyOwner
- tokenExists(_token)
- {
- TokenMetadata storage token = tokens[_token];
- LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);
- token.ipfsHash = _ipfsHash;
- }
-
- /// @dev Allows owner to modify an existing token's Swarm hash.
- /// @param _token Address of existing token.
- /// @param _swarmHash New Swarm hash.
- function setTokenSwarmHash(address _token, bytes _swarmHash)
- public
- onlyOwner
- tokenExists(_token)
- {
- TokenMetadata storage token = tokens[_token];
- LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);
- token.swarmHash = _swarmHash;
- }
-
- /*
- * Web3 call functions
- */
-
- /// @dev Provides a registered token's address when given the token symbol.
- /// @param _symbol Symbol of registered token.
- /// @return Token's address.
- function getTokenAddressBySymbol(string _symbol) constant returns (address) {
- return tokenBySymbol[_symbol];
- }
-
- /// @dev Provides a registered token's address when given the token name.
- /// @param _name Name of registered token.
- /// @return Token's address.
- function getTokenAddressByName(string _name) constant returns (address) {
- return tokenByName[_name];
- }
-
- /// @dev Provides a registered token's metadata, looked up by address.
- /// @param _token Address of registered token.
- /// @return Token metadata.
- function getTokenMetaData(address _token)
- public
- constant
- returns (
- address, //tokenAddress
- string, //name
- string, //symbol
- uint8, //decimals
- bytes, //ipfsHash
- bytes //swarmHash
- )
- {
- TokenMetadata memory token = tokens[_token];
- return (
- token.token,
- token.name,
- token.symbol,
- token.decimals,
- token.ipfsHash,
- token.swarmHash
- );
- }
-
- /// @dev Provides a registered token's metadata, looked up by name.
- /// @param _name Name of registered token.
- /// @return Token metadata.
- function getTokenByName(string _name)
- public
- constant
- returns (
- address, //tokenAddress
- string, //name
- string, //symbol
- uint8, //decimals
- bytes, //ipfsHash
- bytes //swarmHash
- )
- {
- address _token = tokenByName[_name];
- return getTokenMetaData(_token);
- }
-
- /// @dev Provides a registered token's metadata, looked up by symbol.
- /// @param _symbol Symbol of registered token.
- /// @return Token metadata.
- function getTokenBySymbol(string _symbol)
- public
- constant
- returns (
- address, //tokenAddress
- string, //name
- string, //symbol
- uint8, //decimals
- bytes, //ipfsHash
- bytes //swarmHash
- )
- {
- address _token = tokenBySymbol[_symbol];
- return getTokenMetaData(_token);
- }
-
- /// @dev Returns an array containing all token addresses.
- /// @return Array of token addresses.
- function getTokenAddresses()
- public
- constant
- returns (address[])
- {
- return tokenAddresses;
- }
-}
diff --git a/packages/contracts/src/contracts/current/protocol/TokenTransferProxy/TokenTransferProxy.sol b/packages/contracts/src/contracts/current/protocol/TokenTransferProxy/TokenTransferProxy.sol
deleted file mode 100644
index 1ce949fa6..000000000
--- a/packages/contracts/src/contracts/current/protocol/TokenTransferProxy/TokenTransferProxy.sol
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.11;
-
-import { Token_v1 as Token } from "../../../previous/Token/Token_v1.sol";
-import { Ownable_v1 as Ownable } from "../../../previous/Ownable/Ownable_v1.sol";
-
-/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract TokenTransferProxy is Ownable {
-
- /// @dev Only authorized addresses can invoke functions with this modifier.
- modifier onlyAuthorized {
- require(authorized[msg.sender]);
- _;
- }
-
- modifier targetAuthorized(address target) {
- require(authorized[target]);
- _;
- }
-
- modifier targetNotAuthorized(address target) {
- require(!authorized[target]);
- _;
- }
-
- mapping (address => bool) public authorized;
- address[] public authorities;
-
- event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
- event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
-
- /*
- * Public functions
- */
-
- /// @dev Authorizes an address.
- /// @param target Address to authorize.
- function addAuthorizedAddress(address target)
- public
- onlyOwner
- targetNotAuthorized(target)
- {
- authorized[target] = true;
- authorities.push(target);
- LogAuthorizedAddressAdded(target, msg.sender);
- }
-
- /// @dev Removes authorizion of an address.
- /// @param target Address to remove authorization from.
- function removeAuthorizedAddress(address target)
- public
- onlyOwner
- targetAuthorized(target)
- {
- delete authorized[target];
- for (uint i = 0; i < authorities.length; i++) {
- if (authorities[i] == target) {
- authorities[i] = authorities[authorities.length - 1];
- authorities.length -= 1;
- break;
- }
- }
- LogAuthorizedAddressRemoved(target, msg.sender);
- }
-
- /// @dev Calls into ERC20 Token contract, invoking transferFrom.
- /// @param token Address of token to transfer.
- /// @param from Address to transfer token from.
- /// @param to Address to transfer token to.
- /// @param value Amount of token to transfer.
- /// @return Success of transfer.
- function transferFrom(
- address token,
- address from,
- address to,
- uint value)
- public
- onlyAuthorized
- returns (bool)
- {
- return Token(token).transferFrom(from, to, value);
- }
-
- /*
- * Public constant functions
- */
-
- /// @dev Gets all authorized addresses.
- /// @return Array of authorized addresses.
- function getAuthorizedAddresses()
- public
- constant
- returns (address[])
- {
- return authorities;
- }
-}
diff --git a/packages/contracts/src/contracts/current/test/DummyToken/DummyToken.sol b/packages/contracts/src/contracts/current/test/DummyToken/DummyToken.sol
deleted file mode 100644
index ab04f4d16..000000000
--- a/packages/contracts/src/contracts/current/test/DummyToken/DummyToken.sol
+++ /dev/null
@@ -1,37 +0,0 @@
-pragma solidity ^0.4.18;
-
-import { Mintable } from "../Mintable/Mintable.sol";
-import { Ownable } from "../../utils/Ownable/Ownable.sol";
-
-contract DummyToken is Mintable, Ownable {
- string public name;
- string public symbol;
- uint public decimals;
-
- function DummyToken(
- string _name,
- string _symbol,
- uint _decimals,
- uint _totalSupply)
- public
- {
- name = _name;
- symbol = _symbol;
- decimals = _decimals;
- totalSupply = _totalSupply;
- balances[msg.sender] = _totalSupply;
- }
-
- function setBalance(address _target, uint _value)
- public
- onlyOwner
- {
- uint currBalance = balanceOf(_target);
- if (_value < currBalance) {
- totalSupply = safeSub(totalSupply, safeSub(currBalance, _value));
- } else {
- totalSupply = safeAdd(totalSupply, safeSub(_value, currBalance));
- }
- balances[_target] = _value;
- }
-}
diff --git a/packages/contracts/src/contracts/current/test/MaliciousToken/MaliciousToken.sol b/packages/contracts/src/contracts/current/test/MaliciousToken/MaliciousToken.sol
deleted file mode 100644
index 9e502616c..000000000
--- a/packages/contracts/src/contracts/current/test/MaliciousToken/MaliciousToken.sol
+++ /dev/null
@@ -1,31 +0,0 @@
-pragma solidity ^0.4.18;
-
-import { ERC20Token } from "../../tokens/ERC20Token/ERC20Token.sol";
-
-contract MaliciousToken is ERC20Token {
- uint8 stateToUpdate = 1; // Not null so that change only requires 5000 gas
-
- function updateState()
- internal
- {
- stateToUpdate++;
- }
-
- function balanceOf(address _owner)
- public
- constant
- returns (uint)
- {
- updateState();
- return balances[_owner];
- }
-
- function allowance(address _owner, address _spender)
- public
- constant
- returns (uint)
- {
- updateState();
- return allowed[_owner][_spender];
- }
-}
diff --git a/packages/contracts/src/contracts/current/test/Mintable/Mintable.sol b/packages/contracts/src/contracts/current/test/Mintable/Mintable.sol
deleted file mode 100644
index cf7ee35a5..000000000
--- a/packages/contracts/src/contracts/current/test/Mintable/Mintable.sol
+++ /dev/null
@@ -1,18 +0,0 @@
-pragma solidity ^0.4.18;
-
-import { UnlimitedAllowanceToken } from "../../tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol";
-import { SafeMath } from "../../utils/SafeMath/SafeMath.sol";
-
-/*
- * Mintable
- * Base contract that creates a mintable UnlimitedAllowanceToken
- */
-contract Mintable is UnlimitedAllowanceToken, SafeMath {
- function mint(uint _value)
- public
- {
- require(_value <= 100000000000000000000);
- balances[msg.sender] = safeAdd(_value, balances[msg.sender]);
- totalSupply = safeAdd(totalSupply, _value);
- }
-}
diff --git a/packages/contracts/src/contracts/current/tokens/ERC20Token/ERC20Token.sol b/packages/contracts/src/contracts/current/tokens/ERC20Token/ERC20Token.sol
deleted file mode 100644
index 0e5b87aa4..000000000
--- a/packages/contracts/src/contracts/current/tokens/ERC20Token/ERC20Token.sol
+++ /dev/null
@@ -1,58 +0,0 @@
-pragma solidity ^0.4.18;
-
-import { Token } from "../Token/Token.sol";
-
-contract ERC20Token is Token {
-
- function transfer(address _to, uint _value)
- public
- returns (bool)
- {
- require(balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]);
- balances[msg.sender] -= _value;
- balances[_to] += _value;
- Transfer(msg.sender, _to, _value);
- return true;
- }
-
- function transferFrom(address _from, address _to, uint _value)
- public
- returns (bool)
- {
- require(balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]);
- balances[_to] += _value;
- balances[_from] -= _value;
- allowed[_from][msg.sender] -= _value;
- Transfer(_from, _to, _value);
- return true;
- }
-
- function approve(address _spender, uint _value)
- public
- returns (bool)
- {
- allowed[msg.sender][_spender] = _value;
- Approval(msg.sender, _spender, _value);
- return true;
- }
-
- function balanceOf(address _owner)
- public
- view
- returns (uint)
- {
- return balances[_owner];
- }
-
- function allowance(address _owner, address _spender)
- public
- view
- returns (uint)
- {
- return allowed[_owner][_spender];
- }
-
- mapping (address => uint) balances;
- mapping (address => mapping (address => uint)) allowed;
- uint public totalSupply;
-}
diff --git a/packages/contracts/src/contracts/current/tokens/Token/Token.sol b/packages/contracts/src/contracts/current/tokens/Token/Token.sol
deleted file mode 100644
index bf4e71dcd..000000000
--- a/packages/contracts/src/contracts/current/tokens/Token/Token.sol
+++ /dev/null
@@ -1,35 +0,0 @@
-pragma solidity ^0.4.18;
-
-contract Token {
-
- /// @notice send `_value` token to `_to` from `msg.sender`
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transfer(address _to, uint _value) public returns (bool) {}
-
- /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
- /// @param _from The address of the sender
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transferFrom(address _from, address _to, uint _value) public returns (bool) {}
-
- /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @param _value The amount of wei to be approved for transfer
- /// @return Whether the approval was successful or not
- function approve(address _spender, uint _value) public returns (bool) {}
-
- /// @param _owner The address from which the balance will be retrieved
- /// @return The balance
- function balanceOf(address _owner) public view returns (uint) {}
-
- /// @param _owner The address of the account owning tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @return Amount of remaining tokens allowed to spent
- function allowance(address _owner, address _spender) public view returns (uint) {}
-
- event Transfer(address indexed _from, address indexed _to, uint _value);
- event Approval(address indexed _owner, address indexed _spender, uint _value);
-}
diff --git a/packages/contracts/src/contracts/current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol b/packages/contracts/src/contracts/current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol
deleted file mode 100644
index 699f535d2..000000000
--- a/packages/contracts/src/contracts/current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.18;
-
-import { ERC20Token } from "../ERC20Token/ERC20Token.sol";
-
-contract UnlimitedAllowanceToken is ERC20Token {
-
- uint constant MAX_UINT = 2**256 - 1;
-
- /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717
- /// @param _from Address to transfer from.
- /// @param _to Address to transfer to.
- /// @param _value Amount to transfer.
- /// @return Success of transfer.
- function transferFrom(address _from, address _to, uint _value)
- public
- returns (bool)
- {
- uint allowance = allowed[_from][msg.sender];
- require(balances[_from] >= _value && allowance >= _value && balances[_to] + _value >= balances[_to]);
- balances[_to] += _value;
- balances[_from] -= _value;
- if (allowance < MAX_UINT) {
- allowed[_from][msg.sender] -= _value;
- }
- Transfer(_from, _to, _value);
- return true;
- }
-}
diff --git a/packages/contracts/src/contracts/current/tokens/WETH9/WETH9.sol b/packages/contracts/src/contracts/current/tokens/WETH9/WETH9.sol
deleted file mode 100644
index 733ca414b..000000000
--- a/packages/contracts/src/contracts/current/tokens/WETH9/WETH9.sol
+++ /dev/null
@@ -1,756 +0,0 @@
-// Copyright (C) 2015, 2016, 2017 Dapphub
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-pragma solidity ^0.4.18;
-
-contract WETH9 {
- string public name = "Wrapped Ether";
- string public symbol = "WETH";
- uint8 public decimals = 18;
-
- event Approval(address indexed src, address indexed guy, uint wad);
- event Transfer(address indexed src, address indexed dst, uint wad);
- event Deposit(address indexed dst, uint wad);
- event Withdrawal(address indexed src, uint wad);
-
- mapping (address => uint) public balanceOf;
- mapping (address => mapping (address => uint)) public allowance;
-
- function() public payable {
- deposit();
- }
- function deposit() public payable {
- balanceOf[msg.sender] += msg.value;
- Deposit(msg.sender, msg.value);
- }
- function withdraw(uint wad) public {
- require(balanceOf[msg.sender] >= wad);
- balanceOf[msg.sender] -= wad;
- msg.sender.transfer(wad);
- Withdrawal(msg.sender, wad);
- }
-
- function totalSupply() public view returns (uint) {
- return this.balance;
- }
-
- function approve(address guy, uint wad) public returns (bool) {
- allowance[msg.sender][guy] = wad;
- Approval(msg.sender, guy, wad);
- return true;
- }
-
- function transfer(address dst, uint wad) public returns (bool) {
- return transferFrom(msg.sender, dst, wad);
- }
-
- function transferFrom(address src, address dst, uint wad)
- public
- returns (bool)
- {
- require(balanceOf[src] >= wad);
-
- if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
- require(allowance[src][msg.sender] >= wad);
- allowance[src][msg.sender] -= wad;
- }
-
- balanceOf[src] -= wad;
- balanceOf[dst] += wad;
-
- Transfer(src, dst, wad);
-
- return true;
- }
-}
-
-
-/*
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users. We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors. You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights. Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received. You must make sure that they, too, receive
-or can get the source code. And you must show them these terms so they
-know their rights.
-
- Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
- For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software. For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
- Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so. This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software. The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable. Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products. If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
- Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary. To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Use with the GNU Affero General Public License.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
- The GNU General Public License does not permit incorporating your program
-into proprietary programs. If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License. But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
-
-*/
diff --git a/packages/contracts/src/contracts/current/tokens/ZRXToken/ZRXToken.sol b/packages/contracts/src/contracts/current/tokens/ZRXToken/ZRXToken.sol
deleted file mode 100644
index 7f5e1f849..000000000
--- a/packages/contracts/src/contracts/current/tokens/ZRXToken/ZRXToken.sol
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.11;
-
-import { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from "../../../previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol";
-
-contract ZRXToken is UnlimitedAllowanceToken {
-
- uint8 constant public decimals = 18;
- uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places
- string constant public name = "0x Protocol Token";
- string constant public symbol = "ZRX";
-
- function ZRXToken() {
- balances[msg.sender] = totalSupply;
- }
-}
diff --git a/packages/contracts/src/contracts/current/tutorials/Arbitrage/Arbitrage.sol b/packages/contracts/src/contracts/current/tutorials/Arbitrage/Arbitrage.sol
deleted file mode 100644
index a9f3c22e6..000000000
--- a/packages/contracts/src/contracts/current/tutorials/Arbitrage/Arbitrage.sol
+++ /dev/null
@@ -1,114 +0,0 @@
-pragma solidity ^0.4.19;
-
-import { Exchange } from "../../protocol/Exchange/Exchange.sol";
-import { EtherDelta } from "../EtherDelta/EtherDelta.sol";
-import { Ownable } from "../../utils/Ownable/Ownable.sol";
-import { Token } from "../../tokens/Token/Token.sol";
-
-/// @title Arbitrage - Facilitates atomic arbitrage of ERC20 tokens between EtherDelta and 0x Exchange contract.
-/// @author Leonid Logvinov - <leo@0xProject.com>
-contract Arbitrage is Ownable {
-
- Exchange exchange;
- EtherDelta etherDelta;
- address proxyAddress;
-
- uint256 constant MAX_UINT = 2**256 - 1;
-
- function Arbitrage(address _exchangeAddress, address _etherDeltaAddress, address _proxyAddress) {
- exchange = Exchange(_exchangeAddress);
- etherDelta = EtherDelta(_etherDeltaAddress);
- proxyAddress = _proxyAddress;
- }
-
- /*
- * Makes token tradeable by setting an allowance for etherDelta and 0x proxy contract.
- * Also sets an allowance for the owner of the contracts therefore allowing to withdraw tokens.
- */
- function setAllowances(address tokenAddress) external onlyOwner {
- Token token = Token(tokenAddress);
- token.approve(address(etherDelta), MAX_UINT);
- token.approve(proxyAddress, MAX_UINT);
- token.approve(owner, MAX_UINT);
- }
-
- /*
- * Because of the limits on the number of local variables in Solidity we need to compress parameters while loosing
- * readability. Scheme of the parameter layout:
- *
- * addresses
- * 0..4 orderAddresses
- * 5 user
- *
- * values
- * 0..5 orderValues
- * 6 fillTakerTokenAmount
- * 7 amountGet
- * 8 amountGive
- * 9 expires
- * 10 nonce
- * 11 amount
-
- * signature
- * exchange then etherDelta
- */
- function makeAtomicTrade(
- address[6] addresses, uint[12] values,
- uint8[2] v, bytes32[2] r, bytes32[2] s
- ) external onlyOwner {
- makeExchangeTrade(addresses, values, v, r, s);
- makeEtherDeltaTrade(addresses, values, v, r, s);
- }
-
- function makeEtherDeltaTrade(
- address[6] addresses, uint[12] values,
- uint8[2] v, bytes32[2] r, bytes32[2] s
- ) internal {
- uint amount = values[11];
- etherDelta.depositToken(
- addresses[2], // tokenGet === makerToken
- values[7] // amountGet
- );
- etherDelta.trade(
- addresses[2], // tokenGet === makerToken
- values[7], // amountGet
- addresses[3], // tokenGive === takerToken
- values[8], // amountGive
- values[9], // expires
- values[10], // nonce
- addresses[5], // user
- v[1],
- r[1],
- s[1],
- amount
- );
- etherDelta.withdrawToken(
- addresses[3], // tokenGive === tokenToken
- values[8] // amountGive
- );
- }
-
- function makeExchangeTrade(
- address[6] addresses, uint[12] values,
- uint8[2] v, bytes32[2] r, bytes32[2] s
- ) internal {
- address[5] memory orderAddresses = [
- addresses[0], // maker
- addresses[1], // taker
- addresses[2], // makerToken
- addresses[3], // takerToken
- addresses[4] // feeRecepient
- ];
- uint[6] memory orderValues = [
- values[0], // makerTokenAmount
- values[1], // takerTokenAmount
- values[2], // makerFee
- values[3], // takerFee
- values[4], // expirationTimestampInSec
- values[5] // salt
- ];
- uint fillTakerTokenAmount = values[6]; // fillTakerTokenAmount
- // Execute Exchange trade. It either succeeds in full or fails and reverts all the changes.
- exchange.fillOrKillOrder(orderAddresses, orderValues, fillTakerTokenAmount, v[0], r[0], s[0]);
- }
-}
diff --git a/packages/contracts/src/contracts/current/tutorials/EtherDelta/EtherDelta.sol b/packages/contracts/src/contracts/current/tutorials/EtherDelta/EtherDelta.sol
deleted file mode 100644
index 49847ab48..000000000
--- a/packages/contracts/src/contracts/current/tutorials/EtherDelta/EtherDelta.sol
+++ /dev/null
@@ -1,168 +0,0 @@
-pragma solidity ^0.4.19;
-
-import { SafeMath } from "../../utils/SafeMath/SafeMath.sol";
-import { AccountLevels } from "./AccountLevels.sol";
-import { Token } from "../../tokens/Token/Token.sol";
-
-contract EtherDelta is SafeMath {
- address public admin; //the admin address
- address public feeAccount; //the account that will receive fees
- address public accountLevelsAddr; //the address of the AccountLevels contract
- uint public feeMake; //percentage times (1 ether)
- uint public feeTake; //percentage times (1 ether)
- uint public feeRebate; //percentage times (1 ether)
- mapping (address => mapping (address => uint)) public tokens; //mapping of token addresses to mapping of account balances (token=0 means Ether)
- mapping (address => mapping (bytes32 => bool)) public orders; //mapping of user accounts to mapping of order hashes to booleans (true = submitted by user, equivalent to offchain signature)
- mapping (address => mapping (bytes32 => uint)) public orderFills; //mapping of user accounts to mapping of order hashes to uints (amount of order that has been filled)
-
- event Order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user);
- event Cancel(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s);
- event Trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address get, address give);
- event Deposit(address token, address user, uint amount, uint balance);
- event Withdraw(address token, address user, uint amount, uint balance);
-
- function EtherDelta(address admin_, address feeAccount_, address accountLevelsAddr_, uint feeMake_, uint feeTake_, uint feeRebate_) {
- admin = admin_;
- feeAccount = feeAccount_;
- accountLevelsAddr = accountLevelsAddr_;
- feeMake = feeMake_;
- feeTake = feeTake_;
- feeRebate = feeRebate_;
- }
-
- function() {
- throw;
- }
-
- function changeAdmin(address admin_) {
- if (msg.sender != admin) throw;
- admin = admin_;
- }
-
- function changeAccountLevelsAddr(address accountLevelsAddr_) {
- if (msg.sender != admin) throw;
- accountLevelsAddr = accountLevelsAddr_;
- }
-
- function changeFeeAccount(address feeAccount_) {
- if (msg.sender != admin) throw;
- feeAccount = feeAccount_;
- }
-
- function changeFeeMake(uint feeMake_) {
- if (msg.sender != admin) throw;
- if (feeMake_ > feeMake) throw;
- feeMake = feeMake_;
- }
-
- function changeFeeTake(uint feeTake_) {
- if (msg.sender != admin) throw;
- if (feeTake_ > feeTake || feeTake_ < feeRebate) throw;
- feeTake = feeTake_;
- }
-
- function changeFeeRebate(uint feeRebate_) {
- if (msg.sender != admin) throw;
- if (feeRebate_ < feeRebate || feeRebate_ > feeTake) throw;
- feeRebate = feeRebate_;
- }
-
- function deposit() payable {
- tokens[0][msg.sender] = safeAdd(tokens[0][msg.sender], msg.value);
- Deposit(0, msg.sender, msg.value, tokens[0][msg.sender]);
- }
-
- function withdraw(uint amount) {
- if (tokens[0][msg.sender] < amount) throw;
- tokens[0][msg.sender] = safeSub(tokens[0][msg.sender], amount);
- if (!msg.sender.call.value(amount)()) throw;
- Withdraw(0, msg.sender, amount, tokens[0][msg.sender]);
- }
-
- function depositToken(address token, uint amount) {
- //remember to call Token(address).approve(this, amount) or this contract will not be able to do the transfer on your behalf.
- if (token==0) throw;
- if (!Token(token).transferFrom(msg.sender, this, amount)) throw;
- tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount);
- Deposit(token, msg.sender, amount, tokens[token][msg.sender]);
- }
-
- function withdrawToken(address token, uint amount) {
- if (token==0) throw;
- if (tokens[token][msg.sender] < amount) throw;
- tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
- if (!Token(token).transfer(msg.sender, amount)) throw;
- Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
- }
-
- function balanceOf(address token, address user) constant returns (uint) {
- return tokens[token][user];
- }
-
- function order(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce) {
- bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
- orders[msg.sender][hash] = true;
- Order(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender);
- }
-
- function trade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount) {
- //amount is in amountGet terms
- bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
- if (!(
- (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) &&
- block.number <= expires &&
- safeAdd(orderFills[user][hash], amount) <= amountGet
- )) throw;
- tradeBalances(tokenGet, amountGet, tokenGive, amountGive, user, amount);
- orderFills[user][hash] = safeAdd(orderFills[user][hash], amount);
- Trade(tokenGet, amount, tokenGive, amountGive * amount / amountGet, user, msg.sender);
- }
-
- function tradeBalances(address tokenGet, uint amountGet, address tokenGive, uint amountGive, address user, uint amount) private {
- uint feeMakeXfer = safeMul(amount, feeMake) / (1 ether);
- uint feeTakeXfer = safeMul(amount, feeTake) / (1 ether);
- uint feeRebateXfer = 0;
- if (accountLevelsAddr != 0x0) {
- uint accountLevel = AccountLevels(accountLevelsAddr).accountLevel(user);
- if (accountLevel==1) feeRebateXfer = safeMul(amount, feeRebate) / (1 ether);
- if (accountLevel==2) feeRebateXfer = feeTakeXfer;
- }
- tokens[tokenGet][msg.sender] = safeSub(tokens[tokenGet][msg.sender], safeAdd(amount, feeTakeXfer));
- tokens[tokenGet][user] = safeAdd(tokens[tokenGet][user], safeSub(safeAdd(amount, feeRebateXfer), feeMakeXfer));
- tokens[tokenGet][feeAccount] = safeAdd(tokens[tokenGet][feeAccount], safeSub(safeAdd(feeMakeXfer, feeTakeXfer), feeRebateXfer));
- tokens[tokenGive][user] = safeSub(tokens[tokenGive][user], safeMul(amountGive, amount) / amountGet);
- tokens[tokenGive][msg.sender] = safeAdd(tokens[tokenGive][msg.sender], safeMul(amountGive, amount) / amountGet);
- }
-
- function testTrade(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s, uint amount, address sender) constant returns(bool) {
- if (!(
- tokens[tokenGet][sender] >= amount &&
- availableVolume(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, user, v, r, s) >= amount
- )) return false;
- return true;
- }
-
- function availableVolume(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) {
- bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
- if (!(
- (orders[user][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == user) &&
- block.number <= expires
- )) return 0;
- uint available1 = safeSub(amountGet, orderFills[user][hash]);
- uint available2 = safeMul(tokens[tokenGive][user], amountGet) / amountGive;
- if (available1<available2) return available1;
- return available2;
- }
-
- function amountFilled(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, address user, uint8 v, bytes32 r, bytes32 s) constant returns(uint) {
- bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
- return orderFills[user][hash];
- }
-
- function cancelOrder(address tokenGet, uint amountGet, address tokenGive, uint amountGive, uint expires, uint nonce, uint8 v, bytes32 r, bytes32 s) {
- bytes32 hash = sha256(this, tokenGet, amountGet, tokenGive, amountGive, expires, nonce);
- if (!(orders[msg.sender][hash] || ecrecover(sha3("\x19Ethereum Signed Message:\n32", hash),v,r,s) == msg.sender)) throw;
- orderFills[msg.sender][hash] = amountGet;
- Cancel(tokenGet, amountGet, tokenGive, amountGive, expires, nonce, msg.sender, v, r, s);
- }
-}
diff --git a/packages/contracts/src/contracts/current/utils/Ownable/Ownable.sol b/packages/contracts/src/contracts/current/utils/Ownable/Ownable.sol
deleted file mode 100644
index 9b3d6b9cf..000000000
--- a/packages/contracts/src/contracts/current/utils/Ownable/Ownable.sol
+++ /dev/null
@@ -1,32 +0,0 @@
-pragma solidity ^0.4.18;
-
-/*
- * Ownable
- *
- * Base contract with an owner.
- * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
- */
-
-contract Ownable {
- address public owner;
-
- function Ownable()
- public
- {
- owner = msg.sender;
- }
-
- modifier onlyOwner() {
- require(msg.sender == owner);
- _;
- }
-
- function transferOwnership(address newOwner)
- public
- onlyOwner
- {
- if (newOwner != address(0)) {
- owner = newOwner;
- }
- }
-}
diff --git a/packages/contracts/src/contracts/current/utils/SafeMath/SafeMath.sol b/packages/contracts/src/contracts/current/utils/SafeMath/SafeMath.sol
deleted file mode 100644
index 955a9e379..000000000
--- a/packages/contracts/src/contracts/current/utils/SafeMath/SafeMath.sol
+++ /dev/null
@@ -1,73 +0,0 @@
-pragma solidity ^0.4.18;
-
-contract SafeMath {
- function safeMul(uint a, uint b)
- internal
- pure
- returns (uint256)
- {
- uint c = a * b;
- assert(a == 0 || c / a == b);
- return c;
- }
-
- function safeDiv(uint a, uint b)
- internal
- pure
- returns (uint256)
- {
- uint c = a / b;
- return c;
- }
-
- function safeSub(uint a, uint b)
- internal
- pure
- returns (uint256)
- {
- assert(b <= a);
- return a - b;
- }
-
- function safeAdd(uint a, uint b)
- internal
- pure
- returns (uint256)
- {
- uint c = a + b;
- assert(c >= a);
- return c;
- }
-
- function max64(uint64 a, uint64 b)
- internal
- pure
- returns (uint256)
- {
- return a >= b ? a : b;
- }
-
- function min64(uint64 a, uint64 b)
- internal
- pure
- returns (uint256)
- {
- return a < b ? a : b;
- }
-
- function max256(uint256 a, uint256 b)
- internal
- pure
- returns (uint256)
- {
- return a >= b ? a : b;
- }
-
- function min256(uint256 a, uint256 b)
- internal
- pure
- returns (uint256)
- {
- return a < b ? a : b;
- }
-}
diff --git a/packages/contracts/src/contracts/previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol b/packages/contracts/src/contracts/previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol
deleted file mode 100644
index 6376f3f2c..000000000
--- a/packages/contracts/src/contracts/previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.11;
-
-import { ERC20Token_v1 as ERC20Token } from "../ERC20Token/ERC20Token_v1.sol";
-
-contract UnlimitedAllowanceToken_v1 is ERC20Token {
-
- uint constant MAX_UINT = 2**256 - 1;
-
- /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.
- /// @param _from Address to transfer from.
- /// @param _to Address to transfer to.
- /// @param _value Amount to transfer.
- /// @return Success of transfer.
- function transferFrom(address _from, address _to, uint _value)
- public
- returns (bool)
- {
- uint allowance = allowed[_from][msg.sender];
- if (balances[_from] >= _value
- && allowance >= _value
- && balances[_to] + _value >= balances[_to]
- ) {
- balances[_to] += _value;
- balances[_from] -= _value;
- if (allowance < MAX_UINT) {
- allowed[_from][msg.sender] -= _value;
- }
- Transfer(_from, _to, _value);
- return true;
- } else {
- return false;
- }
- }
-}
diff --git a/packages/contracts/test/asset_proxy/authorizable.ts b/packages/contracts/test/asset_proxy/authorizable.ts
new file mode 100644
index 000000000..e99c6cee3
--- /dev/null
+++ b/packages/contracts/test/asset_proxy/authorizable.ts
@@ -0,0 +1,207 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+
+import { MixinAuthorizableContract } from '../../generated_contract_wrappers/mixin_authorizable';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('Authorizable', () => {
+ let owner: string;
+ let notOwner: string;
+ let address: string;
+ let authorizable: MixinAuthorizableContract;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ owner = address = accounts[0];
+ notOwner = accounts[1];
+ authorizable = await MixinAuthorizableContract.deployFrom0xArtifactAsync(
+ artifacts.MixinAuthorizable,
+ provider,
+ txDefaults,
+ );
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('addAuthorizedAddress', () => {
+ it('should throw if not called by owner', async () => {
+ return expectTransactionFailedAsync(
+ authorizable.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
+ RevertReason.OnlyContractOwner,
+ );
+ });
+ it('should allow owner to add an authorized address', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const isAuthorized = await authorizable.authorized.callAsync(address);
+ expect(isAuthorized).to.be.true();
+ });
+ it('should throw if owner attempts to authorize a duplicate address', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ return expectTransactionFailedAsync(
+ authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ RevertReason.TargetAlreadyAuthorized,
+ );
+ });
+ });
+
+ describe('removeAuthorizedAddress', () => {
+ it('should throw if not called by owner', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
+ from: notOwner,
+ }),
+ RevertReason.OnlyContractOwner,
+ );
+ });
+
+ it('should allow owner to remove an authorized address', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const isAuthorized = await authorizable.authorized.callAsync(address);
+ expect(isAuthorized).to.be.false();
+ });
+
+ it('should throw if owner attempts to remove an address that is not authorized', async () => {
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
+ from: owner,
+ }),
+ RevertReason.TargetNotAuthorized,
+ );
+ });
+ });
+
+ describe('removeAuthorizedAddressAtIndex', () => {
+ it('should throw if not called by owner', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const index = new BigNumber(0);
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddressAtIndex.sendTransactionAsync(address, index, {
+ from: notOwner,
+ }),
+ RevertReason.OnlyContractOwner,
+ );
+ });
+ it('should throw if index is >= authorities.length', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const index = new BigNumber(1);
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddressAtIndex.sendTransactionAsync(address, index, {
+ from: owner,
+ }),
+ RevertReason.IndexOutOfBounds,
+ );
+ });
+ it('should throw if owner attempts to remove an address that is not authorized', async () => {
+ const index = new BigNumber(0);
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddressAtIndex.sendTransactionAsync(address, index, {
+ from: owner,
+ }),
+ RevertReason.TargetNotAuthorized,
+ );
+ });
+ it('should throw if address at index does not match target', async () => {
+ const address1 = address;
+ const address2 = notOwner;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address1, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address2, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const address1Index = new BigNumber(0);
+ return expectTransactionFailedAsync(
+ authorizable.removeAuthorizedAddressAtIndex.sendTransactionAsync(address2, address1Index, {
+ from: owner,
+ }),
+ RevertReason.AuthorizedAddressMismatch,
+ );
+ });
+ it('should allow owner to remove an authorized address', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const index = new BigNumber(0);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.removeAuthorizedAddressAtIndex.sendTransactionAsync(address, index, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const isAuthorized = await authorizable.authorized.callAsync(address);
+ expect(isAuthorized).to.be.false();
+ });
+ });
+
+ describe('getAuthorizedAddresses', () => {
+ it('should return all authorized addresses', async () => {
+ const initial = await authorizable.getAuthorizedAddresses.callAsync();
+ expect(initial).to.have.length(0);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.addAuthorizedAddress.sendTransactionAsync(address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const afterAdd = await authorizable.getAuthorizedAddresses.callAsync();
+ expect(afterAdd).to.have.length(1);
+ expect(afterAdd).to.include(address);
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await authorizable.removeAuthorizedAddress.sendTransactionAsync(address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const afterRemove = await authorizable.getAuthorizedAddresses.callAsync();
+ expect(afterRemove).to.have.length(0);
+ });
+ });
+});
diff --git a/packages/contracts/test/asset_proxy/proxies.ts b/packages/contracts/test/asset_proxy/proxies.ts
new file mode 100644
index 000000000..62215f08d
--- /dev/null
+++ b/packages/contracts/test/asset_proxy/proxies.ts
@@ -0,0 +1,386 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
+import { RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721ReceiverContract } from '../../generated_contract_wrappers/dummy_erc721_receiver';
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+import { IAssetProxyContract } from '../../generated_contract_wrappers/i_asset_proxy';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { LogDecoder } from '../utils/log_decoder';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+const assetProxyInterface = new IAssetProxyContract(
+ artifacts.IAssetProxy.compilerOutput.abi,
+ constants.NULL_ADDRESS,
+ provider,
+);
+
+// tslint:disable:no-unnecessary-type-assertion
+describe('Asset Transfer Proxies', () => {
+ let owner: string;
+ let notAuthorized: string;
+ let exchangeAddress: string;
+ let makerAddress: string;
+ let takerAddress: string;
+
+ let zrxToken: DummyERC20TokenContract;
+ let erc721Token: DummyERC721TokenContract;
+ let erc721Receiver: DummyERC721ReceiverContract;
+ let erc20Proxy: ERC20ProxyContract;
+ let erc721Proxy: ERC721ProxyContract;
+
+ let erc20Wrapper: ERC20Wrapper;
+ let erc721Wrapper: ERC721Wrapper;
+ let erc721MakerTokenId: BigNumber;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const usedAddresses = ([owner, notAuthorized, exchangeAddress, makerAddress, takerAddress] = _.slice(
+ accounts,
+ 0,
+ 5,
+ ));
+
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+ erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 1;
+ [zrxToken] = await erc20Wrapper.deployDummyTokensAsync(numDummyErc20ToDeploy, constants.DUMMY_TOKEN_DECIMALS);
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+ erc721MakerTokenId = erc721Balances[makerAddress][erc721Token.address][0];
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeAddress, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ erc721Receiver = await DummyERC721ReceiverContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC721Receiver,
+ provider,
+ txDefaults,
+ );
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('Transfer Proxy - ERC20', () => {
+ describe('transferFrom', () => {
+ it('should successfully transfer tokens', async () => {
+ // Construct ERC20 asset data
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ // Perform a transfer from makerAddress to takerAddress
+ const erc20Balances = await erc20Wrapper.getBalancesAsync();
+ const amount = new BigNumber(10);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await web3Wrapper.sendTransactionAsync({
+ to: erc20Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Verify transfer was successful
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(amount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].add(amount),
+ );
+ });
+
+ it('should do nothing if transferring 0 amount of a token', async () => {
+ // Construct ERC20 asset data
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ // Perform a transfer from makerAddress to takerAddress
+ const erc20Balances = await erc20Wrapper.getBalancesAsync();
+ const amount = new BigNumber(0);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await web3Wrapper.sendTransactionAsync({
+ to: erc20Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Verify transfer was successful
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address],
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address],
+ );
+ });
+
+ it('should throw if allowances are too low', async () => {
+ // Construct ERC20 asset data
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ // Create allowance less than transfer amount. Set allowance on proxy.
+ const allowance = new BigNumber(0);
+ const amount = new BigNumber(10);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.approve.sendTransactionAsync(erc20Proxy.address, allowance, {
+ from: makerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Perform a transfer; expect this to fail.
+ await expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc20Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ RevertReason.TransferFailed,
+ );
+ });
+
+ it('should throw if requesting address is not authorized', async () => {
+ // Construct ERC20 asset data
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(10);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ await expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc20Proxy.address,
+ data,
+ from: notAuthorized,
+ }),
+ RevertReason.SenderNotAuthorized,
+ );
+ });
+ });
+
+ it('should have an id of 0xf47261b0', async () => {
+ const proxyId = await erc20Proxy.getProxyId.callAsync();
+ const expectedProxyId = '0xf47261b0';
+ expect(proxyId).to.equal(expectedProxyId);
+ });
+ });
+
+ describe('Transfer Proxy - ERC721', () => {
+ describe('transferFrom', () => {
+ it('should successfully transfer tokens', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Verify pre-condition
+ const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(1);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Verify transfer was successful
+ const newOwnerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(newOwnerMakerAsset).to.be.bignumber.equal(takerAddress);
+ });
+
+ it('should not call onERC721Received when transferring to a smart contract', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Verify pre-condition
+ const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(1);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ erc721Receiver.address,
+ amount,
+ );
+ const logDecoder = new LogDecoder(web3Wrapper, erc721Receiver.address);
+ const tx = await logDecoder.getTxWithDecodedLogsAsync(
+ await web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: exchangeAddress,
+ gas: constants.MAX_TRANSFER_FROM_GAS,
+ }),
+ );
+ // Verify that no log was emitted by erc721 receiver
+ expect(tx.logs.length).to.be.equal(0);
+ // Verify transfer was successful
+ const newOwnerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(newOwnerMakerAsset).to.be.bignumber.equal(erc721Receiver.address);
+ });
+
+ it('should throw if transferring 0 amount of a token', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Verify pre-condition
+ const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(0);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ return expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ RevertReason.InvalidAmount,
+ );
+ });
+
+ it('should throw if transferring > 1 amount of a token', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Verify pre-condition
+ const ownerMakerAsset = await erc721Token.ownerOf.callAsync(erc721MakerTokenId);
+ expect(ownerMakerAsset).to.be.bignumber.equal(makerAddress);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(500);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ return expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ RevertReason.InvalidAmount,
+ );
+ });
+
+ it('should throw if allowances are too low', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Remove transfer approval for makerAddress.
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Token.approve.sendTransactionAsync(constants.NULL_ADDRESS, erc721MakerTokenId, {
+ from: makerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Perform a transfer; expect this to fail.
+ const amount = new BigNumber(1);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ return expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: exchangeAddress,
+ }),
+ RevertReason.TransferFailed,
+ );
+ });
+
+ it('should throw if requesting address is not authorized', async () => {
+ // Construct ERC721 asset data
+ const encodedAssetData = assetDataUtils.encodeERC721AssetData(erc721Token.address, erc721MakerTokenId);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(1);
+ const data = assetProxyInterface.transferFrom.getABIEncodedTransactionData(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ );
+ return expectTransactionFailedAsync(
+ web3Wrapper.sendTransactionAsync({
+ to: erc721Proxy.address,
+ data,
+ from: notAuthorized,
+ }),
+ RevertReason.SenderNotAuthorized,
+ );
+ });
+ });
+
+ it('should have an id of 0x02571792', async () => {
+ const proxyId = await erc721Proxy.getProxyId.callAsync();
+ const expectedProxyId = '0x02571792';
+ expect(proxyId).to.equal(expectedProxyId);
+ });
+ });
+});
+// tslint:enable:no-unnecessary-type-assertion
+// tslint:disable:max-file-line-count
diff --git a/packages/contracts/test/ether_token.ts b/packages/contracts/test/ether_token.ts
deleted file mode 100644
index 6c7354c2b..000000000
--- a/packages/contracts/test/ether_token.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { ZeroEx, ZeroExError } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber, promisify } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-
-import { constants } from '../util/constants';
-import { ContractName } from '../util/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('EtherToken', () => {
- let account: string;
- const gasPrice = ZeroEx.toBaseUnitAmount(new BigNumber(20), 9);
- let zeroEx: ZeroEx;
- let etherTokenAddress: string;
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- account = accounts[0];
-
- const etherToken = await deployer.deployAsync(ContractName.EtherToken);
- etherTokenAddress = etherToken.address;
- zeroEx = new ZeroEx(web3.currentProvider, {
- gasPrice,
- networkId: constants.TESTRPC_NETWORK_ID,
- });
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('deposit', () => {
- it('should throw if caller attempts to deposit more Ether than caller balance', async () => {
- const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const ethToDeposit = initEthBalance.plus(1);
-
- return expect(zeroEx.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account)).to.be.rejectedWith(
- ZeroExError.InsufficientEthBalanceForDeposit,
- );
- });
-
- it('should convert deposited Ether to wrapped Ether tokens', async () => {
- const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const initEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
-
- const ethToDeposit = new BigNumber(web3.toWei(1, 'ether'));
-
- const txHash = await zeroEx.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account);
- const receipt = await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
- const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const finalEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
-
- expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas)));
- expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit));
- });
- });
-
- describe('withdraw', () => {
- it('should throw if caller attempts to withdraw greater than caller balance', async () => {
- const initEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
- const ethTokensToWithdraw = initEthTokenBalance.plus(1);
-
- return expect(
- zeroEx.etherToken.withdrawAsync(etherTokenAddress, ethTokensToWithdraw, account),
- ).to.be.rejectedWith(ZeroExError.InsufficientWEthBalanceForWithdrawal);
- });
-
- it('should convert ether tokens to ether with sufficient balance', async () => {
- const ethToDeposit = new BigNumber(web3.toWei(1, 'ether'));
- await zeroEx.etherToken.depositAsync(etherTokenAddress, ethToDeposit, account);
- const initEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
- const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const ethTokensToWithdraw = initEthTokenBalance;
- expect(ethTokensToWithdraw).to.not.be.bignumber.equal(0);
- const txHash = await zeroEx.etherToken.withdrawAsync(etherTokenAddress, ethTokensToWithdraw, account, {
- gasLimit: constants.MAX_ETHERTOKEN_WITHDRAW_GAS,
- });
- const receipt = await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
- const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const finalEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
-
- expect(finalEthBalance).to.be.bignumber.equal(
- initEthBalance.plus(ethTokensToWithdraw.minus(ethSpentOnGas)),
- );
- expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.minus(ethTokensToWithdraw));
- });
- });
-
- describe('fallback', () => {
- it('should convert sent ether to ether tokens', async () => {
- const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const initEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
-
- const ethToDeposit = ZeroEx.toBaseUnitAmount(new BigNumber(1), 18);
-
- const txHash = await web3Wrapper.sendTransactionAsync({
- from: account,
- to: etherTokenAddress,
- value: ethToDeposit,
- gasPrice,
- });
-
- const receipt = await zeroEx.awaitTransactionMinedAsync(txHash);
-
- const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
- const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
- const finalEthTokenBalance = await zeroEx.token.getBalanceAsync(etherTokenAddress, account);
-
- expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas)));
- expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit));
- });
- });
-});
diff --git a/packages/contracts/test/exchange/core.ts b/packages/contracts/test/exchange/core.ts
index e276d11b3..b324988cc 100644
--- a/packages/contracts/test/exchange/core.ts
+++ b/packages/contracts/test/exchange/core.ts
@@ -1,124 +1,125 @@
-import { LogWithDecodedArgs, SignedOrder, TransactionReceiptWithDecodedLogs, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
import ethUtil = require('ethereumjs-util');
-import * as Web3 from 'web3';
-
-import { DummyTokenContract } from '../../src/contract_wrappers/generated/dummy_token';
-import {
- ExchangeContract,
- LogCancelContractEventArgs,
- LogErrorContractEventArgs,
- LogFillContractEventArgs,
-} from '../../src/contract_wrappers/generated/exchange';
-import { TokenTransferProxyContract } from '../../src/contract_wrappers/generated/token_transfer_proxy';
-import { Balances } from '../../util/balances';
-import { constants } from '../../util/constants';
-import { crypto } from '../../util/crypto';
-import { ExchangeWrapper } from '../../util/exchange_wrapper';
-import { OrderFactory } from '../../util/order_factory';
-import { BalancesByOwner, ContractName, ExchangeContractErrs } from '../../util/types';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+import { ExchangeCancelEventArgs, ExchangeContract } from '../../generated_contract_wrappers/exchange';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { getLatestBlockTimestampAsync, increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { ExchangeWrapper } from '../utils/exchange_wrapper';
+import { OrderFactory } from '../utils/order_factory';
+import { ERC20BalancesByOwner, OrderStatus } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
const expect = chai.expect;
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('Exchange', () => {
- let maker: string;
- let tokenOwner: string;
- let taker: string;
- let feeRecipient: string;
- const INITIAL_BALANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
- const INITIAL_ALLOWANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
-
- let rep: DummyTokenContract;
- let dgd: DummyTokenContract;
- let zrx: DummyTokenContract;
+// tslint:disable:no-unnecessary-type-assertion
+describe('Exchange core', () => {
+ let makerAddress: string;
+ let owner: string;
+ let takerAddress: string;
+ let feeRecipientAddress: string;
+
+ let erc20TokenA: DummyERC20TokenContract;
+ let erc20TokenB: DummyERC20TokenContract;
+ let zrxToken: DummyERC20TokenContract;
+ let erc721Token: DummyERC721TokenContract;
let exchange: ExchangeContract;
- let tokenTransferProxy: TokenTransferProxyContract;
+ let erc20Proxy: ERC20ProxyContract;
+ let erc721Proxy: ERC721ProxyContract;
let signedOrder: SignedOrder;
- let balances: BalancesByOwner;
- let exWrapper: ExchangeWrapper;
- let dmyBalances: Balances;
+ let erc20Balances: ERC20BalancesByOwner;
+ let exchangeWrapper: ExchangeWrapper;
+ let erc20Wrapper: ERC20Wrapper;
+ let erc721Wrapper: ERC721Wrapper;
let orderFactory: OrderFactory;
- let zeroEx: ZeroEx;
+ let erc721MakerAssetIds: BigNumber[];
+ let erc721TakerAssetIds: BigNumber[];
+
+ let defaultMakerAssetAddress: string;
+ let defaultTakerAssetAddress: string;
before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
- maker = accounts[0];
- [tokenOwner, taker, feeRecipient] = accounts;
- const [repInstance, dgdInstance, zrxInstance] = await Promise.all([
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- ]);
- rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
- dgd = new DummyTokenContract(web3Wrapper, dgdInstance.abi, dgdInstance.address);
- zrx = new DummyTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
- const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
- tokenTransferProxy = new TokenTransferProxyContract(
- web3Wrapper,
- tokenTransferProxyInstance.abi,
- tokenTransferProxyInstance.address,
+ const usedAddresses = ([owner, makerAddress, takerAddress, feeRecipientAddress] = _.slice(accounts, 0, 4));
+
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+ erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 3;
+ [erc20TokenA, erc20TokenB, zrxToken] = await erc20Wrapper.deployDummyTokensAsync(
+ numDummyErc20ToDeploy,
+ constants.DUMMY_TOKEN_DECIMALS,
);
- const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
- zrx.address,
- tokenTransferProxy.address,
- ]);
- exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: accounts[0] });
- zeroEx = new ZeroEx(web3.currentProvider, {
- exchangeContractAddress: exchange.address,
- networkId: constants.TESTRPC_NETWORK_ID,
- });
- exWrapper = new ExchangeWrapper(exchange, zeroEx);
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+ erc721MakerAssetIds = erc721Balances[makerAddress][erc721Token.address];
+ erc721TakerAssetIds = erc721Balances[takerAddress][erc721Token.address];
+
+ exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ );
+ exchangeWrapper = new ExchangeWrapper(exchange, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(erc721Proxy.address, owner);
- const defaultOrderParams = {
- exchangeContractAddress: exchange.address,
- maker,
- feeRecipient,
- makerTokenAddress: rep.address,
- takerTokenAddress: dgd.address,
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
- makerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
- takerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
- };
- orderFactory = new OrderFactory(zeroEx, defaultOrderParams);
- dmyBalances = new Balances([rep, dgd, zrx], [maker, taker, feeRecipient]);
- await Promise.all([
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: maker,
- }),
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
- }),
- rep.setBalance.sendTransactionAsync(maker, INITIAL_BALANCE, { from: tokenOwner }),
- rep.setBalance.sendTransactionAsync(taker, INITIAL_BALANCE, { from: tokenOwner }),
- dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: maker,
- }),
- dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
}),
- dgd.setBalance.sendTransactionAsync(maker, INITIAL_BALANCE, { from: tokenOwner }),
- dgd.setBalance.sendTransactionAsync(taker, INITIAL_BALANCE, { from: tokenOwner }),
- zrx.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: maker,
- }),
- zrx.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
}),
- zrx.setBalance.sendTransactionAsync(maker, INITIAL_BALANCE, { from: tokenOwner }),
- zrx.setBalance.sendTransactionAsync(taker, INITIAL_BALANCE, { from: tokenOwner }),
- ]);
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ defaultMakerAssetAddress = erc20TokenA.address;
+ defaultTakerAssetAddress = erc20TokenB.address;
+
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ exchangeAddress: exchange.address,
+ makerAddress,
+ feeRecipientAddress,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ };
+ const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ orderFactory = new OrderFactory(privateKey, defaultOrderParams);
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -126,756 +127,454 @@ describe('Exchange', () => {
afterEach(async () => {
await blockchainLifecycle.revertAsync();
});
- describe('internal functions', () => {
- it('should include transferViaTokenTransferProxy', () => {
- expect((exchange as any).transferViaTokenTransferProxy).to.be.undefined();
- });
-
- it('should include isTransferable', () => {
- expect((exchange as any).isTransferable).to.be.undefined();
- });
-
- it('should include getBalance', () => {
- expect((exchange as any).getBalance).to.be.undefined();
- });
-
- it('should include getAllowance', () => {
- expect((exchange as any).getAllowance).to.be.undefined();
- });
- });
-
describe('fillOrder', () => {
beforeEach(async () => {
- balances = await dmyBalances.getAsync();
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
signedOrder = await orderFactory.newSignedOrderAsync();
});
- it('should create an unfillable order', async () => {
+ it('should throw if signature is invalid', async () => {
signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: new BigNumber(1001),
- takerTokenAmount: new BigNumber(3),
- });
-
- const filledTakerTokenAmountBefore = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountBefore).to.be.bignumber.equal(0);
-
- const fillTakerTokenAmount1 = new BigNumber(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: fillTakerTokenAmount1,
- });
-
- const filledTakerTokenAmountAfter1 = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountAfter1).to.be.bignumber.equal(fillTakerTokenAmount1);
-
- const fillTakerTokenAmount2 = new BigNumber(1);
- await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: fillTakerTokenAmount2,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
});
- const filledTakerTokenAmountAfter2 = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
+ const v = ethUtil.toBuffer(signedOrder.signature.slice(0, 4));
+ const invalidR = ethUtil.sha3('invalidR');
+ const invalidS = ethUtil.sha3('invalidS');
+ const signatureType = ethUtil.toBuffer(`0x${signedOrder.signature.slice(-2)}`);
+ const invalidSigBuff = Buffer.concat([v, invalidR, invalidS, signatureType]);
+ const invalidSigHex = `0x${invalidSigBuff.toString('hex')}`;
+ signedOrder.signature = invalidSigHex;
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
+ RevertReason.InvalidOrderSignature,
);
- expect(filledTakerTokenAmountAfter2).to.be.bignumber.equal(filledTakerTokenAmountAfter1);
});
- it('should transfer the correct amounts when makerTokenAmount === takerTokenAmount', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- });
-
- const filledTakerTokenAmountBefore = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountBefore).to.be.bignumber.equal(0);
-
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, { fillTakerTokenAmount });
-
- const filledTakerTokenAmountAfter = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountAfter).to.be.bignumber.equal(fillTakerTokenAmount);
-
- const newBalances = await dmyBalances.getAsync();
-
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
- const paidMakerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- const paidTakerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(fillMakerTokenAmount),
- );
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(fillTakerTokenAmount),
- );
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(paidMakerFee),
- );
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(fillTakerTokenAmount),
- );
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(fillMakerTokenAmount),
- );
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(paidTakerFee),
- );
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(paidMakerFee.add(paidTakerFee)),
+ it('should throw if no value is filled', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress),
+ RevertReason.OrderUnfillable,
);
});
+ });
- it('should transfer the correct amounts when makerTokenAmount > takerTokenAmount', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- });
-
- const filledTakerTokenAmountBefore = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountBefore).to.be.bignumber.equal(0);
-
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, { fillTakerTokenAmount });
+ describe('cancelOrder', () => {
+ beforeEach(async () => {
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ });
- const filledTakerTokenAmountAfter = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountAfter).to.be.bignumber.equal(fillTakerTokenAmount);
-
- const newBalances = await dmyBalances.getAsync();
-
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
- const paidMakerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- const paidTakerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(fillMakerTokenAmount),
- );
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(fillTakerTokenAmount),
- );
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(paidMakerFee),
- );
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(fillTakerTokenAmount),
- );
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(fillMakerTokenAmount),
- );
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(paidTakerFee),
- );
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(paidMakerFee.add(paidTakerFee)),
+ it('should throw if not sent by maker', async () => {
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrderAsync(signedOrder, takerAddress),
+ RevertReason.InvalidMaker,
);
});
- it('should transfer the correct amounts when makerTokenAmount < takerTokenAmount', async () => {
+ it('should throw if makerAssetAmount is 0', async () => {
signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
+ makerAssetAmount: new BigNumber(0),
});
- const filledTakerTokenAmountBefore = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountBefore).to.be.bignumber.equal(0);
-
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, { fillTakerTokenAmount });
-
- const filledTakerTokenAmountAfter = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountAfter).to.be.bignumber.equal(fillTakerTokenAmount);
-
- const newBalances = await dmyBalances.getAsync();
-
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
- const paidMakerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- const paidTakerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(fillMakerTokenAmount),
- );
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(fillTakerTokenAmount),
- );
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(paidMakerFee),
- );
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(fillTakerTokenAmount),
- );
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(fillMakerTokenAmount),
- );
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(paidTakerFee),
- );
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(paidMakerFee.add(paidTakerFee)),
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress),
+ RevertReason.OrderUnfillable,
);
});
- it('should transfer the correct amounts when taker is specified and order is claimed by taker', async () => {
+ it('should throw if takerAssetAmount is 0', async () => {
signedOrder = await orderFactory.newSignedOrderAsync({
- taker,
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
+ takerAssetAmount: new BigNumber(0),
});
- const filledTakerTokenAmountBefore = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- expect(filledTakerTokenAmountBefore).to.be.bignumber.equal(0);
-
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, { fillTakerTokenAmount });
-
- const filledTakerTokenAmountAfter = await zeroEx.exchange.getFilledTakerAmountAsync(
- ZeroEx.getOrderHashHex(signedOrder),
- );
- const expectedFillAmountTAfter = fillTakerTokenAmount.add(filledTakerTokenAmountBefore);
- expect(filledTakerTokenAmountAfter).to.be.bignumber.equal(expectedFillAmountTAfter);
-
- const newBalances = await dmyBalances.getAsync();
-
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
- const paidMakerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- const paidTakerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(fillMakerTokenAmount),
- );
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(fillTakerTokenAmount),
- );
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(paidMakerFee),
- );
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(fillTakerTokenAmount),
- );
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(fillMakerTokenAmount),
- );
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(paidTakerFee),
- );
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(paidMakerFee.add(paidTakerFee)),
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress),
+ RevertReason.OrderUnfillable,
);
});
- it('should fill remaining value if fillTakerTokenAmount > remaining takerTokenAmount', async () => {
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrderAsync(signedOrder, taker, { fillTakerTokenAmount });
-
- const res = await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount,
- });
- const log = res.logs[0] as LogWithDecodedArgs<LogFillContractEventArgs>;
- expect(log.args.filledTakerTokenAmount).to.be.bignumber.equal(
- signedOrder.takerTokenAmount.minus(fillTakerTokenAmount),
- );
- const newBalances = await dmyBalances.getAsync();
-
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(signedOrder.makerTokenAmount),
- );
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(signedOrder.takerTokenAmount),
- );
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(signedOrder.makerFee),
- );
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(signedOrder.takerTokenAmount),
- );
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(signedOrder.makerTokenAmount),
- );
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(signedOrder.takerFee),
- );
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(signedOrder.makerFee.add(signedOrder.takerFee)),
+ it('should be able to cancel a full order', async () => {
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount: signedOrder.takerAssetAmount.div(2),
+ }),
+ RevertReason.OrderUnfillable,
);
});
- it('should log 1 event with the correct arguments when order has a feeRecipient', async () => {
- const divisor = 2;
- const res = await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount.div(divisor),
- });
- expect(res.logs).to.have.length(1);
-
- const logArgs = (res.logs[0] as LogWithDecodedArgs<LogFillContractEventArgs>).args;
- const expectedFilledMakerTokenAmount = signedOrder.makerTokenAmount.div(divisor);
- const expectedFilledTakerTokenAmount = signedOrder.takerTokenAmount.div(divisor);
- const expectedFeeMPaid = signedOrder.makerFee.div(divisor);
- const expectedFeeTPaid = signedOrder.takerFee.div(divisor);
- const tokensHashBuff = crypto.solSHA3([signedOrder.makerTokenAddress, signedOrder.takerTokenAddress]);
- const expectedTokens = ethUtil.bufferToHex(tokensHashBuff);
-
- expect(signedOrder.maker).to.be.equal(logArgs.maker);
- expect(taker).to.be.equal(logArgs.taker);
- expect(signedOrder.feeRecipient).to.be.equal(logArgs.feeRecipient);
- expect(signedOrder.makerTokenAddress).to.be.equal(logArgs.makerToken);
- expect(signedOrder.takerTokenAddress).to.be.equal(logArgs.takerToken);
- expect(expectedFilledMakerTokenAmount).to.be.bignumber.equal(logArgs.filledMakerTokenAmount);
- expect(expectedFilledTakerTokenAmount).to.be.bignumber.equal(logArgs.filledTakerTokenAmount);
- expect(expectedFeeMPaid).to.be.bignumber.equal(logArgs.paidMakerFee);
- expect(expectedFeeTPaid).to.be.bignumber.equal(logArgs.paidTakerFee);
- expect(expectedTokens).to.be.equal(logArgs.tokens);
- expect(ZeroEx.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
- });
-
- it('should log 1 event with the correct arguments when order has no feeRecipient', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- feeRecipient: ZeroEx.NULL_ADDRESS,
- });
- const divisor = 2;
- const res = await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount.div(divisor),
- });
+ it('should log 1 event with correct arguments', async () => {
+ const res = await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
expect(res.logs).to.have.length(1);
- const logArgs = (res.logs[0] as LogWithDecodedArgs<LogFillContractEventArgs>).args;
- const expectedFilledMakerTokenAmount = signedOrder.makerTokenAmount.div(divisor);
- const expectedFilledTakerTokenAmount = signedOrder.takerTokenAmount.div(divisor);
- const expectedFeeMPaid = new BigNumber(0);
- const expectedFeeTPaid = new BigNumber(0);
- const tokensHashBuff = crypto.solSHA3([signedOrder.makerTokenAddress, signedOrder.takerTokenAddress]);
- const expectedTokens = ethUtil.bufferToHex(tokensHashBuff);
-
- expect(signedOrder.maker).to.be.equal(logArgs.maker);
- expect(taker).to.be.equal(logArgs.taker);
- expect(signedOrder.feeRecipient).to.be.equal(logArgs.feeRecipient);
- expect(signedOrder.makerTokenAddress).to.be.equal(logArgs.makerToken);
- expect(signedOrder.takerTokenAddress).to.be.equal(logArgs.takerToken);
- expect(expectedFilledMakerTokenAmount).to.be.bignumber.equal(logArgs.filledMakerTokenAmount);
- expect(expectedFilledTakerTokenAmount).to.be.bignumber.equal(logArgs.filledTakerTokenAmount);
- expect(expectedFeeMPaid).to.be.bignumber.equal(logArgs.paidMakerFee);
- expect(expectedFeeTPaid).to.be.bignumber.equal(logArgs.paidTakerFee);
- expect(expectedTokens).to.be.equal(logArgs.tokens);
- expect(ZeroEx.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
- });
-
- it('should throw when taker is specified and order is claimed by other', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- taker: feeRecipient,
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
- });
-
- return expect(exWrapper.fillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if signature is invalid', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(10), 18),
- });
+ const log = res.logs[0] as LogWithDecodedArgs<ExchangeCancelEventArgs>;
+ const logArgs = log.args;
- signedOrder.ecSignature.r = ethUtil.bufferToHex(ethUtil.sha3('invalidR'));
- signedOrder.ecSignature.s = ethUtil.bufferToHex(ethUtil.sha3('invalidS'));
- return expect(exWrapper.fillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
+ expect(signedOrder.makerAddress).to.be.equal(logArgs.makerAddress);
+ expect(signedOrder.makerAddress).to.be.equal(logArgs.senderAddress);
+ expect(signedOrder.feeRecipientAddress).to.be.equal(logArgs.feeRecipientAddress);
+ expect(signedOrder.makerAssetData).to.be.equal(logArgs.makerAssetData);
+ expect(signedOrder.takerAssetData).to.be.equal(logArgs.takerAssetData);
+ expect(orderHashUtils.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
});
- it('should throw if makerTokenAmount is 0', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: new BigNumber(0),
- });
-
- return expect(exWrapper.fillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
+ it('should throw if already cancelled', async () => {
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress),
+ RevertReason.OrderUnfillable,
+ );
});
- it('should throw if takerTokenAmount is 0', async () => {
+ it('should throw if order is expired', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAmount: new BigNumber(0),
+ expirationTimeSeconds: new BigNumber(currentTimestamp).sub(10),
});
-
- return expect(exWrapper.fillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if fillTakerTokenAmount is 0', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync();
-
- return expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: new BigNumber(0),
- }),
- ).to.be.rejectedWith(constants.REVERT);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress),
+ RevertReason.OrderUnfillable,
+ );
});
- it('should not change balances if maker balances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
+ it('should throw if rounding error is greater than 0.1%', async () => {
signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100000), 18),
+ makerAssetAmount: new BigNumber(1001),
+ takerAssetAmount: new BigNumber(3),
});
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should throw if maker balances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = true', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100000), 18),
+ const fillTakerAssetAmount1 = new BigNumber(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount: fillTakerAssetAmount1,
});
- return expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- shouldThrowOnInsufficientBalanceOrAllowance: true,
+ const fillTakerAssetAmount2 = new BigNumber(1);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount: fillTakerAssetAmount2,
}),
- ).to.be.rejectedWith(constants.REVERT);
+ RevertReason.RoundingError,
+ );
});
+ });
- it('should not change balances if taker balances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100000), 18),
- });
-
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
+ describe('cancelOrdersUpTo', () => {
+ it('should fail to set orderEpoch less than current orderEpoch', async () => {
+ const orderEpoch = new BigNumber(1);
+ await exchangeWrapper.cancelOrdersUpToAsync(orderEpoch, makerAddress);
+ const lesserOrderEpoch = new BigNumber(0);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrdersUpToAsync(lesserOrderEpoch, makerAddress),
+ RevertReason.InvalidNewOrderEpoch,
+ );
});
- it('should throw if taker balances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = true', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100000), 18),
- });
-
- return expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- shouldThrowOnInsufficientBalanceOrAllowance: true,
- }),
- ).to.be.rejectedWith(constants.REVERT);
+ it('should fail to set orderEpoch equal to existing orderEpoch', async () => {
+ const orderEpoch = new BigNumber(1);
+ await exchangeWrapper.cancelOrdersUpToAsync(orderEpoch, makerAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.cancelOrdersUpToAsync(orderEpoch, makerAddress),
+ RevertReason.InvalidNewOrderEpoch,
+ );
});
- it('should not change balances if maker allowances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- await rep.approve.sendTransactionAsync(tokenTransferProxy.address, new BigNumber(0), { from: maker });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- await rep.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: maker,
- });
-
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
+ it('should cancel only orders with a orderEpoch less than existing orderEpoch', async () => {
+ // Cancel all transactions with a orderEpoch less than 1
+ const orderEpoch = new BigNumber(1);
+ await exchangeWrapper.cancelOrdersUpToAsync(orderEpoch, makerAddress);
- it('should throw if maker allowances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = true', async () => {
- await rep.approve.sendTransactionAsync(tokenTransferProxy.address, new BigNumber(0), { from: maker });
- expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- shouldThrowOnInsufficientBalanceOrAllowance: true,
+ // Create 3 orders with orderEpoch values: 0,1,2,3
+ // Since we cancelled with orderEpoch=1, orders with orderEpoch<=1 will not be processed
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ const signedOrders = [
+ await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(9), 18),
+ salt: new BigNumber(0),
}),
- ).to.be.rejectedWith(constants.REVERT);
- await rep.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: maker,
- });
- });
-
- it('should not change balances if taker allowances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- await dgd.approve.sendTransactionAsync(tokenTransferProxy.address, new BigNumber(0), { from: taker });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- await dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
- });
-
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should throw if taker allowances are too low to fill order and \
- shouldThrowOnInsufficientBalanceOrAllowance = true', async () => {
- await dgd.approve.sendTransactionAsync(tokenTransferProxy.address, new BigNumber(0), { from: taker });
- expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- shouldThrowOnInsufficientBalanceOrAllowance: true,
+ await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(79), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(79), 18),
+ salt: new BigNumber(1),
}),
- ).to.be.rejectedWith(constants.REVERT);
- await dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
- });
- });
-
- it('should not change balances if makerTokenAddress is ZRX, makerTokenAmount + makerFee > maker balance, \
- and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- const makerZRXBalance = new BigNumber(balances[maker][zrx.address]);
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAddress: zrx.address,
- makerTokenAmount: makerZRXBalance,
- makerFee: new BigNumber(1),
- });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should not change balances if makerTokenAddress is ZRX, makerTokenAmount + makerFee > maker allowance, \
- and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- const makerZRXAllowance = await zrx.allowance.callAsync(maker, tokenTransferProxy.address);
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAddress: zrx.address,
- makerTokenAmount: new BigNumber(makerZRXAllowance),
- makerFee: new BigNumber(1),
- });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should not change balances if takerTokenAddress is ZRX, takerTokenAmount + takerFee > taker balance, \
- and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- const takerZRXBalance = new BigNumber(balances[taker][zrx.address]);
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAddress: zrx.address,
- takerTokenAmount: takerZRXBalance,
- takerFee: new BigNumber(1),
- });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should not change balances if takerTokenAddress is ZRX, takerTokenAmount + takerFee > taker allowance, \
- and shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- const takerZRXAllowance = await zrx.allowance.callAsync(taker, tokenTransferProxy.address);
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAddress: zrx.address,
- takerTokenAmount: new BigNumber(takerZRXAllowance),
- takerFee: new BigNumber(1),
- });
- await exWrapper.fillOrderAsync(signedOrder, taker);
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should throw if getBalance or getAllowance attempts to change state and \
- shouldThrowOnInsufficientBalanceOrAllowance = false', async () => {
- const maliciousToken = await deployer.deployAsync(ContractName.MaliciousToken);
- await maliciousToken.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, {
- from: taker,
- });
-
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAddress: maliciousToken.address,
- });
-
- return expect(
- exWrapper.fillOrderAsync(signedOrder, taker, {
- shouldThrowOnInsufficientBalanceOrAllowance: false,
+ await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(979), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(979), 18),
+ salt: new BigNumber(2),
}),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should not change balances if an order is expired', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- expirationUnixTimestampSec: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
- });
- await exWrapper.fillOrderAsync(signedOrder, taker);
-
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should log an error event if an order is expired', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- expirationUnixTimestampSec: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
- });
-
- const res = await exWrapper.fillOrderAsync(signedOrder, taker);
- expect(res.logs).to.have.length(1);
- const log = res.logs[0] as LogWithDecodedArgs<LogErrorContractEventArgs>;
- const errCode = log.args.errorId;
- expect(errCode).to.be.equal(ExchangeContractErrs.ERROR_ORDER_EXPIRED);
- });
-
- it('should log an error event if no value is filled', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({});
- await exWrapper.fillOrderAsync(signedOrder, taker);
-
- const res = await exWrapper.fillOrderAsync(signedOrder, taker);
- expect(res.logs).to.have.length(1);
- const log = res.logs[0] as LogWithDecodedArgs<LogErrorContractEventArgs>;
- const errCode = log.args.errorId;
- expect(errCode).to.be.equal(ExchangeContractErrs.ERROR_ORDER_FULLY_FILLED_OR_CANCELLED);
- });
- });
-
- describe('cancelOrder', () => {
- beforeEach(async () => {
- balances = await dmyBalances.getAsync();
- signedOrder = await orderFactory.newSignedOrderAsync();
- });
-
- it('should throw if not sent by maker', async () => {
- return expect(exWrapper.cancelOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if makerTokenAmount is 0', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: new BigNumber(0),
- });
-
- return expect(exWrapper.cancelOrderAsync(signedOrder, maker)).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if takerTokenAmount is 0', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- takerTokenAmount: new BigNumber(0),
- });
-
- return expect(exWrapper.cancelOrderAsync(signedOrder, maker)).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if cancelTakerTokenAmount is 0', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync();
-
- return expect(
- exWrapper.cancelOrderAsync(signedOrder, maker, {
- cancelTakerTokenAmount: new BigNumber(0),
+ await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(7979), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(7979), 18),
+ salt: new BigNumber(3),
}),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should be able to cancel a full order', async () => {
- await exWrapper.cancelOrderAsync(signedOrder, maker);
- await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount.div(2),
- });
-
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
- });
-
- it('should be able to cancel part of an order', async () => {
- const cancelTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.cancelOrderAsync(signedOrder, maker, {
- cancelTakerTokenAmount,
- });
-
- const res = await exWrapper.fillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount,
+ ];
+ await exchangeWrapper.batchFillOrdersNoThrowAsync(signedOrders, takerAddress, {
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 490000,
});
- const log = res.logs[0] as LogWithDecodedArgs<LogFillContractEventArgs>;
- expect(log.args.filledTakerTokenAmount).to.be.bignumber.equal(
- signedOrder.takerTokenAmount.minus(cancelTakerTokenAmount),
- );
- const newBalances = await dmyBalances.getAsync();
- const cancelMakerTokenAmount = cancelTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
- const paidMakerFee = signedOrder.makerFee
- .times(cancelMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- const paidTakerFee = signedOrder.takerFee
- .times(cancelMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(cancelMakerTokenAmount),
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ const fillMakerAssetAmount = signedOrders[2].makerAssetAmount.add(signedOrders[3].makerAssetAmount);
+ const fillTakerAssetAmount = signedOrders[2].takerAssetAmount.add(signedOrders[3].takerAssetAmount);
+ const makerFee = signedOrders[2].makerFee.add(signedOrders[3].makerFee);
+ const takerFee = signedOrders[2].takerFee.add(signedOrders[3].takerFee);
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(fillMakerAssetAmount),
);
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(cancelTakerTokenAmount),
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(fillTakerAssetAmount),
);
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(paidMakerFee),
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
);
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(cancelTakerTokenAmount),
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(fillTakerAssetAmount),
);
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(cancelMakerTokenAmount),
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(fillMakerAssetAmount),
);
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(paidTakerFee),
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
);
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(paidMakerFee.add(paidTakerFee)),
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
);
});
+ });
- it('should log 1 event with correct arguments', async () => {
- const divisor = 2;
- const res = await exWrapper.cancelOrderAsync(signedOrder, maker, {
- cancelTakerTokenAmount: signedOrder.takerTokenAmount.div(divisor),
+ describe('Testing Exchange of ERC721 Tokens', () => {
+ it('should throw when maker does not own the token with id makerAssetId', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721TakerAssetIds[0];
+ const takerAssetId = erc721TakerAssetIds[1];
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ });
+ // Verify pre-conditions
+ const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(initialOwnerMakerAsset).to.be.bignumber.not.equal(makerAddress);
+ const initialOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(initialOwnerTakerAsset).to.be.bignumber.equal(takerAddress);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount }),
+ RevertReason.TransferFailed,
+ );
+ });
+
+ it('should throw when taker does not own the token with id takerAssetId', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721MakerAssetIds[0];
+ const takerAssetId = erc721MakerAssetIds[1];
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ });
+ // Verify pre-conditions
+ const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(initialOwnerMakerAsset).to.be.bignumber.equal(makerAddress);
+ const initialOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(initialOwnerTakerAsset).to.be.bignumber.not.equal(takerAddress);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount }),
+ RevertReason.TransferFailed,
+ );
+ });
+
+ it('should throw when makerAssetAmount is greater than 1', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721MakerAssetIds[0];
+ const takerAssetId = erc721TakerAssetIds[0];
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(2),
+ takerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ });
+ // Verify pre-conditions
+ const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(initialOwnerMakerAsset).to.be.bignumber.equal(makerAddress);
+ const initialOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(initialOwnerTakerAsset).to.be.bignumber.equal(takerAddress);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount }),
+ RevertReason.InvalidAmount,
+ );
+ });
+
+ it('should throw when takerAssetAmount is greater than 1', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721MakerAssetIds[0];
+ const takerAssetId = erc721TakerAssetIds[0];
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: new BigNumber(500),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ });
+ // Verify pre-conditions
+ const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(initialOwnerMakerAsset).to.be.bignumber.equal(makerAddress);
+ const initialOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(initialOwnerTakerAsset).to.be.bignumber.equal(takerAddress);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount }),
+ RevertReason.InvalidAmount,
+ );
+ });
+
+ it('should throw on partial fill', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721MakerAssetIds[0];
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
});
- expect(res.logs).to.have.length(1);
-
- const log = res.logs[0] as LogWithDecodedArgs<LogCancelContractEventArgs>;
- const logArgs = log.args;
- const expectedCancelledMakerTokenAmount = signedOrder.makerTokenAmount.div(divisor);
- const expectedCancelledTakerTokenAmount = signedOrder.takerTokenAmount.div(divisor);
- const tokensHashBuff = crypto.solSHA3([signedOrder.makerTokenAddress, signedOrder.takerTokenAddress]);
- const expectedTokens = ethUtil.bufferToHex(tokensHashBuff);
-
- expect(signedOrder.maker).to.be.equal(logArgs.maker);
- expect(signedOrder.feeRecipient).to.be.equal(logArgs.feeRecipient);
- expect(signedOrder.makerTokenAddress).to.be.equal(logArgs.makerToken);
- expect(signedOrder.takerTokenAddress).to.be.equal(logArgs.takerToken);
- expect(expectedCancelledMakerTokenAmount).to.be.bignumber.equal(logArgs.cancelledMakerTokenAmount);
- expect(expectedCancelledTakerTokenAmount).to.be.bignumber.equal(logArgs.cancelledTakerTokenAmount);
- expect(expectedTokens).to.be.equal(logArgs.tokens);
- expect(ZeroEx.getOrderHashHex(signedOrder)).to.be.equal(logArgs.orderHash);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount }),
+ RevertReason.RoundingError,
+ );
});
+ });
- it('should not log events if no value is cancelled', async () => {
- await exWrapper.cancelOrderAsync(signedOrder, maker);
-
- const res = await exWrapper.cancelOrderAsync(signedOrder, maker);
- expect(res.logs).to.have.length(1);
- const log = res.logs[0] as LogWithDecodedArgs<LogErrorContractEventArgs>;
- const errCode = log.args.errorId;
- expect(errCode).to.be.equal(ExchangeContractErrs.ERROR_ORDER_FULLY_FILLED_OR_CANCELLED);
+ describe('getOrderInfo', () => {
+ beforeEach(async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync();
});
-
- it('should not log events if order is expired', async () => {
- signedOrder = await orderFactory.newSignedOrderAsync({
- expirationUnixTimestampSec: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
- });
-
- const res = await exWrapper.cancelOrderAsync(signedOrder, maker);
- expect(res.logs).to.have.length(1);
- const log = res.logs[0] as LogWithDecodedArgs<LogErrorContractEventArgs>;
- const errCode = log.args.errorId;
- expect(errCode).to.be.equal(ExchangeContractErrs.ERROR_ORDER_EXPIRED);
+ it('should return the correct orderInfo for an unfilled valid order', async () => {
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a fully filled order', async () => {
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a cancelled and unfilled order', async () => {
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for a cancelled and partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ await exchangeWrapper.cancelOrderAsync(signedOrder, makerAddress);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and unfilled order', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and partially filled order', async () => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, { takerAssetFillAmount });
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = takerAssetFillAmount;
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an expired and fully filled order', async () => {
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress);
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrder.expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ // FULLY_FILLED takes precedence over EXPIRED
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an order with a makerAssetAmount of 0', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync({ makerAssetAmount: new BigNumber(0) });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.INVALID_MAKER_ASSET_AMOUNT;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ it('should return the correct orderInfo for an order with a takerAssetAmount of 0', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync({ takerAssetAmount: new BigNumber(0) });
+ const orderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrder);
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.INVALID_TAKER_ASSET_AMOUNT;
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
});
});
-}); // tslint:disable-line:max-file-line-count
+});
+// tslint:disable:max-file-line-count
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/exchange/dispatcher.ts b/packages/contracts/test/exchange/dispatcher.ts
new file mode 100644
index 000000000..81d142ca4
--- /dev/null
+++ b/packages/contracts/test/exchange/dispatcher.ts
@@ -0,0 +1,226 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
+import { AssetProxyId, RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+import {
+ TestAssetProxyDispatcherAssetProxyRegisteredEventArgs,
+ TestAssetProxyDispatcherContract,
+} from '../../generated_contract_wrappers/test_asset_proxy_dispatcher';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { LogDecoder } from '../utils/log_decoder';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// tslint:disable:no-unnecessary-type-assertion
+describe('AssetProxyDispatcher', () => {
+ let owner: string;
+ let notOwner: string;
+ let makerAddress: string;
+ let takerAddress: string;
+
+ let zrxToken: DummyERC20TokenContract;
+ let erc20Proxy: ERC20ProxyContract;
+ let erc721Proxy: ERC721ProxyContract;
+ let assetProxyDispatcher: TestAssetProxyDispatcherContract;
+
+ let erc20Wrapper: ERC20Wrapper;
+ let erc721Wrapper: ERC721Wrapper;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ // Setup accounts & addresses
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const usedAddresses = ([owner, notOwner, makerAddress, takerAddress] = _.slice(accounts, 0, 4));
+
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+ erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 1;
+ [zrxToken] = await erc20Wrapper.deployDummyTokensAsync(numDummyErc20ToDeploy, constants.DUMMY_TOKEN_DECIMALS);
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ erc721Proxy = await erc721Wrapper.deployProxyAsync();
+
+ assetProxyDispatcher = await TestAssetProxyDispatcherContract.deployFrom0xArtifactAsync(
+ artifacts.TestAssetProxyDispatcher,
+ provider,
+ txDefaults,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(assetProxyDispatcher.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('registerAssetProxy', () => {
+ it('should record proxy upon registration', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC20);
+ expect(proxyAddress).to.be.equal(erc20Proxy.address);
+ });
+
+ it('should be able to record multiple proxies', async () => {
+ // Record first proxy
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ let proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC20);
+ expect(proxyAddress).to.be.equal(erc20Proxy.address);
+ // Record another proxy
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc721Proxy.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC721);
+ expect(proxyAddress).to.be.equal(erc721Proxy.address);
+ });
+
+ it('should throw if a proxy with the same id is already registered', async () => {
+ // Initial registration
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC20);
+ expect(proxyAddress).to.be.equal(erc20Proxy.address);
+ // Deploy a new version of the ERC20 Transfer Proxy contract
+ const newErc20TransferProxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC20Proxy,
+ provider,
+ txDefaults,
+ );
+ // Register new ERC20 Transfer Proxy contract
+ return expectTransactionFailedAsync(
+ assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(newErc20TransferProxy.address, {
+ from: owner,
+ }),
+ RevertReason.AssetProxyAlreadyExists,
+ );
+ });
+
+ it('should throw if requesting address is not owner', async () => {
+ return expectTransactionFailedAsync(
+ assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: notOwner }),
+ RevertReason.OnlyContractOwner,
+ );
+ });
+
+ it('should log an event with correct arguments when an asset proxy is registered', async () => {
+ const logDecoder = new LogDecoder(web3Wrapper, assetProxyDispatcher.address);
+ const txReceipt = await logDecoder.getTxWithDecodedLogsAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ );
+ const logs = txReceipt.logs;
+ const log = logs[0] as LogWithDecodedArgs<TestAssetProxyDispatcherAssetProxyRegisteredEventArgs>;
+ expect(log.args.id).to.equal(AssetProxyId.ERC20);
+ expect(log.args.assetProxy).to.equal(erc20Proxy.address);
+ });
+ });
+
+ describe('getAssetProxy', () => {
+ it('should return correct address of registered proxy', async () => {
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC20);
+ expect(proxyAddress).to.be.equal(erc20Proxy.address);
+ });
+
+ it('should return NULL address if requesting non-existent proxy', async () => {
+ const proxyAddress = await assetProxyDispatcher.getAssetProxy.callAsync(AssetProxyId.ERC20);
+ expect(proxyAddress).to.be.equal(constants.NULL_ADDRESS);
+ });
+ });
+
+ describe('dispatchTransferFrom', () => {
+ it('should dispatch transfer to registered proxy', async () => {
+ // Register ERC20 proxy
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Construct metadata for ERC20 proxy
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+
+ // Perform a transfer from makerAddress to takerAddress
+ const erc20Balances = await erc20Wrapper.getBalancesAsync();
+ const amount = new BigNumber(10);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ { from: owner },
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Verify transfer was successful
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(amount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].add(amount),
+ );
+ });
+
+ it('should throw if dispatching to unregistered proxy', async () => {
+ // Construct metadata for ERC20 proxy
+ const encodedAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ // Perform a transfer from makerAddress to takerAddress
+ const amount = new BigNumber(10);
+ return expectTransactionFailedAsync(
+ assetProxyDispatcher.publicDispatchTransferFrom.sendTransactionAsync(
+ encodedAssetData,
+ makerAddress,
+ takerAddress,
+ amount,
+ { from: owner },
+ ),
+ RevertReason.AssetProxyDoesNotExist,
+ );
+ });
+ });
+});
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/exchange/fill_order.ts b/packages/contracts/test/exchange/fill_order.ts
new file mode 100644
index 000000000..1494fe093
--- /dev/null
+++ b/packages/contracts/test/exchange/fill_order.ts
@@ -0,0 +1,301 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import * as _ from 'lodash';
+
+import { chaiSetup } from '../utils/chai_setup';
+import {
+ FillOrderCombinatorialUtils,
+ fillOrderCombinatorialUtilsFactoryAsync,
+} from '../utils/fill_order_combinatorial_utils';
+import {
+ AllowanceAmountScenario,
+ AssetDataScenario,
+ BalanceAmountScenario,
+ ExpirationTimeSecondsScenario,
+ FeeRecipientAddressScenario,
+ FillScenario,
+ OrderAssetAmountScenario,
+ TakerAssetFillAmountScenario,
+ TakerScenario,
+} from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+const defaultFillScenario = {
+ orderScenario: {
+ takerScenario: TakerScenario.Unspecified,
+ feeRecipientScenario: FeeRecipientAddressScenario.EthUserAddress,
+ makerAssetAmountScenario: OrderAssetAmountScenario.Large,
+ takerAssetAmountScenario: OrderAssetAmountScenario.Large,
+ makerFeeScenario: OrderAssetAmountScenario.Large,
+ takerFeeScenario: OrderAssetAmountScenario.Large,
+ expirationTimeSecondsScenario: ExpirationTimeSecondsScenario.InFuture,
+ makerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ takerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount,
+ makerStateScenario: {
+ traderAssetBalance: BalanceAmountScenario.Higher,
+ traderAssetAllowance: AllowanceAmountScenario.Higher,
+ zrxFeeBalance: BalanceAmountScenario.Higher,
+ zrxFeeAllowance: AllowanceAmountScenario.Higher,
+ },
+ takerStateScenario: {
+ traderAssetBalance: BalanceAmountScenario.Higher,
+ traderAssetAllowance: AllowanceAmountScenario.Higher,
+ zrxFeeBalance: BalanceAmountScenario.Higher,
+ zrxFeeAllowance: AllowanceAmountScenario.Higher,
+ },
+};
+
+describe('FillOrder Tests', () => {
+ let fillOrderCombinatorialUtils: FillOrderCombinatorialUtils;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ fillOrderCombinatorialUtils = await fillOrderCombinatorialUtilsFactoryAsync(web3Wrapper, txDefaults);
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('fillOrder', () => {
+ const test = (fillScenarios: FillScenario[]) => {
+ _.forEach(fillScenarios, fillScenario => {
+ const description = `Combinatorial OrderFill: ${JSON.stringify(fillScenario)}`;
+ it(description, async () => {
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ });
+ };
+
+ const allFillScenarios = FillOrderCombinatorialUtils.generateFillOrderCombinations();
+ describe('Combinatorially generated fills orders', () => test(allFillScenarios));
+
+ it('should transfer the correct amounts when makerAssetAmount === takerAssetAmount', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ it('should transfer the correct amounts when makerAssetAmount > takerAssetAmount', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ takerAssetAmountScenario: OrderAssetAmountScenario.Small,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ it('should transfer the correct amounts when makerAssetAmount < takerAssetAmount', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetAmountScenario: OrderAssetAmountScenario.Small,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ it('should transfer the correct amounts when taker is specified and order is claimed by taker', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ takerScenario: TakerScenario.CorrectlySpecified,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ it('should fill remaining value if takerAssetFillAmount > remaining takerAssetAmount', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ it('should throw when taker is specified and order is claimed by other', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ takerScenario: TakerScenario.IncorrectlySpecified,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if makerAssetAmount is 0', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetAmountScenario: OrderAssetAmountScenario.Zero,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if takerAssetAmount is 0', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ takerAssetAmountScenario: OrderAssetAmountScenario.Zero,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if takerAssetFillAmount is 0', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.Zero,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if an order is expired', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ expirationTimeSecondsScenario: ExpirationTimeSecondsScenario.InPast,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if maker erc20Balances are too low to fill order', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ makerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetBalance: BalanceAmountScenario.TooLow,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if taker erc20Balances are too low to fill order', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ takerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetBalance: BalanceAmountScenario.TooLow,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if maker allowances are too low to fill order', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ makerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetAllowance: AllowanceAmountScenario.TooLow,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should throw if taker allowances are too low to fill order', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ takerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetAllowance: AllowanceAmountScenario.TooLow,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ });
+
+ describe('Testing Exchange of ERC721 Tokens', () => {
+ it('should successfully exchange a single token between the maker and taker (via fillOrder)', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetDataScenario: AssetDataScenario.ERC721,
+ takerAssetDataScenario: AssetDataScenario.ERC721,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should successfully fill order when makerAsset is ERC721 and takerAsset is ERC20', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetDataScenario: AssetDataScenario.ERC721,
+ takerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario, true);
+ });
+
+ it('should successfully fill order when makerAsset is ERC20 and takerAsset is ERC721', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ takerAssetDataScenario: AssetDataScenario.ERC721,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should successfully fill order when makerAsset is ERC721 and approveAll is set for it', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetDataScenario: AssetDataScenario.ERC721,
+ takerAssetDataScenario: AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ makerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetAllowance: AllowanceAmountScenario.Unlimited,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+
+ it('should successfully fill order when makerAsset and takerAsset are ERC721 and approveAll is set for them', async () => {
+ const fillScenario = {
+ ...defaultFillScenario,
+ orderScenario: {
+ ...defaultFillScenario.orderScenario,
+ makerAssetDataScenario: AssetDataScenario.ERC721,
+ takerAssetDataScenario: AssetDataScenario.ERC721,
+ },
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ makerStateScenario: {
+ ...defaultFillScenario.makerStateScenario,
+ traderAssetAllowance: AllowanceAmountScenario.Unlimited,
+ },
+ takerStateScenario: {
+ ...defaultFillScenario.takerStateScenario,
+ traderAssetAllowance: AllowanceAmountScenario.Unlimited,
+ },
+ };
+ await fillOrderCombinatorialUtils.testFillOrderScenarioAsync(provider, fillScenario);
+ });
+ });
+});
diff --git a/packages/contracts/test/exchange/helpers.ts b/packages/contracts/test/exchange/helpers.ts
deleted file mode 100644
index 080cbe5fd..000000000
--- a/packages/contracts/test/exchange/helpers.ts
+++ /dev/null
@@ -1,194 +0,0 @@
-import { SignedOrder, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import ethUtil = require('ethereumjs-util');
-
-import {
- ExchangeContract,
- LogCancelContractEventArgs,
- LogErrorContractEventArgs,
- LogFillContractEventArgs,
-} from '../../src/contract_wrappers/generated/exchange';
-import { constants } from '../../util/constants';
-import { ExchangeWrapper } from '../../util/exchange_wrapper';
-import { OrderFactory } from '../../util/order_factory';
-import { ContractName } from '../../util/types';
-import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('Exchange', () => {
- let maker: string;
- let feeRecipient: string;
-
- let signedOrder: SignedOrder;
- let exchangeWrapper: ExchangeWrapper;
- let orderFactory: OrderFactory;
-
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- [maker, feeRecipient] = accounts;
- const tokenRegistry = await deployer.deployAsync(ContractName.TokenRegistry);
- const tokenTransferProxy = await deployer.deployAsync(ContractName.TokenTransferProxy);
- const [rep, dgd, zrx] = await Promise.all([
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- ]);
- const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
- zrx.address,
- tokenTransferProxy.address,
- ]);
- const exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
- await tokenTransferProxy.addAuthorizedAddress(exchange.address, { from: accounts[0] });
- const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
- exchangeWrapper = new ExchangeWrapper(exchange, zeroEx);
- const defaultOrderParams = {
- exchangeContractAddress: exchange.address,
- maker,
- feeRecipient,
- makerTokenAddress: rep.address,
- takerTokenAddress: dgd.address,
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
- makerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
- takerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
- };
- orderFactory = new OrderFactory(zeroEx, defaultOrderParams);
- signedOrder = await orderFactory.newSignedOrderAsync();
- });
-
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('getOrderHash', () => {
- it('should output the correct orderHash', async () => {
- const orderHashHex = await exchangeWrapper.getOrderHashAsync(signedOrder);
- expect(ZeroEx.getOrderHashHex(signedOrder)).to.be.equal(orderHashHex);
- });
- });
-
- describe('isValidSignature', () => {
- beforeEach(async () => {
- signedOrder = await orderFactory.newSignedOrderAsync();
- });
-
- it('should return true with a valid signature', async () => {
- const success = await exchangeWrapper.isValidSignatureAsync(signedOrder);
- const orderHashHex = ZeroEx.getOrderHashHex(signedOrder);
- const isValidSignature = ZeroEx.isValidSignature(orderHashHex, signedOrder.ecSignature, signedOrder.maker);
- expect(isValidSignature).to.be.true();
- expect(success).to.be.true();
- });
-
- it('should return false with an invalid signature', async () => {
- signedOrder.ecSignature.r = ethUtil.bufferToHex(ethUtil.sha3('invalidR'));
- signedOrder.ecSignature.s = ethUtil.bufferToHex(ethUtil.sha3('invalidS'));
- const success = await exchangeWrapper.isValidSignatureAsync(signedOrder);
- const orderHashHex = ZeroEx.getOrderHashHex(signedOrder);
- const isValidSignature = ZeroEx.isValidSignature(orderHashHex, signedOrder.ecSignature, signedOrder.maker);
- expect(isValidSignature).to.be.false();
- expect(success).to.be.false();
- });
- });
-
- describe('isRoundingError', () => {
- it('should return false if there is a rounding error of 0.1%', async () => {
- const numerator = new BigNumber(20);
- const denominator = new BigNumber(999);
- const target = new BigNumber(50);
- // rounding error = ((20*50/999) - floor(20*50/999)) / (20*50/999) = 0.1%
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.false();
- });
-
- it('should return false if there is a rounding of 0.09%', async () => {
- const numerator = new BigNumber(20);
- const denominator = new BigNumber(9991);
- const target = new BigNumber(500);
- // rounding error = ((20*500/9991) - floor(20*500/9991)) / (20*500/9991) = 0.09%
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.false();
- });
-
- it('should return true if there is a rounding error of 0.11%', async () => {
- const numerator = new BigNumber(20);
- const denominator = new BigNumber(9989);
- const target = new BigNumber(500);
- // rounding error = ((20*500/9989) - floor(20*500/9989)) / (20*500/9989) = 0.011%
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.true();
- });
-
- it('should return true if there is a rounding error > 0.1%', async () => {
- const numerator = new BigNumber(3);
- const denominator = new BigNumber(7);
- const target = new BigNumber(10);
- // rounding error = ((3*10/7) - floor(3*10/7)) / (3*10/7) = 6.67%
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.true();
- });
-
- it('should return false when there is no rounding error', async () => {
- const numerator = new BigNumber(1);
- const denominator = new BigNumber(2);
- const target = new BigNumber(10);
-
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.false();
- });
-
- it('should return false when there is rounding error <= 0.1%', async () => {
- // randomly generated numbers
- const numerator = new BigNumber(76564);
- const denominator = new BigNumber(676373677);
- const target = new BigNumber(105762562);
- // rounding error = ((76564*105762562/676373677) - floor(76564*105762562/676373677)) /
- // (76564*105762562/676373677) = 0.0007%
- const isRoundingError = await exchangeWrapper.isRoundingErrorAsync(numerator, denominator, target);
- expect(isRoundingError).to.be.false();
- });
- });
-
- describe('getPartialAmount', () => {
- it('should return the numerator/denominator*target', async () => {
- const numerator = new BigNumber(1);
- const denominator = new BigNumber(2);
- const target = new BigNumber(10);
-
- const partialAmount = await exchangeWrapper.getPartialAmountAsync(numerator, denominator, target);
- const expectedPartialAmount = 5;
- expect(partialAmount).to.be.bignumber.equal(expectedPartialAmount);
- });
-
- it('should round down', async () => {
- const numerator = new BigNumber(2);
- const denominator = new BigNumber(3);
- const target = new BigNumber(10);
-
- const partialAmount = await exchangeWrapper.getPartialAmountAsync(numerator, denominator, target);
- const expectedPartialAmount = 6;
- expect(partialAmount).to.be.bignumber.equal(expectedPartialAmount);
- });
-
- it('should round .5 down', async () => {
- const numerator = new BigNumber(1);
- const denominator = new BigNumber(20);
- const target = new BigNumber(10);
-
- const partialAmount = await exchangeWrapper.getPartialAmountAsync(numerator, denominator, target);
- const expectedPartialAmount = 0;
- expect(partialAmount).to.be.bignumber.equal(expectedPartialAmount);
- });
- });
-});
diff --git a/packages/contracts/test/exchange/internal.ts b/packages/contracts/test/exchange/internal.ts
new file mode 100644
index 000000000..67d1d2d2c
--- /dev/null
+++ b/packages/contracts/test/exchange/internal.ts
@@ -0,0 +1,305 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { Order, RevertReason, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { TestExchangeInternalsContract } from '../../generated_contract_wrappers/test_exchange_internals';
+import { artifacts } from '../utils/artifacts';
+import {
+ getInvalidOpcodeErrorMessageForCallAsync,
+ getRevertReasonOrErrorMessageForSendTransactionAsync,
+} from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { bytes32Values, testCombinatoriallyWithReferenceFuncAsync, uint256Values } from '../utils/combinatorial_utils';
+import { constants } from '../utils/constants';
+import { FillResults } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+const MAX_UINT256 = new BigNumber(2).pow(256).minus(1);
+
+const emptyOrder: Order = {
+ senderAddress: constants.NULL_ADDRESS,
+ makerAddress: constants.NULL_ADDRESS,
+ takerAddress: constants.NULL_ADDRESS,
+ makerFee: new BigNumber(0),
+ takerFee: new BigNumber(0),
+ makerAssetAmount: new BigNumber(0),
+ takerAssetAmount: new BigNumber(0),
+ makerAssetData: '0x',
+ takerAssetData: '0x',
+ salt: new BigNumber(0),
+ exchangeAddress: constants.NULL_ADDRESS,
+ feeRecipientAddress: constants.NULL_ADDRESS,
+ expirationTimeSeconds: new BigNumber(0),
+};
+
+const emptySignedOrder: SignedOrder = {
+ ...emptyOrder,
+ signature: '',
+};
+
+const overflowErrorForCall = new Error(RevertReason.Uint256Overflow);
+
+async function referenceGetPartialAmountAsync(
+ numerator: BigNumber,
+ denominator: BigNumber,
+ target: BigNumber,
+): Promise<BigNumber> {
+ const invalidOpcodeErrorForCall = new Error(await getInvalidOpcodeErrorMessageForCallAsync());
+ const product = numerator.mul(target);
+ if (product.greaterThan(MAX_UINT256)) {
+ throw overflowErrorForCall;
+ }
+ if (denominator.eq(0)) {
+ throw invalidOpcodeErrorForCall;
+ }
+ return product.dividedToIntegerBy(denominator);
+}
+
+describe('Exchange core internal functions', () => {
+ let testExchange: TestExchangeInternalsContract;
+ let invalidOpcodeErrorForCall: Error | undefined;
+ let overflowErrorForSendTransaction: Error | undefined;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ testExchange = await TestExchangeInternalsContract.deployFrom0xArtifactAsync(
+ artifacts.TestExchangeInternals,
+ provider,
+ txDefaults,
+ );
+ overflowErrorForSendTransaction = new Error(
+ await getRevertReasonOrErrorMessageForSendTransactionAsync(RevertReason.Uint256Overflow),
+ );
+ invalidOpcodeErrorForCall = new Error(await getInvalidOpcodeErrorMessageForCallAsync());
+ });
+ // Note(albrow): Don't forget to add beforeEach and afterEach calls to reset
+ // the blockchain state for any tests which modify it!
+
+ describe('addFillResults', async () => {
+ function makeFillResults(value: BigNumber): FillResults {
+ return {
+ makerAssetFilledAmount: value,
+ takerAssetFilledAmount: value,
+ makerFeePaid: value,
+ takerFeePaid: value,
+ };
+ }
+ async function referenceAddFillResultsAsync(
+ totalValue: BigNumber,
+ singleValue: BigNumber,
+ ): Promise<FillResults> {
+ // Note(albrow): Here, each of totalFillResults and
+ // singleFillResults will consist of fields with the same values.
+ // This should be safe because none of the fields in a given
+ // FillResults are ever used together in a mathemetical operation.
+ // They are only used with the corresponding field from *the other*
+ // FillResults, which are different.
+ const totalFillResults = makeFillResults(totalValue);
+ const singleFillResults = makeFillResults(singleValue);
+ // HACK(albrow): _.mergeWith mutates the first argument! To
+ // workaround this we use _.cloneDeep.
+ return _.mergeWith(
+ _.cloneDeep(totalFillResults),
+ singleFillResults,
+ (totalVal: BigNumber, singleVal: BigNumber) => {
+ const newTotal = totalVal.add(singleVal);
+ if (newTotal.greaterThan(MAX_UINT256)) {
+ throw overflowErrorForCall;
+ }
+ return newTotal;
+ },
+ );
+ }
+ async function testAddFillResultsAsync(totalValue: BigNumber, singleValue: BigNumber): Promise<FillResults> {
+ const totalFillResults = makeFillResults(totalValue);
+ const singleFillResults = makeFillResults(singleValue);
+ return testExchange.publicAddFillResults.callAsync(totalFillResults, singleFillResults);
+ }
+ await testCombinatoriallyWithReferenceFuncAsync(
+ 'addFillResults',
+ referenceAddFillResultsAsync,
+ testAddFillResultsAsync,
+ [uint256Values, uint256Values],
+ );
+ });
+
+ describe('calculateFillResults', async () => {
+ function makeOrder(
+ makerAssetAmount: BigNumber,
+ takerAssetAmount: BigNumber,
+ makerFee: BigNumber,
+ takerFee: BigNumber,
+ ): Order {
+ return {
+ ...emptyOrder,
+ makerAssetAmount,
+ takerAssetAmount,
+ makerFee,
+ takerFee,
+ };
+ }
+ async function referenceCalculateFillResultsAsync(
+ orderTakerAssetAmount: BigNumber,
+ takerAssetFilledAmount: BigNumber,
+ otherAmount: BigNumber,
+ ): Promise<FillResults> {
+ // Note(albrow): Here we are re-using the same value (otherAmount)
+ // for order.makerAssetAmount, order.makerFee, and order.takerFee.
+ // This should be safe because they are never used with each other
+ // in any mathematical operation in either the reference TypeScript
+ // implementation or the Solidity implementation of
+ // calculateFillResults.
+ return {
+ makerAssetFilledAmount: await referenceGetPartialAmountAsync(
+ takerAssetFilledAmount,
+ orderTakerAssetAmount,
+ otherAmount,
+ ),
+ takerAssetFilledAmount,
+ makerFeePaid: await referenceGetPartialAmountAsync(
+ takerAssetFilledAmount,
+ orderTakerAssetAmount,
+ otherAmount,
+ ),
+ takerFeePaid: await referenceGetPartialAmountAsync(
+ takerAssetFilledAmount,
+ orderTakerAssetAmount,
+ otherAmount,
+ ),
+ };
+ }
+ async function testCalculateFillResultsAsync(
+ orderTakerAssetAmount: BigNumber,
+ takerAssetFilledAmount: BigNumber,
+ otherAmount: BigNumber,
+ ): Promise<FillResults> {
+ const order = makeOrder(otherAmount, orderTakerAssetAmount, otherAmount, otherAmount);
+ return testExchange.publicCalculateFillResults.callAsync(order, takerAssetFilledAmount);
+ }
+ await testCombinatoriallyWithReferenceFuncAsync(
+ 'calculateFillResults',
+ referenceCalculateFillResultsAsync,
+ testCalculateFillResultsAsync,
+ [uint256Values, uint256Values, uint256Values],
+ );
+ });
+
+ describe('getPartialAmount', async () => {
+ async function testGetPartialAmountAsync(
+ numerator: BigNumber,
+ denominator: BigNumber,
+ target: BigNumber,
+ ): Promise<BigNumber> {
+ return testExchange.publicGetPartialAmount.callAsync(numerator, denominator, target);
+ }
+ await testCombinatoriallyWithReferenceFuncAsync(
+ 'getPartialAmount',
+ referenceGetPartialAmountAsync,
+ testGetPartialAmountAsync,
+ [uint256Values, uint256Values, uint256Values],
+ );
+ });
+
+ describe('isRoundingError', async () => {
+ async function referenceIsRoundingErrorAsync(
+ numerator: BigNumber,
+ denominator: BigNumber,
+ target: BigNumber,
+ ): Promise<boolean> {
+ const product = numerator.mul(target);
+ if (denominator.eq(0)) {
+ throw invalidOpcodeErrorForCall;
+ }
+ const remainder = product.mod(denominator);
+ if (remainder.eq(0)) {
+ return false;
+ }
+ if (product.greaterThan(MAX_UINT256)) {
+ throw overflowErrorForCall;
+ }
+ if (product.eq(0)) {
+ throw invalidOpcodeErrorForCall;
+ }
+ const remainderTimes1000000 = remainder.mul('1000000');
+ if (remainderTimes1000000.greaterThan(MAX_UINT256)) {
+ throw overflowErrorForCall;
+ }
+ const errPercentageTimes1000000 = remainderTimes1000000.dividedToIntegerBy(product);
+ return errPercentageTimes1000000.greaterThan('1000');
+ }
+ async function testIsRoundingErrorAsync(
+ numerator: BigNumber,
+ denominator: BigNumber,
+ target: BigNumber,
+ ): Promise<boolean> {
+ return testExchange.publicIsRoundingError.callAsync(numerator, denominator, target);
+ }
+ await testCombinatoriallyWithReferenceFuncAsync(
+ 'isRoundingError',
+ referenceIsRoundingErrorAsync,
+ testIsRoundingErrorAsync,
+ [uint256Values, uint256Values, uint256Values],
+ );
+ });
+
+ describe('updateFilledState', async () => {
+ // Note(albrow): Since updateFilledState modifies the state by calling
+ // sendTransaction, we must reset the state after each test.
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ async function referenceUpdateFilledStateAsync(
+ takerAssetFilledAmount: BigNumber,
+ orderTakerAssetFilledAmount: BigNumber,
+ // tslint:disable-next-line:no-unused-variable
+ orderHash: string,
+ ): Promise<BigNumber> {
+ const totalFilledAmount = takerAssetFilledAmount.add(orderTakerAssetFilledAmount);
+ if (totalFilledAmount.greaterThan(MAX_UINT256)) {
+ throw overflowErrorForSendTransaction;
+ }
+ return totalFilledAmount;
+ }
+ async function testUpdateFilledStateAsync(
+ takerAssetFilledAmount: BigNumber,
+ orderTakerAssetFilledAmount: BigNumber,
+ orderHash: string,
+ ): Promise<BigNumber> {
+ const fillResults = {
+ makerAssetFilledAmount: new BigNumber(0),
+ takerAssetFilledAmount,
+ makerFeePaid: new BigNumber(0),
+ takerFeePaid: new BigNumber(0),
+ };
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await testExchange.publicUpdateFilledState.sendTransactionAsync(
+ emptySignedOrder,
+ constants.NULL_ADDRESS,
+ orderHash,
+ orderTakerAssetFilledAmount,
+ fillResults,
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ return testExchange.filled.callAsync(orderHash);
+ }
+ await testCombinatoriallyWithReferenceFuncAsync(
+ 'updateFilledState',
+ referenceUpdateFilledStateAsync,
+ testUpdateFilledStateAsync,
+ [uint256Values, uint256Values, bytes32Values],
+ );
+ });
+});
diff --git a/packages/contracts/test/exchange/libs.ts b/packages/contracts/test/exchange/libs.ts
new file mode 100644
index 000000000..5c9f9aac7
--- /dev/null
+++ b/packages/contracts/test/exchange/libs.ts
@@ -0,0 +1,125 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils, EIP712Utils, orderHashUtils } from '@0xproject/order-utils';
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+
+import { TestConstantsContract } from '../../generated_contract_wrappers/test_constants';
+import { TestLibsContract } from '../../generated_contract_wrappers/test_libs';
+import { addressUtils } from '../utils/address_utils';
+import { artifacts } from '../utils/artifacts';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { OrderFactory } from '../utils/order_factory';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('Exchange libs', () => {
+ let signedOrder: SignedOrder;
+ let orderFactory: OrderFactory;
+ let libs: TestLibsContract;
+ let testConstants: TestConstantsContract;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const makerAddress = accounts[0];
+ libs = await TestLibsContract.deployFrom0xArtifactAsync(artifacts.TestLibs, provider, txDefaults);
+ testConstants = await TestConstantsContract.deployFrom0xArtifactAsync(
+ artifacts.TestConstants,
+ provider,
+ txDefaults,
+ );
+
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ exchangeAddress: libs.address,
+ makerAddress,
+ feeRecipientAddress: addressUtils.generatePseudoRandomAddress(),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ };
+ const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ orderFactory = new OrderFactory(privateKey, defaultOrderParams);
+ });
+
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('LibConstants', () => {
+ describe('ZRX_ASSET_DATA', () => {
+ it('should have the correct ZRX_ASSET_DATA', async () => {
+ const isValid = await testConstants.assertValidZrxAssetData.callAsync();
+ expect(isValid).to.be.equal(true);
+ });
+ });
+ });
+ // Note(albrow): These tests are designed to be supplemental to the
+ // combinatorial tests in test/exchange/internal. They test specific edge
+ // cases that are not covered by the combinatorial tests.
+ describe('LibMath', () => {
+ it('should return false if there is a rounding error of 0.1%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(999);
+ const target = new BigNumber(50);
+ // rounding error = ((20*50/999) - floor(20*50/999)) / (20*50/999) = 0.1%
+ const isRoundingError = await libs.publicIsRoundingError.callAsync(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+ it('should return false if there is a rounding of 0.09%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(9991);
+ const target = new BigNumber(500);
+ // rounding error = ((20*500/9991) - floor(20*500/9991)) / (20*500/9991) = 0.09%
+ const isRoundingError = await libs.publicIsRoundingError.callAsync(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+ it('should return true if there is a rounding error of 0.11%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(9989);
+ const target = new BigNumber(500);
+ // rounding error = ((20*500/9989) - floor(20*500/9989)) / (20*500/9989) = 0.011%
+ const isRoundingError = await libs.publicIsRoundingError.callAsync(numerator, denominator, target);
+ expect(isRoundingError).to.be.true();
+ });
+ });
+
+ describe('LibOrder', () => {
+ describe('getOrderSchema', () => {
+ it('should output the correct order schema hash', async () => {
+ const orderSchema = await libs.getOrderSchemaHash.callAsync();
+ const schemaHashBuffer = orderHashUtils._getOrderSchemaBuffer();
+ const schemaHashHex = `0x${schemaHashBuffer.toString('hex')}`;
+ expect(schemaHashHex).to.be.equal(orderSchema);
+ });
+ });
+ describe('getDomainSeparatorSchema', () => {
+ it('should output the correct domain separator schema hash', async () => {
+ const domainSeparatorSchema = await libs.getDomainSeparatorSchemaHash.callAsync();
+ const domainSchemaBuffer = EIP712Utils._getDomainSeparatorSchemaBuffer();
+ const schemaHashHex = `0x${domainSchemaBuffer.toString('hex')}`;
+ expect(schemaHashHex).to.be.equal(domainSeparatorSchema);
+ });
+ });
+ describe('getOrderHash', () => {
+ it('should output the correct orderHash', async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ const orderHashHex = await libs.publicGetOrderHash.callAsync(signedOrder);
+ expect(orderHashUtils.getOrderHashHex(signedOrder)).to.be.equal(orderHashHex);
+ });
+ });
+ });
+});
diff --git a/packages/contracts/test/exchange/match_orders.ts b/packages/contracts/test/exchange/match_orders.ts
new file mode 100644
index 000000000..46b3569bd
--- /dev/null
+++ b/packages/contracts/test/exchange/match_orders.ts
@@ -0,0 +1,796 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
+import { RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { ExchangeWrapper } from '../utils/exchange_wrapper';
+import { MatchOrderTester } from '../utils/match_order_tester';
+import { OrderFactory } from '../utils/order_factory';
+import { ERC20BalancesByOwner, ERC721TokenIdsByOwner, OrderInfo, OrderStatus } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('matchOrders', () => {
+ let makerAddressLeft: string;
+ let makerAddressRight: string;
+ let owner: string;
+ let takerAddress: string;
+ let feeRecipientAddressLeft: string;
+ let feeRecipientAddressRight: string;
+
+ let erc20TokenA: DummyERC20TokenContract;
+ let erc20TokenB: DummyERC20TokenContract;
+ let zrxToken: DummyERC20TokenContract;
+ let erc721Token: DummyERC721TokenContract;
+ let exchange: ExchangeContract;
+ let erc20Proxy: ERC20ProxyContract;
+ let erc721Proxy: ERC721ProxyContract;
+
+ let erc20BalancesByOwner: ERC20BalancesByOwner;
+ let erc721TokenIdsByOwner: ERC721TokenIdsByOwner;
+ let exchangeWrapper: ExchangeWrapper;
+ let erc20Wrapper: ERC20Wrapper;
+ let erc721Wrapper: ERC721Wrapper;
+ let orderFactoryLeft: OrderFactory;
+ let orderFactoryRight: OrderFactory;
+
+ let erc721LeftMakerAssetIds: BigNumber[];
+ let erc721RightMakerAssetIds: BigNumber[];
+
+ let defaultERC20MakerAssetAddress: string;
+ let defaultERC20TakerAssetAddress: string;
+ let defaultERC721AssetAddress: string;
+
+ let matchOrderTester: MatchOrderTester;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ // Create accounts
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ // Hack(albrow): Both Prettier and TSLint insert a trailing comma below
+ // but that is invalid syntax as of TypeScript version >= 2.8. We don't
+ // have the right fine-grained configuration options in TSLint,
+ // Prettier, or TypeScript, to reconcile this, so we will just have to
+ // wait for them to sort it out. We disable TSLint and Prettier for
+ // this part of the code for now. This occurs several times in this
+ // file. See https://github.com/prettier/prettier/issues/4624.
+ // prettier-ignore
+ const usedAddresses = ([
+ owner,
+ makerAddressLeft,
+ makerAddressRight,
+ takerAddress,
+ feeRecipientAddressLeft,
+ // tslint:disable-next-line:trailing-comma
+ feeRecipientAddressRight
+ ] = _.slice(accounts, 0, 6));
+ // Create wrappers
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+ erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+ // Deploy ERC20 token & ERC20 proxy
+ const numDummyErc20ToDeploy = 3;
+ [erc20TokenA, erc20TokenB, zrxToken] = await erc20Wrapper.deployDummyTokensAsync(
+ numDummyErc20ToDeploy,
+ constants.DUMMY_TOKEN_DECIMALS,
+ );
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+ // Deploy ERC721 token and proxy
+ [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+ erc721LeftMakerAssetIds = erc721Balances[makerAddressLeft][erc721Token.address];
+ erc721RightMakerAssetIds = erc721Balances[makerAddressRight][erc721Token.address];
+ // Depoy exchange
+ exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ );
+ exchangeWrapper = new ExchangeWrapper(exchange, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(erc721Proxy.address, owner);
+ // Authorize ERC20 and ERC721 trades by exchange
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Set default addresses
+ defaultERC20MakerAssetAddress = erc20TokenA.address;
+ defaultERC20TakerAssetAddress = erc20TokenB.address;
+ defaultERC721AssetAddress = erc721Token.address;
+ // Create default order parameters
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ exchangeAddress: exchange.address,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ };
+ const privateKeyLeft = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddressLeft)];
+ orderFactoryLeft = new OrderFactory(privateKeyLeft, defaultOrderParams);
+ const privateKeyRight = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddressRight)];
+ orderFactoryRight = new OrderFactory(privateKeyRight, defaultOrderParams);
+ // Set match order tester
+ matchOrderTester = new MatchOrderTester(exchangeWrapper, erc20Wrapper, erc721Wrapper, zrxToken.address);
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('matchOrders', () => {
+ beforeEach(async () => {
+ erc20BalancesByOwner = await erc20Wrapper.getBalancesAsync();
+ erc721TokenIdsByOwner = await erc721Wrapper.getBalancesAsync();
+ });
+
+ it('should transfer the correct amounts when orders completely fill each other', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match signedOrderLeft with signedOrderRight
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+
+ it('should transfer the correct amounts when orders completely fill each other and taker doesnt take a profit', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Store original taker balance
+ const takerInitialBalances = _.cloneDeep(erc20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress]);
+ // Match signedOrderLeft with signedOrderRight
+ let newERC20BalancesByOwner: ERC20BalancesByOwner;
+ let newERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
+ // prettier-ignore
+ [
+ newERC20BalancesByOwner,
+ // tslint:disable-next-line:trailing-comma
+ newERC721TokenIdsByOwner
+ ] = await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify taker did not take a profit
+ expect(takerInitialBalances).to.be.deep.equal(
+ newERC20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress],
+ );
+ });
+
+ it('should transfer the correct amounts when left order is completely filled and right order is partially filled', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(20), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(4), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was partially filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ });
+
+ it('should transfer the correct amounts when right order is completely filled and left order is partially filled', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was partially filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+
+ it('should transfer the correct amounts when consecutive calls are used to completely fill the left order', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ let newERC20BalancesByOwner: ERC20BalancesByOwner;
+ let newERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
+ // prettier-ignore
+ [
+ newERC20BalancesByOwner,
+ // tslint:disable-next-line:trailing-comma
+ newERC721TokenIdsByOwner
+ ] = await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was partially filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Construct second right order
+ // Note: This order needs makerAssetAmount=90/takerAssetAmount=[anything <= 45] to fully fill the right order.
+ // However, we use 100/50 to ensure a partial fill as we want to go down the "left fill"
+ // branch in the contract twice for this test.
+ const signedOrderRight2 = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match signedOrderLeft with signedOrderRight2
+ const leftTakerAssetFilledAmount = signedOrderRight.makerAssetAmount;
+ const rightTakerAssetFilledAmount = new BigNumber(0);
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight2,
+ takerAddress,
+ newERC20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ leftTakerAssetFilledAmount,
+ rightTakerAssetFilledAmount,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo2: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo2.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify second right order was partially filled
+ const rightOrderInfo2: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight2);
+ expect(rightOrderInfo2.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ });
+
+ it('should transfer the correct amounts when consecutive calls are used to completely fill the right order', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ let newERC20BalancesByOwner: ERC20BalancesByOwner;
+ let newERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
+ // prettier-ignore
+ [
+ newERC20BalancesByOwner,
+ // tslint:disable-next-line:trailing-comma
+ newERC721TokenIdsByOwner
+ ] = await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was partially filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ // Create second left order
+ // Note: This order needs makerAssetAmount=96/takerAssetAmount=48 to fully fill the right order.
+ // However, we use 100/50 to ensure a partial fill as we want to go down the "right fill"
+ // branch in the contract twice for this test.
+ const signedOrderLeft2 = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ // Match signedOrderLeft2 with signedOrderRight
+ const leftTakerAssetFilledAmount = new BigNumber(0);
+ const takerAmountReceived = newERC20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress].minus(
+ erc20BalancesByOwner[takerAddress][defaultERC20MakerAssetAddress],
+ );
+ const rightTakerAssetFilledAmount = signedOrderLeft.makerAssetAmount.minus(takerAmountReceived);
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft2,
+ signedOrderRight,
+ takerAddress,
+ newERC20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ leftTakerAssetFilledAmount,
+ rightTakerAssetFilledAmount,
+ );
+ // Verify second left order was partially filled
+ const leftOrderInfo2: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft2);
+ expect(leftOrderInfo2.orderStatus as OrderStatus).to.be.equal(OrderStatus.FILLABLE);
+ // Verify right order was fully filled
+ const rightOrderInfo2: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo2.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+
+ it('should transfer the correct amounts if fee recipient is the same across both matched orders', async () => {
+ const feeRecipientAddress = feeRecipientAddressLeft;
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('should transfer the correct amounts if taker is also the left order maker', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ takerAddress = signedOrderLeft.makerAddress;
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('should transfer the correct amounts if taker is also the right order maker', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ takerAddress = signedOrderRight.makerAddress;
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('should transfer the correct amounts if taker is also the left fee recipient', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ takerAddress = feeRecipientAddressLeft;
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('should transfer the correct amounts if taker is also the right fee recipient', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ takerAddress = feeRecipientAddressRight;
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('should transfer the correct amounts if left maker is the left fee recipient and right maker is the right fee recipient', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: makerAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: makerAddressRight,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ });
+
+ it('Should throw if left order is not fillable', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Cancel left order
+ await exchangeWrapper.cancelOrderAsync(signedOrderLeft, signedOrderLeft.makerAddress);
+ // Match orders
+ return expectTransactionFailedAsync(
+ exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress),
+ RevertReason.OrderUnfillable,
+ );
+ });
+
+ it('Should throw if right order is not fillable', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Cancel right order
+ await exchangeWrapper.cancelOrderAsync(signedOrderRight, signedOrderRight.makerAddress);
+ // Match orders
+ return expectTransactionFailedAsync(
+ exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress),
+ RevertReason.OrderUnfillable,
+ );
+ });
+
+ it('should throw if there is not a positive spread', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ return expectTransactionFailedAsync(
+ exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress),
+ RevertReason.NegativeSpreadRequired,
+ );
+ });
+
+ it('should throw if the left maker asset is not equal to the right taker asset ', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ return expectTransactionFailedAsync(
+ exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress),
+ // We are assuming assetData fields of the right order are the
+ // reverse of the left order, rather than checking equality. This
+ // saves a bunch of gas, but as a result if the assetData fields are
+ // off then the failure ends up happening at signature validation
+ RevertReason.InvalidOrderSignature,
+ );
+ });
+
+ it('should throw if the right maker asset is not equal to the left taker asset', async () => {
+ // Create orders to match
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(5), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(2), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ return expectTransactionFailedAsync(
+ exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress),
+ RevertReason.InvalidOrderSignature,
+ );
+ });
+
+ it('should transfer correct amounts when left order maker asset is an ERC721 token', async () => {
+ // Create orders to match
+ const erc721TokenToTransfer = erc721LeftMakerAssetIds[0];
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20TakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: new BigNumber(1),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+
+ it('should transfer correct amounts when right order maker asset is an ERC721 token', async () => {
+ // Create orders to match
+ const erc721TokenToTransfer = erc721RightMakerAssetIds[0];
+ const signedOrderLeft = await orderFactoryLeft.newSignedOrderAsync({
+ makerAddress: makerAddressLeft,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ takerAssetAmount: new BigNumber(1),
+ feeRecipientAddress: feeRecipientAddressLeft,
+ });
+ const signedOrderRight = await orderFactoryRight.newSignedOrderAsync({
+ makerAddress: makerAddressRight,
+ makerAssetData: assetDataUtils.encodeERC721AssetData(defaultERC721AssetAddress, erc721TokenToTransfer),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultERC20MakerAssetAddress),
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), 18),
+ feeRecipientAddress: feeRecipientAddressRight,
+ });
+ // Match orders
+ await matchOrderTester.matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ );
+ // Verify left order was fully filled
+ const leftOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderLeft);
+ expect(leftOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ // Verify right order was fully filled
+ const rightOrderInfo: OrderInfo = await exchangeWrapper.getOrderInfoAsync(signedOrderRight);
+ expect(rightOrderInfo.orderStatus as OrderStatus).to.be.equal(OrderStatus.FULLY_FILLED);
+ });
+ });
+}); // tslint:disable-line:max-file-line-count
diff --git a/packages/contracts/test/exchange/signature_validator.ts b/packages/contracts/test/exchange/signature_validator.ts
new file mode 100644
index 000000000..56a06c247
--- /dev/null
+++ b/packages/contracts/test/exchange/signature_validator.ts
@@ -0,0 +1,507 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { addSignedMessagePrefix, assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { RevertReason, SignatureType, SignedOrder, SignerType } from '@0xproject/types';
+import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
+import ethUtil = require('ethereumjs-util');
+
+import {
+ TestSignatureValidatorContract,
+ TestSignatureValidatorSignatureValidatorApprovalEventArgs,
+} from '../../generated_contract_wrappers/test_signature_validator';
+import { ValidatorContract } from '../../generated_contract_wrappers/validator';
+import { WalletContract } from '../../generated_contract_wrappers/wallet';
+import { addressUtils } from '../utils/address_utils';
+import { artifacts } from '../utils/artifacts';
+import { expectContractCallFailed } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { LogDecoder } from '../utils/log_decoder';
+import { OrderFactory } from '../utils/order_factory';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// tslint:disable:no-unnecessary-type-assertion
+describe('MixinSignatureValidator', () => {
+ let signedOrder: SignedOrder;
+ let orderFactory: OrderFactory;
+ let signatureValidator: TestSignatureValidatorContract;
+ let testWallet: WalletContract;
+ let testValidator: ValidatorContract;
+ let signerAddress: string;
+ let signerPrivateKey: Buffer;
+ let notSignerAddress: string;
+ let notSignerPrivateKey: Buffer;
+ let signatureValidatorLogDecoder: LogDecoder;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const makerAddress = accounts[0];
+ signerAddress = makerAddress;
+ notSignerAddress = accounts[1];
+ signatureValidator = await TestSignatureValidatorContract.deployFrom0xArtifactAsync(
+ artifacts.TestSignatureValidator,
+ provider,
+ txDefaults,
+ );
+ testWallet = await WalletContract.deployFrom0xArtifactAsync(
+ artifacts.Wallet,
+ provider,
+ txDefaults,
+ signerAddress,
+ );
+ testValidator = await ValidatorContract.deployFrom0xArtifactAsync(
+ artifacts.Validator,
+ provider,
+ txDefaults,
+ signerAddress,
+ );
+ signatureValidatorLogDecoder = new LogDecoder(web3Wrapper, signatureValidator.address);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await signatureValidator.setSignatureValidatorApproval.sendTransactionAsync(testValidator.address, true, {
+ from: signerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ exchangeAddress: signatureValidator.address,
+ makerAddress,
+ feeRecipientAddress: addressUtils.generatePseudoRandomAddress(),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(addressUtils.generatePseudoRandomAddress()),
+ };
+ signerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ notSignerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(notSignerAddress)];
+ orderFactory = new OrderFactory(signerPrivateKey, defaultOrderParams);
+ });
+
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('isValidSignature', () => {
+ beforeEach(async () => {
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ });
+
+ it('should revert when signature is empty', async () => {
+ const emptySignature = '0x';
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ return expectContractCallFailed(
+ signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ emptySignature,
+ ),
+ RevertReason.LengthGreaterThan0Required,
+ );
+ });
+
+ it('should revert when signature type is unsupported', async () => {
+ const unsupportedSignatureType = SignatureType.NSignatureTypes;
+ const unsupportedSignatureHex = '0x' + Buffer.from([unsupportedSignatureType]).toString('hex');
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ return expectContractCallFailed(
+ signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ unsupportedSignatureHex,
+ ),
+ RevertReason.SignatureUnsupported,
+ );
+ });
+
+ it('should revert when SignatureType=Illegal', async () => {
+ const unsupportedSignatureHex = '0x' + Buffer.from([SignatureType.Illegal]).toString('hex');
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ return expectContractCallFailed(
+ signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ unsupportedSignatureHex,
+ ),
+ RevertReason.SignatureIllegal,
+ );
+ });
+
+ it('should return false when SignatureType=Invalid and signature has a length of zero', async () => {
+ const signatureHex = '0x' + Buffer.from([SignatureType.Invalid]).toString('hex');
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should revert when SignatureType=Invalid and signature length is non-zero', async () => {
+ const fillerData = ethUtil.toBuffer('0xdeadbeef');
+ const signatureType = ethUtil.toBuffer(`0x${SignatureType.Invalid}`);
+ const signatureBuffer = Buffer.concat([fillerData, signatureType]);
+ const signatureHex = ethUtil.bufferToHex(signatureBuffer);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ return expectContractCallFailed(
+ signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ signatureHex,
+ ),
+ RevertReason.Length0Required,
+ );
+ });
+
+ it('should return true when SignatureType=EIP712 and signature is valid', async () => {
+ // Create EIP712 signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashBuffer = ethUtil.toBuffer(orderHashHex);
+ const ecSignature = ethUtil.ecsign(orderHashBuffer, signerPrivateKey);
+ // Create 0x signature from EIP712 signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.EIP712}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=EIP712 and signature is invalid', async () => {
+ // Create EIP712 signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashBuffer = ethUtil.toBuffer(orderHashHex);
+ const ecSignature = ethUtil.ecsign(orderHashBuffer, signerPrivateKey);
+ // Create 0x signature from EIP712 signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.EIP712}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature.
+ // This will fail because `signerAddress` signed the message, but we're passing in `notSignerAddress`
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ notSignerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=EthSign and signature is valid', async () => {
+ // Create EthSign signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashWithEthSignPrefixHex = addSignedMessagePrefix(orderHashHex, SignerType.Default);
+ const orderHashWithEthSignPrefixBuffer = ethUtil.toBuffer(orderHashWithEthSignPrefixHex);
+ const ecSignature = ethUtil.ecsign(orderHashWithEthSignPrefixBuffer, signerPrivateKey);
+ // Create 0x signature from EthSign signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.EthSign}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=EthSign and signature is invalid', async () => {
+ // Create EthSign signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashWithEthSignPrefixHex = addSignedMessagePrefix(orderHashHex, SignerType.Default);
+ const orderHashWithEthSignPrefixBuffer = ethUtil.toBuffer(orderHashWithEthSignPrefixHex);
+ const ecSignature = ethUtil.ecsign(orderHashWithEthSignPrefixBuffer, signerPrivateKey);
+ // Create 0x signature from EthSign signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.EthSign}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature.
+ // This will fail because `signerAddress` signed the message, but we're passing in `notSignerAddress`
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ notSignerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=Caller and signer is caller', async () => {
+ const signature = ethUtil.toBuffer(`0x${SignatureType.Caller}`);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ { from: signerAddress },
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=Caller and signer is not caller', async () => {
+ const signature = ethUtil.toBuffer(`0x${SignatureType.Caller}`);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ { from: notSignerAddress },
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=Wallet and signature is valid', async () => {
+ // Create EIP712 signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashBuffer = ethUtil.toBuffer(orderHashHex);
+ const ecSignature = ethUtil.ecsign(orderHashBuffer, signerPrivateKey);
+ // Create 0x signature from EIP712 signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.Wallet}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ testWallet.address,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=Wallet and signature is invalid', async () => {
+ // Create EIP712 signature using a private key that does not belong to the wallet owner.
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashBuffer = ethUtil.toBuffer(orderHashHex);
+ const notWalletOwnerPrivateKey = notSignerPrivateKey;
+ const ecSignature = ethUtil.ecsign(orderHashBuffer, notWalletOwnerPrivateKey);
+ // Create 0x signature from EIP712 signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.Wallet}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ testWallet.address,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=Validator, signature is valid and validator is approved', async () => {
+ const validatorAddress = ethUtil.toBuffer(`${testValidator.address}`);
+ const signatureType = ethUtil.toBuffer(`0x${SignatureType.Validator}`);
+ const signature = Buffer.concat([validatorAddress, signatureType]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=Validator, signature is invalid and validator is approved', async () => {
+ const validatorAddress = ethUtil.toBuffer(`${testValidator.address}`);
+ const signatureType = ethUtil.toBuffer(`0x${SignatureType.Validator}`);
+ const signature = Buffer.concat([validatorAddress, signatureType]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ // This will return false because we signed the message with `signerAddress`, but
+ // are validating against `notSignerAddress`
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ notSignerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return false when SignatureType=Validator, signature is valid and validator is not approved', async () => {
+ // Set approval of signature validator to false
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await signatureValidator.setSignatureValidatorApproval.sendTransactionAsync(
+ testValidator.address,
+ false,
+ { from: signerAddress },
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Validate signature
+ const validatorAddress = ethUtil.toBuffer(`${testValidator.address}`);
+ const signatureType = ethUtil.toBuffer(`0x${SignatureType.Validator}`);
+ const signature = Buffer.concat([validatorAddress, signatureType]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=Trezor and signature is valid', async () => {
+ // Create Trezor signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashWithTrezorPrefixHex = addSignedMessagePrefix(orderHashHex, SignerType.Trezor);
+ const orderHashWithTrezorPrefixBuffer = ethUtil.toBuffer(orderHashWithTrezorPrefixHex);
+ const ecSignature = ethUtil.ecsign(orderHashWithTrezorPrefixBuffer, signerPrivateKey);
+ // Create 0x signature from Trezor signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.Trezor}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=Trezor and signature is invalid', async () => {
+ // Create Trezor signature
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const orderHashWithTrezorPrefixHex = addSignedMessagePrefix(orderHashHex, SignerType.Trezor);
+ const orderHashWithTrezorPrefixBuffer = ethUtil.toBuffer(orderHashWithTrezorPrefixHex);
+ const ecSignature = ethUtil.ecsign(orderHashWithTrezorPrefixBuffer, signerPrivateKey);
+ // Create 0x signature from Trezor signature
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(`0x${SignatureType.Trezor}`),
+ ]);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ // Validate signature.
+ // This will fail because `signerAddress` signed the message, but we're passing in `notSignerAddress`
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ notSignerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+
+ it('should return true when SignatureType=Presigned and signer has presigned hash', async () => {
+ // Presign hash
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await signatureValidator.preSign.sendTransactionAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ signedOrder.signature,
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ // Validate presigned signature
+ const signature = ethUtil.toBuffer(`0x${SignatureType.PreSigned}`);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.true();
+ });
+
+ it('should return false when SignatureType=Presigned and signer has not presigned hash', async () => {
+ const signature = ethUtil.toBuffer(`0x${SignatureType.PreSigned}`);
+ const signatureHex = ethUtil.bufferToHex(signature);
+ const orderHashHex = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValidSignature = await signatureValidator.publicIsValidSignature.callAsync(
+ orderHashHex,
+ signedOrder.makerAddress,
+ signatureHex,
+ );
+ expect(isValidSignature).to.be.false();
+ });
+ });
+
+ describe('setSignatureValidatorApproval', () => {
+ it('should emit a SignatureValidatorApprovalSet with correct args when a validator is approved', async () => {
+ const approval = true;
+ const res = await signatureValidatorLogDecoder.getTxWithDecodedLogsAsync(
+ await signatureValidator.setSignatureValidatorApproval.sendTransactionAsync(
+ testValidator.address,
+ approval,
+ {
+ from: signerAddress,
+ },
+ ),
+ );
+ expect(res.logs.length).to.equal(1);
+ const log = res.logs[0] as LogWithDecodedArgs<TestSignatureValidatorSignatureValidatorApprovalEventArgs>;
+ const logArgs = log.args;
+ expect(logArgs.signerAddress).to.equal(signerAddress);
+ expect(logArgs.validatorAddress).to.equal(testValidator.address);
+ expect(logArgs.approved).to.equal(approval);
+ });
+ it('should emit a SignatureValidatorApprovalSet with correct args when a validator is disapproved', async () => {
+ const approval = false;
+ const res = await signatureValidatorLogDecoder.getTxWithDecodedLogsAsync(
+ await signatureValidator.setSignatureValidatorApproval.sendTransactionAsync(
+ testValidator.address,
+ approval,
+ {
+ from: signerAddress,
+ },
+ ),
+ );
+ expect(res.logs.length).to.equal(1);
+ const log = res.logs[0] as LogWithDecodedArgs<TestSignatureValidatorSignatureValidatorApprovalEventArgs>;
+ const logArgs = log.args;
+ expect(logArgs.signerAddress).to.equal(signerAddress);
+ expect(logArgs.validatorAddress).to.equal(testValidator.address);
+ expect(logArgs.approved).to.equal(approval);
+ });
+ });
+});
+// tslint:disable:max-file-line-count
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/exchange/transactions.ts b/packages/contracts/test/exchange/transactions.ts
new file mode 100644
index 000000000..2bdd96b16
--- /dev/null
+++ b/packages/contracts/test/exchange/transactions.ts
@@ -0,0 +1,462 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { OrderWithoutExchangeAddress, RevertReason, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
+import { ExchangeWrapperContract } from '../../generated_contract_wrappers/exchange_wrapper';
+import { WhitelistContract } from '../../generated_contract_wrappers/whitelist';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ExchangeWrapper } from '../utils/exchange_wrapper';
+import { OrderFactory } from '../utils/order_factory';
+import { orderUtils } from '../utils/order_utils';
+import { TransactionFactory } from '../utils/transaction_factory';
+import { ERC20BalancesByOwner, SignedTransaction } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('Exchange transactions', () => {
+ let senderAddress: string;
+ let owner: string;
+ let makerAddress: string;
+ let takerAddress: string;
+ let feeRecipientAddress: string;
+
+ let erc20TokenA: DummyERC20TokenContract;
+ let erc20TokenB: DummyERC20TokenContract;
+ let zrxToken: DummyERC20TokenContract;
+ let exchange: ExchangeContract;
+ let erc20Proxy: ERC20ProxyContract;
+
+ let erc20Balances: ERC20BalancesByOwner;
+ let signedOrder: SignedOrder;
+ let signedTx: SignedTransaction;
+ let orderWithoutExchangeAddress: OrderWithoutExchangeAddress;
+ let orderFactory: OrderFactory;
+ let makerTransactionFactory: TransactionFactory;
+ let takerTransactionFactory: TransactionFactory;
+ let exchangeWrapper: ExchangeWrapper;
+ let erc20Wrapper: ERC20Wrapper;
+
+ let defaultMakerTokenAddress: string;
+ let defaultTakerTokenAddress: string;
+ let makerPrivateKey: Buffer;
+ let takerPrivateKey: Buffer;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const usedAddresses = ([owner, senderAddress, makerAddress, takerAddress, feeRecipientAddress] = _.slice(
+ accounts,
+ 0,
+ 5,
+ ));
+
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 3;
+ [erc20TokenA, erc20TokenB, zrxToken] = await erc20Wrapper.deployDummyTokensAsync(
+ numDummyErc20ToDeploy,
+ constants.DUMMY_TOKEN_DECIMALS,
+ );
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ );
+ exchangeWrapper = new ExchangeWrapper(exchange, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ defaultMakerTokenAddress = erc20TokenA.address;
+ defaultTakerTokenAddress = erc20TokenB.address;
+
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ senderAddress,
+ exchangeAddress: exchange.address,
+ makerAddress,
+ feeRecipientAddress,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerTokenAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerTokenAddress),
+ };
+ makerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ takerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(takerAddress)];
+ orderFactory = new OrderFactory(makerPrivateKey, defaultOrderParams);
+ makerTransactionFactory = new TransactionFactory(makerPrivateKey, exchange.address);
+ takerTransactionFactory = new TransactionFactory(takerPrivateKey, exchange.address);
+ });
+ describe('executeTransaction', () => {
+ describe('fillOrder', () => {
+ let takerAssetFillAmount: BigNumber;
+ beforeEach(async () => {
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ signedOrder = await orderFactory.newSignedOrderAsync();
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+
+ takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ const data = exchange.fillOrder.getABIEncodedTransactionData(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ );
+ signedTx = takerTransactionFactory.newSignedTransaction(data);
+ });
+
+ it('should throw if not called by specified sender', async () => {
+ return expectTransactionFailedAsync(
+ exchangeWrapper.executeTransactionAsync(signedTx, takerAddress),
+ RevertReason.FailedExecution,
+ );
+ });
+
+ it('should transfer the correct amounts when signed by taker and called by sender', async () => {
+ await exchangeWrapper.executeTransactionAsync(signedTx, senderAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ const makerAssetFillAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
+ const makerFeePaid = signedOrder.makerFee
+ .times(makerAssetFillAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ const takerFeePaid = signedOrder.takerFee
+ .times(makerAssetFillAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ expect(newBalances[makerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerTokenAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerTokenAddress].add(takerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFeePaid),
+ );
+ expect(newBalances[takerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerTokenAddress].minus(takerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerTokenAddress].add(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFeePaid),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFeePaid.add(takerFeePaid)),
+ );
+ });
+
+ it('should throw if the a 0x transaction with the same transactionHash has already been executed', async () => {
+ await exchangeWrapper.executeTransactionAsync(signedTx, senderAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.executeTransactionAsync(signedTx, senderAddress),
+ RevertReason.InvalidTxHash,
+ );
+ });
+
+ it('should reset the currentContextAddress', async () => {
+ await exchangeWrapper.executeTransactionAsync(signedTx, senderAddress);
+ const currentContextAddress = await exchange.currentContextAddress.callAsync();
+ expect(currentContextAddress).to.equal(constants.NULL_ADDRESS);
+ });
+ });
+
+ describe('cancelOrder', () => {
+ beforeEach(async () => {
+ const data = exchange.cancelOrder.getABIEncodedTransactionData(orderWithoutExchangeAddress);
+ signedTx = makerTransactionFactory.newSignedTransaction(data);
+ });
+
+ it('should throw if not called by specified sender', async () => {
+ return expectTransactionFailedAsync(
+ exchangeWrapper.executeTransactionAsync(signedTx, makerAddress),
+ RevertReason.FailedExecution,
+ );
+ });
+
+ it('should cancel the order when signed by maker and called by sender', async () => {
+ await exchangeWrapper.executeTransactionAsync(signedTx, senderAddress);
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrderAsync(signedOrder, senderAddress),
+ RevertReason.OrderUnfillable,
+ );
+ });
+ });
+
+ describe('cancelOrdersUpTo', () => {
+ let exchangeWrapperContract: ExchangeWrapperContract;
+
+ before(async () => {
+ exchangeWrapperContract = await ExchangeWrapperContract.deployFrom0xArtifactAsync(
+ artifacts.ExchangeWrapper,
+ provider,
+ txDefaults,
+ exchange.address,
+ );
+ });
+
+ it("should cancel an order if called from the order's sender", async () => {
+ const orderSalt = new BigNumber(0);
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ senderAddress: exchangeWrapperContract.address,
+ salt: orderSalt,
+ });
+ const targetOrderEpoch = orderSalt.add(1);
+ const cancelData = exchange.cancelOrdersUpTo.getABIEncodedTransactionData(targetOrderEpoch);
+ const signedCancelTx = makerTransactionFactory.newSignedTransaction(cancelData);
+ await exchangeWrapperContract.cancelOrdersUpTo.sendTransactionAsync(
+ targetOrderEpoch,
+ signedCancelTx.salt,
+ signedCancelTx.signature,
+ {
+ from: makerAddress,
+ },
+ );
+
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ const fillData = exchange.fillOrder.getABIEncodedTransactionData(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ );
+ const signedFillTx = takerTransactionFactory.newSignedTransaction(fillData);
+ return expectTransactionFailedAsync(
+ exchangeWrapperContract.fillOrder.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ signedFillTx.salt,
+ signedOrder.signature,
+ signedFillTx.signature,
+ { from: takerAddress },
+ ),
+ RevertReason.FailedExecution,
+ );
+ });
+
+ it("should not cancel an order if not called from the order's sender", async () => {
+ const orderSalt = new BigNumber(0);
+ signedOrder = await orderFactory.newSignedOrderAsync({
+ senderAddress: exchangeWrapperContract.address,
+ salt: orderSalt,
+ });
+ const targetOrderEpoch = orderSalt.add(1);
+ await exchangeWrapper.cancelOrdersUpToAsync(targetOrderEpoch, makerAddress);
+
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ const data = exchange.fillOrder.getABIEncodedTransactionData(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ signedOrder.signature,
+ );
+ signedTx = takerTransactionFactory.newSignedTransaction(data);
+ await exchangeWrapperContract.fillOrder.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ signedTx.salt,
+ signedOrder.signature,
+ signedTx.signature,
+ { from: takerAddress },
+ );
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ const makerAssetFillAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
+ const makerFeePaid = signedOrder.makerFee
+ .times(makerAssetFillAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ const takerFeePaid = signedOrder.takerFee
+ .times(makerAssetFillAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ expect(newBalances[makerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerTokenAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerTokenAddress].add(takerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFeePaid),
+ );
+ expect(newBalances[takerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerTokenAddress].minus(takerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerTokenAddress].add(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFeePaid),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFeePaid.add(takerFeePaid)),
+ );
+ });
+ });
+ });
+
+ describe('Whitelist', () => {
+ let whitelist: WhitelistContract;
+ let whitelistOrderFactory: OrderFactory;
+
+ before(async () => {
+ whitelist = await WhitelistContract.deployFrom0xArtifactAsync(
+ artifacts.Whitelist,
+ provider,
+ txDefaults,
+ exchange.address,
+ );
+ const isApproved = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await exchange.setSignatureValidatorApproval.sendTransactionAsync(whitelist.address, isApproved, {
+ from: takerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const defaultOrderParams = {
+ ...constants.STATIC_ORDER_PARAMS,
+ senderAddress: whitelist.address,
+ exchangeAddress: exchange.address,
+ makerAddress,
+ feeRecipientAddress,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerTokenAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerTokenAddress),
+ };
+ whitelistOrderFactory = new OrderFactory(makerPrivateKey, defaultOrderParams);
+ });
+
+ beforeEach(async () => {
+ signedOrder = await whitelistOrderFactory.newSignedOrderAsync();
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ });
+
+ it('should revert if maker has not been whitelisted', async () => {
+ const isApproved = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await whitelist.updateWhitelistStatus.sendTransactionAsync(takerAddress, isApproved, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ const salt = generatePseudoRandomSalt();
+ return expectTransactionFailedAsync(
+ whitelist.fillOrderIfWhitelisted.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ salt,
+ signedOrder.signature,
+ { from: takerAddress },
+ ),
+ RevertReason.MakerNotWhitelisted,
+ );
+ });
+
+ it('should revert if taker has not been whitelisted', async () => {
+ const isApproved = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await whitelist.updateWhitelistStatus.sendTransactionAsync(makerAddress, isApproved, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ const salt = generatePseudoRandomSalt();
+ return expectTransactionFailedAsync(
+ whitelist.fillOrderIfWhitelisted.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ salt,
+ signedOrder.signature,
+ { from: takerAddress },
+ ),
+ RevertReason.TakerNotWhitelisted,
+ );
+ });
+
+ it('should fill the order if maker and taker have been whitelisted', async () => {
+ const isApproved = true;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await whitelist.updateWhitelistStatus.sendTransactionAsync(makerAddress, isApproved, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await whitelist.updateWhitelistStatus.sendTransactionAsync(takerAddress, isApproved, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ const salt = generatePseudoRandomSalt();
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await whitelist.fillOrderIfWhitelisted.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ takerAssetFillAmount,
+ salt,
+ signedOrder.signature,
+ { from: takerAddress },
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const makerAssetFillAmount = signedOrder.makerAssetAmount;
+ const makerFeePaid = signedOrder.makerFee;
+ const takerFeePaid = signedOrder.takerFee;
+
+ expect(newBalances[makerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerTokenAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerTokenAddress].add(takerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFeePaid),
+ );
+ expect(newBalances[takerAddress][defaultTakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerTokenAddress].minus(takerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerTokenAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerTokenAddress].add(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFeePaid),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFeePaid.add(takerFeePaid)),
+ );
+ });
+ });
+});
diff --git a/packages/contracts/test/exchange/wrapper.ts b/packages/contracts/test/exchange/wrapper.ts
index 0d3e18711..d48441dca 100644
--- a/packages/contracts/test/exchange/wrapper.ts
+++ b/packages/contracts/test/exchange/wrapper.ts
@@ -1,385 +1,1259 @@
-import { SignedOrder, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { RevertReason, SignedOrder } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as chai from 'chai';
import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { DummyTokenContract } from '../../src/contract_wrappers/generated/dummy_token';
-import {
- ExchangeContract,
- LogCancelContractEventArgs,
- LogErrorContractEventArgs,
- LogFillContractEventArgs,
-} from '../../src/contract_wrappers/generated/exchange';
-import { TokenRegistryContract } from '../../src/contract_wrappers/generated/token_registry';
-import { TokenTransferProxyContract } from '../../src/contract_wrappers/generated/token_transfer_proxy';
-import { Balances } from '../../util/balances';
-import { constants } from '../../util/constants';
-import { ExchangeWrapper } from '../../util/exchange_wrapper';
-import { OrderFactory } from '../../util/order_factory';
-import { BalancesByOwner, ContractName } from '../../util/types';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { getLatestBlockTimestampAsync, increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { ExchangeWrapper } from '../utils/exchange_wrapper';
+import { OrderFactory } from '../utils/order_factory';
+import { ERC20BalancesByOwner, OrderStatus } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
chaiSetup.configure();
const expect = chai.expect;
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-describe('Exchange', () => {
- let maker: string;
- let tokenOwner: string;
- let taker: string;
- let feeRecipient: string;
-
- const INIT_BAL = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
- const INIT_ALLOW = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
+describe('Exchange wrappers', () => {
+ let makerAddress: string;
+ let owner: string;
+ let takerAddress: string;
+ let feeRecipientAddress: string;
- let rep: DummyTokenContract;
- let dgd: DummyTokenContract;
- let zrx: DummyTokenContract;
+ let erc20TokenA: DummyERC20TokenContract;
+ let erc20TokenB: DummyERC20TokenContract;
+ let zrxToken: DummyERC20TokenContract;
+ let erc721Token: DummyERC721TokenContract;
let exchange: ExchangeContract;
- let tokenRegistry: TokenRegistryContract;
- let tokenTransferProxy: TokenTransferProxyContract;
+ let erc20Proxy: ERC20ProxyContract;
+ let erc721Proxy: ERC721ProxyContract;
- let balances: BalancesByOwner;
-
- let exWrapper: ExchangeWrapper;
- let dmyBalances: Balances;
+ let exchangeWrapper: ExchangeWrapper;
+ let erc20Wrapper: ERC20Wrapper;
+ let erc721Wrapper: ERC721Wrapper;
+ let erc20Balances: ERC20BalancesByOwner;
let orderFactory: OrderFactory;
+ let erc721MakerAssetId: BigNumber;
+ let erc721TakerAssetId: BigNumber;
+
+ let defaultMakerAssetAddress: string;
+ let defaultTakerAssetAddress: string;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
- tokenOwner = accounts[0];
- [maker, taker, feeRecipient] = accounts;
- const [repInstance, dgdInstance, zrxInstance] = await Promise.all([
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS),
- ]);
- rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
- dgd = new DummyTokenContract(web3Wrapper, dgdInstance.abi, dgdInstance.address);
- zrx = new DummyTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
- const tokenRegistryInstance = await deployer.deployAsync(ContractName.TokenRegistry);
- tokenRegistry = new TokenRegistryContract(
- web3Wrapper,
- tokenRegistryInstance.abi,
- tokenRegistryInstance.address,
+ const usedAddresses = ([owner, makerAddress, takerAddress, feeRecipientAddress] = _.slice(accounts, 0, 4));
+
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+ erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 3;
+ [erc20TokenA, erc20TokenB, zrxToken] = await erc20Wrapper.deployDummyTokensAsync(
+ numDummyErc20ToDeploy,
+ constants.DUMMY_TOKEN_DECIMALS,
);
- const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
- tokenTransferProxy = new TokenTransferProxyContract(
- web3Wrapper,
- tokenTransferProxyInstance.abi,
- tokenTransferProxyInstance.address,
+ erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+ erc721MakerAssetId = erc721Balances[makerAddress][erc721Token.address][0];
+ erc721TakerAssetId = erc721Balances[takerAddress][erc721Token.address][0];
+
+ exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
);
- const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
- zrx.address,
- tokenTransferProxy.address,
- ]);
- exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: accounts[0] });
- const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
- exWrapper = new ExchangeWrapper(exchange, zeroEx);
+ exchangeWrapper = new ExchangeWrapper(exchange, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(erc721Proxy.address, owner);
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ defaultMakerAssetAddress = erc20TokenA.address;
+ defaultTakerAssetAddress = erc20TokenB.address;
const defaultOrderParams = {
- exchangeContractAddress: exchange.address,
- maker,
- feeRecipient,
- makerTokenAddress: rep.address,
- takerTokenAddress: dgd.address,
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
- makerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
- takerFee: ZeroEx.toBaseUnitAmount(new BigNumber(1), 18),
+ ...constants.STATIC_ORDER_PARAMS,
+ exchangeAddress: exchange.address,
+ makerAddress,
+ feeRecipientAddress,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
};
-
- orderFactory = new OrderFactory(zeroEx, defaultOrderParams);
- dmyBalances = new Balances([rep, dgd, zrx], [maker, taker, feeRecipient]);
- await Promise.all([
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: maker }),
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: taker }),
- rep.setBalance.sendTransactionAsync(maker, INIT_BAL, { from: tokenOwner }),
- rep.setBalance.sendTransactionAsync(taker, INIT_BAL, { from: tokenOwner }),
- dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: maker }),
- dgd.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: taker }),
- dgd.setBalance.sendTransactionAsync(maker, INIT_BAL, { from: tokenOwner }),
- dgd.setBalance.sendTransactionAsync(taker, INIT_BAL, { from: tokenOwner }),
- zrx.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: maker }),
- zrx.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, { from: taker }),
- zrx.setBalance.sendTransactionAsync(maker, INIT_BAL, { from: tokenOwner }),
- zrx.setBalance.sendTransactionAsync(taker, INIT_BAL, { from: tokenOwner }),
- ]);
+ const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ orderFactory = new OrderFactory(privateKey, defaultOrderParams);
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
});
afterEach(async () => {
await blockchainLifecycle.revertAsync();
});
describe('fillOrKillOrder', () => {
- beforeEach(async () => {
- balances = await dmyBalances.getAsync();
+ it('should transfer the correct amounts', async () => {
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
+ });
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ await exchangeWrapper.fillOrKillOrderAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
+ const makerFee = signedOrder.makerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ const takerFee = signedOrder.takerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFilledAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(takerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
+ );
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFilledAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
+ );
});
- it('should transfer the correct amounts', async () => {
+ it('should throw if a signedOrder is expired', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
const signedOrder = await orderFactory.newSignedOrderAsync({
- makerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(100), 18),
- takerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(200), 18),
+ expirationTimeSeconds: new BigNumber(currentTimestamp).sub(10),
});
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- await exWrapper.fillOrKillOrderAsync(signedOrder, taker, {
- fillTakerTokenAmount,
+
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrKillOrderAsync(signedOrder, takerAddress),
+ RevertReason.OrderUnfillable,
+ );
+ });
+
+ it('should throw if entire takerAssetFillAmount not filled', async () => {
+ const signedOrder = await orderFactory.newSignedOrderAsync();
+
+ await exchangeWrapper.fillOrderAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount: signedOrder.takerAssetAmount.div(2),
});
- const newBalances = await dmyBalances.getAsync();
+ return expectTransactionFailedAsync(
+ exchangeWrapper.fillOrKillOrderAsync(signedOrder, takerAddress),
+ RevertReason.CompleteFillFailed,
+ );
+ });
+ });
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
+ describe('fillOrderNoThrow', () => {
+ it('should transfer the correct amounts', async () => {
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
+ });
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 250000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
const makerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
const takerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- expect(newBalances[maker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.makerTokenAddress].minus(fillMakerTokenAmount),
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFilledAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(takerAssetFillAmount),
);
- expect(newBalances[maker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrder.takerTokenAddress].add(fillTakerTokenAmount),
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
);
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(balances[maker][zrx.address].minus(makerFee));
- expect(newBalances[taker][signedOrder.takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.takerTokenAddress].minus(fillTakerTokenAmount),
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount),
);
- expect(newBalances[taker][signedOrder.makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrder.makerTokenAddress].add(fillMakerTokenAmount),
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFilledAmount),
);
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(balances[taker][zrx.address].minus(takerFee));
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(makerFee.add(takerFee)),
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
);
});
- it('should throw if an signedOrder is expired', async () => {
+ it('should not change erc20Balances if maker erc20Balances are too low to fill order', async () => {
const signedOrder = await orderFactory.newSignedOrderAsync({
- expirationUnixTimestampSec: new BigNumber(Math.floor((Date.now() - 10000) / 1000)),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
});
- return expect(exWrapper.fillOrKillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
});
- it('should throw if entire fillTakerTokenAmount not filled', async () => {
+ it('should not change erc20Balances if taker erc20Balances are too low to fill order', async () => {
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18),
+ });
+
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not change erc20Balances if maker allowances are too low to fill order', async () => {
const signedOrder = await orderFactory.newSignedOrderAsync();
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20TokenA.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
+ from: makerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20TokenA.approve.sendTransactionAsync(erc20Proxy.address, constants.INITIAL_ERC20_ALLOWANCE, {
+ from: makerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
- const from = taker;
- await exWrapper.fillOrderAsync(signedOrder, from, {
- fillTakerTokenAmount: signedOrder.takerTokenAmount.div(2),
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not change erc20Balances if taker allowances are too low to fill order', async () => {
+ const signedOrder = await orderFactory.newSignedOrderAsync();
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20TokenB.approve.sendTransactionAsync(erc20Proxy.address, new BigNumber(0), {
+ from: takerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20TokenB.approve.sendTransactionAsync(erc20Proxy.address, constants.INITIAL_ERC20_ALLOWANCE, {
+ from: takerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not change erc20Balances if makerAssetAddress is ZRX, makerAssetAmount + makerFee > maker balance', async () => {
+ const makerZRXBalance = new BigNumber(erc20Balances[makerAddress][zrxToken.address]);
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: makerZRXBalance,
+ makerFee: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
});
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not change erc20Balances if makerAssetAddress is ZRX, makerAssetAmount + makerFee > maker allowance', async () => {
+ const makerZRXAllowance = await zrxToken.allowance.callAsync(makerAddress, erc20Proxy.address);
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(makerZRXAllowance),
+ makerFee: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ });
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
- return expect(exWrapper.fillOrKillOrderAsync(signedOrder, taker)).to.be.rejectedWith(constants.REVERT);
+ it('should not change erc20Balances if takerAssetAddress is ZRX, takerAssetAmount + takerFee > taker balance', async () => {
+ const takerZRXBalance = new BigNumber(erc20Balances[takerAddress][zrxToken.address]);
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ takerAssetAmount: takerZRXBalance,
+ takerFee: new BigNumber(1),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ });
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not change erc20Balances if takerAssetAddress is ZRX, takerAssetAmount + takerFee > taker allowance', async () => {
+ const takerZRXAllowance = await zrxToken.allowance.callAsync(takerAddress, erc20Proxy.address);
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ takerAssetAmount: new BigNumber(takerZRXAllowance),
+ takerFee: new BigNumber(1),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ });
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should successfully exchange ERC721 tokens', async () => {
+ // Construct Exchange parameters
+ const makerAssetId = erc721MakerAssetId;
+ const takerAssetId = erc721TakerAssetId;
+ const signedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ takerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, takerAssetId),
+ });
+ // Verify pre-conditions
+ const initialOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(initialOwnerMakerAsset).to.be.bignumber.equal(makerAddress);
+ const initialOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(initialOwnerTakerAsset).to.be.bignumber.equal(takerAddress);
+ // Call Exchange
+ const takerAssetFillAmount = signedOrder.takerAssetAmount;
+ await exchangeWrapper.fillOrderNoThrowAsync(signedOrder, takerAddress, {
+ takerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 280000,
+ });
+ // Verify post-conditions
+ const newOwnerMakerAsset = await erc721Token.ownerOf.callAsync(makerAssetId);
+ expect(newOwnerMakerAsset).to.be.bignumber.equal(takerAddress);
+ const newOwnerTakerAsset = await erc721Token.ownerOf.callAsync(takerAssetId);
+ expect(newOwnerTakerAsset).to.be.bignumber.equal(makerAddress);
});
});
describe('batch functions', () => {
let signedOrders: SignedOrder[];
beforeEach(async () => {
- signedOrders = await Promise.all([
- orderFactory.newSignedOrderAsync(),
- orderFactory.newSignedOrderAsync(),
- orderFactory.newSignedOrderAsync(),
- ]);
- balances = await dmyBalances.getAsync();
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ ];
});
describe('batchFillOrders', () => {
it('should transfer the correct amounts', async () => {
- const fillTakerTokenAmounts: BigNumber[] = [];
- const makerTokenAddress = rep.address;
- const takerTokenAddress = dgd.address;
- signedOrders.forEach(signedOrder => {
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
+ const takerAssetFillAmounts: BigNumber[] = [];
+ const makerAssetAddress = erc20TokenA.address;
+ const takerAssetAddress = erc20TokenB.address;
+ _.forEach(signedOrders, signedOrder => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
const makerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
const takerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- fillTakerTokenAmounts.push(fillTakerTokenAmount);
- balances[maker][makerTokenAddress] = balances[maker][makerTokenAddress].minus(fillMakerTokenAmount);
- balances[maker][takerTokenAddress] = balances[maker][takerTokenAddress].add(fillTakerTokenAmount);
- balances[maker][zrx.address] = balances[maker][zrx.address].minus(makerFee);
- balances[taker][makerTokenAddress] = balances[taker][makerTokenAddress].add(fillMakerTokenAmount);
- balances[taker][takerTokenAddress] = balances[taker][takerTokenAddress].minus(fillTakerTokenAmount);
- balances[taker][zrx.address] = balances[taker][zrx.address].minus(takerFee);
- balances[feeRecipient][zrx.address] = balances[feeRecipient][zrx.address].add(
- makerFee.add(takerFee),
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ takerAssetFillAmounts.push(takerAssetFillAmount);
+ erc20Balances[makerAddress][makerAssetAddress] = erc20Balances[makerAddress][
+ makerAssetAddress
+ ].minus(makerAssetFilledAmount);
+ erc20Balances[makerAddress][takerAssetAddress] = erc20Balances[makerAddress][takerAssetAddress].add(
+ takerAssetFillAmount,
);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ makerFee,
+ );
+ erc20Balances[takerAddress][makerAssetAddress] = erc20Balances[takerAddress][makerAssetAddress].add(
+ makerAssetFilledAmount,
+ );
+ erc20Balances[takerAddress][takerAssetAddress] = erc20Balances[takerAddress][
+ takerAssetAddress
+ ].minus(takerAssetFillAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(makerFee.add(takerFee));
});
- await exWrapper.batchFillOrdersAsync(signedOrders, taker, {
- fillTakerTokenAmounts,
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmounts,
});
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
});
});
describe('batchFillOrKillOrders', () => {
it('should transfer the correct amounts', async () => {
- const fillTakerTokenAmounts: BigNumber[] = [];
- const makerTokenAddress = rep.address;
- const takerTokenAddress = dgd.address;
- signedOrders.forEach(signedOrder => {
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- const fillMakerTokenAmount = fillTakerTokenAmount
- .times(signedOrder.makerTokenAmount)
- .dividedToIntegerBy(signedOrder.takerTokenAmount);
+ const takerAssetFillAmounts: BigNumber[] = [];
+ const makerAssetAddress = erc20TokenA.address;
+ const takerAssetAddress = erc20TokenB.address;
+ _.forEach(signedOrders, signedOrder => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
const makerFee = signedOrder.makerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
const takerFee = signedOrder.takerFee
- .times(fillMakerTokenAmount)
- .dividedToIntegerBy(signedOrder.makerTokenAmount);
- fillTakerTokenAmounts.push(fillTakerTokenAmount);
- balances[maker][makerTokenAddress] = balances[maker][makerTokenAddress].minus(fillMakerTokenAmount);
- balances[maker][takerTokenAddress] = balances[maker][takerTokenAddress].add(fillTakerTokenAmount);
- balances[maker][zrx.address] = balances[maker][zrx.address].minus(makerFee);
- balances[taker][makerTokenAddress] = balances[taker][makerTokenAddress].add(fillMakerTokenAmount);
- balances[taker][takerTokenAddress] = balances[taker][takerTokenAddress].minus(fillTakerTokenAmount);
- balances[taker][zrx.address] = balances[taker][zrx.address].minus(takerFee);
- balances[feeRecipient][zrx.address] = balances[feeRecipient][zrx.address].add(
- makerFee.add(takerFee),
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ takerAssetFillAmounts.push(takerAssetFillAmount);
+ erc20Balances[makerAddress][makerAssetAddress] = erc20Balances[makerAddress][
+ makerAssetAddress
+ ].minus(makerAssetFilledAmount);
+ erc20Balances[makerAddress][takerAssetAddress] = erc20Balances[makerAddress][takerAssetAddress].add(
+ takerAssetFillAmount,
+ );
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ makerFee,
);
+ erc20Balances[takerAddress][makerAssetAddress] = erc20Balances[takerAddress][makerAssetAddress].add(
+ makerAssetFilledAmount,
+ );
+ erc20Balances[takerAddress][takerAssetAddress] = erc20Balances[takerAddress][
+ takerAssetAddress
+ ].minus(takerAssetFillAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(makerFee.add(takerFee));
});
- await exWrapper.batchFillOrKillOrdersAsync(signedOrders, taker, {
- fillTakerTokenAmounts,
+ await exchangeWrapper.batchFillOrKillOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmounts,
});
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
});
it('should throw if a single signedOrder does not fill the expected amount', async () => {
- const fillTakerTokenAmounts: BigNumber[] = [];
- signedOrders.forEach(signedOrder => {
- const fillTakerTokenAmount = signedOrder.takerTokenAmount.div(2);
- fillTakerTokenAmounts.push(fillTakerTokenAmount);
+ const takerAssetFillAmounts: BigNumber[] = [];
+ _.forEach(signedOrders, signedOrder => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ takerAssetFillAmounts.push(takerAssetFillAmount);
+ });
+
+ await exchangeWrapper.fillOrKillOrderAsync(signedOrders[0], takerAddress);
+
+ return expectTransactionFailedAsync(
+ exchangeWrapper.batchFillOrKillOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmounts,
+ }),
+ RevertReason.OrderUnfillable,
+ );
+ });
+ });
+
+ describe('batchFillOrdersNoThrow', async () => {
+ it('should transfer the correct amounts', async () => {
+ const takerAssetFillAmounts: BigNumber[] = [];
+ const makerAssetAddress = erc20TokenA.address;
+ const takerAssetAddress = erc20TokenB.address;
+ _.forEach(signedOrders, signedOrder => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
+ const makerFee = signedOrder.makerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ const takerFee = signedOrder.takerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ takerAssetFillAmounts.push(takerAssetFillAmount);
+ erc20Balances[makerAddress][makerAssetAddress] = erc20Balances[makerAddress][
+ makerAssetAddress
+ ].minus(makerAssetFilledAmount);
+ erc20Balances[makerAddress][takerAssetAddress] = erc20Balances[makerAddress][takerAssetAddress].add(
+ takerAssetFillAmount,
+ );
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ makerFee,
+ );
+ erc20Balances[takerAddress][makerAssetAddress] = erc20Balances[takerAddress][makerAssetAddress].add(
+ makerAssetFilledAmount,
+ );
+ erc20Balances[takerAddress][takerAssetAddress] = erc20Balances[takerAddress][
+ takerAssetAddress
+ ].minus(takerAssetFillAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(makerFee.add(takerFee));
+ });
+
+ await exchangeWrapper.batchFillOrdersNoThrowAsync(signedOrders, takerAddress, {
+ takerAssetFillAmounts,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not throw if an order is invalid and fill the remaining orders', async () => {
+ const takerAssetFillAmounts: BigNumber[] = [];
+ const makerAssetAddress = erc20TokenA.address;
+ const takerAssetAddress = erc20TokenB.address;
+
+ const invalidOrder = {
+ ...signedOrders[0],
+ signature: '0x00',
+ };
+ const validOrders = signedOrders.slice(1);
+
+ takerAssetFillAmounts.push(invalidOrder.takerAssetAmount.div(2));
+ _.forEach(validOrders, signedOrder => {
+ const takerAssetFillAmount = signedOrder.takerAssetAmount.div(2);
+ const makerAssetFilledAmount = takerAssetFillAmount
+ .times(signedOrder.makerAssetAmount)
+ .dividedToIntegerBy(signedOrder.takerAssetAmount);
+ const makerFee = signedOrder.makerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ const takerFee = signedOrder.takerFee
+ .times(makerAssetFilledAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+ takerAssetFillAmounts.push(takerAssetFillAmount);
+ erc20Balances[makerAddress][makerAssetAddress] = erc20Balances[makerAddress][
+ makerAssetAddress
+ ].minus(makerAssetFilledAmount);
+ erc20Balances[makerAddress][takerAssetAddress] = erc20Balances[makerAddress][takerAssetAddress].add(
+ takerAssetFillAmount,
+ );
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ makerFee,
+ );
+ erc20Balances[takerAddress][makerAssetAddress] = erc20Balances[takerAddress][makerAssetAddress].add(
+ makerAssetFilledAmount,
+ );
+ erc20Balances[takerAddress][takerAssetAddress] = erc20Balances[takerAddress][
+ takerAssetAddress
+ ].minus(takerAssetFillAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(makerFee.add(takerFee));
+ });
+
+ const newOrders = [invalidOrder, ...validOrders];
+ await exchangeWrapper.batchFillOrdersNoThrowAsync(newOrders, takerAddress, {
+ takerAssetFillAmounts,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 450000,
});
- await exWrapper.fillOrKillOrderAsync(signedOrders[0], taker);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+ });
+
+ describe('marketSellOrders', () => {
+ it('should stop when the entire takerAssetFillAmount is filled', async () => {
+ const takerAssetFillAmount = signedOrders[0].takerAssetAmount.plus(
+ signedOrders[1].takerAssetAmount.div(2),
+ );
+ await exchangeWrapper.marketSellOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
- return expect(
- exWrapper.batchFillOrKillOrdersAsync(signedOrders, taker, {
- fillTakerTokenAmounts,
+ const makerAssetFilledAmount = signedOrders[0].makerAssetAmount.add(
+ signedOrders[1].makerAssetAmount.dividedToIntegerBy(2),
+ );
+ const makerFee = signedOrders[0].makerFee.add(signedOrders[1].makerFee.dividedToIntegerBy(2));
+ const takerFee = signedOrders[0].takerFee.add(signedOrders[1].takerFee.dividedToIntegerBy(2));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFilledAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(takerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
+ );
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFilledAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
+ );
+ });
+
+ it('should fill all signedOrders if cannot fill entire takerAssetFillAmount', async () => {
+ const takerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ _.forEach(signedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
+ );
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
+ });
+ await exchangeWrapper.marketSellOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should throw when a signedOrder does not use the same takerAssetAddress', async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ }),
+ await orderFactory.newSignedOrderAsync(),
+ ];
+
+ return expectTransactionFailedAsync(
+ exchangeWrapper.marketSellOrdersAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1000), 18),
}),
- ).to.be.rejectedWith(constants.REVERT);
+ // We simply use the takerAssetData from the first order for all orders.
+ // If they are not the same, the contract throws when validating the order signature
+ RevertReason.InvalidOrderSignature,
+ );
});
});
- describe('fillOrdersUpTo', () => {
- it('should stop when the entire fillTakerTokenAmount is filled', async () => {
- const fillTakerTokenAmount = signedOrders[0].takerTokenAmount.plus(
- signedOrders[1].takerTokenAmount.div(2),
+ describe('marketSellOrdersNoThrow', () => {
+ it('should stop when the entire takerAssetFillAmount is filled', async () => {
+ const takerAssetFillAmount = signedOrders[0].takerAssetAmount.plus(
+ signedOrders[1].takerAssetAmount.div(2),
);
- await exWrapper.fillOrdersUpToAsync(signedOrders, taker, {
- fillTakerTokenAmount,
+ await exchangeWrapper.marketSellOrdersNoThrowAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 6000000,
});
- const newBalances = await dmyBalances.getAsync();
+ const newBalances = await erc20Wrapper.getBalancesAsync();
- const fillMakerTokenAmount = signedOrders[0].makerTokenAmount.add(
- signedOrders[1].makerTokenAmount.dividedToIntegerBy(2),
+ const makerAssetFilledAmount = signedOrders[0].makerAssetAmount.add(
+ signedOrders[1].makerAssetAmount.dividedToIntegerBy(2),
);
const makerFee = signedOrders[0].makerFee.add(signedOrders[1].makerFee.dividedToIntegerBy(2));
const takerFee = signedOrders[0].takerFee.add(signedOrders[1].takerFee.dividedToIntegerBy(2));
- expect(newBalances[maker][signedOrders[0].makerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrders[0].makerTokenAddress].minus(fillMakerTokenAmount),
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFilledAmount),
);
- expect(newBalances[maker][signedOrders[0].takerTokenAddress]).to.be.bignumber.equal(
- balances[maker][signedOrders[0].takerTokenAddress].add(fillTakerTokenAmount),
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(takerAssetFillAmount),
);
- expect(newBalances[maker][zrx.address]).to.be.bignumber.equal(
- balances[maker][zrx.address].minus(makerFee),
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
);
- expect(newBalances[taker][signedOrders[0].takerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrders[0].takerTokenAddress].minus(fillTakerTokenAmount),
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(takerAssetFillAmount),
);
- expect(newBalances[taker][signedOrders[0].makerTokenAddress]).to.be.bignumber.equal(
- balances[taker][signedOrders[0].makerTokenAddress].add(fillMakerTokenAmount),
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFilledAmount),
);
- expect(newBalances[taker][zrx.address]).to.be.bignumber.equal(
- balances[taker][zrx.address].minus(takerFee),
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
);
- expect(newBalances[feeRecipient][zrx.address]).to.be.bignumber.equal(
- balances[feeRecipient][zrx.address].add(makerFee.add(takerFee)),
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
);
});
- it('should fill all signedOrders if cannot fill entire fillTakerTokenAmount', async () => {
- const fillTakerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(100000), 18);
- signedOrders.forEach(signedOrder => {
- balances[maker][signedOrder.makerTokenAddress] = balances[maker][
- signedOrder.makerTokenAddress
- ].minus(signedOrder.makerTokenAmount);
- balances[maker][signedOrder.takerTokenAddress] = balances[maker][signedOrder.takerTokenAddress].add(
- signedOrder.takerTokenAmount,
+ it('should fill all signedOrders if cannot fill entire takerAssetFillAmount', async () => {
+ const takerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ _.forEach(signedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
+ );
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
+ });
+ await exchangeWrapper.marketSellOrdersNoThrowAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not fill a signedOrder that does not use the same takerAssetAddress', async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ takerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ }),
+ ];
+ const takerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ const filledSignedOrders = signedOrders.slice(0, -1);
+ _.forEach(filledSignedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
);
- balances[maker][zrx.address] = balances[maker][zrx.address].minus(signedOrder.makerFee);
- balances[taker][signedOrder.makerTokenAddress] = balances[taker][signedOrder.makerTokenAddress].add(
- signedOrder.makerTokenAmount,
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
);
- balances[taker][signedOrder.takerTokenAddress] = balances[taker][
- signedOrder.takerTokenAddress
- ].minus(signedOrder.takerTokenAmount);
- balances[taker][zrx.address] = balances[taker][zrx.address].minus(signedOrder.takerFee);
- balances[feeRecipient][zrx.address] = balances[feeRecipient][zrx.address].add(
- signedOrder.makerFee.add(signedOrder.takerFee),
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
+ });
+ await exchangeWrapper.marketSellOrdersNoThrowAsync(signedOrders, takerAddress, {
+ takerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+ });
+
+ describe('marketBuyOrders', () => {
+ it('should stop when the entire makerAssetFillAmount is filled', async () => {
+ const makerAssetFillAmount = signedOrders[0].makerAssetAmount.plus(
+ signedOrders[1].makerAssetAmount.div(2),
+ );
+ await exchangeWrapper.marketBuyOrdersAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const makerAmountBought = signedOrders[0].takerAssetAmount.add(
+ signedOrders[1].takerAssetAmount.dividedToIntegerBy(2),
+ );
+ const makerFee = signedOrders[0].makerFee.add(signedOrders[1].makerFee.dividedToIntegerBy(2));
+ const takerFee = signedOrders[0].takerFee.add(signedOrders[1].takerFee.dividedToIntegerBy(2));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(makerAmountBought),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
+ );
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(makerAmountBought),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
+ );
+ });
+
+ it('should fill all signedOrders if cannot fill entire makerAssetFillAmount', async () => {
+ const makerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ _.forEach(signedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
+ );
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
);
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
});
- await exWrapper.fillOrdersUpToAsync(signedOrders, taker, {
- fillTakerTokenAmount,
+ await exchangeWrapper.marketBuyOrdersAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount,
});
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances).to.be.deep.equal(balances);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
});
- it('should throw when an signedOrder does not use the same takerTokenAddress', async () => {
- signedOrders = await Promise.all([
- orderFactory.newSignedOrderAsync(),
- orderFactory.newSignedOrderAsync({ takerTokenAddress: zrx.address }),
- orderFactory.newSignedOrderAsync(),
- ]);
+ it('should throw when a signedOrder does not use the same makerAssetAddress', async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ }),
+ await orderFactory.newSignedOrderAsync(),
+ ];
- return expect(
- exWrapper.fillOrdersUpToAsync(signedOrders, taker, {
- fillTakerTokenAmount: ZeroEx.toBaseUnitAmount(new BigNumber(1000), 18),
+ return expectTransactionFailedAsync(
+ exchangeWrapper.marketBuyOrdersAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1000), 18),
}),
- ).to.be.rejectedWith(constants.REVERT);
+ RevertReason.InvalidOrderSignature,
+ );
+ });
+ });
+
+ describe('marketBuyOrdersNoThrow', () => {
+ it('should stop when the entire makerAssetFillAmount is filled', async () => {
+ const makerAssetFillAmount = signedOrders[0].makerAssetAmount.plus(
+ signedOrders[1].makerAssetAmount.div(2),
+ );
+ await exchangeWrapper.marketBuyOrdersNoThrowAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const makerAmountBought = signedOrders[0].takerAssetAmount.add(
+ signedOrders[1].takerAssetAmount.dividedToIntegerBy(2),
+ );
+ const makerFee = signedOrders[0].makerFee.add(signedOrders[1].makerFee.dividedToIntegerBy(2));
+ const takerFee = signedOrders[0].takerFee.add(signedOrders[1].takerFee.dividedToIntegerBy(2));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultTakerAssetAddress].add(makerAmountBought),
+ );
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerFee),
+ );
+ expect(newBalances[takerAddress][defaultTakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultTakerAssetAddress].minus(makerAmountBought),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].add(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].minus(takerFee),
+ );
+ expect(newBalances[feeRecipientAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[feeRecipientAddress][zrxToken.address].add(makerFee.add(takerFee)),
+ );
+ });
+
+ it('should fill all signedOrders if cannot fill entire makerAssetFillAmount', async () => {
+ const makerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ _.forEach(signedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
+ );
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
+ });
+ await exchangeWrapper.marketBuyOrdersNoThrowAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
+ });
+
+ it('should not fill a signedOrder that does not use the same makerAssetAddress', async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ }),
+ ];
+
+ const makerAssetFillAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(100000), 18);
+ const filledSignedOrders = signedOrders.slice(0, -1);
+ _.forEach(filledSignedOrders, signedOrder => {
+ erc20Balances[makerAddress][defaultMakerAssetAddress] = erc20Balances[makerAddress][
+ defaultMakerAssetAddress
+ ].minus(signedOrder.makerAssetAmount);
+ erc20Balances[makerAddress][defaultTakerAssetAddress] = erc20Balances[makerAddress][
+ defaultTakerAssetAddress
+ ].add(signedOrder.takerAssetAmount);
+ erc20Balances[makerAddress][zrxToken.address] = erc20Balances[makerAddress][zrxToken.address].minus(
+ signedOrder.makerFee,
+ );
+ erc20Balances[takerAddress][defaultMakerAssetAddress] = erc20Balances[takerAddress][
+ defaultMakerAssetAddress
+ ].add(signedOrder.makerAssetAmount);
+ erc20Balances[takerAddress][defaultTakerAssetAddress] = erc20Balances[takerAddress][
+ defaultTakerAssetAddress
+ ].minus(signedOrder.takerAssetAmount);
+ erc20Balances[takerAddress][zrxToken.address] = erc20Balances[takerAddress][zrxToken.address].minus(
+ signedOrder.takerFee,
+ );
+ erc20Balances[feeRecipientAddress][zrxToken.address] = erc20Balances[feeRecipientAddress][
+ zrxToken.address
+ ].add(signedOrder.makerFee.add(signedOrder.takerFee));
+ });
+ await exchangeWrapper.marketBuyOrdersNoThrowAsync(signedOrders, takerAddress, {
+ makerAssetFillAmount,
+ // HACK(albrow): We need to hardcode the gas estimate here because
+ // the Geth gas estimator doesn't work with the way we use
+ // delegatecall and swallow errors.
+ gas: 600000,
+ });
+
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances).to.be.deep.equal(erc20Balances);
});
});
describe('batchCancelOrders', () => {
it('should be able to cancel multiple signedOrders', async () => {
- const cancelTakerTokenAmounts = _.map(signedOrders, signedOrder => signedOrder.takerTokenAmount);
- await exWrapper.batchCancelOrdersAsync(signedOrders, maker, {
- cancelTakerTokenAmounts,
+ const takerAssetCancelAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount);
+ await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
+
+ await exchangeWrapper.batchFillOrdersNoThrowAsync(signedOrders, takerAddress, {
+ takerAssetFillAmounts: takerAssetCancelAmounts,
});
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(erc20Balances).to.be.deep.equal(newBalances);
+ });
+ });
- await exWrapper.batchFillOrdersAsync(signedOrders, taker, {
- fillTakerTokenAmounts: cancelTakerTokenAmounts,
+ describe('getOrdersInfo', () => {
+ beforeEach(async () => {
+ signedOrders = [
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ await orderFactory.newSignedOrderAsync(),
+ ];
+ });
+ it('should get the correct information for multiple unfilled orders', async () => {
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.FILLABLE;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple fully filled orders', async () => {
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount;
+ const expectedOrderStatus = OrderStatus.FULLY_FILLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple cancelled and unfilled orders', async () => {
+ await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple cancelled and partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ await exchangeWrapper.batchCancelOrdersAsync(signedOrders, makerAddress);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.CANCELLED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for multiple expired and unfilled orders', async () => {
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = new BigNumber(0);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
});
- const newBalances = await dmyBalances.getAsync();
- expect(balances).to.be.deep.equal(newBalances);
+ });
+ it('should get the correct information for multiple expired and partially filled orders', async () => {
+ const takerAssetFillAmounts = _.map(signedOrders, signedOrder => signedOrder.takerAssetAmount.div(2));
+ await exchangeWrapper.batchFillOrdersAsync(signedOrders, takerAddress, { takerAssetFillAmounts });
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const timeUntilExpiration = signedOrders[0].expirationTimeSeconds.minus(currentTimestamp).toNumber();
+ await increaseTimeAndMineBlockAsync(timeUntilExpiration);
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(3);
+ _.forEach(signedOrders, (signedOrder, index) => {
+ const expectedOrderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const expectedTakerAssetFilledAmount = signedOrder.takerAssetAmount.div(2);
+ const expectedOrderStatus = OrderStatus.EXPIRED;
+ const orderInfo = ordersInfo[index];
+ expect(orderInfo.orderHash).to.be.equal(expectedOrderHash);
+ expect(orderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(expectedTakerAssetFilledAmount);
+ expect(orderInfo.orderStatus).to.equal(expectedOrderStatus);
+ });
+ });
+ it('should get the correct information for a mix of unfilled, partially filled, fully filled, cancelled, and expired orders', async () => {
+ const unfilledOrder = await orderFactory.newSignedOrderAsync();
+ const partiallyFilledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.fillOrderAsync(partiallyFilledOrder, takerAddress, {
+ takerAssetFillAmount: partiallyFilledOrder.takerAssetAmount.div(2),
+ });
+ const fullyFilledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.fillOrderAsync(fullyFilledOrder, takerAddress);
+ const cancelledOrder = await orderFactory.newSignedOrderAsync();
+ await exchangeWrapper.cancelOrderAsync(cancelledOrder, makerAddress);
+ const currentTimestamp = await getLatestBlockTimestampAsync();
+ const expiredOrder = await orderFactory.newSignedOrderAsync({
+ expirationTimeSeconds: new BigNumber(currentTimestamp),
+ });
+ signedOrders = [unfilledOrder, partiallyFilledOrder, fullyFilledOrder, cancelledOrder, expiredOrder];
+ const ordersInfo = await exchangeWrapper.getOrdersInfoAsync(signedOrders);
+ expect(ordersInfo.length).to.be.equal(5);
+
+ const expectedUnfilledOrderHash = orderHashUtils.getOrderHashHex(unfilledOrder);
+ const expectedUnfilledTakerAssetFilledAmount = new BigNumber(0);
+ const expectedUnfilledOrderStatus = OrderStatus.FILLABLE;
+ const unfilledOrderInfo = ordersInfo[0];
+ expect(unfilledOrderInfo.orderHash).to.be.equal(expectedUnfilledOrderHash);
+ expect(unfilledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedUnfilledTakerAssetFilledAmount,
+ );
+ expect(unfilledOrderInfo.orderStatus).to.be.equal(expectedUnfilledOrderStatus);
+
+ const expectedPartialOrderHash = orderHashUtils.getOrderHashHex(partiallyFilledOrder);
+ const expectedPartialTakerAssetFilledAmount = partiallyFilledOrder.takerAssetAmount.div(2);
+ const expectedPartialOrderStatus = OrderStatus.FILLABLE;
+ const partialOrderInfo = ordersInfo[1];
+ expect(partialOrderInfo.orderHash).to.be.equal(expectedPartialOrderHash);
+ expect(partialOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedPartialTakerAssetFilledAmount,
+ );
+ expect(partialOrderInfo.orderStatus).to.be.equal(expectedPartialOrderStatus);
+
+ const expectedFilledOrderHash = orderHashUtils.getOrderHashHex(fullyFilledOrder);
+ const expectedFilledTakerAssetFilledAmount = fullyFilledOrder.takerAssetAmount;
+ const expectedFilledOrderStatus = OrderStatus.FULLY_FILLED;
+ const filledOrderInfo = ordersInfo[2];
+ expect(filledOrderInfo.orderHash).to.be.equal(expectedFilledOrderHash);
+ expect(filledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedFilledTakerAssetFilledAmount,
+ );
+ expect(filledOrderInfo.orderStatus).to.be.equal(expectedFilledOrderStatus);
+
+ const expectedCancelledOrderHash = orderHashUtils.getOrderHashHex(cancelledOrder);
+ const expectedCancelledTakerAssetFilledAmount = new BigNumber(0);
+ const expectedCancelledOrderStatus = OrderStatus.CANCELLED;
+ const cancelledOrderInfo = ordersInfo[3];
+ expect(cancelledOrderInfo.orderHash).to.be.equal(expectedCancelledOrderHash);
+ expect(cancelledOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedCancelledTakerAssetFilledAmount,
+ );
+ expect(cancelledOrderInfo.orderStatus).to.be.equal(expectedCancelledOrderStatus);
+
+ const expectedExpiredOrderHash = orderHashUtils.getOrderHashHex(expiredOrder);
+ const expectedExpiredTakerAssetFilledAmount = new BigNumber(0);
+ const expectedExpiredOrderStatus = OrderStatus.EXPIRED;
+ const expiredOrderInfo = ordersInfo[4];
+ expect(expiredOrderInfo.orderHash).to.be.equal(expectedExpiredOrderHash);
+ expect(expiredOrderInfo.orderTakerAssetFilledAmount).to.be.bignumber.equal(
+ expectedExpiredTakerAssetFilledAmount,
+ );
+ expect(expiredOrderInfo.orderStatus).to.be.equal(expectedExpiredOrderStatus);
});
});
});
-});
+}); // tslint:disable-line:max-file-line-count
diff --git a/packages/contracts/test/forwarder/forwarder.ts b/packages/contracts/test/forwarder/forwarder.ts
new file mode 100644
index 000000000..28ffdeabe
--- /dev/null
+++ b/packages/contracts/test/forwarder/forwarder.ts
@@ -0,0 +1,996 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { assetDataUtils } from '@0xproject/order-utils';
+import { RevertReason, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
+import { ForwarderContract } from '../../generated_contract_wrappers/forwarder';
+import { WETH9Contract } from '../../generated_contract_wrappers/weth9';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { ERC20Wrapper } from '../utils/erc20_wrapper';
+import { ERC721Wrapper } from '../utils/erc721_wrapper';
+import { ExchangeWrapper } from '../utils/exchange_wrapper';
+import { ForwarderWrapper } from '../utils/forwarder_wrapper';
+import { OrderFactory } from '../utils/order_factory';
+import { ContractName, ERC20BalancesByOwner } from '../utils/types';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+const DECIMALS_DEFAULT = 18;
+const MAX_WETH_FILL_PERCENTAGE = 95;
+
+describe(ContractName.Forwarder, () => {
+ let makerAddress: string;
+ let owner: string;
+ let takerAddress: string;
+ let feeRecipientAddress: string;
+ let otherAddress: string;
+ let defaultMakerAssetAddress: string;
+ let zrxAssetData: string;
+
+ let weth: DummyERC20TokenContract;
+ let zrxToken: DummyERC20TokenContract;
+ let erc721Token: DummyERC721TokenContract;
+ let forwarderContract: ForwarderContract;
+ let wethContract: WETH9Contract;
+ let forwarderWrapper: ForwarderWrapper;
+ let exchangeWrapper: ExchangeWrapper;
+
+ let orderWithoutFee: SignedOrder;
+ let orderWithFee: SignedOrder;
+ let feeOrder: SignedOrder;
+ let orderFactory: OrderFactory;
+ let erc20Wrapper: ERC20Wrapper;
+ let erc20Balances: ERC20BalancesByOwner;
+ let tx: TransactionReceiptWithDecodedLogs;
+
+ let erc721MakerAssetIds: BigNumber[];
+ let takerEthBalanceBefore: BigNumber;
+ let feePercentage: BigNumber;
+ let gasPrice: BigNumber;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const usedAddresses = ([owner, makerAddress, takerAddress, feeRecipientAddress, otherAddress] = accounts);
+
+ const txHash = await web3Wrapper.sendTransactionAsync({ from: accounts[0], to: accounts[0], value: 0 });
+ const transaction = await web3Wrapper.getTransactionByHashAsync(txHash);
+ gasPrice = new BigNumber(transaction.gasPrice);
+
+ const erc721Wrapper = new ERC721Wrapper(provider, usedAddresses, owner);
+ erc20Wrapper = new ERC20Wrapper(provider, usedAddresses, owner);
+
+ const numDummyErc20ToDeploy = 3;
+ let erc20TokenA;
+ [erc20TokenA, zrxToken] = await erc20Wrapper.deployDummyTokensAsync(
+ numDummyErc20ToDeploy,
+ constants.DUMMY_TOKEN_DECIMALS,
+ );
+ const erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ const erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+ erc721MakerAssetIds = erc721Balances[makerAddress][erc721Token.address];
+
+ wethContract = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, txDefaults);
+ weth = new DummyERC20TokenContract(wethContract.abi, wethContract.address, provider);
+ erc20Wrapper.addDummyTokenContract(weth);
+
+ const wethAssetData = assetDataUtils.encodeERC20AssetData(wethContract.address);
+ zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ const exchangeInstance = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ zrxAssetData,
+ );
+ const exchangeContract = new ExchangeContract(exchangeInstance.abi, exchangeInstance.address, provider);
+ exchangeWrapper = new ExchangeWrapper(exchangeContract, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, owner);
+ await exchangeWrapper.registerAssetProxyAsync(erc721Proxy.address, owner);
+
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeInstance.address, {
+ from: owner,
+ });
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeInstance.address, {
+ from: owner,
+ });
+
+ defaultMakerAssetAddress = erc20TokenA.address;
+ const defaultTakerAssetAddress = wethContract.address;
+ const defaultOrderParams = {
+ exchangeAddress: exchangeInstance.address,
+ makerAddress,
+ feeRecipientAddress,
+ makerAssetData: assetDataUtils.encodeERC20AssetData(defaultMakerAssetAddress),
+ takerAssetData: assetDataUtils.encodeERC20AssetData(defaultTakerAssetAddress),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), DECIMALS_DEFAULT),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(10), DECIMALS_DEFAULT),
+ makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(0), DECIMALS_DEFAULT),
+ };
+ const privateKey = constants.TESTRPC_PRIVATE_KEYS[accounts.indexOf(makerAddress)];
+ orderFactory = new OrderFactory(privateKey, defaultOrderParams);
+
+ const forwarderInstance = await ForwarderContract.deployFrom0xArtifactAsync(
+ artifacts.Forwarder,
+ provider,
+ txDefaults,
+ exchangeInstance.address,
+ wethContract.address,
+ zrxToken.address,
+ zrxAssetData,
+ wethAssetData,
+ );
+ forwarderContract = new ForwarderContract(forwarderInstance.abi, forwarderInstance.address, provider);
+ forwarderWrapper = new ForwarderWrapper(forwarderContract, provider);
+ const zrxDepositAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(10000), 18);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.transfer.sendTransactionAsync(forwarderContract.address, zrxDepositAmount),
+ );
+ erc20Wrapper.addTokenOwnerAddress(forwarderInstance.address);
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ erc20Balances = await erc20Wrapper.getBalancesAsync();
+ takerEthBalanceBefore = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ orderWithoutFee = await orderFactory.newSignedOrderAsync();
+ feeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('marketSellOrdersWithEth without extra fees', () => {
+ it('should fill a single order', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = orderWithoutFee.takerAssetAmount.dividedToIntegerBy(2);
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithoutFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getPercentageOfValue(
+ ethValue,
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const makerAssetFillAmount = primaryTakerAssetFillAmount
+ .times(orderWithoutFee.makerAssetAmount)
+ .dividedToIntegerBy(orderWithoutFee.takerAssetAmount);
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fill multiple orders', async () => {
+ const secondOrderWithoutFee = await orderFactory.newSignedOrderAsync();
+ const ordersWithoutFee = [orderWithoutFee, secondOrderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = ordersWithoutFee[0].takerAssetAmount.plus(
+ ordersWithoutFee[1].takerAssetAmount.dividedToIntegerBy(2),
+ );
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithoutFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getPercentageOfValue(
+ ethValue,
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const firstTakerAssetFillAmount = ordersWithoutFee[0].takerAssetAmount;
+ const secondTakerAssetFillAmount = primaryTakerAssetFillAmount.minus(firstTakerAssetFillAmount);
+
+ const makerAssetFillAmount = ordersWithoutFee[0].makerAssetAmount.plus(
+ ordersWithoutFee[1].makerAssetAmount
+ .times(secondTakerAssetFillAmount)
+ .dividedToIntegerBy(ordersWithoutFee[1].takerAssetAmount),
+ );
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fill the order and pay ZRX fees from a single feeOrder', async () => {
+ const ordersWithFee = [orderWithFee];
+ const feeOrders = [feeOrder];
+ const ethValue = orderWithFee.takerAssetAmount.dividedToIntegerBy(2);
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getPercentageOfValue(
+ ethValue,
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const makerAssetFillAmount = primaryTakerAssetFillAmount
+ .times(orderWithoutFee.makerAssetAmount)
+ .dividedToIntegerBy(orderWithoutFee.takerAssetAmount);
+ const feeAmount = ForwarderWrapper.getPercentageOfValue(
+ orderWithFee.takerFee.dividedToIntegerBy(2),
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const wethSpentOnFeeOrders = ForwarderWrapper.getWethForFeeOrders(feeAmount, feeOrders);
+ const totalEthSpent = primaryTakerAssetFillAmount
+ .plus(wethSpentOnFeeOrders)
+ .plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount).plus(wethSpentOnFeeOrders),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fill the orders and pay ZRX from multiple feeOrders', async () => {
+ const ordersWithFee = [orderWithFee];
+ const ethValue = orderWithFee.takerAssetAmount;
+ const makerAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ const makerAssetAmount = orderWithFee.takerFee.dividedToIntegerBy(2);
+ const takerAssetAmount = feeOrder.takerAssetAmount
+ .times(makerAssetAmount)
+ .dividedToIntegerBy(feeOrder.makerAssetAmount);
+
+ const firstFeeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData,
+ makerAssetAmount,
+ takerAssetAmount,
+ });
+ const secondFeeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData,
+ makerAssetAmount,
+ takerAssetAmount,
+ });
+ const feeOrders = [firstFeeOrder, secondFeeOrder];
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getPercentageOfValue(
+ ethValue,
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const makerAssetFillAmount = primaryTakerAssetFillAmount
+ .times(orderWithoutFee.makerAssetAmount)
+ .dividedToIntegerBy(orderWithoutFee.takerAssetAmount);
+ const feeAmount = ForwarderWrapper.getPercentageOfValue(orderWithFee.takerFee, MAX_WETH_FILL_PERCENTAGE);
+ const wethSpentOnFeeOrders = ForwarderWrapper.getWethForFeeOrders(feeAmount, feeOrders);
+ const totalEthSpent = primaryTakerAssetFillAmount
+ .plus(wethSpentOnFeeOrders)
+ .plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount).plus(wethSpentOnFeeOrders),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fill the order when token is ZRX with fees', async () => {
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ const ordersWithFee = [orderWithFee];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = orderWithFee.takerAssetAmount.dividedToIntegerBy(2);
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const makerAssetFillAmount = orderWithFee.makerAssetAmount.dividedToIntegerBy(2);
+ const totalEthSpent = ethValue.plus(gasPrice.times(tx.gasUsed));
+ const takerFeePaid = orderWithFee.takerFee.dividedToIntegerBy(2);
+ const makerFeePaid = orderWithFee.makerFee.dividedToIntegerBy(2);
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerAssetFillAmount).minus(makerFeePaid),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].plus(makerAssetFillAmount).minus(takerFeePaid),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(ethValue),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[forwarderContract.address][zrxToken.address],
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should refund remaining ETH if amount is greater than takerAssetAmount', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = orderWithoutFee.takerAssetAmount.times(2);
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithoutFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const totalEthSpent = orderWithoutFee.takerAssetAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ });
+ it('should revert if ZRX cannot be fully repurchased', async () => {
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(50), DECIMALS_DEFAULT),
+ });
+ const ordersWithFee = [orderWithFee];
+ feeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ const feeOrders = [feeOrder];
+ const ethValue = orderWithFee.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ }),
+ RevertReason.CompleteFillFailed,
+ );
+ });
+ it('should not fill orders with different makerAssetData than the first order', async () => {
+ const makerAssetId = erc721MakerAssetIds[0];
+ const erc721SignedOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ });
+ const erc20SignedOrder = await orderFactory.newSignedOrderAsync();
+ const ordersWithoutFee = [erc20SignedOrder, erc721SignedOrder];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = erc20SignedOrder.takerAssetAmount.plus(erc721SignedOrder.takerAssetAmount);
+
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(ordersWithoutFee, feeOrders, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const totalEthSpent = erc20SignedOrder.takerAssetAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ });
+ });
+ describe('marketSellOrdersWithEth with extra fees', () => {
+ it('should fill the order and send fee to feeRecipient', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const ethValue = orderWithoutFee.takerAssetAmount.div(2);
+
+ const baseFeePercentage = 2;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(constants.PERCENTAGE_DENOMINATOR, baseFeePercentage);
+ const feeRecipientEthBalanceBefore = await web3Wrapper.getBalanceInWeiAsync(feeRecipientAddress);
+ tx = await forwarderWrapper.marketSellOrdersWithEthAsync(
+ ordersWithoutFee,
+ feeOrders,
+ {
+ value: ethValue,
+ from: takerAddress,
+ },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ );
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const feeRecipientEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(feeRecipientAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getPercentageOfValue(
+ ethValue,
+ MAX_WETH_FILL_PERCENTAGE,
+ );
+ const makerAssetFillAmount = primaryTakerAssetFillAmount
+ .times(orderWithoutFee.makerAssetAmount)
+ .dividedToIntegerBy(orderWithoutFee.takerAssetAmount);
+ const ethSpentOnFee = ForwarderWrapper.getPercentageOfValue(primaryTakerAssetFillAmount, baseFeePercentage);
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(ethSpentOnFee).plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(feeRecipientEthBalanceAfter).to.be.bignumber.equal(feeRecipientEthBalanceBefore.plus(ethSpentOnFee));
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fail if the fee is set too high', async () => {
+ const ethValue = orderWithoutFee.takerAssetAmount.div(2);
+ const baseFeePercentage = 6;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(ethValue, baseFeePercentage);
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ await expectTransactionFailedAsync(
+ forwarderWrapper.marketSellOrdersWithEthAsync(
+ ordersWithoutFee,
+ feeOrders,
+ { from: takerAddress, value: ethValue, gasPrice },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ ),
+ RevertReason.FeePercentageTooLarge,
+ );
+ });
+ it('should fail if there is not enough ETH remaining to pay the fee', async () => {
+ const ethValue = orderWithoutFee.takerAssetAmount.div(2);
+ const baseFeePercentage = 5;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(constants.PERCENTAGE_DENOMINATOR, baseFeePercentage);
+ const ordersWithFee = [orderWithFee];
+ const feeOrders = [feeOrder];
+ await expectTransactionFailedAsync(
+ forwarderWrapper.marketSellOrdersWithEthAsync(
+ ordersWithFee,
+ feeOrders,
+ { from: takerAddress, value: ethValue, gasPrice },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ ),
+ RevertReason.InsufficientEthRemaining,
+ );
+ });
+ });
+ describe('marketBuyOrdersWithEth without extra fees', () => {
+ it('should buy the exact amount of makerAsset in a single order', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount.dividedToIntegerBy(2);
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ethValue;
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should buy the exact amount of makerAsset in multiple orders', async () => {
+ const secondOrderWithoutFee = await orderFactory.newSignedOrderAsync();
+ const ordersWithoutFee = [orderWithoutFee, secondOrderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = ordersWithoutFee[0].makerAssetAmount.plus(
+ ordersWithoutFee[1].makerAssetAmount.dividedToIntegerBy(2),
+ );
+ const ethValue = ordersWithoutFee[0].takerAssetAmount.plus(
+ ordersWithoutFee[1].takerAssetAmount.dividedToIntegerBy(2),
+ );
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ethValue;
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should buy the exact amount of makerAsset and return excess ETH', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount;
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ethValue.dividedToIntegerBy(2);
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should buy the exact amount of makerAsset and pay ZRX from feeOrders', async () => {
+ const ordersWithFee = [orderWithFee];
+ const feeOrders = [feeOrder];
+ const makerAssetFillAmount = orderWithFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithFee.takerAssetAmount;
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = orderWithFee.takerAssetAmount.dividedToIntegerBy(2);
+ const feeAmount = orderWithFee.takerFee.dividedToIntegerBy(2);
+ const wethSpentOnFeeOrders = ForwarderWrapper.getWethForFeeOrders(feeAmount, feeOrders);
+ const totalEthSpent = primaryTakerAssetFillAmount
+ .plus(wethSpentOnFeeOrders)
+ .plus(gasPrice.times(tx.gasUsed));
+
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount).plus(wethSpentOnFeeOrders),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should buy slightly greater than makerAssetAmount when buying ZRX', async () => {
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ makerAssetData: assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ const ordersWithFee = [orderWithFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithFee.takerAssetAmount;
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ForwarderWrapper.getWethForFeeOrders(
+ makerAssetFillAmount,
+ ordersWithFee,
+ );
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+ const makerAssetFilledAmount = orderWithFee.makerAssetAmount
+ .times(primaryTakerAssetFillAmount)
+ .dividedToIntegerBy(orderWithFee.takerAssetAmount);
+ const takerFeePaid = orderWithFee.takerFee
+ .times(primaryTakerAssetFillAmount)
+ .dividedToIntegerBy(orderWithFee.takerAssetAmount);
+ const makerFeePaid = orderWithFee.makerFee
+ .times(primaryTakerAssetFillAmount)
+ .dividedToIntegerBy(orderWithFee.takerAssetAmount);
+ const totalZrxPurchased = makerAssetFilledAmount.minus(takerFeePaid);
+ // Up to 1 wei worth of ZRX will be overbought per order
+ const maxOverboughtZrx = new BigNumber(1)
+ .times(orderWithFee.makerAssetAmount)
+ .dividedToIntegerBy(orderWithFee.takerAssetAmount);
+
+ expect(totalZrxPurchased).to.be.bignumber.gte(makerAssetFillAmount);
+ expect(totalZrxPurchased).to.be.bignumber.lte(makerAssetFillAmount.plus(maxOverboughtZrx));
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][zrxToken.address].minus(makerAssetFilledAmount).minus(makerFeePaid),
+ );
+ expect(newBalances[takerAddress][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][zrxToken.address].plus(totalZrxPurchased),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[forwarderContract.address][zrxToken.address],
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should revert if the amount of ETH sent is too low to fill the makerAssetAmount', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount.dividedToIntegerBy(4);
+ return expectTransactionFailedAsync(
+ forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ }),
+ RevertReason.CompleteFillFailed,
+ );
+ });
+ it('should buy an ERC721 asset from a single order', async () => {
+ const makerAssetId = erc721MakerAssetIds[0];
+ orderWithoutFee = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ });
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = new BigNumber(1);
+ const ethValue = orderWithFee.takerAssetAmount;
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ from: takerAddress,
+ value: ethValue,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newOwner = await erc721Token.ownerOf.callAsync(makerAssetId);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = ethValue;
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(gasPrice.times(tx.gasUsed));
+ expect(newOwner).to.be.bignumber.equal(takerAddress);
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should revert if buying an ERC721 asset when later orders contain different makerAssetData', async () => {
+ const makerAssetId = erc721MakerAssetIds[0];
+ orderWithoutFee = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ });
+ const differentMakerAssetDataOrder = await orderFactory.newSignedOrderAsync();
+ const ordersWithoutFee = [orderWithoutFee, differentMakerAssetDataOrder];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = new BigNumber(1).plus(differentMakerAssetDataOrder.makerAssetAmount);
+ const ethValue = orderWithFee.takerAssetAmount;
+ return expectTransactionFailedAsync(
+ forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithoutFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ }),
+ RevertReason.CompleteFillFailed,
+ );
+ });
+ it('should buy an ERC721 asset and pay ZRX fees from a single fee order', async () => {
+ const makerAssetId = erc721MakerAssetIds[0];
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ const ordersWithFee = [orderWithFee];
+ const feeOrders = [feeOrder];
+ const makerAssetFillAmount = orderWithFee.makerAssetAmount;
+ const primaryTakerAssetFillAmount = orderWithFee.takerAssetAmount;
+ const feeAmount = orderWithFee.takerFee;
+ const wethSpentOnFeeOrders = ForwarderWrapper.getWethForFeeOrders(feeAmount, feeOrders);
+ const ethValue = primaryTakerAssetFillAmount.plus(wethSpentOnFeeOrders);
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newOwner = await erc721Token.ownerOf.callAsync(makerAssetId);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const totalEthSpent = ethValue.plus(gasPrice.times(tx.gasUsed));
+
+ expect(newOwner).to.be.bignumber.equal(takerAddress);
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount).plus(wethSpentOnFeeOrders),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should buy an ERC721 asset and pay ZRX fees from multiple fee orders', async () => {
+ const makerAssetId = erc721MakerAssetIds[0];
+ orderWithFee = await orderFactory.newSignedOrderAsync({
+ makerAssetAmount: new BigNumber(1),
+ makerAssetData: assetDataUtils.encodeERC721AssetData(erc721Token.address, makerAssetId),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), DECIMALS_DEFAULT),
+ });
+ const ordersWithFee = [orderWithFee];
+ const makerAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+ const makerAssetAmount = orderWithFee.takerFee.dividedToIntegerBy(2);
+ const takerAssetAmount = feeOrder.takerAssetAmount
+ .times(makerAssetAmount)
+ .dividedToIntegerBy(feeOrder.makerAssetAmount);
+
+ const firstFeeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData,
+ makerAssetAmount,
+ takerAssetAmount,
+ });
+ const secondFeeOrder = await orderFactory.newSignedOrderAsync({
+ makerAssetData,
+ makerAssetAmount,
+ takerAssetAmount,
+ });
+ const feeOrders = [firstFeeOrder, secondFeeOrder];
+
+ const makerAssetFillAmount = orderWithFee.makerAssetAmount;
+ const primaryTakerAssetFillAmount = orderWithFee.takerAssetAmount;
+ const feeAmount = orderWithFee.takerFee;
+ const wethSpentOnFeeOrders = ForwarderWrapper.getWethForFeeOrders(feeAmount, feeOrders);
+ const ethValue = primaryTakerAssetFillAmount.plus(wethSpentOnFeeOrders);
+
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(ordersWithFee, feeOrders, makerAssetFillAmount, {
+ value: ethValue,
+ from: takerAddress,
+ });
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const newOwner = await erc721Token.ownerOf.callAsync(makerAssetId);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const totalEthSpent = ethValue.plus(gasPrice.times(tx.gasUsed));
+
+ expect(newOwner).to.be.bignumber.equal(takerAddress);
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount).plus(wethSpentOnFeeOrders),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('marketBuyOrdersWithEth with extra fees', () => {
+ it('should buy an asset and send fee to feeRecipient', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount;
+
+ const baseFeePercentage = 2;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(constants.PERCENTAGE_DENOMINATOR, baseFeePercentage);
+ const feeRecipientEthBalanceBefore = await web3Wrapper.getBalanceInWeiAsync(feeRecipientAddress);
+ tx = await forwarderWrapper.marketBuyOrdersWithEthAsync(
+ ordersWithoutFee,
+ feeOrders,
+ makerAssetFillAmount,
+ {
+ value: ethValue,
+ from: takerAddress,
+ },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ );
+ const takerEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(takerAddress);
+ const forwarderEthBalance = await web3Wrapper.getBalanceInWeiAsync(forwarderContract.address);
+ const feeRecipientEthBalanceAfter = await web3Wrapper.getBalanceInWeiAsync(feeRecipientAddress);
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+
+ const primaryTakerAssetFillAmount = orderWithoutFee.takerAssetAmount.dividedToIntegerBy(2);
+ const ethSpentOnFee = ForwarderWrapper.getPercentageOfValue(primaryTakerAssetFillAmount, baseFeePercentage);
+ const totalEthSpent = primaryTakerAssetFillAmount.plus(ethSpentOnFee).plus(gasPrice.times(tx.gasUsed));
+
+ expect(feeRecipientEthBalanceAfter).to.be.bignumber.equal(feeRecipientEthBalanceBefore.plus(ethSpentOnFee));
+ expect(takerEthBalanceAfter).to.be.bignumber.equal(takerEthBalanceBefore.minus(totalEthSpent));
+ expect(newBalances[makerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][defaultMakerAssetAddress].minus(makerAssetFillAmount),
+ );
+ expect(newBalances[takerAddress][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ erc20Balances[takerAddress][defaultMakerAssetAddress].plus(makerAssetFillAmount),
+ );
+ expect(newBalances[makerAddress][weth.address]).to.be.bignumber.equal(
+ erc20Balances[makerAddress][weth.address].plus(primaryTakerAssetFillAmount),
+ );
+ expect(newBalances[forwarderContract.address][weth.address]).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ expect(newBalances[forwarderContract.address][defaultMakerAssetAddress]).to.be.bignumber.equal(
+ constants.ZERO_AMOUNT,
+ );
+ expect(forwarderEthBalance).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('should fail if the fee is set too high', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount;
+
+ const baseFeePercentage = 6;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(constants.PERCENTAGE_DENOMINATOR, baseFeePercentage);
+ await expectTransactionFailedAsync(
+ forwarderWrapper.marketBuyOrdersWithEthAsync(
+ ordersWithoutFee,
+ feeOrders,
+ makerAssetFillAmount,
+ {
+ value: ethValue,
+ from: takerAddress,
+ },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ ),
+ RevertReason.FeePercentageTooLarge,
+ );
+ });
+ it('should fail if there is not enough ETH remaining to pay the fee', async () => {
+ const ordersWithoutFee = [orderWithoutFee];
+ const feeOrders: SignedOrder[] = [];
+ const makerAssetFillAmount = orderWithoutFee.makerAssetAmount.dividedToIntegerBy(2);
+ const ethValue = orderWithoutFee.takerAssetAmount.dividedToIntegerBy(2);
+
+ const baseFeePercentage = 2;
+ feePercentage = ForwarderWrapper.getPercentageOfValue(constants.PERCENTAGE_DENOMINATOR, baseFeePercentage);
+ await expectTransactionFailedAsync(
+ forwarderWrapper.marketBuyOrdersWithEthAsync(
+ ordersWithoutFee,
+ feeOrders,
+ makerAssetFillAmount,
+ {
+ value: ethValue,
+ from: takerAddress,
+ },
+ { feePercentage, feeRecipient: feeRecipientAddress },
+ ),
+ RevertReason.InsufficientEthRemaining,
+ );
+ });
+ });
+ describe('withdrawAsset', () => {
+ it('should allow owner to withdraw ERC20 tokens', async () => {
+ const zrxWithdrawAmount = erc20Balances[forwarderContract.address][zrxToken.address];
+ await forwarderWrapper.withdrawAssetAsync(zrxAssetData, zrxWithdrawAmount, { from: owner });
+ const newBalances = await erc20Wrapper.getBalancesAsync();
+ expect(newBalances[owner][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[owner][zrxToken.address].plus(zrxWithdrawAmount),
+ );
+ expect(newBalances[forwarderContract.address][zrxToken.address]).to.be.bignumber.equal(
+ erc20Balances[forwarderContract.address][zrxToken.address].minus(zrxWithdrawAmount),
+ );
+ });
+ it('should revert if not called by owner', async () => {
+ const zrxWithdrawAmount = erc20Balances[forwarderContract.address][zrxToken.address];
+ await expectTransactionFailedAsync(
+ forwarderWrapper.withdrawAssetAsync(zrxAssetData, zrxWithdrawAmount, { from: makerAddress }),
+ RevertReason.OnlyContractOwner,
+ );
+ });
+ });
+});
+// tslint:disable:max-file-line-count
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/global_hooks.ts b/packages/contracts/test/global_hooks.ts
index 089521d94..cf7c52efd 100644
--- a/packages/contracts/test/global_hooks.ts
+++ b/packages/contracts/test/global_hooks.ts
@@ -1,8 +1,15 @@
-import { coverage, env, EnvVars } from '@0xproject/dev-utils';
+import { env, EnvVars } from '@0xproject/dev-utils';
+
+import { coverage } from './utils/coverage';
+import { profiler } from './utils/profiler';
after('generate coverage report', async () => {
if (env.parseBoolean(EnvVars.SolidityCoverage)) {
const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
await coverageSubprovider.writeCoverageAsync();
}
+ if (env.parseBoolean(EnvVars.SolidityProfiler)) {
+ const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
+ await profilerSubprovider.writeProfilerOutputAsync();
+ }
});
diff --git a/packages/contracts/test/libraries/lib_bytes.ts b/packages/contracts/test/libraries/lib_bytes.ts
new file mode 100644
index 000000000..1c497a226
--- /dev/null
+++ b/packages/contracts/test/libraries/lib_bytes.ts
@@ -0,0 +1,834 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import BN = require('bn.js');
+import * as chai from 'chai';
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+
+import { TestLibBytesContract } from '../../generated_contract_wrappers/test_lib_bytes';
+import { artifacts } from '../utils/artifacts';
+import { expectContractCallFailed } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { typeEncodingUtils } from '../utils/type_encoding_utils';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+// BUG: Ideally we would use Buffer.from(memory).toString('hex')
+// https://github.com/Microsoft/TypeScript/issues/23155
+const toHex = (buf: Uint8Array): string => buf.reduce((a, v) => a + ('00' + v.toString(16)).slice(-2), '0x');
+
+const fromHex = (str: string): Uint8Array => Uint8Array.from(Buffer.from(str.slice(2), 'hex'));
+
+describe('LibBytes', () => {
+ let libBytes: TestLibBytesContract;
+ const byteArrayShorterThan32Bytes = '0x012345';
+ const byteArrayShorterThan20Bytes = byteArrayShorterThan32Bytes;
+ const byteArrayLongerThan32Bytes =
+ '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
+ const byteArrayLongerThan32BytesFirstBytesSwapped =
+ '0x2301456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
+ const byteArrayLongerThan32BytesLastBytesSwapped =
+ '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abefcd';
+ let testAddress: string;
+ let testAddressB: string;
+ const testBytes32 = '0x102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f01020';
+ const testBytes32B = '0x534877abd8443578526845cdfef020047528759477fedef87346527659aced32';
+ const testUint256 = new BigNumber(testBytes32, 16);
+ const testUint256B = new BigNumber(testBytes32B, 16);
+ let shortData: string;
+ let shortTestBytes: string;
+ let shortTestBytesAsBuffer: Buffer;
+ let wordOfData: string;
+ let wordOfTestBytes: string;
+ let wordOfTestBytesAsBuffer: Buffer;
+ let longData: string;
+ let longTestBytes: string;
+ let longTestBytesAsBuffer: Buffer;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ // Setup accounts & addresses
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ testAddress = accounts[1];
+ testAddressB = accounts[2];
+ // Deploy LibBytes
+ libBytes = await TestLibBytesContract.deployFrom0xArtifactAsync(artifacts.TestLibBytes, provider, txDefaults);
+ // Verify lengths of test data
+ const byteArrayShorterThan32BytesLength = ethUtil.toBuffer(byteArrayShorterThan32Bytes).byteLength;
+ expect(byteArrayShorterThan32BytesLength).to.be.lessThan(32);
+ const byteArrayLongerThan32BytesLength = ethUtil.toBuffer(byteArrayLongerThan32Bytes).byteLength;
+ expect(byteArrayLongerThan32BytesLength).to.be.greaterThan(32);
+ const testBytes32Length = ethUtil.toBuffer(testBytes32).byteLength;
+ expect(testBytes32Length).to.be.equal(32);
+ // Create short test bytes
+ shortData = '0xffffaa';
+ const encodedShortData = ethUtil.toBuffer(shortData);
+ const shortDataLength = new BigNumber(encodedShortData.byteLength);
+ const encodedShortDataLength = typeEncodingUtils.encodeUint256(shortDataLength);
+ shortTestBytesAsBuffer = Buffer.concat([encodedShortDataLength, encodedShortData]);
+ shortTestBytes = ethUtil.bufferToHex(shortTestBytesAsBuffer);
+ // Create test bytes one word in length
+ wordOfData = ethUtil.bufferToHex(typeEncodingUtils.encodeUint256(generatePseudoRandomSalt()));
+ const encodedWordOfData = ethUtil.toBuffer(wordOfData);
+ const wordOfDataLength = new BigNumber(encodedWordOfData.byteLength);
+ const encodedWordOfDataLength = typeEncodingUtils.encodeUint256(wordOfDataLength);
+ wordOfTestBytesAsBuffer = Buffer.concat([encodedWordOfDataLength, encodedWordOfData]);
+ wordOfTestBytes = ethUtil.bufferToHex(wordOfTestBytesAsBuffer);
+ // Create long test bytes (combines short test bytes with word of test bytes)
+ longData = ethUtil.bufferToHex(Buffer.concat([encodedShortData, encodedWordOfData]));
+ const longDataLength = new BigNumber(encodedShortData.byteLength + encodedWordOfData.byteLength);
+ const encodedLongDataLength = typeEncodingUtils.encodeUint256(longDataLength);
+ longTestBytesAsBuffer = Buffer.concat([encodedLongDataLength, encodedShortData, encodedWordOfData]);
+ longTestBytes = ethUtil.bufferToHex(longTestBytesAsBuffer);
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('popLastByte', () => {
+ it('should revert if length is 0', async () => {
+ return expectContractCallFailed(
+ libBytes.publicPopLastByte.callAsync(constants.NULL_BYTES),
+ RevertReason.LibBytesGreaterThanZeroLengthRequired,
+ );
+ });
+ it('should pop the last byte from the input and return it', async () => {
+ const [newBytes, poppedByte] = await libBytes.publicPopLastByte.callAsync(byteArrayLongerThan32Bytes);
+ const expectedNewBytes = byteArrayLongerThan32Bytes.slice(0, -2);
+ const expectedPoppedByte = `0x${byteArrayLongerThan32Bytes.slice(-2)}`;
+ expect(newBytes).to.equal(expectedNewBytes);
+ expect(poppedByte).to.equal(expectedPoppedByte);
+ });
+ });
+
+ describe('popLast20Bytes', () => {
+ it('should revert if length is less than 20', async () => {
+ return expectContractCallFailed(
+ libBytes.publicPopLast20Bytes.callAsync(byteArrayShorterThan20Bytes),
+ RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
+ );
+ });
+ it('should pop the last 20 bytes from the input and return it', async () => {
+ const [newBytes, poppedAddress] = await libBytes.publicPopLast20Bytes.callAsync(byteArrayLongerThan32Bytes);
+ const expectedNewBytes = byteArrayLongerThan32Bytes.slice(0, -40);
+ const expectedPoppedAddress = `0x${byteArrayLongerThan32Bytes.slice(-40)}`;
+ expect(newBytes).to.equal(expectedNewBytes);
+ expect(poppedAddress).to.equal(expectedPoppedAddress);
+ });
+ });
+
+ describe('equals', () => {
+ it('should return true if byte arrays are equal (both arrays < 32 bytes)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayShorterThan32Bytes,
+ byteArrayShorterThan32Bytes,
+ );
+ return expect(isEqual).to.be.true();
+ });
+ it('should return true if byte arrays are equal (both arrays > 32 bytes)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayLongerThan32Bytes,
+ byteArrayLongerThan32Bytes,
+ );
+ return expect(isEqual).to.be.true();
+ });
+ it('should return false if byte arrays are not equal (first array < 32 bytes, second array > 32 bytes)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayShorterThan32Bytes,
+ byteArrayLongerThan32Bytes,
+ );
+ return expect(isEqual).to.be.false();
+ });
+ it('should return false if byte arrays are not equal (first array > 32 bytes, second array < 32 bytes)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayLongerThan32Bytes,
+ byteArrayShorterThan32Bytes,
+ );
+ return expect(isEqual).to.be.false();
+ });
+ it('should return false if byte arrays are not equal (same length, but a byte in first word differs)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayLongerThan32BytesFirstBytesSwapped,
+ byteArrayLongerThan32Bytes,
+ );
+ return expect(isEqual).to.be.false();
+ });
+ it('should return false if byte arrays are not equal (same length, but a byte in last word differs)', async () => {
+ const isEqual = await libBytes.publicEquals.callAsync(
+ byteArrayLongerThan32BytesLastBytesSwapped,
+ byteArrayLongerThan32Bytes,
+ );
+ return expect(isEqual).to.be.false();
+ });
+
+ describe('should ignore trailing data', () => {
+ it('should return true when both < 32 bytes', async () => {
+ const isEqual = await libBytes.publicEqualsPop1.callAsync('0x0102', '0x0103');
+ return expect(isEqual).to.be.true();
+ });
+ });
+ });
+
+ describe('deepCopyBytes', () => {
+ it('should revert if dest is shorter than source', async () => {
+ return expectContractCallFailed(
+ libBytes.publicDeepCopyBytes.callAsync(byteArrayShorterThan32Bytes, byteArrayLongerThan32Bytes),
+ RevertReason.LibBytesGreaterOrEqualToSourceBytesLengthRequired,
+ );
+ });
+ it('should overwrite dest with source if source and dest have equal length', async () => {
+ const zeroedByteArrayLongerThan32Bytes = `0x${_.repeat('0', byteArrayLongerThan32Bytes.length - 2)}`;
+ const zeroedBytesAfterCopy = await libBytes.publicDeepCopyBytes.callAsync(
+ zeroedByteArrayLongerThan32Bytes,
+ byteArrayLongerThan32Bytes,
+ );
+ return expect(zeroedBytesAfterCopy).to.be.equal(byteArrayLongerThan32Bytes);
+ });
+ it('should overwrite the leftmost len(source) bytes of dest if dest is larger than source', async () => {
+ const zeroedByteArrayLongerThan32Bytes = `0x${_.repeat('0', byteArrayLongerThan32Bytes.length * 2)}`;
+ const zeroedBytesAfterCopy = await libBytes.publicDeepCopyBytes.callAsync(
+ zeroedByteArrayLongerThan32Bytes,
+ byteArrayLongerThan32Bytes,
+ );
+ const copiedBytes = zeroedBytesAfterCopy.slice(0, byteArrayLongerThan32Bytes.length);
+ return expect(copiedBytes).to.be.equal(byteArrayLongerThan32Bytes);
+ });
+ it('should not overwrite the rightmost bytes of dest if dest is larger than source', async () => {
+ const zeroedByteArrayLongerThan32Bytes = `0x${_.repeat('0', byteArrayLongerThan32Bytes.length * 2)}`;
+ const zeroedBytesAfterCopy = await libBytes.publicDeepCopyBytes.callAsync(
+ zeroedByteArrayLongerThan32Bytes,
+ byteArrayLongerThan32Bytes,
+ );
+ const expectedNotCopiedBytes = zeroedByteArrayLongerThan32Bytes.slice(byteArrayLongerThan32Bytes.length);
+ const notCopiedBytes = zeroedBytesAfterCopy.slice(byteArrayLongerThan32Bytes.length);
+ return expect(notCopiedBytes).to.be.equal(expectedNotCopiedBytes);
+ });
+ });
+
+ describe('readAddress', () => {
+ it('should successfully read address when the address takes up the whole array', async () => {
+ const byteArray = ethUtil.addHexPrefix(testAddress);
+ const testAddressOffset = new BigNumber(0);
+ const address = await libBytes.publicReadAddress.callAsync(byteArray, testAddressOffset);
+ return expect(address).to.be.equal(testAddress);
+ });
+ it('should successfully read address when it is offset in the array', async () => {
+ const addressByteArrayBuffer = ethUtil.toBuffer(testAddress);
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, addressByteArrayBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testAddressOffset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const address = await libBytes.publicReadAddress.callAsync(combinedByteArray, testAddressOffset);
+ return expect(address).to.be.equal(testAddress);
+ });
+ it('should fail if the byte array is too short to hold an address', async () => {
+ const shortByteArray = '0xabcdef';
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicReadAddress.callAsync(shortByteArray, offset),
+ RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => {
+ const byteArray = testAddress;
+ const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicReadAddress.callAsync(byteArray, badOffset),
+ RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
+ );
+ });
+ });
+
+ describe('writeAddress', () => {
+ it('should successfully write address when the address takes up the whole array', async () => {
+ const byteArray = testAddress;
+ const testAddressOffset = new BigNumber(0);
+ const newByteArray = await libBytes.publicWriteAddress.callAsync(
+ byteArray,
+ testAddressOffset,
+ testAddressB,
+ );
+ return expect(newByteArray).to.be.equal(testAddressB);
+ });
+ it('should successfully write address when it is offset in the array', async () => {
+ const addressByteArrayBuffer = ethUtil.toBuffer(testAddress);
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, addressByteArrayBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testAddressOffset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const newByteArray = await libBytes.publicWriteAddress.callAsync(
+ combinedByteArray,
+ testAddressOffset,
+ testAddressB,
+ );
+ const newByteArrayBuffer = ethUtil.toBuffer(newByteArray);
+ const addressFromOffsetBuffer = newByteArrayBuffer.slice(prefixByteArrayBuffer.byteLength);
+ const addressFromOffset = ethUtil.addHexPrefix(ethUtil.bufferToHex(addressFromOffsetBuffer));
+ return expect(addressFromOffset).to.be.equal(testAddressB);
+ });
+ it('should fail if the byte array is too short to hold an address', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicWriteAddress.callAsync(byteArrayShorterThan20Bytes, offset, testAddress),
+ RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold an address', async () => {
+ const byteArray = byteArrayLongerThan32Bytes;
+ const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicWriteAddress.callAsync(byteArray, badOffset, testAddress),
+ RevertReason.LibBytesGreaterOrEqualTo20LengthRequired,
+ );
+ });
+ });
+
+ describe('readBytes32', () => {
+ it('should successfully read bytes32 when the bytes32 takes up the whole array', async () => {
+ const testBytes32Offset = new BigNumber(0);
+ const bytes32 = await libBytes.publicReadBytes32.callAsync(testBytes32, testBytes32Offset);
+ return expect(bytes32).to.be.equal(testBytes32);
+ });
+ it('should successfully read bytes32 when it is offset in the array)', async () => {
+ const bytes32ByteArrayBuffer = ethUtil.toBuffer(testBytes32);
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, bytes32ByteArrayBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testBytes32Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const bytes32 = await libBytes.publicReadBytes32.callAsync(combinedByteArray, testBytes32Offset);
+ return expect(bytes32).to.be.equal(testBytes32);
+ });
+ it('should fail if the byte array is too short to hold a bytes32', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicReadBytes32.callAsync(byteArrayShorterThan32Bytes, offset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => {
+ const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicReadBytes32.callAsync(testBytes32, badOffset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ });
+
+ describe('writeBytes32', () => {
+ it('should successfully write bytes32 when the address takes up the whole array', async () => {
+ const byteArray = testBytes32;
+ const testBytes32Offset = new BigNumber(0);
+ const newByteArray = await libBytes.publicWriteBytes32.callAsync(
+ byteArray,
+ testBytes32Offset,
+ testBytes32B,
+ );
+ return expect(newByteArray).to.be.equal(testBytes32B);
+ });
+ it('should successfully write bytes32 when it is offset in the array', async () => {
+ const bytes32ByteArrayBuffer = ethUtil.toBuffer(testBytes32);
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, bytes32ByteArrayBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testBytes32Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const newByteArray = await libBytes.publicWriteBytes32.callAsync(
+ combinedByteArray,
+ testBytes32Offset,
+ testBytes32B,
+ );
+ const newByteArrayBuffer = ethUtil.toBuffer(newByteArray);
+ const bytes32FromOffsetBuffer = newByteArrayBuffer.slice(prefixByteArrayBuffer.byteLength);
+ const bytes32FromOffset = ethUtil.addHexPrefix(ethUtil.bufferToHex(bytes32FromOffsetBuffer));
+ return expect(bytes32FromOffset).to.be.equal(testBytes32B);
+ });
+ it('should fail if the byte array is too short to hold a bytes32', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicWriteBytes32.callAsync(byteArrayShorterThan32Bytes, offset, testBytes32),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold a bytes32', async () => {
+ const byteArray = byteArrayLongerThan32Bytes;
+ const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicWriteBytes32.callAsync(byteArray, badOffset, testBytes32),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ });
+
+ describe('readUint256', () => {
+ it('should successfully read uint256 when the uint256 takes up the whole array', async () => {
+ const formattedTestUint256 = new BN(testUint256.toString(10));
+ const testUint256AsBuffer = ethUtil.toBuffer(formattedTestUint256);
+ const byteArray = ethUtil.bufferToHex(testUint256AsBuffer);
+ const testUint256Offset = new BigNumber(0);
+ const uint256 = await libBytes.publicReadUint256.callAsync(byteArray, testUint256Offset);
+ return expect(uint256).to.bignumber.equal(testUint256);
+ });
+ it('should successfully read uint256 when it is offset in the array', async () => {
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const formattedTestUint256 = new BN(testUint256.toString(10));
+ const testUint256AsBuffer = ethUtil.toBuffer(formattedTestUint256);
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, testUint256AsBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testUint256Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const uint256 = await libBytes.publicReadUint256.callAsync(combinedByteArray, testUint256Offset);
+ return expect(uint256).to.bignumber.equal(testUint256);
+ });
+ it('should fail if the byte array is too short to hold a uint256', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicReadUint256.callAsync(byteArrayShorterThan32Bytes, offset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold a uint256', async () => {
+ const formattedTestUint256 = new BN(testUint256.toString(10));
+ const testUint256AsBuffer = ethUtil.toBuffer(formattedTestUint256);
+ const byteArray = ethUtil.bufferToHex(testUint256AsBuffer);
+ const badOffset = new BigNumber(testUint256AsBuffer.byteLength);
+ return expectContractCallFailed(
+ libBytes.publicReadUint256.callAsync(byteArray, badOffset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ });
+
+ describe('writeUint256', () => {
+ it('should successfully write uint256 when the address takes up the whole array', async () => {
+ const byteArray = testBytes32;
+ const testUint256Offset = new BigNumber(0);
+ const newByteArray = await libBytes.publicWriteUint256.callAsync(
+ byteArray,
+ testUint256Offset,
+ testUint256B,
+ );
+ const newByteArrayAsUint256 = new BigNumber(newByteArray, 16);
+ return expect(newByteArrayAsUint256).to.be.bignumber.equal(testUint256B);
+ });
+ it('should successfully write uint256 when it is offset in the array', async () => {
+ const bytes32ByteArrayBuffer = ethUtil.toBuffer(testBytes32);
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, bytes32ByteArrayBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testUint256Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const newByteArray = await libBytes.publicWriteUint256.callAsync(
+ combinedByteArray,
+ testUint256Offset,
+ testUint256B,
+ );
+ const newByteArrayBuffer = ethUtil.toBuffer(newByteArray);
+ const uint256FromOffsetBuffer = newByteArrayBuffer.slice(prefixByteArrayBuffer.byteLength);
+ const uint256FromOffset = new BigNumber(
+ ethUtil.addHexPrefix(ethUtil.bufferToHex(uint256FromOffsetBuffer)),
+ 16,
+ );
+ return expect(uint256FromOffset).to.be.bignumber.equal(testUint256B);
+ });
+ it('should fail if the byte array is too short to hold a uint256', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicWriteUint256.callAsync(byteArrayShorterThan32Bytes, offset, testUint256),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold a uint256', async () => {
+ const byteArray = byteArrayLongerThan32Bytes;
+ const badOffset = new BigNumber(ethUtil.toBuffer(byteArray).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicWriteUint256.callAsync(byteArray, badOffset, testUint256),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ });
+
+ describe('readBytes4', () => {
+ // AssertionError: expected promise to be rejected with an error including 'revert' but it was fulfilled with '0x08c379a0'
+ it('should revert if byte array has a length < 4', async () => {
+ const byteArrayLessThan4Bytes = '0x010101';
+ return expectContractCallFailed(
+ libBytes.publicReadBytes4.callAsync(byteArrayLessThan4Bytes, new BigNumber(0)),
+ RevertReason.LibBytesGreaterOrEqualTo4LengthRequired,
+ );
+ });
+ it('should return the first 4 bytes of a byte array of arbitrary length', async () => {
+ const first4Bytes = await libBytes.publicReadBytes4.callAsync(byteArrayLongerThan32Bytes, new BigNumber(0));
+ const expectedFirst4Bytes = byteArrayLongerThan32Bytes.slice(0, 10);
+ expect(first4Bytes).to.equal(expectedFirst4Bytes);
+ });
+ });
+
+ describe('readBytesWithLength', () => {
+ it('should successfully read short, nested array of bytes when it takes up the whole array', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(shortTestBytes, testBytesOffset);
+ return expect(bytes).to.be.equal(shortData);
+ });
+ it('should successfully read short, nested array of bytes when it is offset in the array', async () => {
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, shortTestBytesAsBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testUint256Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(combinedByteArray, testUint256Offset);
+ return expect(bytes).to.be.equal(shortData);
+ });
+ it('should successfully read a nested array of bytes - one word in length - when it takes up the whole array', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(wordOfTestBytes, testBytesOffset);
+ return expect(bytes).to.be.equal(wordOfData);
+ });
+ it('should successfully read a nested array of bytes - one word in length - when it is offset in the array', async () => {
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, wordOfTestBytesAsBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testUint256Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(combinedByteArray, testUint256Offset);
+ return expect(bytes).to.be.equal(wordOfData);
+ });
+ it('should successfully read long, nested array of bytes when it takes up the whole array', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(longTestBytes, testBytesOffset);
+ return expect(bytes).to.be.equal(longData);
+ });
+ it('should successfully read long, nested array of bytes when it is offset in the array', async () => {
+ const prefixByteArrayBuffer = ethUtil.toBuffer('0xabcdef');
+ const combinedByteArrayBuffer = Buffer.concat([prefixByteArrayBuffer, longTestBytesAsBuffer]);
+ const combinedByteArray = ethUtil.bufferToHex(combinedByteArrayBuffer);
+ const testUint256Offset = new BigNumber(prefixByteArrayBuffer.byteLength);
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(combinedByteArray, testUint256Offset);
+ return expect(bytes).to.be.equal(longData);
+ });
+ it('should fail if the byte array is too short to hold the length of a nested byte array', async () => {
+ // The length of the nested array is 32 bytes. By storing less than 32 bytes, a length cannot be read.
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, offset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if we store a nested byte array length, without a nested byte array', async () => {
+ const offset = new BigNumber(0);
+ return expectContractCallFailed(
+ libBytes.publicReadBytesWithLength.callAsync(testBytes32, offset),
+ RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array', async () => {
+ const badOffset = new BigNumber(ethUtil.toBuffer(byteArrayShorterThan32Bytes).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicReadBytesWithLength.callAsync(byteArrayShorterThan32Bytes, badOffset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold the nested byte array', async () => {
+ const badOffset = new BigNumber(ethUtil.toBuffer(testBytes32).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicReadBytesWithLength.callAsync(testBytes32, badOffset),
+ RevertReason.LibBytesGreaterOrEqualTo32LengthRequired,
+ );
+ });
+ });
+
+ describe('writeBytesWithLength', () => {
+ it('should successfully write short, nested array of bytes when it takes up the whole array)', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(new Buffer(shortTestBytesAsBuffer.byteLength));
+ const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ testBytesOffset,
+ shortData,
+ );
+ const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytesRead).to.be.equal(shortData);
+ });
+ it('should successfully write short, nested array of bytes when it is offset in the array', async () => {
+ // Write a prefix to the array
+ const prefixData = '0xabcdef';
+ const prefixDataAsBuffer = ethUtil.toBuffer(prefixData);
+ const prefixOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(
+ new Buffer(prefixDataAsBuffer.byteLength + shortTestBytesAsBuffer.byteLength),
+ );
+ let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ prefixOffset,
+ prefixData,
+ );
+ // Write data after prefix
+ const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
+ bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ bytesWritten,
+ testBytesOffset,
+ shortData,
+ );
+ // Read data after prefix and validate
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytes).to.be.equal(shortData);
+ });
+ it('should successfully write a nested array of bytes - one word in length - when it takes up the whole array', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(new Buffer(wordOfTestBytesAsBuffer.byteLength));
+ const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ testBytesOffset,
+ wordOfData,
+ );
+ const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytesRead).to.be.equal(wordOfData);
+ });
+ it('should successfully write a nested array of bytes - one word in length - when it is offset in the array', async () => {
+ // Write a prefix to the array
+ const prefixData = '0xabcdef';
+ const prefixDataAsBuffer = ethUtil.toBuffer(prefixData);
+ const prefixOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(
+ new Buffer(prefixDataAsBuffer.byteLength + wordOfTestBytesAsBuffer.byteLength),
+ );
+ let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ prefixOffset,
+ prefixData,
+ );
+ // Write data after prefix
+ const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
+ bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ bytesWritten,
+ testBytesOffset,
+ wordOfData,
+ );
+ // Read data after prefix and validate
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytes).to.be.equal(wordOfData);
+ });
+ it('should successfully write a long, nested bytes when it takes up the whole array', async () => {
+ const testBytesOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(new Buffer(longTestBytesAsBuffer.byteLength));
+ const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ testBytesOffset,
+ longData,
+ );
+ const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytesRead).to.be.equal(longData);
+ });
+ it('should successfully write long, nested array of bytes when it is offset in the array', async () => {
+ // Write a prefix to the array
+ const prefixData = '0xabcdef';
+ const prefixDataAsBuffer = ethUtil.toBuffer(prefixData);
+ const prefixOffset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(
+ new Buffer(prefixDataAsBuffer.byteLength + longTestBytesAsBuffer.byteLength),
+ );
+ let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
+ emptyByteArray,
+ prefixOffset,
+ prefixData,
+ );
+ // Write data after prefix
+ const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
+ bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(bytesWritten, testBytesOffset, longData);
+ // Read data after prefix and validate
+ const bytes = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
+ return expect(bytes).to.be.equal(longData);
+ });
+ it('should fail if the byte array is too short to hold the length of a nested byte array', async () => {
+ const offset = new BigNumber(0);
+ const emptyByteArray = ethUtil.bufferToHex(new Buffer(1));
+ return expectContractCallFailed(
+ libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, offset, longData),
+ RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
+ );
+ });
+ it('should fail if the length between the offset and end of the byte array is too short to hold the length of a nested byte array)', async () => {
+ const emptyByteArray = ethUtil.bufferToHex(new Buffer(shortTestBytesAsBuffer.byteLength));
+ const badOffset = new BigNumber(ethUtil.toBuffer(shortTestBytesAsBuffer).byteLength);
+ return expectContractCallFailed(
+ libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, badOffset, shortData),
+ RevertReason.LibBytesGreaterOrEqualToNestedBytesLengthRequired,
+ );
+ });
+ });
+
+ describe('memCopy', () => {
+ // Create memory 0x000102...FF
+ const memSize = 256;
+ // tslint:disable:no-shadowed-variable
+ const memory = new Uint8Array(memSize).map((_, i) => i);
+ const memHex = toHex(memory);
+
+ // Reference implementation to test against
+ const refMemcpy = (mem: Uint8Array, dest: number, source: number, length: number): Uint8Array =>
+ Uint8Array.from(mem).copyWithin(dest, source, source + length);
+
+ // Test vectors: destination, source, length, job description
+ type Tests = Array<[number, number, number, string]>;
+
+ const test = (tests: Tests) =>
+ tests.forEach(([dest, source, length, job]) =>
+ it(job, async () => {
+ const expected = refMemcpy(memory, dest, source, length);
+ const resultStr = await libBytes.testMemcpy.callAsync(
+ memHex,
+ new BigNumber(dest),
+ new BigNumber(source),
+ new BigNumber(length),
+ );
+ const result = fromHex(resultStr);
+ expect(result).to.deep.equal(expected);
+ }),
+ );
+
+ test([[0, 0, 0, 'copies zero bytes with overlap']]);
+
+ describe('copies forward', () =>
+ test([
+ [128, 0, 0, 'zero bytes'],
+ [128, 0, 1, 'one byte'],
+ [128, 0, 11, 'eleven bytes'],
+ [128, 0, 31, 'thirty-one bytes'],
+ [128, 0, 32, 'one word'],
+ [128, 0, 64, 'two words'],
+ [128, 0, 96, 'three words'],
+ [128, 0, 33, 'one word and one byte'],
+ [128, 0, 72, 'two words and eight bytes'],
+ [128, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward within one word', () =>
+ test([
+ [16, 0, 0, 'zero bytes'],
+ [16, 0, 1, 'one byte'],
+ [16, 0, 11, 'eleven bytes'],
+ [16, 0, 16, 'sixteen bytes'],
+ ]));
+
+ describe('copies forward with one byte overlap', () =>
+ test([
+ [0, 0, 1, 'one byte'],
+ [10, 0, 11, 'eleven bytes'],
+ [30, 0, 31, 'thirty-one bytes'],
+ [31, 0, 32, 'one word'],
+ [32, 0, 33, 'one word and one byte'],
+ [71, 0, 72, 'two words and eight bytes'],
+ [99, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward with thirty-one bytes overlap', () =>
+ test([
+ [0, 0, 31, 'thirty-one bytes'],
+ [1, 0, 32, 'one word'],
+ [2, 0, 33, 'one word and one byte'],
+ [41, 0, 72, 'two words and eight bytes'],
+ [69, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward with one word overlap', () =>
+ test([
+ [0, 0, 32, 'one word'],
+ [1, 0, 33, 'one word and one byte'],
+ [41, 0, 72, 'two words and eight bytes'],
+ [69, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward with one word and one byte overlap', () =>
+ test([
+ [0, 0, 33, 'one word and one byte'],
+ [40, 0, 72, 'two words and eight bytes'],
+ [68, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward with two words overlap', () =>
+ test([
+ [0, 0, 64, 'two words'],
+ [8, 0, 72, 'two words and eight bytes'],
+ [36, 0, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward within one word and one byte overlap', () =>
+ test([[0, 0, 1, 'one byte'], [10, 0, 11, 'eleven bytes'], [15, 0, 16, 'sixteen bytes']]));
+
+ describe('copies backward', () =>
+ test([
+ [0, 128, 0, 'zero bytes'],
+ [0, 128, 1, 'one byte'],
+ [0, 128, 11, 'eleven bytes'],
+ [0, 128, 31, 'thirty-one bytes'],
+ [0, 128, 32, 'one word'],
+ [0, 128, 64, 'two words'],
+ [0, 128, 96, 'three words'],
+ [0, 128, 33, 'one word and one byte'],
+ [0, 128, 72, 'two words and eight bytes'],
+ [0, 128, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies backward within one word', () =>
+ test([
+ [0, 16, 0, 'zero bytes'],
+ [0, 16, 1, 'one byte'],
+ [0, 16, 11, 'eleven bytes'],
+ [0, 16, 16, 'sixteen bytes'],
+ ]));
+
+ describe('copies backward with one byte overlap', () =>
+ test([
+ [0, 0, 1, 'one byte'],
+ [0, 10, 11, 'eleven bytes'],
+ [0, 30, 31, 'thirty-one bytes'],
+ [0, 31, 32, 'one word'],
+ [0, 32, 33, 'one word and one byte'],
+ [0, 71, 72, 'two words and eight bytes'],
+ [0, 99, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies backward with thirty-one bytes overlap', () =>
+ test([
+ [0, 0, 31, 'thirty-one bytes'],
+ [0, 1, 32, 'one word'],
+ [0, 2, 33, 'one word and one byte'],
+ [0, 41, 72, 'two words and eight bytes'],
+ [0, 69, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies backward with one word overlap', () =>
+ test([
+ [0, 0, 32, 'one word'],
+ [0, 1, 33, 'one word and one byte'],
+ [0, 41, 72, 'two words and eight bytes'],
+ [0, 69, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies backward with one word and one byte overlap', () =>
+ test([
+ [0, 0, 33, 'one word and one byte'],
+ [0, 40, 72, 'two words and eight bytes'],
+ [0, 68, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies backward with two words overlap', () =>
+ test([
+ [0, 0, 64, 'two words'],
+ [0, 8, 72, 'two words and eight bytes'],
+ [0, 36, 100, 'three words and four bytes'],
+ ]));
+
+ describe('copies forward within one word and one byte overlap', () =>
+ test([[0, 0, 1, 'one byte'], [0, 10, 11, 'eleven bytes'], [0, 15, 16, 'sixteen bytes']]));
+ });
+});
+// tslint:disable:max-file-line-count
diff --git a/packages/contracts/test/multi_sig_with_time_lock.ts b/packages/contracts/test/multi_sig_with_time_lock.ts
deleted file mode 100644
index d35efe9da..000000000
--- a/packages/contracts/test/multi_sig_with_time_lock.ts
+++ /dev/null
@@ -1,196 +0,0 @@
-import { LogWithDecodedArgs, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, web3Factory } from '@0xproject/dev-utils';
-import { AbiDecoder, BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import * as multiSigWalletJSON from '../../build/contracts/MultiSigWalletWithTimeLock.json';
-import { MultiSigWalletContract } from '../src/contract_wrappers/generated/multi_sig_wallet';
-import { MultiSigWalletWithTimeLockContract } from '../src/contract_wrappers/generated/multi_sig_wallet_with_time_lock';
-import { artifacts } from '../util/artifacts';
-import { constants } from '../util/constants';
-import { MultiSigWrapper } from '../util/multi_sig_wrapper';
-import { ContractName, SubmissionContractEventArgs } from '../util/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-const MULTI_SIG_ABI = artifacts.MultiSigWalletWithTimeLockArtifact.networks[constants.TESTRPC_NETWORK_ID].abi;
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
-const abiDecoder = new AbiDecoder([MULTI_SIG_ABI]);
-
-describe('MultiSigWalletWithTimeLock', () => {
- let owners: string[];
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- owners = [accounts[0], accounts[1]];
- });
- const SIGNATURES_REQUIRED = new BigNumber(2);
- const SECONDS_TIME_LOCKED = new BigNumber(10000);
-
- let multiSig: MultiSigWalletWithTimeLockContract;
- let multiSigWrapper: MultiSigWrapper;
- let txId: BigNumber;
- let initialSecondsTimeLocked: number;
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
-
- describe('changeTimeLock', () => {
- describe('initially non-time-locked', async () => {
- before('deploy a walet', async () => {
- const multiSigInstance = await deployer.deployAsync(ContractName.MultiSigWalletWithTimeLock, [
- owners,
- SIGNATURES_REQUIRED,
- 0,
- ]);
- multiSig = new MultiSigWalletWithTimeLockContract(
- web3Wrapper,
- multiSigInstance.abi,
- multiSigInstance.address,
- );
- multiSigWrapper = new MultiSigWrapper((multiSig as any) as MultiSigWalletContract);
-
- const secondsTimeLocked = await multiSig.secondsTimeLocked.callAsync();
- initialSecondsTimeLocked = secondsTimeLocked.toNumber();
- });
- it('should throw when not called by wallet', async () => {
- return expect(
- multiSig.changeTimeLock.sendTransactionAsync(SECONDS_TIME_LOCKED, { from: owners[0] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw without enough confirmations', async () => {
- const destination = multiSig.address;
- const from = owners[0];
- const dataParams = {
- name: 'changeTimeLock',
- abi: MULTI_SIG_ABI,
- args: [SECONDS_TIME_LOCKED.toNumber()],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(destination, from, dataParams);
- const subRes = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(subRes.logs[0]) as LogWithDecodedArgs<
- SubmissionContractEventArgs
- >;
-
- txId = log.args.transactionId;
- return expect(
- multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should set confirmation time with enough confirmations', async () => {
- const destination = multiSig.address;
- const from = owners[0];
- const dataParams = {
- name: 'changeTimeLock',
- abi: MULTI_SIG_ABI,
- args: [SECONDS_TIME_LOCKED.toNumber()],
- };
- let txHash = await multiSigWrapper.submitTransactionAsync(destination, from, dataParams);
- const subRes = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(subRes.logs[0]) as LogWithDecodedArgs<
- SubmissionContractEventArgs
- >;
-
- txId = log.args.transactionId;
- txHash = await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(res.logs).to.have.length(2);
-
- const blockNum = await web3Wrapper.getBlockNumberAsync();
- const blockInfo = await web3Wrapper.getBlockAsync(blockNum);
- const timestamp = new BigNumber(blockInfo.timestamp);
- const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.callAsync(txId));
-
- expect(timestamp).to.be.bignumber.equal(confirmationTimeBigNum);
- });
-
- it('should be executable with enough confirmations and secondsTimeLocked of 0', async () => {
- const destination = multiSig.address;
- const from = owners[0];
- const dataParams = {
- name: 'changeTimeLock',
- abi: MULTI_SIG_ABI,
- args: [SECONDS_TIME_LOCKED.toNumber()],
- };
- let txHash = await multiSigWrapper.submitTransactionAsync(destination, from, dataParams);
- const subRes = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(subRes.logs[0]) as LogWithDecodedArgs<
- SubmissionContractEventArgs
- >;
-
- txId = log.args.transactionId;
- txHash = await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
-
- expect(initialSecondsTimeLocked).to.be.equal(0);
-
- txHash = await multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] });
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(res.logs).to.have.length(2);
-
- const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
- expect(secondsTimeLocked).to.be.bignumber.equal(SECONDS_TIME_LOCKED);
- });
- });
- describe('initially time-locked', async () => {
- before('deploy a walet', async () => {
- const multiSigInstance = await deployer.deployAsync(ContractName.MultiSigWalletWithTimeLock, [
- owners,
- SIGNATURES_REQUIRED,
- SECONDS_TIME_LOCKED,
- ]);
- multiSig = new MultiSigWalletWithTimeLockContract(
- web3Wrapper,
- multiSigInstance.abi,
- multiSigInstance.address,
- );
- multiSigWrapper = new MultiSigWrapper((multiSig as any) as MultiSigWalletContract);
-
- const secondsTimeLocked = await multiSig.secondsTimeLocked.callAsync();
- initialSecondsTimeLocked = secondsTimeLocked.toNumber();
- const destination = multiSig.address;
- const from = owners[0];
- const dataParams = {
- name: 'changeTimeLock',
- abi: MULTI_SIG_ABI,
- args: [newSecondsTimeLocked],
- };
- let txHash = await multiSigWrapper.submitTransactionAsync(destination, from, dataParams);
- const subRes = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(subRes.logs[0]) as LogWithDecodedArgs<
- SubmissionContractEventArgs
- >;
- txId = log.args.transactionId;
- txHash = await multiSig.confirmTransaction.sendTransactionAsync(txId, {
- from: owners[1],
- });
- const confRes = await zeroEx.awaitTransactionMinedAsync(txHash);
- expect(confRes.logs).to.have.length(2);
- });
- const newSecondsTimeLocked = 0;
- it('should throw if it has enough confirmations but is not past the time lock', async () => {
- return expect(
- multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should execute if it has enough confirmations and is past the time lock', async () => {
- await web3Wrapper.increaseTimeAsync(SECONDS_TIME_LOCKED.toNumber());
- await multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] });
-
- const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
- expect(secondsTimeLocked).to.be.bignumber.equal(newSecondsTimeLocked);
- });
- });
- });
-});
diff --git a/packages/contracts/test/multi_sig_with_time_lock_except_remove_auth_addr.ts b/packages/contracts/test/multi_sig_with_time_lock_except_remove_auth_addr.ts
deleted file mode 100644
index 6d20a67f3..000000000
--- a/packages/contracts/test/multi_sig_with_time_lock_except_remove_auth_addr.ts
+++ /dev/null
@@ -1,193 +0,0 @@
-import { LogWithDecodedArgs, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { AbiDecoder } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import { MultiSigWalletContract } from '../src/contract_wrappers/generated/multi_sig_wallet';
-import { MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract } from '../src/contract_wrappers/generated/multi_sig_wallet_with_time_lock_except_remove_authorized_address';
-import { TokenTransferProxyContract } from '../src/contract_wrappers/generated/token_transfer_proxy';
-import { artifacts } from '../util/artifacts';
-import { constants } from '../util/constants';
-import { crypto } from '../util/crypto';
-import { MultiSigWrapper } from '../util/multi_sig_wrapper';
-import { ContractName, SubmissionContractEventArgs, TransactionDataParams } from '../util/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-const PROXY_ABI = artifacts.TokenTransferProxyArtifact.networks[constants.TESTRPC_NETWORK_ID].abi;
-const MUTISIG_WALLET_WITH_TIME_LOCK_EXCEPT_REMOVE_AUTHORIZED_ADDRESS_ABI =
- artifacts.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact.networks[constants.TESTRPC_NETWORK_ID]
- .abi;
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-const abiDecoder = new AbiDecoder([MUTISIG_WALLET_WITH_TIME_LOCK_EXCEPT_REMOVE_AUTHORIZED_ADDRESS_ABI]);
-
-describe('MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress', () => {
- const zeroEx = new ZeroEx(web3.currentProvider, { networkId: constants.TESTRPC_NETWORK_ID });
- let owners: string[];
- const requiredApprovals = 2;
- const SECONDS_TIME_LOCKED = 1000000;
-
- // initialize fake addresses
- let authorizedAddress: string;
- let unauthorizedAddress: string;
-
- let tokenTransferProxy: TokenTransferProxyContract;
- let multiSig: MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract;
- let multiSigWrapper: MultiSigWrapper;
-
- let validDestination: string;
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- owners = [accounts[0], accounts[1]];
- [authorizedAddress, unauthorizedAddress] = accounts;
- const initialOwner = accounts[0];
- const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
- tokenTransferProxy = new TokenTransferProxyContract(
- web3Wrapper,
- tokenTransferProxyInstance.abi,
- tokenTransferProxyInstance.address,
- );
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(authorizedAddress, {
- from: initialOwner,
- });
- const multiSigInstance = await deployer.deployAsync(
- ContractName.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,
- [owners, requiredApprovals, SECONDS_TIME_LOCKED, tokenTransferProxy.address],
- );
- multiSig = new MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract(
- web3Wrapper,
- multiSigInstance.abi,
- multiSigInstance.address,
- );
- await tokenTransferProxy.transferOwnership.sendTransactionAsync(multiSig.address, {
- from: initialOwner,
- });
- multiSigWrapper = new MultiSigWrapper((multiSig as any) as MultiSigWalletContract);
- validDestination = tokenTransferProxy.address;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
-
- describe('isFunctionRemoveAuthorizedAddress', () => {
- it('should throw if data is not for removeAuthorizedAddress', async () => {
- const data = MultiSigWrapper.encodeFnArgs('addAuthorizedAddress', PROXY_ABI, [owners[0]]);
- return expect(multiSig.isFunctionRemoveAuthorizedAddress.callAsync(data)).to.be.rejectedWith(
- constants.REVERT,
- );
- });
-
- it('should return true if data is for removeAuthorizedAddress', async () => {
- const data = MultiSigWrapper.encodeFnArgs('removeAuthorizedAddress', PROXY_ABI, [owners[0]]);
- const isFunctionRemoveAuthorizedAddress = await multiSig.isFunctionRemoveAuthorizedAddress.callAsync(data);
- expect(isFunctionRemoveAuthorizedAddress).to.be.true();
- });
- });
-
- describe('executeRemoveAuthorizedAddress', () => {
- it('should throw without the required confirmations', async () => {
- const dataParams: TransactionDataParams = {
- name: 'removeAuthorizedAddress',
- abi: PROXY_ABI,
- args: [authorizedAddress],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(validDestination, owners[0], dataParams);
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
- const txId = log.args.transactionId;
-
- return expect(
- multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if tx destination is not the tokenTransferProxy', async () => {
- const invalidTokenTransferProxy = await deployer.deployAsync(ContractName.TokenTransferProxy);
- const invalidDestination = invalidTokenTransferProxy.address;
- const dataParams: TransactionDataParams = {
- name: 'removeAuthorizedAddress',
- abi: PROXY_ABI,
- args: [authorizedAddress],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(invalidDestination, owners[0], dataParams);
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
- const txId = log.args.transactionId;
- await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
- const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
- expect(isConfirmed).to.be.true();
-
- return expect(
- multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if tx data is not for removeAuthorizedAddress', async () => {
- const dataParams: TransactionDataParams = {
- name: 'addAuthorizedAddress',
- abi: PROXY_ABI,
- args: [unauthorizedAddress],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(validDestination, owners[0], dataParams);
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
- const txId = log.args.transactionId;
- await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
- const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
- expect(isConfirmed).to.be.true();
-
- return expect(
- multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should execute removeAuthorizedAddress for valid tokenTransferProxy if fully confirmed', async () => {
- const dataParams: TransactionDataParams = {
- name: 'removeAuthorizedAddress',
- abi: PROXY_ABI,
- args: [authorizedAddress],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(validDestination, owners[0], dataParams);
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
- const txId = log.args.transactionId;
- await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
- const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
- expect(isConfirmed).to.be.true();
- await multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] });
- const isAuthorized = await tokenTransferProxy.authorized.callAsync(authorizedAddress);
- expect(isAuthorized).to.be.false();
- });
-
- it('should throw if already executed', async () => {
- const dataParams: TransactionDataParams = {
- name: 'removeAuthorizedAddress',
- abi: PROXY_ABI,
- args: [authorizedAddress],
- };
- const txHash = await multiSigWrapper.submitTransactionAsync(validDestination, owners[0], dataParams);
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const log = abiDecoder.tryToDecodeLogOrNoop(res.logs[0]) as LogWithDecodedArgs<SubmissionContractEventArgs>;
- const txId = log.args.transactionId;
- await multiSig.confirmTransaction.sendTransactionAsync(txId, { from: owners[1] });
- const isConfirmed = await multiSig.isConfirmed.callAsync(txId);
- expect(isConfirmed).to.be.true();
- await multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] });
- const tx = await multiSig.transactions.callAsync(txId);
- const isExecuted = tx[3];
- expect(isExecuted).to.be.true();
- return expect(
- multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
- ).to.be.rejectedWith(constants.REVERT);
- });
- });
-});
diff --git a/packages/contracts/test/multisig/asset_proxy_owner.ts b/packages/contracts/test/multisig/asset_proxy_owner.ts
new file mode 100644
index 000000000..6b98605d3
--- /dev/null
+++ b/packages/contracts/test/multisig/asset_proxy_owner.ts
@@ -0,0 +1,468 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
+
+import {
+ AssetProxyOwnerAssetProxyRegistrationEventArgs,
+ AssetProxyOwnerContract,
+ AssetProxyOwnerExecutionEventArgs,
+ AssetProxyOwnerExecutionFailureEventArgs,
+ AssetProxyOwnerSubmissionEventArgs,
+} from '../../generated_contract_wrappers/asset_proxy_owner';
+import { MixinAuthorizableContract } from '../../generated_contract_wrappers/mixin_authorizable';
+import { TestAssetProxyOwnerContract } from '../../generated_contract_wrappers/test_asset_proxy_owner';
+import { artifacts } from '../utils/artifacts';
+import {
+ expectContractCallFailedWithoutReasonAsync,
+ expectContractCreationFailedWithoutReason,
+ expectTransactionFailedWithoutReasonAsync,
+} from '../utils/assertions';
+import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { MultiSigWrapper } from '../utils/multi_sig_wrapper';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// tslint:disable:no-unnecessary-type-assertion
+describe('AssetProxyOwner', () => {
+ let owners: string[];
+ let authorized: string;
+ const REQUIRED_APPROVALS = new BigNumber(2);
+ const SECONDS_TIME_LOCKED = new BigNumber(1000000);
+
+ let erc20Proxy: MixinAuthorizableContract;
+ let erc721Proxy: MixinAuthorizableContract;
+ let testAssetProxyOwner: TestAssetProxyOwnerContract;
+ let multiSigWrapper: MultiSigWrapper;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ owners = [accounts[0], accounts[1]];
+ const initialOwner = (authorized = accounts[0]);
+ erc20Proxy = await MixinAuthorizableContract.deployFrom0xArtifactAsync(
+ artifacts.MixinAuthorizable,
+ provider,
+ txDefaults,
+ );
+ erc721Proxy = await MixinAuthorizableContract.deployFrom0xArtifactAsync(
+ artifacts.MixinAuthorizable,
+ provider,
+ txDefaults,
+ );
+ const defaultAssetProxyContractAddresses: string[] = [];
+ testAssetProxyOwner = await TestAssetProxyOwnerContract.deployFrom0xArtifactAsync(
+ artifacts.TestAssetProxyOwner,
+ provider,
+ txDefaults,
+ owners,
+ defaultAssetProxyContractAddresses,
+ REQUIRED_APPROVALS,
+ SECONDS_TIME_LOCKED,
+ );
+ multiSigWrapper = new MultiSigWrapper(testAssetProxyOwner, provider);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.transferOwnership.sendTransactionAsync(testAssetProxyOwner.address, {
+ from: initialOwner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.transferOwnership.sendTransactionAsync(testAssetProxyOwner.address, {
+ from: initialOwner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('constructor', () => {
+ it('should register passed in assetProxyContracts', async () => {
+ const assetProxyContractAddresses = [erc20Proxy.address, erc721Proxy.address];
+ const newMultiSig = await AssetProxyOwnerContract.deployFrom0xArtifactAsync(
+ artifacts.AssetProxyOwner,
+ provider,
+ txDefaults,
+ owners,
+ assetProxyContractAddresses,
+ REQUIRED_APPROVALS,
+ SECONDS_TIME_LOCKED,
+ );
+ const isErc20ProxyRegistered = await newMultiSig.isAssetProxyRegistered.callAsync(erc20Proxy.address);
+ const isErc721ProxyRegistered = await newMultiSig.isAssetProxyRegistered.callAsync(erc721Proxy.address);
+ expect(isErc20ProxyRegistered).to.equal(true);
+ expect(isErc721ProxyRegistered).to.equal(true);
+ });
+ it('should throw if a null address is included in assetProxyContracts', async () => {
+ const assetProxyContractAddresses = [erc20Proxy.address, constants.NULL_ADDRESS];
+ return expectContractCreationFailedWithoutReason(
+ AssetProxyOwnerContract.deployFrom0xArtifactAsync(
+ artifacts.AssetProxyOwner,
+ provider,
+ txDefaults,
+ owners,
+ assetProxyContractAddresses,
+ REQUIRED_APPROVALS,
+ SECONDS_TIME_LOCKED,
+ ),
+ );
+ });
+ });
+
+ describe('isFunctionRemoveAuthorizedAddressAtIndex', () => {
+ it('should return false if data is not for removeAuthorizedAddressAtIndex', async () => {
+ const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
+ owners[0],
+ );
+
+ const isFunctionRemoveAuthorizedAddressAtIndex = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddressAtIndex.callAsync(
+ notRemoveAuthorizedAddressData,
+ );
+ expect(isFunctionRemoveAuthorizedAddressAtIndex).to.be.false();
+ });
+
+ it('should return true if data is for removeAuthorizedAddressAtIndex', async () => {
+ const index = new BigNumber(0);
+ const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ owners[0],
+ index,
+ );
+ const isFunctionRemoveAuthorizedAddressAtIndex = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddressAtIndex.callAsync(
+ removeAuthorizedAddressAtIndexData,
+ );
+ expect(isFunctionRemoveAuthorizedAddressAtIndex).to.be.true();
+ });
+ });
+
+ describe('readBytes4', () => {
+ it('should revert if byte array has a length < 4', async () => {
+ const byteArrayLessThan4Bytes = '0x010101';
+ return expectContractCallFailedWithoutReasonAsync(
+ testAssetProxyOwner.publicReadBytes4.callAsync(byteArrayLessThan4Bytes, new BigNumber(0)),
+ );
+ });
+ it('should return the first 4 bytes of a byte array of arbitrary length', async () => {
+ const byteArrayLongerThan32Bytes =
+ '0x0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef';
+ const first4Bytes = await testAssetProxyOwner.publicReadBytes4.callAsync(
+ byteArrayLongerThan32Bytes,
+ new BigNumber(0),
+ );
+ const expectedFirst4Bytes = byteArrayLongerThan32Bytes.slice(0, 10);
+ expect(first4Bytes).to.equal(expectedFirst4Bytes);
+ });
+ });
+
+ describe('registerAssetProxy', () => {
+ it('should throw if not called by multisig', async () => {
+ const isRegistered = true;
+ return expectTransactionFailedWithoutReasonAsync(
+ testAssetProxyOwner.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, isRegistered, {
+ from: owners[0],
+ }),
+ );
+ });
+
+ it('should register an address if called by multisig after timelock', async () => {
+ const addressToRegister = erc20Proxy.address;
+ const isRegistered = true;
+ const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
+ addressToRegister,
+ isRegistered,
+ );
+ const submitTxRes = await multiSigWrapper.submitTransactionAsync(
+ testAssetProxyOwner.address,
+ registerAssetProxyData,
+ owners[0],
+ );
+
+ const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+ await increaseTimeAndMineBlockAsync(SECONDS_TIME_LOCKED.toNumber());
+
+ const executeTxRes = await multiSigWrapper.executeTransactionAsync(txId, owners[0]);
+ const registerLog = executeTxRes.logs[0] as LogWithDecodedArgs<
+ AssetProxyOwnerAssetProxyRegistrationEventArgs
+ >;
+ expect(registerLog.args.assetProxyContract).to.equal(addressToRegister);
+ expect(registerLog.args.isRegistered).to.equal(isRegistered);
+
+ const isAssetProxyRegistered = await testAssetProxyOwner.isAssetProxyRegistered.callAsync(
+ addressToRegister,
+ );
+ expect(isAssetProxyRegistered).to.equal(isRegistered);
+ });
+
+ it('should fail if registering a null address', async () => {
+ const addressToRegister = constants.NULL_ADDRESS;
+ const isRegistered = true;
+ const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
+ addressToRegister,
+ isRegistered,
+ );
+ const submitTxRes = await multiSigWrapper.submitTransactionAsync(
+ testAssetProxyOwner.address,
+ registerAssetProxyData,
+ owners[0],
+ );
+ const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+ await increaseTimeAndMineBlockAsync(SECONDS_TIME_LOCKED.toNumber());
+
+ const executeTxRes = await multiSigWrapper.executeTransactionAsync(txId, owners[0]);
+ const failureLog = executeTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerExecutionFailureEventArgs>;
+ expect(failureLog.args.transactionId).to.be.bignumber.equal(txId);
+
+ const isAssetProxyRegistered = await testAssetProxyOwner.isAssetProxyRegistered.callAsync(
+ addressToRegister,
+ );
+ expect(isAssetProxyRegistered).to.equal(false);
+ });
+ });
+
+ describe('Calling removeAuthorizedAddressAtIndex', () => {
+ const erc20Index = new BigNumber(0);
+ const erc721Index = new BigNumber(1);
+ before('authorize both proxies and register erc20 proxy', async () => {
+ // Only register ERC20 proxy
+ const addressToRegister = erc20Proxy.address;
+ const isRegistered = true;
+ const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
+ addressToRegister,
+ isRegistered,
+ );
+ const registerAssetProxySubmitRes = await multiSigWrapper.submitTransactionAsync(
+ testAssetProxyOwner.address,
+ registerAssetProxyData,
+ owners[0],
+ );
+ const registerAssetProxySubmitLog = registerAssetProxySubmitRes.logs[0] as LogWithDecodedArgs<
+ AssetProxyOwnerSubmissionEventArgs
+ >;
+
+ const addAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(authorized);
+ const erc20AddAuthorizedAddressSubmitRes = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ addAuthorizedAddressData,
+ owners[0],
+ );
+ const erc721AddAuthorizedAddressSubmitRes = await multiSigWrapper.submitTransactionAsync(
+ erc721Proxy.address,
+ addAuthorizedAddressData,
+ owners[0],
+ );
+ const erc20AddAuthorizedAddressSubmitLog = erc20AddAuthorizedAddressSubmitRes.logs[0] as LogWithDecodedArgs<
+ AssetProxyOwnerSubmissionEventArgs
+ >;
+ const erc721AddAuthorizedAddressSubmitLog = erc721AddAuthorizedAddressSubmitRes
+ .logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+
+ const registerAssetProxyTxId = registerAssetProxySubmitLog.args.transactionId;
+ const erc20AddAuthorizedAddressTxId = erc20AddAuthorizedAddressSubmitLog.args.transactionId;
+ const erc721AddAuthorizedAddressTxId = erc721AddAuthorizedAddressSubmitLog.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(registerAssetProxyTxId, owners[1]);
+ await multiSigWrapper.confirmTransactionAsync(erc20AddAuthorizedAddressTxId, owners[1]);
+ await multiSigWrapper.confirmTransactionAsync(erc721AddAuthorizedAddressTxId, owners[1]);
+ await increaseTimeAndMineBlockAsync(SECONDS_TIME_LOCKED.toNumber());
+ await multiSigWrapper.executeTransactionAsync(registerAssetProxyTxId, owners[0]);
+ await multiSigWrapper.executeTransactionAsync(erc20AddAuthorizedAddressTxId, owners[0]);
+ await multiSigWrapper.executeTransactionAsync(erc721AddAuthorizedAddressTxId, owners[0]);
+ });
+
+ describe('validRemoveAuthorizedAddressAtIndexTx', () => {
+ it('should revert if data is not for removeAuthorizedAddressAtIndex and proxy is registered', async () => {
+ const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
+ authorized,
+ );
+ const submitTxRes = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ notRemoveAuthorizedAddressData,
+ owners[0],
+ );
+ const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+ return expectContractCallFailedWithoutReasonAsync(
+ testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
+ );
+ });
+
+ it('should return true if data is for removeAuthorizedAddressAtIndex and proxy is registered', async () => {
+ const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc20Index,
+ );
+ const submitTxRes = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+ const isValidRemoveAuthorizedAddressAtIndexTx = await testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(
+ txId,
+ );
+ expect(isValidRemoveAuthorizedAddressAtIndexTx).to.be.true();
+ });
+
+ it('should revert if data is for removeAuthorizedAddressAtIndex and proxy is not registered', async () => {
+ const removeAuthorizedAddressAtIndexData = erc721Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc721Index,
+ );
+ const submitTxRes = await multiSigWrapper.submitTransactionAsync(
+ erc721Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const log = submitTxRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+ return expectContractCallFailedWithoutReasonAsync(
+ testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
+ );
+ });
+ });
+
+ describe('executeRemoveAuthorizedAddressAtIndex', () => {
+ it('should throw without the required confirmations', async () => {
+ const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc20Index,
+ );
+ const res = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const log = res.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+
+ return expectTransactionFailedWithoutReasonAsync(
+ testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
+ from: owners[1],
+ }),
+ );
+ });
+
+ it('should throw if tx destination is not registered', async () => {
+ const removeAuthorizedAddressAtIndexData = erc721Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc721Index,
+ );
+ const res = await multiSigWrapper.submitTransactionAsync(
+ erc721Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const log = res.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+
+ return expectTransactionFailedWithoutReasonAsync(
+ testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
+ from: owners[1],
+ }),
+ );
+ });
+
+ it('should throw if tx data is not for removeAuthorizedAddressAtIndex', async () => {
+ const newAuthorized = owners[1];
+ const addAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
+ newAuthorized,
+ );
+ const res = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ addAuthorizedAddressData,
+ owners[0],
+ );
+ const log = res.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+
+ return expectTransactionFailedWithoutReasonAsync(
+ testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
+ from: owners[1],
+ }),
+ );
+ });
+
+ it('should execute removeAuthorizedAddressAtIndex for registered address if fully confirmed', async () => {
+ const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc20Index,
+ );
+ const submitRes = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const submitLog = submitRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = submitLog.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+
+ const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAtIndexAsync(txId, owners[0]);
+ const execLog = execRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerExecutionEventArgs>;
+ expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
+
+ const tx = await testAssetProxyOwner.transactions.callAsync(txId);
+ const isExecuted = tx[3];
+ expect(isExecuted).to.equal(true);
+
+ const isAuthorized = await erc20Proxy.authorized.callAsync(authorized);
+ expect(isAuthorized).to.equal(false);
+ });
+
+ it('should throw if already executed', async () => {
+ const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
+ authorized,
+ erc20Index,
+ );
+ const submitRes = await multiSigWrapper.submitTransactionAsync(
+ erc20Proxy.address,
+ removeAuthorizedAddressAtIndexData,
+ owners[0],
+ );
+ const submitLog = submitRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerSubmissionEventArgs>;
+ const txId = submitLog.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+
+ const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAtIndexAsync(txId, owners[0]);
+ const execLog = execRes.logs[0] as LogWithDecodedArgs<AssetProxyOwnerExecutionEventArgs>;
+ expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
+
+ const tx = await testAssetProxyOwner.transactions.callAsync(txId);
+ const isExecuted = tx[3];
+ expect(isExecuted).to.equal(true);
+
+ return expectTransactionFailedWithoutReasonAsync(
+ testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
+ from: owners[1],
+ }),
+ );
+ });
+ });
+ });
+});
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/multisig/multi_sig_with_time_lock.ts b/packages/contracts/test/multisig/multi_sig_with_time_lock.ts
new file mode 100644
index 000000000..8eeeeca6b
--- /dev/null
+++ b/packages/contracts/test/multisig/multi_sig_with_time_lock.ts
@@ -0,0 +1,168 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
+
+import {
+ MultiSigWalletWithTimeLockContract,
+ MultiSigWalletWithTimeLockSubmissionEventArgs,
+} from '../../generated_contract_wrappers/multi_sig_wallet_with_time_lock';
+import { artifacts } from '../utils/artifacts';
+import { expectTransactionFailedWithoutReasonAsync } from '../utils/assertions';
+import { increaseTimeAndMineBlockAsync } from '../utils/block_timestamp';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { MultiSigWrapper } from '../utils/multi_sig_wrapper';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// tslint:disable:no-unnecessary-type-assertion
+describe('MultiSigWalletWithTimeLock', () => {
+ let owners: string[];
+ const REQUIRED_APPROVALS = new BigNumber(2);
+ const SECONDS_TIME_LOCKED = new BigNumber(1000000);
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ owners = [accounts[0], accounts[1]];
+ });
+
+ let multiSig: MultiSigWalletWithTimeLockContract;
+ let multiSigWrapper: MultiSigWrapper;
+
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+
+ describe('changeTimeLock', () => {
+ describe('initially non-time-locked', async () => {
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before('deploy a wallet', async () => {
+ const secondsTimeLocked = new BigNumber(0);
+ multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
+ artifacts.MultiSigWalletWithTimeLock,
+ provider,
+ txDefaults,
+ owners,
+ REQUIRED_APPROVALS,
+ secondsTimeLocked,
+ );
+ multiSigWrapper = new MultiSigWrapper(multiSig, provider);
+ });
+
+ it('should throw when not called by wallet', async () => {
+ return expectTransactionFailedWithoutReasonAsync(
+ multiSig.changeTimeLock.sendTransactionAsync(SECONDS_TIME_LOCKED, { from: owners[0] }),
+ );
+ });
+
+ it('should throw without enough confirmations', async () => {
+ const destination = multiSig.address;
+ const changeTimeLockData = multiSig.changeTimeLock.getABIEncodedTransactionData(SECONDS_TIME_LOCKED);
+ const res = await multiSigWrapper.submitTransactionAsync(destination, changeTimeLockData, owners[0]);
+ const log = res.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockSubmissionEventArgs>;
+ const txId = log.args.transactionId;
+ return expectTransactionFailedWithoutReasonAsync(
+ multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] }),
+ );
+ });
+
+ it('should set confirmation time with enough confirmations', async () => {
+ const destination = multiSig.address;
+ const changeTimeLockData = multiSig.changeTimeLock.getABIEncodedTransactionData(SECONDS_TIME_LOCKED);
+ const subRes = await multiSigWrapper.submitTransactionAsync(destination, changeTimeLockData, owners[0]);
+ const subLog = subRes.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockSubmissionEventArgs>;
+ const txId = subLog.args.transactionId;
+
+ const confirmRes = await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+ expect(confirmRes.logs).to.have.length(2);
+
+ const blockNum = await web3Wrapper.getBlockNumberAsync();
+ const blockInfo = await web3Wrapper.getBlockAsync(blockNum);
+ const timestamp = new BigNumber(blockInfo.timestamp);
+ const confirmationTimeBigNum = new BigNumber(await multiSig.confirmationTimes.callAsync(txId));
+
+ expect(timestamp).to.be.bignumber.equal(confirmationTimeBigNum);
+ });
+
+ it('should be executable with enough confirmations and secondsTimeLocked of 0', async () => {
+ const destination = multiSig.address;
+ const changeTimeLockData = multiSig.changeTimeLock.getABIEncodedTransactionData(SECONDS_TIME_LOCKED);
+ const subRes = await multiSigWrapper.submitTransactionAsync(destination, changeTimeLockData, owners[0]);
+ const subLog = subRes.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockSubmissionEventArgs>;
+ const txId = subLog.args.transactionId;
+
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+ await multiSigWrapper.executeTransactionAsync(txId, owners[1]);
+
+ const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
+ expect(secondsTimeLocked).to.be.bignumber.equal(SECONDS_TIME_LOCKED);
+ });
+ });
+ describe('initially time-locked', async () => {
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ let txId: BigNumber;
+ const newSecondsTimeLocked = new BigNumber(0);
+ before('deploy a wallet, submit transaction to change timelock, and confirm the transaction', async () => {
+ multiSig = await MultiSigWalletWithTimeLockContract.deployFrom0xArtifactAsync(
+ artifacts.MultiSigWalletWithTimeLock,
+ provider,
+ txDefaults,
+ owners,
+ REQUIRED_APPROVALS,
+ SECONDS_TIME_LOCKED,
+ );
+ multiSigWrapper = new MultiSigWrapper(multiSig, provider);
+
+ const changeTimeLockData = multiSig.changeTimeLock.getABIEncodedTransactionData(newSecondsTimeLocked);
+ const res = await multiSigWrapper.submitTransactionAsync(
+ multiSig.address,
+ changeTimeLockData,
+ owners[0],
+ );
+ const log = res.logs[0] as LogWithDecodedArgs<MultiSigWalletWithTimeLockSubmissionEventArgs>;
+ txId = log.args.transactionId;
+ await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
+ });
+
+ it('should throw if it has enough confirmations but is not past the time lock', async () => {
+ return expectTransactionFailedWithoutReasonAsync(
+ multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] }),
+ );
+ });
+
+ it('should execute if it has enough confirmations and is past the time lock', async () => {
+ await increaseTimeAndMineBlockAsync(SECONDS_TIME_LOCKED.toNumber());
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await multiSig.executeTransaction.sendTransactionAsync(txId, { from: owners[0] }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const secondsTimeLocked = new BigNumber(await multiSig.secondsTimeLocked.callAsync());
+ expect(secondsTimeLocked).to.be.bignumber.equal(newSecondsTimeLocked);
+ });
+ });
+ });
+});
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/contracts/test/token_registry.ts b/packages/contracts/test/token_registry.ts
index 9dcc77b82..7cc43be9b 100644
--- a/packages/contracts/test/token_registry.ts
+++ b/packages/contracts/test/token_registry.ts
@@ -1,20 +1,17 @@
-import { ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { BigNumber, NULL_BYTES } from '@0xproject/utils';
import * as chai from 'chai';
import ethUtil = require('ethereumjs-util');
import * as _ from 'lodash';
-import * as Web3 from 'web3';
-import { TokenRegistryContract } from '../src/contract_wrappers/generated/token_registry';
-import { constants } from '../util/constants';
-import { TokenRegWrapper } from '../util/token_registry_wrapper';
-import { ContractName } from '../util/types';
+import { TokenRegistryContract } from '../generated_contract_wrappers/token_registry';
+import { artifacts } from './utils/artifacts';
+import { expectTransactionFailedWithoutReasonAsync } from './utils/assertions';
import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
+import { constants } from './utils/constants';
+import { TokenRegWrapper } from './utils/token_registry_wrapper';
+import { provider, txDefaults, web3Wrapper } from './utils/web3_wrapper';
chaiSetup.configure();
const expect = chai.expect;
@@ -25,13 +22,19 @@ describe('TokenRegistry', () => {
let notOwner: string;
let tokenReg: TokenRegistryContract;
let tokenRegWrapper: TokenRegWrapper;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
before(async () => {
const accounts = await web3Wrapper.getAvailableAddressesAsync();
owner = accounts[0];
notOwner = accounts[1];
- const tokenRegInstance = await deployer.deployAsync(ContractName.TokenRegistry);
- tokenReg = new TokenRegistryContract(web3Wrapper, tokenRegInstance.abi, tokenRegInstance.address);
- tokenRegWrapper = new TokenRegWrapper(tokenReg);
+ tokenReg = await TokenRegistryContract.deployFrom0xArtifactAsync(artifacts.TokenRegistry, provider, txDefaults);
+ tokenRegWrapper = new TokenRegWrapper(tokenReg, provider);
});
beforeEach(async () => {
await blockchainLifecycle.startAsync();
@@ -62,17 +65,17 @@ describe('TokenRegistry', () => {
};
const nullToken = {
- address: ZeroEx.NULL_ADDRESS,
+ address: constants.NULL_ADDRESS,
name: '',
symbol: '',
decimals: 0,
- ipfsHash: constants.NULL_BYTES,
- swarmHash: constants.NULL_BYTES,
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
};
describe('addToken', () => {
it('should throw when not called by owner', async () => {
- return expect(tokenRegWrapper.addTokenAsync(token1, notOwner)).to.be.rejectedWith(constants.REVERT);
+ return expectTransactionFailedWithoutReasonAsync(tokenRegWrapper.addTokenAsync(token1, notOwner));
});
it('should add token metadata when called by owner', async () => {
@@ -84,20 +87,18 @@ describe('TokenRegistry', () => {
it('should throw if token already exists', async () => {
await tokenRegWrapper.addTokenAsync(token1, owner);
- return expect(tokenRegWrapper.addTokenAsync(token1, owner)).to.be.rejectedWith(constants.REVERT);
+ return expectTransactionFailedWithoutReasonAsync(tokenRegWrapper.addTokenAsync(token1, owner));
});
it('should throw if token address is null', async () => {
- return expect(tokenRegWrapper.addTokenAsync(nullToken, owner)).to.be.rejectedWith(constants.REVERT);
+ return expectTransactionFailedWithoutReasonAsync(tokenRegWrapper.addTokenAsync(nullToken, owner));
});
it('should throw if name already exists', async () => {
await tokenRegWrapper.addTokenAsync(token1, owner);
const duplicateNameToken = _.assign({}, token2, { name: token1.name });
- return expect(tokenRegWrapper.addTokenAsync(duplicateNameToken, owner)).to.be.rejectedWith(
- constants.REVERT,
- );
+ return expectTransactionFailedWithoutReasonAsync(tokenRegWrapper.addTokenAsync(duplicateNameToken, owner));
});
it('should throw if symbol already exists', async () => {
@@ -106,8 +107,8 @@ describe('TokenRegistry', () => {
symbol: token1.symbol,
});
- return expect(tokenRegWrapper.addTokenAsync(duplicateSymbolToken, owner)).to.be.rejectedWith(
- constants.REVERT,
+ return expectTransactionFailedWithoutReasonAsync(
+ tokenRegWrapper.addTokenAsync(duplicateSymbolToken, owner),
);
});
});
@@ -133,15 +134,18 @@ describe('TokenRegistry', () => {
describe('setTokenName', () => {
it('should throw when not called by owner', async () => {
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenName.sendTransactionAsync(token1.address, token2.name, { from: notOwner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should change the token name when called by owner', async () => {
- await tokenReg.setTokenName.sendTransactionAsync(token1.address, token2.name, {
- from: owner,
- });
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.setTokenName.sendTransactionAsync(token1.address, token2.name, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
const [newData, oldData] = await Promise.all([
tokenRegWrapper.getTokenByNameAsync(token2.name),
tokenRegWrapper.getTokenByNameAsync(token1.name),
@@ -156,29 +160,32 @@ describe('TokenRegistry', () => {
it('should throw if the name already exists', async () => {
await tokenRegWrapper.addTokenAsync(token2, owner);
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenName.sendTransactionAsync(token1.address, token2.name, { from: owner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should throw if token does not exist', async () => {
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenName.sendTransactionAsync(nullToken.address, token2.name, { from: owner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
});
describe('setTokenSymbol', () => {
it('should throw when not called by owner', async () => {
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenSymbol.sendTransactionAsync(token1.address, token2.symbol, {
from: notOwner,
}),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should change the token symbol when called by owner', async () => {
- await tokenReg.setTokenSymbol.sendTransactionAsync(token1.address, token2.symbol, { from: owner });
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.setTokenSymbol.sendTransactionAsync(token1.address, token2.symbol, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
const [newData, oldData] = await Promise.all([
tokenRegWrapper.getTokenBySymbolAsync(token2.symbol),
tokenRegWrapper.getTokenBySymbolAsync(token1.symbol),
@@ -193,52 +200,55 @@ describe('TokenRegistry', () => {
it('should throw if the symbol already exists', async () => {
await tokenRegWrapper.addTokenAsync(token2, owner);
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenSymbol.sendTransactionAsync(token1.address, token2.symbol, {
from: owner,
}),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should throw if token does not exist', async () => {
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.setTokenSymbol.sendTransactionAsync(nullToken.address, token2.symbol, {
from: owner,
}),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
});
describe('removeToken', () => {
it('should throw if not called by owner', async () => {
const index = new BigNumber(0);
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.removeToken.sendTransactionAsync(token1.address, index, { from: notOwner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should remove token metadata when called by owner', async () => {
const index = new BigNumber(0);
- await tokenReg.removeToken.sendTransactionAsync(token1.address, index, {
- from: owner,
- });
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.removeToken.sendTransactionAsync(token1.address, index, {
+ from: owner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
const tokenData = await tokenRegWrapper.getTokenMetaDataAsync(token1.address);
expect(tokenData).to.be.deep.equal(nullToken);
});
it('should throw if token does not exist', async () => {
const index = new BigNumber(0);
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.removeToken.sendTransactionAsync(nullToken.address, index, { from: owner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
it('should throw if token at given index does not match address', async () => {
await tokenRegWrapper.addTokenAsync(token2, owner);
const incorrectIndex = new BigNumber(0);
- return expect(
+ return expectTransactionFailedWithoutReasonAsync(
tokenReg.removeToken.sendTransactionAsync(token2.address, incorrectIndex, { from: owner }),
- ).to.be.rejectedWith(constants.REVERT);
+ );
});
});
});
diff --git a/packages/contracts/test/token_transfer_proxy/auth.ts b/packages/contracts/test/token_transfer_proxy/auth.ts
deleted file mode 100644
index a1ccc6ff7..000000000
--- a/packages/contracts/test/token_transfer_proxy/auth.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import { TokenTransferProxyContract } from '../../src/contract_wrappers/generated/token_transfer_proxy';
-import { constants } from '../../util/constants';
-import { ContractName } from '../../util/types';
-import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('TokenTransferProxy', () => {
- let owner: string;
- let notOwner: string;
- let address: string;
- let tokenTransferProxy: TokenTransferProxyContract;
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- owner = address = accounts[0];
- notOwner = accounts[1];
- const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
- tokenTransferProxy = new TokenTransferProxyContract(
- web3Wrapper,
- tokenTransferProxyInstance.abi,
- tokenTransferProxyInstance.address,
- );
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('addAuthorizedAddress', () => {
- it('should throw if not called by owner', async () => {
- return expect(
- tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(notOwner, { from: notOwner }),
- ).to.be.rejectedWith(constants.REVERT);
- });
- it('should allow owner to add an authorized address', async () => {
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- const isAuthorized = await tokenTransferProxy.authorized.callAsync(address);
- expect(isAuthorized).to.be.true();
- });
- it('should throw if owner attempts to authorize a duplicate address', async () => {
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- return expect(
- tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner }),
- ).to.be.rejectedWith(constants.REVERT);
- });
- });
-
- describe('removeAuthorizedAddress', () => {
- it('should throw if not called by owner', async () => {
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- return expect(
- tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
- from: notOwner,
- }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should allow owner to remove an authorized address', async () => {
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, { from: owner });
- await tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
- from: owner,
- });
- const isAuthorized = await tokenTransferProxy.authorized.callAsync(address);
- expect(isAuthorized).to.be.false();
- });
-
- it('should throw if owner attempts to remove an address that is not authorized', async () => {
- return expect(
- tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
- from: owner,
- }),
- ).to.be.rejectedWith(constants.REVERT);
- });
- });
-
- describe('getAuthorizedAddresses', () => {
- it('should return all authorized addresses', async () => {
- const initial = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
- expect(initial).to.have.length(0);
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(address, {
- from: owner,
- });
- const afterAdd = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
- expect(afterAdd).to.have.length(1);
- expect(afterAdd).to.include(address);
-
- await tokenTransferProxy.removeAuthorizedAddress.sendTransactionAsync(address, {
- from: owner,
- });
- const afterRemove = await tokenTransferProxy.getAuthorizedAddresses.callAsync();
- expect(afterRemove).to.have.length(0);
- });
- });
-});
diff --git a/packages/contracts/test/token_transfer_proxy/transfer_from.ts b/packages/contracts/test/token_transfer_proxy/transfer_from.ts
deleted file mode 100644
index 415d068be..000000000
--- a/packages/contracts/test/token_transfer_proxy/transfer_from.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import { DummyTokenContract } from '../../src/contract_wrappers/generated/dummy_token';
-import { TokenTransferProxyContract } from '../../src/contract_wrappers/generated/token_transfer_proxy';
-import { Balances } from '../../util/balances';
-import { constants } from '../../util/constants';
-import { ContractName } from '../../util/types';
-import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('TokenTransferProxy', () => {
- let accounts: string[];
- let owner: string;
- let notAuthorized: string;
- const INIT_BAL = new BigNumber(100000000);
- const INIT_ALLOW = new BigNumber(100000000);
-
- let tokenTransferProxy: TokenTransferProxyContract;
- let rep: DummyTokenContract;
- let dmyBalances: Balances;
-
- before(async () => {
- accounts = await web3Wrapper.getAvailableAddressesAsync();
- owner = notAuthorized = accounts[0];
- const tokenTransferProxyInstance = await deployer.deployAsync(ContractName.TokenTransferProxy);
- tokenTransferProxy = new TokenTransferProxyContract(
- web3Wrapper,
- tokenTransferProxyInstance.abi,
- tokenTransferProxyInstance.address,
- );
- const repInstance = await deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS);
- rep = new DummyTokenContract(web3Wrapper, repInstance.abi, repInstance.address);
-
- dmyBalances = new Balances([rep], [accounts[0], accounts[1]]);
- await Promise.all([
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, {
- from: accounts[0],
- }),
- rep.setBalance.sendTransactionAsync(accounts[0], INIT_BAL, { from: owner }),
- rep.approve.sendTransactionAsync(tokenTransferProxy.address, INIT_ALLOW, {
- from: accounts[1],
- }),
- rep.setBalance.sendTransactionAsync(accounts[1], INIT_BAL, { from: owner }),
- ]);
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
-
- describe('transferFrom', () => {
- it('should throw when called by an unauthorized address', async () => {
- expect(
- tokenTransferProxy.transferFrom.sendTransactionAsync(
- rep.address,
- accounts[0],
- accounts[1],
- new BigNumber(1000),
- {
- from: notAuthorized,
- },
- ),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should allow an authorized address to transfer', async () => {
- const balances = await dmyBalances.getAsync();
-
- await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(notAuthorized, {
- from: owner,
- });
- const transferAmt = new BigNumber(10000);
- await tokenTransferProxy.transferFrom.sendTransactionAsync(
- rep.address,
- accounts[0],
- accounts[1],
- transferAmt,
- {
- from: notAuthorized,
- },
- );
-
- const newBalances = await dmyBalances.getAsync();
- expect(newBalances[accounts[0]][rep.address]).to.be.bignumber.equal(
- balances[accounts[0]][rep.address].minus(transferAmt),
- );
- expect(newBalances[accounts[1]][rep.address]).to.be.bignumber.equal(
- balances[accounts[1]][rep.address].add(transferAmt),
- );
- });
- });
-});
diff --git a/packages/contracts/test/tokens/ether_token.ts b/packages/contracts/test/tokens/ether_token.ts
new file mode 100644
index 000000000..a104fc915
--- /dev/null
+++ b/packages/contracts/test/tokens/ether_token.ts
@@ -0,0 +1,138 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+
+import { WETH9Contract } from '../../generated_contract_wrappers/weth9';
+import { artifacts } from '../utils/artifacts';
+import { expectInsufficientFundsAsync, expectTransactionFailedWithoutReasonAsync } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('EtherToken', () => {
+ let account: string;
+ const gasPrice = Web3Wrapper.toBaseUnitAmount(new BigNumber(20), 9);
+ let etherToken: WETH9Contract;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ account = accounts[0];
+
+ etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, {
+ gasPrice,
+ ...txDefaults,
+ });
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('deposit', () => {
+ it('should throw if caller attempts to deposit more Ether than caller balance', async () => {
+ const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const ethToDeposit = initEthBalance.plus(1);
+
+ return expectInsufficientFundsAsync(etherToken.deposit.sendTransactionAsync({ value: ethToDeposit }));
+ });
+
+ it('should convert deposited Ether to wrapped Ether tokens', async () => {
+ const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const initEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+
+ const ethToDeposit = new BigNumber(Web3Wrapper.toWei(new BigNumber(1)));
+
+ const txHash = await etherToken.deposit.sendTransactionAsync({ value: ethToDeposit });
+ const receipt = await web3Wrapper.awaitTransactionSuccessAsync(
+ txHash,
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
+ const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+
+ expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas)));
+ expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit));
+ });
+ });
+
+ describe('withdraw', () => {
+ it('should throw if caller attempts to withdraw greater than caller balance', async () => {
+ const initEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+ const ethTokensToWithdraw = initEthTokenBalance.plus(1);
+
+ return expectTransactionFailedWithoutReasonAsync(
+ etherToken.withdraw.sendTransactionAsync(ethTokensToWithdraw),
+ );
+ });
+
+ it('should convert ether tokens to ether with sufficient balance', async () => {
+ const ethToDeposit = new BigNumber(Web3Wrapper.toWei(new BigNumber(1)));
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await etherToken.deposit.sendTransactionAsync({ value: ethToDeposit }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const initEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+ const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const ethTokensToWithdraw = initEthTokenBalance;
+ expect(ethTokensToWithdraw).to.not.be.bignumber.equal(0);
+ const txHash = await etherToken.withdraw.sendTransactionAsync(ethTokensToWithdraw, {
+ gas: constants.MAX_ETHERTOKEN_WITHDRAW_GAS,
+ });
+ const receipt = await web3Wrapper.awaitTransactionSuccessAsync(
+ txHash,
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
+ const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+
+ expect(finalEthBalance).to.be.bignumber.equal(
+ initEthBalance.plus(ethTokensToWithdraw.minus(ethSpentOnGas)),
+ );
+ expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.minus(ethTokensToWithdraw));
+ });
+ });
+
+ describe('fallback', () => {
+ it('should convert sent ether to ether tokens', async () => {
+ const initEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const initEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+
+ const ethToDeposit = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18);
+
+ const txHash = await web3Wrapper.sendTransactionAsync({
+ from: account,
+ to: etherToken.address,
+ value: ethToDeposit,
+ gasPrice,
+ });
+
+ const receipt = await web3Wrapper.awaitTransactionSuccessAsync(
+ txHash,
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const ethSpentOnGas = gasPrice.times(receipt.gasUsed);
+ const finalEthBalance = await web3Wrapper.getBalanceInWeiAsync(account);
+ const finalEthTokenBalance = await etherToken.balanceOf.callAsync(account);
+
+ expect(finalEthBalance).to.be.bignumber.equal(initEthBalance.minus(ethToDeposit.plus(ethSpentOnGas)));
+ expect(finalEthTokenBalance).to.be.bignumber.equal(initEthTokenBalance.plus(ethToDeposit));
+ });
+ });
+});
diff --git a/packages/contracts/test/tokens/unlimited_allowance_token.ts b/packages/contracts/test/tokens/unlimited_allowance_token.ts
new file mode 100644
index 000000000..81d931fc5
--- /dev/null
+++ b/packages/contracts/test/tokens/unlimited_allowance_token.ts
@@ -0,0 +1,191 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { RevertReason } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { artifacts } from '../utils/artifacts';
+import { expectContractCallFailed } from '../utils/assertions';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('UnlimitedAllowanceToken', () => {
+ let owner: string;
+ let spender: string;
+ const MAX_MINT_VALUE = new BigNumber(100000000000000000000);
+ let token: DummyERC20TokenContract;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ owner = accounts[0];
+ spender = accounts[1];
+ token = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC20Token,
+ provider,
+ txDefaults,
+ constants.DUMMY_TOKEN_NAME,
+ constants.DUMMY_TOKEN_SYMBOL,
+ constants.DUMMY_TOKEN_DECIMALS,
+ constants.DUMMY_TOKEN_TOTAL_SUPPLY,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.mint.sendTransactionAsync(MAX_MINT_VALUE, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('transfer', () => {
+ it('should throw if owner has insufficient balance', async () => {
+ const ownerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = ownerBalance.plus(1);
+ return expectContractCallFailed(
+ token.transfer.callAsync(spender, amountToTransfer, { from: owner }),
+ RevertReason.Erc20InsufficientBalance,
+ );
+ });
+
+ it('should transfer balance from sender to receiver', async () => {
+ const receiver = spender;
+ const initOwnerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = new BigNumber(1);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.transfer.sendTransactionAsync(receiver, amountToTransfer, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const finalOwnerBalance = await token.balanceOf.callAsync(owner);
+ const finalReceiverBalance = await token.balanceOf.callAsync(receiver);
+
+ const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer);
+ const expectedFinalReceiverBalance = amountToTransfer;
+ expect(finalOwnerBalance).to.be.bignumber.equal(expectedFinalOwnerBalance);
+ expect(finalReceiverBalance).to.be.bignumber.equal(expectedFinalReceiverBalance);
+ });
+
+ it('should return true on a 0 value transfer', async () => {
+ const didReturnTrue = await token.transfer.callAsync(spender, new BigNumber(0), {
+ from: owner,
+ });
+ expect(didReturnTrue).to.be.true();
+ });
+ });
+
+ describe('transferFrom', () => {
+ it('should throw if owner has insufficient balance', async () => {
+ const ownerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = ownerBalance.plus(1);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.approve.sendTransactionAsync(spender, amountToTransfer, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ return expectContractCallFailed(
+ token.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ }),
+ RevertReason.Erc20InsufficientBalance,
+ );
+ });
+
+ it('should throw if spender has insufficient allowance', async () => {
+ const ownerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = ownerBalance;
+
+ const spenderAllowance = await token.allowance.callAsync(owner, spender);
+ const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0;
+ expect(isSpenderAllowanceInsufficient).to.be.true();
+
+ return expectContractCallFailed(
+ token.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ }),
+ RevertReason.Erc20InsufficientAllowance,
+ );
+ });
+
+ it('should return true on a 0 value transfer', async () => {
+ const amountToTransfer = new BigNumber(0);
+ const didReturnTrue = await token.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ });
+ expect(didReturnTrue).to.be.true();
+ });
+
+ it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => {
+ const initOwnerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = initOwnerBalance;
+ const initSpenderAllowance = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newSpenderAllowance = await token.allowance.callAsync(owner, spender);
+ expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance);
+ });
+
+ it('should transfer the correct balances if spender has sufficient allowance', async () => {
+ const initOwnerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = initOwnerBalance;
+ const initSpenderAllowance = initOwnerBalance;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newOwnerBalance = await token.balanceOf.callAsync(owner);
+ const newSpenderBalance = await token.balanceOf.callAsync(spender);
+
+ expect(newOwnerBalance).to.be.bignumber.equal(0);
+ expect(newSpenderBalance).to.be.bignumber.equal(initOwnerBalance);
+ });
+
+ it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => {
+ const initOwnerBalance = await token.balanceOf.callAsync(owner);
+ const amountToTransfer = initOwnerBalance;
+ const initSpenderAllowance = initOwnerBalance;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.approve.sendTransactionAsync(spender, initSpenderAllowance, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await token.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newSpenderAllowance = await token.allowance.callAsync(owner, spender);
+ expect(newSpenderAllowance).to.be.bignumber.equal(0);
+ });
+ });
+});
diff --git a/packages/contracts/test/tokens/zrx_token.ts b/packages/contracts/test/tokens/zrx_token.ts
new file mode 100644
index 000000000..a0d77c924
--- /dev/null
+++ b/packages/contracts/test/tokens/zrx_token.ts
@@ -0,0 +1,206 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+
+import { ZRXTokenContract } from '../../generated_contract_wrappers/zrx_token';
+import { artifacts } from '../utils/artifacts';
+import { chaiSetup } from '../utils/chai_setup';
+import { constants } from '../utils/constants';
+import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ZRXToken', () => {
+ let owner: string;
+ let spender: string;
+ let MAX_UINT: BigNumber;
+ let zrxToken: ZRXTokenContract;
+
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ before(async () => {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ owner = accounts[0];
+ spender = accounts[1];
+ zrxToken = await ZRXTokenContract.deployFrom0xArtifactAsync(artifacts.ZRX, provider, txDefaults);
+ MAX_UINT = constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('constants', () => {
+ it('should have 18 decimals', async () => {
+ const decimals = new BigNumber(await zrxToken.decimals.callAsync());
+ const expectedDecimals = 18;
+ expect(decimals).to.be.bignumber.equal(expectedDecimals);
+ });
+
+ it('should have a total supply of 1 billion tokens', async () => {
+ const totalSupply = new BigNumber(await zrxToken.totalSupply.callAsync());
+ const expectedTotalSupply = 1000000000;
+ expect(Web3Wrapper.toUnitAmount(totalSupply, 18)).to.be.bignumber.equal(expectedTotalSupply);
+ });
+
+ it('should be named 0x Protocol Token', async () => {
+ const name = await zrxToken.name.callAsync();
+ const expectedName = '0x Protocol Token';
+ expect(name).to.be.equal(expectedName);
+ });
+
+ it('should have the symbol ZRX', async () => {
+ const symbol = await zrxToken.symbol.callAsync();
+ const expectedSymbol = 'ZRX';
+ expect(symbol).to.be.equal(expectedSymbol);
+ });
+ });
+
+ describe('constructor', () => {
+ it('should initialize owner balance to totalSupply', async () => {
+ const ownerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const totalSupply = new BigNumber(await zrxToken.totalSupply.callAsync());
+ expect(totalSupply).to.be.bignumber.equal(ownerBalance);
+ });
+ });
+
+ describe('transfer', () => {
+ it('should transfer balance from sender to receiver', async () => {
+ const receiver = spender;
+ const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const amountToTransfer = new BigNumber(1);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.transfer.sendTransactionAsync(receiver, amountToTransfer, { from: owner }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const finalOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const finalReceiverBalance = await zrxToken.balanceOf.callAsync(receiver);
+
+ const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer);
+ const expectedFinalReceiverBalance = amountToTransfer;
+ expect(finalOwnerBalance).to.be.bignumber.equal(expectedFinalOwnerBalance);
+ expect(finalReceiverBalance).to.be.bignumber.equal(expectedFinalReceiverBalance);
+ });
+
+ it('should return true on a 0 value transfer', async () => {
+ const didReturnTrue = await zrxToken.transfer.callAsync(spender, new BigNumber(0), {
+ from: owner,
+ });
+ expect(didReturnTrue).to.be.true();
+ });
+ });
+
+ describe('transferFrom', () => {
+ it('should return false if owner has insufficient balance', async () => {
+ const ownerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const amountToTransfer = ownerBalance.plus(1);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.approve.sendTransactionAsync(spender, amountToTransfer, {
+ from: owner,
+ gas: constants.MAX_TOKEN_APPROVE_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ const didReturnTrue = await zrxToken.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ });
+ expect(didReturnTrue).to.be.false();
+ });
+
+ it('should return false if spender has insufficient allowance', async () => {
+ const ownerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const amountToTransfer = ownerBalance;
+
+ const spenderAllowance = await zrxToken.allowance.callAsync(owner, spender);
+ const isSpenderAllowanceInsufficient = spenderAllowance.cmp(amountToTransfer) < 0;
+ expect(isSpenderAllowanceInsufficient).to.be.true();
+
+ const didReturnTrue = await zrxToken.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ });
+ expect(didReturnTrue).to.be.false();
+ });
+
+ it('should return true on a 0 value transfer', async () => {
+ const amountToTransfer = new BigNumber(0);
+ const didReturnTrue = await zrxToken.transferFrom.callAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ });
+ expect(didReturnTrue).to.be.true();
+ });
+
+ it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => {
+ const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const amountToTransfer = initOwnerBalance;
+ const initSpenderAllowance = MAX_UINT;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.approve.sendTransactionAsync(spender, initSpenderAllowance, {
+ from: owner,
+ gas: constants.MAX_TOKEN_APPROVE_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newSpenderAllowance = await zrxToken.allowance.callAsync(owner, spender);
+ expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance);
+ });
+
+ it('should transfer the correct balances if spender has sufficient allowance', async () => {
+ const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const initSpenderBalance = await zrxToken.balanceOf.callAsync(spender);
+ const amountToTransfer = initOwnerBalance;
+ const initSpenderAllowance = initOwnerBalance;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.approve.sendTransactionAsync(spender, initSpenderAllowance),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const newSpenderBalance = await zrxToken.balanceOf.callAsync(spender);
+
+ expect(newOwnerBalance).to.be.bignumber.equal(0);
+ expect(newSpenderBalance).to.be.bignumber.equal(initSpenderBalance.plus(initOwnerBalance));
+ });
+
+ it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => {
+ const initOwnerBalance = await zrxToken.balanceOf.callAsync(owner);
+ const amountToTransfer = initOwnerBalance;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.approve.sendTransactionAsync(spender, amountToTransfer),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await zrxToken.transferFrom.sendTransactionAsync(owner, spender, amountToTransfer, {
+ from: spender,
+ gas: constants.MAX_TOKEN_TRANSFERFROM_GAS,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const newSpenderAllowance = await zrxToken.allowance.callAsync(owner, spender);
+ expect(newSpenderAllowance).to.be.bignumber.equal(0);
+ });
+ });
+});
diff --git a/packages/contracts/test/tutorials/arbitrage.ts b/packages/contracts/test/tutorials/arbitrage.ts
index b2bbaf420..6851483cc 100644
--- a/packages/contracts/test/tutorials/arbitrage.ts
+++ b/packages/contracts/test/tutorials/arbitrage.ts
@@ -1,225 +1,260 @@
-import { ECSignature, SignedOrder, ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import ethUtil = require('ethereumjs-util');
-import * as Web3 from 'web3';
+// import { ECSignature, SignedOrder, ZeroEx } from '0x.js';
+// import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
+// import { ExchangeContractErrs } from 'ethereum-types';
+// import { BigNumber } from '@0xproject/utils';
+// import { Web3Wrapper } from '@0xproject/web3-wrapper';
+// import * as chai from 'chai';
+// import ethUtil = require('ethereumjs-util');
+// import * as Web3 from 'web3';
-import { ArbitrageContract } from '../../src/contract_wrappers/generated/arbitrage';
-import { EtherDeltaContract } from '../../src/contract_wrappers/generated/ether_delta';
-import { ExchangeContract } from '../../src/contract_wrappers/generated/exchange';
-import { Balances } from '../../util/balances';
-import { constants } from '../../util/constants';
-import { crypto } from '../../util/crypto';
-import { ExchangeWrapper } from '../../util/exchange_wrapper';
-import { OrderFactory } from '../../util/order_factory';
-import { BalancesByOwner, ContractName, ExchangeContractErrs } from '../../util/types';
-import { chaiSetup } from '../utils/chai_setup';
-import { deployer } from '../utils/deployer';
-import { web3, web3Wrapper } from '../utils/web3_wrapper';
+// import { AccountLevelsContract } from '../../src/generated_contract_wrappers/account_levels';
+// import { ArbitrageContract } from '../../src/generated_contract_wrappers/arbitrage';
+// import { DummyTokenContract } from '../../src/generated_contract_wrappers/dummy_token';
+// import { EtherDeltaContract } from '../../src/generated_contract_wrappers/ether_delta';
+// import { ExchangeContract } from '../../src/generated_contract_wrappers/exchange';
+// import { TokenTransferProxyContract } from '../../src/generated_contract_wrappers/token_transfer_proxy';
+// import { artifacts } from '../../util/artifacts';
+// import { Balances } from '../../util/balances';
+// import { constants } from '../../util/constants';
+// import { crypto } from '../../util/crypto';
+// import { ExchangeWrapper } from '../../util/exchange_wrapper';
+// import { OrderFactory } from '../../util/order_factory';
+// import { BalancesByOwner, ContractName } from '../../util/types';
+// import { chaiSetup } from '../utils/chai_setup';
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// import { provider, txDefaults, web3Wrapper } from '../utils/web3_wrapper';
-describe('Arbitrage', () => {
- let coinbase: string;
- let maker: string;
- let edMaker: string;
- let edFrontRunner: string;
- let amountGet: BigNumber;
- let amountGive: BigNumber;
- let makerTokenAmount: BigNumber;
- let takerTokenAmount: BigNumber;
- const feeRecipient = ZeroEx.NULL_ADDRESS;
- const INITIAL_BALANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
- const INITIAL_ALLOWANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
+// chaiSetup.configure();
+// const expect = chai.expect;
+// const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
- let weth: Web3.ContractInstance;
- let zrx: Web3.ContractInstance;
- let arbitrage: ArbitrageContract;
- let etherDelta: EtherDeltaContract;
+// describe('Arbitrage', () => {
+// let coinbase: string;
+// let maker: string;
+// let edMaker: string;
+// let edFrontRunner: string;
+// let amountGet: BigNumber;
+// let amountGive: BigNumber;
+// let makerTokenAmount: BigNumber;
+// let takerTokenAmount: BigNumber;
+// const feeRecipient = constants.NULL_ADDRESS;
+// const INITIAL_BALANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
+// const INITIAL_ALLOWANCE = ZeroEx.toBaseUnitAmount(new BigNumber(10000), 18);
- let signedOrder: SignedOrder;
- let exWrapper: ExchangeWrapper;
- let orderFactory: OrderFactory;
+// let weth: DummyTokenContract;
+// let zrx: DummyTokenContract;
+// let arbitrage: ArbitrageContract;
+// let etherDelta: EtherDeltaContract;
- let zeroEx: ZeroEx;
+// let signedOrder: SignedOrder;
+// let exWrapper: ExchangeWrapper;
+// let orderFactory: OrderFactory;
- // From a bird's eye view - we create two orders.
- // 0x order of 1 ZRX (maker) for 1 WETH (taker)
- // ED order of 2 WETH (tokenGive) for 1 ZRX (tokenGet)
- // And then we do an atomic arbitrage between them which gives us 1 WETH.
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- [coinbase, maker, edMaker, edFrontRunner] = accounts;
- weth = await deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS);
- zrx = await deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS);
- const accountLevels = await deployer.deployAsync(ContractName.AccountLevels);
- const edAdminAddress = accounts[0];
- const edMakerFee = 0;
- const edTakerFee = 0;
- const edFeeRebate = 0;
- const etherDeltaInstance = await deployer.deployAsync(ContractName.EtherDelta, [
- edAdminAddress,
- feeRecipient,
- accountLevels.address,
- edMakerFee,
- edTakerFee,
- edFeeRebate,
- ]);
- etherDelta = new EtherDeltaContract(web3Wrapper, etherDeltaInstance.abi, etherDeltaInstance.address);
- const tokenTransferProxy = await deployer.deployAsync(ContractName.TokenTransferProxy);
- const exchangeInstance = await deployer.deployAsync(ContractName.Exchange, [
- zrx.address,
- tokenTransferProxy.address,
- ]);
- await tokenTransferProxy.addAuthorizedAddress(exchangeInstance.address, { from: accounts[0] });
- zeroEx = new ZeroEx(web3.currentProvider, {
- exchangeContractAddress: exchangeInstance.address,
- networkId: constants.TESTRPC_NETWORK_ID,
- });
- const exchange = new ExchangeContract(web3Wrapper, exchangeInstance.abi, exchangeInstance.address);
- exWrapper = new ExchangeWrapper(exchange, zeroEx);
+// let zeroEx: ZeroEx;
- makerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), 18);
- takerTokenAmount = makerTokenAmount;
- const defaultOrderParams = {
- exchangeContractAddress: exchange.address,
- maker,
- feeRecipient,
- makerTokenAddress: zrx.address,
- takerTokenAddress: weth.address,
- makerTokenAmount,
- takerTokenAmount,
- makerFee: new BigNumber(0),
- takerFee: new BigNumber(0),
- };
- orderFactory = new OrderFactory(zeroEx, defaultOrderParams);
- const arbitrageInstance = await deployer.deployAsync(ContractName.Arbitrage, [
- exchange.address,
- etherDelta.address,
- tokenTransferProxy.address,
- ]);
- arbitrage = new ArbitrageContract(web3Wrapper, arbitrageInstance.abi, arbitrageInstance.address);
- // Enable arbitrage and withdrawals of tokens
- await arbitrage.setAllowances.sendTransactionAsync(weth.address, { from: coinbase });
- await arbitrage.setAllowances.sendTransactionAsync(zrx.address, { from: coinbase });
+// // From a bird's eye view - we create two orders.
+// // 0x order of 1 ZRX (maker) for 1 WETH (taker)
+// // ED order of 2 WETH (tokenGive) for 1 ZRX (tokenGet)
+// // And then we do an atomic arbitrage between them which gives us 1 WETH.
+// before(async () => {
+// const accounts = await web3Wrapper.getAvailableAddressesAsync();
+// [coinbase, maker, edMaker, edFrontRunner] = accounts;
+// weth = await DummyTokenContract.deployFrom0xArtifactAsync(
+// artifacts.DummyToken,
+// provider,
+// txDefaults,
+// constants.DUMMY_TOKEN_NAME,
+// constants.DUMMY_TOKEN_SYMBOL,
+// constants.DUMMY_TOKEN_DECIMALS,
+// constants.DUMMY_TOKEN_TOTAL_SUPPLY,
+// );
+// zrx = await DummyTokenContract.deployFrom0xArtifactAsync(
+// artifacts.DummyToken,
+// provider,
+// txDefaults,
+// constants.DUMMY_TOKEN_NAME,
+// constants.DUMMY_TOKEN_SYMBOL,
+// constants.DUMMY_TOKEN_DECIMALS,
+// constants.DUMMY_TOKEN_TOTAL_SUPPLY,
+// );
+// const accountLevels = await AccountLevelsContract.deployFrom0xArtifactAsync(
+// artifacts.AccountLevels,
+// provider,
+// txDefaults,
+// );
+// const edAdminAddress = accounts[0];
+// const edMakerFee = new BigNumber(0);
+// const edTakerFee = new BigNumber(0);
+// const edFeeRebate = new BigNumber(0);
+// etherDelta = await EtherDeltaContract.deployFrom0xArtifactAsync(
+// artifacts.EtherDelta,
+// provider,
+// txDefaults,
+// edAdminAddress,
+// feeRecipient,
+// accountLevels.address,
+// edMakerFee,
+// edTakerFee,
+// edFeeRebate,
+// );
+// const tokenTransferProxy = await TokenTransferProxyContract.deployFrom0xArtifactAsync(
+// artifacts.TokenTransferProxy,
+// provider,
+// txDefaults,
+// );
+// const exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+// artifacts.Exchange,
+// provider,
+// txDefaults,
+// zrx.address,
+// tokenTransferProxy.address,
+// );
+// await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: accounts[0] });
+// zeroEx = new ZeroEx(provider, {
+// exchangeContractAddress: exchange.address,
+// networkId: constants.TESTRPC_NETWORK_ID,
+// });
+// exWrapper = new ExchangeWrapper(exchange, provider);
- // Give some tokens to arbitrage contract
- await weth.setBalance(arbitrage.address, takerTokenAmount, { from: coinbase });
+// makerTokenAmount = ZeroEx.toBaseUnitAmount(new BigNumber(1), 18);
+// takerTokenAmount = makerTokenAmount;
+// const defaultOrderParams = {
+// exchangeContractAddress: exchange.address,
+// maker,
+// feeRecipient,
+// makerTokenAddress: zrx.address,
+// takerTokenAddress: weth.address,
+// makerTokenAmount,
+// takerTokenAmount,
+// makerFee: new BigNumber(0),
+// takerFee: new BigNumber(0),
+// };
+// orderFactory = new OrderFactory(zeroEx, defaultOrderParams);
+// arbitrage = await ArbitrageContract.deployFrom0xArtifactAsync(
+// artifacts.Arbitrage,
+// provider,
+// txDefaults,
+// exchange.address,
+// etherDelta.address,
+// tokenTransferProxy.address,
+// );
+// // Enable arbitrage and withdrawals of tokens
+// await arbitrage.setAllowances.sendTransactionAsync(weth.address, { from: coinbase });
+// await arbitrage.setAllowances.sendTransactionAsync(zrx.address, { from: coinbase });
- // Fund the maker on exchange side
- await zrx.setBalance(maker, makerTokenAmount, { from: coinbase });
- // Set the allowance for the maker on Exchange side
- await zrx.approve(tokenTransferProxy.address, INITIAL_ALLOWANCE, { from: maker });
+// // Give some tokens to arbitrage contract
+// await weth.setBalance.sendTransactionAsync(arbitrage.address, takerTokenAmount, { from: coinbase });
- amountGive = ZeroEx.toBaseUnitAmount(new BigNumber(2), 18);
- // Fund the maker on EtherDelta side
- await weth.setBalance(edMaker, amountGive, { from: coinbase });
- // Set the allowance for the maker on EtherDelta side
- await weth.approve(etherDelta.address, INITIAL_ALLOWANCE, { from: edMaker });
- // Deposit maker funds into EtherDelta
- await etherDelta.depositToken.sendTransactionAsync(weth.address, amountGive, { from: edMaker });
+// // Fund the maker on exchange side
+// await zrx.setBalance.sendTransactionAsync(maker, makerTokenAmount, { from: coinbase });
+// // Set the allowance for the maker on Exchange side
+// await zrx.approve.sendTransactionAsync(tokenTransferProxy.address, INITIAL_ALLOWANCE, { from: maker });
- amountGet = makerTokenAmount;
- // Fund the front runner on EtherDelta side
- await zrx.setBalance(edFrontRunner, amountGet, { from: coinbase });
- // Set the allowance for the front-runner on EtherDelta side
- await zrx.approve(etherDelta.address, INITIAL_ALLOWANCE, { from: edFrontRunner });
- // Deposit front runner funds into EtherDelta
- await etherDelta.depositToken.sendTransactionAsync(zrx.address, amountGet, { from: edFrontRunner });
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('makeAtomicTrade', () => {
- let addresses: string[];
- let values: BigNumber[];
- let v: number[];
- let r: string[];
- let s: string[];
- let tokenGet: string;
- let tokenGive: string;
- let expires: BigNumber;
- let nonce: BigNumber;
- let edSignature: ECSignature;
- before(async () => {
- signedOrder = await orderFactory.newSignedOrderAsync();
- tokenGet = zrx.address;
- tokenGive = weth.address;
- const blockNumber = await web3Wrapper.getBlockNumberAsync();
- const ED_ORDER_EXPIRATION_IN_BLOCKS = 10;
- expires = new BigNumber(blockNumber + ED_ORDER_EXPIRATION_IN_BLOCKS);
- nonce = new BigNumber(42);
- const edOrderHash = `0x${crypto
- .solSHA256([etherDelta.address, tokenGet, amountGet, tokenGive, amountGive, expires, nonce])
- .toString('hex')}`;
- const shouldAddPersonalMessagePrefix = false;
- edSignature = await zeroEx.signOrderHashAsync(edOrderHash, edMaker, shouldAddPersonalMessagePrefix);
- addresses = [
- signedOrder.maker,
- signedOrder.taker,
- signedOrder.makerTokenAddress,
- signedOrder.takerTokenAddress,
- signedOrder.feeRecipient,
- edMaker,
- ];
- const fillTakerTokenAmount = takerTokenAmount;
- const edFillAmount = makerTokenAmount;
- values = [
- signedOrder.makerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- signedOrder.takerFee,
- signedOrder.expirationUnixTimestampSec,
- signedOrder.salt,
- fillTakerTokenAmount,
- amountGet,
- amountGive,
- expires,
- nonce,
- edFillAmount,
- ];
- v = [signedOrder.ecSignature.v, edSignature.v];
- r = [signedOrder.ecSignature.r, edSignature.r];
- s = [signedOrder.ecSignature.s, edSignature.s];
- });
- it('should successfully execute the arbitrage if not front-runned', async () => {
- const txHash = await arbitrage.makeAtomicTrade.sendTransactionAsync(addresses, values, v, r, s, {
- from: coinbase,
- });
- const res = await zeroEx.awaitTransactionMinedAsync(txHash);
- const postBalance = await weth.balanceOf(arbitrage.address);
- expect(postBalance).to.be.bignumber.equal(amountGive);
- });
- it('should fail and revert if front-runned', async () => {
- const preBalance = await weth.balanceOf(arbitrage.address);
- // Front-running transaction
- await etherDelta.trade.sendTransactionAsync(
- tokenGet,
- amountGet,
- tokenGive,
- amountGive,
- expires,
- nonce,
- edMaker,
- edSignature.v,
- edSignature.r,
- edSignature.s,
- amountGet,
- { from: edFrontRunner },
- );
- // tslint:disable-next-line:await-promise
- await expect(
- arbitrage.makeAtomicTrade.sendTransactionAsync(addresses, values, v, r, s, { from: coinbase }),
- ).to.be.rejectedWith(constants.REVERT);
- const postBalance = await weth.balanceOf(arbitrage.address);
- expect(preBalance).to.be.bignumber.equal(postBalance);
- });
- });
-});
+// amountGive = ZeroEx.toBaseUnitAmount(new BigNumber(2), 18);
+// // Fund the maker on EtherDelta side
+// await weth.setBalance.sendTransactionAsync(edMaker, amountGive, { from: coinbase });
+// // Set the allowance for the maker on EtherDelta side
+// await weth.approve.sendTransactionAsync(etherDelta.address, INITIAL_ALLOWANCE, { from: edMaker });
+// // Deposit maker funds into EtherDelta
+// await etherDelta.depositToken.sendTransactionAsync(weth.address, amountGive, { from: edMaker });
+
+// amountGet = makerTokenAmount;
+// // Fund the front runner on EtherDelta side
+// await zrx.setBalance.sendTransactionAsync(edFrontRunner, amountGet, { from: coinbase });
+// // Set the allowance for the front-runner on EtherDelta side
+// await zrx.approve.sendTransactionAsync(etherDelta.address, INITIAL_ALLOWANCE, { from: edFrontRunner });
+// // Deposit front runner funds into EtherDelta
+// await etherDelta.depositToken.sendTransactionAsync(zrx.address, amountGet, { from: edFrontRunner });
+// });
+// beforeEach(async () => {
+// await blockchainLifecycle.startAsync();
+// });
+// afterEach(async () => {
+// await blockchainLifecycle.revertAsync();
+// });
+// describe('makeAtomicTrade', () => {
+// let addresses: string[];
+// let values: BigNumber[];
+// let v: number[];
+// let r: string[];
+// let s: string[];
+// let tokenGet: string;
+// let tokenGive: string;
+// let expires: BigNumber;
+// let nonce: BigNumber;
+// let edSignature: ECSignature;
+// before(async () => {
+// signedOrder = await orderFactory.newSignedOrderAsync();
+// tokenGet = zrx.address;
+// tokenGive = weth.address;
+// const blockNumber = await web3Wrapper.getBlockNumberAsync();
+// const ED_ORDER_EXPIRATION_IN_BLOCKS = 10;
+// expires = new BigNumber(blockNumber + ED_ORDER_EXPIRATION_IN_BLOCKS);
+// nonce = new BigNumber(42);
+// const edOrderHash = `0x${crypto
+// .solSHA256([etherDelta.address, tokenGet, amountGet, tokenGive, amountGive, expires, nonce])
+// .toString('hex')}`;
+// const shouldAddPersonalMessagePrefix = false;
+// edSignature = await zeroEx.signOrderHashAsync(edOrderHash, edMaker, shouldAddPersonalMessagePrefix);
+// addresses = [
+// signedOrder.maker,
+// signedOrder.taker,
+// signedOrder.makerTokenAddress,
+// signedOrder.takerTokenAddress,
+// signedOrder.feeRecipient,
+// edMaker,
+// ];
+// const fillTakerTokenAmount = takerTokenAmount;
+// const edFillAmount = makerTokenAmount;
+// values = [
+// signedOrder.makerTokenAmount,
+// signedOrder.takerTokenAmount,
+// signedOrder.makerFee,
+// signedOrder.takerFee,
+// signedOrder.expirationUnixTimestampSec,
+// signedOrder.salt,
+// fillTakerTokenAmount,
+// amountGet,
+// amountGive,
+// expires,
+// nonce,
+// edFillAmount,
+// ];
+// v = [signedOrder.ecSignature.v, edSignature.v];
+// r = [signedOrder.ecSignature.r, edSignature.r];
+// s = [signedOrder.ecSignature.s, edSignature.s];
+// });
+// it('should successfully execute the arbitrage if not front-runned', async () => {
+// const txHash = await arbitrage.makeAtomicTrade.sendTransactionAsync(addresses, values, v, r, s, {
+// from: coinbase,
+// });
+// const res = await zeroEx.awaitTransactionMinedAsync(txHash);
+// const postBalance = await weth.balanceOf.callAsync(arbitrage.address);
+// expect(postBalance).to.be.bignumber.equal(amountGive);
+// });
+// it('should fail and revert if front-runned', async () => {
+// const preBalance = await weth.balanceOf.callAsync(arbitrage.address);
+// // Front-running transaction
+// await etherDelta.trade.sendTransactionAsync(
+// tokenGet,
+// amountGet,
+// tokenGive,
+// amountGive,
+// expires,
+// nonce,
+// edMaker,
+// edSignature.v,
+// edSignature.r,
+// edSignature.s,
+// amountGet,
+// { from: edFrontRunner },
+// );
+// // tslint:disable-next-line:await-promise
+// await expect(
+// arbitrage.makeAtomicTrade.sendTransactionAsync(addresses, values, v, r, s, { from: coinbase }),
+// ).to.be.rejectedWith(constants.REVERT);
+// const postBalance = await weth.balanceOf.callAsync(arbitrage.address);
+// expect(preBalance).to.be.bignumber.equal(postBalance);
+// });
+// });
+// });
diff --git a/packages/contracts/test/unlimited_allowance_token.ts b/packages/contracts/test/unlimited_allowance_token.ts
deleted file mode 100644
index c1c518adc..000000000
--- a/packages/contracts/test/unlimited_allowance_token.ts
+++ /dev/null
@@ -1,155 +0,0 @@
-import { ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import { DummyTokenContract } from '../src/contract_wrappers/generated/dummy_token';
-import { constants } from '../util/constants';
-import { ContractName } from '../util/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('UnlimitedAllowanceToken', () => {
- let owner: string;
- let spender: string;
- const config = {
- networkId: constants.TESTRPC_NETWORK_ID,
- };
- const zeroEx = new ZeroEx(web3.currentProvider, config);
-
- const MAX_MINT_VALUE = new BigNumber(100000000000000000000);
- let tokenAddress: string;
- let token: DummyTokenContract;
-
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- owner = accounts[0];
- spender = accounts[1];
- const tokenInstance = await deployer.deployAsync(ContractName.DummyToken, constants.DUMMY_TOKEN_ARGS);
- token = new DummyTokenContract(web3Wrapper, tokenInstance.abi, tokenInstance.address);
- await token.mint.sendTransactionAsync(MAX_MINT_VALUE, { from: owner });
- tokenAddress = token.address;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('transfer', () => {
- it('should throw if owner has insufficient balance', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = ownerBalance.plus(1);
- return expect(token.transfer.callAsync(spender, amountToTransfer, { from: owner })).to.be.rejectedWith(
- constants.REVERT,
- );
- });
-
- it('should transfer balance from sender to receiver', async () => {
- const receiver = spender;
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = new BigNumber(1);
- await zeroEx.token.transferAsync(tokenAddress, owner, receiver, amountToTransfer);
- const finalOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const finalReceiverBalance = await zeroEx.token.getBalanceAsync(tokenAddress, receiver);
-
- const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer);
- const expectedFinalReceiverBalance = amountToTransfer;
- expect(finalOwnerBalance).to.be.bignumber.equal(expectedFinalOwnerBalance);
- expect(finalReceiverBalance).to.be.bignumber.equal(expectedFinalReceiverBalance);
- });
-
- it('should return true on a 0 value transfer', async () => {
- const didReturnTrue = await token.transfer.callAsync(spender, new BigNumber(0), {
- from: owner,
- });
- expect(didReturnTrue).to.be.true();
- });
- });
-
- describe('transferFrom', () => {
- it('should throw if owner has insufficient balance', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = ownerBalance.plus(1);
- await zeroEx.token.setAllowanceAsync(tokenAddress, owner, spender, amountToTransfer);
- return expect(
- token.transferFrom.callAsync(owner, spender, amountToTransfer, {
- from: spender,
- }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should throw if spender has insufficient allowance', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = ownerBalance;
-
- const spenderAllowance = await zeroEx.token.getAllowanceAsync(tokenAddress, owner, spender);
- const spenderAllowanceIsInsufficient = spenderAllowance.cmp(amountToTransfer) < 0;
- expect(spenderAllowanceIsInsufficient).to.be.true();
-
- return expect(
- token.transferFrom.callAsync(owner, spender, amountToTransfer, {
- from: spender,
- }),
- ).to.be.rejectedWith(constants.REVERT);
- });
-
- it('should return true on a 0 value transfer', async () => {
- const amountToTransfer = new BigNumber(0);
- const didReturnTrue = await token.transferFrom.callAsync(owner, spender, amountToTransfer, {
- from: spender,
- });
- expect(didReturnTrue).to.be.true();
- });
-
- it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = initOwnerBalance;
- const initSpenderAllowance = zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
- await zeroEx.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance);
- await zeroEx.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newSpenderAllowance = await zeroEx.token.getAllowanceAsync(tokenAddress, owner, spender);
- expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance);
- });
-
- it('should transfer the correct balances if spender has sufficient allowance', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = initOwnerBalance;
- const initSpenderAllowance = initOwnerBalance;
- await zeroEx.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance);
- await zeroEx.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const newSpenderBalance = await zeroEx.token.getBalanceAsync(tokenAddress, spender);
-
- expect(newOwnerBalance).to.be.bignumber.equal(0);
- expect(newSpenderBalance).to.be.bignumber.equal(initOwnerBalance);
- });
-
- it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(tokenAddress, owner);
- const amountToTransfer = initOwnerBalance;
- const initSpenderAllowance = initOwnerBalance;
- await zeroEx.token.setAllowanceAsync(tokenAddress, owner, spender, initSpenderAllowance);
- await zeroEx.token.transferFromAsync(tokenAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newSpenderAllowance = await zeroEx.token.getAllowanceAsync(tokenAddress, owner, spender);
- expect(newSpenderAllowance).to.be.bignumber.equal(0);
- });
- });
-});
diff --git a/packages/contracts/test/utils/abstract_asset_wrapper.ts b/packages/contracts/test/utils/abstract_asset_wrapper.ts
new file mode 100644
index 000000000..4b56a8502
--- /dev/null
+++ b/packages/contracts/test/utils/abstract_asset_wrapper.ts
@@ -0,0 +1,3 @@
+export abstract class AbstractAssetWrapper {
+ public abstract getProxyId(): string;
+}
diff --git a/packages/contracts/test/utils/address_utils.ts b/packages/contracts/test/utils/address_utils.ts
new file mode 100644
index 000000000..a9fb6921a
--- /dev/null
+++ b/packages/contracts/test/utils/address_utils.ts
@@ -0,0 +1,10 @@
+import { crypto, generatePseudoRandomSalt } from '@0xproject/order-utils';
+
+export const addressUtils = {
+ generatePseudoRandomAddress(): string {
+ const randomBigNum = generatePseudoRandomSalt();
+ const randomBuff = crypto.solSHA3([randomBigNum]);
+ const randomAddress = `0x${randomBuff.slice(0, 20).toString('hex')}`;
+ return randomAddress;
+ },
+};
diff --git a/packages/contracts/test/utils/artifacts.ts b/packages/contracts/test/utils/artifacts.ts
new file mode 100644
index 000000000..e608ee174
--- /dev/null
+++ b/packages/contracts/test/utils/artifacts.ts
@@ -0,0 +1,57 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as AssetProxyOwner from '../../artifacts/AssetProxyOwner.json';
+import * as DummyERC20Token from '../../artifacts/DummyERC20Token.json';
+import * as DummyERC721Receiver from '../../artifacts/DummyERC721Receiver.json';
+import * as DummyERC721Token from '../../artifacts/DummyERC721Token.json';
+import * as ERC20Proxy from '../../artifacts/ERC20Proxy.json';
+import * as ERC721Proxy from '../../artifacts/ERC721Proxy.json';
+import * as Exchange from '../../artifacts/Exchange.json';
+import * as ExchangeWrapper from '../../artifacts/ExchangeWrapper.json';
+import * as Forwarder from '../../artifacts/Forwarder.json';
+import * as IAssetProxy from '../../artifacts/IAssetProxy.json';
+import * as MixinAuthorizable from '../../artifacts/MixinAuthorizable.json';
+import * as MultiSigWallet from '../../artifacts/MultiSigWallet.json';
+import * as MultiSigWalletWithTimeLock from '../../artifacts/MultiSigWalletWithTimeLock.json';
+import * as TestAssetProxyDispatcher from '../../artifacts/TestAssetProxyDispatcher.json';
+import * as TestAssetProxyOwner from '../../artifacts/TestAssetProxyOwner.json';
+import * as TestConstants from '../../artifacts/TestConstants.json';
+import * as TestExchangeInternals from '../../artifacts/TestExchangeInternals.json';
+import * as TestLibBytes from '../../artifacts/TestLibBytes.json';
+import * as TestLibs from '../../artifacts/TestLibs.json';
+import * as TestSignatureValidator from '../../artifacts/TestSignatureValidator.json';
+import * as TokenRegistry from '../../artifacts/TokenRegistry.json';
+import * as Validator from '../../artifacts/Validator.json';
+import * as Wallet from '../../artifacts/Wallet.json';
+import * as EtherToken from '../../artifacts/WETH9.json';
+import * as Whitelist from '../../artifacts/Whitelist.json';
+import * as ZRX from '../../artifacts/ZRXToken.json';
+
+export const artifacts = {
+ AssetProxyOwner: (AssetProxyOwner as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ DummyERC721Receiver: (DummyERC721Receiver as any) as ContractArtifact,
+ DummyERC721Token: (DummyERC721Token as any) as ContractArtifact,
+ ERC20Proxy: (ERC20Proxy as any) as ContractArtifact,
+ ERC721Proxy: (ERC721Proxy as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ ExchangeWrapper: (ExchangeWrapper as any) as ContractArtifact,
+ EtherToken: (EtherToken as any) as ContractArtifact,
+ Forwarder: (Forwarder as any) as ContractArtifact,
+ IAssetProxy: (IAssetProxy as any) as ContractArtifact,
+ MixinAuthorizable: (MixinAuthorizable as any) as ContractArtifact,
+ MultiSigWallet: (MultiSigWallet as any) as ContractArtifact,
+ MultiSigWalletWithTimeLock: (MultiSigWalletWithTimeLock as any) as ContractArtifact,
+ TestAssetProxyOwner: (TestAssetProxyOwner as any) as ContractArtifact,
+ TestAssetProxyDispatcher: (TestAssetProxyDispatcher as any) as ContractArtifact,
+ TestConstants: (TestConstants as any) as ContractArtifact,
+ TestLibBytes: (TestLibBytes as any) as ContractArtifact,
+ TestLibs: (TestLibs as any) as ContractArtifact,
+ TestExchangeInternals: (TestExchangeInternals as any) as ContractArtifact,
+ TestSignatureValidator: (TestSignatureValidator as any) as ContractArtifact,
+ Validator: (Validator as any) as ContractArtifact,
+ Wallet: (Wallet as any) as ContractArtifact,
+ TokenRegistry: (TokenRegistry as any) as ContractArtifact,
+ Whitelist: (Whitelist as any) as ContractArtifact,
+ ZRX: (ZRX as any) as ContractArtifact,
+};
diff --git a/packages/contracts/test/utils/assertions.ts b/packages/contracts/test/utils/assertions.ts
new file mode 100644
index 000000000..61df800c8
--- /dev/null
+++ b/packages/contracts/test/utils/assertions.ts
@@ -0,0 +1,186 @@
+import { RevertReason } from '@0xproject/types';
+import { logUtils } from '@0xproject/utils';
+import { NodeType } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import { TransactionReceipt, TransactionReceiptStatus, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { web3Wrapper } from './web3_wrapper';
+
+const expect = chai.expect;
+
+let nodeType: NodeType | undefined;
+
+// Represents the return value of a `sendTransaction` call. The Promise should
+// resolve with either a transaction receipt or a transaction hash.
+export type sendTransactionResult = Promise<TransactionReceipt | TransactionReceiptWithDecodedLogs | string>;
+
+/**
+ * Returns ganacheError if the backing Ethereum node is Ganache and gethError
+ * if it is Geth.
+ * @param ganacheError the error to be returned if the backing node is Ganache.
+ * @param gethError the error to be returned if the backing node is Geth.
+ * @returns either the given ganacheError or gethError depending on the backing
+ * node.
+ */
+async function _getGanacheOrGethError(ganacheError: string, gethError: string): Promise<string> {
+ if (_.isUndefined(nodeType)) {
+ nodeType = await web3Wrapper.getNodeTypeAsync();
+ }
+ switch (nodeType) {
+ case NodeType.Ganache:
+ return ganacheError;
+ case NodeType.Geth:
+ return gethError;
+ default:
+ throw new Error(`Unknown node type: ${nodeType}`);
+ }
+}
+
+async function _getInsufficientFundsErrorMessageAsync(): Promise<string> {
+ return _getGanacheOrGethError("sender doesn't have enough funds", 'insufficient funds');
+}
+
+async function _getTransactionFailedErrorMessageAsync(): Promise<string> {
+ return _getGanacheOrGethError('revert', 'always failing transaction');
+}
+
+async function _getContractCallFailedErrorMessageAsync(): Promise<string> {
+ return _getGanacheOrGethError('revert', 'Contract call failed');
+}
+
+/**
+ * Returns the expected error message for an 'invalid opcode' resulting from a
+ * contract call. The exact error message depends on the backing Ethereum node.
+ */
+export async function getInvalidOpcodeErrorMessageForCallAsync(): Promise<string> {
+ return _getGanacheOrGethError('invalid opcode', 'Contract call failed');
+}
+
+/**
+ * Returns the expected error message for the given revert reason resulting from
+ * a sendTransaction call. The exact error message depends on the backing
+ * Ethereum node and whether it supports revert reasons.
+ * @param reason a specific revert reason.
+ * @returns the expected error message.
+ */
+export async function getRevertReasonOrErrorMessageForSendTransactionAsync(reason: RevertReason): Promise<string> {
+ return _getGanacheOrGethError(reason, 'always failing transaction');
+}
+
+/**
+ * Rejects if the given Promise does not reject with an error indicating
+ * insufficient funds.
+ * @param p a promise resulting from a contract call or sendTransaction call.
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectInsufficientFundsAsync<T>(p: Promise<T>): Promise<void> {
+ const errMessage = await _getInsufficientFundsErrorMessageAsync();
+ return expect(p).to.be.rejectedWith(errMessage);
+}
+
+/**
+ * Resolves if the the sendTransaction call fails with the given revert reason.
+ * However, since Geth does not support revert reasons for sendTransaction, this
+ * falls back to expectTransactionFailedWithoutReasonAsync if the backing
+ * Ethereum node is Geth.
+ * @param p a Promise resulting from a sendTransaction call
+ * @param reason a specific revert reason
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectTransactionFailedAsync(p: sendTransactionResult, reason: RevertReason): Promise<void> {
+ // HACK(albrow): This dummy `catch` should not be necessary, but if you
+ // remove it, there is an uncaught exception and the Node process will
+ // forcibly exit. It's possible this is a false positive in
+ // make-promises-safe.
+ p.catch(e => {
+ _.noop(e);
+ });
+
+ if (_.isUndefined(nodeType)) {
+ nodeType = await web3Wrapper.getNodeTypeAsync();
+ }
+ switch (nodeType) {
+ case NodeType.Ganache:
+ return expect(p).to.be.rejectedWith(reason);
+ case NodeType.Geth:
+ logUtils.warn(
+ 'WARNING: Geth does not support revert reasons for sendTransaction. This test will pass if the transaction fails for any reason.',
+ );
+ return expectTransactionFailedWithoutReasonAsync(p);
+ default:
+ throw new Error(`Unknown node type: ${nodeType}`);
+ }
+}
+
+/**
+ * Resolves if the transaction fails without a revert reason, or if the
+ * corresponding transactionReceipt has a status of 0 or '0', indicating
+ * failure.
+ * @param p a Promise resulting from a sendTransaction call
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectTransactionFailedWithoutReasonAsync(p: sendTransactionResult): Promise<void> {
+ return p
+ .then(async result => {
+ let txReceiptStatus: TransactionReceiptStatus;
+ if (_.isString(result)) {
+ // Result is a txHash. We need to make a web3 call to get the
+ // receipt, then get the status from the receipt.
+ const txReceipt = await web3Wrapper.awaitTransactionMinedAsync(result);
+ txReceiptStatus = txReceipt.status;
+ } else if ('status' in result) {
+ // Result is a transaction receipt, so we can get the status
+ // directly.
+ txReceiptStatus = result.status;
+ } else {
+ throw new Error('Unexpected result type: ' + typeof result);
+ }
+ expect(_.toString(txReceiptStatus)).to.equal(
+ '0',
+ 'Expected transaction to fail but receipt had a non-zero status, indicating success',
+ );
+ })
+ .catch(async err => {
+ // If the promise rejects, we expect a specific error message,
+ // depending on the backing Ethereum node type.
+ const errMessage = await _getTransactionFailedErrorMessageAsync();
+ expect(err.message).to.include(errMessage);
+ });
+}
+
+/**
+ * Resolves if the the contract call fails with the given revert reason.
+ * @param p a Promise resulting from a contract call
+ * @param reason a specific revert reason
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectContractCallFailed<T>(p: Promise<T>, reason: RevertReason): Promise<void> {
+ return expect(p).to.be.rejectedWith(reason);
+}
+
+/**
+ * Resolves if the contract call fails without a revert reason.
+ * @param p a Promise resulting from a contract call
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectContractCallFailedWithoutReasonAsync<T>(p: Promise<T>): Promise<void> {
+ const errMessage = await _getContractCallFailedErrorMessageAsync();
+ return expect(p).to.be.rejectedWith(errMessage);
+}
+
+/**
+ * Resolves if the contract creation/deployment fails without a revert reason.
+ * @param p a Promise resulting from a contract creation/deployment
+ * @returns a new Promise which will reject if the conditions are not met and
+ * otherwise resolve with no value.
+ */
+export async function expectContractCreationFailedWithoutReason<T>(p: Promise<T>): Promise<void> {
+ const errMessage = await _getTransactionFailedErrorMessageAsync();
+ return expect(p).to.be.rejectedWith(errMessage);
+}
diff --git a/packages/contracts/test/utils/asset_wrapper.ts b/packages/contracts/test/utils/asset_wrapper.ts
new file mode 100644
index 000000000..e3a4800c6
--- /dev/null
+++ b/packages/contracts/test/utils/asset_wrapper.ts
@@ -0,0 +1,223 @@
+import { assetDataUtils } from '@0xproject/order-utils';
+import { AssetProxyId } from '@0xproject/types';
+import { BigNumber, errorUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { AbstractAssetWrapper } from './abstract_asset_wrapper';
+import { constants } from './constants';
+import { ERC20Wrapper } from './erc20_wrapper';
+import { ERC721Wrapper } from './erc721_wrapper';
+
+interface ProxyIdToAssetWrappers {
+ [proxyId: string]: AbstractAssetWrapper;
+}
+
+/**
+ * This class abstracts away the differences between ERC20 and ERC721 tokens so that
+ * the logic that uses it does not need to care what standard a token belongs to.
+ */
+export class AssetWrapper {
+ private readonly _proxyIdToAssetWrappers: ProxyIdToAssetWrappers;
+ constructor(assetWrappers: AbstractAssetWrapper[]) {
+ this._proxyIdToAssetWrappers = {};
+ _.each(assetWrappers, assetWrapper => {
+ const proxyId = assetWrapper.getProxyId();
+ this._proxyIdToAssetWrappers[proxyId] = assetWrapper;
+ });
+ }
+ public async getBalanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
+ switch (proxyId) {
+ case AssetProxyId.ERC20: {
+ const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
+ const balance = await erc20Wrapper.getBalanceAsync(userAddress, assetData);
+ return balance;
+ }
+ case AssetProxyId.ERC721: {
+ const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
+ const isOwner = await assetWrapper.isOwnerAsync(
+ userAddress,
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ const balance = isOwner ? new BigNumber(1) : new BigNumber(0);
+ return balance;
+ }
+ default:
+ throw errorUtils.spawnSwitchErr('proxyId', proxyId);
+ }
+ }
+ public async setBalanceAsync(userAddress: string, assetData: string, desiredBalance: BigNumber): Promise<void> {
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
+ switch (proxyId) {
+ case AssetProxyId.ERC20: {
+ const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
+ await erc20Wrapper.setBalanceAsync(userAddress, assetData, desiredBalance);
+ return;
+ }
+ case AssetProxyId.ERC721: {
+ if (!desiredBalance.eq(0) && !desiredBalance.eq(1)) {
+ throw new Error(`Balance for ERC721 token can only be set to 0 or 1. Got: ${desiredBalance}`);
+ }
+ const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
+ const doesTokenExist = erc721Wrapper.doesTokenExistAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ if (!doesTokenExist && desiredBalance.eq(1)) {
+ await erc721Wrapper.mintAsync(assetProxyData.tokenAddress, assetProxyData.tokenId, userAddress);
+ return;
+ } else if (!doesTokenExist && desiredBalance.eq(0)) {
+ return; // noop
+ }
+ const tokenOwner = await erc721Wrapper.ownerOfAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ if (userAddress !== tokenOwner && desiredBalance.eq(1)) {
+ await erc721Wrapper.transferFromAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ tokenOwner,
+ userAddress,
+ );
+ } else if (tokenOwner === userAddress && desiredBalance.eq(0)) {
+ // Transfer token to someone else
+ const userAddresses = await (erc721Wrapper as any)._web3Wrapper.getAvailableAddressesAsync();
+ const nonOwner = _.find(userAddresses, a => a !== userAddress);
+ await erc721Wrapper.transferFromAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ tokenOwner,
+ nonOwner,
+ );
+ return;
+ } else if (
+ (userAddress !== tokenOwner && desiredBalance.eq(0)) ||
+ (tokenOwner === userAddress && desiredBalance.eq(1))
+ ) {
+ return; // noop
+ }
+ break;
+ }
+ default:
+ throw errorUtils.spawnSwitchErr('proxyId', proxyId);
+ }
+ }
+ public async getProxyAllowanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
+ switch (proxyId) {
+ case AssetProxyId.ERC20: {
+ const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
+ const allowance = await erc20Wrapper.getProxyAllowanceAsync(userAddress, assetData);
+ return allowance;
+ }
+ case AssetProxyId.ERC721: {
+ const assetWrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
+ const erc721ProxyData = assetDataUtils.decodeERC721AssetData(assetData);
+ const isProxyApprovedForAll = await assetWrapper.isProxyApprovedForAllAsync(
+ userAddress,
+ erc721ProxyData.tokenAddress,
+ );
+ if (isProxyApprovedForAll) {
+ return constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
+ }
+
+ const isProxyApproved = await assetWrapper.isProxyApprovedAsync(
+ erc721ProxyData.tokenAddress,
+ erc721ProxyData.tokenId,
+ );
+ const allowance = isProxyApproved ? new BigNumber(1) : new BigNumber(0);
+ return allowance;
+ }
+ default:
+ throw errorUtils.spawnSwitchErr('proxyId', proxyId);
+ }
+ }
+ public async setProxyAllowanceAsync(
+ userAddress: string,
+ assetData: string,
+ desiredAllowance: BigNumber,
+ ): Promise<void> {
+ const proxyId = assetDataUtils.decodeAssetProxyId(assetData);
+ switch (proxyId) {
+ case AssetProxyId.ERC20: {
+ const erc20Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC20Wrapper;
+ await erc20Wrapper.setAllowanceAsync(userAddress, assetData, desiredAllowance);
+ return;
+ }
+ case AssetProxyId.ERC721: {
+ if (
+ !desiredAllowance.eq(0) &&
+ !desiredAllowance.eq(1) &&
+ !desiredAllowance.eq(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS)
+ ) {
+ throw new Error(
+ `Allowance for ERC721 token can only be set to 0, 1 or 2^256-1. Got: ${desiredAllowance}`,
+ );
+ }
+ const erc721Wrapper = this._proxyIdToAssetWrappers[proxyId] as ERC721Wrapper;
+ const assetProxyData = assetDataUtils.decodeERC721AssetData(assetData);
+
+ const doesTokenExist = await erc721Wrapper.doesTokenExistAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ if (!doesTokenExist) {
+ throw new Error(
+ `Cannot setProxyAllowance on non-existent token: ${assetProxyData.tokenAddress} ${
+ assetProxyData.tokenId
+ }`,
+ );
+ }
+ const isProxyApprovedForAll = await erc721Wrapper.isProxyApprovedForAllAsync(
+ userAddress,
+ assetProxyData.tokenAddress,
+ );
+ if (!isProxyApprovedForAll && desiredAllowance.eq(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS)) {
+ const isApproved = true;
+ await erc721Wrapper.approveProxyForAllAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ isApproved,
+ );
+ } else if (isProxyApprovedForAll && desiredAllowance.eq(0)) {
+ const isApproved = false;
+ await erc721Wrapper.approveProxyForAllAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ isApproved,
+ );
+ } else if (isProxyApprovedForAll && desiredAllowance.eq(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS)) {
+ return; // Noop
+ }
+
+ const isProxyApproved = await erc721Wrapper.isProxyApprovedAsync(
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ if (!isProxyApproved && desiredAllowance.eq(1)) {
+ await erc721Wrapper.approveProxyAsync(assetProxyData.tokenAddress, assetProxyData.tokenId);
+ } else if (isProxyApproved && desiredAllowance.eq(0)) {
+ // Remove approval
+ await erc721Wrapper.approveAsync(
+ constants.NULL_ADDRESS,
+ assetProxyData.tokenAddress,
+ assetProxyData.tokenId,
+ );
+ } else if (
+ (!isProxyApproved && desiredAllowance.eq(0)) ||
+ (isProxyApproved && desiredAllowance.eq(1))
+ ) {
+ return; // noop
+ }
+
+ break;
+ }
+ default:
+ throw errorUtils.spawnSwitchErr('proxyId', proxyId);
+ }
+ }
+}
diff --git a/packages/contracts/test/utils/block_timestamp.ts b/packages/contracts/test/utils/block_timestamp.ts
new file mode 100644
index 000000000..1159792c4
--- /dev/null
+++ b/packages/contracts/test/utils/block_timestamp.ts
@@ -0,0 +1,40 @@
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { web3Wrapper } from './web3_wrapper';
+
+let firstAccount: string | undefined;
+
+/**
+ * Increases time by the given number of seconds and then mines a block so that
+ * the current block timestamp has the offset applied.
+ * @param seconds the number of seconds by which to incrase the time offset.
+ * @returns a new Promise which will resolve with the new total time offset or
+ * reject if the time could not be increased.
+ */
+export async function increaseTimeAndMineBlockAsync(seconds: number): Promise<number> {
+ if (_.isUndefined(firstAccount)) {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ firstAccount = accounts[0];
+ }
+
+ const offset = await web3Wrapper.increaseTimeAsync(seconds);
+ // Note: we need to send a transaction after increasing time so
+ // that a block is actually mined. The contract looks at the
+ // last mined block for the timestamp.
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await web3Wrapper.sendTransactionAsync({ from: firstAccount, to: firstAccount, value: 0 }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ return offset;
+}
+
+/**
+ * Returns the timestamp of the latest block in seconds since the Unix epoch.
+ * @returns a new Promise which will resolve with the timestamp in seconds.
+ */
+export async function getLatestBlockTimestampAsync(): Promise<number> {
+ const currentBlock = await web3Wrapper.getBlockAsync('latest');
+ return currentBlock.timestamp;
+}
diff --git a/packages/contracts/test/utils/chai_setup.ts b/packages/contracts/test/utils/chai_setup.ts
index 078edd309..1a8733093 100644
--- a/packages/contracts/test/utils/chai_setup.ts
+++ b/packages/contracts/test/utils/chai_setup.ts
@@ -4,7 +4,7 @@ import ChaiBigNumber = require('chai-bignumber');
import * as dirtyChai from 'dirty-chai';
export const chaiSetup = {
- configure() {
+ configure(): void {
chai.config.includeStack = true;
chai.use(ChaiBigNumber());
chai.use(dirtyChai);
diff --git a/packages/contracts/test/utils/combinatorial_utils.ts b/packages/contracts/test/utils/combinatorial_utils.ts
new file mode 100644
index 000000000..d72b41f8a
--- /dev/null
+++ b/packages/contracts/test/utils/combinatorial_utils.ts
@@ -0,0 +1,113 @@
+import { BigNumber } from '@0xproject/utils';
+import * as combinatorics from 'js-combinatorics';
+
+import { testWithReferenceFuncAsync } from './test_with_reference';
+
+// A set of values corresponding to the uint256 type in Solidity. This set
+// contains some notable edge cases, including some values which will overflow
+// the uint256 type when used in different mathematical operations.
+export const uint256Values = [
+ new BigNumber(0),
+ new BigNumber(1),
+ new BigNumber(2),
+ // Non-trivial big number.
+ new BigNumber(2).pow(64),
+ // Max that does not overflow when squared.
+ new BigNumber(2).pow(128).minus(1),
+ // Min that does overflow when squared.
+ new BigNumber(2).pow(128),
+ // Max that does not overflow when doubled.
+ new BigNumber(2).pow(255).minus(1),
+ // Min that does overflow when doubled.
+ new BigNumber(2).pow(255),
+ // Max that does not overflow.
+ new BigNumber(2).pow(256).minus(1),
+];
+
+// A set of values corresponding to the bytes32 type in Solidity.
+export const bytes32Values = [
+ // Min
+ '0x0000000000000000000000000000000000000000000000000000000000000000',
+ '0x0000000000000000000000000000000000000000000000000000000000000001',
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
+ // Non-trivial big number.
+ '0x000000000000f000000000000000000000000000000000000000000000000000',
+ // Max
+ '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
+];
+
+export async function testCombinatoriallyWithReferenceFuncAsync<P0, P1, R>(
+ name: string,
+ referenceFunc: (p0: P0, p1: P1) => Promise<R>,
+ testFunc: (p0: P0, p1: P1) => Promise<R>,
+ allValues: [P0[], P1[]],
+): Promise<void>;
+export async function testCombinatoriallyWithReferenceFuncAsync<P0, P1, P2, R>(
+ name: string,
+ referenceFunc: (p0: P0, p1: P1, p2: P2) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2) => Promise<R>,
+ allValues: [P0[], P1[], P2[]],
+): Promise<void>;
+export async function testCombinatoriallyWithReferenceFuncAsync<P0, P1, P2, P3, R>(
+ name: string,
+ referenceFunc: (p0: P0, p1: P1, p2: P2, p3: P3) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2, p3: P3) => Promise<R>,
+ allValues: [P0[], P1[], P2[], P3[]],
+): Promise<void>;
+export async function testCombinatoriallyWithReferenceFuncAsync<P0, P1, P2, P3, P4, R>(
+ name: string,
+ referenceFunc: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) => Promise<R>,
+ allValues: [P0[], P1[], P2[], P3[], P4[]],
+): Promise<void>;
+
+/**
+ * Uses combinatorics to test the behavior of a test function by comparing it to
+ * the expected behavior (defined by a reference function) for a large number of
+ * possible input values.
+ *
+ * First generates test cases by taking the cartesian product of the given
+ * values. Each test case is a set of N values corresponding to the N arguments
+ * for the test func and the reference func. For each test case, first the
+ * reference function will be called to obtain an "expected result", or if the
+ * reference function throws/rejects, an "expected error". Next, the test
+ * function will be called to obtain an "actual result", or if the test function
+ * throws/rejects, an "actual error". Each test case passes if at least one of
+ * the following conditions is met:
+ *
+ * 1) Neither the reference function or the test function throw and the
+ * "expected result" equals the "actual result".
+ *
+ * 2) Both the reference function and the test function throw and the "actual
+ * error" message *contains* the "expected error" message.
+ *
+ * The first test case which does not meet one of these conditions will cause
+ * the entire test to fail and this function will throw/reject.
+ *
+ * @param referenceFuncAsync a reference function implemented in pure
+ * JavaScript/TypeScript which accepts N arguments and returns the "expected
+ * result" or "expected error" for a given test case.
+ * @param testFuncAsync a test function which, e.g., makes a call or sends a
+ * transaction to a contract. It accepts the same N arguments returns the
+ * "actual result" or "actual error" for a given test case.
+ * @param values an array of N arrays. Each inner array is a set of possible
+ * values which are passed into both the reference function and the test
+ * function.
+ * @return A Promise that resolves if the test passes and rejects if the test
+ * fails, according to the rules described above.
+ */
+export async function testCombinatoriallyWithReferenceFuncAsync(
+ name: string,
+ referenceFuncAsync: (...args: any[]) => Promise<any>,
+ testFuncAsync: (...args: any[]) => Promise<any>,
+ allValues: any[],
+): Promise<void> {
+ const testCases = combinatorics.cartesianProduct(...allValues);
+ let counter = 0;
+ testCases.forEach(async testCase => {
+ counter += 1;
+ it(`${name} ${counter}/${testCases.length}`, async () => {
+ await testWithReferenceFuncAsync(referenceFuncAsync, testFuncAsync, testCase as any);
+ });
+ });
+}
diff --git a/packages/contracts/test/utils/constants.ts b/packages/contracts/test/utils/constants.ts
new file mode 100644
index 000000000..65eaee398
--- /dev/null
+++ b/packages/contracts/test/utils/constants.ts
@@ -0,0 +1,54 @@
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as ethUtil from 'ethereumjs-util';
+import * as _ from 'lodash';
+
+const TESTRPC_PRIVATE_KEYS_STRINGS = [
+ '0xf2f48ee19680706196e2e339e5da3491186e0c4c5030670656b0e0164837257d',
+ '0x5d862464fe9303452126c8bc94274b8c5f9874cbd219789b3eb2128075a76f72',
+ '0xdf02719c4df8b9b8ac7f551fcb5d9ef48fa27eef7a66453879f4d8fdc6e78fb1',
+ '0xff12e391b79415e941a94de3bf3a9aee577aed0731e297d5cfa0b8a1e02fa1d0',
+ '0x752dd9cf65e68cfaba7d60225cbdbc1f4729dd5e5507def72815ed0d8abc6249',
+ '0xefb595a0178eb79a8df953f87c5148402a224cdf725e88c0146727c6aceadccd',
+ '0x83c6d2cc5ddcf9711a6d59b417dc20eb48afd58d45290099e5987e3d768f328f',
+ '0xbb2d3f7c9583780a7d3904a2f55d792707c345f21de1bacb2d389934d82796b2',
+ '0xb2fd4d29c1390b71b8795ae81196bfd60293adf99f9d32a0aff06288fcdac55f',
+ '0x23cb7121166b9a2f93ae0b7c05bde02eae50d64449b2cbb42bc84e9d38d6cc89',
+];
+
+export const constants = {
+ BASE_16: 16,
+ INVALID_OPCODE: 'invalid opcode',
+ TESTRPC_NETWORK_ID: 50,
+ // Note(albrow): In practice V8 and most other engines limit the minimum
+ // interval for setInterval to 10ms. We still set it to 0 here in order to
+ // ensure we always use the minimum interval.
+ AWAIT_TRANSACTION_MINED_MS: 0,
+ MAX_ETHERTOKEN_WITHDRAW_GAS: 43000,
+ MAX_EXECUTE_TRANSACTION_GAS: 1000000,
+ MAX_TOKEN_TRANSFERFROM_GAS: 80000,
+ MAX_TOKEN_APPROVE_GAS: 60000,
+ MAX_TRANSFER_FROM_GAS: 150000,
+ DUMMY_TOKEN_NAME: '',
+ DUMMY_TOKEN_SYMBOL: '',
+ DUMMY_TOKEN_DECIMALS: new BigNumber(18),
+ DUMMY_TOKEN_TOTAL_SUPPLY: new BigNumber(0),
+ NULL_BYTES: '0x',
+ NUM_DUMMY_ERC20_TO_DEPLOY: 3,
+ NUM_DUMMY_ERC721_TO_DEPLOY: 1,
+ NUM_ERC721_TOKENS_TO_MINT: 2,
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
+ TESTRPC_PRIVATE_KEYS: _.map(TESTRPC_PRIVATE_KEYS_STRINGS, privateKeyString => ethUtil.toBuffer(privateKeyString)),
+ INITIAL_ERC20_BALANCE: Web3Wrapper.toBaseUnitAmount(new BigNumber(10000), 18),
+ INITIAL_ERC20_ALLOWANCE: Web3Wrapper.toBaseUnitAmount(new BigNumber(10000), 18),
+ STATIC_ORDER_PARAMS: {
+ makerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18),
+ takerAssetAmount: Web3Wrapper.toBaseUnitAmount(new BigNumber(200), 18),
+ makerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
+ takerFee: Web3Wrapper.toBaseUnitAmount(new BigNumber(1), 18),
+ },
+ WORD_LENGTH: 32,
+ ZERO_AMOUNT: new BigNumber(0),
+ PERCENTAGE_DENOMINATOR: new BigNumber(10).pow(18),
+};
diff --git a/packages/contracts/test/utils/coverage.ts b/packages/contracts/test/utils/coverage.ts
new file mode 100644
index 000000000..de29a3ecc
--- /dev/null
+++ b/packages/contracts/test/utils/coverage.ts
@@ -0,0 +1,21 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { CoverageSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov';
+import * as _ from 'lodash';
+
+let coverageSubprovider: CoverageSubprovider;
+
+export const coverage = {
+ getCoverageSubproviderSingleton(): CoverageSubprovider {
+ if (_.isUndefined(coverageSubprovider)) {
+ coverageSubprovider = coverage._getCoverageSubprovider();
+ }
+ return coverageSubprovider;
+ },
+ _getCoverageSubprovider(): CoverageSubprovider {
+ const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter();
+ const isVerbose = true;
+ const subprovider = new CoverageSubprovider(solCompilerArtifactAdapter, defaultFromAddress, isVerbose);
+ return subprovider;
+ },
+};
diff --git a/packages/contracts/test/utils/deployer.ts b/packages/contracts/test/utils/deployer.ts
deleted file mode 100644
index 1baa47f09..000000000
--- a/packages/contracts/test/utils/deployer.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Deployer } from '@0xproject/deployer';
-import { devConstants } from '@0xproject/dev-utils';
-import * as path from 'path';
-
-import { constants } from '../../util/constants';
-
-import { web3 } from './web3_wrapper';
-
-const deployerOpts = {
- web3Provider: web3.currentProvider,
- artifactsDir: path.resolve('src', 'artifacts'),
- jsonrpcUrl: devConstants.RPC_URL,
- networkId: constants.TESTRPC_NETWORK_ID,
- defaults: {
- gas: devConstants.GAS_ESTIMATE,
- },
-};
-
-export const deployer = new Deployer(deployerOpts);
diff --git a/packages/contracts/test/utils/erc20_wrapper.ts b/packages/contracts/test/utils/erc20_wrapper.ts
new file mode 100644
index 000000000..424aae579
--- /dev/null
+++ b/packages/contracts/test/utils/erc20_wrapper.ts
@@ -0,0 +1,175 @@
+import { assetDataUtils } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { DummyERC20TokenContract } from '../../generated_contract_wrappers/dummy_erc20_token';
+import { ERC20ProxyContract } from '../../generated_contract_wrappers/erc20_proxy';
+
+import { artifacts } from './artifacts';
+import { constants } from './constants';
+import { ERC20BalancesByOwner } from './types';
+import { txDefaults } from './web3_wrapper';
+
+export class ERC20Wrapper {
+ private readonly _tokenOwnerAddresses: string[];
+ private readonly _contractOwnerAddress: string;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _provider: Provider;
+ private readonly _dummyTokenContracts: DummyERC20TokenContract[];
+ private _proxyContract?: ERC20ProxyContract;
+ private _proxyIdIfExists?: string;
+ constructor(provider: Provider, tokenOwnerAddresses: string[], contractOwnerAddress: string) {
+ this._dummyTokenContracts = [];
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._provider = provider;
+ this._tokenOwnerAddresses = tokenOwnerAddresses;
+ this._contractOwnerAddress = contractOwnerAddress;
+ }
+ public async deployDummyTokensAsync(
+ numberToDeploy: number,
+ decimals: BigNumber,
+ ): Promise<DummyERC20TokenContract[]> {
+ for (let i = 0; i < numberToDeploy; i++) {
+ this._dummyTokenContracts.push(
+ await DummyERC20TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC20Token,
+ this._provider,
+ txDefaults,
+ constants.DUMMY_TOKEN_NAME,
+ constants.DUMMY_TOKEN_SYMBOL,
+ decimals,
+ constants.DUMMY_TOKEN_TOTAL_SUPPLY,
+ ),
+ );
+ }
+ return this._dummyTokenContracts;
+ }
+ public async deployProxyAsync(): Promise<ERC20ProxyContract> {
+ this._proxyContract = await ERC20ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC20Proxy,
+ this._provider,
+ txDefaults,
+ );
+ this._proxyIdIfExists = await this._proxyContract.getProxyId.callAsync();
+ return this._proxyContract;
+ }
+ public getProxyId(): string {
+ this._validateProxyContractExistsOrThrow();
+ return this._proxyIdIfExists as string;
+ }
+ public async setBalancesAndAllowancesAsync(): Promise<void> {
+ this._validateDummyTokenContractsExistOrThrow();
+ this._validateProxyContractExistsOrThrow();
+ for (const dummyTokenContract of this._dummyTokenContracts) {
+ for (const tokenOwnerAddress of this._tokenOwnerAddresses) {
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await dummyTokenContract.setBalance.sendTransactionAsync(
+ tokenOwnerAddress,
+ constants.INITIAL_ERC20_BALANCE,
+ { from: this._contractOwnerAddress },
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await dummyTokenContract.approve.sendTransactionAsync(
+ (this._proxyContract as ERC20ProxyContract).address,
+ constants.INITIAL_ERC20_ALLOWANCE,
+ { from: tokenOwnerAddress },
+ ),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ }
+ }
+ public async getBalanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
+ const tokenContract = this._getTokenContractFromAssetData(assetData);
+ const balance = new BigNumber(await tokenContract.balanceOf.callAsync(userAddress));
+ return balance;
+ }
+ public async setBalanceAsync(userAddress: string, assetData: string, amount: BigNumber): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(assetData);
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.setBalance.sendTransactionAsync(userAddress, amount, {
+ from: this._contractOwnerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async getProxyAllowanceAsync(userAddress: string, assetData: string): Promise<BigNumber> {
+ const tokenContract = this._getTokenContractFromAssetData(assetData);
+ const proxyAddress = (this._proxyContract as ERC20ProxyContract).address;
+ const allowance = new BigNumber(await tokenContract.allowance.callAsync(userAddress, proxyAddress));
+ return allowance;
+ }
+ public async setAllowanceAsync(userAddress: string, assetData: string, amount: BigNumber): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(assetData);
+ const proxyAddress = (this._proxyContract as ERC20ProxyContract).address;
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.approve.sendTransactionAsync(proxyAddress, amount, {
+ from: userAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async getBalancesAsync(): Promise<ERC20BalancesByOwner> {
+ this._validateDummyTokenContractsExistOrThrow();
+ const balancesByOwner: ERC20BalancesByOwner = {};
+ const balances: BigNumber[] = [];
+ const balanceInfo: Array<{ tokenOwnerAddress: string; tokenAddress: string }> = [];
+ for (const dummyTokenContract of this._dummyTokenContracts) {
+ for (const tokenOwnerAddress of this._tokenOwnerAddresses) {
+ balances.push(await dummyTokenContract.balanceOf.callAsync(tokenOwnerAddress));
+ balanceInfo.push({
+ tokenOwnerAddress,
+ tokenAddress: dummyTokenContract.address,
+ });
+ }
+ }
+ _.forEach(balances, (balance, balanceIndex) => {
+ const tokenAddress = balanceInfo[balanceIndex].tokenAddress;
+ const tokenOwnerAddress = balanceInfo[balanceIndex].tokenOwnerAddress;
+ if (_.isUndefined(balancesByOwner[tokenOwnerAddress])) {
+ balancesByOwner[tokenOwnerAddress] = {};
+ }
+ const wrappedBalance = new BigNumber(balance);
+ balancesByOwner[tokenOwnerAddress][tokenAddress] = wrappedBalance;
+ });
+ return balancesByOwner;
+ }
+ public addDummyTokenContract(dummy: DummyERC20TokenContract): void {
+ if (!_.isUndefined(this._dummyTokenContracts)) {
+ this._dummyTokenContracts.push(dummy);
+ }
+ }
+ public addTokenOwnerAddress(address: string): void {
+ this._tokenOwnerAddresses.push(address);
+ }
+ public getTokenOwnerAddresses(): string[] {
+ return this._tokenOwnerAddresses;
+ }
+ public getTokenAddresses(): string[] {
+ const tokenAddresses = _.map(this._dummyTokenContracts, dummyTokenContract => dummyTokenContract.address);
+ return tokenAddresses;
+ }
+ private _getTokenContractFromAssetData(assetData: string): DummyERC20TokenContract {
+ const erc20ProxyData = assetDataUtils.decodeERC20AssetData(assetData);
+ const tokenAddress = erc20ProxyData.tokenAddress;
+ const tokenContractIfExists = _.find(this._dummyTokenContracts, c => c.address === tokenAddress);
+ if (_.isUndefined(tokenContractIfExists)) {
+ throw new Error(`Token: ${tokenAddress} was not deployed through ERC20Wrapper`);
+ }
+ return tokenContractIfExists;
+ }
+ private _validateDummyTokenContractsExistOrThrow(): void {
+ if (_.isUndefined(this._dummyTokenContracts)) {
+ throw new Error('Dummy ERC20 tokens not yet deployed, please call "deployDummyTokensAsync"');
+ }
+ }
+ private _validateProxyContractExistsOrThrow(): void {
+ if (_.isUndefined(this._proxyContract)) {
+ throw new Error('ERC20 proxy contract not yet deployed, please call "deployProxyAsync"');
+ }
+ }
+}
diff --git a/packages/contracts/test/utils/erc721_wrapper.ts b/packages/contracts/test/utils/erc721_wrapper.ts
new file mode 100644
index 000000000..d023b4d02
--- /dev/null
+++ b/packages/contracts/test/utils/erc721_wrapper.ts
@@ -0,0 +1,236 @@
+import { generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+import { ERC721ProxyContract } from '../../generated_contract_wrappers/erc721_proxy';
+
+import { artifacts } from './artifacts';
+import { constants } from './constants';
+import { ERC721TokenIdsByOwner } from './types';
+import { txDefaults } from './web3_wrapper';
+
+export class ERC721Wrapper {
+ private readonly _tokenOwnerAddresses: string[];
+ private readonly _contractOwnerAddress: string;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _provider: Provider;
+ private readonly _dummyTokenContracts: DummyERC721TokenContract[];
+ private _proxyContract?: ERC721ProxyContract;
+ private _proxyIdIfExists?: string;
+ private _initialTokenIdsByOwner: ERC721TokenIdsByOwner = {};
+ constructor(provider: Provider, tokenOwnerAddresses: string[], contractOwnerAddress: string) {
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._provider = provider;
+ this._dummyTokenContracts = [];
+ this._tokenOwnerAddresses = tokenOwnerAddresses;
+ this._contractOwnerAddress = contractOwnerAddress;
+ }
+ public async deployDummyTokensAsync(): Promise<DummyERC721TokenContract[]> {
+ for (let i = 0; i < constants.NUM_DUMMY_ERC721_TO_DEPLOY; i++) {
+ this._dummyTokenContracts.push(
+ await DummyERC721TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC721Token,
+ this._provider,
+ txDefaults,
+ constants.DUMMY_TOKEN_NAME,
+ constants.DUMMY_TOKEN_SYMBOL,
+ ),
+ );
+ }
+ return this._dummyTokenContracts;
+ }
+ public async deployProxyAsync(): Promise<ERC721ProxyContract> {
+ this._proxyContract = await ERC721ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC721Proxy,
+ this._provider,
+ txDefaults,
+ );
+ this._proxyIdIfExists = await this._proxyContract.getProxyId.callAsync();
+ return this._proxyContract;
+ }
+ public getProxyId(): string {
+ this._validateProxyContractExistsOrThrow();
+ return this._proxyIdIfExists as string;
+ }
+ public async setBalancesAndAllowancesAsync(): Promise<void> {
+ this._validateDummyTokenContractsExistOrThrow();
+ this._validateProxyContractExistsOrThrow();
+ this._initialTokenIdsByOwner = {};
+ for (const dummyTokenContract of this._dummyTokenContracts) {
+ for (const tokenOwnerAddress of this._tokenOwnerAddresses) {
+ for (let i = 0; i < constants.NUM_ERC721_TOKENS_TO_MINT; i++) {
+ const tokenId = generatePseudoRandomSalt();
+ await this.mintAsync(dummyTokenContract.address, tokenId, tokenOwnerAddress);
+ if (_.isUndefined(this._initialTokenIdsByOwner[tokenOwnerAddress])) {
+ this._initialTokenIdsByOwner[tokenOwnerAddress] = {
+ [dummyTokenContract.address]: [],
+ };
+ }
+ if (_.isUndefined(this._initialTokenIdsByOwner[tokenOwnerAddress][dummyTokenContract.address])) {
+ this._initialTokenIdsByOwner[tokenOwnerAddress][dummyTokenContract.address] = [];
+ }
+ this._initialTokenIdsByOwner[tokenOwnerAddress][dummyTokenContract.address].push(tokenId);
+
+ await this.approveProxyAsync(dummyTokenContract.address, tokenId);
+ }
+ }
+ }
+ }
+ public async doesTokenExistAsync(tokenAddress: string, tokenId: BigNumber): Promise<boolean> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const doesExist = await tokenContract.exists.callAsync(tokenId);
+ return doesExist;
+ }
+ public async approveProxyAsync(tokenAddress: string, tokenId: BigNumber): Promise<void> {
+ const proxyAddress = (this._proxyContract as ERC721ProxyContract).address;
+ await this.approveAsync(proxyAddress, tokenAddress, tokenId);
+ }
+ public async approveProxyForAllAsync(tokenAddress: string, tokenId: BigNumber, isApproved: boolean): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const tokenOwner = await this.ownerOfAsync(tokenAddress, tokenId);
+ const proxyAddress = (this._proxyContract as ERC721ProxyContract).address;
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.setApprovalForAll.sendTransactionAsync(proxyAddress, isApproved, {
+ from: tokenOwner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async approveAsync(to: string, tokenAddress: string, tokenId: BigNumber): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const tokenOwner = await this.ownerOfAsync(tokenAddress, tokenId);
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.approve.sendTransactionAsync(to, tokenId, {
+ from: tokenOwner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async transferFromAsync(
+ tokenAddress: string,
+ tokenId: BigNumber,
+ currentOwner: string,
+ userAddress: string,
+ ): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.transferFrom.sendTransactionAsync(currentOwner, userAddress, tokenId, {
+ from: currentOwner,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async mintAsync(tokenAddress: string, tokenId: BigNumber, userAddress: string): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.mint.sendTransactionAsync(userAddress, tokenId, {
+ from: this._contractOwnerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async burnAsync(tokenAddress: string, tokenId: BigNumber, owner: string): Promise<void> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ await this._web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenContract.burn.sendTransactionAsync(owner, tokenId, {
+ from: this._contractOwnerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ }
+ public async ownerOfAsync(tokenAddress: string, tokenId: BigNumber): Promise<string> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const owner = await tokenContract.ownerOf.callAsync(tokenId);
+ return owner;
+ }
+ public async isOwnerAsync(userAddress: string, tokenAddress: string, tokenId: BigNumber): Promise<boolean> {
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const tokenOwner = await tokenContract.ownerOf.callAsync(tokenId);
+ const isOwner = tokenOwner === userAddress;
+ return isOwner;
+ }
+ public async isProxyApprovedForAllAsync(userAddress: string, tokenAddress: string): Promise<boolean> {
+ this._validateProxyContractExistsOrThrow();
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const operator = (this._proxyContract as ERC721ProxyContract).address;
+ const didApproveAll = await tokenContract.isApprovedForAll.callAsync(userAddress, operator);
+ return didApproveAll;
+ }
+ public async isProxyApprovedAsync(tokenAddress: string, tokenId: BigNumber): Promise<boolean> {
+ this._validateProxyContractExistsOrThrow();
+ const tokenContract = this._getTokenContractFromAssetData(tokenAddress);
+ const approvedAddress = await tokenContract.getApproved.callAsync(tokenId);
+ const proxyAddress = (this._proxyContract as ERC721ProxyContract).address;
+ const isProxyAnApprovedOperator = approvedAddress === proxyAddress;
+ return isProxyAnApprovedOperator;
+ }
+ public async getBalancesAsync(): Promise<ERC721TokenIdsByOwner> {
+ this._validateDummyTokenContractsExistOrThrow();
+ this._validateBalancesAndAllowancesSetOrThrow();
+ const tokenIdsByOwner: ERC721TokenIdsByOwner = {};
+ const tokenOwnerAddresses: string[] = [];
+ const tokenInfo: Array<{ tokenId: BigNumber; tokenAddress: string }> = [];
+ for (const dummyTokenContract of this._dummyTokenContracts) {
+ for (const tokenOwnerAddress of this._tokenOwnerAddresses) {
+ const initialTokenOwnerIds = this._initialTokenIdsByOwner[tokenOwnerAddress][
+ dummyTokenContract.address
+ ];
+ for (const tokenId of initialTokenOwnerIds) {
+ tokenOwnerAddresses.push(await dummyTokenContract.ownerOf.callAsync(tokenId));
+ tokenInfo.push({
+ tokenId,
+ tokenAddress: dummyTokenContract.address,
+ });
+ }
+ }
+ }
+ _.forEach(tokenOwnerAddresses, (tokenOwnerAddress, ownerIndex) => {
+ const tokenAddress = tokenInfo[ownerIndex].tokenAddress;
+ const tokenId = tokenInfo[ownerIndex].tokenId;
+ if (_.isUndefined(tokenIdsByOwner[tokenOwnerAddress])) {
+ tokenIdsByOwner[tokenOwnerAddress] = {
+ [tokenAddress]: [],
+ };
+ }
+ if (_.isUndefined(tokenIdsByOwner[tokenOwnerAddress][tokenAddress])) {
+ tokenIdsByOwner[tokenOwnerAddress][tokenAddress] = [];
+ }
+ tokenIdsByOwner[tokenOwnerAddress][tokenAddress].push(tokenId);
+ });
+ return tokenIdsByOwner;
+ }
+ public getTokenOwnerAddresses(): string[] {
+ return this._tokenOwnerAddresses;
+ }
+ public getTokenAddresses(): string[] {
+ const tokenAddresses = _.map(this._dummyTokenContracts, dummyTokenContract => dummyTokenContract.address);
+ return tokenAddresses;
+ }
+ private _getTokenContractFromAssetData(tokenAddress: string): DummyERC721TokenContract {
+ const tokenContractIfExists = _.find(this._dummyTokenContracts, c => c.address === tokenAddress);
+ if (_.isUndefined(tokenContractIfExists)) {
+ throw new Error(`Token: ${tokenAddress} was not deployed through ERC20Wrapper`);
+ }
+ return tokenContractIfExists;
+ }
+ private _validateDummyTokenContractsExistOrThrow(): void {
+ if (_.isUndefined(this._dummyTokenContracts)) {
+ throw new Error('Dummy ERC721 tokens not yet deployed, please call "deployDummyTokensAsync"');
+ }
+ }
+ private _validateProxyContractExistsOrThrow(): void {
+ if (_.isUndefined(this._proxyContract)) {
+ throw new Error('ERC721 proxy contract not yet deployed, please call "deployProxyAsync"');
+ }
+ }
+ private _validateBalancesAndAllowancesSetOrThrow(): void {
+ if (_.keys(this._initialTokenIdsByOwner).length === 0) {
+ throw new Error(
+ 'Dummy ERC721 balances and allowances not yet set, please call "setBalancesAndAllowancesAsync"',
+ );
+ }
+ }
+}
diff --git a/packages/contracts/test/utils/exchange_wrapper.ts b/packages/contracts/test/utils/exchange_wrapper.ts
new file mode 100644
index 000000000..d57592d6d
--- /dev/null
+++ b/packages/contracts/test/utils/exchange_wrapper.ts
@@ -0,0 +1,269 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
+
+import { ExchangeContract } from '../../generated_contract_wrappers/exchange';
+
+import { formatters } from './formatters';
+import { LogDecoder } from './log_decoder';
+import { orderUtils } from './order_utils';
+import { FillResults, OrderInfo, SignedTransaction } from './types';
+
+export class ExchangeWrapper {
+ private readonly _exchange: ExchangeContract;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _logDecoder: LogDecoder;
+ constructor(exchangeContract: ExchangeContract, provider: Provider) {
+ this._exchange = exchangeContract;
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._logDecoder = new LogDecoder(this._web3Wrapper, this._exchange.address);
+ }
+ public async fillOrderAsync(
+ signedOrder: SignedOrder,
+ from: string,
+ opts: { takerAssetFillAmount?: BigNumber } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
+ const txHash = await this._exchange.fillOrder.sendTransactionAsync(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ { from },
+ );
+ const txReceipt = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return txReceipt;
+ }
+ public async cancelOrderAsync(signedOrder: SignedOrder, from: string): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = orderUtils.createCancel(signedOrder);
+ const txHash = await this._exchange.cancelOrder.sendTransactionAsync(params.order, { from });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async fillOrKillOrderAsync(
+ signedOrder: SignedOrder,
+ from: string,
+ opts: { takerAssetFillAmount?: BigNumber } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
+ const txHash = await this._exchange.fillOrKillOrder.sendTransactionAsync(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async fillOrderNoThrowAsync(
+ signedOrder: SignedOrder,
+ from: string,
+ opts: { takerAssetFillAmount?: BigNumber; gas?: number } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
+ const txHash = await this._exchange.fillOrderNoThrow.sendTransactionAsync(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ { from, gas: opts.gas },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async batchFillOrdersAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { takerAssetFillAmounts?: BigNumber[] } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createBatchFill(orders, opts.takerAssetFillAmounts);
+ const txHash = await this._exchange.batchFillOrders.sendTransactionAsync(
+ params.orders,
+ params.takerAssetFillAmounts,
+ params.signatures,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async batchFillOrKillOrdersAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { takerAssetFillAmounts?: BigNumber[] } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createBatchFill(orders, opts.takerAssetFillAmounts);
+ const txHash = await this._exchange.batchFillOrKillOrders.sendTransactionAsync(
+ params.orders,
+ params.takerAssetFillAmounts,
+ params.signatures,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async batchFillOrdersNoThrowAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { takerAssetFillAmounts?: BigNumber[]; gas?: number } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createBatchFill(orders, opts.takerAssetFillAmounts);
+ const txHash = await this._exchange.batchFillOrdersNoThrow.sendTransactionAsync(
+ params.orders,
+ params.takerAssetFillAmounts,
+ params.signatures,
+ { from, gas: opts.gas },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async marketSellOrdersAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { takerAssetFillAmount: BigNumber },
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createMarketSellOrders(orders, opts.takerAssetFillAmount);
+ const txHash = await this._exchange.marketSellOrders.sendTransactionAsync(
+ params.orders,
+ params.takerAssetFillAmount,
+ params.signatures,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async marketSellOrdersNoThrowAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { takerAssetFillAmount: BigNumber; gas?: number },
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createMarketSellOrders(orders, opts.takerAssetFillAmount);
+ const txHash = await this._exchange.marketSellOrdersNoThrow.sendTransactionAsync(
+ params.orders,
+ params.takerAssetFillAmount,
+ params.signatures,
+ { from, gas: opts.gas },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async marketBuyOrdersAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { makerAssetFillAmount: BigNumber },
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createMarketBuyOrders(orders, opts.makerAssetFillAmount);
+ const txHash = await this._exchange.marketBuyOrders.sendTransactionAsync(
+ params.orders,
+ params.makerAssetFillAmount,
+ params.signatures,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async marketBuyOrdersNoThrowAsync(
+ orders: SignedOrder[],
+ from: string,
+ opts: { makerAssetFillAmount: BigNumber; gas?: number },
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createMarketBuyOrders(orders, opts.makerAssetFillAmount);
+ const txHash = await this._exchange.marketBuyOrdersNoThrow.sendTransactionAsync(
+ params.orders,
+ params.makerAssetFillAmount,
+ params.signatures,
+ { from, gas: opts.gas },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async batchCancelOrdersAsync(
+ orders: SignedOrder[],
+ from: string,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = formatters.createBatchCancel(orders);
+ const txHash = await this._exchange.batchCancelOrders.sendTransactionAsync(params.orders, { from });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async cancelOrdersUpToAsync(salt: BigNumber, from: string): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._exchange.cancelOrdersUpTo.sendTransactionAsync(salt, { from });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async registerAssetProxyAsync(
+ assetProxyAddress: string,
+ from: string,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._exchange.registerAssetProxy.sendTransactionAsync(assetProxyAddress, { from });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async executeTransactionAsync(
+ signedTx: SignedTransaction,
+ from: string,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._exchange.executeTransaction.sendTransactionAsync(
+ signedTx.salt,
+ signedTx.signerAddress,
+ signedTx.data,
+ signedTx.signature,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async getTakerAssetFilledAmountAsync(orderHashHex: string): Promise<BigNumber> {
+ const filledAmount = new BigNumber(await this._exchange.filled.callAsync(orderHashHex));
+ return filledAmount;
+ }
+ public async isCancelledAsync(orderHashHex: string): Promise<boolean> {
+ const isCancelled = await this._exchange.cancelled.callAsync(orderHashHex);
+ return isCancelled;
+ }
+ public async getOrderInfoAsync(signedOrder: SignedOrder): Promise<OrderInfo> {
+ const orderInfo = (await this._exchange.getOrderInfo.callAsync(signedOrder)) as OrderInfo;
+ return orderInfo;
+ }
+ public async getOrdersInfoAsync(signedOrders: SignedOrder[]): Promise<OrderInfo[]> {
+ const ordersInfo = (await this._exchange.getOrdersInfo.callAsync(signedOrders)) as OrderInfo[];
+ return ordersInfo;
+ }
+ public async matchOrdersAsync(
+ signedOrderLeft: SignedOrder,
+ signedOrderRight: SignedOrder,
+ from: string,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = orderUtils.createMatchOrders(signedOrderLeft, signedOrderRight);
+ const txHash = await this._exchange.matchOrders.sendTransactionAsync(
+ params.left,
+ params.right,
+ params.leftSignature,
+ params.rightSignature,
+ { from },
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async getFillOrderResultsAsync(
+ signedOrder: SignedOrder,
+ from: string,
+ opts: { takerAssetFillAmount?: BigNumber } = {},
+ ): Promise<FillResults> {
+ const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
+ const fillResults = await this._exchange.fillOrder.callAsync(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ { from },
+ );
+ return fillResults;
+ }
+ public abiEncodeFillOrder(signedOrder: SignedOrder, opts: { takerAssetFillAmount?: BigNumber } = {}): string {
+ const params = orderUtils.createFill(signedOrder, opts.takerAssetFillAmount);
+ const data = this._exchange.fillOrder.getABIEncodedTransactionData(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ );
+ return data;
+ }
+}
diff --git a/packages/contracts/test/utils/fill_order_combinatorial_utils.ts b/packages/contracts/test/utils/fill_order_combinatorial_utils.ts
new file mode 100644
index 000000000..284c4a2db
--- /dev/null
+++ b/packages/contracts/test/utils/fill_order_combinatorial_utils.ts
@@ -0,0 +1,913 @@
+import {
+ assetDataUtils,
+ BalanceAndProxyAllowanceLazyStore,
+ ExchangeTransferSimulator,
+ orderHashUtils,
+ OrderStateUtils,
+ OrderValidationUtils,
+} from '@0xproject/order-utils';
+import { AssetProxyId, RevertReason, SignatureType, SignedOrder } from '@0xproject/types';
+import { BigNumber, errorUtils, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import { LogWithDecodedArgs, Provider, TxData } from 'ethereum-types';
+import * as _ from 'lodash';
+import 'make-promises-safe';
+
+import { ExchangeContract, ExchangeFillEventArgs } from '../../generated_contract_wrappers/exchange';
+import { TestLibsContract } from '../../generated_contract_wrappers/test_libs';
+
+import { artifacts } from './artifacts';
+import { expectTransactionFailedAsync } from './assertions';
+import { AssetWrapper } from './asset_wrapper';
+import { chaiSetup } from './chai_setup';
+import { constants } from './constants';
+import { ERC20Wrapper } from './erc20_wrapper';
+import { ERC721Wrapper } from './erc721_wrapper';
+import { ExchangeWrapper } from './exchange_wrapper';
+import { OrderFactoryFromScenario } from './order_factory_from_scenario';
+import { orderUtils } from './order_utils';
+import { signingUtils } from './signing_utils';
+import { SimpleAssetBalanceAndProxyAllowanceFetcher } from './simple_asset_balance_and_proxy_allowance_fetcher';
+import { SimpleOrderFilledCancelledFetcher } from './simple_order_filled_cancelled_fetcher';
+import {
+ AllowanceAmountScenario,
+ AssetDataScenario,
+ BalanceAmountScenario,
+ ExpirationTimeSecondsScenario,
+ FeeRecipientAddressScenario,
+ FillScenario,
+ OrderAssetAmountScenario,
+ TakerAssetFillAmountScenario,
+ TakerScenario,
+ TraderStateScenario,
+} from './types';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+/**
+ * Instantiates a new instance of FillOrderCombinatorialUtils. Since this method has some
+ * required async setup, a factory method is required.
+ * @param web3Wrapper Web3Wrapper instance
+ * @param txDefaults Default Ethereum tx options
+ * @return FillOrderCombinatorialUtils instance
+ */
+export async function fillOrderCombinatorialUtilsFactoryAsync(
+ web3Wrapper: Web3Wrapper,
+ txDefaults: Partial<TxData>,
+): Promise<FillOrderCombinatorialUtils> {
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ const userAddresses = _.slice(accounts, 0, 5);
+ const [ownerAddress, makerAddress, takerAddress] = userAddresses;
+ const makerPrivateKey = constants.TESTRPC_PRIVATE_KEYS[userAddresses.indexOf(makerAddress)];
+
+ const provider = web3Wrapper.getProvider();
+ const erc20Wrapper = new ERC20Wrapper(provider, userAddresses, ownerAddress);
+ const erc721Wrapper = new ERC721Wrapper(provider, userAddresses, ownerAddress);
+
+ const erc20EighteenDecimalTokenCount = 3;
+ const eighteenDecimals = new BigNumber(18);
+ const [
+ erc20EighteenDecimalTokenA,
+ erc20EighteenDecimalTokenB,
+ zrxToken,
+ ] = await erc20Wrapper.deployDummyTokensAsync(erc20EighteenDecimalTokenCount, eighteenDecimals);
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxToken.address);
+
+ const erc20FiveDecimalTokenCount = 2;
+ const fiveDecimals = new BigNumber(5);
+ const [erc20FiveDecimalTokenA, erc20FiveDecimalTokenB] = await erc20Wrapper.deployDummyTokensAsync(
+ erc20FiveDecimalTokenCount,
+ fiveDecimals,
+ );
+ const erc20Proxy = await erc20Wrapper.deployProxyAsync();
+ await erc20Wrapper.setBalancesAndAllowancesAsync();
+
+ const [erc721Token] = await erc721Wrapper.deployDummyTokensAsync();
+ const erc721Proxy = await erc721Wrapper.deployProxyAsync();
+ await erc721Wrapper.setBalancesAndAllowancesAsync();
+ const erc721Balances = await erc721Wrapper.getBalancesAsync();
+
+ const assetWrapper = new AssetWrapper([erc20Wrapper, erc721Wrapper]);
+
+ const exchangeContract = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ zrxAssetData,
+ );
+ const exchangeWrapper = new ExchangeWrapper(exchangeContract, provider);
+ await exchangeWrapper.registerAssetProxyAsync(erc20Proxy.address, ownerAddress);
+ await exchangeWrapper.registerAssetProxyAsync(erc721Proxy.address, ownerAddress);
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeContract.address, {
+ from: ownerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721Proxy.addAuthorizedAddress.sendTransactionAsync(exchangeContract.address, {
+ from: ownerAddress,
+ }),
+ constants.AWAIT_TRANSACTION_MINED_MS,
+ );
+
+ const orderFactory = new OrderFactoryFromScenario(
+ userAddresses,
+ zrxToken.address,
+ [erc20EighteenDecimalTokenA.address, erc20EighteenDecimalTokenB.address],
+ [erc20FiveDecimalTokenA.address, erc20FiveDecimalTokenB.address],
+ erc721Token,
+ erc721Balances,
+ exchangeContract.address,
+ );
+
+ const testLibsContract = await TestLibsContract.deployFrom0xArtifactAsync(artifacts.TestLibs, provider, txDefaults);
+
+ const fillOrderCombinatorialUtils = new FillOrderCombinatorialUtils(
+ orderFactory,
+ ownerAddress,
+ makerAddress,
+ makerPrivateKey,
+ takerAddress,
+ zrxAssetData,
+ exchangeWrapper,
+ assetWrapper,
+ testLibsContract,
+ );
+ return fillOrderCombinatorialUtils;
+}
+
+export class FillOrderCombinatorialUtils {
+ public orderFactory: OrderFactoryFromScenario;
+ public ownerAddress: string;
+ public makerAddress: string;
+ public makerPrivateKey: Buffer;
+ public takerAddress: string;
+ public zrxAssetData: string;
+ public exchangeWrapper: ExchangeWrapper;
+ public assetWrapper: AssetWrapper;
+ public testLibsContract: TestLibsContract;
+ public static generateFillOrderCombinations(): FillScenario[] {
+ const takerScenarios = [
+ TakerScenario.Unspecified,
+ // TakerScenario.CorrectlySpecified,
+ // TakerScenario.IncorrectlySpecified,
+ ];
+ const feeRecipientScenarios = [
+ FeeRecipientAddressScenario.EthUserAddress,
+ // FeeRecipientAddressScenario.BurnAddress,
+ ];
+ const makerAssetAmountScenario = [
+ OrderAssetAmountScenario.Large,
+ // OrderAssetAmountScenario.Zero,
+ // OrderAssetAmountScenario.Small,
+ ];
+ const takerAssetAmountScenario = [
+ OrderAssetAmountScenario.Large,
+ // OrderAssetAmountScenario.Zero,
+ // OrderAssetAmountScenario.Small,
+ ];
+ const makerFeeScenario = [
+ OrderAssetAmountScenario.Large,
+ // OrderAssetAmountScenario.Small,
+ // OrderAssetAmountScenario.Zero,
+ ];
+ const takerFeeScenario = [
+ OrderAssetAmountScenario.Large,
+ // OrderAssetAmountScenario.Small,
+ // OrderAssetAmountScenario.Zero,
+ ];
+ const expirationTimeSecondsScenario = [
+ ExpirationTimeSecondsScenario.InFuture,
+ ExpirationTimeSecondsScenario.InPast,
+ ];
+ const makerAssetDataScenario = [
+ AssetDataScenario.ERC20FiveDecimals,
+ AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ AssetDataScenario.ERC721,
+ AssetDataScenario.ZRXFeeToken,
+ ];
+ const takerAssetDataScenario = [
+ AssetDataScenario.ERC20FiveDecimals,
+ AssetDataScenario.ERC20NonZRXEighteenDecimals,
+ AssetDataScenario.ERC721,
+ AssetDataScenario.ZRXFeeToken,
+ ];
+ const takerAssetFillAmountScenario = [
+ TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount,
+ // TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount,
+ // TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount,
+ ];
+ const makerAssetBalanceScenario = [
+ BalanceAmountScenario.Higher,
+ // BalanceAmountScenario.Exact,
+ // BalanceAmountScenario.TooLow,
+ ];
+ const makerAssetAllowanceScenario = [
+ AllowanceAmountScenario.Higher,
+ // AllowanceAmountScenario.Exact,
+ // AllowanceAmountScenario.TooLow,
+ // AllowanceAmountScenario.Unlimited,
+ ];
+ const makerZRXBalanceScenario = [
+ BalanceAmountScenario.Higher,
+ // BalanceAmountScenario.Exact,
+ // BalanceAmountScenario.TooLow,
+ ];
+ const makerZRXAllowanceScenario = [
+ AllowanceAmountScenario.Higher,
+ // AllowanceAmountScenario.Exact,
+ // AllowanceAmountScenario.TooLow,
+ // AllowanceAmountScenario.Unlimited,
+ ];
+ const takerAssetBalanceScenario = [
+ BalanceAmountScenario.Higher,
+ // BalanceAmountScenario.Exact,
+ // BalanceAmountScenario.TooLow,
+ ];
+ const takerAssetAllowanceScenario = [
+ AllowanceAmountScenario.Higher,
+ // AllowanceAmountScenario.Exact,
+ // AllowanceAmountScenario.TooLow,
+ // AllowanceAmountScenario.Unlimited,
+ ];
+ const takerZRXBalanceScenario = [
+ BalanceAmountScenario.Higher,
+ // BalanceAmountScenario.Exact,
+ // BalanceAmountScenario.TooLow,
+ ];
+ const takerZRXAllowanceScenario = [
+ AllowanceAmountScenario.Higher,
+ // AllowanceAmountScenario.Exact,
+ // AllowanceAmountScenario.TooLow,
+ // AllowanceAmountScenario.Unlimited,
+ ];
+ const fillScenarioArrays = FillOrderCombinatorialUtils._getAllCombinations([
+ takerScenarios,
+ feeRecipientScenarios,
+ makerAssetAmountScenario,
+ takerAssetAmountScenario,
+ makerFeeScenario,
+ takerFeeScenario,
+ expirationTimeSecondsScenario,
+ makerAssetDataScenario,
+ takerAssetDataScenario,
+ takerAssetFillAmountScenario,
+ makerAssetBalanceScenario,
+ makerAssetAllowanceScenario,
+ makerZRXBalanceScenario,
+ makerZRXAllowanceScenario,
+ takerAssetBalanceScenario,
+ takerAssetAllowanceScenario,
+ takerZRXBalanceScenario,
+ takerZRXAllowanceScenario,
+ ]);
+
+ const fillScenarios = _.map(fillScenarioArrays, fillScenarioArray => {
+ // tslint:disable:custom-no-magic-numbers
+ const fillScenario: FillScenario = {
+ orderScenario: {
+ takerScenario: fillScenarioArray[0] as TakerScenario,
+ feeRecipientScenario: fillScenarioArray[1] as FeeRecipientAddressScenario,
+ makerAssetAmountScenario: fillScenarioArray[2] as OrderAssetAmountScenario,
+ takerAssetAmountScenario: fillScenarioArray[3] as OrderAssetAmountScenario,
+ makerFeeScenario: fillScenarioArray[4] as OrderAssetAmountScenario,
+ takerFeeScenario: fillScenarioArray[5] as OrderAssetAmountScenario,
+ expirationTimeSecondsScenario: fillScenarioArray[6] as ExpirationTimeSecondsScenario,
+ makerAssetDataScenario: fillScenarioArray[7] as AssetDataScenario,
+ takerAssetDataScenario: fillScenarioArray[8] as AssetDataScenario,
+ },
+ takerAssetFillAmountScenario: fillScenarioArray[9] as TakerAssetFillAmountScenario,
+ makerStateScenario: {
+ traderAssetBalance: fillScenarioArray[10] as BalanceAmountScenario,
+ traderAssetAllowance: fillScenarioArray[11] as AllowanceAmountScenario,
+ zrxFeeBalance: fillScenarioArray[12] as BalanceAmountScenario,
+ zrxFeeAllowance: fillScenarioArray[13] as AllowanceAmountScenario,
+ },
+ takerStateScenario: {
+ traderAssetBalance: fillScenarioArray[14] as BalanceAmountScenario,
+ traderAssetAllowance: fillScenarioArray[15] as AllowanceAmountScenario,
+ zrxFeeBalance: fillScenarioArray[16] as BalanceAmountScenario,
+ zrxFeeAllowance: fillScenarioArray[17] as AllowanceAmountScenario,
+ },
+ };
+ // tslint:enable:custom-no-magic-numbers
+ return fillScenario;
+ });
+
+ return fillScenarios;
+ }
+ /**
+ * Recursive implementation of generating all combinations of the supplied
+ * string-containing arrays.
+ */
+ private static _getAllCombinations(arrays: string[][]): string[][] {
+ // Base case
+ if (arrays.length === 1) {
+ const remainingValues = _.map(arrays[0], val => {
+ return [val];
+ });
+ return remainingValues;
+ } else {
+ const result = [];
+ const restOfArrays = arrays.slice(1);
+ const allCombinationsOfRemaining = FillOrderCombinatorialUtils._getAllCombinations(restOfArrays); // recur with the rest of array
+ // tslint:disable:prefer-for-of
+ for (let i = 0; i < allCombinationsOfRemaining.length; i++) {
+ for (let j = 0; j < arrays[0].length; j++) {
+ result.push([arrays[0][j], ...allCombinationsOfRemaining[i]]);
+ }
+ }
+ // tslint:enable:prefer-for-of
+ return result;
+ }
+ }
+ constructor(
+ orderFactory: OrderFactoryFromScenario,
+ ownerAddress: string,
+ makerAddress: string,
+ makerPrivateKey: Buffer,
+ takerAddress: string,
+ zrxAssetData: string,
+ exchangeWrapper: ExchangeWrapper,
+ assetWrapper: AssetWrapper,
+ testLibsContract: TestLibsContract,
+ ) {
+ this.orderFactory = orderFactory;
+ this.ownerAddress = ownerAddress;
+ this.makerAddress = makerAddress;
+ this.makerPrivateKey = makerPrivateKey;
+ this.takerAddress = takerAddress;
+ this.zrxAssetData = zrxAssetData;
+ this.exchangeWrapper = exchangeWrapper;
+ this.assetWrapper = assetWrapper;
+ this.testLibsContract = testLibsContract;
+ }
+ public async testFillOrderScenarioAsync(
+ provider: Provider,
+ fillScenario: FillScenario,
+ isVerbose: boolean = false,
+ ): Promise<void> {
+ // 1. Generate order
+ const order = this.orderFactory.generateOrder(fillScenario.orderScenario);
+
+ // 2. Sign order
+ const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
+ const signature = signingUtils.signMessage(orderHashBuff, this.makerPrivateKey, SignatureType.EthSign);
+ const signedOrder = {
+ ...order,
+ signature: `0x${signature.toString('hex')}`,
+ };
+
+ const balanceAndProxyAllowanceFetcher = new SimpleAssetBalanceAndProxyAllowanceFetcher(this.assetWrapper);
+ const orderFilledCancelledFetcher = new SimpleOrderFilledCancelledFetcher(
+ this.exchangeWrapper,
+ this.zrxAssetData,
+ );
+
+ // 3. Figure out fill amount
+ const takerAssetFillAmount = await this._getTakerAssetFillAmountAsync(
+ signedOrder,
+ fillScenario.takerAssetFillAmountScenario,
+ balanceAndProxyAllowanceFetcher,
+ orderFilledCancelledFetcher,
+ );
+
+ // 4. Permutate the maker and taker balance/allowance scenarios
+ await this._modifyTraderStateAsync(
+ fillScenario.makerStateScenario,
+ fillScenario.takerStateScenario,
+ signedOrder,
+ takerAssetFillAmount,
+ );
+
+ // 5. If I fill it by X, what are the resulting balances/allowances/filled amounts expected?
+ const orderValidationUtils = new OrderValidationUtils(orderFilledCancelledFetcher);
+ const lazyStore = new BalanceAndProxyAllowanceLazyStore(balanceAndProxyAllowanceFetcher);
+ const exchangeTransferSimulator = new ExchangeTransferSimulator(lazyStore);
+
+ let fillRevertReasonIfExists;
+ try {
+ await orderValidationUtils.validateFillOrderThrowIfInvalidAsync(
+ exchangeTransferSimulator,
+ provider,
+ signedOrder,
+ takerAssetFillAmount,
+ this.takerAddress,
+ this.zrxAssetData,
+ );
+ if (isVerbose) {
+ logUtils.log(`Expecting fillOrder to succeed.`);
+ }
+ } catch (err) {
+ fillRevertReasonIfExists = err.message;
+ if (isVerbose) {
+ logUtils.log(`Expecting fillOrder to fail with:`);
+ logUtils.log(err);
+ }
+ }
+
+ // 6. Fill the order
+ await this._fillOrderAndAssertOutcomeAsync(
+ signedOrder,
+ takerAssetFillAmount,
+ lazyStore,
+ fillRevertReasonIfExists,
+ );
+
+ await this._abiEncodeFillOrderAndAssertOutcomeAsync(signedOrder, takerAssetFillAmount);
+ }
+ private async _fillOrderAndAssertOutcomeAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ lazyStore: BalanceAndProxyAllowanceLazyStore,
+ fillRevertReasonIfExists: RevertReason | undefined,
+ ): Promise<void> {
+ if (!_.isUndefined(fillRevertReasonIfExists)) {
+ return expectTransactionFailedAsync(
+ this.exchangeWrapper.fillOrderAsync(signedOrder, this.takerAddress, { takerAssetFillAmount }),
+ fillRevertReasonIfExists,
+ );
+ }
+
+ const makerAddress = signedOrder.makerAddress;
+ const makerAssetData = signedOrder.makerAssetData;
+ const takerAssetData = signedOrder.takerAssetData;
+ const feeRecipient = signedOrder.feeRecipientAddress;
+
+ const expMakerAssetBalanceOfMaker = await lazyStore.getBalanceAsync(makerAssetData, makerAddress);
+ const expMakerAssetAllowanceOfMaker = await lazyStore.getProxyAllowanceAsync(makerAssetData, makerAddress);
+ const expTakerAssetBalanceOfMaker = await lazyStore.getBalanceAsync(takerAssetData, makerAddress);
+ const expZRXAssetBalanceOfMaker = await lazyStore.getBalanceAsync(this.zrxAssetData, makerAddress);
+ const expZRXAssetAllowanceOfMaker = await lazyStore.getProxyAllowanceAsync(this.zrxAssetData, makerAddress);
+ const expTakerAssetBalanceOfTaker = await lazyStore.getBalanceAsync(takerAssetData, this.takerAddress);
+ const expTakerAssetAllowanceOfTaker = await lazyStore.getProxyAllowanceAsync(takerAssetData, this.takerAddress);
+ const expMakerAssetBalanceOfTaker = await lazyStore.getBalanceAsync(makerAssetData, this.takerAddress);
+ const expZRXAssetBalanceOfTaker = await lazyStore.getBalanceAsync(this.zrxAssetData, this.takerAddress);
+ const expZRXAssetAllowanceOfTaker = await lazyStore.getProxyAllowanceAsync(
+ this.zrxAssetData,
+ this.takerAddress,
+ );
+ const expZRXAssetBalanceOfFeeRecipient = await lazyStore.getBalanceAsync(this.zrxAssetData, feeRecipient);
+
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const alreadyFilledTakerAmount = await this.exchangeWrapper.getTakerAssetFilledAmountAsync(orderHash);
+ const remainingTakerAmountToFill = signedOrder.takerAssetAmount.minus(alreadyFilledTakerAmount);
+ const expFilledTakerAmount = takerAssetFillAmount.gt(remainingTakerAmountToFill)
+ ? remainingTakerAmountToFill
+ : alreadyFilledTakerAmount.add(takerAssetFillAmount);
+
+ const expFilledMakerAmount = orderUtils.getPartialAmount(
+ expFilledTakerAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerAssetAmount,
+ );
+ const expMakerFeePaid = orderUtils.getPartialAmount(
+ expFilledTakerAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerFee,
+ );
+ const expTakerFeePaid = orderUtils.getPartialAmount(
+ expFilledTakerAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.takerFee,
+ );
+ const fillResults = await this.exchangeWrapper.getFillOrderResultsAsync(signedOrder, this.takerAddress, {
+ takerAssetFillAmount,
+ });
+ expect(fillResults.takerAssetFilledAmount).to.be.bignumber.equal(
+ expFilledTakerAmount,
+ 'takerAssetFilledAmount',
+ );
+ expect(fillResults.makerAssetFilledAmount).to.be.bignumber.equal(
+ expFilledMakerAmount,
+ 'makerAssetFilledAmount',
+ );
+ expect(fillResults.takerFeePaid).to.be.bignumber.equal(expTakerFeePaid, 'takerFeePaid');
+ expect(fillResults.makerFeePaid).to.be.bignumber.equal(expMakerFeePaid, 'makerFeePaid');
+
+ // - Let's fill the order!
+ const txReceipt = await this.exchangeWrapper.fillOrderAsync(signedOrder, this.takerAddress, {
+ takerAssetFillAmount,
+ });
+
+ const actFilledTakerAmount = await this.exchangeWrapper.getTakerAssetFilledAmountAsync(orderHash);
+ expect(actFilledTakerAmount).to.be.bignumber.equal(expFilledTakerAmount, 'filledTakerAmount');
+
+ expect(txReceipt.logs.length).to.be.equal(1, 'logs length');
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ const log = txReceipt.logs[0] as LogWithDecodedArgs<ExchangeFillEventArgs>;
+ expect(log.args.makerAddress).to.be.equal(makerAddress, 'log.args.makerAddress');
+ expect(log.args.takerAddress).to.be.equal(this.takerAddress, 'log.args.this.takerAddress');
+ expect(log.args.feeRecipientAddress).to.be.equal(feeRecipient, 'log.args.feeRecipientAddress');
+ expect(log.args.makerAssetFilledAmount).to.be.bignumber.equal(
+ expFilledMakerAmount,
+ 'log.args.makerAssetFilledAmount',
+ );
+ expect(log.args.takerAssetFilledAmount).to.be.bignumber.equal(
+ expFilledTakerAmount,
+ 'log.args.takerAssetFilledAmount',
+ );
+ expect(log.args.makerFeePaid).to.be.bignumber.equal(expMakerFeePaid, 'log.args.makerFeePaid');
+ expect(log.args.takerFeePaid).to.be.bignumber.equal(expTakerFeePaid, 'logs.args.takerFeePaid');
+ expect(log.args.orderHash).to.be.equal(orderHash, 'log.args.orderHash');
+ expect(log.args.makerAssetData).to.be.equal(makerAssetData, 'log.args.makerAssetData');
+ expect(log.args.takerAssetData).to.be.equal(takerAssetData, 'log.args.takerAssetData');
+
+ const actMakerAssetBalanceOfMaker = await this.assetWrapper.getBalanceAsync(makerAddress, makerAssetData);
+ expect(actMakerAssetBalanceOfMaker).to.be.bignumber.equal(
+ expMakerAssetBalanceOfMaker,
+ 'makerAssetBalanceOfMaker',
+ );
+
+ const actMakerAssetAllowanceOfMaker = await this.assetWrapper.getProxyAllowanceAsync(
+ makerAddress,
+ makerAssetData,
+ );
+ expect(actMakerAssetAllowanceOfMaker).to.be.bignumber.equal(
+ expMakerAssetAllowanceOfMaker,
+ 'makerAssetAllowanceOfMaker',
+ );
+
+ const actTakerAssetBalanceOfMaker = await this.assetWrapper.getBalanceAsync(makerAddress, takerAssetData);
+ expect(actTakerAssetBalanceOfMaker).to.be.bignumber.equal(
+ expTakerAssetBalanceOfMaker,
+ 'takerAssetBalanceOfMaker',
+ );
+
+ const actZRXAssetBalanceOfMaker = await this.assetWrapper.getBalanceAsync(makerAddress, this.zrxAssetData);
+ expect(actZRXAssetBalanceOfMaker).to.be.bignumber.equal(expZRXAssetBalanceOfMaker, 'ZRXAssetBalanceOfMaker');
+
+ const actZRXAssetAllowanceOfMaker = await this.assetWrapper.getProxyAllowanceAsync(
+ makerAddress,
+ this.zrxAssetData,
+ );
+ expect(actZRXAssetAllowanceOfMaker).to.be.bignumber.equal(
+ expZRXAssetAllowanceOfMaker,
+ 'ZRXAssetAllowanceOfMaker',
+ );
+
+ const actTakerAssetBalanceOfTaker = await this.assetWrapper.getBalanceAsync(this.takerAddress, takerAssetData);
+ expect(actTakerAssetBalanceOfTaker).to.be.bignumber.equal(
+ expTakerAssetBalanceOfTaker,
+ 'TakerAssetBalanceOfTaker',
+ );
+
+ const actTakerAssetAllowanceOfTaker = await this.assetWrapper.getProxyAllowanceAsync(
+ this.takerAddress,
+ takerAssetData,
+ );
+
+ expect(actTakerAssetAllowanceOfTaker).to.be.bignumber.equal(
+ expTakerAssetAllowanceOfTaker,
+ 'TakerAssetAllowanceOfTaker',
+ );
+
+ const actMakerAssetBalanceOfTaker = await this.assetWrapper.getBalanceAsync(this.takerAddress, makerAssetData);
+ expect(actMakerAssetBalanceOfTaker).to.be.bignumber.equal(
+ expMakerAssetBalanceOfTaker,
+ 'MakerAssetBalanceOfTaker',
+ );
+
+ const actZRXAssetBalanceOfTaker = await this.assetWrapper.getBalanceAsync(this.takerAddress, this.zrxAssetData);
+ expect(actZRXAssetBalanceOfTaker).to.be.bignumber.equal(expZRXAssetBalanceOfTaker, 'ZRXAssetBalanceOfTaker');
+
+ const actZRXAssetAllowanceOfTaker = await this.assetWrapper.getProxyAllowanceAsync(
+ this.takerAddress,
+ this.zrxAssetData,
+ );
+ expect(actZRXAssetAllowanceOfTaker).to.be.bignumber.equal(
+ expZRXAssetAllowanceOfTaker,
+ 'ZRXAssetAllowanceOfTaker',
+ );
+
+ const actZRXAssetBalanceOfFeeRecipient = await this.assetWrapper.getBalanceAsync(
+ feeRecipient,
+ this.zrxAssetData,
+ );
+ expect(actZRXAssetBalanceOfFeeRecipient).to.be.bignumber.equal(
+ expZRXAssetBalanceOfFeeRecipient,
+ 'ZRXAssetBalanceOfFeeRecipient',
+ );
+ }
+ private async _abiEncodeFillOrderAndAssertOutcomeAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ ): Promise<void> {
+ const params = orderUtils.createFill(signedOrder, takerAssetFillAmount);
+ const expectedAbiEncodedData = this.exchangeWrapper.abiEncodeFillOrder(signedOrder, { takerAssetFillAmount });
+ const libsAbiEncodedData = await this.testLibsContract.publicAbiEncodeFillOrder.callAsync(
+ params.order,
+ params.takerAssetFillAmount,
+ params.signature,
+ );
+ expect(libsAbiEncodedData).to.be.equal(expectedAbiEncodedData, 'ABIEncodedFillOrderData');
+ }
+ private async _getTakerAssetFillAmountAsync(
+ signedOrder: SignedOrder,
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario,
+ balanceAndProxyAllowanceFetcher: SimpleAssetBalanceAndProxyAllowanceFetcher,
+ orderFilledCancelledFetcher: SimpleOrderFilledCancelledFetcher,
+ ): Promise<BigNumber> {
+ const orderStateUtils = new OrderStateUtils(balanceAndProxyAllowanceFetcher, orderFilledCancelledFetcher);
+ const fillableTakerAssetAmount = await orderStateUtils.getMaxFillableTakerAssetAmountAsync(
+ signedOrder,
+ this.takerAddress,
+ );
+
+ let takerAssetFillAmount;
+ switch (takerAssetFillAmountScenario) {
+ case TakerAssetFillAmountScenario.Zero:
+ takerAssetFillAmount = new BigNumber(0);
+ break;
+
+ case TakerAssetFillAmountScenario.ExactlyRemainingFillableTakerAssetAmount:
+ takerAssetFillAmount = fillableTakerAssetAmount;
+ break;
+
+ case TakerAssetFillAmountScenario.GreaterThanRemainingFillableTakerAssetAmount:
+ takerAssetFillAmount = fillableTakerAssetAmount.add(1);
+ break;
+
+ case TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount:
+ const takerAssetProxyId = assetDataUtils.decodeAssetProxyId(signedOrder.takerAssetData);
+ const makerAssetProxyId = assetDataUtils.decodeAssetProxyId(signedOrder.makerAssetData);
+ const isEitherAssetERC721 =
+ takerAssetProxyId === AssetProxyId.ERC721 || makerAssetProxyId === AssetProxyId.ERC721;
+ if (isEitherAssetERC721) {
+ throw new Error(
+ 'Cannot test `TakerAssetFillAmountScenario.LessThanRemainingFillableTakerAssetAmount` together with ERC721 assets since orders involving ERC721 must always be filled exactly.',
+ );
+ }
+ takerAssetFillAmount = fillableTakerAssetAmount.div(2).floor();
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr('TakerAssetFillAmountScenario', takerAssetFillAmountScenario);
+ }
+
+ return takerAssetFillAmount;
+ }
+ private async _modifyTraderStateAsync(
+ makerStateScenario: TraderStateScenario,
+ takerStateScenario: TraderStateScenario,
+ signedOrder: SignedOrder,
+ takerAssetFillAmount: BigNumber,
+ ): Promise<void> {
+ const makerAssetFillAmount = orderUtils.getPartialAmount(
+ takerAssetFillAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerAssetAmount,
+ );
+ switch (makerStateScenario.traderAssetBalance) {
+ case BalanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case BalanceAmountScenario.TooLow:
+ if (makerAssetFillAmount.eq(0)) {
+ throw new Error(`Cannot set makerAssetBalanceOfMaker TooLow if makerAssetFillAmount is 0`);
+ }
+ const tooLowBalance = makerAssetFillAmount.minus(1);
+ await this.assetWrapper.setBalanceAsync(
+ signedOrder.makerAddress,
+ signedOrder.makerAssetData,
+ tooLowBalance,
+ );
+ break;
+
+ case BalanceAmountScenario.Exact:
+ const exactBalance = makerAssetFillAmount;
+ await this.assetWrapper.setBalanceAsync(
+ signedOrder.makerAddress,
+ signedOrder.makerAssetData,
+ exactBalance,
+ );
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'makerStateScenario.traderAssetBalance',
+ makerStateScenario.traderAssetBalance,
+ );
+ }
+
+ const makerFee = orderUtils.getPartialAmount(
+ takerAssetFillAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerFee,
+ );
+ switch (makerStateScenario.zrxFeeBalance) {
+ case BalanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case BalanceAmountScenario.TooLow:
+ if (makerFee.eq(0)) {
+ throw new Error(`Cannot set zrxAsserBalanceOfMaker TooLow if makerFee is 0`);
+ }
+ const tooLowBalance = makerFee.minus(1);
+ await this.assetWrapper.setBalanceAsync(signedOrder.makerAddress, this.zrxAssetData, tooLowBalance);
+ break;
+
+ case BalanceAmountScenario.Exact:
+ const exactBalance = makerFee;
+ await this.assetWrapper.setBalanceAsync(signedOrder.makerAddress, this.zrxAssetData, exactBalance);
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr('makerStateScenario.zrxFeeBalance', makerStateScenario.zrxFeeBalance);
+ }
+
+ switch (makerStateScenario.traderAssetAllowance) {
+ case AllowanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case AllowanceAmountScenario.TooLow:
+ const tooLowAllowance = makerAssetFillAmount.minus(1);
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ signedOrder.makerAssetData,
+ tooLowAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Exact:
+ const exactAllowance = makerAssetFillAmount;
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ signedOrder.makerAssetData,
+ exactAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Unlimited:
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ signedOrder.makerAssetData,
+ constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'makerStateScenario.traderAssetAllowance',
+ makerStateScenario.traderAssetAllowance,
+ );
+ }
+
+ switch (makerStateScenario.zrxFeeAllowance) {
+ case AllowanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case AllowanceAmountScenario.TooLow:
+ const tooLowAllowance = makerFee.minus(1);
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ this.zrxAssetData,
+ tooLowAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Exact:
+ const exactAllowance = makerFee;
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ this.zrxAssetData,
+ exactAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Unlimited:
+ await this.assetWrapper.setProxyAllowanceAsync(
+ signedOrder.makerAddress,
+ this.zrxAssetData,
+ constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'makerStateScenario.zrxFeeAllowance',
+ makerStateScenario.zrxFeeAllowance,
+ );
+ }
+
+ switch (takerStateScenario.traderAssetBalance) {
+ case BalanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case BalanceAmountScenario.TooLow:
+ if (takerAssetFillAmount.eq(0)) {
+ throw new Error(`Cannot set takerAssetBalanceOfTaker TooLow if takerAssetFillAmount is 0`);
+ }
+ const tooLowBalance = takerAssetFillAmount.minus(1);
+ await this.assetWrapper.setBalanceAsync(this.takerAddress, signedOrder.takerAssetData, tooLowBalance);
+ break;
+
+ case BalanceAmountScenario.Exact:
+ const exactBalance = takerAssetFillAmount;
+ await this.assetWrapper.setBalanceAsync(this.takerAddress, signedOrder.takerAssetData, exactBalance);
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'takerStateScenario.traderAssetBalance',
+ takerStateScenario.traderAssetBalance,
+ );
+ }
+
+ const takerFee = orderUtils.getPartialAmount(
+ takerAssetFillAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.takerFee,
+ );
+ switch (takerStateScenario.zrxFeeBalance) {
+ case BalanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case BalanceAmountScenario.TooLow:
+ if (takerFee.eq(0)) {
+ throw new Error(`Cannot set zrxAssetBalanceOfTaker TooLow if takerFee is 0`);
+ }
+ const tooLowBalance = takerFee.minus(1);
+ await this.assetWrapper.setBalanceAsync(this.takerAddress, this.zrxAssetData, tooLowBalance);
+ break;
+
+ case BalanceAmountScenario.Exact:
+ const exactBalance = takerFee;
+ await this.assetWrapper.setBalanceAsync(this.takerAddress, this.zrxAssetData, exactBalance);
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr('takerStateScenario.zrxFeeBalance', takerStateScenario.zrxFeeBalance);
+ }
+
+ switch (takerStateScenario.traderAssetAllowance) {
+ case AllowanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case AllowanceAmountScenario.TooLow:
+ const tooLowAllowance = takerAssetFillAmount.minus(1);
+ await this.assetWrapper.setProxyAllowanceAsync(
+ this.takerAddress,
+ signedOrder.takerAssetData,
+ tooLowAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Exact:
+ const exactAllowance = takerAssetFillAmount;
+ await this.assetWrapper.setProxyAllowanceAsync(
+ this.takerAddress,
+ signedOrder.takerAssetData,
+ exactAllowance,
+ );
+ break;
+
+ case AllowanceAmountScenario.Unlimited:
+ await this.assetWrapper.setProxyAllowanceAsync(
+ this.takerAddress,
+ signedOrder.takerAssetData,
+ constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'takerStateScenario.traderAssetAllowance',
+ takerStateScenario.traderAssetAllowance,
+ );
+ }
+
+ switch (takerStateScenario.zrxFeeAllowance) {
+ case AllowanceAmountScenario.Higher:
+ break; // Noop since this is already the default
+
+ case AllowanceAmountScenario.TooLow:
+ const tooLowAllowance = takerFee.minus(1);
+ await this.assetWrapper.setProxyAllowanceAsync(this.takerAddress, this.zrxAssetData, tooLowAllowance);
+ break;
+
+ case AllowanceAmountScenario.Exact:
+ const exactAllowance = takerFee;
+ await this.assetWrapper.setProxyAllowanceAsync(this.takerAddress, this.zrxAssetData, exactAllowance);
+ break;
+
+ case AllowanceAmountScenario.Unlimited:
+ await this.assetWrapper.setProxyAllowanceAsync(
+ this.takerAddress,
+ this.zrxAssetData,
+ constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ );
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'takerStateScenario.zrxFeeAllowance',
+ takerStateScenario.zrxFeeAllowance,
+ );
+ }
+ }
+} // tslint:disable:max-file-line-count
diff --git a/packages/contracts/test/utils/formatters.ts b/packages/contracts/test/utils/formatters.ts
new file mode 100644
index 000000000..32e4787d6
--- /dev/null
+++ b/packages/contracts/test/utils/formatters.ts
@@ -0,0 +1,68 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { orderUtils } from './order_utils';
+import { BatchCancelOrders, BatchFillOrders, MarketBuyOrders, MarketSellOrders } from './types';
+
+export const formatters = {
+ createBatchFill(signedOrders: SignedOrder[], takerAssetFillAmounts: BigNumber[] = []): BatchFillOrders {
+ const batchFill: BatchFillOrders = {
+ orders: [],
+ signatures: [],
+ takerAssetFillAmounts,
+ };
+ _.forEach(signedOrders, signedOrder => {
+ const orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ batchFill.orders.push(orderWithoutExchangeAddress);
+ batchFill.signatures.push(signedOrder.signature);
+ if (takerAssetFillAmounts.length < signedOrders.length) {
+ batchFill.takerAssetFillAmounts.push(signedOrder.takerAssetAmount);
+ }
+ });
+ return batchFill;
+ },
+ createMarketSellOrders(signedOrders: SignedOrder[], takerAssetFillAmount: BigNumber): MarketSellOrders {
+ const marketSellOrders: MarketSellOrders = {
+ orders: [],
+ signatures: [],
+ takerAssetFillAmount,
+ };
+ _.forEach(signedOrders, (signedOrder, i) => {
+ const orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ if (i !== 0) {
+ orderWithoutExchangeAddress.takerAssetData = constants.NULL_BYTES;
+ }
+ marketSellOrders.orders.push(orderWithoutExchangeAddress);
+ marketSellOrders.signatures.push(signedOrder.signature);
+ });
+ return marketSellOrders;
+ },
+ createMarketBuyOrders(signedOrders: SignedOrder[], makerAssetFillAmount: BigNumber): MarketBuyOrders {
+ const marketBuyOrders: MarketBuyOrders = {
+ orders: [],
+ signatures: [],
+ makerAssetFillAmount,
+ };
+ _.forEach(signedOrders, (signedOrder, i) => {
+ const orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ if (i !== 0) {
+ orderWithoutExchangeAddress.makerAssetData = constants.NULL_BYTES;
+ }
+ marketBuyOrders.orders.push(orderWithoutExchangeAddress);
+ marketBuyOrders.signatures.push(signedOrder.signature);
+ });
+ return marketBuyOrders;
+ },
+ createBatchCancel(signedOrders: SignedOrder[]): BatchCancelOrders {
+ const batchCancel: BatchCancelOrders = {
+ orders: [],
+ };
+ _.forEach(signedOrders, signedOrder => {
+ const orderWithoutExchangeAddress = orderUtils.getOrderWithoutExchangeAddress(signedOrder);
+ batchCancel.orders.push(orderWithoutExchangeAddress);
+ });
+ return batchCancel;
+ },
+};
diff --git a/packages/contracts/test/utils/forwarder_wrapper.ts b/packages/contracts/test/utils/forwarder_wrapper.ts
new file mode 100644
index 000000000..5b9a63ddf
--- /dev/null
+++ b/packages/contracts/test/utils/forwarder_wrapper.ts
@@ -0,0 +1,118 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TransactionReceiptWithDecodedLogs, TxDataPayable } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { ForwarderContract } from '../../generated_contract_wrappers/forwarder';
+
+import { constants } from './constants';
+import { formatters } from './formatters';
+import { LogDecoder } from './log_decoder';
+import { MarketSellOrders } from './types';
+
+export class ForwarderWrapper {
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _forwarderContract: ForwarderContract;
+ private readonly _logDecoder: LogDecoder;
+ public static getPercentageOfValue(value: BigNumber, percentage: number): BigNumber {
+ const numerator = constants.PERCENTAGE_DENOMINATOR.times(percentage).dividedToIntegerBy(100);
+ const newValue = value.times(numerator).dividedToIntegerBy(constants.PERCENTAGE_DENOMINATOR);
+ return newValue;
+ }
+ public static getWethForFeeOrders(feeAmount: BigNumber, feeOrders: SignedOrder[]): BigNumber {
+ let wethAmount = new BigNumber(0);
+ let remainingFeeAmount = feeAmount;
+ _.forEach(feeOrders, feeOrder => {
+ const feeAvailable = feeOrder.makerAssetAmount.minus(feeOrder.takerFee);
+ if (!remainingFeeAmount.isZero() && feeAvailable.gt(remainingFeeAmount)) {
+ wethAmount = wethAmount
+ .plus(feeOrder.takerAssetAmount.times(remainingFeeAmount).dividedToIntegerBy(feeAvailable))
+ .plus(1);
+ remainingFeeAmount = new BigNumber(0);
+ } else if (!remainingFeeAmount.isZero()) {
+ wethAmount = wethAmount.plus(feeOrder.takerAssetAmount);
+ remainingFeeAmount = remainingFeeAmount.minus(feeAvailable);
+ }
+ });
+ return wethAmount;
+ }
+ private static _createOptimizedOrders(signedOrders: SignedOrder[]): MarketSellOrders {
+ _.forEach(signedOrders, (signedOrder, index) => {
+ signedOrder.takerAssetData = constants.NULL_BYTES;
+ if (index > 0) {
+ signedOrder.makerAssetData = constants.NULL_BYTES;
+ }
+ });
+ const params = formatters.createMarketSellOrders(signedOrders, constants.ZERO_AMOUNT);
+ return params;
+ }
+ private static _createOptimizedZrxOrders(signedOrders: SignedOrder[]): MarketSellOrders {
+ _.forEach(signedOrders, signedOrder => {
+ signedOrder.makerAssetData = constants.NULL_BYTES;
+ signedOrder.takerAssetData = constants.NULL_BYTES;
+ });
+ const params = formatters.createMarketSellOrders(signedOrders, constants.ZERO_AMOUNT);
+ return params;
+ }
+ constructor(contractInstance: ForwarderContract, provider: Provider) {
+ this._forwarderContract = contractInstance;
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._logDecoder = new LogDecoder(this._web3Wrapper, this._forwarderContract.address);
+ }
+ public async marketSellOrdersWithEthAsync(
+ orders: SignedOrder[],
+ feeOrders: SignedOrder[],
+ txData: TxDataPayable,
+ opts: { feePercentage?: BigNumber; feeRecipient?: string } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = ForwarderWrapper._createOptimizedOrders(orders);
+ const feeParams = ForwarderWrapper._createOptimizedZrxOrders(feeOrders);
+ const feePercentage = _.isUndefined(opts.feePercentage) ? constants.ZERO_AMOUNT : opts.feePercentage;
+ const feeRecipient = _.isUndefined(opts.feeRecipient) ? constants.NULL_ADDRESS : opts.feeRecipient;
+ const txHash = await this._forwarderContract.marketSellOrdersWithEth.sendTransactionAsync(
+ params.orders,
+ params.signatures,
+ feeParams.orders,
+ feeParams.signatures,
+ feePercentage,
+ feeRecipient,
+ txData,
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async marketBuyOrdersWithEthAsync(
+ orders: SignedOrder[],
+ feeOrders: SignedOrder[],
+ makerAssetFillAmount: BigNumber,
+ txData: TxDataPayable,
+ opts: { feePercentage?: BigNumber; feeRecipient?: string } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const params = ForwarderWrapper._createOptimizedOrders(orders);
+ const feeParams = ForwarderWrapper._createOptimizedZrxOrders(feeOrders);
+ const feePercentage = _.isUndefined(opts.feePercentage) ? constants.ZERO_AMOUNT : opts.feePercentage;
+ const feeRecipient = _.isUndefined(opts.feeRecipient) ? constants.NULL_ADDRESS : opts.feeRecipient;
+ const txHash = await this._forwarderContract.marketBuyOrdersWithEth.sendTransactionAsync(
+ params.orders,
+ makerAssetFillAmount,
+ params.signatures,
+ feeParams.orders,
+ feeParams.signatures,
+ feePercentage,
+ feeRecipient,
+ txData,
+ );
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async withdrawAssetAsync(
+ assetData: string,
+ amount: BigNumber,
+ txData: TxDataPayable,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._forwarderContract.withdrawAsset.sendTransactionAsync(assetData, amount, txData);
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+}
diff --git a/packages/contracts/test/utils/log_decoder.ts b/packages/contracts/test/utils/log_decoder.ts
new file mode 100644
index 000000000..5a4801319
--- /dev/null
+++ b/packages/contracts/test/utils/log_decoder.ts
@@ -0,0 +1,55 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+import { AbiDecoder, BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import {
+ AbiDefinition,
+ DecodedLogArgs,
+ LogEntry,
+ LogWithDecodedArgs,
+ RawLog,
+ TransactionReceiptWithDecodedLogs,
+} from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from './artifacts';
+import { constants } from './constants';
+
+export class LogDecoder {
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _contractAddress: string;
+ private readonly _abiDecoder: AbiDecoder;
+ public static wrapLogBigNumbers(log: any): any {
+ const argNames = _.keys(log.args);
+ for (const argName of argNames) {
+ const isWeb3BigNumber = _.startsWith(log.args[argName].constructor.toString(), 'function BigNumber(');
+ if (isWeb3BigNumber) {
+ log.args[argName] = new BigNumber(log.args[argName]);
+ }
+ }
+ }
+ constructor(web3Wrapper: Web3Wrapper, contractAddress: string) {
+ this._web3Wrapper = web3Wrapper;
+ this._contractAddress = contractAddress;
+ const abiArrays: AbiDefinition[][] = [];
+ _.forEach(artifacts, (artifact: ContractArtifact) => {
+ const compilerOutput = artifact.compilerOutput;
+ abiArrays.push(compilerOutput.abi);
+ });
+ this._abiDecoder = new AbiDecoder(abiArrays);
+ }
+ public decodeLogOrThrow<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
+ const logWithDecodedArgsOrLog = this._abiDecoder.tryToDecodeLogOrNoop(log);
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ if (_.isUndefined((logWithDecodedArgsOrLog as LogWithDecodedArgs<ArgsType>).args)) {
+ throw new Error(`Unable to decode log: ${JSON.stringify(log)}`);
+ }
+ LogDecoder.wrapLogBigNumbers(logWithDecodedArgsOrLog);
+ return logWithDecodedArgsOrLog;
+ }
+ public async getTxWithDecodedLogsAsync(txHash: string): Promise<TransactionReceiptWithDecodedLogs> {
+ const tx = await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ tx.logs = _.filter(tx.logs, log => log.address === this._contractAddress);
+ tx.logs = _.map(tx.logs, log => this.decodeLogOrThrow(log));
+ return tx;
+ }
+}
diff --git a/packages/contracts/test/utils/match_order_tester.ts b/packages/contracts/test/utils/match_order_tester.ts
new file mode 100644
index 000000000..fa2eabc12
--- /dev/null
+++ b/packages/contracts/test/utils/match_order_tester.ts
@@ -0,0 +1,326 @@
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { AssetProxyId, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { chaiSetup } from './chai_setup';
+import { ERC20Wrapper } from './erc20_wrapper';
+import { ERC721Wrapper } from './erc721_wrapper';
+import { ExchangeWrapper } from './exchange_wrapper';
+import { ERC20BalancesByOwner, ERC721TokenIdsByOwner, TransferAmountsByMatchOrders as TransferAmounts } from './types';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+export class MatchOrderTester {
+ private readonly _exchangeWrapper: ExchangeWrapper;
+ private readonly _erc20Wrapper: ERC20Wrapper;
+ private readonly _erc721Wrapper: ERC721Wrapper;
+ private readonly _feeTokenAddress: string;
+
+ /// @dev Compares a pair of ERC20 balances and a pair of ERC721 token owners.
+ /// @param expectedNewERC20BalancesByOwner Expected ERC20 balances.
+ /// @param realERC20BalancesByOwner Actual ERC20 balances.
+ /// @param expectedNewERC721TokenIdsByOwner Expected ERC721 token owners.
+ /// @param realERC721TokenIdsByOwner Actual ERC20 token owners.
+ /// @return True only if ERC20 balances match and ERC721 token owners match.
+ private static _compareExpectedAndRealBalances(
+ expectedNewERC20BalancesByOwner: ERC20BalancesByOwner,
+ realERC20BalancesByOwner: ERC20BalancesByOwner,
+ expectedNewERC721TokenIdsByOwner: ERC721TokenIdsByOwner,
+ realERC721TokenIdsByOwner: ERC721TokenIdsByOwner,
+ ): boolean {
+ // ERC20 Balances
+ const doesErc20BalancesMatch = _.isEqual(expectedNewERC20BalancesByOwner, realERC20BalancesByOwner);
+ if (!doesErc20BalancesMatch) {
+ return false;
+ }
+ // ERC721 Token Ids
+ const sortedExpectedNewERC721TokenIdsByOwner = _.mapValues(
+ expectedNewERC721TokenIdsByOwner,
+ tokenIdsByOwner => {
+ _.mapValues(tokenIdsByOwner, tokenIds => {
+ _.sortBy(tokenIds);
+ });
+ },
+ );
+ const sortedNewERC721TokenIdsByOwner = _.mapValues(realERC721TokenIdsByOwner, tokenIdsByOwner => {
+ _.mapValues(tokenIdsByOwner, tokenIds => {
+ _.sortBy(tokenIds);
+ });
+ });
+ const doesErc721TokenIdsMatch = _.isEqual(
+ sortedExpectedNewERC721TokenIdsByOwner,
+ sortedNewERC721TokenIdsByOwner,
+ );
+ return doesErc721TokenIdsMatch;
+ }
+ /// @dev Constructs new MatchOrderTester.
+ /// @param exchangeWrapper Used to call to the Exchange.
+ /// @param erc20Wrapper Used to fetch ERC20 balances.
+ /// @param erc721Wrapper Used to fetch ERC721 token owners.
+ /// @param feeTokenAddress Address of ERC20 fee token.
+ constructor(
+ exchangeWrapper: ExchangeWrapper,
+ erc20Wrapper: ERC20Wrapper,
+ erc721Wrapper: ERC721Wrapper,
+ feeTokenAddress: string,
+ ) {
+ this._exchangeWrapper = exchangeWrapper;
+ this._erc20Wrapper = erc20Wrapper;
+ this._erc721Wrapper = erc721Wrapper;
+ this._feeTokenAddress = feeTokenAddress;
+ }
+ /// @dev Matches two complementary orders and validates results.
+ /// Validation either succeeds or throws.
+ /// @param signedOrderLeft First matched order.
+ /// @param signedOrderRight Second matched order.
+ /// @param takerAddress Address of taker (the address who matched the two orders)
+ /// @param erc20BalancesByOwner Current ERC20 balances.
+ /// @param erc721TokenIdsByOwner Current ERC721 token owners.
+ /// @param initialTakerAssetFilledAmountLeft Current amount the left order has been filled.
+ /// @param initialTakerAssetFilledAmountRight Current amount the right order has been filled.
+ /// @return New ERC20 balances & ERC721 token owners.
+ public async matchOrdersAndVerifyBalancesAsync(
+ signedOrderLeft: SignedOrder,
+ signedOrderRight: SignedOrder,
+ takerAddress: string,
+ erc20BalancesByOwner: ERC20BalancesByOwner,
+ erc721TokenIdsByOwner: ERC721TokenIdsByOwner,
+ initialTakerAssetFilledAmountLeft?: BigNumber,
+ initialTakerAssetFilledAmountRight?: BigNumber,
+ ): Promise<[ERC20BalancesByOwner, ERC721TokenIdsByOwner]> {
+ // Verify Left order preconditions
+ const orderTakerAssetFilledAmountLeft = await this._exchangeWrapper.getTakerAssetFilledAmountAsync(
+ orderHashUtils.getOrderHashHex(signedOrderLeft),
+ );
+ const expectedOrderFilledAmountLeft = initialTakerAssetFilledAmountLeft
+ ? initialTakerAssetFilledAmountLeft
+ : new BigNumber(0);
+ expect(expectedOrderFilledAmountLeft).to.be.bignumber.equal(orderTakerAssetFilledAmountLeft);
+ // Verify Right order preconditions
+ const orderTakerAssetFilledAmountRight = await this._exchangeWrapper.getTakerAssetFilledAmountAsync(
+ orderHashUtils.getOrderHashHex(signedOrderRight),
+ );
+ const expectedOrderFilledAmountRight = initialTakerAssetFilledAmountRight
+ ? initialTakerAssetFilledAmountRight
+ : new BigNumber(0);
+ expect(expectedOrderFilledAmountRight).to.be.bignumber.equal(orderTakerAssetFilledAmountRight);
+ // Match left & right orders
+ await this._exchangeWrapper.matchOrdersAsync(signedOrderLeft, signedOrderRight, takerAddress);
+ const newERC20BalancesByOwner = await this._erc20Wrapper.getBalancesAsync();
+ const newERC721TokenIdsByOwner = await this._erc721Wrapper.getBalancesAsync();
+ // Calculate expected balance changes
+ const expectedTransferAmounts = await this._calculateExpectedTransferAmountsAsync(
+ signedOrderLeft,
+ signedOrderRight,
+ orderTakerAssetFilledAmountLeft,
+ orderTakerAssetFilledAmountRight,
+ );
+ let expectedERC20BalancesByOwner: ERC20BalancesByOwner;
+ let expectedERC721TokenIdsByOwner: ERC721TokenIdsByOwner;
+ [expectedERC20BalancesByOwner, expectedERC721TokenIdsByOwner] = this._calculateExpectedBalances(
+ signedOrderLeft,
+ signedOrderRight,
+ takerAddress,
+ erc20BalancesByOwner,
+ erc721TokenIdsByOwner,
+ expectedTransferAmounts,
+ );
+ // Assert our expected balances are equal to the actual balances
+ const didExpectedBalancesMatchRealBalances = MatchOrderTester._compareExpectedAndRealBalances(
+ expectedERC20BalancesByOwner,
+ newERC20BalancesByOwner,
+ expectedERC721TokenIdsByOwner,
+ newERC721TokenIdsByOwner,
+ );
+ expect(didExpectedBalancesMatchRealBalances).to.be.true();
+ return [newERC20BalancesByOwner, newERC721TokenIdsByOwner];
+ }
+ /// @dev Calculates expected transfer amounts between order makers, fee recipients, and
+ /// the taker when two orders are matched.
+ /// @param signedOrderLeft First matched order.
+ /// @param signedOrderRight Second matched order.
+ /// @param orderTakerAssetFilledAmountLeft How much left order has been filled, prior to matching orders.
+ /// @param orderTakerAssetFilledAmountRight How much the right order has been filled, prior to matching orders.
+ /// @return TransferAmounts A struct containing the expected transfer amounts.
+ private async _calculateExpectedTransferAmountsAsync(
+ signedOrderLeft: SignedOrder,
+ signedOrderRight: SignedOrder,
+ orderTakerAssetFilledAmountLeft: BigNumber,
+ orderTakerAssetFilledAmountRight: BigNumber,
+ ): Promise<TransferAmounts> {
+ let amountBoughtByLeftMaker = await this._exchangeWrapper.getTakerAssetFilledAmountAsync(
+ orderHashUtils.getOrderHashHex(signedOrderLeft),
+ );
+ amountBoughtByLeftMaker = amountBoughtByLeftMaker.minus(orderTakerAssetFilledAmountLeft);
+ const amountSoldByLeftMaker = amountBoughtByLeftMaker
+ .times(signedOrderLeft.makerAssetAmount)
+ .dividedToIntegerBy(signedOrderLeft.takerAssetAmount);
+ const amountReceivedByRightMaker = amountBoughtByLeftMaker
+ .times(signedOrderRight.takerAssetAmount)
+ .dividedToIntegerBy(signedOrderRight.makerAssetAmount);
+ const amountReceivedByTaker = amountSoldByLeftMaker.minus(amountReceivedByRightMaker);
+ let amountBoughtByRightMaker = await this._exchangeWrapper.getTakerAssetFilledAmountAsync(
+ orderHashUtils.getOrderHashHex(signedOrderRight),
+ );
+ amountBoughtByRightMaker = amountBoughtByRightMaker.minus(orderTakerAssetFilledAmountRight);
+ const amountSoldByRightMaker = amountBoughtByRightMaker
+ .times(signedOrderRight.makerAssetAmount)
+ .dividedToIntegerBy(signedOrderRight.takerAssetAmount);
+ const amountReceivedByLeftMaker = amountSoldByRightMaker;
+ const feePaidByLeftMaker = signedOrderLeft.makerFee
+ .times(amountSoldByLeftMaker)
+ .dividedToIntegerBy(signedOrderLeft.makerAssetAmount);
+ const feePaidByRightMaker = signedOrderRight.makerFee
+ .times(amountSoldByRightMaker)
+ .dividedToIntegerBy(signedOrderRight.makerAssetAmount);
+ const feePaidByTakerLeft = signedOrderLeft.takerFee
+ .times(amountSoldByLeftMaker)
+ .dividedToIntegerBy(signedOrderLeft.makerAssetAmount);
+ const feePaidByTakerRight = signedOrderRight.takerFee
+ .times(amountSoldByRightMaker)
+ .dividedToIntegerBy(signedOrderRight.makerAssetAmount);
+ const totalFeePaidByTaker = feePaidByTakerLeft.add(feePaidByTakerRight);
+ const feeReceivedLeft = feePaidByLeftMaker.add(feePaidByTakerLeft);
+ const feeReceivedRight = feePaidByRightMaker.add(feePaidByTakerRight);
+ // Return values
+ const expectedTransferAmounts = {
+ // Left Maker
+ amountBoughtByLeftMaker,
+ amountSoldByLeftMaker,
+ amountReceivedByLeftMaker,
+ feePaidByLeftMaker,
+ // Right Maker
+ amountBoughtByRightMaker,
+ amountSoldByRightMaker,
+ amountReceivedByRightMaker,
+ feePaidByRightMaker,
+ // Taker
+ amountReceivedByTaker,
+ feePaidByTakerLeft,
+ feePaidByTakerRight,
+ totalFeePaidByTaker,
+ // Fee Recipients
+ feeReceivedLeft,
+ feeReceivedRight,
+ };
+ return expectedTransferAmounts;
+ }
+ /// @dev Calculates the expected balances of order makers, fee recipients, and the taker,
+ /// as a result of matching two orders.
+ /// @param signedOrderLeft First matched order.
+ /// @param signedOrderRight Second matched order.
+ /// @param takerAddress Address of taker (the address who matched the two orders)
+ /// @param erc20BalancesByOwner Current ERC20 balances.
+ /// @param erc721TokenIdsByOwner Current ERC721 token owners.
+ /// @param expectedTransferAmounts A struct containing the expected transfer amounts.
+ /// @return Expected ERC20 balances & ERC721 token owners after orders have been matched.
+ private _calculateExpectedBalances(
+ signedOrderLeft: SignedOrder,
+ signedOrderRight: SignedOrder,
+ takerAddress: string,
+ erc20BalancesByOwner: ERC20BalancesByOwner,
+ erc721TokenIdsByOwner: ERC721TokenIdsByOwner,
+ expectedTransferAmounts: TransferAmounts,
+ ): [ERC20BalancesByOwner, ERC721TokenIdsByOwner] {
+ const makerAddressLeft = signedOrderLeft.makerAddress;
+ const makerAddressRight = signedOrderRight.makerAddress;
+ const feeRecipientAddressLeft = signedOrderLeft.feeRecipientAddress;
+ const feeRecipientAddressRight = signedOrderRight.feeRecipientAddress;
+ // Operations are performed on copies of the balances
+ const expectedNewERC20BalancesByOwner = _.cloneDeep(erc20BalancesByOwner);
+ const expectedNewERC721TokenIdsByOwner = _.cloneDeep(erc721TokenIdsByOwner);
+ // Left Maker Asset (Right Taker Asset)
+ const makerAssetProxyIdLeft = assetDataUtils.decodeAssetProxyId(signedOrderLeft.makerAssetData);
+ if (makerAssetProxyIdLeft === AssetProxyId.ERC20) {
+ // Decode asset data
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(signedOrderLeft.makerAssetData);
+ const makerAssetAddressLeft = erc20AssetData.tokenAddress;
+ const takerAssetAddressRight = makerAssetAddressLeft;
+ // Left Maker
+ expectedNewERC20BalancesByOwner[makerAddressLeft][makerAssetAddressLeft] = expectedNewERC20BalancesByOwner[
+ makerAddressLeft
+ ][makerAssetAddressLeft].minus(expectedTransferAmounts.amountSoldByLeftMaker);
+ // Right Maker
+ expectedNewERC20BalancesByOwner[makerAddressRight][
+ takerAssetAddressRight
+ ] = expectedNewERC20BalancesByOwner[makerAddressRight][takerAssetAddressRight].add(
+ expectedTransferAmounts.amountReceivedByRightMaker,
+ );
+ // Taker
+ expectedNewERC20BalancesByOwner[takerAddress][makerAssetAddressLeft] = expectedNewERC20BalancesByOwner[
+ takerAddress
+ ][makerAssetAddressLeft].add(expectedTransferAmounts.amountReceivedByTaker);
+ } else if (makerAssetProxyIdLeft === AssetProxyId.ERC721) {
+ // Decode asset data
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(signedOrderLeft.makerAssetData);
+ const makerAssetAddressLeft = erc721AssetData.tokenAddress;
+ const makerAssetIdLeft = erc721AssetData.tokenId;
+ const takerAssetAddressRight = makerAssetAddressLeft;
+ const takerAssetIdRight = makerAssetIdLeft;
+ // Left Maker
+ _.remove(expectedNewERC721TokenIdsByOwner[makerAddressLeft][makerAssetAddressLeft], makerAssetIdLeft);
+ // Right Maker
+ expectedNewERC721TokenIdsByOwner[makerAddressRight][takerAssetAddressRight].push(takerAssetIdRight);
+ // Taker: Since there is only 1 asset transferred, the taker does not receive any of the left maker asset.
+ }
+ // Left Taker Asset (Right Maker Asset)
+ // Note: This exchange is only between the order makers: the Taker does not receive any of the left taker asset.
+ const takerAssetProxyIdLeft = assetDataUtils.decodeAssetProxyId(signedOrderLeft.takerAssetData);
+ if (takerAssetProxyIdLeft === AssetProxyId.ERC20) {
+ // Decode asset data
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(signedOrderLeft.takerAssetData);
+ const takerAssetAddressLeft = erc20AssetData.tokenAddress;
+ const makerAssetAddressRight = takerAssetAddressLeft;
+ // Left Maker
+ expectedNewERC20BalancesByOwner[makerAddressLeft][takerAssetAddressLeft] = expectedNewERC20BalancesByOwner[
+ makerAddressLeft
+ ][takerAssetAddressLeft].add(expectedTransferAmounts.amountReceivedByLeftMaker);
+ // Right Maker
+ expectedNewERC20BalancesByOwner[makerAddressRight][
+ makerAssetAddressRight
+ ] = expectedNewERC20BalancesByOwner[makerAddressRight][makerAssetAddressRight].minus(
+ expectedTransferAmounts.amountSoldByRightMaker,
+ );
+ } else if (takerAssetProxyIdLeft === AssetProxyId.ERC721) {
+ // Decode asset data
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(signedOrderRight.makerAssetData);
+ const makerAssetAddressRight = erc721AssetData.tokenAddress;
+ const makerAssetIdRight = erc721AssetData.tokenId;
+ const takerAssetAddressLeft = makerAssetAddressRight;
+ const takerAssetIdLeft = makerAssetIdRight;
+ // Right Maker
+ _.remove(expectedNewERC721TokenIdsByOwner[makerAddressRight][makerAssetAddressRight], makerAssetIdRight);
+ // Left Maker
+ expectedNewERC721TokenIdsByOwner[makerAddressLeft][takerAssetAddressLeft].push(takerAssetIdLeft);
+ }
+ // Left Maker Fees
+ expectedNewERC20BalancesByOwner[makerAddressLeft][this._feeTokenAddress] = expectedNewERC20BalancesByOwner[
+ makerAddressLeft
+ ][this._feeTokenAddress].minus(expectedTransferAmounts.feePaidByLeftMaker);
+ // Right Maker Fees
+ expectedNewERC20BalancesByOwner[makerAddressRight][this._feeTokenAddress] = expectedNewERC20BalancesByOwner[
+ makerAddressRight
+ ][this._feeTokenAddress].minus(expectedTransferAmounts.feePaidByRightMaker);
+ // Taker Fees
+ expectedNewERC20BalancesByOwner[takerAddress][this._feeTokenAddress] = expectedNewERC20BalancesByOwner[
+ takerAddress
+ ][this._feeTokenAddress].minus(expectedTransferAmounts.totalFeePaidByTaker);
+ // Left Fee Recipient Fees
+ expectedNewERC20BalancesByOwner[feeRecipientAddressLeft][
+ this._feeTokenAddress
+ ] = expectedNewERC20BalancesByOwner[feeRecipientAddressLeft][this._feeTokenAddress].add(
+ expectedTransferAmounts.feeReceivedLeft,
+ );
+ // Right Fee Recipient Fees
+ expectedNewERC20BalancesByOwner[feeRecipientAddressRight][
+ this._feeTokenAddress
+ ] = expectedNewERC20BalancesByOwner[feeRecipientAddressRight][this._feeTokenAddress].add(
+ expectedTransferAmounts.feeReceivedRight,
+ );
+
+ return [expectedNewERC20BalancesByOwner, expectedNewERC721TokenIdsByOwner];
+ }
+}
diff --git a/packages/contracts/test/utils/multi_sig_wrapper.ts b/packages/contracts/test/utils/multi_sig_wrapper.ts
new file mode 100644
index 000000000..8c8055d4a
--- /dev/null
+++ b/packages/contracts/test/utils/multi_sig_wrapper.ts
@@ -0,0 +1,60 @@
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { AssetProxyOwnerContract } from '../../generated_contract_wrappers/asset_proxy_owner';
+import { MultiSigWalletContract } from '../../generated_contract_wrappers/multi_sig_wallet';
+
+import { constants } from './constants';
+import { LogDecoder } from './log_decoder';
+
+export class MultiSigWrapper {
+ private readonly _multiSig: MultiSigWalletContract;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _logDecoder: LogDecoder;
+ constructor(multiSigContract: MultiSigWalletContract, provider: Provider) {
+ this._multiSig = multiSigContract;
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._logDecoder = new LogDecoder(this._web3Wrapper, this._multiSig.address);
+ }
+ public async submitTransactionAsync(
+ destination: string,
+ data: string,
+ from: string,
+ opts: { value?: BigNumber } = {},
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const value = _.isUndefined(opts.value) ? new BigNumber(0) : opts.value;
+ const txHash = await this._multiSig.submitTransaction.sendTransactionAsync(destination, value, data, {
+ from,
+ });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async confirmTransactionAsync(txId: BigNumber, from: string): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._multiSig.confirmTransaction.sendTransactionAsync(txId, { from });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async executeTransactionAsync(txId: BigNumber, from: string): Promise<TransactionReceiptWithDecodedLogs> {
+ const txHash = await this._multiSig.executeTransaction.sendTransactionAsync(txId, {
+ from,
+ gas: constants.MAX_EXECUTE_TRANSACTION_GAS,
+ });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+ public async executeRemoveAuthorizedAddressAtIndexAsync(
+ txId: BigNumber,
+ from: string,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ const txHash = await (this
+ ._multiSig as AssetProxyOwnerContract).executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
+ from,
+ gas: constants.MAX_EXECUTE_TRANSACTION_GAS,
+ });
+ const tx = await this._logDecoder.getTxWithDecodedLogsAsync(txHash);
+ return tx;
+ }
+}
diff --git a/packages/contracts/test/utils/order_factory.ts b/packages/contracts/test/utils/order_factory.ts
new file mode 100644
index 000000000..63a893695
--- /dev/null
+++ b/packages/contracts/test/utils/order_factory.ts
@@ -0,0 +1,38 @@
+import { generatePseudoRandomSalt, orderHashUtils } from '@0xproject/order-utils';
+import { Order, SignatureType, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { getLatestBlockTimestampAsync } from './block_timestamp';
+import { constants } from './constants';
+import { signingUtils } from './signing_utils';
+
+export class OrderFactory {
+ private readonly _defaultOrderParams: Partial<Order>;
+ private readonly _privateKey: Buffer;
+ constructor(privateKey: Buffer, defaultOrderParams: Partial<Order>) {
+ this._defaultOrderParams = defaultOrderParams;
+ this._privateKey = privateKey;
+ }
+ public async newSignedOrderAsync(
+ customOrderParams: Partial<Order> = {},
+ signatureType: SignatureType = SignatureType.EthSign,
+ ): Promise<SignedOrder> {
+ const tenMinutesInSeconds = 10 * 60;
+ const currentBlockTimestamp = await getLatestBlockTimestampAsync();
+ const order = ({
+ senderAddress: constants.NULL_ADDRESS,
+ expirationTimeSeconds: new BigNumber(currentBlockTimestamp).add(tenMinutesInSeconds),
+ salt: generatePseudoRandomSalt(),
+ takerAddress: constants.NULL_ADDRESS,
+ ...this._defaultOrderParams,
+ ...customOrderParams,
+ } as any) as Order;
+ const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
+ const signature = signingUtils.signMessage(orderHashBuff, this._privateKey, signatureType);
+ const signedOrder = {
+ ...order,
+ signature: `0x${signature.toString('hex')}`,
+ };
+ return signedOrder;
+ }
+}
diff --git a/packages/contracts/test/utils/order_factory_from_scenario.ts b/packages/contracts/test/utils/order_factory_from_scenario.ts
new file mode 100644
index 000000000..a908140b9
--- /dev/null
+++ b/packages/contracts/test/utils/order_factory_from_scenario.ts
@@ -0,0 +1,273 @@
+import { assetDataUtils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { Order } from '@0xproject/types';
+import { BigNumber, errorUtils } from '@0xproject/utils';
+
+import { DummyERC721TokenContract } from '../../generated_contract_wrappers/dummy_erc721_token';
+
+import { constants } from './constants';
+import {
+ AssetDataScenario,
+ ERC721TokenIdsByOwner,
+ ExpirationTimeSecondsScenario,
+ FeeRecipientAddressScenario,
+ OrderAssetAmountScenario,
+ OrderScenario,
+ TakerScenario,
+} from './types';
+
+const TEN_UNITS_EIGHTEEN_DECIMALS = new BigNumber(10_000_000_000_000_000_000);
+const FIVE_UNITS_EIGHTEEN_DECIMALS = new BigNumber(5_000_000_000_000_000_000);
+const POINT_ONE_UNITS_EIGHTEEN_DECIMALS = new BigNumber(100_000_000_000_000_000);
+const POINT_ZERO_FIVE_UNITS_EIGHTEEN_DECIMALS = new BigNumber(50_000_000_000_000_000);
+const TEN_UNITS_FIVE_DECIMALS = new BigNumber(1_000_000);
+const FIVE_UNITS_FIVE_DECIMALS = new BigNumber(500_000);
+const ONE_NFT_UNIT = new BigNumber(1);
+
+export class OrderFactoryFromScenario {
+ private readonly _userAddresses: string[];
+ private readonly _zrxAddress: string;
+ private readonly _nonZrxERC20EighteenDecimalTokenAddresses: string[];
+ private readonly _erc20FiveDecimalTokenAddresses: string[];
+ private readonly _erc721Token: DummyERC721TokenContract;
+ private readonly _erc721Balances: ERC721TokenIdsByOwner;
+ private readonly _exchangeAddress: string;
+ constructor(
+ userAddresses: string[],
+ zrxAddress: string,
+ nonZrxERC20EighteenDecimalTokenAddresses: string[],
+ erc20FiveDecimalTokenAddresses: string[],
+ erc721Token: DummyERC721TokenContract,
+ erc721Balances: ERC721TokenIdsByOwner,
+ exchangeAddress: string,
+ ) {
+ this._userAddresses = userAddresses;
+ this._zrxAddress = zrxAddress;
+ this._nonZrxERC20EighteenDecimalTokenAddresses = nonZrxERC20EighteenDecimalTokenAddresses;
+ this._erc20FiveDecimalTokenAddresses = erc20FiveDecimalTokenAddresses;
+ this._erc721Token = erc721Token;
+ this._erc721Balances = erc721Balances;
+ this._exchangeAddress = exchangeAddress;
+ }
+ public generateOrder(orderScenario: OrderScenario): Order {
+ const makerAddress = this._userAddresses[1];
+ let takerAddress = this._userAddresses[2];
+ const erc721MakerAssetIds = this._erc721Balances[makerAddress][this._erc721Token.address];
+ const erc721TakerAssetIds = this._erc721Balances[takerAddress][this._erc721Token.address];
+ let feeRecipientAddress;
+ let makerAssetAmount;
+ let takerAssetAmount;
+ let makerFee;
+ let takerFee;
+ let expirationTimeSeconds;
+ let makerAssetData;
+ let takerAssetData;
+
+ switch (orderScenario.feeRecipientScenario) {
+ case FeeRecipientAddressScenario.BurnAddress:
+ feeRecipientAddress = constants.NULL_ADDRESS;
+ break;
+ case FeeRecipientAddressScenario.EthUserAddress:
+ feeRecipientAddress = this._userAddresses[4];
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('FeeRecipientAddressScenario', orderScenario.feeRecipientScenario);
+ }
+
+ switch (orderScenario.makerAssetDataScenario) {
+ case AssetDataScenario.ZRXFeeToken:
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._zrxAddress);
+ break;
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._nonZrxERC20EighteenDecimalTokenAddresses[0]);
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ makerAssetData = assetDataUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[0]);
+ break;
+ case AssetDataScenario.ERC721:
+ makerAssetData = assetDataUtils.encodeERC721AssetData(
+ this._erc721Token.address,
+ erc721MakerAssetIds[0],
+ );
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.makerAssetDataScenario);
+ }
+
+ switch (orderScenario.takerAssetDataScenario) {
+ case AssetDataScenario.ZRXFeeToken:
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._zrxAddress);
+ break;
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._nonZrxERC20EighteenDecimalTokenAddresses[1]);
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ takerAssetData = assetDataUtils.encodeERC20AssetData(this._erc20FiveDecimalTokenAddresses[1]);
+ break;
+ case AssetDataScenario.ERC721:
+ takerAssetData = assetDataUtils.encodeERC721AssetData(
+ this._erc721Token.address,
+ erc721TakerAssetIds[0],
+ );
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.takerAssetDataScenario);
+ }
+
+ switch (orderScenario.makerAssetAmountScenario) {
+ case OrderAssetAmountScenario.Large:
+ switch (orderScenario.makerAssetDataScenario) {
+ case AssetDataScenario.ZRXFeeToken:
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ makerAssetAmount = TEN_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ makerAssetAmount = TEN_UNITS_FIVE_DECIMALS;
+ break;
+ case AssetDataScenario.ERC721:
+ makerAssetAmount = ONE_NFT_UNIT;
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.makerAssetDataScenario);
+ }
+ break;
+ case OrderAssetAmountScenario.Small:
+ switch (orderScenario.makerAssetDataScenario) {
+ case AssetDataScenario.ZRXFeeToken:
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ makerAssetAmount = FIVE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ makerAssetAmount = FIVE_UNITS_FIVE_DECIMALS;
+ break;
+ case AssetDataScenario.ERC721:
+ makerAssetAmount = ONE_NFT_UNIT;
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.makerAssetDataScenario);
+ }
+ break;
+ case OrderAssetAmountScenario.Zero:
+ makerAssetAmount = new BigNumber(0);
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('OrderAssetAmountScenario', orderScenario.makerAssetAmountScenario);
+ }
+
+ switch (orderScenario.takerAssetAmountScenario) {
+ case OrderAssetAmountScenario.Large:
+ switch (orderScenario.takerAssetDataScenario) {
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ case AssetDataScenario.ZRXFeeToken:
+ takerAssetAmount = TEN_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ takerAssetAmount = TEN_UNITS_FIVE_DECIMALS;
+ break;
+ case AssetDataScenario.ERC721:
+ takerAssetAmount = ONE_NFT_UNIT;
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.takerAssetDataScenario);
+ }
+ break;
+ case OrderAssetAmountScenario.Small:
+ switch (orderScenario.takerAssetDataScenario) {
+ case AssetDataScenario.ERC20NonZRXEighteenDecimals:
+ case AssetDataScenario.ZRXFeeToken:
+ takerAssetAmount = FIVE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case AssetDataScenario.ERC20FiveDecimals:
+ takerAssetAmount = FIVE_UNITS_FIVE_DECIMALS;
+ break;
+ case AssetDataScenario.ERC721:
+ takerAssetAmount = ONE_NFT_UNIT;
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('AssetDataScenario', orderScenario.takerAssetDataScenario);
+ }
+ break;
+ case OrderAssetAmountScenario.Zero:
+ takerAssetAmount = new BigNumber(0);
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('OrderAssetAmountScenario', orderScenario.takerAssetAmountScenario);
+ }
+
+ switch (orderScenario.makerFeeScenario) {
+ case OrderAssetAmountScenario.Large:
+ makerFee = POINT_ONE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case OrderAssetAmountScenario.Small:
+ makerFee = POINT_ZERO_FIVE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case OrderAssetAmountScenario.Zero:
+ makerFee = new BigNumber(0);
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('OrderAssetAmountScenario', orderScenario.makerFeeScenario);
+ }
+
+ switch (orderScenario.takerFeeScenario) {
+ case OrderAssetAmountScenario.Large:
+ takerFee = POINT_ONE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case OrderAssetAmountScenario.Small:
+ takerFee = POINT_ZERO_FIVE_UNITS_EIGHTEEN_DECIMALS;
+ break;
+ case OrderAssetAmountScenario.Zero:
+ takerFee = new BigNumber(0);
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('OrderAssetAmountScenario', orderScenario.takerFeeScenario);
+ }
+
+ switch (orderScenario.expirationTimeSecondsScenario) {
+ case ExpirationTimeSecondsScenario.InFuture:
+ expirationTimeSeconds = new BigNumber(2524604400); // Close to infinite
+ break;
+ case ExpirationTimeSecondsScenario.InPast:
+ expirationTimeSeconds = new BigNumber(0); // Jan 1, 1970
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr(
+ 'ExpirationTimeSecondsScenario',
+ orderScenario.expirationTimeSecondsScenario,
+ );
+ }
+
+ switch (orderScenario.takerScenario) {
+ case TakerScenario.CorrectlySpecified:
+ break; // noop since takerAddress is already specified
+
+ case TakerScenario.IncorrectlySpecified:
+ const notTaker = this._userAddresses[3];
+ takerAddress = notTaker;
+ break;
+
+ case TakerScenario.Unspecified:
+ takerAddress = constants.NULL_ADDRESS;
+ break;
+
+ default:
+ throw errorUtils.spawnSwitchErr('TakerScenario', orderScenario.takerScenario);
+ }
+
+ const order = {
+ senderAddress: constants.NULL_ADDRESS,
+ makerAddress,
+ takerAddress,
+ makerFee,
+ takerFee,
+ makerAssetAmount,
+ takerAssetAmount,
+ makerAssetData,
+ takerAssetData,
+ salt: generatePseudoRandomSalt(),
+ exchangeAddress: this._exchangeAddress,
+ feeRecipientAddress,
+ expirationTimeSeconds,
+ };
+
+ return order;
+ }
+}
diff --git a/packages/contracts/test/utils/order_utils.ts b/packages/contracts/test/utils/order_utils.ts
new file mode 100644
index 000000000..019f6e74b
--- /dev/null
+++ b/packages/contracts/test/utils/order_utils.ts
@@ -0,0 +1,58 @@
+import { OrderWithoutExchangeAddress, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { constants } from './constants';
+import { CancelOrder, MatchOrder } from './types';
+
+export const orderUtils = {
+ getPartialAmount(numerator: BigNumber, denominator: BigNumber, target: BigNumber): BigNumber {
+ const partialAmount = numerator
+ .mul(target)
+ .div(denominator)
+ .floor();
+ return partialAmount;
+ },
+ createFill: (signedOrder: SignedOrder, takerAssetFillAmount?: BigNumber) => {
+ const fill = {
+ order: orderUtils.getOrderWithoutExchangeAddress(signedOrder),
+ takerAssetFillAmount: takerAssetFillAmount || signedOrder.takerAssetAmount,
+ signature: signedOrder.signature,
+ };
+ return fill;
+ },
+ createCancel(signedOrder: SignedOrder, takerAssetCancelAmount?: BigNumber): CancelOrder {
+ const cancel = {
+ order: orderUtils.getOrderWithoutExchangeAddress(signedOrder),
+ takerAssetCancelAmount: takerAssetCancelAmount || signedOrder.takerAssetAmount,
+ };
+ return cancel;
+ },
+ getOrderWithoutExchangeAddress(signedOrder: SignedOrder): OrderWithoutExchangeAddress {
+ const orderStruct = {
+ senderAddress: signedOrder.senderAddress,
+ makerAddress: signedOrder.makerAddress,
+ takerAddress: signedOrder.takerAddress,
+ feeRecipientAddress: signedOrder.feeRecipientAddress,
+ makerAssetAmount: signedOrder.makerAssetAmount,
+ takerAssetAmount: signedOrder.takerAssetAmount,
+ makerFee: signedOrder.makerFee,
+ takerFee: signedOrder.takerFee,
+ expirationTimeSeconds: signedOrder.expirationTimeSeconds,
+ salt: signedOrder.salt,
+ makerAssetData: signedOrder.makerAssetData,
+ takerAssetData: signedOrder.takerAssetData,
+ };
+ return orderStruct;
+ },
+ createMatchOrders(signedOrderLeft: SignedOrder, signedOrderRight: SignedOrder): MatchOrder {
+ const fill = {
+ left: orderUtils.getOrderWithoutExchangeAddress(signedOrderLeft),
+ right: orderUtils.getOrderWithoutExchangeAddress(signedOrderRight),
+ leftSignature: signedOrderLeft.signature,
+ rightSignature: signedOrderRight.signature,
+ };
+ fill.right.makerAssetData = constants.NULL_BYTES;
+ fill.right.takerAssetData = constants.NULL_BYTES;
+ return fill;
+ },
+};
diff --git a/packages/contracts/test/utils/profiler.ts b/packages/contracts/test/utils/profiler.ts
new file mode 100644
index 000000000..85ee24f22
--- /dev/null
+++ b/packages/contracts/test/utils/profiler.ts
@@ -0,0 +1,27 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { ProfilerSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov';
+import * as _ from 'lodash';
+
+let profilerSubprovider: ProfilerSubprovider;
+
+export const profiler = {
+ start(): void {
+ profiler.getProfilerSubproviderSingleton().start();
+ },
+ stop(): void {
+ profiler.getProfilerSubproviderSingleton().stop();
+ },
+ getProfilerSubproviderSingleton(): ProfilerSubprovider {
+ if (_.isUndefined(profilerSubprovider)) {
+ profilerSubprovider = profiler._getProfilerSubprovider();
+ }
+ return profilerSubprovider;
+ },
+ _getProfilerSubprovider(): ProfilerSubprovider {
+ const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter();
+ const isVerbose = true;
+ const subprovider = new ProfilerSubprovider(solCompilerArtifactAdapter, defaultFromAddress, isVerbose);
+ return subprovider;
+ },
+};
diff --git a/packages/contracts/test/utils/revert_trace.ts b/packages/contracts/test/utils/revert_trace.ts
new file mode 100644
index 000000000..0bf8384bc
--- /dev/null
+++ b/packages/contracts/test/utils/revert_trace.ts
@@ -0,0 +1,21 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { RevertTraceSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov';
+import * as _ from 'lodash';
+
+let revertTraceSubprovider: RevertTraceSubprovider;
+
+export const revertTrace = {
+ getRevertTraceSubproviderSingleton(): RevertTraceSubprovider {
+ if (_.isUndefined(revertTraceSubprovider)) {
+ revertTraceSubprovider = revertTrace._getRevertTraceSubprovider();
+ }
+ return revertTraceSubprovider;
+ },
+ _getRevertTraceSubprovider(): RevertTraceSubprovider {
+ const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter();
+ const isVerbose = true;
+ const subprovider = new RevertTraceSubprovider(solCompilerArtifactAdapter, defaultFromAddress, isVerbose);
+ return subprovider;
+ },
+};
diff --git a/packages/contracts/test/utils/signing_utils.ts b/packages/contracts/test/utils/signing_utils.ts
new file mode 100644
index 000000000..9c711c72c
--- /dev/null
+++ b/packages/contracts/test/utils/signing_utils.ts
@@ -0,0 +1,29 @@
+import { SignatureType } from '@0xproject/types';
+import * as ethUtil from 'ethereumjs-util';
+
+export const signingUtils = {
+ signMessage(message: Buffer, privateKey: Buffer, signatureType: SignatureType): Buffer {
+ if (signatureType === SignatureType.EthSign) {
+ const prefixedMessage = ethUtil.hashPersonalMessage(message);
+ const ecSignature = ethUtil.ecsign(prefixedMessage, privateKey);
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(signatureType),
+ ]);
+ return signature;
+ } else if (signatureType === SignatureType.EIP712) {
+ const ecSignature = ethUtil.ecsign(message, privateKey);
+ const signature = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ecSignature.r,
+ ecSignature.s,
+ ethUtil.toBuffer(signatureType),
+ ]);
+ return signature;
+ } else {
+ throw new Error(`${signatureType} is not a valid signature type`);
+ }
+ },
+};
diff --git a/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts b/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts
new file mode 100644
index 000000000..598ee6d29
--- /dev/null
+++ b/packages/contracts/test/utils/simple_asset_balance_and_proxy_allowance_fetcher.ts
@@ -0,0 +1,19 @@
+import { AbstractBalanceAndProxyAllowanceFetcher } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+
+import { AssetWrapper } from './asset_wrapper';
+
+export class SimpleAssetBalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
+ private readonly _assetWrapper: AssetWrapper;
+ constructor(assetWrapper: AssetWrapper) {
+ this._assetWrapper = assetWrapper;
+ }
+ public async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const balance = await this._assetWrapper.getBalanceAsync(userAddress, assetData);
+ return balance;
+ }
+ public async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const proxyAllowance = await this._assetWrapper.getProxyAllowanceAsync(userAddress, assetData);
+ return proxyAllowance;
+ }
+}
diff --git a/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts b/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts
new file mode 100644
index 000000000..ed69ecc63
--- /dev/null
+++ b/packages/contracts/test/utils/simple_order_filled_cancelled_fetcher.ts
@@ -0,0 +1,24 @@
+import { AbstractOrderFilledCancelledFetcher } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+
+import { ExchangeWrapper } from './exchange_wrapper';
+
+export class SimpleOrderFilledCancelledFetcher implements AbstractOrderFilledCancelledFetcher {
+ private readonly _exchangeWrapper: ExchangeWrapper;
+ private readonly _zrxAssetData: string;
+ constructor(exchange: ExchangeWrapper, zrxAssetData: string) {
+ this._exchangeWrapper = exchange;
+ this._zrxAssetData = zrxAssetData;
+ }
+ public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
+ const filledTakerAmount = new BigNumber(await this._exchangeWrapper.getTakerAssetFilledAmountAsync(orderHash));
+ return filledTakerAmount;
+ }
+ public async isOrderCancelledAsync(orderHash: string): Promise<boolean> {
+ const isCancelled = await this._exchangeWrapper.isCancelledAsync(orderHash);
+ return isCancelled;
+ }
+ public getZRXAssetData(): string {
+ return this._zrxAssetData;
+ }
+}
diff --git a/packages/contracts/test/utils/test_with_reference.ts b/packages/contracts/test/utils/test_with_reference.ts
new file mode 100644
index 000000000..599b1eed4
--- /dev/null
+++ b/packages/contracts/test/utils/test_with_reference.ts
@@ -0,0 +1,119 @@
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { chaiSetup } from './chai_setup';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+export async function testWithReferenceFuncAsync<P0, R>(
+ referenceFunc: (p0: P0) => Promise<R>,
+ testFunc: (p0: P0) => Promise<R>,
+ values: [P0],
+): Promise<void>;
+export async function testWithReferenceFuncAsync<P0, P1, R>(
+ referenceFunc: (p0: P0, p1: P1) => Promise<R>,
+ testFunc: (p0: P0, p1: P1) => Promise<R>,
+ values: [P0, P1],
+): Promise<void>;
+export async function testWithReferenceFuncAsync<P0, P1, P2, R>(
+ referenceFunc: (p0: P0, p1: P1, p2: P2) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2) => Promise<R>,
+ values: [P0, P1, P2],
+): Promise<void>;
+export async function testWithReferenceFuncAsync<P0, P1, P2, P3, R>(
+ referenceFunc: (p0: P0, p1: P1, p2: P2, p3: P3) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2, p3: P3) => Promise<R>,
+ values: [P0, P1, P2, P3],
+): Promise<void>;
+export async function testWithReferenceFuncAsync<P0, P1, P2, P3, P4, R>(
+ referenceFunc: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) => Promise<R>,
+ testFunc: (p0: P0, p1: P1, p2: P2, p3: P3, p4: P4) => Promise<R>,
+ values: [P0, P1, P2, P3, P4],
+): Promise<void>;
+
+/**
+ * Tests the behavior of a test function by comparing it to the expected
+ * behavior (defined by a reference function).
+ *
+ * First the reference function will be called to obtain an "expected result",
+ * or if the reference function throws/rejects, an "expected error". Next, the
+ * test function will be called to obtain an "actual result", or if the test
+ * function throws/rejects, an "actual error". The test passes if at least one
+ * of the following conditions is met:
+ *
+ * 1) Neither the reference function or the test function throw and the
+ * "expected result" equals the "actual result".
+ *
+ * 2) Both the reference function and the test function throw and the "actual
+ * error" message *contains* the "expected error" message.
+ *
+ * @param referenceFuncAsync a reference function implemented in pure
+ * JavaScript/TypeScript which accepts N arguments and returns the "expected
+ * result" or throws/rejects with the "expected error".
+ * @param testFuncAsync a test function which, e.g., makes a call or sends a
+ * transaction to a contract. It accepts the same N arguments returns the
+ * "actual result" or throws/rejects with the "actual error".
+ * @param values an array of N values, where each value corresponds in-order to
+ * an argument to both the test function and the reference function.
+ * @return A Promise that resolves if the test passes and rejects if the test
+ * fails, according to the rules described above.
+ */
+export async function testWithReferenceFuncAsync(
+ referenceFuncAsync: (...args: any[]) => Promise<any>,
+ testFuncAsync: (...args: any[]) => Promise<any>,
+ values: any[],
+): Promise<void> {
+ let expectedResult: any;
+ let expectedErr: string | undefined;
+ try {
+ expectedResult = await referenceFuncAsync(...values);
+ } catch (e) {
+ expectedErr = e.message;
+ }
+ let actualResult: any | undefined;
+ try {
+ actualResult = await testFuncAsync(...values);
+ if (!_.isUndefined(expectedErr)) {
+ throw new Error(
+ `Expected error containing ${expectedErr} but got no error\n\tTest case: ${_getTestCaseString(
+ referenceFuncAsync,
+ values,
+ )}`,
+ );
+ }
+ } catch (e) {
+ if (_.isUndefined(expectedErr)) {
+ throw new Error(`${e.message}\n\tTest case: ${_getTestCaseString(referenceFuncAsync, values)}`);
+ } else {
+ expect(e.message).to.contain(
+ expectedErr,
+ `${e.message}\n\tTest case: ${_getTestCaseString(referenceFuncAsync, values)}`,
+ );
+ }
+ }
+ if (!_.isUndefined(actualResult) && !_.isUndefined(expectedResult)) {
+ expect(actualResult).to.deep.equal(
+ expectedResult,
+ `Test case: ${_getTestCaseString(referenceFuncAsync, values)}`,
+ );
+ }
+}
+
+function _getTestCaseString(referenceFuncAsync: (...args: any[]) => Promise<any>, values: any[]): string {
+ const paramNames = _getParameterNames(referenceFuncAsync);
+ return JSON.stringify(_.zipObject(paramNames, values));
+}
+
+// Source: https://stackoverflow.com/questions/1007981/how-to-get-function-parameter-names-values-dynamically
+function _getParameterNames(func: (...args: any[]) => any): string[] {
+ return _.toString(func)
+ .replace(/[/][/].*$/gm, '') // strip single-line comments
+ .replace(/\s+/g, '') // strip white space
+ .replace(/[/][*][^/*]*[*][/]/g, '') // strip multi-line comments
+ .split('){', 1)[0]
+ .replace(/^[^(]*[(]/, '') // extract the parameters
+ .replace(/=[^,]+/g, '') // strip any ES6 defaults
+ .split(',')
+ .filter(Boolean); // split & filter [""]
+}
diff --git a/packages/contracts/test/utils/token_registry_wrapper.ts b/packages/contracts/test/utils/token_registry_wrapper.ts
new file mode 100644
index 000000000..f1c40e8ff
--- /dev/null
+++ b/packages/contracts/test/utils/token_registry_wrapper.ts
@@ -0,0 +1,66 @@
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+
+import { TokenRegistryContract } from '../../generated_contract_wrappers/token_registry';
+
+import { Token } from './types';
+
+import { constants } from './constants';
+
+export class TokenRegWrapper {
+ private readonly _tokenReg: TokenRegistryContract;
+ private readonly _web3Wrapper: Web3Wrapper;
+ constructor(tokenRegContract: TokenRegistryContract, provider: Provider) {
+ this._tokenReg = tokenRegContract;
+ this._web3Wrapper = new Web3Wrapper(provider);
+ }
+ public async addTokenAsync(token: Token, from: string): Promise<string> {
+ const txHash = await this._tokenReg.addToken.sendTransactionAsync(
+ token.address as string,
+ token.name,
+ token.symbol,
+ token.decimals,
+ token.ipfsHash,
+ token.swarmHash,
+ { from },
+ );
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ return txHash;
+ }
+ public async getTokenMetaDataAsync(tokenAddress: string): Promise<Token> {
+ const data = await this._tokenReg.getTokenMetaData.callAsync(tokenAddress);
+ const token: Token = {
+ address: data[0],
+ name: data[1],
+ symbol: data[2],
+ decimals: data[3],
+ ipfsHash: data[4],
+ swarmHash: data[5],
+ };
+ return token;
+ }
+ public async getTokenByNameAsync(tokenName: string): Promise<Token> {
+ const data = await this._tokenReg.getTokenByName.callAsync(tokenName);
+ const token: Token = {
+ address: data[0],
+ name: data[1],
+ symbol: data[2],
+ decimals: data[3],
+ ipfsHash: data[4],
+ swarmHash: data[5],
+ };
+ return token;
+ }
+ public async getTokenBySymbolAsync(tokenSymbol: string): Promise<Token> {
+ const data = await this._tokenReg.getTokenBySymbol.callAsync(tokenSymbol);
+ const token: Token = {
+ address: data[0],
+ name: data[1],
+ symbol: data[2],
+ decimals: data[3],
+ ipfsHash: data[4],
+ swarmHash: data[5],
+ };
+ return token;
+ }
+}
diff --git a/packages/contracts/test/utils/transaction_factory.ts b/packages/contracts/test/utils/transaction_factory.ts
new file mode 100644
index 000000000..281c1e30d
--- /dev/null
+++ b/packages/contracts/test/utils/transaction_factory.ts
@@ -0,0 +1,47 @@
+import { EIP712Schema, EIP712Types, EIP712Utils, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { SignatureType } from '@0xproject/types';
+import * as ethUtil from 'ethereumjs-util';
+
+import { signingUtils } from './signing_utils';
+import { SignedTransaction } from './types';
+
+const EIP712_ZEROEX_TRANSACTION_SCHEMA: EIP712Schema = {
+ name: 'ZeroExTransaction',
+ parameters: [
+ { name: 'salt', type: EIP712Types.Uint256 },
+ { name: 'signerAddress', type: EIP712Types.Address },
+ { name: 'data', type: EIP712Types.Bytes },
+ ],
+};
+
+export class TransactionFactory {
+ private readonly _signerBuff: Buffer;
+ private readonly _exchangeAddress: string;
+ private readonly _privateKey: Buffer;
+ constructor(privateKey: Buffer, exchangeAddress: string) {
+ this._privateKey = privateKey;
+ this._exchangeAddress = exchangeAddress;
+ this._signerBuff = ethUtil.privateToAddress(this._privateKey);
+ }
+ public newSignedTransaction(data: string, signatureType: SignatureType = SignatureType.EthSign): SignedTransaction {
+ const salt = generatePseudoRandomSalt();
+ const signerAddress = `0x${this._signerBuff.toString('hex')}`;
+ const executeTransactionData = {
+ salt,
+ signerAddress,
+ data,
+ };
+ const executeTransactionHashBuff = EIP712Utils.structHash(
+ EIP712_ZEROEX_TRANSACTION_SCHEMA,
+ executeTransactionData,
+ );
+ const txHash = EIP712Utils.createEIP712Message(executeTransactionHashBuff, this._exchangeAddress);
+ const signature = signingUtils.signMessage(txHash, this._privateKey, signatureType);
+ const signedTx = {
+ exchangeAddress: this._exchangeAddress,
+ signature: `0x${signature.toString('hex')}`,
+ ...executeTransactionData,
+ };
+ return signedTx;
+ }
+}
diff --git a/packages/contracts/test/utils/type_encoding_utils.ts b/packages/contracts/test/utils/type_encoding_utils.ts
new file mode 100644
index 000000000..75307b9bd
--- /dev/null
+++ b/packages/contracts/test/utils/type_encoding_utils.ts
@@ -0,0 +1,21 @@
+import { BigNumber } from '@0xproject/utils';
+import BN = require('bn.js');
+import ethUtil = require('ethereumjs-util');
+
+import { constants } from './constants';
+
+export const typeEncodingUtils = {
+ encodeUint256(value: BigNumber): Buffer {
+ const base = 10;
+ const formattedValue = new BN(value.toString(base));
+ const encodedValue = ethUtil.toBuffer(formattedValue);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const paddedValue = ethUtil.setLengthLeft(encodedValue, constants.WORD_LENGTH);
+ return paddedValue;
+ },
+ decodeUint256(encodedValue: Buffer): BigNumber {
+ const formattedValue = ethUtil.bufferToHex(encodedValue);
+ const value = new BigNumber(formattedValue, constants.BASE_16);
+ return value;
+ },
+};
diff --git a/packages/contracts/test/utils/types.ts b/packages/contracts/test/utils/types.ts
new file mode 100644
index 000000000..67313b647
--- /dev/null
+++ b/packages/contracts/test/utils/types.ts
@@ -0,0 +1,237 @@
+import { OrderWithoutExchangeAddress } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { AbiDefinition } from 'ethereum-types';
+
+export interface ERC20BalancesByOwner {
+ [ownerAddress: string]: {
+ [tokenAddress: string]: BigNumber;
+ };
+}
+
+export interface ERC721TokenIdsByOwner {
+ [ownerAddress: string]: {
+ [tokenAddress: string]: BigNumber[];
+ };
+}
+
+export interface SubmissionContractEventArgs {
+ transactionId: BigNumber;
+}
+
+export interface BatchFillOrders {
+ orders: OrderWithoutExchangeAddress[];
+ signatures: string[];
+ takerAssetFillAmounts: BigNumber[];
+}
+
+export interface MarketSellOrders {
+ orders: OrderWithoutExchangeAddress[];
+ signatures: string[];
+ takerAssetFillAmount: BigNumber;
+}
+
+export interface MarketBuyOrders {
+ orders: OrderWithoutExchangeAddress[];
+ signatures: string[];
+ makerAssetFillAmount: BigNumber;
+}
+
+export interface BatchCancelOrders {
+ orders: OrderWithoutExchangeAddress[];
+}
+
+export interface CancelOrdersBefore {
+ salt: BigNumber;
+}
+
+export interface TransactionDataParams {
+ name: string;
+ abi: AbiDefinition[];
+ args: any[];
+}
+
+export interface MultiSigConfig {
+ owners: string[];
+ confirmationsRequired: number;
+ secondsRequired: number;
+}
+
+export interface MultiSigConfigByNetwork {
+ [networkName: string]: MultiSigConfig;
+}
+
+export interface Token {
+ address?: string;
+ name: string;
+ symbol: string;
+ decimals: number;
+ ipfsHash: string;
+ swarmHash: string;
+}
+
+export enum OrderStatus {
+ INVALID,
+ INVALID_MAKER_ASSET_AMOUNT,
+ INVALID_TAKER_ASSET_AMOUNT,
+ FILLABLE,
+ EXPIRED,
+ FULLY_FILLED,
+ CANCELLED,
+}
+
+export enum ContractName {
+ TokenRegistry = 'TokenRegistry',
+ MultiSigWalletWithTimeLock = 'MultiSigWalletWithTimeLock',
+ Exchange = 'Exchange',
+ ZRXToken = 'ZRXToken',
+ DummyERC20Token = 'DummyERC20Token',
+ EtherToken = 'WETH9',
+ AssetProxyOwner = 'AssetProxyOwner',
+ AccountLevels = 'AccountLevels',
+ EtherDelta = 'EtherDelta',
+ Arbitrage = 'Arbitrage',
+ TestAssetDataDecoders = 'TestAssetDataDecoders',
+ TestAssetProxyDispatcher = 'TestAssetProxyDispatcher',
+ TestLibs = 'TestLibs',
+ TestSignatureValidator = 'TestSignatureValidator',
+ ERC20Proxy = 'ERC20Proxy',
+ ERC721Proxy = 'ERC721Proxy',
+ DummyERC721Receiver = 'DummyERC721Receiver',
+ DummyERC721Token = 'DummyERC721Token',
+ TestLibBytes = 'TestLibBytes',
+ TestWallet = 'TestWallet',
+ Authorizable = 'Authorizable',
+ Whitelist = 'Whitelist',
+ Forwarder = 'Forwarder',
+}
+
+export interface SignedTransaction {
+ exchangeAddress: string;
+ salt: BigNumber;
+ signerAddress: string;
+ data: string;
+ signature: string;
+}
+
+export interface TransferAmountsByMatchOrders {
+ // Left Maker
+ amountBoughtByLeftMaker: BigNumber;
+ amountSoldByLeftMaker: BigNumber;
+ amountReceivedByLeftMaker: BigNumber;
+ feePaidByLeftMaker: BigNumber;
+ // Right Maker
+ amountBoughtByRightMaker: BigNumber;
+ amountSoldByRightMaker: BigNumber;
+ amountReceivedByRightMaker: BigNumber;
+ feePaidByRightMaker: BigNumber;
+ // Taker
+ amountReceivedByTaker: BigNumber;
+ feePaidByTakerLeft: BigNumber;
+ feePaidByTakerRight: BigNumber;
+ totalFeePaidByTaker: BigNumber;
+ // Fee Recipients
+ feeReceivedLeft: BigNumber;
+ feeReceivedRight: BigNumber;
+}
+
+export interface OrderInfo {
+ orderStatus: number;
+ orderHash: string;
+ orderTakerAssetFilledAmount: BigNumber;
+}
+
+export interface CancelOrder {
+ order: OrderWithoutExchangeAddress;
+ takerAssetCancelAmount: BigNumber;
+}
+
+export interface MatchOrder {
+ left: OrderWithoutExchangeAddress;
+ right: OrderWithoutExchangeAddress;
+ leftSignature: string;
+ rightSignature: string;
+}
+
+// Combinatorial testing types
+
+export enum FeeRecipientAddressScenario {
+ BurnAddress = 'BURN_ADDRESS',
+ EthUserAddress = 'ETH_USER_ADDRESS',
+}
+
+export enum OrderAssetAmountScenario {
+ Zero = 'ZERO',
+ Large = 'LARGE',
+ Small = 'SMALL',
+}
+
+export enum TakerScenario {
+ CorrectlySpecified = 'CORRECTLY_SPECIFIED',
+ IncorrectlySpecified = 'INCORRECTLY_SPECIFIED',
+ Unspecified = 'UNSPECIFIED',
+}
+
+export enum ExpirationTimeSecondsScenario {
+ InPast = 'IN_PAST',
+ InFuture = 'IN_FUTURE',
+}
+
+export enum AssetDataScenario {
+ ERC721 = 'ERC721',
+ ZRXFeeToken = 'ZRX_FEE_TOKEN',
+ ERC20FiveDecimals = 'ERC20_FIVE_DECIMALS',
+ ERC20NonZRXEighteenDecimals = 'ERC20_NON_ZRX_EIGHTEEN_DECIMALS',
+}
+
+export enum TakerAssetFillAmountScenario {
+ Zero = 'ZERO',
+ GreaterThanRemainingFillableTakerAssetAmount = 'GREATER_THAN_REMAINING_FILLABLE_TAKER_ASSET_AMOUNT',
+ LessThanRemainingFillableTakerAssetAmount = 'LESS_THAN_REMAINING_FILLABLE_TAKER_ASSET_AMOUNT',
+ ExactlyRemainingFillableTakerAssetAmount = 'EXACTLY_REMAINING_FILLABLE_TAKER_ASSET_AMOUNT',
+}
+
+export interface OrderScenario {
+ takerScenario: TakerScenario;
+ feeRecipientScenario: FeeRecipientAddressScenario;
+ makerAssetAmountScenario: OrderAssetAmountScenario;
+ takerAssetAmountScenario: OrderAssetAmountScenario;
+ makerFeeScenario: OrderAssetAmountScenario;
+ takerFeeScenario: OrderAssetAmountScenario;
+ expirationTimeSecondsScenario: ExpirationTimeSecondsScenario;
+ makerAssetDataScenario: AssetDataScenario;
+ takerAssetDataScenario: AssetDataScenario;
+}
+
+export enum BalanceAmountScenario {
+ Exact = 'EXACT',
+ TooLow = 'TOO_LOW',
+ Higher = 'HIGHER',
+}
+
+export enum AllowanceAmountScenario {
+ Exact = 'EXACT',
+ TooLow = 'TOO_LOW',
+ Higher = 'HIGHER',
+ Unlimited = 'UNLIMITED',
+}
+
+export interface TraderStateScenario {
+ traderAssetBalance: BalanceAmountScenario;
+ traderAssetAllowance: AllowanceAmountScenario;
+ zrxFeeBalance: BalanceAmountScenario;
+ zrxFeeAllowance: AllowanceAmountScenario;
+}
+
+export interface FillScenario {
+ orderScenario: OrderScenario;
+ takerAssetFillAmountScenario: TakerAssetFillAmountScenario;
+ makerStateScenario: TraderStateScenario;
+ takerStateScenario: TraderStateScenario;
+}
+
+export interface FillResults {
+ makerAssetFilledAmount: BigNumber;
+ takerAssetFilledAmount: BigNumber;
+ makerFeePaid: BigNumber;
+ takerFeePaid: BigNumber;
+}
diff --git a/packages/contracts/test/utils/web3_wrapper.ts b/packages/contracts/test/utils/web3_wrapper.ts
index 35a8095a6..acb3103b7 100644
--- a/packages/contracts/test/utils/web3_wrapper.ts
+++ b/packages/contracts/test/utils/web3_wrapper.ts
@@ -1,6 +1,84 @@
-import { web3Factory } from '@0xproject/dev-utils';
+import { devConstants, env, EnvVars, web3Factory } from '@0xproject/dev-utils';
+import { prependSubprovider } from '@0xproject/subproviders';
+import { logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as _ from 'lodash';
-const web3ProviderConfig = { shouldUseInProcessGanache: true };
-export const web3 = web3Factory.create(web3ProviderConfig);
-export const web3Wrapper = new Web3Wrapper(web3.currentProvider);
+import { coverage } from './coverage';
+import { profiler } from './profiler';
+import { revertTrace } from './revert_trace';
+
+enum ProviderType {
+ Ganache = 'ganache',
+ Geth = 'geth',
+}
+
+let testProvider: ProviderType;
+switch (process.env.TEST_PROVIDER) {
+ case undefined:
+ testProvider = ProviderType.Ganache;
+ break;
+ case 'ganache':
+ testProvider = ProviderType.Ganache;
+ break;
+ case 'geth':
+ testProvider = ProviderType.Geth;
+ break;
+ default:
+ throw new Error(`Unknown TEST_PROVIDER: ${process.env.TEST_PROVIDER}`);
+}
+
+const ganacheTxDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ gas: devConstants.GAS_LIMIT,
+};
+const gethTxDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+};
+export const txDefaults = testProvider === ProviderType.Ganache ? ganacheTxDefaults : gethTxDefaults;
+
+const gethConfigs = {
+ shouldUseInProcessGanache: false,
+ rpcUrl: 'http://localhost:8501',
+ shouldUseFakeGasEstimate: false,
+};
+const ganacheConfigs = {
+ shouldUseInProcessGanache: true,
+};
+const providerConfigs = testProvider === ProviderType.Ganache ? ganacheConfigs : gethConfigs;
+
+export const provider = web3Factory.getRpcProvider(providerConfigs);
+const isCoverageEnabled = env.parseBoolean(EnvVars.SolidityCoverage);
+const isProfilerEnabled = env.parseBoolean(EnvVars.SolidityProfiler);
+const isRevertTraceEnabled = env.parseBoolean(EnvVars.SolidityRevertTrace);
+const enabledSubproviderCount = _.filter(
+ [isCoverageEnabled, isProfilerEnabled, isRevertTraceEnabled],
+ _.identity.bind(_),
+).length;
+if (enabledSubproviderCount > 1) {
+ throw new Error(`Only one of coverage, profiler, or revert trace subproviders can be enabled at a time`);
+}
+if (isCoverageEnabled) {
+ const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
+ prependSubprovider(provider, coverageSubprovider);
+}
+if (isProfilerEnabled) {
+ if (testProvider === ProviderType.Ganache) {
+ logUtils.warn(
+ "Gas costs in Ganache traces are incorrect and we don't recommend using it for profiling. Please switch to Geth",
+ );
+ process.exit(1);
+ }
+ const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
+ logUtils.log(
+ "By default profilerSubprovider is stopped so that you don't get noise from setup code. Don't forget to start it before the code you want to profile and stop it afterwards",
+ );
+ profilerSubprovider.stop();
+ prependSubprovider(provider, profilerSubprovider);
+}
+if (isRevertTraceEnabled) {
+ const revertTraceSubprovider = revertTrace.getRevertTraceSubproviderSingleton();
+ prependSubprovider(provider, revertTraceSubprovider);
+}
+
+export const web3Wrapper = new Web3Wrapper(provider);
diff --git a/packages/contracts/test/zrx_token.ts b/packages/contracts/test/zrx_token.ts
deleted file mode 100644
index a4cc3c2fc..000000000
--- a/packages/contracts/test/zrx_token.ts
+++ /dev/null
@@ -1,178 +0,0 @@
-import { ZeroEx } from '0x.js';
-import { BlockchainLifecycle, devConstants, web3Factory } from '@0xproject/dev-utils';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as chai from 'chai';
-import * as Web3 from 'web3';
-
-import { ZRXTokenContract } from '../src/contract_wrappers/generated/zrx_token';
-import { constants } from '../util/constants';
-import { ContractName } from '../util/types';
-
-import { chaiSetup } from './utils/chai_setup';
-import { deployer } from './utils/deployer';
-import { web3, web3Wrapper } from './utils/web3_wrapper';
-
-chaiSetup.configure();
-const expect = chai.expect;
-const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
-
-describe('ZRXToken', () => {
- let owner: string;
- let spender: string;
- let zeroEx: ZeroEx;
-
- let MAX_UINT: BigNumber;
-
- let zrx: ZRXTokenContract;
- let zrxAddress: string;
-
- before(async () => {
- const accounts = await web3Wrapper.getAvailableAddressesAsync();
- owner = accounts[0];
- spender = accounts[1];
- zeroEx = new ZeroEx(web3.currentProvider, {
- networkId: constants.TESTRPC_NETWORK_ID,
- });
- const zrxInstance = await deployer.deployAsync(ContractName.ZRXToken);
- zrx = new ZRXTokenContract(web3Wrapper, zrxInstance.abi, zrxInstance.address);
- zrxAddress = zrx.address;
- MAX_UINT = zeroEx.token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS;
- });
- beforeEach(async () => {
- await blockchainLifecycle.startAsync();
- });
- afterEach(async () => {
- await blockchainLifecycle.revertAsync();
- });
- describe('constants', () => {
- it('should have 18 decimals', async () => {
- const decimals = new BigNumber(await zrx.decimals.callAsync());
- const expectedDecimals = 18;
- expect(decimals).to.be.bignumber.equal(expectedDecimals);
- });
-
- it('should have a total supply of 1 billion tokens', async () => {
- const totalSupply = new BigNumber(await zrx.totalSupply.callAsync());
- const expectedTotalSupply = 1000000000;
- expect(ZeroEx.toUnitAmount(totalSupply, 18)).to.be.bignumber.equal(expectedTotalSupply);
- });
-
- it('should be named 0x Protocol Token', async () => {
- const name = await zrx.name.callAsync();
- const expectedName = '0x Protocol Token';
- expect(name).to.be.equal(expectedName);
- });
-
- it('should have the symbol ZRX', async () => {
- const symbol = await zrx.symbol.callAsync();
- const expectedSymbol = 'ZRX';
- expect(symbol).to.be.equal(expectedSymbol);
- });
- });
-
- describe('constructor', () => {
- it('should initialize owner balance to totalSupply', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const totalSupply = new BigNumber(await zrx.totalSupply.callAsync());
- expect(totalSupply).to.be.bignumber.equal(ownerBalance);
- });
- });
-
- describe('transfer', () => {
- it('should transfer balance from sender to receiver', async () => {
- const receiver = spender;
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const amountToTransfer = new BigNumber(1);
- await zeroEx.token.transferAsync(zrxAddress, owner, receiver, amountToTransfer);
- const finalOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const finalReceiverBalance = await zeroEx.token.getBalanceAsync(zrxAddress, receiver);
-
- const expectedFinalOwnerBalance = initOwnerBalance.minus(amountToTransfer);
- const expectedFinalReceiverBalance = amountToTransfer;
- expect(finalOwnerBalance).to.be.bignumber.equal(expectedFinalOwnerBalance);
- expect(finalReceiverBalance).to.be.bignumber.equal(expectedFinalReceiverBalance);
- });
-
- it('should return true on a 0 value transfer', async () => {
- const didReturnTrue = await zrx.transfer.callAsync(spender, new BigNumber(0), {
- from: owner,
- });
- expect(didReturnTrue).to.be.true();
- });
- });
-
- describe('transferFrom', () => {
- it('should return false if owner has insufficient balance', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const amountToTransfer = ownerBalance.plus(1);
- await zeroEx.token.setAllowanceAsync(zrxAddress, owner, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_APPROVE_GAS,
- });
- const didReturnTrue = await zrx.transferFrom.callAsync(owner, spender, amountToTransfer, { from: spender });
- expect(didReturnTrue).to.be.false();
- });
-
- it('should return false if spender has insufficient allowance', async () => {
- const ownerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const amountToTransfer = ownerBalance;
-
- const spenderAllowance = await zeroEx.token.getAllowanceAsync(zrxAddress, owner, spender);
- const spenderAllowanceIsInsufficient = spenderAllowance.cmp(amountToTransfer) < 0;
- expect(spenderAllowanceIsInsufficient).to.be.true();
-
- const didReturnTrue = await zrx.transferFrom.callAsync(owner, spender, amountToTransfer, { from: spender });
- expect(didReturnTrue).to.be.false();
- });
-
- it('should return true on a 0 value transfer', async () => {
- const amountToTransfer = new BigNumber(0);
- const didReturnTrue = await zrx.transferFrom.callAsync(owner, spender, amountToTransfer, { from: spender });
- expect(didReturnTrue).to.be.true();
- });
-
- it('should not modify spender allowance if spender allowance is 2^256 - 1', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const amountToTransfer = initOwnerBalance;
- const initSpenderAllowance = MAX_UINT;
- await zeroEx.token.setAllowanceAsync(zrxAddress, owner, spender, initSpenderAllowance, {
- gasLimit: constants.MAX_TOKEN_APPROVE_GAS,
- });
- await zeroEx.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newSpenderAllowance = await zeroEx.token.getAllowanceAsync(zrxAddress, owner, spender);
- expect(initSpenderAllowance).to.be.bignumber.equal(newSpenderAllowance);
- });
-
- it('should transfer the correct balances if spender has sufficient allowance', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const initSpenderBalance = await zeroEx.token.getBalanceAsync(zrxAddress, spender);
- const amountToTransfer = initOwnerBalance;
- const initSpenderAllowance = initOwnerBalance;
- await zeroEx.token.setAllowanceAsync(zrxAddress, owner, spender, initSpenderAllowance);
- await zeroEx.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const newSpenderBalance = await zeroEx.token.getBalanceAsync(zrxAddress, spender);
-
- expect(newOwnerBalance).to.be.bignumber.equal(0);
- expect(newSpenderBalance).to.be.bignumber.equal(initSpenderBalance.plus(initOwnerBalance));
- });
-
- it('should modify allowance if spender has sufficient allowance less than 2^256 - 1', async () => {
- const initOwnerBalance = await zeroEx.token.getBalanceAsync(zrxAddress, owner);
- const amountToTransfer = initOwnerBalance;
- await zeroEx.token.setAllowanceAsync(zrxAddress, owner, spender, amountToTransfer);
- await zeroEx.token.transferFromAsync(zrxAddress, owner, spender, spender, amountToTransfer, {
- gasLimit: constants.MAX_TOKEN_TRANSFERFROM_GAS,
- });
-
- const newSpenderAllowance = await zeroEx.token.getAllowanceAsync(zrxAddress, owner, spender);
- expect(newSpenderAllowance).to.be.bignumber.equal(0);
- });
- });
-});
diff --git a/packages/contracts/tsconfig.json b/packages/contracts/tsconfig.json
index f32a3682a..86b33ede7 100644
--- a/packages/contracts/tsconfig.json
+++ b/packages/contracts/tsconfig.json
@@ -4,15 +4,13 @@
"outDir": "lib",
"baseUrl": ".",
"declaration": false,
- "noImplicitThis": false,
"allowJs": true
},
"include": [
- "../../node_modules/types-ethereumjs-util/index.d.ts",
- "../../node_modules/types-bn/index.d.ts",
"./globals.d.ts",
+ "./contract_wrappers",
"./src/**/*",
- "./util/**/*",
+ "./utils/**/*",
"./test/**/*",
"./migrations/**/*"
],
diff --git a/packages/contracts/tslint.json b/packages/contracts/tslint.json
index ffaefe83a..1ab924e47 100644
--- a/packages/contracts/tslint.json
+++ b/packages/contracts/tslint.json
@@ -1,3 +1,6 @@
{
- "extends": ["@0xproject/tslint-config"]
+ "extends": ["@0xproject/tslint-config"],
+ "rules": {
+ "custom-no-magic-numbers": false
+ }
}
diff --git a/packages/contracts/util/artifacts.ts b/packages/contracts/util/artifacts.ts
deleted file mode 100644
index 7c375c1b7..000000000
--- a/packages/contracts/util/artifacts.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import * as DummyTokenArtifact from '../src/artifacts/DummyToken.json';
-import * as ExchangeArtifact from '../src/artifacts/Exchange.json';
-import * as MaliciousTokenArtifact from '../src/artifacts/MaliciousToken.json';
-import * as MultiSigWalletWithTimeLockArtifact from '../src/artifacts/MultiSigWalletWithTimeLock.json';
-import * as MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact from '../src/artifacts/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json';
-import * as TokenArtifact from '../src/artifacts/Token.json';
-import * as TokenRegistryArtifact from '../src/artifacts/TokenRegistry.json';
-import * as TokenTransferProxyArtifact from '../src/artifacts/TokenTransferProxy.json';
-import * as EtherTokenArtifact from '../src/artifacts/WETH9.json';
-import * as ZRXArtifact from '../src/artifacts/ZRXToken.json';
-
-import { Artifact } from './types';
-
-export const artifacts = {
- ZRXArtifact: (ZRXArtifact as any) as Artifact,
- DummyTokenArtifact: (DummyTokenArtifact as any) as Artifact,
- TokenArtifact: (TokenArtifact as any) as Artifact,
- ExchangeArtifact: (ExchangeArtifact as any) as Artifact,
- EtherTokenArtifact: (EtherTokenArtifact as any) as Artifact,
- TokenRegistryArtifact: (TokenRegistryArtifact as any) as Artifact,
- MaliciousTokenArtifact: (MaliciousTokenArtifact as any) as Artifact,
- TokenTransferProxyArtifact: (TokenTransferProxyArtifact as any) as Artifact,
- MultiSigWalletWithTimeLockArtifact: (MultiSigWalletWithTimeLockArtifact as any) as Artifact,
- MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact: (MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressArtifact as any) as Artifact,
-};
diff --git a/packages/contracts/util/balances.ts b/packages/contracts/util/balances.ts
deleted file mode 100644
index d03d4b3c5..000000000
--- a/packages/contracts/util/balances.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { DummyTokenContract } from '../src/contract_wrappers/generated/dummy_token';
-
-import { BalancesByOwner } from './types';
-
-export class Balances {
- private _tokenContractInstances: DummyTokenContract[];
- private _ownerAddresses: string[];
- constructor(tokenContractInstances: DummyTokenContract[], ownerAddresses: string[]) {
- this._tokenContractInstances = tokenContractInstances;
- this._ownerAddresses = ownerAddresses;
- }
- public async getAsync(): Promise<BalancesByOwner> {
- const balancesByOwner: BalancesByOwner = {};
- for (const tokenContractInstance of this._tokenContractInstances) {
- for (const ownerAddress of this._ownerAddresses) {
- let balance = await tokenContractInstance.balanceOf.callAsync(ownerAddress);
- balance = new BigNumber(balance);
- if (_.isUndefined(balancesByOwner[ownerAddress])) {
- balancesByOwner[ownerAddress] = {};
- }
- balancesByOwner[ownerAddress][tokenContractInstance.address] = balance;
- }
- }
- return balancesByOwner;
- }
-}
diff --git a/packages/contracts/util/constants.ts b/packages/contracts/util/constants.ts
deleted file mode 100644
index 9bb090a2a..000000000
--- a/packages/contracts/util/constants.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-const DUMMY_TOKEN_NAME = '';
-const DUMMY_TOKEN_SYMBOL = '';
-const DUMMY_TOKEN_DECIMALS = 18;
-const DUMMY_TOKEN_TOTAL_SUPPLY = 0;
-
-export const constants = {
- NULL_BYTES: '0x',
- INVALID_OPCODE: 'invalid opcode',
- REVERT: 'revert',
- TESTRPC_NETWORK_ID: 50,
- MAX_ETHERTOKEN_WITHDRAW_GAS: 43000,
- MAX_TOKEN_TRANSFERFROM_GAS: 80000,
- MAX_TOKEN_APPROVE_GAS: 60000,
- DUMMY_TOKEN_ARGS: [DUMMY_TOKEN_NAME, DUMMY_TOKEN_SYMBOL, DUMMY_TOKEN_DECIMALS, DUMMY_TOKEN_TOTAL_SUPPLY],
-};
diff --git a/packages/contracts/util/crypto.ts b/packages/contracts/util/crypto.ts
deleted file mode 100644
index 97b8f5643..000000000
--- a/packages/contracts/util/crypto.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import BN = require('bn.js');
-import ABI = require('ethereumjs-abi');
-import ethUtil = require('ethereumjs-util');
-import * as _ from 'lodash';
-
-export const crypto = {
- /*
- * We convert types from JS to Solidity as follows:
- * BigNumber -> uint256
- * number -> uint8
- * string -> string
- * boolean -> bool
- * valid Ethereum address -> address
- */
- solSHA3(args: any[]): Buffer {
- return crypto._solHash(args, ABI.soliditySHA3);
- },
- solSHA256(args: any[]): Buffer {
- return crypto._solHash(args, ABI.soliditySHA256);
- },
- _solHash(args: any[], hashFunction: (types: string[], values: any[]) => Buffer) {
- const argTypes: string[] = [];
- _.each(args, (arg, i) => {
- const isNumber = _.isFinite(arg);
- if (isNumber) {
- argTypes.push('uint8');
- } else if (arg.isBigNumber) {
- argTypes.push('uint256');
- args[i] = new BN(arg.toString(10), 10);
- } else if (ethUtil.isValidAddress(arg)) {
- argTypes.push('address');
- } else if (_.isString(arg)) {
- argTypes.push('string');
- } else if (_.isBoolean(arg)) {
- argTypes.push('bool');
- } else {
- throw new Error(`Unable to guess arg type: ${arg}`);
- }
- });
- const hash = hashFunction(argTypes, args);
- return hash;
- },
-};
diff --git a/packages/contracts/util/exchange_wrapper.ts b/packages/contracts/util/exchange_wrapper.ts
deleted file mode 100644
index f016067fe..000000000
--- a/packages/contracts/util/exchange_wrapper.ts
+++ /dev/null
@@ -1,230 +0,0 @@
-import { SignedOrder, TransactionReceiptWithDecodedLogs, ZeroEx } from '0x.js';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { ExchangeContract } from '../src/contract_wrappers/generated/exchange';
-
-import { formatters } from './formatters';
-import { signedOrderUtils } from './signed_order_utils';
-
-export class ExchangeWrapper {
- private _exchange: ExchangeContract;
- private _zeroEx: ZeroEx;
- constructor(exchangeContract: ExchangeContract, zeroEx: ZeroEx) {
- this._exchange = exchangeContract;
- this._zeroEx = zeroEx;
- }
- public async fillOrderAsync(
- signedOrder: SignedOrder,
- from: string,
- opts: {
- fillTakerTokenAmount?: BigNumber;
- shouldThrowOnInsufficientBalanceOrAllowance?: boolean;
- } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
- const params = signedOrderUtils.createFill(
- signedOrder,
- shouldThrowOnInsufficientBalanceOrAllowance,
- opts.fillTakerTokenAmount,
- );
- const txHash = await this._exchange.fillOrder.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.fillTakerTokenAmount,
- params.shouldThrowOnInsufficientBalanceOrAllowance,
- params.v,
- params.r,
- params.s,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async cancelOrderAsync(
- signedOrder: SignedOrder,
- from: string,
- opts: { cancelTakerTokenAmount?: BigNumber } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const params = signedOrderUtils.createCancel(signedOrder, opts.cancelTakerTokenAmount);
- const txHash = await this._exchange.cancelOrder.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.cancelTakerTokenAmount,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async fillOrKillOrderAsync(
- signedOrder: SignedOrder,
- from: string,
- opts: { fillTakerTokenAmount?: BigNumber } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const shouldThrowOnInsufficientBalanceOrAllowance = true;
- const params = signedOrderUtils.createFill(
- signedOrder,
- shouldThrowOnInsufficientBalanceOrAllowance,
- opts.fillTakerTokenAmount,
- );
- const txHash = await this._exchange.fillOrKillOrder.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.fillTakerTokenAmount,
- params.v,
- params.r,
- params.s,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async batchFillOrdersAsync(
- orders: SignedOrder[],
- from: string,
- opts: {
- fillTakerTokenAmounts?: BigNumber[];
- shouldThrowOnInsufficientBalanceOrAllowance?: boolean;
- } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
- const params = formatters.createBatchFill(
- orders,
- shouldThrowOnInsufficientBalanceOrAllowance,
- opts.fillTakerTokenAmounts,
- );
- const txHash = await this._exchange.batchFillOrders.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.fillTakerTokenAmounts,
- params.shouldThrowOnInsufficientBalanceOrAllowance,
- params.v,
- params.r,
- params.s,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async batchFillOrKillOrdersAsync(
- orders: SignedOrder[],
- from: string,
- opts: { fillTakerTokenAmounts?: BigNumber[]; shouldThrowOnInsufficientBalanceOrAllowance?: boolean } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
- const params = formatters.createBatchFill(
- orders,
- shouldThrowOnInsufficientBalanceOrAllowance,
- opts.fillTakerTokenAmounts,
- );
- const txHash = await this._exchange.batchFillOrKillOrders.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.fillTakerTokenAmounts,
- params.v,
- params.r,
- params.s,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async fillOrdersUpToAsync(
- orders: SignedOrder[],
- from: string,
- opts: { fillTakerTokenAmount: BigNumber; shouldThrowOnInsufficientBalanceOrAllowance?: boolean },
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const shouldThrowOnInsufficientBalanceOrAllowance = !!opts.shouldThrowOnInsufficientBalanceOrAllowance;
- const params = formatters.createFillUpTo(
- orders,
- shouldThrowOnInsufficientBalanceOrAllowance,
- opts.fillTakerTokenAmount,
- );
- const txHash = await this._exchange.fillOrdersUpTo.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.fillTakerTokenAmount,
- params.shouldThrowOnInsufficientBalanceOrAllowance,
- params.v,
- params.r,
- params.s,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async batchCancelOrdersAsync(
- orders: SignedOrder[],
- from: string,
- opts: { cancelTakerTokenAmounts?: BigNumber[] } = {},
- ): Promise<TransactionReceiptWithDecodedLogs> {
- const params = formatters.createBatchCancel(orders, opts.cancelTakerTokenAmounts);
- const txHash = await this._exchange.batchCancelOrders.sendTransactionAsync(
- params.orderAddresses,
- params.orderValues,
- params.cancelTakerTokenAmounts,
- { from },
- );
- const tx = await this._zeroEx.awaitTransactionMinedAsync(txHash);
- tx.logs = _.filter(tx.logs, log => log.address === this._exchange.address);
- _.each(tx.logs, log => wrapLogBigNumbers(log));
- return tx;
- }
- public async getOrderHashAsync(signedOrder: SignedOrder): Promise<string> {
- const shouldThrowOnInsufficientBalanceOrAllowance = false;
- const params = signedOrderUtils.getOrderAddressesAndValues(signedOrder);
- const orderHash = await this._exchange.getOrderHash.callAsync(params.orderAddresses, params.orderValues);
- return orderHash;
- }
- public async isValidSignatureAsync(signedOrder: SignedOrder): Promise<boolean> {
- const isValidSignature = await this._exchange.isValidSignature.callAsync(
- signedOrder.maker,
- ZeroEx.getOrderHashHex(signedOrder),
- signedOrder.ecSignature.v,
- signedOrder.ecSignature.r,
- signedOrder.ecSignature.s,
- );
- return isValidSignature;
- }
- public async isRoundingErrorAsync(
- numerator: BigNumber,
- denominator: BigNumber,
- target: BigNumber,
- ): Promise<boolean> {
- const isRoundingError = await this._exchange.isRoundingError.callAsync(numerator, denominator, target);
- return isRoundingError;
- }
- public async getPartialAmountAsync(
- numerator: BigNumber,
- denominator: BigNumber,
- target: BigNumber,
- ): Promise<BigNumber> {
- const partialAmount = new BigNumber(
- await this._exchange.getPartialAmount.callAsync(numerator, denominator, target),
- );
- return partialAmount;
- }
-}
-
-function wrapLogBigNumbers(log: any): any {
- const argNames = _.keys(log.args);
- for (const argName of argNames) {
- const isWeb3BigNumber = _.startsWith(log.args[argName].constructor.toString(), 'function BigNumber(');
- if (isWeb3BigNumber) {
- log.args[argName] = new BigNumber(log.args[argName]);
- }
- }
-}
diff --git a/packages/contracts/util/formatters.ts b/packages/contracts/util/formatters.ts
deleted file mode 100644
index 8e0dfb09e..000000000
--- a/packages/contracts/util/formatters.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import { SignedOrder } from '0x.js';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-
-import { BatchCancelOrders, BatchFillOrders, FillOrdersUpTo } from './types';
-
-export const formatters = {
- createBatchFill(
- signedOrders: SignedOrder[],
- shouldThrowOnInsufficientBalanceOrAllowance: boolean,
- fillTakerTokenAmounts: BigNumber[] = [],
- ) {
- const batchFill: BatchFillOrders = {
- orderAddresses: [],
- orderValues: [],
- fillTakerTokenAmounts,
- shouldThrowOnInsufficientBalanceOrAllowance,
- v: [],
- r: [],
- s: [],
- };
- _.forEach(signedOrders, signedOrder => {
- batchFill.orderAddresses.push([
- signedOrder.maker,
- signedOrder.taker,
- signedOrder.makerTokenAddress,
- signedOrder.takerTokenAddress,
- signedOrder.feeRecipient,
- ]);
- batchFill.orderValues.push([
- signedOrder.makerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- signedOrder.takerFee,
- signedOrder.expirationUnixTimestampSec,
- signedOrder.salt,
- ]);
- batchFill.v.push(signedOrder.ecSignature.v);
- batchFill.r.push(signedOrder.ecSignature.r);
- batchFill.s.push(signedOrder.ecSignature.s);
- if (fillTakerTokenAmounts.length < signedOrders.length) {
- batchFill.fillTakerTokenAmounts.push(signedOrder.takerTokenAmount);
- }
- });
- return batchFill;
- },
- createFillUpTo(
- signedOrders: SignedOrder[],
- shouldThrowOnInsufficientBalanceOrAllowance: boolean,
- fillTakerTokenAmount: BigNumber,
- ) {
- const fillUpTo: FillOrdersUpTo = {
- orderAddresses: [],
- orderValues: [],
- fillTakerTokenAmount,
- shouldThrowOnInsufficientBalanceOrAllowance,
- v: [],
- r: [],
- s: [],
- };
- signedOrders.forEach(signedOrder => {
- fillUpTo.orderAddresses.push([
- signedOrder.maker,
- signedOrder.taker,
- signedOrder.makerTokenAddress,
- signedOrder.takerTokenAddress,
- signedOrder.feeRecipient,
- ]);
- fillUpTo.orderValues.push([
- signedOrder.makerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- signedOrder.takerFee,
- signedOrder.expirationUnixTimestampSec,
- signedOrder.salt,
- ]);
- fillUpTo.v.push(signedOrder.ecSignature.v);
- fillUpTo.r.push(signedOrder.ecSignature.r);
- fillUpTo.s.push(signedOrder.ecSignature.s);
- });
- return fillUpTo;
- },
- createBatchCancel(signedOrders: SignedOrder[], cancelTakerTokenAmounts: BigNumber[] = []) {
- const batchCancel: BatchCancelOrders = {
- orderAddresses: [],
- orderValues: [],
- cancelTakerTokenAmounts,
- };
- signedOrders.forEach(signedOrder => {
- batchCancel.orderAddresses.push([
- signedOrder.maker,
- signedOrder.taker,
- signedOrder.makerTokenAddress,
- signedOrder.takerTokenAddress,
- signedOrder.feeRecipient,
- ]);
- batchCancel.orderValues.push([
- signedOrder.makerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- signedOrder.takerFee,
- signedOrder.expirationUnixTimestampSec,
- signedOrder.salt,
- ]);
- if (cancelTakerTokenAmounts.length < signedOrders.length) {
- batchCancel.cancelTakerTokenAmounts.push(signedOrder.takerTokenAmount);
- }
- });
- return batchCancel;
- },
-};
diff --git a/packages/contracts/util/multi_sig_wrapper.ts b/packages/contracts/util/multi_sig_wrapper.ts
deleted file mode 100644
index 9f6dcec52..000000000
--- a/packages/contracts/util/multi_sig_wrapper.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { AbiDefinition, MethodAbi } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-import ABI = require('ethereumjs-abi');
-import ethUtil = require('ethereumjs-util');
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { MultiSigWalletContract } from '../src/contract_wrappers/generated/multi_sig_wallet';
-
-import { TransactionDataParams } from './types';
-
-export class MultiSigWrapper {
- private _multiSig: MultiSigWalletContract;
- public static encodeFnArgs(name: string, abi: AbiDefinition[], args: any[]) {
- const abiEntity = _.find(abi, { name }) as MethodAbi;
- if (_.isUndefined(abiEntity)) {
- throw new Error(`Did not find abi entry for name: ${name}`);
- }
- const types = _.map(abiEntity.inputs, input => input.type);
- const funcSig = ethUtil.bufferToHex(ABI.methodID(name, types));
- const argsData = _.map(args, arg => {
- const target = _.isBoolean(arg) ? +arg : arg;
- const targetBuff = ethUtil.toBuffer(target);
- return ethUtil.setLengthLeft(targetBuff, 32).toString('hex');
- });
- return funcSig + argsData.join('');
- }
- constructor(multiSigContract: MultiSigWalletContract) {
- this._multiSig = multiSigContract;
- }
- public async submitTransactionAsync(
- destination: string,
- from: string,
- dataParams: TransactionDataParams,
- value: BigNumber = new BigNumber(0),
- ) {
- const { name, abi, args = [] } = dataParams;
- const encoded = MultiSigWrapper.encodeFnArgs(name, abi, args);
- return this._multiSig.submitTransaction.sendTransactionAsync(destination, value, encoded, {
- from,
- });
- }
-}
diff --git a/packages/contracts/util/order_factory.ts b/packages/contracts/util/order_factory.ts
deleted file mode 100644
index 8ba5df24a..000000000
--- a/packages/contracts/util/order_factory.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Order, SignedOrder, ZeroEx } from '0x.js';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-
-import { DefaultOrderParams } from './types';
-
-export class OrderFactory {
- private _defaultOrderParams: Partial<Order>;
- private _zeroEx: ZeroEx;
- constructor(zeroEx: ZeroEx, defaultOrderParams: Partial<Order>) {
- this._defaultOrderParams = defaultOrderParams;
- this._zeroEx = zeroEx;
- }
- public async newSignedOrderAsync(customOrderParams: Partial<Order> = {}): Promise<SignedOrder> {
- const randomExpiration = new BigNumber(Math.floor((Date.now() + Math.random() * 100000000000) / 1000));
- const order = ({
- expirationUnixTimestampSec: randomExpiration,
- salt: ZeroEx.generatePseudoRandomSalt(),
- taker: ZeroEx.NULL_ADDRESS,
- ...this._defaultOrderParams,
- ...customOrderParams,
- } as any) as Order;
- const orderHashHex = ZeroEx.getOrderHashHex(order);
- const shouldAddPersonalMessagePrefix = false;
- const ecSignature = await this._zeroEx.signOrderHashAsync(
- orderHashHex,
- order.maker,
- shouldAddPersonalMessagePrefix,
- );
- const signedOrder = {
- ...order,
- ecSignature,
- };
- return signedOrder;
- }
-}
diff --git a/packages/contracts/util/signed_order_utils.ts b/packages/contracts/util/signed_order_utils.ts
deleted file mode 100644
index fc2f800cd..000000000
--- a/packages/contracts/util/signed_order_utils.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { SignedOrder } from '0x.js';
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import ethUtil = require('ethereumjs-util');
-import * as _ from 'lodash';
-
-import { crypto } from './crypto';
-
-export const signedOrderUtils = {
- createFill: (
- signedOrder: SignedOrder,
- shouldThrowOnInsufficientBalanceOrAllowance?: boolean,
- fillTakerTokenAmount?: BigNumber,
- ) => {
- const fill = {
- ...signedOrderUtils.getOrderAddressesAndValues(signedOrder),
- fillTakerTokenAmount: fillTakerTokenAmount || signedOrder.takerTokenAmount,
- shouldThrowOnInsufficientBalanceOrAllowance: !!shouldThrowOnInsufficientBalanceOrAllowance,
- ...signedOrder.ecSignature,
- };
- return fill;
- },
- createCancel(signedOrder: SignedOrder, cancelTakerTokenAmount?: BigNumber) {
- const cancel = {
- ...signedOrderUtils.getOrderAddressesAndValues(signedOrder),
- cancelTakerTokenAmount: cancelTakerTokenAmount || signedOrder.takerTokenAmount,
- };
- return cancel;
- },
- getOrderAddressesAndValues(signedOrder: SignedOrder) {
- return {
- orderAddresses: [
- signedOrder.maker,
- signedOrder.taker,
- signedOrder.makerTokenAddress,
- signedOrder.takerTokenAddress,
- signedOrder.feeRecipient,
- ],
- orderValues: [
- signedOrder.makerTokenAmount,
- signedOrder.takerTokenAmount,
- signedOrder.makerFee,
- signedOrder.takerFee,
- signedOrder.expirationUnixTimestampSec,
- signedOrder.salt,
- ],
- };
- },
-};
diff --git a/packages/contracts/util/token_registry_wrapper.ts b/packages/contracts/util/token_registry_wrapper.ts
deleted file mode 100644
index d78c8a64e..000000000
--- a/packages/contracts/util/token_registry_wrapper.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import * as Web3 from 'web3';
-
-import { TokenRegistryContract } from '../src/contract_wrappers/generated/token_registry';
-
-import { Token } from './types';
-
-export class TokenRegWrapper {
- private _tokenReg: TokenRegistryContract;
- constructor(tokenRegContract: TokenRegistryContract) {
- this._tokenReg = tokenRegContract;
- }
- public async addTokenAsync(token: Token, from: string) {
- const tx = this._tokenReg.addToken.sendTransactionAsync(
- token.address as string,
- token.name,
- token.symbol,
- token.decimals,
- token.ipfsHash,
- token.swarmHash,
- { from },
- );
- return tx;
- }
- public async getTokenMetaDataAsync(tokenAddress: string) {
- const data = await this._tokenReg.getTokenMetaData.callAsync(tokenAddress);
- const token: Token = {
- address: data[0],
- name: data[1],
- symbol: data[2],
- decimals: data[3],
- ipfsHash: data[4],
- swarmHash: data[5],
- };
- return token;
- }
- public async getTokenByNameAsync(tokenName: string) {
- const data = await this._tokenReg.getTokenByName.callAsync(tokenName);
- const token: Token = {
- address: data[0],
- name: data[1],
- symbol: data[2],
- decimals: data[3],
- ipfsHash: data[4],
- swarmHash: data[5],
- };
- return token;
- }
- public async getTokenBySymbolAsync(tokenSymbol: string) {
- const data = await this._tokenReg.getTokenBySymbol.callAsync(tokenSymbol);
- const token: Token = {
- address: data[0],
- name: data[1],
- symbol: data[2],
- decimals: data[3],
- ipfsHash: data[4],
- swarmHash: data[5],
- };
- return token;
- }
-}
diff --git a/packages/contracts/util/types.ts b/packages/contracts/util/types.ts
deleted file mode 100644
index 321084c42..000000000
--- a/packages/contracts/util/types.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import { AbiDefinition, ContractAbi } from '@0xproject/types';
-import { BigNumber } from '@0xproject/utils';
-
-export interface BalancesByOwner {
- [ownerAddress: string]: {
- [tokenAddress: string]: BigNumber;
- };
-}
-
-export interface SubmissionContractEventArgs {
- transactionId: BigNumber;
-}
-
-export interface BatchFillOrders {
- orderAddresses: string[][];
- orderValues: BigNumber[][];
- fillTakerTokenAmounts: BigNumber[];
- shouldThrowOnInsufficientBalanceOrAllowance: boolean;
- v: number[];
- r: string[];
- s: string[];
-}
-
-export interface FillOrdersUpTo {
- orderAddresses: string[][];
- orderValues: BigNumber[][];
- fillTakerTokenAmount: BigNumber;
- shouldThrowOnInsufficientBalanceOrAllowance: boolean;
- v: number[];
- r: string[];
- s: string[];
-}
-
-export interface BatchCancelOrders {
- orderAddresses: string[][];
- orderValues: BigNumber[][];
- cancelTakerTokenAmounts: BigNumber[];
-}
-
-export interface DefaultOrderParams {
- exchangeContractAddress: string;
- maker: string;
- feeRecipient: string;
- makerTokenAddress: string;
- takerTokenAddress: string;
- makerTokenAmount: BigNumber;
- takerTokenAmount: BigNumber;
- makerFee: BigNumber;
- takerFee: BigNumber;
-}
-
-export interface TransactionDataParams {
- name: string;
- abi: AbiDefinition[];
- args: any[];
-}
-
-export interface MultiSigConfig {
- owners: string[];
- confirmationsRequired: number;
- secondsRequired: number;
-}
-
-export interface MultiSigConfigByNetwork {
- [networkName: string]: MultiSigConfig;
-}
-
-export interface Token {
- address?: string;
- name: string;
- symbol: string;
- decimals: number;
- ipfsHash: string;
- swarmHash: string;
-}
-
-export interface TokenInfoByNetwork {
- development: Token[];
- live: Token[];
-}
-
-export enum ExchangeContractErrs {
- ERROR_ORDER_EXPIRED,
- ERROR_ORDER_FULLY_FILLED_OR_CANCELLED,
- ERROR_ROUNDING_ERROR_TOO_LARGE,
- ERROR_INSUFFICIENT_BALANCE_OR_ALLOWANCE,
-}
-
-export enum ContractName {
- TokenTransferProxy = 'TokenTransferProxy',
- TokenRegistry = 'TokenRegistry',
- MultiSigWalletWithTimeLock = 'MultiSigWalletWithTimeLock',
- Exchange = 'Exchange',
- ZRXToken = 'ZRXToken',
- DummyToken = 'DummyToken',
- EtherToken = 'WETH9',
- MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress = 'MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress',
- MaliciousToken = 'MaliciousToken',
- AccountLevels = 'AccountLevels',
- EtherDelta = 'EtherDelta',
- Arbitrage = 'Arbitrage',
-}
-
-export interface Artifact {
- contract_name: ContractName;
- networks: {
- [networkId: number]: {
- abi: ContractAbi;
- solc_version: string;
- keccak256: string;
- optimizer_enabled: number;
- unlinked_binary: string;
- updated_at: number;
- address: string;
- constructor_args: string;
- };
- };
-}
diff --git a/packages/deployer/CHANGELOG.json b/packages/deployer/CHANGELOG.json
deleted file mode 100644
index c06bbc887..000000000
--- a/packages/deployer/CHANGELOG.json
+++ /dev/null
@@ -1,108 +0,0 @@
-[
- {
- "version": "0.3.4",
- "changes": [
- {
- "note": "Create solc_bin directory if does not exist before attempting to compile",
- "pr": 491
- }
- ],
- "timestamp": 1522658513,
- "isPublished": true
- },
- {
- "version": "0.3.1",
- "changes": [
- {
- "note": "Add TS types for `yargs`"
- }
- ],
- "timestamp": 1521298800,
- "isPublished": true
- },
- {
- "version": "0.3.0",
- "changes": [
- {
- "note": "Add support for Solidity 0.4.20 and 0.4.21"
- },
- {
- "note": "Replace `jsonrpcPort` config with `jsonrpcUrl`",
- "pr": 426
- },
- {
- "note": "Replace `jsonrpc-port` CLI option with `jsonrpc-url`",
- "pr": 426
- },
- {
- "note": "Export the `Compiler`",
- "pr": 426
- },
- {
- "note": "Load solc from remote source instead of having it locally",
- "pr": 426
- },
- {
- "note":
- "Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts",
- "pr": 426
- },
- {
- "note": "Remove 0x-specific `migrate` command",
- "pr": 426
- },
- {
- "note":
- "Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core",
- "pr": 426
- },
- {
- "note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
- "pr": 452
- },
- {
- "note": "Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error."
- }
- ],
- "timestamp": 1521298800,
- "isPublished": true
- },
- {
- "version": "0.2.0",
- "changes": [
- {
- "note": "Check dependencies when determining if contracts should be recompiled",
- "pr": 408
- },
- {
- "note":
- "Improve an error message for when deployer is supplied with an incorrect number of constructor arguments",
- "pr": 419
- }
- ],
- "timestamp": 1520089200,
- "isPublished": true
- },
- {
- "version": "0.1.0",
- "changes": [
- {
- "note": "Add the ability to pass in specific contracts to compile in CLI",
- "pr": 400
- }
- ],
- "timestamp": 1518706800,
- "isPublished": true
- },
- {
- "version": "0.0.8",
- "changes": [
- {
- "note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
- "pr": 389
- }
- ],
- "timestamp": 1518102000,
- "isPublished": true
- }
-]
diff --git a/packages/deployer/CHANGELOG.md b/packages/deployer/CHANGELOG.md
deleted file mode 100644
index 2a922e12a..000000000
--- a/packages/deployer/CHANGELOG.md
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
-Edit the package's CHANGELOG.json file only.
--->
-
-CHANGELOG
-
-## v0.3.4 - _April 2, 2018_
-
- * Create solc_bin directory if does not exist before attempting to compile (#491)
-
-## v0.3.1 - _March 18, 2018_
-
- * Add TS types for `yargs`
-
-## v0.3.0 - _March 18, 2018_
-
- * Add support for Solidity 0.4.20 and 0.4.21
- * Replace `jsonrpcPort` config with `jsonrpcUrl` (#426)
- * Replace `jsonrpc-port` CLI option with `jsonrpc-url` (#426)
- * Export the `Compiler` (#426)
- * Load solc from remote source instead of having it locally (#426)
- * Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts (#426)
- * Remove 0x-specific `migrate` command (#426)
- * Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core (#426)
- * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
- * Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error.
-
-## v0.2.0 - _March 4, 2018_
-
- * Check dependencies when determining if contracts should be recompiled (#408)
- * Improve an error message for when deployer is supplied with an incorrect number of constructor arguments (#419)
-
-## v0.1.0 - _February 16, 2018_
-
- * Add the ability to pass in specific contracts to compile in CLI (#400)
-
-## v0.0.8 - _February 9, 2018_
-
- * Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
diff --git a/packages/deployer/README.md b/packages/deployer/README.md
deleted file mode 100644
index 812e8c31b..000000000
--- a/packages/deployer/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-## @0xproject/deployer
-
-This repository contains a CLI tool that facilitates compiling and deployment of smart contracts.
-
-### Read the [Documentation](0xproject.com/docs/deployer).
-
-## Installation
-
-#### CLI Installation
-
-```bash
-yarn global add @0xproject/deployer
-```
-
-#### API Installation
-
-```bash
-yarn add @0xproject/deployer
-```
-
-If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
-
-```json
-"compilerOptions": {
- "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
-}
-```
-
-**Import**
-
-```typescript
-import { Deployer, Compiler } from '@0xproject/deployer';
-```
-
-or
-
-```javascript
-var Deployer = require('@0xproject/deployer').Deployer;
-var Compiler = require('@0xproject/deployer').Compiler;
-```
-
-## Contributing
-
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
-
-Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-
-### Install Dependencies
-
-If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
-
-```bash
-yarn config set workspaces-experimental true
-```
-
-Then install dependencies
-
-```bash
-yarn install
-```
-
-### Build
-
-```bash
-yarn build
-```
-
-or
-
-```bash
-yarn build:watch
-```
-
-### Lint
-
-```bash
-yarn lint
-```
-
-### Run Tests
-
-```bash
-yarn test
-```
diff --git a/packages/deployer/package.json b/packages/deployer/package.json
deleted file mode 100644
index 5a2903cd6..000000000
--- a/packages/deployer/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "name": "@0xproject/deployer",
- "version": "0.3.4",
- "description": "Smart contract deployer of 0x protocol",
- "main": "lib/src/index.js",
- "types": "lib/src/index.d.ts",
- "scripts": {
- "build:watch": "tsc -w",
- "build": "yarn clean && copyfiles 'test/fixtures/contracts/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "test": "run-s build run_mocha",
- "run_mocha": "mocha lib/test/*_test.js",
- "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
- "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
- "compile": "npm run build; node lib/src/cli.js compile",
- "clean": "shx rm -rf lib scripts",
- "migrate": "npm run build; node lib/src/cli.js migrate",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "test:circleci": "yarn test:coverage",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
- "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
- "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
- },
- "config": {
- "postpublish": {
- "assets": [],
- "docPublishConfigs": {
- "extraFileIncludes": [
- "../types/src/index.ts"
- ],
- "s3BucketPath": "s3://doc-jsons/deployer/",
- "s3StagingBucketPath": "s3://staging-doc-jsons/deployer/"
- }
- }
- },
- "bin": {
- "0x-deployer": "lib/src/cli.js"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/0xProject/0x-monorepo.git"
- },
- "author": "Amir Bandeali",
- "license": "Apache-2.0",
- "bugs": {
- "url": "https://github.com/0xProject/0x-monorepo/issues"
- },
- "homepage": "https://github.com/0xProject/0x-monorepo/packages/deployer/README.md",
- "devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/require-from-string": "^1.2.0",
- "@types/semver": "^5.5.0",
- "@types/yargs": "^11.0.0",
- "chai": "^4.0.1",
- "copyfiles": "^1.2.0",
- "dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
- "npm-run-all": "^4.1.2",
- "nyc": "^11.0.1",
- "shx": "^0.2.2",
- "tslint": "5.8.0",
- "typedoc": "0xProject/typedoc",
- "types-bn": "^0.0.1",
- "typescript": "2.7.1",
- "web3-typescript-typings": "^0.10.2"
- },
- "dependencies": {
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "@0xproject/web3-wrapper": "^0.4.0",
- "ethereumjs-util": "^5.1.1",
- "isomorphic-fetch": "^2.2.1",
- "lodash": "^4.17.4",
- "require-from-string": "^2.0.1",
- "semver": "^5.5.0",
- "solc": "^0.4.18",
- "web3": "^0.20.0",
- "web3-eth-abi": "^1.0.0-beta.24",
- "yargs": "^10.0.3"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/deployer/src/cli.ts b/packages/deployer/src/cli.ts
deleted file mode 100644
index d1bd645b3..000000000
--- a/packages/deployer/src/cli.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/usr/bin/env node
-// We need the above pragma since this script will be run as a command-line tool.
-
-import { BigNumber } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as Web3 from 'web3';
-import * as yargs from 'yargs';
-
-import { commands } from './commands';
-import { constants } from './utils/constants';
-import { consoleReporter } from './utils/error_reporter';
-import { CliOptions, CompilerOptions, DeployerOptions } from './utils/types';
-
-const DEFAULT_OPTIMIZER_ENABLED = false;
-const DEFAULT_CONTRACTS_DIR = path.resolve('src/contracts');
-const DEFAULT_ARTIFACTS_DIR = path.resolve('src/artifacts');
-const DEFAULT_NETWORK_ID = 50;
-const DEFAULT_JSONRPC_URL = 'http://localhost:8545';
-const DEFAULT_GAS_PRICE = (10 ** 9 * 2).toString();
-const DEFAULT_CONTRACTS_LIST = '*';
-
-/**
- * Compiles all contracts with options passed in through CLI.
- * @param argv Instance of process.argv provided by yargs.
- */
-async function onCompileCommandAsync(argv: CliOptions): Promise<void> {
- const opts: CompilerOptions = {
- contractsDir: argv.contractsDir,
- networkId: argv.networkId,
- optimizerEnabled: argv.shouldOptimize,
- artifactsDir: argv.artifactsDir,
- specifiedContracts: getContractsSetFromList(argv.contracts),
- };
- await commands.compileAsync(opts);
-}
-/**
- * Deploys a single contract with provided name and args.
- * @param argv Instance of process.argv provided by yargs.
- */
-async function onDeployCommandAsync(argv: CliOptions): Promise<void> {
- const url = argv.jsonrpcUrl;
- const web3Provider = new Web3.providers.HttpProvider(url);
- const web3Wrapper = new Web3Wrapper(web3Provider);
- const networkId = await web3Wrapper.getNetworkIdAsync();
- const compilerOpts: CompilerOptions = {
- contractsDir: argv.contractsDir,
- networkId,
- optimizerEnabled: argv.shouldOptimize,
- artifactsDir: argv.artifactsDir,
- specifiedContracts: getContractsSetFromList(argv.contracts),
- };
- await commands.compileAsync(compilerOpts);
-
- const defaults = {
- gasPrice: new BigNumber(argv.gasPrice),
- from: argv.account,
- };
- const deployerOpts: DeployerOptions = {
- artifactsDir: argv.artifactsDir,
- jsonrpcUrl: argv.jsonrpcUrl,
- networkId,
- defaults,
- };
- const deployerArgsString = argv.args as string;
- const deployerArgs = deployerArgsString.split(',');
- await commands.deployAsync(argv.contract as string, deployerArgs, deployerOpts);
-}
-/**
- * Creates a set of contracts to compile.
- * @param contracts Comma separated list of contracts to compile
- */
-function getContractsSetFromList(contracts: string): Set<string> {
- const specifiedContracts = new Set();
- if (contracts === '*') {
- return new Set(['*']);
- }
- const contractsArray = contracts.split(',');
- _.forEach(contractsArray, contractName => {
- const fileName = `${contractName}${constants.SOLIDITY_FILE_EXTENSION}`;
- specifiedContracts.add(fileName);
- });
- return specifiedContracts;
-}
-/**
- * Provides extra required options for deploy command.
- * @param yargsInstance yargs instance provided in builder function callback.
- */
-function deployCommandBuilder(yargsInstance: any) {
- return yargsInstance
- .option('contract', {
- type: 'string',
- description: 'name of contract to deploy, exluding .sol extension',
- })
- .option('args', {
- type: 'string',
- description: 'comma separated list of constructor args to deploy contract with',
- })
- .demandOption(['contract', 'args'])
- .help().argv;
-}
-
-(() => {
- const identityCommandBuilder = _.identity;
- return yargs
- .option('contracts-dir', {
- type: 'string',
- default: DEFAULT_CONTRACTS_DIR,
- description: 'path of contracts directory to compile',
- })
- .option('network-id', {
- type: 'number',
- default: DEFAULT_NETWORK_ID,
- description: 'mainnet=1, kovan=42, testrpc=50',
- })
- .option('should-optimize', {
- type: 'boolean',
- default: DEFAULT_OPTIMIZER_ENABLED,
- description: 'enable optimizer',
- })
- .option('artifacts-dir', {
- type: 'string',
- default: DEFAULT_ARTIFACTS_DIR,
- description: 'path to write contracts artifacts to',
- })
- .option('jsonrpc-url', {
- type: 'string',
- default: DEFAULT_JSONRPC_URL,
- description: 'url of JSON RPC',
- })
- .option('gas-price', {
- type: 'string',
- default: DEFAULT_GAS_PRICE,
- description: 'gasPrice to be used for transactions',
- })
- .option('account', {
- type: 'string',
- description: 'account to use for deploying contracts',
- })
- .option('contracts', {
- type: 'string',
- default: DEFAULT_CONTRACTS_LIST,
- description: 'comma separated list of contracts to compile',
- })
- .command('compile', 'compile contracts', identityCommandBuilder, consoleReporter(onCompileCommandAsync))
- .command(
- 'deploy',
- 'deploy a single contract with provided arguments',
- deployCommandBuilder,
- consoleReporter(onDeployCommandAsync),
- )
- .help().argv;
-})();
diff --git a/packages/deployer/src/commands.ts b/packages/deployer/src/commands.ts
deleted file mode 100644
index 8e544a60b..000000000
--- a/packages/deployer/src/commands.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Compiler } from './compiler';
-import { Deployer } from './deployer';
-import { CompilerOptions, DeployerOptions } from './utils/types';
-
-export const commands = {
- async compileAsync(opts: CompilerOptions): Promise<void> {
- const compiler = new Compiler(opts);
- await compiler.compileAsync();
- },
- async deployAsync(contractName: string, args: any[], opts: DeployerOptions): Promise<void> {
- const deployer = new Deployer(opts);
- await deployer.deployAndSaveAsync(contractName, args);
- },
-};
diff --git a/packages/deployer/src/compiler.ts b/packages/deployer/src/compiler.ts
deleted file mode 100644
index 219a55c32..000000000
--- a/packages/deployer/src/compiler.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import { ContractAbi } from '@0xproject/types';
-import { logUtils, promisify } from '@0xproject/utils';
-import * as ethUtil from 'ethereumjs-util';
-import * as fs from 'fs';
-import 'isomorphic-fetch';
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as requireFromString from 'require-from-string';
-import * as semver from 'semver';
-import solc = require('solc');
-
-import { binPaths } from './solc/bin_paths';
-import {
- createDirIfDoesNotExistAsync,
- findImportIfExist,
- getContractArtifactIfExistsAsync,
- getNormalizedErrMsg,
- parseDependencies,
- parseSolidityVersionRange,
-} from './utils/compiler';
-import { constants } from './utils/constants';
-import { fsWrapper } from './utils/fs_wrapper';
-import {
- CompilerOptions,
- ContractArtifact,
- ContractNetworkData,
- ContractNetworks,
- ContractSourceData,
- ContractSources,
- ContractSpecificSourceData,
-} from './utils/types';
-import { utils } from './utils/utils';
-
-const ALL_CONTRACTS_IDENTIFIER = '*';
-const SOLC_BIN_DIR = path.join(__dirname, '..', '..', 'solc_bin');
-
-/**
- * The Compiler facilitates compiling Solidity smart contracts and saves the results
- * to artifact files.
- */
-export class Compiler {
- private _contractsDir: string;
- private _networkId: number;
- private _optimizerEnabled: boolean;
- private _artifactsDir: string;
- // This get's set in the beggining of `compileAsync` function. It's not called from a constructor, but it's the only public method of that class and could as well be.
- private _contractSources!: ContractSources;
- private _solcErrors: Set<string> = new Set();
- private _specifiedContracts: Set<string> = new Set();
- private _contractSourceData: ContractSourceData = {};
- /**
- * Recursively retrieves Solidity source code from directory.
- * @param dirPath Directory to search.
- * @return Mapping of contract fileName to contract source.
- */
- private static async _getContractSourcesAsync(dirPath: string): Promise<ContractSources> {
- let dirContents: string[] = [];
- try {
- dirContents = await fsWrapper.readdirAsync(dirPath);
- } catch (err) {
- throw new Error(`No directory found at ${dirPath}`);
- }
- let sources: ContractSources = {};
- for (const fileName of dirContents) {
- const contentPath = `${dirPath}/${fileName}`;
- if (path.extname(fileName) === constants.SOLIDITY_FILE_EXTENSION) {
- try {
- const opts = {
- encoding: 'utf8',
- };
- const source = await fsWrapper.readFileAsync(contentPath, opts);
- sources[fileName] = source;
- logUtils.log(`Reading ${fileName} source...`);
- } catch (err) {
- logUtils.log(`Could not find file at ${contentPath}`);
- }
- } else {
- try {
- const nestedSources = await Compiler._getContractSourcesAsync(contentPath);
- sources = {
- ...sources,
- ...nestedSources,
- };
- } catch (err) {
- logUtils.log(`${contentPath} is not a directory or ${constants.SOLIDITY_FILE_EXTENSION} file`);
- }
- }
- }
- return sources;
- }
- /**
- * Instantiates a new instance of the Compiler class.
- * @param opts Options specifying directories, network, and optimization settings.
- * @return An instance of the Compiler class.
- */
- constructor(opts: CompilerOptions) {
- this._contractsDir = opts.contractsDir;
- this._networkId = opts.networkId;
- this._optimizerEnabled = opts.optimizerEnabled;
- this._artifactsDir = opts.artifactsDir;
- this._specifiedContracts = opts.specifiedContracts;
- }
- /**
- * Compiles selected Solidity files found in `contractsDir` and writes JSON artifacts to `artifactsDir`.
- */
- public async compileAsync(): Promise<void> {
- await createDirIfDoesNotExistAsync(this._artifactsDir);
- await createDirIfDoesNotExistAsync(SOLC_BIN_DIR);
- this._contractSources = await Compiler._getContractSourcesAsync(this._contractsDir);
- _.forIn(this._contractSources, this._setContractSpecificSourceData.bind(this));
- const fileNames = this._specifiedContracts.has(ALL_CONTRACTS_IDENTIFIER)
- ? _.keys(this._contractSources)
- : Array.from(this._specifiedContracts.values());
- for (const fileName of fileNames) {
- await this._compileContractAsync(fileName);
- }
- this._solcErrors.forEach(errMsg => {
- logUtils.log(errMsg);
- });
- }
- /**
- * Compiles contract and saves artifact to artifactsDir.
- * @param fileName Name of contract with '.sol' extension.
- */
- private async _compileContractAsync(fileName: string): Promise<void> {
- if (_.isUndefined(this._contractSources)) {
- throw new Error('Contract sources not yet initialized');
- }
- const contractSpecificSourceData = this._contractSourceData[fileName];
- const currentArtifactIfExists = await getContractArtifactIfExistsAsync(this._artifactsDir, fileName);
- const sourceHash = `0x${contractSpecificSourceData.sourceHash.toString('hex')}`;
- const sourceTreeHash = `0x${contractSpecificSourceData.sourceTreeHash.toString('hex')}`;
-
- let shouldCompile = false;
- if (_.isUndefined(currentArtifactIfExists)) {
- shouldCompile = true;
- } else {
- const currentArtifact = currentArtifactIfExists as ContractArtifact;
- shouldCompile =
- currentArtifact.networks[this._networkId].optimizer_enabled !== this._optimizerEnabled ||
- currentArtifact.networks[this._networkId].source_tree_hash !== sourceTreeHash;
- }
- if (!shouldCompile) {
- return;
- }
- const availableCompilerVersions = _.keys(binPaths);
- const solcVersion = semver.maxSatisfying(
- availableCompilerVersions,
- contractSpecificSourceData.solcVersionRange,
- );
- const fullSolcVersion = binPaths[solcVersion];
- const compilerBinFilename = path.join(SOLC_BIN_DIR, fullSolcVersion);
- let solcjs: string;
- const isCompilerAvailableLocally = fs.existsSync(compilerBinFilename);
- if (isCompilerAvailableLocally) {
- solcjs = fs.readFileSync(compilerBinFilename).toString();
- } else {
- logUtils.log(`Downloading ${fullSolcVersion}...`);
- const url = `${constants.BASE_COMPILER_URL}${fullSolcVersion}`;
- const response = await fetch(url);
- if (response.status !== 200) {
- throw new Error(`Failed to load ${fullSolcVersion}`);
- }
- solcjs = await response.text();
- fs.writeFileSync(compilerBinFilename, solcjs);
- }
- const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename));
-
- logUtils.log(`Compiling ${fileName} with Solidity v${solcVersion}...`);
- const source = this._contractSources[fileName];
- const input = {
- [fileName]: source,
- };
- const sourcesToCompile = {
- sources: input,
- };
- const compiled = solcInstance.compile(sourcesToCompile, Number(this._optimizerEnabled), importPath =>
- findImportIfExist(this._contractSources, importPath),
- );
-
- if (!_.isUndefined(compiled.errors)) {
- _.forEach(compiled.errors, errMsg => {
- const normalizedErrMsg = getNormalizedErrMsg(errMsg);
- this._solcErrors.add(normalizedErrMsg);
- });
- }
- const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
- const contractIdentifier = `${fileName}:${contractName}`;
- if (_.isUndefined(compiled.contracts[contractIdentifier])) {
- throw new Error(
- `Contract ${contractName} not found in ${fileName}. Please make sure your contract has the same name as it's file name`,
- );
- }
- const abi: ContractAbi = JSON.parse(compiled.contracts[contractIdentifier].interface);
- const bytecode = `0x${compiled.contracts[contractIdentifier].bytecode}`;
- const runtimeBytecode = `0x${compiled.contracts[contractIdentifier].runtimeBytecode}`;
- const sourceMap = compiled.contracts[contractIdentifier].srcmap;
- const sourceMapRuntime = compiled.contracts[contractIdentifier].srcmapRuntime;
- const sources = _.keys(compiled.sources);
- const updated_at = Date.now();
- const contractNetworkData: ContractNetworkData = {
- solc_version: solcVersion,
- keccak256: sourceHash,
- source_tree_hash: sourceTreeHash,
- optimizer_enabled: this._optimizerEnabled,
- abi,
- bytecode,
- runtime_bytecode: runtimeBytecode,
- updated_at,
- source_map: sourceMap,
- source_map_runtime: sourceMapRuntime,
- sources,
- };
-
- let newArtifact: ContractArtifact;
- if (!_.isUndefined(currentArtifactIfExists)) {
- const currentArtifact = currentArtifactIfExists as ContractArtifact;
- newArtifact = {
- ...currentArtifact,
- networks: {
- ...currentArtifact.networks,
- [this._networkId]: contractNetworkData,
- },
- };
- } else {
- newArtifact = {
- contract_name: contractName,
- networks: {
- [this._networkId]: contractNetworkData,
- },
- };
- }
-
- const artifactString = utils.stringifyWithFormatting(newArtifact);
- const currentArtifactPath = `${this._artifactsDir}/${contractName}.json`;
- await fsWrapper.writeFileAsync(currentArtifactPath, artifactString);
- logUtils.log(`${fileName} artifact saved!`);
- }
- /**
- * Gets contract dependendencies and keccak256 hash from source.
- * @param source Source code of contract.
- * @return Object with contract dependencies and keccak256 hash of source.
- */
- private _setContractSpecificSourceData(source: string, fileName: string): void {
- if (!_.isUndefined(this._contractSourceData[fileName])) {
- return;
- }
- const sourceHash = ethUtil.sha3(source);
- const solcVersionRange = parseSolidityVersionRange(source);
- const dependencies = parseDependencies(source);
- const sourceTreeHash = this._getSourceTreeHash(fileName, sourceHash, dependencies);
- this._contractSourceData[fileName] = {
- dependencies,
- solcVersionRange,
- sourceHash,
- sourceTreeHash,
- };
- }
- /**
- * Gets the source tree hash for a file and its dependencies.
- * @param fileName Name of contract file.
- */
- private _getSourceTreeHash(fileName: string, sourceHash: Buffer, dependencies: string[]): Buffer {
- if (dependencies.length === 0) {
- return sourceHash;
- } else {
- const dependencySourceTreeHashes = _.map(dependencies, dependency => {
- const source = this._contractSources[dependency];
- this._setContractSpecificSourceData(source, dependency);
- const sourceData = this._contractSourceData[dependency];
- return this._getSourceTreeHash(dependency, sourceData.sourceHash, sourceData.dependencies);
- });
- const sourceTreeHashesBuffer = Buffer.concat([sourceHash, ...dependencySourceTreeHashes]);
- const sourceTreeHash = ethUtil.sha3(sourceTreeHashesBuffer);
- return sourceTreeHash;
- }
- }
-}
diff --git a/packages/deployer/src/deployer.ts b/packages/deployer/src/deployer.ts
deleted file mode 100644
index 7ee45fed5..000000000
--- a/packages/deployer/src/deployer.ts
+++ /dev/null
@@ -1,219 +0,0 @@
-import { AbiType, ConstructorAbi, ContractAbi, TxData } from '@0xproject/types';
-import { logUtils } from '@0xproject/utils';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { Contract } from './utils/contract';
-import { encoder } from './utils/encoder';
-import { fsWrapper } from './utils/fs_wrapper';
-import {
- ContractArtifact,
- ContractNetworkData,
- DeployerOptions,
- ProviderDeployerOptions,
- UrlDeployerOptions,
-} from './utils/types';
-import { utils } from './utils/utils';
-
-// Gas added to gas estimate to make sure there is sufficient gas for deployment.
-const EXTRA_GAS = 200000;
-
-/**
- * The Deployer facilitates deploying Solidity smart contracts to the blockchain.
- * It can be used to build custom migration scripts.
- */
-export class Deployer {
- public web3Wrapper: Web3Wrapper;
- private _artifactsDir: string;
- private _networkId: number;
- private _defaults: Partial<TxData>;
-
- /**
- * Instantiate a new instance of the Deployer class.
- * @param opts Deployer options, including either an RPC url or Provider instance.
- * @returns A Deployer instance
- */
- constructor(opts: DeployerOptions) {
- this._artifactsDir = opts.artifactsDir;
- this._networkId = opts.networkId;
- this._defaults = opts.defaults;
- let web3Provider: Web3.Provider;
- if (_.isUndefined((opts as ProviderDeployerOptions).web3Provider)) {
- const jsonrpcUrl = (opts as UrlDeployerOptions).jsonrpcUrl;
- if (_.isUndefined(jsonrpcUrl)) {
- throw new Error(`Deployer options don't contain web3Provider nor jsonrpcUrl. Please pass one of them`);
- }
- web3Provider = new Web3.providers.HttpProvider(jsonrpcUrl);
- } else {
- web3Provider = (opts as ProviderDeployerOptions).web3Provider;
- }
- this.web3Wrapper = new Web3Wrapper(web3Provider, this._defaults);
- }
- /**
- * Loads a contract's corresponding artifacts and deploys it with the supplied constructor arguments.
- * @param contractName Name of the contract to deploy. Must match name of an artifact in supplied artifacts directory.
- * @param args Array of contract constructor arguments.
- * @return Deployed contract instance.
- */
- public async deployAsync(contractName: string, args: any[] = []): Promise<Web3.ContractInstance> {
- const contractArtifactIfExists: ContractArtifact = this._loadContractArtifactIfExists(contractName);
- const contractNetworkDataIfExists: ContractNetworkData = this._getContractNetworkDataFromArtifactIfExists(
- contractArtifactIfExists,
- );
- const data = contractNetworkDataIfExists.bytecode;
- const from = await this._getFromAddressAsync();
- const gas = await this._getAllowableGasEstimateAsync(data);
- const txData = {
- gasPrice: this._defaults.gasPrice,
- from,
- data,
- gas,
- };
- const abi = contractNetworkDataIfExists.abi;
- const constructorAbi = _.find(abi, { type: AbiType.Constructor }) as ConstructorAbi;
- const constructorArgs = _.isUndefined(constructorAbi) ? [] : constructorAbi.inputs;
- if (constructorArgs.length !== args.length) {
- const constructorSignature = `constructor(${_.map(constructorArgs, arg => `${arg.type} ${arg.name}`).join(
- ', ',
- )})`;
- throw new Error(
- `${contractName} expects ${constructorArgs.length} constructor params: ${constructorSignature}. Got ${
- args.length
- }`,
- );
- }
- const web3ContractInstance = await this._deployFromAbiAsync(abi, args, txData);
- logUtils.log(`${contractName}.sol successfully deployed at ${web3ContractInstance.address}`);
- const contractInstance = new Contract(web3ContractInstance, this._defaults);
- return contractInstance;
- }
- /**
- * Loads a contract's artifact, deploys it with supplied constructor arguments, and saves the updated data
- * back to the artifact file.
- * @param contractName Name of the contract to deploy. Must match name of an artifact in artifacts directory.
- * @param args Array of contract constructor arguments.
- * @return Deployed contract instance.
- */
- public async deployAndSaveAsync(contractName: string, args: any[] = []): Promise<Web3.ContractInstance> {
- const contractInstance = await this.deployAsync(contractName, args);
- await this._saveContractDataToArtifactAsync(contractName, contractInstance.address, args);
- return contractInstance;
- }
- /**
- * Deploys a contract given its ABI, arguments, and transaction data.
- * @param abi ABI of contract to deploy.
- * @param args Constructor arguments to use in deployment.
- * @param txData Tx options used for deployment.
- * @return Promise that resolves to a web3 contract instance.
- */
- private async _deployFromAbiAsync(abi: ContractAbi, args: any[], txData: TxData): Promise<any> {
- const contract: Web3.Contract<Web3.ContractInstance> = this.web3Wrapper.getContractFromAbi(abi);
- const deployPromise = new Promise((resolve, reject) => {
- /**
- * Contract is inferred as 'any' because TypeScript
- * is not able to read 'new' from the Contract interface
- */
- (contract as any).new(...args, txData, (err: Error, res: any): any => {
- if (err) {
- reject(err);
- } else if (_.isUndefined(res.address) && !_.isUndefined(res.transactionHash)) {
- logUtils.log(`transactionHash: ${res.transactionHash}`);
- } else {
- resolve(res);
- }
- });
- });
- return deployPromise;
- }
- /**
- * Updates a contract artifact's address and encoded constructor arguments.
- * @param contractName Name of contract. Must match an existing artifact.
- * @param contractAddress Contract address to save to artifact.
- * @param args Contract constructor arguments that will be encoded and saved to artifact.
- */
- private async _saveContractDataToArtifactAsync(
- contractName: string,
- contractAddress: string,
- args: any[],
- ): Promise<void> {
- const contractArtifactIfExists: ContractArtifact = this._loadContractArtifactIfExists(contractName);
- const contractNetworkDataIfExists: ContractNetworkData = this._getContractNetworkDataFromArtifactIfExists(
- contractArtifactIfExists,
- );
- const abi = contractNetworkDataIfExists.abi;
- const encodedConstructorArgs = encoder.encodeConstructorArgsFromAbi(args, abi);
- const newContractData = {
- ...contractNetworkDataIfExists,
- address: contractAddress,
- constructor_args: encodedConstructorArgs,
- };
- const newArtifact = {
- ...contractArtifactIfExists,
- networks: {
- ...contractArtifactIfExists.networks,
- [this._networkId]: newContractData,
- },
- };
- const artifactString = utils.stringifyWithFormatting(newArtifact);
- const artifactPath = `${this._artifactsDir}/${contractName}.json`;
- await fsWrapper.writeFileAsync(artifactPath, artifactString);
- }
- /**
- * Loads a contract artifact, if it exists.
- * @param contractName Name of the contract, without the extension.
- * @return The contract artifact.
- */
- private _loadContractArtifactIfExists(contractName: string): ContractArtifact {
- const artifactPath = `${this._artifactsDir}/${contractName}.json`;
- try {
- const contractArtifact: ContractArtifact = require(artifactPath);
- return contractArtifact;
- } catch (err) {
- throw new Error(`Artifact not found for contract: ${contractName}`);
- }
- }
- /**
- * Gets data for current networkId stored in artifact.
- * @param contractArtifact The contract artifact.
- * @return Network specific contract data.
- */
- private _getContractNetworkDataFromArtifactIfExists(contractArtifact: ContractArtifact): ContractNetworkData {
- const contractNetworkDataIfExists = contractArtifact.networks[this._networkId];
- if (_.isUndefined(contractNetworkDataIfExists)) {
- throw new Error(`Data not found in artifact for contract: ${contractArtifact.contract_name}`);
- }
- return contractNetworkDataIfExists;
- }
- /**
- * Gets the address to use for sending a transaction.
- * @return The default from address. If not specified, returns the first address accessible by web3.
- */
- private async _getFromAddressAsync(): Promise<string> {
- let from: string;
- if (_.isUndefined(this._defaults.from)) {
- const accounts = await this.web3Wrapper.getAvailableAddressesAsync();
- from = accounts[0];
- } else {
- from = this._defaults.from;
- }
- return from;
- }
- /**
- * Estimates the gas required for a transaction.
- * If gas would be over the block gas limit, the max allowable gas is returned instead.
- * @param data Bytecode to estimate gas for.
- * @return Gas estimate for transaction data.
- */
- private async _getAllowableGasEstimateAsync(data: string): Promise<number> {
- const block = await this.web3Wrapper.getBlockAsync('latest');
- let gas: number;
- try {
- const gasEstimate: number = await this.web3Wrapper.estimateGasAsync({ data });
- gas = Math.min(gasEstimate + EXTRA_GAS, block.gasLimit);
- } catch (err) {
- gas = block.gasLimit;
- }
- return gas;
- }
-}
diff --git a/packages/deployer/src/globals.d.ts b/packages/deployer/src/globals.d.ts
deleted file mode 100644
index 5b0d495d5..000000000
--- a/packages/deployer/src/globals.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-declare module 'dirty-chai';
-
-// tslint:disable:completed-docs
-declare module 'solc' {
- export interface ContractCompilationResult {
- srcmap: string;
- srcmapRuntime: string;
- bytecode: string;
- runtimeBytecode: string;
- interface: string;
- }
- export interface CompilationResult {
- errors: string[];
- contracts: {
- [contractIdentifier: string]: ContractCompilationResult;
- };
- sources: {
- [sourceName: string]: {
- AST: any;
- };
- };
- sourceList: string[];
- }
- export interface ImportContents {
- contents: string;
- }
- export interface InputSources {
- sources: {
- [fileName: string]: string;
- };
- }
- export interface SolcInstance {
- compile(
- sources: InputSources,
- optimizerEnabled: number,
- findImports: (importPath: string) => ImportContents,
- ): CompilationResult;
- }
- export function loadRemoteVersion(versionName: string, cb: (err: Error | null, res?: SolcInstance) => void): void;
- export function setupMethods(solcBin: any): SolcInstance;
-}
-
-declare module 'web3-eth-abi' {
- export function encodeParameters(typesArray: string[], parameters: any[]): string;
-}
-
-declare module '*.json' {
- const json: any;
- /* tslint:disable */
- export default json;
- /* tslint:enable */
-}
diff --git a/packages/deployer/src/index.ts b/packages/deployer/src/index.ts
deleted file mode 100644
index 186d644ef..000000000
--- a/packages/deployer/src/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export { Deployer } from './deployer';
-export { Compiler } from './compiler';
diff --git a/packages/deployer/src/solc/bin_paths.ts b/packages/deployer/src/solc/bin_paths.ts
deleted file mode 100644
index 53086113a..000000000
--- a/packages/deployer/src/solc/bin_paths.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export interface BinaryPaths {
- [key: string]: string;
-}
-
-export const binPaths: BinaryPaths = {
- '0.4.10': 'soljson-v0.4.10+commit.f0d539ae.js',
- '0.4.11': 'soljson-v0.4.11+commit.68ef5810.js',
- '0.4.12': 'soljson-v0.4.12+commit.194ff033.js',
- '0.4.13': 'soljson-v0.4.13+commit.fb4cb1a.js',
- '0.4.14': 'soljson-v0.4.14+commit.c2215d46.js',
- '0.4.15': 'soljson-v0.4.15+commit.bbb8e64f.js',
- '0.4.16': 'soljson-v0.4.16+commit.d7661dd9.js',
- '0.4.17': 'soljson-v0.4.17+commit.bdeb9e52.js',
- '0.4.18': 'soljson-v0.4.18+commit.9cf6e910.js',
- '0.4.19': 'soljson-v0.4.19+commit.c4cbbb05.js',
- '0.4.20': 'soljson-v0.4.20+commit.3155dd80.js',
- '0.4.21': 'soljson-v0.4.21+commit.dfe3193c.js',
-};
diff --git a/packages/deployer/src/utils/compiler.ts b/packages/deployer/src/utils/compiler.ts
deleted file mode 100644
index d5137d394..000000000
--- a/packages/deployer/src/utils/compiler.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import { logUtils } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as solc from 'solc';
-
-import { constants } from './constants';
-import { fsWrapper } from './fs_wrapper';
-import { ContractArtifact, ContractSources } from './types';
-
-/**
- * Gets contract data on network or returns if an artifact does not exist.
- * @param artifactsDir Path to the artifacts directory.
- * @param fileName Name of contract file.
- * @return Contract data on network or undefined.
- */
-export async function getContractArtifactIfExistsAsync(
- artifactsDir: string,
- fileName: string,
-): Promise<ContractArtifact | void> {
- let contractArtifact;
- const contractName = path.basename(fileName, constants.SOLIDITY_FILE_EXTENSION);
- const currentArtifactPath = `${artifactsDir}/${contractName}.json`;
- try {
- const opts = {
- encoding: 'utf8',
- };
- const contractArtifactString = await fsWrapper.readFileAsync(currentArtifactPath, opts);
- contractArtifact = JSON.parse(contractArtifactString);
- return contractArtifact;
- } catch (err) {
- logUtils.log(`Artifact for ${fileName} does not exist`);
- return undefined;
- }
-}
-
-/**
- * Creates a directory if it does not already exist.
- * @param artifactsDir Path to the directory.
- */
-export async function createDirIfDoesNotExistAsync(dirPath: string): Promise<void> {
- if (!fsWrapper.doesPathExistSync(dirPath)) {
- logUtils.log(`Creating directory at ${dirPath}...`);
- await fsWrapper.mkdirAsync(dirPath);
- }
-}
-
-/**
- * Searches Solidity source code for compiler version range.
- * @param source Source code of contract.
- * @return Solc compiler version range.
- */
-export function parseSolidityVersionRange(source: string): string {
- const SOLIDITY_VERSION_RANGE_REGEX = /pragma\s+solidity\s+(.*);/;
- const solcVersionRangeMatch = source.match(SOLIDITY_VERSION_RANGE_REGEX);
- if (_.isNull(solcVersionRangeMatch)) {
- throw new Error('Could not find Solidity version range in source');
- }
- const solcVersionRange = solcVersionRangeMatch[1];
- return solcVersionRange;
-}
-
-/**
- * Normalizes the path found in the error message.
- * Example: converts 'base/Token.sol:6:46: Warning: Unused local variable'
- * to 'Token.sol:6:46: Warning: Unused local variable'
- * This is used to prevent logging the same error multiple times.
- * @param errMsg An error message from the compiled output.
- * @return The error message with directories truncated from the contract path.
- */
-export function getNormalizedErrMsg(errMsg: string): string {
- const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/;
- const errPathMatch = errMsg.match(SOLIDITY_FILE_EXTENSION_REGEX);
- if (_.isNull(errPathMatch)) {
- throw new Error('Could not find a path in error message');
- }
- const errPath = errPathMatch[0];
- const baseContract = path.basename(errPath);
- const normalizedErrMsg = errMsg.replace(errPath, baseContract);
- return normalizedErrMsg;
-}
-
-/**
- * Parses the contract source code and extracts the dendencies
- * @param source Contract source code
- * @return List of dependendencies
- */
-export function parseDependencies(source: string): string[] {
- // TODO: Use a proper parser
- const IMPORT_REGEX = /(import\s)/;
- const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
- const dependencies: string[] = [];
- const lines = source.split('\n');
- _.forEach(lines, line => {
- if (!_.isNull(line.match(IMPORT_REGEX))) {
- const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
- if (!_.isNull(dependencyMatch)) {
- const dependencyPath = dependencyMatch[1];
- const basenName = path.basename(dependencyPath);
- dependencies.push(basenName);
- }
- }
- });
- return dependencies;
-}
-
-/**
- * Callback to resolve dependencies with `solc.compile`.
- * Throws error if contractSources not yet initialized.
- * @param contractSources Source codes of contracts.
- * @param importPath Path to an imported dependency.
- * @return Import contents object containing source code of dependency.
- */
-export function findImportIfExist(contractSources: ContractSources, importPath: string): solc.ImportContents {
- const fileName = path.basename(importPath);
- const source = contractSources[fileName];
- if (_.isUndefined(source)) {
- throw new Error(`Contract source not found for ${fileName}`);
- }
- const importContents: solc.ImportContents = {
- contents: source,
- };
- return importContents;
-}
diff --git a/packages/deployer/src/utils/constants.ts b/packages/deployer/src/utils/constants.ts
deleted file mode 100644
index 6f9dfb994..000000000
--- a/packages/deployer/src/utils/constants.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const constants = {
- SOLIDITY_FILE_EXTENSION: '.sol',
- BASE_COMPILER_URL: 'https://ethereum.github.io/solc-bin/bin/',
-};
diff --git a/packages/deployer/src/utils/contract.ts b/packages/deployer/src/utils/contract.ts
deleted file mode 100644
index 9b7baac11..000000000
--- a/packages/deployer/src/utils/contract.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-import { schemas, SchemaValidator } from '@0xproject/json-schemas';
-import { ContractAbi, EventAbi, FunctionAbi, MethodAbi, TxData } from '@0xproject/types';
-import { promisify } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { AbiType } from './types';
-
-export class Contract implements Web3.ContractInstance {
- public address: string;
- public abi: ContractAbi;
- private _contract: Web3.ContractInstance;
- private _defaults: Partial<TxData>;
- private _validator: SchemaValidator;
- // This class instance is going to be populated with functions and events depending on the ABI
- // and we don't know their types in advance
- [name: string]: any;
- constructor(web3ContractInstance: Web3.ContractInstance, defaults: Partial<TxData>) {
- this._contract = web3ContractInstance;
- this.address = web3ContractInstance.address;
- this.abi = web3ContractInstance.abi;
- this._defaults = defaults;
- this._populateEvents();
- this._populateFunctions();
- this._validator = new SchemaValidator();
- }
- private _populateFunctions(): void {
- const functionsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Function) as FunctionAbi[];
- _.forEach(functionsAbi, (functionAbi: MethodAbi) => {
- if (functionAbi.constant) {
- const cbStyleCallFunction = this._contract[functionAbi.name].call;
- this[functionAbi.name] = promisify(cbStyleCallFunction, this._contract);
- this[functionAbi.name].call = promisify(cbStyleCallFunction, this._contract);
- } else {
- const cbStyleFunction = this._contract[functionAbi.name];
- const cbStyleCallFunction = this._contract[functionAbi.name].call;
- const cbStyleEstimateGasFunction = this._contract[functionAbi.name].estimateGas;
- this[functionAbi.name] = this._promisifyWithDefaultParams(cbStyleFunction);
- this[functionAbi.name].estimateGasAsync = promisify(cbStyleEstimateGasFunction);
- this[functionAbi.name].sendTransactionAsync = this._promisifyWithDefaultParams(cbStyleFunction);
- this[functionAbi.name].call = promisify(cbStyleCallFunction, this._contract);
- }
- });
- }
- private _populateEvents(): void {
- const eventsAbi = _.filter(this.abi, abiPart => abiPart.type === AbiType.Event) as EventAbi[];
- _.forEach(eventsAbi, (eventAbi: EventAbi) => {
- this[eventAbi.name] = this._contract[eventAbi.name];
- });
- }
- private _promisifyWithDefaultParams(fn: (...args: any[]) => void): (...args: any[]) => Promise<any> {
- const promisifiedWithDefaultParams = async (...args: any[]) => {
- const promise = new Promise((resolve, reject) => {
- const lastArg = args[args.length - 1];
- let txData: Partial<TxData> = {};
- if (this._isTxData(lastArg)) {
- txData = args.pop();
- }
- txData = {
- ...this._defaults,
- ...txData,
- };
- const callback = (err: Error, data: any) => {
- if (_.isNull(err)) {
- resolve(data);
- } else {
- reject(err);
- }
- };
- args.push(txData);
- args.push(callback);
- fn.apply(this._contract, args);
- });
- return promise;
- };
- return promisifiedWithDefaultParams;
- }
- private _isTxData(lastArg: any): boolean {
- const isValid = this._validator.isValid(lastArg, schemas.txDataSchema);
- return isValid;
- }
-}
diff --git a/packages/deployer/src/utils/encoder.ts b/packages/deployer/src/utils/encoder.ts
deleted file mode 100644
index 4f62662e1..000000000
--- a/packages/deployer/src/utils/encoder.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { AbiDefinition, ContractAbi, DataItem } from '@0xproject/types';
-import * as _ from 'lodash';
-import * as web3Abi from 'web3-eth-abi';
-
-import { AbiType } from './types';
-
-export const encoder = {
- encodeConstructorArgsFromAbi(args: any[], abi: ContractAbi): string {
- const constructorTypes: string[] = [];
- _.each(abi, (element: AbiDefinition) => {
- if (element.type === AbiType.Constructor) {
- _.each(element.inputs, (input: DataItem) => {
- constructorTypes.push(input.type);
- });
- }
- });
- const encodedParameters = web3Abi.encodeParameters(constructorTypes, args);
- return encodedParameters;
- },
-};
diff --git a/packages/deployer/src/utils/error_reporter.ts b/packages/deployer/src/utils/error_reporter.ts
deleted file mode 100644
index 4e73307f0..000000000
--- a/packages/deployer/src/utils/error_reporter.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import { logUtils } from '@0xproject/utils';
-
-/**
- * Makes an async function no-throw printing errors to the console
- * @param asyncFn async function to wrap
- * @return Wrapped version of the passed function
- */
-export function consoleReporter<T>(asyncFn: (arg: T) => Promise<void>): (arg: T) => Promise<void> {
- const noThrowFnAsync = async (arg: T) => {
- try {
- const result = await asyncFn(arg);
- return result;
- } catch (err) {
- logUtils.log(`${err}`);
- }
- };
- return noThrowFnAsync;
-}
diff --git a/packages/deployer/src/utils/fs_wrapper.ts b/packages/deployer/src/utils/fs_wrapper.ts
deleted file mode 100644
index e02c83f27..000000000
--- a/packages/deployer/src/utils/fs_wrapper.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { promisify } from '@0xproject/utils';
-import * as fs from 'fs';
-
-export const fsWrapper = {
- readdirAsync: promisify<string[]>(fs.readdir),
- readFileAsync: promisify<string>(fs.readFile),
- writeFileAsync: promisify<undefined>(fs.writeFile),
- mkdirAsync: promisify<undefined>(fs.mkdir),
- doesPathExistSync: fs.existsSync,
- rmdirSync: fs.rmdirSync,
- removeFileAsync: promisify<undefined>(fs.unlink),
-};
diff --git a/packages/deployer/src/utils/types.ts b/packages/deployer/src/utils/types.ts
deleted file mode 100644
index 7cb3958cb..000000000
--- a/packages/deployer/src/utils/types.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-import { ContractAbi, TxData } from '@0xproject/types';
-import * as Web3 from 'web3';
-import * as yargs from 'yargs';
-
-export enum AbiType {
- Function = 'function',
- Constructor = 'constructor',
- Event = 'event',
- Fallback = 'fallback',
-}
-
-export interface ContractArtifact {
- contract_name: string;
- networks: ContractNetworks;
-}
-
-export interface ContractNetworks {
- [key: number]: ContractNetworkData;
-}
-
-export interface ContractNetworkData {
- solc_version: string;
- optimizer_enabled: boolean;
- keccak256: string;
- source_tree_hash: string;
- abi: ContractAbi;
- bytecode: string;
- runtime_bytecode: string;
- address?: string;
- constructor_args?: string;
- updated_at: number;
- source_map: string;
- source_map_runtime: string;
- sources: string[];
-}
-
-export interface SolcErrors {
- [key: string]: boolean;
-}
-
-export interface CliOptions extends yargs.Arguments {
- artifactsDir: string;
- contractsDir: string;
- jsonrpcUrl: string;
- networkId: number;
- shouldOptimize: boolean;
- gasPrice: string;
- account?: string;
- contract?: string;
- args?: string;
-}
-
-export interface CompilerOptions {
- contractsDir: string;
- networkId: number;
- optimizerEnabled: boolean;
- artifactsDir: string;
- specifiedContracts: Set<string>;
-}
-
-export interface BaseDeployerOptions {
- artifactsDir: string;
- networkId: number;
- defaults: Partial<TxData>;
-}
-
-export interface ProviderDeployerOptions extends BaseDeployerOptions {
- web3Provider: Web3.Provider;
-}
-
-export interface UrlDeployerOptions extends BaseDeployerOptions {
- jsonrpcUrl: string;
-}
-
-export type DeployerOptions = UrlDeployerOptions | ProviderDeployerOptions;
-
-export interface ContractSources {
- [key: string]: string;
-}
-
-export interface ContractSourceData {
- [key: string]: ContractSpecificSourceData;
-}
-
-export interface ContractSpecificSourceData {
- dependencies: string[];
- solcVersionRange: string;
- sourceHash: Buffer;
- sourceTreeHash: Buffer;
-}
-
-export interface Token {
- address?: string;
- name: string;
- symbol: string;
- decimals: number;
- ipfsHash: string;
- swarmHash: string;
-}
-
-export type DoneCallback = (err?: Error) => void;
diff --git a/packages/deployer/src/utils/utils.ts b/packages/deployer/src/utils/utils.ts
deleted file mode 100644
index 9b1e59f9d..000000000
--- a/packages/deployer/src/utils/utils.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-export const utils = {
- stringifyWithFormatting(obj: any): string {
- const jsonReplacer: null = null;
- const numberOfJsonSpaces = 4;
- const stringifiedObj = JSON.stringify(obj, jsonReplacer, numberOfJsonSpaces);
- return stringifiedObj;
- },
-};
diff --git a/packages/deployer/test/compiler_test.ts b/packages/deployer/test/compiler_test.ts
deleted file mode 100644
index b03ae7935..000000000
--- a/packages/deployer/test/compiler_test.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as chai from 'chai';
-import 'mocha';
-
-import { Compiler } from '../src/compiler';
-import { fsWrapper } from '../src/utils/fs_wrapper';
-import { CompilerOptions, ContractArtifact, ContractNetworkData, DoneCallback } from '../src/utils/types';
-
-import { exchange_binary } from './fixtures/exchange_bin';
-import { constants } from './util/constants';
-
-const expect = chai.expect;
-
-describe('#Compiler', function() {
- this.timeout(constants.timeoutMs);
- const artifactsDir = `${__dirname}/fixtures/artifacts`;
- const contractsDir = `${__dirname}/fixtures/contracts`;
- const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
- const compilerOpts: CompilerOptions = {
- artifactsDir,
- contractsDir,
- networkId: constants.networkId,
- optimizerEnabled: constants.optimizerEnabled,
- specifiedContracts: new Set(constants.specifiedContracts),
- };
- const compiler = new Compiler(compilerOpts);
- beforeEach((done: DoneCallback) => {
- (async () => {
- if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
- await fsWrapper.removeFileAsync(exchangeArtifactPath);
- }
- await compiler.compileAsync();
- done();
- })().catch(done);
- });
- it('should create an Exchange artifact with the correct unlinked binary', async () => {
- const opts = {
- encoding: 'utf8',
- };
- const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
- const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
- const exchangeContractData: ContractNetworkData = exchangeArtifact.networks[constants.networkId];
- // The last 43 bytes of the binaries are metadata which may not be equivalent
- const unlinkedBinaryWithoutMetadata = exchangeContractData.bytecode.slice(0, -86);
- const exchangeBinaryWithoutMetadata = exchange_binary.slice(0, -86);
- expect(unlinkedBinaryWithoutMetadata).to.equal(exchangeBinaryWithoutMetadata);
- });
-});
diff --git a/packages/deployer/test/compiler_utils_test.ts b/packages/deployer/test/compiler_utils_test.ts
deleted file mode 100644
index 246304858..000000000
--- a/packages/deployer/test/compiler_utils_test.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-import * as chai from 'chai';
-import * as dirtyChai from 'dirty-chai';
-import 'mocha';
-
-import {
- createDirIfDoesNotExistAsync,
- getNormalizedErrMsg,
- parseDependencies,
- parseSolidityVersionRange,
-} from '../src/utils/compiler';
-import { fsWrapper } from '../src/utils/fs_wrapper';
-
-chai.use(dirtyChai);
-const expect = chai.expect;
-
-describe('Compiler utils', () => {
- describe('#getNormalizedErrorMessage', () => {
- it('normalizes the error message', () => {
- const errMsg = 'base/Token.sol:6:46: Warning: Unused local variable';
- const normalizedErrMsg = getNormalizedErrMsg(errMsg);
- expect(normalizedErrMsg).to.be.equal('Token.sol:6:46: Warning: Unused local variable');
- });
- });
- describe('#createDirIfDoesNotExistAsync', () => {
- it('creates artifacts dir', async () => {
- const artifactsDir = `${__dirname}/artifacts`;
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
- await createDirIfDoesNotExistAsync(artifactsDir);
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.true();
- fsWrapper.rmdirSync(artifactsDir);
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
- });
- });
- describe('#parseSolidityVersionRange', () => {
- it('correctly parses the version range', () => {
- expect(parseSolidityVersionRange('pragma solidity ^0.0.1;')).to.be.equal('^0.0.1');
- expect(parseSolidityVersionRange('\npragma solidity 0.0.1;')).to.be.equal('0.0.1');
- expect(parseSolidityVersionRange('pragma solidity <=1.0.1;')).to.be.equal('<=1.0.1');
- expect(parseSolidityVersionRange('pragma solidity ~1.0.1;')).to.be.equal('~1.0.1');
- });
- // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
- it.skip('correctly parses the version range with comments', () => {
- expect(parseSolidityVersionRange('// pragma solidity ~1.0.1;\npragma solidity ~1.0.2;')).to.be.equal(
- '~1.0.2',
- );
- });
- });
- describe('#parseDependencies', () => {
- it('correctly parses Exchange dependencies', async () => {
- const exchangeSource = await fsWrapper.readFileAsync(`${__dirname}/fixtures/contracts/Exchange.sol`, {
- encoding: 'utf8',
- });
- expect(parseDependencies(exchangeSource)).to.be.deep.equal([
- 'TokenTransferProxy.sol',
- 'Token.sol',
- 'SafeMath.sol',
- ]);
- });
- it('correctly parses TokenTransferProxy dependencies', async () => {
- const exchangeSource = await fsWrapper.readFileAsync(
- `${__dirname}/fixtures/contracts/TokenTransferProxy.sol`,
- {
- encoding: 'utf8',
- },
- );
- expect(parseDependencies(exchangeSource)).to.be.deep.equal(['Token.sol', 'Ownable.sol']);
- });
- // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
- it.skip('correctly parses commented out dependencies', async () => {
- const contractWithCommentedOutDependencies = `// import "./TokenTransferProxy.sol";`;
- expect(parseDependencies(contractWithCommentedOutDependencies)).to.be.deep.equal([]);
- });
- });
-});
diff --git a/packages/deployer/test/deployer_test.ts b/packages/deployer/test/deployer_test.ts
deleted file mode 100644
index 9c34d74aa..000000000
--- a/packages/deployer/test/deployer_test.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import * as chai from 'chai';
-import 'mocha';
-
-import { Compiler } from '../src/compiler';
-import { Deployer } from '../src/deployer';
-import { fsWrapper } from '../src/utils/fs_wrapper';
-import { CompilerOptions, ContractArtifact, ContractNetworkData, DoneCallback } from '../src/utils/types';
-
-import { constructor_args, exchange_binary } from './fixtures/exchange_bin';
-import { constants } from './util/constants';
-
-const expect = chai.expect;
-
-describe('#Deployer', () => {
- const artifactsDir = `${__dirname}/fixtures/artifacts`;
- const contractsDir = `${__dirname}/fixtures/contracts`;
- const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
- const compilerOpts: CompilerOptions = {
- artifactsDir,
- contractsDir,
- networkId: constants.networkId,
- optimizerEnabled: constants.optimizerEnabled,
- specifiedContracts: new Set(constants.specifiedContracts),
- };
- const compiler = new Compiler(compilerOpts);
- const deployerOpts = {
- artifactsDir,
- networkId: constants.networkId,
- jsonrpcUrl: constants.jsonrpcUrl,
- defaults: {
- gasPrice: constants.gasPrice,
- },
- };
- const deployer = new Deployer(deployerOpts);
- beforeEach(function(done: DoneCallback) {
- this.timeout(constants.timeoutMs);
- (async () => {
- if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
- await fsWrapper.removeFileAsync(exchangeArtifactPath);
- }
- await compiler.compileAsync();
- done();
- })().catch(done);
- });
- describe('#deployAsync', () => {
- it('should deploy the Exchange contract without updating the Exchange artifact', async () => {
- const exchangeConstructorArgs = [constants.zrxTokenAddress, constants.tokenTransferProxyAddress];
- const exchangeContractInstance = await deployer.deployAsync('Exchange', exchangeConstructorArgs);
- const opts = {
- encoding: 'utf8',
- };
- const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
- const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
- const exchangeContractData: ContractNetworkData = exchangeArtifact.networks[constants.networkId];
- const exchangeAddress = exchangeContractInstance.address;
- expect(exchangeAddress).to.not.equal(undefined);
- expect(exchangeContractData.address).to.equal(undefined);
- expect(exchangeContractData.constructor_args).to.equal(undefined);
- });
- });
- describe('#deployAndSaveAsync', () => {
- it('should save the correct contract address and constructor arguments to the Exchange artifact', async () => {
- const exchangeConstructorArgs = [constants.zrxTokenAddress, constants.tokenTransferProxyAddress];
- const exchangeContractInstance = await deployer.deployAndSaveAsync('Exchange', exchangeConstructorArgs);
- const opts = {
- encoding: 'utf8',
- };
- const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
- const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
- const exchangeContractData: ContractNetworkData = exchangeArtifact.networks[constants.networkId];
- const exchangeAddress = exchangeContractInstance.address;
- expect(exchangeAddress).to.be.equal(exchangeContractData.address);
- expect(constructor_args).to.be.equal(exchangeContractData.constructor_args);
- });
- });
-});
diff --git a/packages/deployer/test/fixtures/contracts/Exchange.sol b/packages/deployer/test/fixtures/contracts/Exchange.sol
deleted file mode 100644
index 1b6819700..000000000
--- a/packages/deployer/test/fixtures/contracts/Exchange.sol
+++ /dev/null
@@ -1,602 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity 0.4.14;
-
-import "./TokenTransferProxy.sol";
-import "./base/Token.sol";
-import "./base/SafeMath.sol";
-
-/// @title Exchange - Facilitates exchange of ERC20 tokens.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract Exchange is SafeMath {
-
- // Error Codes
- enum Errors {
- ORDER_EXPIRED, // Order has already expired
- ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
- ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
- INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
- }
-
- string constant public VERSION = "1.0.0";
- uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas
-
- address public ZRX_TOKEN_CONTRACT;
- address public TOKEN_TRANSFER_PROXY_CONTRACT;
-
- // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
- mapping (bytes32 => uint) public filled;
- mapping (bytes32 => uint) public cancelled;
-
- event LogFill(
- address indexed maker,
- address taker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint filledMakerTokenAmount,
- uint filledTakerTokenAmount,
- uint paidMakerFee,
- uint paidTakerFee,
- bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
- bytes32 orderHash
- );
-
- event LogCancel(
- address indexed maker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint cancelledMakerTokenAmount,
- uint cancelledTakerTokenAmount,
- bytes32 indexed tokens,
- bytes32 orderHash
- );
-
- event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
-
- struct Order {
- address maker;
- address taker;
- address makerToken;
- address takerToken;
- address feeRecipient;
- uint makerTokenAmount;
- uint takerTokenAmount;
- uint makerFee;
- uint takerFee;
- uint expirationTimestampInSec;
- bytes32 orderHash;
- }
-
- function Exchange(address _zrxToken, address _tokenTransferProxy) {
- ZRX_TOKEN_CONTRACT = _zrxToken;
- TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
- }
-
- /*
- * Core exchange functions
- */
-
- /// @dev Fills the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Total amount of takerToken filled in trade.
- function fillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- returns (uint filledTakerTokenAmount)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.taker == address(0) || order.taker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);
- require(isValidSignature(
- order.maker,
- order.orderHash,
- v,
- r,
- s
- ));
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
- if (filledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
- LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
- return 0;
- }
-
- if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
- LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
- return 0;
- }
-
- uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
- uint paidMakerFee;
- uint paidTakerFee;
- filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
- require(transferViaTokenTransferProxy(
- order.makerToken,
- order.maker,
- msg.sender,
- filledMakerTokenAmount
- ));
- require(transferViaTokenTransferProxy(
- order.takerToken,
- msg.sender,
- order.maker,
- filledTakerTokenAmount
- ));
- if (order.feeRecipient != address(0)) {
- if (order.makerFee > 0) {
- paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- order.maker,
- order.feeRecipient,
- paidMakerFee
- ));
- }
- if (order.takerFee > 0) {
- paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- msg.sender,
- order.feeRecipient,
- paidTakerFee
- ));
- }
- }
-
- LogFill(
- order.maker,
- msg.sender,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- filledMakerTokenAmount,
- filledTakerTokenAmount,
- paidMakerFee,
- paidTakerFee,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return filledTakerTokenAmount;
- }
-
- /// @dev Cancels the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
- /// @return Amount of takerToken cancelled.
- function cancelOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint cancelTakerTokenAmount)
- public
- returns (uint)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.maker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
- if (cancelledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);
-
- LogCancel(
- order.maker,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
- cancelledTakerTokenAmount,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return cancelledTakerTokenAmount;
- }
-
- /*
- * Wrapper functions
- */
-
- /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- function fillOrKillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- {
- require(fillOrder(
- orderAddresses,
- orderValues,
- fillTakerTokenAmount,
- false,
- v,
- r,
- s
- ) == fillTakerTokenAmount);
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrKillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrKillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- /// @return Total amount of fillTakerTokenAmount filled in orders.
- function fillOrdersUpTo(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- returns (uint)
- {
- uint filledTakerTokenAmount = 0;
- for (uint i = 0; i < orderAddresses.length; i++) {
- require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
- filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
- orderAddresses[i],
- orderValues[i],
- safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- ));
- if (filledTakerTokenAmount == fillTakerTokenAmount) break;
- }
- return filledTakerTokenAmount;
- }
-
- /// @dev Synchronously cancels multiple orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
- function batchCancelOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] cancelTakerTokenAmounts)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- cancelOrder(
- orderAddresses[i],
- orderValues[i],
- cancelTakerTokenAmounts[i]
- );
- }
- }
-
- /*
- * Constant public functions
- */
-
- /// @dev Calculates Keccak-256 hash of order with specified parameters.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @return Keccak-256 hash of order.
- function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
- public
- constant
- returns (bytes32)
- {
- return keccak256(
- address(this),
- orderAddresses[0], // maker
- orderAddresses[1], // taker
- orderAddresses[2], // makerToken
- orderAddresses[3], // takerToken
- orderAddresses[4], // feeRecipient
- orderValues[0], // makerTokenAmount
- orderValues[1], // takerTokenAmount
- orderValues[2], // makerFee
- orderValues[3], // takerFee
- orderValues[4], // expirationTimestampInSec
- orderValues[5] // salt
- );
- }
-
- /// @dev Verifies that an order signature is valid.
- /// @param signer address of signer.
- /// @param hash Signed Keccak-256 hash.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Validity of order signature.
- function isValidSignature(
- address signer,
- bytes32 hash,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- constant
- returns (bool)
- {
- return signer == ecrecover(
- keccak256("\x19Ethereum Signed Message:\n32", hash),
- v,
- r,
- s
- );
- }
-
- /// @dev Checks if rounding error > 0.1%.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to multiply with numerator/denominator.
- /// @return Rounding error is present.
- function isRoundingError(uint numerator, uint denominator, uint target)
- public
- constant
- returns (bool)
- {
- uint remainder = mulmod(target, numerator, denominator);
- if (remainder == 0) return false; // No rounding error.
-
- uint errPercentageTimes1000000 = safeDiv(
- safeMul(remainder, 1000000),
- safeMul(numerator, target)
- );
- return errPercentageTimes1000000 > 1000;
- }
-
- /// @dev Calculates partial value given a numerator and denominator.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to calculate partial of.
- /// @return Partial value of target.
- function getPartialAmount(uint numerator, uint denominator, uint target)
- public
- constant
- returns (uint)
- {
- return safeDiv(safeMul(numerator, target), denominator);
- }
-
- /// @dev Calculates the sum of values already filled and cancelled for a given order.
- /// @param orderHash The Keccak-256 hash of the given order.
- /// @return Sum of values already filled and cancelled.
- function getUnavailableTakerTokenAmount(bytes32 orderHash)
- public
- constant
- returns (uint)
- {
- return safeAdd(filled[orderHash], cancelled[orderHash]);
- }
-
-
- /*
- * Internal functions
- */
-
- /// @dev Transfers a token using TokenTransferProxy transferFrom function.
- /// @param token Address of token to transferFrom.
- /// @param from Address transfering token.
- /// @param to Address receiving token.
- /// @param value Amount of token to transfer.
- /// @return Success of token transfer.
- function transferViaTokenTransferProxy(
- address token,
- address from,
- address to,
- uint value)
- internal
- returns (bool)
- {
- return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
- }
-
- /// @dev Checks if any order transfers will fail.
- /// @param order Order struct of params that will be checked.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @return Predicted result of transfers.
- function isTransferable(Order order, uint fillTakerTokenAmount)
- internal
- constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
- returns (bool)
- {
- address taker = msg.sender;
- uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
-
- if (order.feeRecipient != address(0)) {
- bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
- bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
- uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
- uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;
-
- if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- ) return false;
-
- if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
- ) return false;
- if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
- ) return false;
- } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getBalance(order.takerToken, taker) < fillTakerTokenAmount
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
- ) return false;
-
- return true;
- }
-
- /// @dev Get token balance of an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Token balance of owner.
- function getBalance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
- }
-
- /// @dev Get allowance of token given to TokenTransferProxy by an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Allowance of token given to TokenTransferProxy by owner.
- function getAllowance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
- }
-}
diff --git a/packages/deployer/test/fixtures/contracts/TokenTransferProxy.sol b/packages/deployer/test/fixtures/contracts/TokenTransferProxy.sol
deleted file mode 100644
index 90c8e7d66..000000000
--- a/packages/deployer/test/fixtures/contracts/TokenTransferProxy.sol
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-
- Copyright 2017 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity 0.4.14;
-
-import "./base/Token.sol";
-import "./base/Ownable.sol";
-
-/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract TokenTransferProxy is Ownable {
-
- /// @dev Only authorized addresses can invoke functions with this modifier.
- modifier onlyAuthorized {
- require(authorized[msg.sender]);
- _;
- }
-
- modifier targetAuthorized(address target) {
- require(authorized[target]);
- _;
- }
-
- modifier targetNotAuthorized(address target) {
- require(!authorized[target]);
- _;
- }
-
- mapping (address => bool) public authorized;
- address[] public authorities;
-
- event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
- event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
-
- /*
- * Public functions
- */
-
- /// @dev Authorizes an address.
- /// @param target Address to authorize.
- function addAuthorizedAddress(address target)
- public
- onlyOwner
- targetNotAuthorized(target)
- {
- authorized[target] = true;
- authorities.push(target);
- LogAuthorizedAddressAdded(target, msg.sender);
- }
-
- /// @dev Removes authorizion of an address.
- /// @param target Address to remove authorization from.
- function removeAuthorizedAddress(address target)
- public
- onlyOwner
- targetAuthorized(target)
- {
- delete authorized[target];
- for (uint i = 0; i < authorities.length; i++) {
- if (authorities[i] == target) {
- authorities[i] = authorities[authorities.length - 1];
- authorities.length -= 1;
- break;
- }
- }
- LogAuthorizedAddressRemoved(target, msg.sender);
- }
-
- /// @dev Calls into ERC20 Token contract, invoking transferFrom.
- /// @param token Address of token to transfer.
- /// @param from Address to transfer token from.
- /// @param to Address to transfer token to.
- /// @param value Amount of token to transfer.
- /// @return Success of transfer.
- function transferFrom(
- address token,
- address from,
- address to,
- uint value)
- public
- onlyAuthorized
- returns (bool)
- {
- return Token(token).transferFrom(from, to, value);
- }
-
- /*
- * Public constant functions
- */
-
- /// @dev Gets all authorized addresses.
- /// @return Array of authorized addresses.
- function getAuthorizedAddresses()
- public
- constant
- returns (address[])
- {
- return authorities;
- }
-}
diff --git a/packages/deployer/test/fixtures/contracts/base/Ownable.sol b/packages/deployer/test/fixtures/contracts/base/Ownable.sol
deleted file mode 100644
index 2a74c3717..000000000
--- a/packages/deployer/test/fixtures/contracts/base/Ownable.sol
+++ /dev/null
@@ -1,27 +0,0 @@
-pragma solidity 0.4.14;
-
-/*
- * Ownable
- *
- * Base contract with an owner.
- * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.
- */
-
-contract Ownable {
- address public owner;
-
- function Ownable() {
- owner = msg.sender;
- }
-
- modifier onlyOwner() {
- require(msg.sender == owner);
- _;
- }
-
- function transferOwnership(address newOwner) onlyOwner {
- if (newOwner != address(0)) {
- owner = newOwner;
- }
- }
-}
diff --git a/packages/deployer/test/fixtures/contracts/base/SafeMath.sol b/packages/deployer/test/fixtures/contracts/base/SafeMath.sol
deleted file mode 100644
index 7414684a8..000000000
--- a/packages/deployer/test/fixtures/contracts/base/SafeMath.sol
+++ /dev/null
@@ -1,41 +0,0 @@
-pragma solidity 0.4.14;
-
-contract SafeMath {
- function safeMul(uint a, uint b) internal constant returns (uint256) {
- uint c = a * b;
- assert(a == 0 || c / a == b);
- return c;
- }
-
- function safeDiv(uint a, uint b) internal constant returns (uint256) {
- uint c = a / b;
- return c;
- }
-
- function safeSub(uint a, uint b) internal constant returns (uint256) {
- assert(b <= a);
- return a - b;
- }
-
- function safeAdd(uint a, uint b) internal constant returns (uint256) {
- uint c = a + b;
- assert(c >= a);
- return c;
- }
-
- function max64(uint64 a, uint64 b) internal constant returns (uint64) {
- return a >= b ? a : b;
- }
-
- function min64(uint64 a, uint64 b) internal constant returns (uint64) {
- return a < b ? a : b;
- }
-
- function max256(uint256 a, uint256 b) internal constant returns (uint256) {
- return a >= b ? a : b;
- }
-
- function min256(uint256 a, uint256 b) internal constant returns (uint256) {
- return a < b ? a : b;
- }
-}
diff --git a/packages/deployer/test/fixtures/contracts/base/Token.sol b/packages/deployer/test/fixtures/contracts/base/Token.sol
deleted file mode 100644
index c03f8c567..000000000
--- a/packages/deployer/test/fixtures/contracts/base/Token.sol
+++ /dev/null
@@ -1,38 +0,0 @@
-pragma solidity 0.4.14;
-
-contract Token {
-
- /// @return total amount of tokens
- function totalSupply() constant returns (uint supply) {}
-
- /// @param _owner The address from which the balance will be retrieved
- /// @return The balance
- function balanceOf(address _owner) constant returns (uint balance) {}
-
- /// @notice send `_value` token to `_to` from `msg.sender`
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transfer(address _to, uint _value) returns (bool success) {}
-
- /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
- /// @param _from The address of the sender
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transferFrom(address _from, address _to, uint _value) returns (bool success) {}
-
- /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @param _value The amount of wei to be approved for transfer
- /// @return Whether the approval was successful or not
- function approve(address _spender, uint _value) returns (bool success) {}
-
- /// @param _owner The address of the account owning tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @return Amount of remaining tokens allowed to spent
- function allowance(address _owner, address _spender) constant returns (uint remaining) {}
-
- event Transfer(address indexed _from, address indexed _to, uint _value);
- event Approval(address indexed _owner, address indexed _spender, uint _value);
-}
diff --git a/packages/deployer/test/fixtures/exchange_bin.ts b/packages/deployer/test/fixtures/exchange_bin.ts
deleted file mode 100644
index a6eae515e..000000000
--- a/packages/deployer/test/fixtures/exchange_bin.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const constructor_args =
- '0x000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4980000000000000000000000008da0d80f5007ef1e431dd2127178d224e32c2ef4';
-export const exchange_binary =
- '0x6060604052341561000f57600080fd5b604051604080612c4d833981016040528080519060200190919080519060200190919050505b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50505b612b84806100c96000396000f300606060405236156100fa576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806314df96ee146100ff578063288cdc911461014c5780632ac1262214610187578063363349be146101c2578063394c21e7146103bc5780633b30ba591461044b5780634f150787146104a0578063741bcc93146106b25780637e9abb50146107535780638163681e1461078e57806398024a8b14610812578063add1cbc51461085b578063b7b2c7d6146108b0578063baa0181d14610acd578063bc61394a14610c1f578063cfc4d0ec14610cdf578063f06bbf7514610d6d578063ffa1ad7414610d9e575b600080fd5b341561010a57600080fd5b6101326004808035906020019091908035906020019091908035906020019091905050610e2d565b604051808215151515815260200191505060405180910390f35b341561015757600080fd5b610171600480803560001916906020019091905050610e7c565b6040518082815260200191505060405180910390f35b341561019257600080fd5b6101ac600480803560001916906020019091905050610e94565b6040518082815260200191505060405180910390f35b34156101cd57600080fd5b6103a660048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561024857848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610203565b5050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156102c457848483905060c00201600680602002604051908101604052809291908260066020028082843782019150505050508152602001906001019061027f565b5050505050919080359060200190919080351515906020019091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050610eac565b6040518082815260200191505060405180910390f35b34156103c757600080fd5b6104356004808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908035906020019091905050611013565b6040518082815260200191505060405180910390f35b341561045657600080fd5b61045e6114fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156104ab57600080fd5b6106b060048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561052657848483905060a0020160058060200260405190810160405280929190826005602002808284378201915050505050815260200190600101906104e1565b5050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156105a257848483905060c00201600680602002604051908101604052809291908260066020028082843782019150505050508152602001906001019061055d565b50505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091905050611520565b005b34156106bd57600080fd5b6107516004808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091908060c00190600680602002604051908101604052809291908260066020028082843782019150505050509190803590602001909190803560ff1690602001909190803560001916906020019091908035600019169060200190919050506115df565b005b341561075e57600080fd5b610778600480803560001916906020019091905050611605565b6040518082815260200191505060405180910390f35b341561079957600080fd5b6107f8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080356000191690602001909190803560ff16906020019091908035600019169060200190919080356000191690602001909190505061164f565b604051808215151515815260200191505060405180910390f35b341561081d57600080fd5b6108456004808035906020019091908035906020019091908035906020019091905050611757565b6040518082815260200191505060405180910390f35b341561086657600080fd5b61086e611776565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156108bb57600080fd5b610acb60048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561093657848483905060a0020160058060200260405190810160405280929190826005602002808284378201915050505050815260200190600101906108f1565b5050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156109b257848483905060c00201600680602002604051908101604052809291908260066020028082843782019150505050508152602001906001019061096d565b50505050509190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035151590602001909190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061179c565b005b3415610ad857600080fd5b610c1d60048080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610b5357848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610b0e565b5050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610bcf57848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610b8a565b5050505050919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509190505061185e565b005b3415610c2a57600080fd5b610cc96004808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091908035906020019091908035151590602001909190803560ff1690602001909190803560001916906020019091908035600019169060200190919050506118d3565b6040518082815260200191505060405180910390f35b3415610cea57600080fd5b610d4f6004808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091908060c001906006806020026040519081016040528092919082600660200280828437820191505050505091905050612073565b60405180826000191660001916815260200191505060405180910390f35b3415610d7857600080fd5b610d8061231f565b604051808261ffff1661ffff16815260200191505060405180910390f35b3415610da957600080fd5b610db1612325565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610df25780820151818401525b602081019050610dd6565b50505050905090810190601f168015610e1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60008060008486850991506000821415610e4a5760009250610e73565b610e69610e5a83620f424061235e565b610e64888761235e565b612392565b90506103e8811192505b50509392505050565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b6000806000809150600090505b895181101561100257896000815181101515610ed157fe5b906020019060200201516003600581101515610ee957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168a82815181101515610f1257fe5b906020019060200201516003600581101515610f2a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16141515610f5157600080fd5b610fe582610fe08c84815181101515610f6657fe5b906020019060200201518c85815181101515610f7e57fe5b90602001906020020151610f928d886123ae565b8c8c88815181101515610fa157fe5b906020019060200201518c89815181101515610fb957fe5b906020019060200201518c8a815181101515610fd157fe5b906020019060200201516118d3565b6123c8565b915087821415610ff457611002565b5b8080600101915050610eb9565b8192505b5050979650505050505050565b600061101d612a8c565b6000806101606040519081016040528088600060058110151561103c57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600160058110151561106b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600260058110151561109a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860036005811015156110c957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860046005811015156110f857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200187600060068110151561112757fe5b6020020151815260200187600160068110151561114057fe5b6020020151815260200187600260068110151561115957fe5b6020020151815260200187600360068110151561117257fe5b6020020151815260200187600460068110151561118b57fe5b6020020151815260200161119f8989612073565b6000191681525092503373ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161415156111e657600080fd5b60008360a001511180156111fe575060008360c00151115b801561120a5750600085115b151561121557600080fd5b8261012001514210151561127257826101400151600019166000600381111561123a57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506114f1565b61128d8360c00151611288856101400151611605565b6123ae565b915061129985836123e7565b905060008114156112f35782610140015160001916600160038111156112bb57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506114f1565b61131d600360008561014001516000191660001916815260200190815260200160002054826123c8565b60036000856101400151600019166000191681526020019081526020016000208190555082604001518360600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916836080015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff167f67d66f160bc93d925d05dae1794c90d2d6d6688b29b84ff069398a9b0458713186604001518760600151611455878a60c001518b60a00151611757565b878a6101400151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182600019166000191681526020019550505050505060405180910390a48093505b5050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b86518110156115d5576115c7878281518110151561154057fe5b90602001906020020151878381518110151561155857fe5b90602001906020020151878481518110151561157057fe5b90602001906020020151878581518110151561158857fe5b9060200190602002015187868151811015156115a057fe5b9060200190602002015187878151811015156115b857fe5b906020019060200201516115df565b5b8080600101915050611526565b5b50505050505050565b836115f087878760008888886118d3565b1415156115fc57600080fd5b5b505050505050565b600061164760026000846000191660001916815260200190815260200160002054600360008560001916600019168152602001908152602001600020546123c8565b90505b919050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526000604051602001526040518085600019166000191681526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001945050505050602060405160208103908084039060008661646e5a03f1151561171457600080fd5b50506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161490505b95945050505050565b600061176c611766858461235e565b84612392565b90505b9392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b87518110156118535761184488828151811015156117bc57fe5b9060200190602002015188838151811015156117d457fe5b9060200190602002015188848151811015156117ec57fe5b9060200190602002015188888681518110151561180557fe5b90602001906020020151888781518110151561181d57fe5b90602001906020020151888881518110151561183557fe5b906020019060200201516118d3565b505b80806001019150506117a2565b5b5050505050505050565b60008090505b83518110156118cc576118bd848281518110151561187e57fe5b90602001906020020151848381518110151561189657fe5b9060200190602002015184848151811015156118ae57fe5b90602001906020020151611013565b505b8080600101915050611864565b5b50505050565b60006118dd612a8c565b600080600080610160604051908101604052808e60006005811015156118ff57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e600160058110151561192e57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e600260058110151561195d57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e600360058110151561198c57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e60046005811015156119bb57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018d60006006811015156119ea57fe5b602002015181526020018d6001600681101515611a0357fe5b602002015181526020018d6002600681101515611a1c57fe5b602002015181526020018d6003600681101515611a3557fe5b602002015181526020018d6004600681101515611a4e57fe5b60200201518152602001611a628f8f612073565b600019168152509450600073ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161480611ad957503373ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16145b1515611ae457600080fd5b60008560a00151118015611afc575060008560c00151115b8015611b08575060008b115b1515611b1357600080fd5b611b2985600001518661014001518b8b8b61164f565b1515611b3457600080fd5b84610120015142101515611b91578461014001516000191660006003811115611b5957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612063565b611bac8560c00151611ba7876101400151611605565b6123ae565b9350611bb88b856123e7565b95506000861415611c12578461014001516000191660016003811115611bda57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612063565b611c25868660c001518760a00151610e2d565b15611c79578461014001516000191660026003811115611c4157fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612063565b89158015611c8e5750611c8c8587612401565b155b15611ce15784610140015160001916600380811115611ca957fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612063565b611cf4868660c001518760a00151611757565b9250611d20600260008761014001516000191660001916815260200190815260200160002054876123c8565b600260008761014001516000191660001916815260200190815260200160002081905550611d58856040015186600001513386612751565b1515611d6357600080fd5b611d77856060015133876000015189612751565b1515611d8257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff16141515611e815760008560e001511115611e1f57611ddc868660c001518760e00151611757565b9150611e136000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151876080015185612751565b1515611e1e57600080fd5b5b60008561010001511115611e8057611e41868660c00151876101000151611757565b9050611e746000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633876080015184612751565b1515611e7f57600080fd5b5b5b84604001518560600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916856080015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182600019166000191681526020019850505050505050505060405180910390a48595505b5050505050979650505050505050565b60003083600060058110151561208557fe5b602002015184600160058110151561209957fe5b60200201518560026005811015156120ad57fe5b60200201518660036005811015156120c157fe5b60200201518760046005811015156120d557fe5b60200201518760006006811015156120e957fe5b60200201518860016006811015156120fd57fe5b602002015189600260068110151561211157fe5b60200201518a600360068110151561212557fe5b60200201518b600460068110151561213957fe5b60200201518c600560068110151561214d57fe5b6020020151604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018781526020018681526020018581526020018481526020018381526020018281526020019c50505050505050505050505050604051809103902090505b92915050565b61138781565b6040805190810160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808284029050600084148061237f575082848281151561237c57fe5b04145b151561238757fe5b8091505b5092915050565b60008082848115156123a057fe5b0490508091505b5092915050565b60008282111515156123bc57fe5b81830390505b92915050565b60008082840190508381101515156123dc57fe5b8091505b5092915050565b60008183106123f657816123f8565b825b90505b92915050565b60008060008060008060008060003397506124258a8c60c001518d60a00151611757565b9650600073ffffffffffffffffffffffffffffffffffffffff168b6080015173ffffffffffffffffffffffffffffffffffffffff161415156126d2576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6040015173ffffffffffffffffffffffffffffffffffffffff161495506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6060015173ffffffffffffffffffffffffffffffffffffffff161494506125208a8c60c001518d60e00151611757565b93506125368a8c60c001518d6101000151611757565b925085612543578361254e565b61254d87856123c8565b5b91508461255b5782612566565b6125658a846123c8565b5b9050816125986000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d600001516128ae565b10806125d15750816125cf6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60000151612972565b105b806126055750806126036000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a6128ae565b105b806126395750806126376000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612972565b105b156126475760009850612743565b851580156126805750866126638c604001518d600001516128ae565b108061267f57508661267d8c604001518d60000151612972565b105b5b1561268e5760009850612743565b841580156126bf5750896126a68c606001518a6128ae565b10806126be5750896126bc8c606001518a612972565b105b5b156126cd5760009850612743565b61273e565b866126e58c604001518d600001516128ae565b10806127015750866126ff8c604001518d60000151612972565b105b806127185750896127168c606001518a6128ae565b105b8061272f57508961272d8c606001518a612972565b105b1561273d5760009850612743565b5b600198505b505050505050505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561288857600080fd5b6102c65a03f1151561289957600080fd5b5050506040518051905090505b949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a0823161138761ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b151561295157600080fd5b87f1151561295e57600080fd5b505050506040518051905090505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61138761ffff1684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b1515612a6b57600080fd5b87f11515612a7857600080fd5b505050506040518051905090505b92915050565b61016060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815250905600a165627a7a72305820df5cabdc3a116e993e10bfb14823d18d9b798038d4c463a1703f9a584c456b7e0029';
diff --git a/packages/deployer/test/util/constants.ts b/packages/deployer/test/util/constants.ts
deleted file mode 100644
index 5d3aab47c..000000000
--- a/packages/deployer/test/util/constants.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { BigNumber } from '@0xproject/utils';
-
-export const constants = {
- networkId: 0,
- jsonrpcUrl: 'http://localhost:8545',
- optimizerEnabled: false,
- gasPrice: new BigNumber(20000000000),
- timeoutMs: 20000,
- zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
- tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4',
- specifiedContracts: '*',
-};
diff --git a/packages/deployer/tsconfig.json b/packages/deployer/tsconfig.json
deleted file mode 100644
index a4cbc37c5..000000000
--- a/packages/deployer/tsconfig.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "extends": "../../tsconfig",
- "compilerOptions": {
- "outDir": "lib",
- "strictFunctionTypes": false
- },
- "include": [
- "./src/**/*",
- "./test/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
-}
diff --git a/packages/dev-utils/CHANGELOG.json b/packages/dev-utils/CHANGELOG.json
index 42c7534d3..51ae117cf 100644
--- a/packages/dev-utils/CHANGELOG.json
+++ b/packages/dev-utils/CHANGELOG.json
@@ -1,13 +1,159 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.4.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.4.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.4.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.4.3",
+ "changes": [
+ {
+ "note": "Add optional parameter shouldUseFakeGasEstimate to Web3Config",
+ "pr": 622
+ },
+ {
+ "note": "Add SolidityProfiler to EnvVars",
+ "pr": 675
+ }
+ ],
+ "timestamp": 1527008544
+ },
+ {
+ "version": "0.4.2",
+ "changes": [
+ {
+ "note": "Pass SolCompilerArtifactAdapter to CoverageSubprovider",
+ "pr": 589
+ },
+ {
+ "note": "Move callbackErrorReporter over from 0x.js",
+ "pr": 579
+ }
+ ],
+ "timestamp": 1527008544
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.4.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.4.0",
+ "changes": [
+ {
+ "note": "Update web3 provider engine to 14.0.4",
+ "pr": 555
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.3.6",
+ "changes": [
+ {
+ "note": "Allow an rpcURL to be set in Web3Config (for testnet RPC endpoints)",
+ "pr": 524
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.3.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.3.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.3.3",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.3.1",
@@ -16,11 +162,10 @@
"note": "Reduce npm package size by adding an `.npmignore` file."
},
{
- "note": "Move `@0xproject/web3_wrapper` to dependencies from devDependencies."
+ "note": "Move `@0xproject/web3-wrapper` to dependencies from devDependencies."
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.3.0",
@@ -38,8 +183,7 @@
"pr": 426
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.2.0",
@@ -49,8 +193,7 @@
"pr": 392
}
],
- "timestamp": 1518706800,
- "isPublished": true
+ "timestamp": 1518706800
},
{
"version": "0.0.12",
@@ -60,8 +203,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.0.11",
@@ -71,7 +213,6 @@
"pr": 352
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
}
]
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index f99bbcbd5..1e244ee7d 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,33 +1,95 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.4 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.4.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.4.5 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.4.4 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.4.3 - _May 22, 2018_
+
+ * Add optional parameter shouldUseFakeGasEstimate to Web3Config (#622)
+ * Add SolidityProfiler to EnvVars (#675)
+
+## v0.4.2 - _May 22, 2018_
+
+ * Pass SolCompilerArtifactAdapter to CoverageSubprovider (#589)
+ * Move callbackErrorReporter over from 0x.js (#579)
+
+## v0.4.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.4.0 - _May 4, 2018_
+
+ * Update web3 provider engine to 14.0.4 (#555)
+
+## v0.3.6 - _April 18, 2018_
+
+ * Allow an rpcURL to be set in Web3Config (for testnet RPC endpoints) (#524)
+
+## v0.3.5 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.3.4 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.3.3 - _April 2, 2018_
* Dependencies updated
-## v0.3.1 - _March 18, 2018_
+## v0.3.1 - _March 17, 2018_
* Reduce npm package size by adding an `.npmignore` file.
- * Move `@0xproject/web3_wrapper` to dependencies from devDependencies.
+ * Move `@0xproject/web3-wrapper` to dependencies from devDependencies.
-## v0.3.0 - _March 18, 2018_
+## v0.3.0 - _March 17, 2018_
* Add coverage subprovider if SOLIDITY_COVERAGE env variable is true (#426)
* Refactor `BlockchainLifecycle` to work with in-process ganache (#426)
* Remove `RPC` class and move it's logic to `Web3Wrapper` (#426)
-## v0.2.0 - _February 16, 2018_
+## v0.2.0 - _February 15, 2018_
* Remove subproviders (#392)
-## v0.0.12 - _February 9, 2018_
+## v0.0.12 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.0.11 - _February 7, 2018_
+## v0.0.11 - _February 6, 2018_
* Updated `types-ethereumjs-util` dev dependency (#352)
diff --git a/packages/dev-utils/README.md b/packages/dev-utils/README.md
index d7e580d9f..1c3bd3a3f 100644
--- a/packages/dev-utils/README.md
+++ b/packages/dev-utils/README.md
@@ -26,3 +26,55 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
}
```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/dev-utils yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/dev-utils yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index e6dd95bc4..5aa6edcd8 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,19 +1,23 @@
{
"name": "@0xproject/dev-utils",
- "version": "0.3.3",
+ "version": "1.0.4",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x dev TS utils",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "test": "run-s clean build run_mocha",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"test:circleci": "yarn test:coverage",
- "run_mocha": "mocha lib/test/**/*_test.js --bail --exit",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
+ "lint": "tslint --project .",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"license": "Apache-2.0",
@@ -26,33 +30,28 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/dev-utils/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"chai": "^4.0.1",
"copyfiles": "^1.2.0",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "types-bn": "^0.0.1",
- "types-ethereumjs-util": "0xProject/types-ethereumjs-util",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/sol-cov": "^0.0.5",
- "@0xproject/subproviders": "^0.8.3",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "@0xproject/web3-wrapper": "^0.4.0",
- "ethereumjs-util": "^5.1.2",
- "lodash": "^4.17.4",
- "request-promise-native": "^1.0.5",
- "web3": "^0.20.0",
- "web3-provider-engine": "^13.0.1"
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "ethereum-types": "^1.0.4",
+ "lodash": "^4.17.5"
},
"publishConfig": {
"access": "public"
diff --git a/packages/dev-utils/src/blockchain_lifecycle.ts b/packages/dev-utils/src/blockchain_lifecycle.ts
index 3e35de861..a48cb0856 100644
--- a/packages/dev-utils/src/blockchain_lifecycle.ts
+++ b/packages/dev-utils/src/blockchain_lifecycle.ts
@@ -1,24 +1,98 @@
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import * as Web3 from 'web3';
+import { logUtils } from '@0xproject/utils';
+import { NodeType, Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as _ from 'lodash';
+
+// HACK(albrow): 🐉 We have to do this so that debug.setHead works correctly.
+// (Geth does not seem to like debug.setHead(0), so by sending some transactions
+// we increase the current block number beyond 0). Additionally, some tests seem
+// to break when there are fewer than 3 blocks in the chain. (We have no idea
+// why, but it was consistently reproducible).
+const MINIMUM_BLOCKS = 3;
export class BlockchainLifecycle {
- private _web3Wrapper: Web3Wrapper;
- private _snapshotIdsStack: number[];
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _snapshotIdsStack: number[];
+ private _addresses: string[] = [];
+ private _nodeType: NodeType | undefined;
constructor(web3Wrapper: Web3Wrapper) {
this._web3Wrapper = web3Wrapper;
this._snapshotIdsStack = [];
}
- // TODO: In order to run these tests on an actual node, we should check if we are running against
- // TestRPC, if so, use snapshots, otherwise re-deploy contracts before every test
public async startAsync(): Promise<void> {
- const snapshotId = await this._web3Wrapper.takeSnapshotAsync();
- this._snapshotIdsStack.push(snapshotId);
+ const nodeType = await this._getNodeTypeAsync();
+ switch (nodeType) {
+ case NodeType.Ganache:
+ const snapshotId = await this._web3Wrapper.takeSnapshotAsync();
+ this._snapshotIdsStack.push(snapshotId);
+ break;
+ case NodeType.Geth:
+ let blockNumber = await this._web3Wrapper.getBlockNumberAsync();
+ if (blockNumber < MINIMUM_BLOCKS) {
+ // If the minimum block number is not met, force Geth to
+ // mine some blocks by sending some dummy transactions.
+ await this._mineMinimumBlocksAsync();
+ blockNumber = await this._web3Wrapper.getBlockNumberAsync();
+ }
+ this._snapshotIdsStack.push(blockNumber);
+ // HACK(albrow) It's possible that we applied a time offset but
+ // the transaction we mined to put that time offset into the
+ // blockchain was reverted. As a workaround, we mine a new dummy
+ // block so that the latest block timestamp accounts for any
+ // possible time offsets.
+ await this._mineDummyBlockAsync();
+ break;
+ default:
+ throw new Error(`Unknown node type: ${nodeType}`);
+ }
}
public async revertAsync(): Promise<void> {
- const snapshotId = this._snapshotIdsStack.pop() as number;
- const didRevert = await this._web3Wrapper.revertSnapshotAsync(snapshotId);
- if (!didRevert) {
- throw new Error(`Snapshot with id #${snapshotId} failed to revert`);
+ const nodeType = await this._getNodeTypeAsync();
+ switch (nodeType) {
+ case NodeType.Ganache:
+ const snapshotId = this._snapshotIdsStack.pop() as number;
+ const didRevert = await this._web3Wrapper.revertSnapshotAsync(snapshotId);
+ if (!didRevert) {
+ throw new Error(`Snapshot with id #${snapshotId} failed to revert`);
+ }
+ break;
+ case NodeType.Geth:
+ const blockNumber = this._snapshotIdsStack.pop() as number;
+ await this._web3Wrapper.setHeadAsync(blockNumber);
+ break;
+ default:
+ throw new Error(`Unknown node type: ${nodeType}`);
+ }
+ }
+ private async _mineMinimumBlocksAsync(): Promise<void> {
+ logUtils.warn('WARNING: minimum block number for tests not met. Mining additional blocks...');
+ while ((await this._web3Wrapper.getBlockNumberAsync()) < MINIMUM_BLOCKS) {
+ logUtils.warn('Mining block...');
+ await this._mineDummyBlockAsync();
+ }
+ logUtils.warn('Done mining the minimum number of blocks.');
+ }
+ private async _getNodeTypeAsync(): Promise<NodeType> {
+ if (_.isUndefined(this._nodeType)) {
+ this._nodeType = await this._web3Wrapper.getNodeTypeAsync();
+ }
+ return this._nodeType;
+ }
+ // Sends a transaction that has no real effect on the state and waits for it
+ // to be mined.
+ private async _mineDummyBlockAsync(): Promise<void> {
+ if (this._addresses.length === 0) {
+ this._addresses = await this._web3Wrapper.getAvailableAddressesAsync();
+ if (this._addresses.length === 0) {
+ throw new Error('No accounts found');
+ }
}
+ await this._web3Wrapper.awaitTransactionMinedAsync(
+ await this._web3Wrapper.sendTransactionAsync({
+ from: this._addresses[0],
+ to: this._addresses[0],
+ value: '0',
+ }),
+ 0,
+ );
}
}
diff --git a/packages/dev-utils/src/callback_error_reporter.ts b/packages/dev-utils/src/callback_error_reporter.ts
new file mode 100644
index 000000000..e69ce1c05
--- /dev/null
+++ b/packages/dev-utils/src/callback_error_reporter.ts
@@ -0,0 +1,77 @@
+import * as chai from 'chai';
+import * as _ from 'lodash';
+
+import { DoneCallback } from '@0xproject/types';
+
+const expect = chai.expect;
+
+export const callbackErrorReporter = {
+ reportNoErrorCallbackErrors(
+ done: DoneCallback,
+ expectToBeCalledOnce: boolean = true,
+ ): <T>(f?: ((value: T) => void) | undefined) => (value: T) => void {
+ const callback = <T>(f?: (value: T) => void) => {
+ const wrapped = (value: T) => {
+ if (_.isUndefined(f)) {
+ done();
+ return;
+ }
+ try {
+ f(value);
+ if (expectToBeCalledOnce) {
+ done();
+ }
+ } catch (err) {
+ done(err);
+ }
+ };
+ return wrapped;
+ };
+ return callback;
+ },
+ reportNodeCallbackErrors(
+ done: DoneCallback,
+ expectToBeCalledOnce: boolean = true,
+ ): <T>(f?: ((value: T) => void) | undefined) => (error: Error | null, value: T | undefined) => void {
+ const callback = <T>(f?: (value: T) => void) => {
+ const wrapped = (error: Error | null, value: T | undefined) => {
+ if (!_.isNull(error)) {
+ done(error);
+ } else {
+ if (_.isUndefined(f)) {
+ done();
+ return;
+ }
+ try {
+ f(value as T);
+ if (expectToBeCalledOnce) {
+ done();
+ }
+ } catch (err) {
+ done(err);
+ }
+ }
+ };
+ return wrapped;
+ };
+ return callback;
+ },
+ assertNodeCallbackError(
+ done: DoneCallback,
+ errMsg: string,
+ ): <T>(error: Error | null, value: T | undefined) => void {
+ const wrapped = <T>(error: Error | null, _value: T | undefined) => {
+ if (_.isNull(error)) {
+ done(new Error('Expected callback to receive an error'));
+ } else {
+ try {
+ expect(error.message).to.be.equal(errMsg);
+ done();
+ } catch (err) {
+ done(err);
+ }
+ }
+ };
+ return wrapped;
+ },
+};
diff --git a/packages/dev-utils/src/constants.ts b/packages/dev-utils/src/constants.ts
index 05bcc1638..56e87d764 100644
--- a/packages/dev-utils/src/constants.ts
+++ b/packages/dev-utils/src/constants.ts
@@ -1,6 +1,6 @@
export const constants = {
RPC_URL: 'http://localhost:8545',
RPC_PORT: 8545,
- GAS_ESTIMATE: 5000000,
+ GAS_LIMIT: 7000000,
TESTRPC_FIRST_ADDRESS: '0x5409ed021d9299bf6814279a6a1411a7e866a631',
};
diff --git a/packages/dev-utils/src/coverage.ts b/packages/dev-utils/src/coverage.ts
deleted file mode 100644
index 40bb47e2d..000000000
--- a/packages/dev-utils/src/coverage.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { CoverageSubprovider } from '@0xproject/sol-cov';
-import * as _ from 'lodash';
-
-import { constants } from './constants';
-
-let coverageSubprovider: CoverageSubprovider;
-
-export const coverage = {
- getCoverageSubproviderSingleton(): CoverageSubprovider {
- if (_.isUndefined(coverageSubprovider)) {
- coverageSubprovider = coverage._getCoverageSubprovider();
- }
- return coverageSubprovider;
- },
- _getCoverageSubprovider(): CoverageSubprovider {
- const artifactsPath = './src/artifacts';
- const contractsPath = './src/contracts';
- const networkId = 50;
- const defaultFromAddress = constants.TESTRPC_FIRST_ADDRESS;
- return new CoverageSubprovider(artifactsPath, contractsPath, networkId, defaultFromAddress);
- },
-};
diff --git a/packages/dev-utils/src/env.ts b/packages/dev-utils/src/env.ts
index 114dbf4a8..024162c2f 100644
--- a/packages/dev-utils/src/env.ts
+++ b/packages/dev-utils/src/env.ts
@@ -3,6 +3,8 @@ import * as process from 'process';
export enum EnvVars {
SolidityCoverage = 'SOLIDITY_COVERAGE',
+ SolidityProfiler = 'SOLIDITY_PROFILER',
+ SolidityRevertTrace = 'SOLIDITY_REVERT_TRACE',
VerboseGanache = 'VERBOSE_GANACHE',
}
diff --git a/packages/dev-utils/src/globals.d.ts b/packages/dev-utils/src/globals.d.ts
index 894e56c58..94e63a32d 100644
--- a/packages/dev-utils/src/globals.d.ts
+++ b/packages/dev-utils/src/globals.d.ts
@@ -1,6 +1,3 @@
-declare module 'web3-provider-engine';
-declare module 'web3-provider-engine/subproviders/rpc';
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/dev-utils/src/index.ts b/packages/dev-utils/src/index.ts
index 2ff2a2238..d4c19f1bf 100644
--- a/packages/dev-utils/src/index.ts
+++ b/packages/dev-utils/src/index.ts
@@ -1,5 +1,5 @@
export { BlockchainLifecycle } from './blockchain_lifecycle';
export { web3Factory } from './web3_factory';
export { constants as devConstants } from './constants';
-export { coverage } from './coverage';
export { env, EnvVars } from './env';
+export { callbackErrorReporter } from './callback_error_reporter';
diff --git a/packages/dev-utils/src/web3_factory.ts b/packages/dev-utils/src/web3_factory.ts
index 6435f0f9a..8e713fa68 100644
--- a/packages/dev-utils/src/web3_factory.ts
+++ b/packages/dev-utils/src/web3_factory.ts
@@ -1,50 +1,36 @@
-// HACK: web3 injects XMLHttpRequest into the global scope and ProviderEngine checks XMLHttpRequest
-// to know whether it is running in a browser or node environment. We need it to be undefined since
-// we are not running in a browser env.
-// Filed issue: https://github.com/ethereum/web3.js/issues/844
-(global as any).XMLHttpRequest = undefined;
-import ProviderEngine = require('web3-provider-engine');
-import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
-
-import { EmptyWalletSubprovider, FakeGasEstimateSubprovider, GanacheSubprovider } from '@0xproject/subproviders';
+import {
+ EmptyWalletSubprovider,
+ FakeGasEstimateSubprovider,
+ GanacheSubprovider,
+ RPCSubprovider,
+ Web3ProviderEngine,
+} from '@0xproject/subproviders';
import * as fs from 'fs';
import * as _ from 'lodash';
-import * as process from 'process';
import { constants } from './constants';
-import { coverage } from './coverage';
import { env, EnvVars } from './env';
-// HACK: web3 leaks XMLHttpRequest into the global scope and causes requests to hang
-// because they are using the wrong XHR package.
-// importing web3 after subproviders fixes this issue
-// Filed issue: https://github.com/ethereum/web3.js/issues/844
-// tslint:disable-next-line:ordered-imports
-import * as Web3 from 'web3';
-
export interface Web3Config {
hasAddresses?: boolean; // default: true
shouldUseInProcessGanache?: boolean; // default: false
+ rpcUrl?: string; // default: localhost:8545
+ shouldUseFakeGasEstimate?: boolean; // default: true
}
export const web3Factory = {
- create(config: Web3Config = {}): Web3 {
- const provider = this.getRpcProvider(config);
- const web3 = new Web3();
- web3.setProvider(provider);
- return web3;
- },
- getRpcProvider(config: Web3Config = {}): Web3.Provider {
- const provider = new ProviderEngine();
- const isCoverageEnabled = env.parseBoolean(EnvVars.SolidityCoverage);
- if (isCoverageEnabled) {
- provider.addProvider(coverage.getCoverageSubproviderSingleton());
- }
+ getRpcProvider(config: Web3Config = {}): Web3ProviderEngine {
+ const provider = new Web3ProviderEngine();
const hasAddresses = _.isUndefined(config.hasAddresses) || config.hasAddresses;
+ config.shouldUseFakeGasEstimate =
+ _.isUndefined(config.shouldUseFakeGasEstimate) || config.shouldUseFakeGasEstimate;
if (!hasAddresses) {
provider.addProvider(new EmptyWalletSubprovider());
}
- provider.addProvider(new FakeGasEstimateSubprovider(constants.GAS_ESTIMATE));
+
+ if (config.shouldUseFakeGasEstimate) {
+ provider.addProvider(new FakeGasEstimateSubprovider(constants.GAS_LIMIT));
+ }
const logger = {
log: (arg: any) => {
fs.appendFileSync('ganache.log', `${arg}\n`);
@@ -52,21 +38,21 @@ export const web3Factory = {
};
const shouldUseInProcessGanache = !!config.shouldUseInProcessGanache;
if (shouldUseInProcessGanache) {
+ if (!_.isUndefined(config.rpcUrl)) {
+ throw new Error('Cannot use both GanacheSubrovider and RPCSubprovider');
+ }
provider.addProvider(
new GanacheSubprovider({
+ gasLimit: constants.GAS_LIMIT,
logger,
- verbose: env.parseBoolean(EnvVars.SolidityCoverage),
+ verbose: env.parseBoolean(EnvVars.VerboseGanache),
port: 8545,
- networkId: 50,
+ network_id: 50,
mnemonic: 'concert load couple harbor equip island argue ramp clarify fence smart topic',
}),
);
} else {
- provider.addProvider(
- new RpcSubprovider({
- rpcUrl: constants.RPC_URL,
- }),
- );
+ provider.addProvider(new RPCSubprovider(config.rpcUrl || constants.RPC_URL));
}
provider.start();
return provider;
diff --git a/packages/dev-utils/test/blockchain_lifecycle_test.ts b/packages/dev-utils/test/blockchain_lifecycle_test.ts
index 5ed67e012..7d5e15fbe 100644
--- a/packages/dev-utils/test/blockchain_lifecycle_test.ts
+++ b/packages/dev-utils/test/blockchain_lifecycle_test.ts
@@ -1,4 +1,3 @@
-import { BlockParamLiteral } from '@0xproject/types';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as chai from 'chai';
import 'mocha';
@@ -8,8 +7,8 @@ import { BlockchainLifecycle, web3Factory } from '../src';
const expect = chai.expect;
describe('BlockchainLifecycle tests', () => {
- const web3Provider = web3Factory.getRpcProvider();
- const web3Wrapper = new Web3Wrapper(web3Provider);
+ const provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+ const web3Wrapper = new Web3Wrapper(provider);
const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
describe('#startAsync/revertAsync', () => {
it('reverts changes in between', async () => {
@@ -17,6 +16,7 @@ describe('BlockchainLifecycle tests', () => {
await blockchainLifecycle.startAsync();
await web3Wrapper.mineBlockAsync();
const blockNumberAfter = await web3Wrapper.getBlockNumberAsync();
+ // tslint:disable-next-line:restrict-plus-operands
expect(blockNumberAfter).to.be.equal(blockNumberBefore + 1);
await blockchainLifecycle.revertAsync();
const blockNumberAfterRevert = await web3Wrapper.getBlockNumberAsync();
diff --git a/packages/dev-utils/test/rpc_test.ts b/packages/dev-utils/test/rpc_test.ts
index 1bdea3613..dfbc0f7b2 100644
--- a/packages/dev-utils/test/rpc_test.ts
+++ b/packages/dev-utils/test/rpc_test.ts
@@ -1,6 +1,6 @@
-import { BlockParamLiteral } from '@0xproject/types';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as chai from 'chai';
+import { BlockParamLiteral } from 'ethereum-types';
import 'mocha';
import { web3Factory } from '../src';
@@ -8,13 +8,14 @@ import { web3Factory } from '../src';
const expect = chai.expect;
describe('RPC tests', () => {
- const web3Provider = web3Factory.getRpcProvider();
- const web3Wrapper = new Web3Wrapper(web3Provider);
+ const provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+ const web3Wrapper = new Web3Wrapper(provider);
describe('#mineBlockAsync', () => {
it('increases block number when called', async () => {
const blockNumberBefore = await web3Wrapper.getBlockNumberAsync();
await web3Wrapper.mineBlockAsync();
const blockNumberAfter = await web3Wrapper.getBlockNumberAsync();
+ // tslint:disable-next-line:restrict-plus-operands
expect(blockNumberAfter).to.be.equal(blockNumberBefore + 1);
});
});
@@ -25,6 +26,7 @@ describe('RPC tests', () => {
await web3Wrapper.increaseTimeAsync(TIME_DELTA);
await web3Wrapper.mineBlockAsync();
const blockTimestampAfter = await web3Wrapper.getBlockTimestampAsync(BlockParamLiteral.Latest);
+ // tslint:disable-next-line:restrict-plus-operands
expect(blockTimestampAfter).to.be.at.least(blockTimestampBefore + TIME_DELTA);
});
});
diff --git a/packages/dev-utils/tsconfig.json b/packages/dev-utils/tsconfig.json
index 7b93af0da..e35816553 100644
--- a/packages/dev-utils/tsconfig.json
+++ b/packages/dev-utils/tsconfig.json
@@ -3,10 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": [
- "./src/**/*",
- "./test/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
+ "include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/devnet/Dockerfile b/packages/devnet/Dockerfile
new file mode 100644
index 000000000..8e276d605
--- /dev/null
+++ b/packages/devnet/Dockerfile
@@ -0,0 +1,25 @@
+FROM alpine:3.7
+
+RUN \
+ apk add --update go git make gcc musl-dev linux-headers ca-certificates && \
+ # TODO(albrow): Change the Git URL and branch once we have all relvant PRs
+ # merged to upstream.
+ git clone --depth 1 --branch '0x-testing' https://github.com/0xProject/go-ethereum && \
+ (cd go-ethereum && make geth) && \
+ cp go-ethereum/build/bin/geth /geth && \
+ apk del go git make gcc musl-dev linux-headers && \
+ rm -rf /go-ethereum && rm -rf /var/cache/apk/*
+
+RUN mkdir ~/devnet
+WORKDIR ~/devnet
+
+COPY genesis.json .
+COPY node0/ ./node0
+COPY run.sh .
+
+RUN /geth --datadir node0/ init genesis.json
+
+EXPOSE 8501
+EXPOSE 30310
+
+ENTRYPOINT ./run.sh
diff --git a/packages/devnet/README.md b/packages/devnet/README.md
new file mode 100644
index 000000000..f0b165cbd
--- /dev/null
+++ b/packages/devnet/README.md
@@ -0,0 +1,110 @@
+## 0x Devnet
+
+A private, single-node PoA Ethereum network for testing purposes only. It uses
+Geth and the PoA implementation called "Clique".
+
+## Installation
+
+The devnet requires Docker to run (the latest version is recommended).
+
+In the package root directory, run:
+
+```
+docker build -t 0x-devnet .
+```
+
+## Usage
+
+To start the network, run:
+
+```
+docker run -it --rm -p 8501:8501 0x-devnet
+```
+
+Depending on your OS and how you installed docker, you may need to prefix any
+docker commands with `sudo`.
+
+The Docker container exposes the JSON RPC API at port 8501, and this is the
+primary way you are expected to interact with the devnet. The following
+endpoints are supported: `personal,db,eth,net,web3,txpool,miner,debug`.
+
+You can stop the network with `docker stop` and it will automatically clean up
+after itself. (`docker stop` typically requires you to use `docker ps` to find
+the name of the currently running container).
+
+### Configuration
+
+The devnet network only has a single node and uses PoA instead of PoW. That
+means that one node, called the "sealer", is the ultimate authority for
+validating transactions and adding new blocks to the chain. Since there is no
+PoW it also means that mining does not require significant computational
+resources. You can learn more about PoA and the Geth-specific implementation
+called "Clique" in [EIP-225](https://github.com/ethereum/EIPs/issues/225).
+
+The address of the "sealer" is `0xe8816898d851d5b61b7f950627d04d794c07ca37`. The
+password associated with the account is "password" and the (encrypted) private
+keys are visible in the **node0/keystore** directory. This account is already
+"unlocked" in the Geth node by default, so you can do things like sign and send
+transactions from this account using the JSON RPC endpoints directly.
+
+There are also a number of other addresses that have hard-coded starting
+balances for testing purposes. You can see the details in the **genesis.json**
+file. All of these accounts are also unlocked by default.
+
+### Additional JSON RPC Methods
+
+In addition to the
+[standard JSON RPC methods](https://github.com/ethereum/wiki/wiki/JSON-RPC) and
+the
+[Geth Management API](https://github.com/ethereum/go-ethereum/wiki/Management-APIs)
+The devnet node supports some additional JSON RPC methods:
+
+#### debug_increaseTime
+
+Increases the timestamp of the next mined block.
+
+##### Parameters
+
+`Number` - The number of seconds by which to increase the time offset.
+
+##### Returns
+
+`Number` - The total number of seconds by which the time offset has been
+increased (this includes all calls to `debug_increaseTime`).
+
+##### Example
+
+```js
+// Request
+curl -X POST --data '{"jsonrpc":"2.0","method":"debug_increaseTime","params":[100],"id":67}'
+
+// Result
+{
+ "id":67,
+ "jsonrpc": "2.0",
+ "result": "5000"
+}
+```
+
+### Mining
+
+The node will automatically (nearly instantly) mine a block whenever new
+transactions are added to the transaction pool. If there are no transactions in
+the pool, it will wait.
+
+To stop mining, use the
+[`miner.stop`](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#miner_stop)
+method.
+
+To start mining again, you can use the
+[`miner.start`](https://github.com/ethereum/go-ethereum/wiki/Management-APIs#miner_start)
+JSON RPC method.
+
+## Contributing
+
+We strongly recommend that the community help us make improvements and determine
+the future direction of the protocol. To report bugs within this package, please
+create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting
+started.
diff --git a/packages/devnet/genesis.json b/packages/devnet/genesis.json
new file mode 100644
index 000000000..90431c31c
--- /dev/null
+++ b/packages/devnet/genesis.json
@@ -0,0 +1,61 @@
+{
+ "config": {
+ "chainId": 50,
+ "homesteadBlock": 1,
+ "eip150Block": 2,
+ "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "eip155Block": 3,
+ "eip158Block": 3,
+ "byzantiumBlock": 4,
+ "clique": {
+ "period": 0,
+ "epoch": 30000
+ }
+ },
+ "nonce": "0x0",
+ "timestamp": "0x5af1ffac",
+ "extraData":
+ "0x0000000000000000000000000000000000000000000000000000000000000000e8816898d851d5b61b7f950627d04d794c07ca370000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ "gasLimit": "0x4c4b400000",
+ "difficulty": "0x1",
+ "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "coinbase": "0x0000000000000000000000000000000000000000",
+ "alloc": {
+ "0xe8816898d851d5b61b7f950627d04d794c07ca37": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x5409ed021d9299bf6814279a6a1411a7e866a631": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x6ecbe1db9ef729cbe972c83fb886247691fb6beb": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0xe36ea790bc9d7ab70c55260c66d52b1eca985f84": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0xe834ec434daba538cd1b9fe1582052b880bd7e63": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x78dc5d2d739606d31509c31d654056a45185ecb6": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0xa8dda8d7f5310e4a9e24f8eba77e091ac264f872": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x06cef8e666768cc40cc78cf93d9611019ddcb628": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x7457d5e02197480db681d3fdf256c7aca21bdc12": {
+ "balance": "0x56BC75E2D63100000"
+ },
+ "0x91c987bf62d25945db517bdaa840a6c661374402": {
+ "balance": "0x56BC75E2D63100000"
+ }
+ },
+ "number": "0x0",
+ "gasUsed": "0x0",
+ "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
+}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-08.903003751Z--5409ed021d9299bf6814279a6a1411a7e866a631 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-08.903003751Z--5409ed021d9299bf6814279a6a1411a7e866a631
new file mode 100644
index 000000000..32c4002e0
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-08.903003751Z--5409ed021d9299bf6814279a6a1411a7e866a631
@@ -0,0 +1 @@
+{"address":"5409ed021d9299bf6814279a6a1411a7e866a631","crypto":{"cipher":"aes-128-ctr","ciphertext":"7c7bdd62b303eb3a42d5d8e935825ed5a05a47cb2cef71e346c61b1bd582f1aa","cipherparams":{"iv":"7fd6c9d9f9893f2c480735b5386b6d75"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"79cc86edc3a668845a68fabb3913710b7504922e47aac8513ab3d6a28d090218"},"mac":"8a593ae0d0b964e47625bc964b6d389f5687f5bde631b4913136db4ab1b8083e"},"id":"29f637ba-6a65-4401-a0d1-30e1554bd776","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-09.794553183Z--6ecbe1db9ef729cbe972c83fb886247691fb6beb b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-09.794553183Z--6ecbe1db9ef729cbe972c83fb886247691fb6beb
new file mode 100644
index 000000000..ba84ccfd2
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-09.794553183Z--6ecbe1db9ef729cbe972c83fb886247691fb6beb
@@ -0,0 +1 @@
+{"address":"6ecbe1db9ef729cbe972c83fb886247691fb6beb","crypto":{"cipher":"aes-128-ctr","ciphertext":"ecaf4f2839d74d92e2cb87c2fc7d52862661b46e697d70acfbe43f0893db73ed","cipherparams":{"iv":"7641c3a107228f8a901c07a07ea1f70d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c67c9fb30648df6985c0490b6603382147e7dc1ea28ca8c934af4a453ec0555b"},"mac":"985dca9ce65ad400fa4c9009742be2d409f402fe05203fc1278cfd1451729e8d"},"id":"e8634edc-08e6-415e-8d65-7985c4c4a05c","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-10.696351411Z--e36ea790bc9d7ab70c55260c66d52b1eca985f84 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-10.696351411Z--e36ea790bc9d7ab70c55260c66d52b1eca985f84
new file mode 100644
index 000000000..e889c38b3
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-10.696351411Z--e36ea790bc9d7ab70c55260c66d52b1eca985f84
@@ -0,0 +1 @@
+{"address":"e36ea790bc9d7ab70c55260c66d52b1eca985f84","crypto":{"cipher":"aes-128-ctr","ciphertext":"49f89d7d612049f5f3581fc7c97d32ec9c9a2ca3c11165587139f16bfb29de6b","cipherparams":{"iv":"9767e0687a097c5b57e9cb30eec9bc0a"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"3e8f23332df99d519b602a0f6f4724338ba3fd9e7e313c337a92ffd1cafa19f1"},"mac":"4892051a669d45bb7de32a5eab63ee8fe52485a02218ce1806515da2adbd6584"},"id":"3488ad36-4a9d-4282-8651-7939b822429d","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-11.479938556Z--e834ec434daba538cd1b9fe1582052b880bd7e63 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-11.479938556Z--e834ec434daba538cd1b9fe1582052b880bd7e63
new file mode 100644
index 000000000..c12742c54
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-11.479938556Z--e834ec434daba538cd1b9fe1582052b880bd7e63
@@ -0,0 +1 @@
+{"address":"e834ec434daba538cd1b9fe1582052b880bd7e63","crypto":{"cipher":"aes-128-ctr","ciphertext":"a8ae3896739c63fc3bfe034277f6a1924a1c0ddc3f6747391dada8e61e15a928","cipherparams":{"iv":"f4f4d786cd3650a428a8bac5a6c824b1"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"9acecc321bcab9b69ffdea494b8894ad0221c30f05c17d2302e315db8708ecc6"},"mac":"fc416b8f539fdc1e39e87a3bd2a69b04455875de701ced60cc8948b222171380"},"id":"0d9703e8-14fc-45d0-a425-2c40b8ae846a","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-12.260348580Z--78dc5d2d739606d31509c31d654056a45185ecb6 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-12.260348580Z--78dc5d2d739606d31509c31d654056a45185ecb6
new file mode 100644
index 000000000..691e31dcf
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-12.260348580Z--78dc5d2d739606d31509c31d654056a45185ecb6
@@ -0,0 +1 @@
+{"address":"78dc5d2d739606d31509c31d654056a45185ecb6","crypto":{"cipher":"aes-128-ctr","ciphertext":"25e90e593f08e9e3adc426c8685d90db5d1c04957e9dc8d5fab4ae30c3306b61","cipherparams":{"iv":"72ece22297a27363e795b678bcbd6be5"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"2201502b9d3c4e2076d9d15bfd9da3a6c75d9e2e574aabb29c3bc5a3b5ec55a5"},"mac":"13d709ed4bd2f5bf4973fc1373f8434835f0d12dc99b32c6fc14d9df7f41c62d"},"id":"3902dff4-5681-4646-b825-849f96efeec5","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.178294829Z--a8dda8d7f5310e4a9e24f8eba77e091ac264f872 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.178294829Z--a8dda8d7f5310e4a9e24f8eba77e091ac264f872
new file mode 100644
index 000000000..9054e0019
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.178294829Z--a8dda8d7f5310e4a9e24f8eba77e091ac264f872
@@ -0,0 +1 @@
+{"address":"a8dda8d7f5310e4a9e24f8eba77e091ac264f872","crypto":{"cipher":"aes-128-ctr","ciphertext":"0d67c13cf0b130e8ffa1aaca5df372f727164e633f8e0e28a3e54d0884ffb568","cipherparams":{"iv":"619cd539cda9f40abb45bba00b5fe53d"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"4effcd9b6fe71ee31cfe9057290154329b9af3acb6dcc46be7f78b5b9dcd3f42"},"mac":"c6eecd25944f4250b7b875d76bfbb60cc4e8db1d081621d1a2ddb72ea4e52a6d"},"id":"556bd3f1-1e5b-47a4-9b6e-448b9989d7d3","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.960499696Z--06cef8e666768cc40cc78cf93d9611019ddcb628 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.960499696Z--06cef8e666768cc40cc78cf93d9611019ddcb628
new file mode 100644
index 000000000..0870638dd
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-13.960499696Z--06cef8e666768cc40cc78cf93d9611019ddcb628
@@ -0,0 +1 @@
+{"address":"06cef8e666768cc40cc78cf93d9611019ddcb628","crypto":{"cipher":"aes-128-ctr","ciphertext":"38c9ca150932dc8c5ec5c65796425b2de98295cae64db08b816da2c06fc52c20","cipherparams":{"iv":"512127e8e606c481612473e7bc4d38f1"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"16c4cabfd13cae2df66d8ff9acc7f503c95c808b00d0bb6a12932203889c679b"},"mac":"52297b496e8751627dea1ee17bf5cbea1926f90bcde3ffc8baa089184672f875"},"id":"31102097-86e4-4e19-ad73-03c3de67bf3b","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-14.757010386Z--4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-14.757010386Z--4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d
new file mode 100644
index 000000000..5f28db78f
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-14.757010386Z--4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d
@@ -0,0 +1 @@
+{"address":"4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d","crypto":{"cipher":"aes-128-ctr","ciphertext":"ca7aedbacc960fc0fcb418606d7bdf042c36cc2808a5c94ac222cc0b44a9970d","cipherparams":{"iv":"3b1fe5da1cf5d6cd2ceaaf24c008c897"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"a94e4d41d77ff6dc54beda30c7a46d8f3cc312ebeffa0352d679f7e3fc5301dc"},"mac":"9a82bf60103d05878f8af3c07765c22cba3df9b1c4376eaf859e47b805666e42"},"id":"ab68c67b-e15a-4ade-b3d9-2180a32b28fe","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-15.554233052Z--7457d5e02197480db681d3fdf256c7aca21bdc12 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-15.554233052Z--7457d5e02197480db681d3fdf256c7aca21bdc12
new file mode 100644
index 000000000..2a2c0194a
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-15.554233052Z--7457d5e02197480db681d3fdf256c7aca21bdc12
@@ -0,0 +1 @@
+{"address":"7457d5e02197480db681d3fdf256c7aca21bdc12","crypto":{"cipher":"aes-128-ctr","ciphertext":"720dcc2889c7b3636f9f659650181b0d46d82420460e23454277273f528baaee","cipherparams":{"iv":"1510028e2b9988d1a73b71cbb692d085"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"5db2b62f4d1f55a3f24c014c4f23f3ec9a2992dca6c2a89c24a566f99a079396"},"mac":"22c6fb134fd0a748195ea83e9ccb490ab2c9a3e8761f9d74ea6d02abbdeb8a43"},"id":"704c31f8-8ca2-4b49-9fdc-5923f5712dad","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-16.342711541Z--91c987bf62d25945db517bdaa840a6c661374402 b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-16.342711541Z--91c987bf62d25945db517bdaa840a6c661374402
new file mode 100644
index 000000000..edc6d7531
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-11T21-29-16.342711541Z--91c987bf62d25945db517bdaa840a6c661374402
@@ -0,0 +1 @@
+{"address":"91c987bf62d25945db517bdaa840a6c661374402","crypto":{"cipher":"aes-128-ctr","ciphertext":"8f461f3c74643f382f7fc1f71719d5a89ed8cf75854d8a1b53e133997b53a386","cipherparams":{"iv":"cf595fb7680d36b4f5a01599ee54d2d1"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"73a9e599369d2bfaedd044559415147240c3517f6cd1dec8f77a98993d1ceaf8"},"mac":"c8be4dc59ad28d40f7b549a6b72834d149c84d67dc35e687676bbee0e07be395"},"id":"21cca6fb-7876-4e39-a986-a0a37f90da6d","version":3}
diff --git a/packages/devnet/node0/keystore/UTC--2018-05-15T21-50-24.532037737Z--e8816898d851d5b61b7f950627d04d794c07ca37 b/packages/devnet/node0/keystore/UTC--2018-05-15T21-50-24.532037737Z--e8816898d851d5b61b7f950627d04d794c07ca37
new file mode 100644
index 000000000..cd2c97a88
--- /dev/null
+++ b/packages/devnet/node0/keystore/UTC--2018-05-15T21-50-24.532037737Z--e8816898d851d5b61b7f950627d04d794c07ca37
@@ -0,0 +1 @@
+{"address":"e8816898d851d5b61b7f950627d04d794c07ca37","crypto":{"cipher":"aes-128-ctr","ciphertext":"1ff4add6955cba7ddaf29f66d7d21c5e1d714ef6191fbc651ae60f2ea3c95e8f","cipherparams":{"iv":"3ff869fbdbe1a523cdb327780365976e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"7372dbae5fb318f8684902e099c311d4188721d677974d729711762c7ef6030c"},"mac":"485fa5dc701067782baa1589716a53110c7f917eb259e35ebca7265bbb7150b1"},"id":"89edb004-5b00-4607-a3af-a0d9ab9b1c34","version":3} \ No newline at end of file
diff --git a/packages/devnet/node0/password.txt b/packages/devnet/node0/password.txt
new file mode 100644
index 000000000..9842d2661
--- /dev/null
+++ b/packages/devnet/node0/password.txt
@@ -0,0 +1,11 @@
+password
+password
+password
+password
+password
+password
+password
+password
+password
+password
+password
diff --git a/packages/devnet/run.sh b/packages/devnet/run.sh
new file mode 100755
index 000000000..dea243396
--- /dev/null
+++ b/packages/devnet/run.sh
@@ -0,0 +1,25 @@
+set -e
+
+# Create log directory for Geth
+mkdir -p /var/log
+
+# Start Geth and direct output to stdout
+/geth \
+ --verbosity 5 \
+ --datadir node0/ \
+ --syncmode 'full' \
+ --nat none \
+ --nodiscover \
+ --port 30310 \
+ --txpool.journal '' \
+ --rpc \
+ --rpcaddr '0.0.0.0' \
+ --rpcport 8501 \
+ --rpcapi 'personal,db,eth,net,web3,txpool,miner,debug' \
+ --networkid 50 \
+ --gasprice '2000000000' \
+ --targetgaslimit '0x4c4b400000' \
+ --mine \
+ --etherbase '0xe8816898d851d5b61b7f950627d04d794c07ca37' \
+ --unlock '0xe8816898d851d5b61b7f950627d04d794c07ca37,0x5409ed021d9299bf6814279a6a1411a7e866a631,0x6ecbe1db9ef729cbe972c83fb886247691fb6beb,0xe36ea790bc9d7ab70c55260c66d52b1eca985f84,0xe834ec434daba538cd1b9fe1582052b880bd7e63,0x78dc5d2d739606d31509c31d654056a45185ecb6,0xa8dda8d7f5310e4a9e24f8eba77e091ac264f872,0x06cef8e666768cc40cc78cf93d9611019ddcb628,0x4404ac8bd8f9618d27ad2f1485aa1b2cfd82482d,0x7457d5e02197480db681d3fdf256c7aca21bdc12,0x91c987bf62d25945db517bdaa840a6c661374402' \
+ --password=node0/password.txt
diff --git a/packages/ethereum-types/.npmignore b/packages/ethereum-types/.npmignore
new file mode 100644
index 000000000..24e65ad5b
--- /dev/null
+++ b/packages/ethereum-types/.npmignore
@@ -0,0 +1,6 @@
+.*
+yarn-error.log
+/scripts/
+/src/
+tsconfig.json
+/lib/monorepo_scripts/
diff --git a/packages/ethereum-types/CHANGELOG.json b/packages/ethereum-types/CHANGELOG.json
new file mode 100644
index 000000000..e67d68648
--- /dev/null
+++ b/packages/ethereum-types/CHANGELOG.json
@@ -0,0 +1,62 @@
+[
+ {
+ "timestamp": 1534210131,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Add `TraceParams` interface for `debug_traceTransaction` parameters",
+ "pr": 675
+ },
+ {
+ "note": "Add `TransactionReceiptStatus` type",
+ "pr": 812
+ }
+ ]
+ },
+ {
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Initial publish",
+ "pr": "642"
+ }
+ ],
+ "timestamp": 1527811200
+ }
+]
diff --git a/packages/ethereum-types/CHANGELOG.md b/packages/ethereum-types/CHANGELOG.md
new file mode 100644
index 000000000..67fa84437
--- /dev/null
+++ b/packages/ethereum-types/CHANGELOG.md
@@ -0,0 +1,31 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.4 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Add `TraceParams` interface for `debug_traceTransaction` parameters (#675)
+ * Add `TransactionReceiptStatus` type (#812)
+
+## v0.0.2 - _May 31, 2018_
+
+ * Initial publish (#642)
diff --git a/packages/ethereum-types/README.md b/packages/ethereum-types/README.md
new file mode 100644
index 000000000..817e22d15
--- /dev/null
+++ b/packages/ethereum-types/README.md
@@ -0,0 +1,61 @@
+## ethereum-types
+
+Typescript types shared across Ethereum-related packages/libraries/tools.
+
+## Installation
+
+```bash
+yarn add -D ethereum-types
+```
+
+## Usage
+
+```javascript
+import { TransactionReceipt, TxData, TxDataPayable } from 'ethereum-types';
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=ethereum-types yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=ethereum-types yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
diff --git a/packages/ethereum-types/package.json b/packages/ethereum-types/package.json
new file mode 100644
index 000000000..0e89a8049
--- /dev/null
+++ b/packages/ethereum-types/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "ethereum-types",
+ "version": "1.0.4",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "Ethereum types",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "tsc -w",
+ "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "clean": "shx rm -rf lib scripts",
+ "lint": "tslint --project .",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
+ "docs:stage": "node scripts/stage_docs.js",
+ "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
+ "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
+ },
+ "config": {
+ "postpublish": {
+ "docPublishConfigs": {
+ "s3BucketPath": "s3://doc-jsons/ethereum-types/",
+ "s3StagingBucketPath": "s3://staging-doc-jsons/ethereum-types/"
+ }
+ }
+ },
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/ethereum-types/README.md",
+ "devDependencies": {
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
+ },
+ "dependencies": {
+ "@types/node": "^8.0.53",
+ "bignumber.js": "~4.1.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/ethereum-types/src/globals.d.ts b/packages/ethereum-types/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/ethereum-types/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/ethereum-types/src/index.ts b/packages/ethereum-types/src/index.ts
new file mode 100644
index 000000000..f4d445e3b
--- /dev/null
+++ b/packages/ethereum-types/src/index.ts
@@ -0,0 +1,289 @@
+import { BigNumber } from 'bignumber.js';
+
+export type JSONRPCErrorCallback = (err: Error | null, result?: JSONRPCResponsePayload) => void;
+
+/**
+ * Do not create your own provider. Use an existing provider from a Web3 or ProviderEngine library
+ * Read more about Providers in the 0x wiki.
+ */
+export interface Provider {
+ sendAsync(payload: JSONRPCRequestPayload, callback: JSONRPCErrorCallback): void;
+}
+
+export type ContractAbi = AbiDefinition[];
+
+export type AbiDefinition = FunctionAbi | EventAbi;
+
+export type FunctionAbi = MethodAbi | ConstructorAbi | FallbackAbi;
+
+export type ConstructorStateMutability = 'nonpayable' | 'payable';
+export type StateMutability = 'pure' | 'view' | ConstructorStateMutability;
+
+export interface MethodAbi {
+ type: AbiType.Function;
+ name: string;
+ inputs: DataItem[];
+ outputs: DataItem[];
+ constant: boolean;
+ stateMutability: StateMutability;
+ payable: boolean;
+}
+
+export interface ConstructorAbi {
+ type: AbiType.Constructor;
+ inputs: DataItem[];
+ payable: boolean;
+ stateMutability: ConstructorStateMutability;
+}
+
+export interface FallbackAbi {
+ type: AbiType.Fallback;
+ payable: boolean;
+}
+
+export interface EventParameter extends DataItem {
+ indexed: boolean;
+}
+
+export interface EventAbi {
+ type: AbiType.Event;
+ name: string;
+ inputs: EventParameter[];
+ anonymous: boolean;
+}
+
+export interface DataItem {
+ name: string;
+ type: string;
+ components?: DataItem[];
+}
+
+export enum OpCode {
+ DelegateCall = 'DELEGATECALL',
+ Revert = 'REVERT',
+ Create = 'CREATE',
+ Stop = 'STOP',
+ Invalid = 'INVALID',
+ CallCode = 'CALLCODE',
+ StaticCall = 'STATICCALL',
+ Return = 'RETURN',
+ Call = 'CALL',
+ SelfDestruct = 'SELFDESTRUCT',
+}
+
+export interface StructLog {
+ depth: number;
+ error: string;
+ gas: number;
+ gasCost: number;
+ memory: string[];
+ op: OpCode;
+ pc: number;
+ stack: string[];
+ storage: { [location: string]: string };
+}
+
+export interface TransactionTrace {
+ gas: number;
+ returnValue: any;
+ structLogs: StructLog[];
+}
+
+export type Unit =
+ | 'kwei'
+ | 'ada'
+ | 'mwei'
+ | 'babbage'
+ | 'gwei'
+ | 'shannon'
+ | 'szabo'
+ | 'finney'
+ | 'ether'
+ | 'kether'
+ | 'grand'
+ | 'einstein'
+ | 'mether'
+ | 'gether'
+ | 'tether';
+
+export interface JSONRPCRequestPayload {
+ params: any[];
+ method: string;
+ id: number;
+ jsonrpc: string;
+}
+
+export interface JSONRPCResponsePayload {
+ result: any;
+ id: number;
+ jsonrpc: string;
+}
+
+export interface AbstractBlock {
+ number: number | null;
+ hash: string | null;
+ parentHash: string;
+ nonce: string | null;
+ sha3Uncles: string;
+ logsBloom: string | null;
+ transactionsRoot: string;
+ stateRoot: string;
+ miner: string;
+ difficulty: BigNumber;
+ totalDifficulty: BigNumber;
+ extraData: string;
+ size: number;
+ gasLimit: number;
+ gasUsed: number;
+ timestamp: number;
+ uncles: string[];
+}
+
+export interface BlockWithoutTransactionData extends AbstractBlock {
+ transactions: string[];
+}
+
+export interface BlockWithTransactionData extends AbstractBlock {
+ transactions: Transaction[];
+}
+
+export interface Transaction {
+ hash: string;
+ nonce: number;
+ blockHash: string | null;
+ blockNumber: number | null;
+ transactionIndex: number | null;
+ from: string;
+ to: string | null;
+ value: BigNumber;
+ gasPrice: BigNumber;
+ gas: number;
+ input: string;
+}
+
+export interface CallTxDataBase {
+ to?: string;
+ value?: number | string | BigNumber;
+ gas?: number | string | BigNumber;
+ gasPrice?: number | string | BigNumber;
+ data?: string;
+ nonce?: number;
+}
+
+export interface TxData extends CallTxDataBase {
+ from: string;
+}
+
+export interface CallData extends CallTxDataBase {
+ from?: string;
+}
+
+export interface FilterObject {
+ fromBlock?: number | string;
+ toBlock?: number | string;
+ address?: string;
+ topics?: LogTopic[];
+}
+
+export type LogTopic = null | string | string[];
+
+export interface DecodedLogEntry<A> extends LogEntry {
+ event: string;
+ args: A;
+}
+
+export interface DecodedLogEntryEvent<A> extends DecodedLogEntry<A> {
+ removed: boolean;
+}
+
+export interface LogEntryEvent extends LogEntry {
+ removed: boolean;
+}
+
+export interface LogEntry {
+ logIndex: number | null;
+ transactionIndex: number | null;
+ transactionHash: string;
+ blockHash: string | null;
+ blockNumber: number | null;
+ address: string;
+ data: string;
+ topics: string[];
+}
+
+export interface TxDataPayable extends TxData {
+ value?: BigNumber;
+}
+
+export type TransactionReceiptStatus = null | string | 0 | 1;
+
+export interface TransactionReceipt {
+ blockHash: string;
+ blockNumber: number;
+ transactionHash: string;
+ transactionIndex: number;
+ from: string;
+ to: string;
+ status: TransactionReceiptStatus;
+ cumulativeGasUsed: number;
+ gasUsed: number;
+ contractAddress: string | null;
+ logs: LogEntry[];
+}
+
+export enum AbiType {
+ Function = 'function',
+ Constructor = 'constructor',
+ Event = 'event',
+ Fallback = 'fallback',
+}
+
+export type ContractEventArg = string | BigNumber | number | boolean;
+
+export interface DecodedLogArgs {
+ [argName: string]: ContractEventArg;
+}
+
+export interface LogWithDecodedArgs<ArgsType extends DecodedLogArgs> extends DecodedLogEntry<ArgsType> {}
+export type RawLog = LogEntry;
+
+export enum BlockParamLiteral {
+ Earliest = 'earliest',
+ Latest = 'latest',
+ Pending = 'pending',
+}
+
+export type BlockParam = BlockParamLiteral | number;
+
+export interface RawLogEntry {
+ logIndex: string | null;
+ transactionIndex: string | null;
+ transactionHash: string;
+ blockHash: string | null;
+ blockNumber: string | null;
+ address: string;
+ data: string;
+ topics: string[];
+}
+
+export enum SolidityTypes {
+ Address = 'address',
+ Uint256 = 'uint256',
+ Uint8 = 'uint8',
+ Uint = 'uint',
+}
+
+/**
+ * Contains the logs returned by a TransactionReceipt. We attempt to decode the
+ * logs using AbiDecoder. If we have the logs corresponding ABI, we decode it,
+ * otherwise we don't.
+ */
+export interface TransactionReceiptWithDecodedLogs extends TransactionReceipt {
+ logs: Array<LogWithDecodedArgs<DecodedLogArgs> | LogEntry>;
+}
+
+export interface TraceParams {
+ disableMemory?: boolean;
+ disableStack?: boolean;
+ disableStorage?: boolean;
+}
diff --git a/packages/ethereum-types/src/monorepo_scripts/postpublish.ts b/packages/ethereum-types/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/ethereum-types/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/deployer/src/monorepo_scripts/stage_docs.ts b/packages/ethereum-types/src/monorepo_scripts/stage_docs.ts
index e732ac8eb..e732ac8eb 100644
--- a/packages/deployer/src/monorepo_scripts/stage_docs.ts
+++ b/packages/ethereum-types/src/monorepo_scripts/stage_docs.ts
diff --git a/packages/ethereum-types/tsconfig.json b/packages/ethereum-types/tsconfig.json
new file mode 100644
index 000000000..82a45ea94
--- /dev/null
+++ b/packages/ethereum-types/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "typeRoots": ["../../node_modules/@types"],
+ "outDir": "lib"
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/ethereum-types/tslint.json b/packages/ethereum-types/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/ethereum-types/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/fill-scenarios/.npmignore b/packages/fill-scenarios/.npmignore
new file mode 100644
index 000000000..24e65ad5b
--- /dev/null
+++ b/packages/fill-scenarios/.npmignore
@@ -0,0 +1,6 @@
+.*
+yarn-error.log
+/scripts/
+/src/
+tsconfig.json
+/lib/monorepo_scripts/
diff --git a/packages/fill-scenarios/CHANGELOG.json b/packages/fill-scenarios/CHANGELOG.json
new file mode 100644
index 000000000..06f12a85f
--- /dev/null
+++ b/packages/fill-scenarios/CHANGELOG.json
@@ -0,0 +1,108 @@
+[
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "note":
+ "Updated to use latest orderFactory interface, fixed `feeRecipient` spelling error in public interface",
+ "pr": 936
+ },
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Make fill-scenarios compatible with V2 of 0x protocol",
+ "pr": 656
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008544,
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008544,
+ "version": "0.0.1",
+ "changes": [
+ {
+ "note": "Move FillScenarios out of 0x.js",
+ "pr": 579
+ }
+ ]
+ }
+]
diff --git a/packages/fill-scenarios/CHANGELOG.md b/packages/fill-scenarios/CHANGELOG.md
new file mode 100644
index 000000000..7efe163ec
--- /dev/null
+++ b/packages/fill-scenarios/CHANGELOG.md
@@ -0,0 +1,51 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.1-rc.3 - _August 13, 2018_
+
+ * Updated to use latest orderFactory interface, fixed `feeRecipient` spelling error in public interface (#936)
+ * Dependencies updated
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Make fill-scenarios compatible with V2 of 0x protocol (#656)
+
+## v0.0.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.5 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.0.4 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.3 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.0.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.1 - _May 22, 2018_
+
+ * Move FillScenarios out of 0x.js (#579)
diff --git a/packages/fill-scenarios/README.md b/packages/fill-scenarios/README.md
new file mode 100644
index 000000000..67df0941f
--- /dev/null
+++ b/packages/fill-scenarios/README.md
@@ -0,0 +1,63 @@
+## @0xproject/fill-scenarios
+
+0x order fill scenario generator
+
+## Installation
+
+```bash
+yarn add @0xproject/fill-scenarios
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/fill-scenarios yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/fill-scenarios yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
diff --git a/packages/fill-scenarios/package.json b/packages/fill-scenarios/package.json
new file mode 100644
index 000000000..c3e8afb0e
--- /dev/null
+++ b/packages/fill-scenarios/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "@0xproject/fill-scenarios",
+ "version": "1.0.1-rc.3",
+ "description": "0x order fill scenario generator",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "pre_build": "run-s update_artifacts generate_contract_wrappers",
+ "update_artifacts": "for i in ${npm_package_config_contracts}; do copyfiles -u 4 ../migrations/artifacts/2.0.0/$i.json lib/artifacts; done;",
+ "generate_contract_wrappers": "abi-gen --abis 'lib/artifacts/@(Exchange|DummyERC20Token|DummyERC721Token).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
+ "copy_monorepo_scripts": "copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "clean": "shx rm -rf lib scripts src/generated_contract_wrappers",
+ "lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js"
+ },
+ "config": {
+ "contracts": "Exchange DummyERC20Token DummyERC721Token"
+ },
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/fill-scenarios/README.md",
+ "devDependencies": {
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/lodash": "4.14.104",
+ "copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "npm-run-all": "^4.1.2",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
+ },
+ "dependencies": {
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "ethereum-types": "^1.0.4",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/fill-scenarios/src/artifacts.ts b/packages/fill-scenarios/src/artifacts.ts
new file mode 100644
index 000000000..7f68ae26a
--- /dev/null
+++ b/packages/fill-scenarios/src/artifacts.ts
@@ -0,0 +1,11 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as DummyERC20Token from './artifacts/DummyERC20Token.json';
+import * as DummyERC721Token from './artifacts/DummyERC721Token.json';
+import * as Exchange from './artifacts/Exchange.json';
+
+export const artifacts = {
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ DummyERC721Token: (DummyERC721Token as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+};
diff --git a/packages/fill-scenarios/src/constants.ts b/packages/fill-scenarios/src/constants.ts
new file mode 100644
index 000000000..5661b059f
--- /dev/null
+++ b/packages/fill-scenarios/src/constants.ts
@@ -0,0 +1,4 @@
+export const constants = {
+ AWAIT_TRANSACTION_MINED_MS: 0,
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+};
diff --git a/packages/fill-scenarios/src/fill_scenarios.ts b/packages/fill-scenarios/src/fill_scenarios.ts
new file mode 100644
index 000000000..1a1adb326
--- /dev/null
+++ b/packages/fill-scenarios/src/fill_scenarios.ts
@@ -0,0 +1,302 @@
+import { assetDataUtils, orderFactory } from '@0xproject/order-utils';
+import { AssetProxyId, ERC721AssetData, OrderWithoutExchangeAddress, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from './artifacts';
+import { constants } from './constants';
+import { DummyERC20TokenContract } from './generated_contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from './generated_contract_wrappers/dummy_erc721_token';
+import { ExchangeContract } from './generated_contract_wrappers/exchange';
+
+export class FillScenarios {
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _userAddresses: string[];
+ private readonly _coinbase: string;
+ private readonly _zrxTokenAddress: string;
+ private readonly _exchangeAddress: string;
+ private readonly _erc20ProxyAddress: string;
+ private readonly _erc721ProxyAddress: string;
+ constructor(
+ provider: Provider,
+ userAddresses: string[],
+ zrxTokenAddress: string,
+ exchangeAddress: string,
+ erc20ProxyAddress: string,
+ erc721ProxyAddress: string,
+ ) {
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._userAddresses = userAddresses;
+ this._coinbase = userAddresses[0];
+ this._zrxTokenAddress = zrxTokenAddress;
+ this._exchangeAddress = exchangeAddress;
+ this._erc20ProxyAddress = erc20ProxyAddress;
+ this._erc721ProxyAddress = erc721ProxyAddress;
+ }
+ public async createFillableSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerAddress: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ return this.createAsymmetricFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ expirationTimeSeconds,
+ );
+ }
+ public async createFillableSignedOrderWithFeesAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerFee: BigNumber,
+ takerFee: BigNumber,
+ makerAddress: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ feeRecipientAddress: string,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ return this._createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ feeRecipientAddress,
+ expirationTimeSeconds,
+ );
+ }
+ public async createAsymmetricFillableSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerAddress: string,
+ takerAddress: string,
+ makerFillableAmount: BigNumber,
+ takerFillableAmount: BigNumber,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ const makerFee = new BigNumber(0);
+ const takerFee = new BigNumber(0);
+ const feeRecipientAddress = constants.NULL_ADDRESS;
+ return this._createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ makerFillableAmount,
+ takerFillableAmount,
+ feeRecipientAddress,
+ expirationTimeSeconds,
+ );
+ }
+ public async createPartiallyFilledSignedOrderAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ takerAddress: string,
+ fillableAmount: BigNumber,
+ partialFillAmount: BigNumber,
+ ): Promise<SignedOrder> {
+ const [makerAddress] = this._userAddresses;
+ const signedOrder = await this.createAsymmetricFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ fillableAmount,
+ );
+ const exchangeInstance = new ExchangeContract(
+ artifacts.Exchange.compilerOutput.abi,
+ signedOrder.exchangeAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+
+ const orderWithoutExchangeAddress = _.omit(signedOrder, [
+ 'signature',
+ 'exchangeAddress',
+ ]) as OrderWithoutExchangeAddress;
+
+ const txHash = await exchangeInstance.fillOrder.sendTransactionAsync(
+ orderWithoutExchangeAddress,
+ partialFillAmount,
+ signedOrder.signature,
+ { from: takerAddress },
+ );
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ return signedOrder;
+ }
+ private async _createAsymmetricFillableSignedOrderWithFeesAsync(
+ makerAssetData: string,
+ takerAssetData: string,
+ makerFee: BigNumber,
+ takerFee: BigNumber,
+ makerAddress: string,
+ takerAddress: string,
+ makerFillableAmount: BigNumber,
+ takerFillableAmount: BigNumber,
+ feeRecipientAddress: string,
+ expirationTimeSeconds?: BigNumber,
+ ): Promise<SignedOrder> {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ await this._increaseERC20BalanceAndAllowanceAsync(
+ decodedMakerAssetData.tokenAddress,
+ makerAddress,
+ makerFillableAmount,
+ );
+ } else {
+ if (!makerFillableAmount.equals(1)) {
+ throw new Error(`ERC721 makerFillableAmount should be equal 1. Found: ${makerFillableAmount}`);
+ }
+ await this._increaseERC721BalanceAndAllowanceAsync(
+ decodedMakerAssetData.tokenAddress,
+ makerAddress,
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ const decodedTakerAssetData = assetDataUtils.decodeAssetDataOrThrow(takerAssetData);
+ if (decodedTakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const takerTokenAddress = decodedTakerAssetData.tokenAddress;
+ await this._increaseERC20BalanceAndAllowanceAsync(takerTokenAddress, takerAddress, takerFillableAmount);
+ } else {
+ if (!takerFillableAmount.equals(1)) {
+ throw new Error(`ERC721 takerFillableAmount should be equal 1. Found: ${takerFillableAmount}`);
+ }
+ await this._increaseERC721BalanceAndAllowanceAsync(
+ decodedTakerAssetData.tokenAddress,
+ takerAddress,
+ // tslint:disable-next-line:no-unnecessary-type-assertion
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ // Fees
+ await Promise.all([
+ this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, makerAddress, makerFee),
+ this._increaseERC20BalanceAndAllowanceAsync(this._zrxTokenAddress, takerAddress, takerFee),
+ ]);
+ const senderAddress = constants.NULL_ADDRESS;
+
+ const signedOrder = await orderFactory.createSignedOrderAsync(
+ this._web3Wrapper.getProvider(),
+ makerAddress,
+ makerFillableAmount,
+ makerAssetData,
+ takerFillableAmount,
+ takerAssetData,
+ this._exchangeAddress,
+ {
+ takerAddress,
+ senderAddress,
+ makerFee,
+ takerFee,
+ feeRecipientAddress,
+ expirationTimeSeconds,
+ },
+ );
+ return signedOrder;
+ }
+ private async _increaseERC721BalanceAndAllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ await this._increaseERC721BalanceAsync(tokenAddress, address, tokenId);
+ await this._increaseERC721AllowanceAsync(tokenAddress, address, tokenId);
+ }
+ private async _increaseERC721AllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ const erc721Token = new DummyERC721TokenContract(
+ artifacts.DummyERC721Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const txHash = await erc721Token.approve.sendTransactionAsync(this._erc721ProxyAddress, tokenId, {
+ from: address,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ private async _increaseERC721BalanceAsync(
+ tokenAddress: string,
+ address: string,
+ tokenId: BigNumber,
+ ): Promise<void> {
+ const erc721Token = new DummyERC721TokenContract(
+ artifacts.DummyERC721Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ try {
+ const currentOwner = await erc721Token.ownerOf.callAsync(tokenId);
+ if (currentOwner !== address) {
+ throw new Error(`Token ${tokenAddress}:${tokenId} is already owner by ${currentOwner}`);
+ }
+ } catch (err) {
+ const txHash = await erc721Token.mint.sendTransactionAsync(address, tokenId, { from: this._coinbase });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ }
+ private async _increaseERC20BalanceAndAllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ amount: BigNumber,
+ ): Promise<void> {
+ if (amount.isZero() || address === constants.NULL_ADDRESS) {
+ return; // noop
+ }
+ await Promise.all([
+ this._increaseERC20BalanceAsync(tokenAddress, address, amount),
+ this._increaseERC20AllowanceAsync(tokenAddress, address, amount),
+ ]);
+ }
+ private async _increaseERC20BalanceAsync(tokenAddress: string, address: string, amount: BigNumber): Promise<void> {
+ const erc20Token = new DummyERC20TokenContract(
+ artifacts.DummyERC20Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const txHash = await erc20Token.transfer.sendTransactionAsync(address, amount, {
+ from: this._coinbase,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+ private async _increaseERC20AllowanceAsync(
+ tokenAddress: string,
+ address: string,
+ amount: BigNumber,
+ ): Promise<void> {
+ const erc20Token = new DummyERC20TokenContract(
+ artifacts.DummyERC20Token.compilerOutput.abi,
+ tokenAddress,
+ this._web3Wrapper.getProvider(),
+ this._web3Wrapper.getContractDefaults(),
+ );
+ const oldMakerAllowance = await erc20Token.allowance.callAsync(address, this._erc20ProxyAddress);
+ const newMakerAllowance = oldMakerAllowance.plus(amount);
+
+ const txHash = await erc20Token.approve.sendTransactionAsync(this._erc20ProxyAddress, newMakerAllowance, {
+ from: address,
+ });
+ await this._web3Wrapper.awaitTransactionSuccessAsync(txHash, constants.AWAIT_TRANSACTION_MINED_MS);
+ }
+}
diff --git a/packages/fill-scenarios/src/globals.d.ts b/packages/fill-scenarios/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/fill-scenarios/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/fill-scenarios/src/index.ts b/packages/fill-scenarios/src/index.ts
new file mode 100644
index 000000000..c51145cdb
--- /dev/null
+++ b/packages/fill-scenarios/src/index.ts
@@ -0,0 +1 @@
+export { FillScenarios } from './fill_scenarios';
diff --git a/packages/fill-scenarios/src/monorepo_scripts/postpublish.ts b/packages/fill-scenarios/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/fill-scenarios/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/fill-scenarios/tsconfig.json b/packages/fill-scenarios/tsconfig.json
new file mode 100644
index 000000000..f5f4b37c2
--- /dev/null
+++ b/packages/fill-scenarios/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/fill-scenarios/tslint.json b/packages/fill-scenarios/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/fill-scenarios/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/json-schemas/CHANGELOG.json b/packages/json-schemas/CHANGELOG.json
index 3ea1e7512..d78a1c11e 100644
--- a/packages/json-schemas/CHANGELOG.json
+++ b/packages/json-schemas/CHANGELOG.json
@@ -1,13 +1,176 @@
[
{
+ "version": "1.0.1-rc.4",
+ "changes": [
+ {
+ "note": "Allow for additional properties in txData schema",
+ "pr": 938
+ },
+ {
+ "note": "Change hexSchema to match `0x`",
+ "pr": 937
+ },
+ {
+ "note": "Upgrade Relayer API schemas for relayer API V2",
+ "pr": 916
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532614997
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Update schemas for V2 or 0x Protocol",
+ "pr": 615
+ },
+ {
+ "note": "Added CallData schema",
+ "pr": 821
+ },
+ {
+ "note": "Update CallData schema id to CallData",
+ "pr": 894
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.8.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.8.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.8.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.8.0",
+ "changes": [
+ {
+ "note":
+ "Update Order & SignedOrder schemas, remove ECSignature schema and add Hex schema as part of V2 upgrades",
+ "pr": 615
+ }
+ ],
+ "timestamp": 1527008794
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.7.24",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.7.23",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.7.22",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.7.21",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.7.20",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.7.19",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.7.18",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.7.13",
@@ -17,8 +180,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.7.0",
@@ -28,8 +190,7 @@
"pr": 272
}
],
- "timestamp": 1513695600,
- "isPublished": true
+ "timestamp": 1513695600
},
{
"version": "0.6.7",
@@ -38,7 +199,6 @@
"note": "Re-publish JSON-schema previously published under NPM package 0x-json-schemas"
}
],
- "timestamp": 1510585200,
- "isPublished": true
+ "timestamp": 1510585200
}
]
diff --git a/packages/json-schemas/CHANGELOG.md b/packages/json-schemas/CHANGELOG.md
index 6c86a1a81..0ebc3d237 100644
--- a/packages/json-schemas/CHANGELOG.md
+++ b/packages/json-schemas/CHANGELOG.md
@@ -1,22 +1,90 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.1-rc.4 - _August 13, 2018_
+
+ * Allow for additional properties in txData schema (#938)
+ * Change hexSchema to match `0x` (#937)
+ * Upgrade Relayer API schemas for relayer API V2 (#916)
+
+## v1.0.1-rc.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Update schemas for V2 or 0x Protocol (#615)
+ * Added CallData schema (#821)
+ * Update CallData schema id to CallData (#894)
+
+## v0.8.3 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.8.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.8.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.8.0 - _May 22, 2018_
+
+ * Update Order & SignedOrder schemas, remove ECSignature schema and add Hex schema as part of V2 upgrades (#615)
+
+## v0.7.24 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.7.23 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.7.22 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.7.21 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.7.20 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.7.19 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.7.18 - _April 2, 2018_
* Dependencies updated
-## v0.7.13 - _February 9, 2018_
+## v0.7.13 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.7.0 - _December 20, 2017_
+## v0.7.0 - _December 19, 2017_
* Rename `subscriptionOptsSchema` to `blockRangeSchema` (#272)
-## v0.6.7 - _November 14, 2017_
+## v0.6.7 - _November 13, 2017_
* Re-publish JSON-schema previously published under NPM package 0x-json-schemas
diff --git a/packages/json-schemas/README.md b/packages/json-schemas/README.md
index 980d17416..ab57833be 100644
--- a/packages/json-schemas/README.md
+++ b/packages/json-schemas/README.md
@@ -2,7 +2,7 @@
Contains 0x-related json schemas
-### Read the [Documentation](0xproject.com/docs/json-schemas).
+### Read the [Documentation](https://0xproject.com/docs/json-schemas).
## Installation
@@ -32,11 +32,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -52,14 +52,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=@0xproject/json-schemas yarn build
```
-or
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/json-schemas yarn watch
+```
+
+### Clean
```bash
-yarn build:watch
+yarn clean
```
### Lint
diff --git a/packages/json-schemas/package.json b/packages/json-schemas/package.json
index f546df5ad..40cb71c18 100644
--- a/packages/json-schemas/package.json
+++ b/packages/json-schemas/package.json
@@ -1,21 +1,25 @@
{
"name": "@0xproject/json-schemas",
- "version": "0.7.18",
+ "version": "1.0.1-rc.4",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x-related json schemas",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "test": "run-s clean build run_mocha",
+ "watch_without_deps": "tsc -w",
+ "lint": "tslint --project .",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"test:circleci": "yarn test:coverage",
- "run_mocha": "mocha lib/test/**/*_test.js",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
"clean": "shx rm -rf lib test_temp scripts",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
@@ -24,7 +28,8 @@
"assets": [],
"docPublishConfigs": {
"extraFileIncludes": [
- "../types/src/index.ts"
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
],
"s3BucketPath": "s3://doc-jsons/json-schemas/",
"s3StagingBucketPath": "s3://staging-doc-jsons/json-schemas/"
@@ -42,14 +47,15 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/json-schemas/README.md",
"dependencies": {
- "@0xproject/typescript-typings": "^0.0.2",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@types/node": "^8.0.53",
"jsonschema": "^1.2.0",
"lodash.values": "^4.3.0"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@0xproject/utils": "^1.0.5",
"@types/lodash.foreach": "^4.5.3",
"@types/lodash.values": "^4.3.3",
"@types/mocha": "^2.2.42",
@@ -57,13 +63,14 @@
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"lodash.foreach": "^4.5.0",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/json-schemas/schemas/basic_type_schemas.ts b/packages/json-schemas/schemas/basic_type_schemas.ts
index 9d81ff333..a59afaef8 100644
--- a/packages/json-schemas/schemas/basic_type_schemas.ts
+++ b/packages/json-schemas/schemas/basic_type_schemas.ts
@@ -1,11 +1,17 @@
export const addressSchema = {
- id: '/Address',
+ id: '/addressSchema',
type: 'string',
pattern: '^0x[0-9a-f]{40}$',
};
+export const hexSchema = {
+ id: '/hexSchema',
+ type: 'string',
+ pattern: '^0x(([0-9a-f][0-9a-f])+)?$',
+};
+
export const numberSchema = {
- id: '/Number',
+ id: '/numberSchema',
type: 'string',
pattern: '^\\d+(\\.\\d+)?$',
};
diff --git a/packages/json-schemas/schemas/block_range_schema.ts b/packages/json-schemas/schemas/block_range_schema.ts
index 1f6a63151..9eb242fc6 100644
--- a/packages/json-schemas/schemas/block_range_schema.ts
+++ b/packages/json-schemas/schemas/block_range_schema.ts
@@ -1,5 +1,5 @@
export const blockParamSchema = {
- id: '/BlockParam',
+ id: '/blockParamSchema',
oneOf: [
{
type: 'number',
@@ -11,10 +11,10 @@ export const blockParamSchema = {
};
export const blockRangeSchema = {
- id: '/BlockRange',
+ id: '/blockRangeSchema',
properties: {
- fromBlock: { $ref: '/BlockParam' },
- toBlock: { $ref: '/BlockParam' },
+ fromBlock: { $ref: '/blockParamSchema' },
+ toBlock: { $ref: '/blockParamSchema' },
},
type: 'object',
};
diff --git a/packages/json-schemas/schemas/call_data_schema.ts b/packages/json-schemas/schemas/call_data_schema.ts
new file mode 100644
index 000000000..4c77d9f9d
--- /dev/null
+++ b/packages/json-schemas/schemas/call_data_schema.ts
@@ -0,0 +1,27 @@
+export const callDataSchema = {
+ id: '/callDataSchema',
+ properties: {
+ from: { $ref: '/addressSchema' },
+ to: { $ref: '/addressSchema' },
+ value: {
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
+ },
+ gas: {
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
+ },
+ gasPrice: {
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
+ },
+ data: {
+ type: 'string',
+ pattern: '^0x[0-9a-f]*$',
+ },
+ nonce: {
+ type: 'number',
+ minimum: 0,
+ },
+ },
+ required: [],
+ type: 'object',
+ additionalProperties: false,
+};
diff --git a/packages/json-schemas/schemas/ec_signature_schema.ts b/packages/json-schemas/schemas/ec_signature_schema.ts
index 71b840dd8..c59532f09 100644
--- a/packages/json-schemas/schemas/ec_signature_schema.ts
+++ b/packages/json-schemas/schemas/ec_signature_schema.ts
@@ -1,5 +1,5 @@
export const ecSignatureParameterSchema = {
- id: '/ECSignatureParameter',
+ id: '/ecSignatureParameterSchema',
type: 'string',
pattern: '^0[xX][0-9A-Fa-f]{64}$',
};
@@ -12,8 +12,8 @@ export const ecSignatureSchema = {
minimum: 27,
maximum: 28,
},
- r: { $ref: '/ECSignatureParameter' },
- s: { $ref: '/ECSignatureParameter' },
+ r: { $ref: '/ecSignatureParameterSchema' },
+ s: { $ref: '/ecSignatureParameterSchema' },
},
required: ['v', 'r', 's'],
type: 'object',
diff --git a/packages/json-schemas/schemas/index_filter_values_schema.ts b/packages/json-schemas/schemas/index_filter_values_schema.ts
index 3374d63e0..f3c8cef68 100644
--- a/packages/json-schemas/schemas/index_filter_values_schema.ts
+++ b/packages/json-schemas/schemas/index_filter_values_schema.ts
@@ -1,7 +1,7 @@
export const indexFilterValuesSchema = {
- id: '/IndexFilterValues',
+ id: '/indexFilterValuesSchema',
additionalProperties: {
- oneOf: [{ $ref: '/Number' }, { $ref: '/Address' }, { $ref: '/OrderHashSchema' }],
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/addressSchema' }, { $ref: '/orderHashSchema' }],
},
type: 'object',
};
diff --git a/packages/json-schemas/schemas/order_cancel_schema.ts b/packages/json-schemas/schemas/order_cancel_schema.ts
index ad23d01cc..e4edfbca9 100644
--- a/packages/json-schemas/schemas/order_cancel_schema.ts
+++ b/packages/json-schemas/schemas/order_cancel_schema.ts
@@ -1,10 +1,10 @@
export const orderCancellationRequestsSchema = {
- id: '/OrderCancellationRequests',
+ id: '/orderCancellationRequestsSchema',
type: 'array',
items: {
properties: {
- order: { $ref: '/Order' },
- takerTokenCancelAmount: { $ref: '/Number' },
+ order: { $ref: '/orderSchema' },
+ takerTokenCancelAmount: { $ref: '/numberSchema' },
},
required: ['order', 'takerTokenCancelAmount'],
type: 'object',
diff --git a/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts b/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts
index 61f2c8849..e2c18ef0a 100644
--- a/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts
+++ b/packages/json-schemas/schemas/order_fill_or_kill_requests_schema.ts
@@ -1,10 +1,10 @@
export const orderFillOrKillRequestsSchema = {
- id: '/OrderFillOrKillRequests',
+ id: '/orderFillOrKillRequestsSchema',
type: 'array',
items: {
properties: {
- signedOrder: { $ref: '/SignedOrder' },
- fillTakerAmount: { $ref: '/Number' },
+ signedOrder: { $ref: '/signedOrderSchema' },
+ fillTakerAmount: { $ref: '/numberSchema' },
},
required: ['signedOrder', 'fillTakerAmount'],
type: 'object',
diff --git a/packages/json-schemas/schemas/order_fill_requests_schema.ts b/packages/json-schemas/schemas/order_fill_requests_schema.ts
index 419d0670f..ea8b35e54 100644
--- a/packages/json-schemas/schemas/order_fill_requests_schema.ts
+++ b/packages/json-schemas/schemas/order_fill_requests_schema.ts
@@ -1,10 +1,10 @@
export const orderFillRequestsSchema = {
- id: '/OrderFillRequests',
+ id: '/orderFillRequestsSchema',
type: 'array',
items: {
properties: {
- signedOrder: { $ref: '/SignedOrder' },
- takerTokenFillAmount: { $ref: '/Number' },
+ signedOrder: { $ref: '/signedOrderSchema' },
+ takerTokenFillAmount: { $ref: '/numberSchema' },
},
required: ['signedOrder', 'takerTokenFillAmount'],
type: 'object',
diff --git a/packages/json-schemas/schemas/order_hash_schema.ts b/packages/json-schemas/schemas/order_hash_schema.ts
index 6af06927f..9773a88f9 100644
--- a/packages/json-schemas/schemas/order_hash_schema.ts
+++ b/packages/json-schemas/schemas/order_hash_schema.ts
@@ -1,5 +1,5 @@
export const orderHashSchema = {
- id: '/OrderHashSchema',
+ id: '/orderHashSchema',
type: 'string',
pattern: '^0x[0-9a-fA-F]{64}$',
};
diff --git a/packages/json-schemas/schemas/order_schemas.ts b/packages/json-schemas/schemas/order_schemas.ts
index 6f17224ad..eb7fdaf5a 100644
--- a/packages/json-schemas/schemas/order_schemas.ts
+++ b/packages/json-schemas/schemas/order_schemas.ts
@@ -1,43 +1,47 @@
export const orderSchema = {
- id: '/Order',
+ id: '/orderSchema',
properties: {
- maker: { $ref: '/Address' },
- taker: { $ref: '/Address' },
- makerFee: { $ref: '/Number' },
- takerFee: { $ref: '/Number' },
- makerTokenAmount: { $ref: '/Number' },
- takerTokenAmount: { $ref: '/Number' },
- makerTokenAddress: { $ref: '/Address' },
- takerTokenAddress: { $ref: '/Address' },
- salt: { $ref: '/Number' },
- feeRecipient: { $ref: '/Address' },
- expirationUnixTimestampSec: { $ref: '/Number' },
- exchangeContractAddress: { $ref: '/Address' },
+ makerAddress: { $ref: '/addressSchema' },
+ takerAddress: { $ref: '/addressSchema' },
+ makerFee: { $ref: '/numberSchema' },
+ takerFee: { $ref: '/numberSchema' },
+ senderAddress: { $ref: '/addressSchema' },
+ makerAssetAmount: { $ref: '/numberSchema' },
+ takerAssetAmount: { $ref: '/numberSchema' },
+ makerAssetData: { $ref: '/hexSchema' },
+ takerAssetData: { $ref: '/hexSchema' },
+ salt: { $ref: '/numberSchema' },
+ exchangeAddress: { $ref: '/addressSchema' },
+ feeRecipientAddress: { $ref: '/addressSchema' },
+ expirationTimeSeconds: { $ref: '/numberSchema' },
},
required: [
- 'maker',
- 'taker',
+ 'makerAddress',
+ 'takerAddress',
'makerFee',
'takerFee',
- 'makerTokenAmount',
- 'takerTokenAmount',
+ 'senderAddress',
+ 'makerAssetAmount',
+ 'takerAssetAmount',
+ 'makerAssetData',
+ 'takerAssetData',
'salt',
- 'feeRecipient',
- 'expirationUnixTimestampSec',
- 'exchangeContractAddress',
+ 'exchangeAddress',
+ 'feeRecipientAddress',
+ 'expirationTimeSeconds',
],
type: 'object',
};
export const signedOrderSchema = {
- id: '/SignedOrder',
+ id: '/signedOrderSchema',
allOf: [
- { $ref: '/Order' },
+ { $ref: '/orderSchema' },
{
properties: {
- ecSignature: { $ref: '/ECSignature' },
+ signature: { $ref: '/hexSchema' },
},
- required: ['ecSignature'],
+ required: ['signature'],
},
],
};
diff --git a/packages/json-schemas/schemas/orders_schema.ts b/packages/json-schemas/schemas/orders_schema.ts
new file mode 100644
index 000000000..de0abcf00
--- /dev/null
+++ b/packages/json-schemas/schemas/orders_schema.ts
@@ -0,0 +1,5 @@
+export const ordersSchema = {
+ id: '/ordersSchema',
+ type: 'array',
+ items: { $ref: '/orderSchema' },
+};
diff --git a/packages/json-schemas/schemas/paginated_collection_schema.ts b/packages/json-schemas/schemas/paginated_collection_schema.ts
new file mode 100644
index 000000000..16044c70a
--- /dev/null
+++ b/packages/json-schemas/schemas/paginated_collection_schema.ts
@@ -0,0 +1,10 @@
+export const paginatedCollectionSchema = {
+ id: '/paginatedCollectionSchema',
+ type: 'object',
+ properties: {
+ total: { type: 'number' },
+ perPage: { type: 'number' },
+ page: { type: 'number' },
+ },
+ required: ['total', 'perPage', 'page'],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts b/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts
new file mode 100644
index 000000000..c13396d29
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_asset_pairs_response_schema.ts
@@ -0,0 +1,38 @@
+export const relayerApiAssetDataPairsResponseSchema = {
+ id: '/relayerApiAssetDataPairsResponseSchema',
+ type: 'object',
+ allOf: [
+ { $ref: '/paginatedCollectionSchema' },
+ {
+ properties: {
+ records: { $ref: '/relayerApiAssetDataPairsSchema' },
+ },
+ required: ['records'],
+ },
+ ],
+};
+
+export const relayerApiAssetDataPairsSchema = {
+ id: '/relayerApiAssetDataPairsSchema',
+ type: 'array',
+ items: {
+ properties: {
+ assetDataA: { $ref: '/relayerApiAssetDataTradeInfoSchema' },
+ assetDataB: { $ref: '/relayerApiAssetDataTradeInfoSchema' },
+ },
+ required: ['assetDataA', 'assetDataB'],
+ type: 'object',
+ },
+};
+
+export const relayerApiAssetDataTradeInfoSchema = {
+ id: '/relayerApiAssetDataTradeInfoSchema',
+ type: 'object',
+ properties: {
+ assetData: { $ref: '/hexSchema' },
+ minAmount: { $ref: '/numberSchema' },
+ maxAmount: { $ref: '/numberSchema' },
+ precision: { type: 'number' },
+ },
+ required: ['assetData'],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_error_response_schema.ts b/packages/json-schemas/schemas/relayer_api_error_response_schema.ts
index 27fdb166f..79e33fc85 100644
--- a/packages/json-schemas/schemas/relayer_api_error_response_schema.ts
+++ b/packages/json-schemas/schemas/relayer_api_error_response_schema.ts
@@ -1,8 +1,8 @@
export const relayerApiErrorResponseSchema = {
- id: '/RelayerApiErrorResponse',
+ id: '/relayerApiErrorResponseSchema',
type: 'object',
properties: {
- code: { type: 'number' },
+ code: { type: 'integer', minimum: 100, maximum: 103 },
reason: { type: 'string' },
validationErrors: {
type: 'array',
@@ -10,7 +10,7 @@ export const relayerApiErrorResponseSchema = {
type: 'object',
properties: {
field: { type: 'string' },
- code: { type: 'number' },
+ code: { type: 'integer', minimum: 1000, maximum: 1006 },
reason: { type: 'string' },
},
required: ['field', 'code', 'reason'],
diff --git a/packages/json-schemas/schemas/relayer_api_fee_recipients_response_schema.ts b/packages/json-schemas/schemas/relayer_api_fee_recipients_response_schema.ts
new file mode 100644
index 000000000..84d39eb20
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_fee_recipients_response_schema.ts
@@ -0,0 +1,13 @@
+export const relayerApiFeeRecipientsResponseSchema = {
+ id: '/relayerApiFeeRecipientsResponseSchema',
+ type: 'object',
+ allOf: [
+ { $ref: '/paginatedCollectionSchema' },
+ {
+ properties: {
+ records: { $ref: '/addressSchema' },
+ },
+ required: ['records'],
+ },
+ ],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts b/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts
deleted file mode 100644
index eaaf777a1..000000000
--- a/packages/json-schemas/schemas/relayer_api_fees_payload_schema.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-export const relayerApiFeesPayloadSchema = {
- id: '/RelayerApiFeesPayload',
- type: 'object',
- properties: {
- exchangeContractAddress: { $ref: '/Address' },
- maker: { $ref: '/Address' },
- taker: { $ref: '/Address' },
- makerTokenAddress: { $ref: '/Address' },
- takerTokenAddress: { $ref: '/Address' },
- makerTokenAmount: { $ref: '/Number' },
- takerTokenAmount: { $ref: '/Number' },
- expirationUnixTimestampSec: { $ref: '/Number' },
- salt: { $ref: '/Number' },
- },
- required: [
- 'exchangeContractAddress',
- 'maker',
- 'taker',
- 'makerTokenAddress',
- 'takerTokenAddress',
- 'expirationUnixTimestampSec',
- 'salt',
- ],
-};
diff --git a/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts b/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts
deleted file mode 100644
index e7440613f..000000000
--- a/packages/json-schemas/schemas/relayer_api_fees_response_schema.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-export const relayerApiFeesResponseSchema = {
- id: '/RelayerApiFeesResponse',
- type: 'object',
- properties: {
- makerFee: { $ref: '/Number' },
- takerFee: { $ref: '/Number' },
- feeRecipient: { $ref: '/Address' },
- },
- required: ['makerFee', 'takerFee', 'feeRecipient'],
-};
diff --git a/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts b/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts
deleted file mode 100644
index d93fa73d6..000000000
--- a/packages/json-schemas/schemas/relayer_api_orberbook_channel_subscribe_schema.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-export const relayerApiOrderbookChannelSubscribeSchema = {
- id: '/RelayerApiOrderbookChannelSubscribe',
- type: 'object',
- properties: {
- type: { enum: ['subscribe'] },
- channel: { enum: ['orderbook'] },
- requestId: { type: 'number' },
- payload: { $ref: '/RelayerApiOrderbookChannelSubscribePayload' },
- },
- required: ['type', 'channel', 'requestId', 'payload'],
-};
-
-export const relayerApiOrderbookChannelSubscribePayload = {
- id: '/RelayerApiOrderbookChannelSubscribePayload',
- type: 'object',
- properties: {
- baseTokenAddress: { $ref: '/Address' },
- quoteTokenAddress: { $ref: '/Address' },
- snapshot: { type: 'boolean' },
- limit: { type: 'number' },
- },
- required: ['baseTokenAddress', 'quoteTokenAddress'],
-};
diff --git a/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts b/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts
new file mode 100644
index 000000000..8d1d408d6
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_order_config_payload_schema.ts
@@ -0,0 +1,24 @@
+export const relayerApiOrderConfigPayloadSchema = {
+ id: '/relayerApiOrderConfigPayloadSchema',
+ type: 'object',
+ properties: {
+ makerAddress: { $ref: '/addressSchema' },
+ takerAddress: { $ref: '/addressSchema' },
+ makerAssetAmount: { $ref: '/numberSchema' },
+ takerAssetAmount: { $ref: '/numberSchema' },
+ makerAssetData: { $ref: '/hexSchema' },
+ takerAssetData: { $ref: '/hexSchema' },
+ exchangeAddress: { $ref: '/addressSchema' },
+ expirationTimeSeconds: { $ref: '/numberSchema' },
+ },
+ required: [
+ 'makerAddress',
+ 'takerAddress',
+ 'makerAssetAmount',
+ 'takerAssetAmount',
+ 'makerAssetData',
+ 'takerAssetData',
+ 'exchangeAddress',
+ 'expirationTimeSeconds',
+ ],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts b/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts
new file mode 100644
index 000000000..390d0b262
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_order_config_response_schema.ts
@@ -0,0 +1,11 @@
+export const relayerApiOrderConfigResponseSchema = {
+ id: '/relayerApiOrderConfigResponseSchema',
+ type: 'object',
+ properties: {
+ makerFee: { $ref: '/numberSchema' },
+ takerFee: { $ref: '/numberSchema' },
+ feeRecipientAddress: { $ref: '/addressSchema' },
+ senderAddress: { $ref: '/addressSchema' },
+ },
+ required: ['makerFee', 'takerFee', 'feeRecipientAddress', 'senderAddress'],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_order_schema.ts b/packages/json-schemas/schemas/relayer_api_order_schema.ts
new file mode 100644
index 000000000..3952e9683
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_order_schema.ts
@@ -0,0 +1,9 @@
+export const relayerApiOrderSchema = {
+ id: '/relayerApiOrderSchema',
+ type: 'object',
+ properties: {
+ order: { $ref: '/orderSchema' },
+ metaData: { type: 'object' },
+ },
+ required: ['order', 'metaData'],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts
deleted file mode 100644
index fe1510d5b..000000000
--- a/packages/json-schemas/schemas/relayer_api_orderbook_channel_snapshot_schema.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-export const relayerApiOrderbookChannelSnapshotSchema = {
- id: '/RelayerApiOrderbookChannelSnapshot',
- type: 'object',
- properties: {
- type: { enum: ['snapshot'] },
- channel: { enum: ['orderbook'] },
- requestId: { type: 'number' },
- payload: { $ref: '/RelayerApiOrderbookChannelSnapshotPayload' },
- },
- required: ['type', 'channel', 'requestId', 'payload'],
-};
-
-export const relayerApiOrderbookChannelSnapshotPayload = {
- id: '/RelayerApiOrderbookChannelSnapshotPayload',
- type: 'object',
- properties: {
- bids: { $ref: '/signedOrdersSchema' },
- asks: { $ref: '/signedOrdersSchema' },
- },
- required: ['bids', 'asks'],
-};
diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts
deleted file mode 100644
index 9a6d83d4c..000000000
--- a/packages/json-schemas/schemas/relayer_api_orderbook_channel_update_response_schema.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export const relayerApiOrderbookChannelUpdateSchema = {
- id: '/RelayerApiOrderbookChannelUpdate',
- type: 'object',
- properties: {
- type: { enum: ['update'] },
- channel: { enum: ['orderbook'] },
- requestId: { type: 'number' },
- payload: { $ref: '/SignedOrder' },
- },
- required: ['type', 'channel', 'requestId', 'payload'],
-};
diff --git a/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts
index 5c409c807..7c0b8e0df 100644
--- a/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts
+++ b/packages/json-schemas/schemas/relayer_api_orderbook_response_schema.ts
@@ -1,9 +1,9 @@
-export const relayerApiOrderBookResponseSchema = {
- id: '/RelayerApiOrderBookResponse',
+export const relayerApiOrderbookResponseSchema = {
+ id: '/relayerApiOrderbookResponseSchema',
type: 'object',
properties: {
- bids: { $ref: '/signedOrdersSchema' },
- asks: { $ref: '/signedOrdersSchema' },
+ bids: { $ref: '/relayerApiOrdersResponseSchema' },
+ asks: { $ref: '/relayerApiOrdersResponseSchema' },
},
required: ['bids', 'asks'],
};
diff --git a/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts
new file mode 100644
index 000000000..a3b9b6d95
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_orders_channel_subscribe_schema.ts
@@ -0,0 +1,26 @@
+export const relayerApiOrdersChannelSubscribeSchema = {
+ id: '/relayerApiOrdersChannelSubscribeSchema',
+ type: 'object',
+ properties: {
+ type: { enum: ['subscribe'] },
+ channel: { enum: ['orders'] },
+ requestId: { type: 'string' },
+ payload: { $ref: '/relayerApiOrdersChannelSubscribePayload' },
+ },
+ required: ['type', 'channel', 'requestId'],
+};
+
+export const relayerApiOrdersChannelSubscribePayload = {
+ id: '/relayerApiOrdersChannelSubscribePayload',
+ type: 'object',
+ properties: {
+ makerAssetProxyId: { $ref: '/hexSchema' },
+ takerAssetProxyId: { $ref: '/hexSchema' },
+ networkId: { type: 'number' },
+ makerAssetAddress: { $ref: '/addressSchema' },
+ takerAssetAddress: { $ref: '/addressSchema' },
+ makerAssetData: { $ref: '/hexSchema' },
+ takerAssetData: { $ref: '/hexSchema' },
+ traderAssetData: { $ref: '/hexSchema' },
+ },
+};
diff --git a/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts
new file mode 100644
index 000000000..800b818e2
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_orders_channel_update_response_schema.ts
@@ -0,0 +1,11 @@
+export const relayerApiOrdersChannelUpdateSchema = {
+ id: '/relayerApiOrdersChannelUpdateSchema',
+ type: 'object',
+ properties: {
+ type: { enum: ['update'] },
+ channel: { enum: ['orders'] },
+ requestId: { type: 'string' },
+ payload: { $ref: '/relayerApiOrdersSchema' },
+ },
+ required: ['type', 'channel', 'requestId'],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts
new file mode 100644
index 000000000..c10d64ca9
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_orders_response_schema.ts
@@ -0,0 +1,13 @@
+export const relayerApiOrdersResponseSchema = {
+ id: '/relayerApiOrdersResponseSchema',
+ type: 'object',
+ allOf: [
+ { $ref: '/paginatedCollectionSchema' },
+ {
+ properties: {
+ records: { $ref: '/relayerApiOrdersSchema' },
+ },
+ required: ['records'],
+ },
+ ],
+};
diff --git a/packages/json-schemas/schemas/relayer_api_orders_schema.ts b/packages/json-schemas/schemas/relayer_api_orders_schema.ts
new file mode 100644
index 000000000..ba8ce4722
--- /dev/null
+++ b/packages/json-schemas/schemas/relayer_api_orders_schema.ts
@@ -0,0 +1,5 @@
+export const relayerApiOrdersSchema = {
+ id: '/relayerApiOrdersSchema',
+ type: 'array',
+ items: { $ref: '/relayerApiOrderSchema' },
+};
diff --git a/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts b/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts
deleted file mode 100644
index 5009c7955..000000000
--- a/packages/json-schemas/schemas/relayer_api_token_pairs_response_schema.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-export const relayerApiTokenPairsResponseSchema = {
- id: '/RelayerApiTokenPairsResponse',
- type: 'array',
- items: {
- properties: {
- tokenA: { $ref: '/RelayerApiTokenTradeInfo' },
- tokenB: { $ref: '/RelayerApiTokenTradeInfo' },
- },
- required: ['tokenA', 'tokenB'],
- type: 'object',
- },
-};
-
-export const relayerApiTokenTradeInfoSchema = {
- id: '/RelayerApiTokenTradeInfo',
- type: 'object',
- properties: {
- address: { $ref: '/Address' },
- minAmount: { $ref: '/Number' },
- maxAmount: { $ref: '/Number' },
- precision: { type: 'number' },
- },
- required: ['address'],
-};
diff --git a/packages/json-schemas/schemas/signed_orders_schema.ts b/packages/json-schemas/schemas/signed_orders_schema.ts
index 34d956836..e2a5aeb56 100644
--- a/packages/json-schemas/schemas/signed_orders_schema.ts
+++ b/packages/json-schemas/schemas/signed_orders_schema.ts
@@ -1,5 +1,5 @@
export const signedOrdersSchema = {
id: '/signedOrdersSchema',
type: 'array',
- items: { $ref: '/SignedOrder' },
+ items: { $ref: '/signedOrderSchema' },
};
diff --git a/packages/json-schemas/schemas/token_schema.ts b/packages/json-schemas/schemas/token_schema.ts
index e64565c8b..a0b1ae27f 100644
--- a/packages/json-schemas/schemas/token_schema.ts
+++ b/packages/json-schemas/schemas/token_schema.ts
@@ -1,10 +1,10 @@
export const tokenSchema = {
- id: '/Token',
+ id: '/tokenSchema',
properties: {
name: { type: 'string' },
symbol: { type: 'string' },
decimals: { type: 'number' },
- address: { $ref: '/Address' },
+ address: { $ref: '/addressSchema' },
},
required: ['name', 'symbol', 'decimals', 'address'],
type: 'object',
diff --git a/packages/json-schemas/schemas/tx_data_schema.ts b/packages/json-schemas/schemas/tx_data_schema.ts
index 4274c553f..c57e18461 100644
--- a/packages/json-schemas/schemas/tx_data_schema.ts
+++ b/packages/json-schemas/schemas/tx_data_schema.ts
@@ -1,22 +1,22 @@
export const jsNumber = {
- id: '/JsNumber',
+ id: '/jsNumber',
type: 'number',
minimum: 0,
};
export const txDataSchema = {
- id: '/TxData',
+ id: '/txDataSchema',
properties: {
- from: { $ref: '/Address' },
- to: { $ref: '/Address' },
+ from: { $ref: '/addressSchema' },
+ to: { $ref: '/addressSchema' },
value: {
- oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }],
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
},
gas: {
- oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }],
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
},
gasPrice: {
- oneOf: [{ $ref: '/Number' }, { $ref: '/JsNumber' }],
+ oneOf: [{ $ref: '/numberSchema' }, { $ref: '/jsNumber' }],
},
data: {
type: 'string',
@@ -29,5 +29,4 @@ export const txDataSchema = {
},
required: ['from'],
type: 'object',
- additionalProperties: false,
};
diff --git a/packages/json-schemas/src/globals.d.ts b/packages/json-schemas/src/globals.d.ts
index 5476b6bd8..94e63a32d 100644
--- a/packages/json-schemas/src/globals.d.ts
+++ b/packages/json-schemas/src/globals.d.ts
@@ -1,5 +1,3 @@
-declare module 'dirty-chai';
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/json-schemas/src/schema_validator.ts b/packages/json-schemas/src/schema_validator.ts
index 38ae766e6..3f303137b 100644
--- a/packages/json-schemas/src/schema_validator.ts
+++ b/packages/json-schemas/src/schema_validator.ts
@@ -7,7 +7,7 @@ import { schemas } from './schemas';
* A validator for [JSON-schemas](http://json-schema.org/)
*/
export class SchemaValidator {
- private _validator: Validator;
+ private readonly _validator: Validator;
/**
* Instantiates a SchemaValidator instance
*/
@@ -23,7 +23,7 @@ export class SchemaValidator {
* instances of that schema.
* @param schema The schema to add
*/
- public addSchema(schema: Schema) {
+ public addSchema(schema: Schema): void {
this._validator.addSchema(schema, schema.id);
}
// In order to validate a complex JS object using jsonschema, we must replace any complex
diff --git a/packages/json-schemas/src/schemas.ts b/packages/json-schemas/src/schemas.ts
index 5cb07acfe..3bc37f96b 100644
--- a/packages/json-schemas/src/schemas.ts
+++ b/packages/json-schemas/src/schemas.ts
@@ -1,5 +1,6 @@
-import { addressSchema, numberSchema } from '../schemas/basic_type_schemas';
+import { addressSchema, hexSchema, numberSchema } from '../schemas/basic_type_schemas';
import { blockParamSchema, blockRangeSchema } from '../schemas/block_range_schema';
+import { callDataSchema } from '../schemas/call_data_schema';
import { ecSignatureParameterSchema, ecSignatureSchema } from '../schemas/ec_signature_schema';
import { indexFilterValuesSchema } from '../schemas/index_filter_values_schema';
import { orderCancellationRequestsSchema } from '../schemas/order_cancel_schema';
@@ -7,23 +8,26 @@ import { orderFillOrKillRequestsSchema } from '../schemas/order_fill_or_kill_req
import { orderFillRequestsSchema } from '../schemas/order_fill_requests_schema';
import { orderHashSchema } from '../schemas/order_hash_schema';
import { orderSchema, signedOrderSchema } from '../schemas/order_schemas';
-import { relayerApiErrorResponseSchema } from '../schemas/relayer_api_error_response_schema';
-import { relayerApiFeesPayloadSchema } from '../schemas/relayer_api_fees_payload_schema';
-import { relayerApiFeesResponseSchema } from '../schemas/relayer_api_fees_response_schema';
-import {
- relayerApiOrderbookChannelSubscribePayload,
- relayerApiOrderbookChannelSubscribeSchema,
-} from '../schemas/relayer_api_orberbook_channel_subscribe_schema';
+import { ordersSchema } from '../schemas/orders_schema';
+import { paginatedCollectionSchema } from '../schemas/paginated_collection_schema';
import {
- relayerApiOrderbookChannelSnapshotPayload,
- relayerApiOrderbookChannelSnapshotSchema,
-} from '../schemas/relayer_api_orderbook_channel_snapshot_schema';
-import { relayerApiOrderbookChannelUpdateSchema } from '../schemas/relayer_api_orderbook_channel_update_response_schema';
-import { relayerApiOrderBookResponseSchema } from '../schemas/relayer_api_orderbook_response_schema';
+ relayerApiAssetDataPairsResponseSchema,
+ relayerApiAssetDataPairsSchema,
+ relayerApiAssetDataTradeInfoSchema,
+} from '../schemas/relayer_api_asset_pairs_response_schema';
+import { relayerApiErrorResponseSchema } from '../schemas/relayer_api_error_response_schema';
+import { relayerApiFeeRecipientsResponseSchema } from '../schemas/relayer_api_fee_recipients_response_schema';
+import { relayerApiOrderConfigPayloadSchema } from '../schemas/relayer_api_order_config_payload_schema';
+import { relayerApiOrderConfigResponseSchema } from '../schemas/relayer_api_order_config_response_schema';
+import { relayerApiOrderSchema } from '../schemas/relayer_api_order_schema';
+import { relayerApiOrderbookResponseSchema } from '../schemas/relayer_api_orderbook_response_schema';
import {
- relayerApiTokenPairsResponseSchema,
- relayerApiTokenTradeInfoSchema,
-} from '../schemas/relayer_api_token_pairs_response_schema';
+ relayerApiOrdersChannelSubscribePayload,
+ relayerApiOrdersChannelSubscribeSchema,
+} from '../schemas/relayer_api_orders_channel_subscribe_schema';
+import { relayerApiOrdersChannelUpdateSchema } from '../schemas/relayer_api_orders_channel_update_response_schema';
+import { relayerApiOrdersResponseSchema } from '../schemas/relayer_api_orders_response_schema';
+import { relayerApiOrdersSchema } from '../schemas/relayer_api_orders_schema';
import { signedOrdersSchema } from '../schemas/signed_orders_schema';
import { tokenSchema } from '../schemas/token_schema';
import { jsNumber, txDataSchema } from '../schemas/tx_data_schema';
@@ -31,8 +35,10 @@ import { jsNumber, txDataSchema } from '../schemas/tx_data_schema';
export const schemas = {
numberSchema,
addressSchema,
- ecSignatureSchema,
+ callDataSchema,
+ hexSchema,
ecSignatureParameterSchema,
+ ecSignatureSchema,
indexFilterValuesSchema,
orderCancellationRequestsSchema,
orderFillOrKillRequestsSchema,
@@ -41,20 +47,25 @@ export const schemas = {
orderSchema,
signedOrderSchema,
signedOrdersSchema,
+ ordersSchema,
blockParamSchema,
blockRangeSchema,
tokenSchema,
jsNumber,
txDataSchema,
+ paginatedCollectionSchema,
relayerApiErrorResponseSchema,
- relayerApiFeesPayloadSchema,
- relayerApiFeesResponseSchema,
- relayerApiOrderBookResponseSchema,
- relayerApiTokenPairsResponseSchema,
- relayerApiTokenTradeInfoSchema,
- relayerApiOrderbookChannelSubscribeSchema,
- relayerApiOrderbookChannelSubscribePayload,
- relayerApiOrderbookChannelUpdateSchema,
- relayerApiOrderbookChannelSnapshotSchema,
- relayerApiOrderbookChannelSnapshotPayload,
+ relayerApiFeeRecipientsResponseSchema,
+ relayerApiOrderSchema,
+ relayerApiOrdersSchema,
+ relayerApiOrderConfigPayloadSchema,
+ relayerApiOrderConfigResponseSchema,
+ relayerApiOrderbookResponseSchema,
+ relayerApiAssetDataPairsResponseSchema,
+ relayerApiAssetDataTradeInfoSchema,
+ relayerApiOrdersChannelSubscribeSchema,
+ relayerApiOrdersChannelSubscribePayload,
+ relayerApiOrdersChannelUpdateSchema,
+ relayerApiOrdersResponseSchema,
+ relayerApiAssetDataPairsSchema,
};
diff --git a/packages/json-schemas/test/schema_test.ts b/packages/json-schemas/test/schema_test.ts
index 7b058781d..4e0f66ef5 100644
--- a/packages/json-schemas/test/schema_test.ts
+++ b/packages/json-schemas/test/schema_test.ts
@@ -13,8 +13,7 @@ const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
const {
numberSchema,
addressSchema,
- ecSignatureSchema,
- ecSignatureParameterSchema,
+ hexSchema,
orderCancellationRequestsSchema,
orderFillOrKillRequestsSchema,
orderFillRequestsSchema,
@@ -27,14 +26,16 @@ const {
tokenSchema,
jsNumber,
txDataSchema,
+ paginatedCollectionSchema,
relayerApiErrorResponseSchema,
- relayerApiOrderBookResponseSchema,
- relayerApiTokenPairsResponseSchema,
- relayerApiFeesPayloadSchema,
- relayerApiFeesResponseSchema,
- relayerApiOrderbookChannelSubscribeSchema,
- relayerApiOrderbookChannelUpdateSchema,
- relayerApiOrderbookChannelSnapshotSchema,
+ relayerApiOrderbookResponseSchema,
+ relayerApiAssetDataPairsResponseSchema,
+ relayerApiOrderConfigPayloadSchema,
+ relayerApiOrderConfigResponseSchema,
+ relayerApiOrdersChannelSubscribeSchema,
+ relayerApiOrdersChannelUpdateSchema,
+ relayerApiOrdersResponseSchema,
+ relayerApiOrderSchema,
} = schemas;
describe('Schema', () => {
@@ -56,6 +57,11 @@ describe('Schema', () => {
}
});
};
+ const paginatedResponse = {
+ total: 100,
+ perPage: 10,
+ page: 3,
+ };
describe('#numberSchema', () => {
it('should validate valid numbers', () => {
const testCases = ['42', '0', '1.3', '0.2', '00.00'];
@@ -84,47 +90,15 @@ describe('Schema', () => {
validateAgainstSchema(testCases, addressSchema, shouldFail);
});
});
- describe('#ecSignatureParameterSchema', () => {
- it('should validate valid parameters', () => {
- const testCases = [
- '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
- '0X40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
- ];
- validateAgainstSchema(testCases, ecSignatureParameterSchema);
- });
- it('should fail for invalid parameters', () => {
- const testCases = [
- '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3', // shorter
- '0xzzzz9190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254', // invalid characters
- '40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254', // no 0x
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, ecSignatureParameterSchema, shouldFail);
- });
- });
- describe('#ecSignatureSchema', () => {
- it('should validate valid signature', () => {
- const signature = {
- v: 27,
- r: '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
- s: '0x40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
- };
- const testCases = [
- signature,
- {
- ...signature,
- v: 28,
- },
- ];
- validateAgainstSchema(testCases, ecSignatureSchema);
+ describe('#hexSchema', () => {
+ it('should validate valid hex string', () => {
+ const testCases = ['0x8b0292b11a196601ed2ce54b665cafeca0347d42', NULL_ADDRESS];
+ validateAgainstSchema(testCases, hexSchema);
});
- it('should fail for invalid signature', () => {
- const v = 27;
- const r = '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33';
- const s = '0x40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254';
- const testCases = [{}, { v }, { r, s, v: 31 }];
+ it('should fail for invalid hex string', () => {
+ const testCases = ['0', '0xzzzzzzB11a196601eD2ce54B665CaFEca0347D42'];
const shouldFail = true;
- validateAgainstSchema(testCases, ecSignatureSchema, shouldFail);
+ validateAgainstSchema(testCases, hexSchema, shouldFail);
});
});
describe('#orderHashSchema', () => {
@@ -148,7 +122,8 @@ describe('Schema', () => {
});
describe('#blockParamSchema', () => {
it('should validate valid block param', () => {
- const testCases = [42, 'latest', 'pending', 'earliest'];
+ const blockNumber = 42;
+ const testCases = [blockNumber, 'latest', 'pending', 'earliest'];
validateAgainstSchema(testCases, blockParamSchema);
});
it('should fail for invalid block param', () => {
@@ -181,6 +156,7 @@ describe('Schema', () => {
validateAgainstSchema(testCases, tokenSchema);
});
it('should fail for invalid token', () => {
+ const num = 4;
const testCases = [
{
...token,
@@ -191,26 +167,60 @@ describe('Schema', () => {
decimals: undefined,
},
[],
- 4,
+ num,
];
const shouldFail = true;
validateAgainstSchema(testCases, tokenSchema, shouldFail);
});
});
+ describe('#paginatedCollectionSchema', () => {
+ it('should validate valid paginated collections', () => {
+ const testCases = [paginatedResponse];
+ validateAgainstSchema(testCases, paginatedCollectionSchema);
+ });
+ it('should fail for invalid paginated collections', () => {
+ const paginatedCollectionNoTotal = {
+ page: 10,
+ perPage: 2,
+ };
+ const paginatedCollectionNoPerPage = {
+ page: 10,
+ total: 100,
+ };
+ const paginatedCollectionNoPage = {
+ total: 10,
+ perPage: 20,
+ };
+ const testCases = [{}, paginatedCollectionNoPage, paginatedCollectionNoPerPage, paginatedCollectionNoTotal];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, paginatedCollectionSchema, shouldFail);
+ });
+ });
describe('order including schemas', () => {
const order = {
- maker: NULL_ADDRESS,
- taker: NULL_ADDRESS,
+ makerAddress: NULL_ADDRESS,
+ takerAddress: NULL_ADDRESS,
+ senderAddress: NULL_ADDRESS,
makerFee: '1',
takerFee: '2',
- makerTokenAmount: '1',
- takerTokenAmount: '2',
- makerTokenAddress: NULL_ADDRESS,
- takerTokenAddress: NULL_ADDRESS,
+ makerAssetAmount: '1',
+ takerAssetAmount: '2',
+ makerAssetData: NULL_ADDRESS,
+ takerAssetData: NULL_ADDRESS,
salt: '67006738228878699843088602623665307406148487219438534730168799356281242528500',
- feeRecipient: NULL_ADDRESS,
- exchangeContractAddress: NULL_ADDRESS,
- expirationUnixTimestampSec: '42',
+ feeRecipientAddress: NULL_ADDRESS,
+ exchangeAddress: NULL_ADDRESS,
+ expirationTimeSeconds: '42',
+ };
+ const relayerApiOrder = {
+ order,
+ metaData: {
+ someMetaData: 5,
+ },
+ };
+ const relayerApiOrdersResponse = {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
};
describe('#orderSchema', () => {
it('should validate valid order', () => {
@@ -236,11 +246,8 @@ describe('Schema', () => {
describe('signed order including schemas', () => {
const signedOrder = {
...order,
- ecSignature: {
- v: 27,
- r: '0x61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
- s: '0x40349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
- },
+ signature:
+ '0x031b61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace2254',
};
describe('#signedOrdersSchema', () => {
it('should validate valid signed orders', () => {
@@ -262,7 +269,7 @@ describe('Schema', () => {
const testCases = [
{
...signedOrder,
- ecSignature: undefined,
+ signature: undefined,
},
];
const shouldFail = true;
@@ -341,303 +348,452 @@ describe('Schema', () => {
validateAgainstSchema(testCases, orderFillRequestsSchema, shouldFail);
});
});
- describe('#relayerApiOrderBookResponseSchema', () => {
- it('should validate valid order book responses', () => {
- const testCases = [
- {
- bids: [],
- asks: [],
- },
- {
- bids: [signedOrder, signedOrder],
- asks: [],
- },
- {
- bids: [],
- asks: [signedOrder, signedOrder],
- },
- {
- bids: [signedOrder],
- asks: [signedOrder, signedOrder],
- },
- ];
- validateAgainstSchema(testCases, relayerApiOrderBookResponseSchema);
+ describe('standard relayer api schemas', () => {
+ describe('#relayerApiOrderSchema', () => {
+ it('should validate valid relayer api order', () => {
+ const testCases = [relayerApiOrder];
+ validateAgainstSchema(testCases, relayerApiOrderSchema);
+ });
+ it('should fail for invalid relayer api orders', () => {
+ const testCases = [{}, order, { order }, { order, metaData: 5 }];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrderSchema, shouldFail);
+ });
});
- it('should fail for invalid order fill requests', () => {
- const testCases = [
- {},
- {
- bids: [signedOrder, signedOrder],
- },
- {
- asks: [signedOrder, signedOrder],
- },
- {
- bids: signedOrder,
- asks: [signedOrder, signedOrder],
- },
- {
- bids: [signedOrder],
- asks: signedOrder,
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiOrderBookResponseSchema, shouldFail);
+ describe('#relayerApiErrorResponseSchema', () => {
+ it('should validate valid errorResponse', () => {
+ const testCases = [
+ {
+ code: 102,
+ reason: 'Order submission disabled',
+ },
+ {
+ code: 101,
+ reason: 'Validation failed',
+ validationErrors: [
+ {
+ field: 'maker',
+ code: 1002,
+ reason: 'Invalid address',
+ },
+ ],
+ },
+ ];
+ validateAgainstSchema(testCases, relayerApiErrorResponseSchema);
+ });
+ it('should fail for invalid error responses', () => {
+ const testCases = [
+ {},
+ {
+ code: 102,
+ },
+ {
+ code: '102',
+ reason: 'Order submission disabled',
+ },
+ {
+ reason: 'Order submission disabled',
+ },
+ {
+ code: 101,
+ reason: 'Validation failed',
+ validationErrors: [
+ {
+ field: 'maker',
+ reason: 'Invalid address',
+ },
+ ],
+ },
+ {
+ code: 101,
+ reason: 'Validation failed',
+ validationErrors: [
+ {
+ field: 'maker',
+ code: '1002',
+ reason: 'Invalid address',
+ },
+ ],
+ },
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiErrorResponseSchema, shouldFail);
+ });
});
- });
- describe('#relayerApiOrderbookChannelSubscribeSchema', () => {
- it('should validate valid orderbook channel websocket subscribe message', () => {
- const testCases = [
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- snapshot: true,
- limit: 100,
+ describe('#relayerApiOrderConfigPayloadSchema', () => {
+ it('should validate valid fees payloads', () => {
+ const testCases = [
+ {
+ exchangeAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ makerAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ takerAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ makerAssetData: NULL_ADDRESS,
+ takerAssetData: NULL_ADDRESS,
+ makerAssetAmount: '10000000000000000000',
+ takerAssetAmount: '30000000000000000000',
+ expirationTimeSeconds: '42',
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ ];
+ validateAgainstSchema(testCases, relayerApiOrderConfigPayloadSchema);
+ });
+ it('should fail for invalid fees payloads', () => {
+ const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
+ const testCases = [
+ {},
+ {
+ makerAssetAmount: '10000000000000000000',
+ takerAssetAmount: '30000000000000000000',
+ makerAssetData: NULL_ADDRESS,
+ takerAssetData: NULL_ADDRESS,
},
- },
- ];
- validateAgainstSchema(testCases, relayerApiOrderbookChannelSubscribeSchema);
+ {
+ takerAddress: checksummedAddress,
+ makerAssetAmount: '10000000000000000000',
+ takerAssetAmount: '30000000000000000000',
+ },
+ {
+ makerAssetAmount: 10000000000000000000,
+ takerAssetAmount: 30000000000000000000,
+ },
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrderConfigPayloadSchema, shouldFail);
+ });
});
- it('should fail for invalid orderbook channel websocket subscribe message', () => {
- const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
- const testCases = [
- {
- type: 'subscribe',
- channel: 'orderbook',
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- snapshot: true,
- limit: 100,
+ describe('#relayerApiOrderConfigResponseSchema', () => {
+ it('should validate valid fees responses', () => {
+ const testCases = [
+ {
+ makerFee: '10000000000000000',
+ takerFee: '30000000000000000',
+ feeRecipientAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ senderAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
},
- },
- {
- type: 'foo',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ ];
+ validateAgainstSchema(testCases, relayerApiOrderConfigResponseSchema);
+ });
+ it('should fail for invalid fees responses', () => {
+ const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
+ const testCases = [
+ {},
+ {
+ makerFee: 10000000000000000,
+ takerFee: 30000000000000000,
},
- },
- {
- type: 'subscribe',
- channel: 'bar',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ {
+ feeRecipient: checksummedAddress,
+ takerToSpecify: checksummedAddress,
+ makerFee: '10000000000000000',
+ takerFee: '30000000000000000',
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: checksummedAddress,
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrderConfigResponseSchema, shouldFail);
+ });
+ });
+ describe('#relayerAssetDataPairsResponseSchema', () => {
+ it('should validate valid assetPairs response', () => {
+ const testCases = [
+ {
+ ...paginatedResponse,
+ records: [],
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: checksummedAddress,
+ {
+ ...paginatedResponse,
+ records: [
+ {
+ assetDataA: {
+ assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ minAmount: '0',
+ maxAmount: '10000000000000000000',
+ precision: 5,
+ },
+ assetDataB: {
+ assetData: '0xef7fff64389b814a946f3e92105513705ca6b990',
+ minAmount: '0',
+ maxAmount: '50000000000000000000',
+ precision: 5,
+ },
+ },
+ ],
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ {
+ ...paginatedResponse,
+ records: [
+ {
+ assetDataA: {
+ assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ },
+ assetDataB: {
+ assetData: '0xef7fff64389b814a946f3e92105513705ca6b990',
+ },
+ },
+ ],
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ ];
+ validateAgainstSchema(testCases, relayerApiAssetDataPairsResponseSchema);
+ });
+ it('should fail for invalid assetPairs responses', () => {
+ const testCases = [
+ {
+ ...paginatedResponse,
+ records: [
+ {
+ assetDataA: {
+ assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ minAmount: '0',
+ maxAmount: '10000000000000000000',
+ precision: 5,
+ },
+ assetDataC: {
+ assetData: '0xef7fff64389b814a946f3e92105513705ca6b990',
+ minAmount: '0',
+ maxAmount: '50000000000000000000',
+ precision: 5,
+ },
+ },
+ ],
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- snapshot: 'true',
- limit: 100,
+ {
+ records: [
+ {
+ assetDataA: {
+ assetData: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
+ minAmount: '0',
+ maxAmount: '10000000000000000000',
+ precision: 5,
+ },
+ assetDataB: {
+ assetData: '0xef7fff64389b814a946f3e92105513705ca6b990',
+ minAmount: '0',
+ maxAmount: '50000000000000000000',
+ precision: 5,
+ },
+ },
+ ],
},
- },
- {
- type: 'subscribe',
- channel: 'orderbook',
- requestId: 1,
- payload: {
- baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- quoteTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- snapshot: true,
- limit: '100',
+ {
+ ...paginatedResponse,
+ records: [
+ {
+ assetDataA: {
+ minAmount: '0',
+ maxAmount: '10000000000000000000',
+ precision: 5,
+ },
+ assetDataB: {
+ minAmount: '0',
+ maxAmount: '50000000000000000000',
+ precision: 5,
+ },
+ },
+ ],
},
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiOrderbookChannelSubscribeSchema, shouldFail);
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiAssetDataPairsResponseSchema, shouldFail);
+ });
});
- });
- describe('#relayerApiOrderbookChannelSnapshotSchema', () => {
- it('should validate valid orderbook channel websocket snapshot message', () => {
- const testCases = [
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [],
- asks: [],
+ describe('#relayerApiOrdersResponseSchema', () => {
+ it('should validate valid orders responses', () => {
+ const testCases = [
+ relayerApiOrdersResponse,
+ {
+ ...paginatedResponse,
+ records: [],
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [signedOrder],
- asks: [signedOrder],
+ ];
+ validateAgainstSchema(testCases, relayerApiOrdersResponseSchema);
+ });
+ it('should fail for invalid orders responses', () => {
+ const testCases = [
+ {
+ records: [relayerApiOrder, relayerApiOrder],
},
- },
- ];
- validateAgainstSchema(testCases, relayerApiOrderbookChannelSnapshotSchema);
- });
- it('should fail for invalid orderbook channel websocket snapshot message', () => {
- const testCases = [
- {
- type: 'foo',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [signedOrder],
- asks: [signedOrder],
+ {
+ ...paginatedResponse,
},
- },
- {
- type: 'snapshot',
- channel: 'bar',
- requestId: 2,
- payload: {
- bids: [signedOrder],
- asks: [signedOrder],
+ {
+ ...paginatedResponse,
+ records: [{}, relayerApiOrder],
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- payload: {
- bids: [signedOrder],
- asks: [signedOrder],
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrdersResponseSchema, shouldFail);
+ });
+ });
+ describe('#relayerApiOrderbookResponseSchema', () => {
+ it('should validate valid order book responses', () => {
+ const testCases = [
+ {
+ bids: {
+ ...paginatedResponse,
+ records: [relayerApiOrder],
+ },
+ asks: {
+ ...paginatedResponse,
+ records: [],
+ },
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: '2',
- payload: {
- bids: [signedOrder],
- asks: [signedOrder],
+ {
+ bids: {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
+ },
+ asks: {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
+ },
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [signedOrder],
+ {
+ bids: {
+ ...paginatedResponse,
+ records: [],
+ },
+ asks: {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
+ },
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- asks: [signedOrder],
+ ];
+ validateAgainstSchema(testCases, relayerApiOrderbookResponseSchema);
+ });
+ it('should fail for invalid order fill requests', () => {
+ const testCases = [
+ {},
+ {
+ bids: {
+ records: [relayerApiOrder],
+ },
+ asks: {
+ ...paginatedResponse,
+ records: [],
+ },
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [signedOrder],
- asks: [{}],
+ {
+ bids: {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
+ },
+ asks: {},
},
- },
- {
- type: 'snapshot',
- channel: 'orderbook',
- requestId: 2,
- payload: {
- bids: [{}],
- asks: [signedOrder],
+ {
+ bids: {
+ ...paginatedResponse,
+ },
+ asks: {
+ ...paginatedResponse,
+ records: [relayerApiOrder, relayerApiOrder],
+ },
},
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiOrderbookChannelSnapshotSchema, shouldFail);
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrdersResponseSchema, shouldFail);
+ });
});
- });
- describe('#relayerApiOrderbookChannelUpdateSchema', () => {
- it('should validate valid orderbook channel websocket update message', () => {
- const testCases = [
- {
- type: 'update',
- channel: 'orderbook',
- requestId: 2,
- payload: signedOrder,
- },
- ];
- validateAgainstSchema(testCases, relayerApiOrderbookChannelUpdateSchema);
+ describe('#relayerApiOrdersChannelSubscribeSchema', () => {
+ it('should validate valid orders channel websocket subscribe message', () => {
+ const testCases = [
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ requestId: 'randomId',
+ },
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: {
+ makerAssetProxyId: '0x02571792',
+ takerAssetProxyId: '0xf47261b0',
+ },
+ },
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: {},
+ },
+ ];
+ validateAgainstSchema(testCases, relayerApiOrdersChannelSubscribeSchema);
+ });
+ it('should fail for invalid orders channel websocket subscribe message', () => {
+ const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
+ const testCases = [
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ },
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: {
+ makerAssetProxyId: '0x02571792',
+ takerAssetProxyId: '0xf47261b0',
+ makerAssetAddress: checksummedAddress,
+ },
+ },
+ {
+ type: 'subscribe',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: {
+ makerAssetProxyId: 'invalidId',
+ },
+ },
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrdersChannelSubscribeSchema, shouldFail);
+ });
});
- it('should fail for invalid orderbook channel websocket update message', () => {
- const testCases = [
- {
- type: 'foo',
- channel: 'orderbook',
- requestId: 2,
- payload: signedOrder,
- },
- {
- type: 'update',
- channel: 'bar',
- requestId: 2,
- payload: signedOrder,
- },
- {
- type: 'update',
- channel: 'orderbook',
- requestId: 2,
- payload: {},
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiOrderbookChannelUpdateSchema, shouldFail);
+ describe('#relayerApiOrdersChannelUpdateSchema', () => {
+ it('should validate valid orders channel websocket update message', () => {
+ const testCases = [
+ {
+ type: 'update',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: [relayerApiOrder],
+ },
+ {
+ type: 'update',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: [],
+ },
+ ];
+ validateAgainstSchema(testCases, relayerApiOrdersChannelUpdateSchema);
+ });
+ it('should fail for invalid orders channel websocket update message', () => {
+ const testCases = [
+ {
+ type: 'foo',
+ channel: 'orders',
+ requestId: 'randomId',
+ },
+ {
+ type: 'update',
+ channel: 'bar',
+ requestId: 2,
+ payload: [relayerApiOrder],
+ },
+ {
+ type: 'update',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: {},
+ },
+ {
+ type: 'update',
+ channel: 'orders',
+ requestId: 'randomId',
+ payload: relayerApiErrorResponseSchema,
+ },
+ ];
+ const shouldFail = true;
+ validateAgainstSchema(testCases, relayerApiOrdersChannelUpdateSchema, shouldFail);
+ });
});
});
});
@@ -657,223 +813,14 @@ describe('Schema', () => {
});
});
});
- describe('#relayerApiErrorResponseSchema', () => {
- it('should validate valid errorResponse', () => {
- const testCases = [
- {
- code: 102,
- reason: 'Order submission disabled',
- },
- {
- code: 101,
- reason: 'Validation failed',
- validationErrors: [
- {
- field: 'maker',
- code: 1002,
- reason: 'Invalid address',
- },
- ],
- },
- ];
- validateAgainstSchema(testCases, relayerApiErrorResponseSchema);
- });
- it('should fail for invalid error responses', () => {
- const testCases = [
- {},
- {
- code: 102,
- },
- {
- code: '102',
- reason: 'Order submission disabled',
- },
- {
- reason: 'Order submission disabled',
- },
- {
- code: 101,
- reason: 'Validation failed',
- validationErrors: [
- {
- field: 'maker',
- reason: 'Invalid address',
- },
- ],
- },
- {
- code: 101,
- reason: 'Validation failed',
- validationErrors: [
- {
- field: 'maker',
- code: '1002',
- reason: 'Invalid address',
- },
- ],
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiErrorResponseSchema, shouldFail);
- });
- });
- describe('#relayerApiFeesPayloadSchema', () => {
- it('should validate valid fees payloads', () => {
- const testCases = [
- {
- exchangeContractAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- maker: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- taker: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
- makerTokenAmount: '10000000000000000000',
- takerTokenAmount: '30000000000000000000',
- expirationUnixTimestampSec: '42',
- salt: '67006738228878699843088602623665307406148487219438534730168799356281242528500',
- },
- ];
- validateAgainstSchema(testCases, relayerApiFeesPayloadSchema);
- });
- it('should fail for invalid fees payloads', () => {
- const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
- const testCases = [
- {},
- {
- takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
- makerTokenAmount: '10000000000000000000',
- takerTokenAmount: '30000000000000000000',
- },
- {
- taker: checksummedAddress,
- makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
- makerTokenAmount: '10000000000000000000',
- takerTokenAmount: '30000000000000000000',
- },
- {
- makerTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- takerTokenAddress: '0xef7fff64389b814a946f3e92105513705ca6b990',
- makerTokenAmount: 10000000000000000000,
- takerTokenAmount: 30000000000000000000,
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiFeesPayloadSchema, shouldFail);
- });
- });
- describe('#relayerApiFeesResponseSchema', () => {
- it('should validate valid fees responses', () => {
- const testCases = [
- {
- makerFee: '10000000000000000',
- takerFee: '30000000000000000',
- feeRecipient: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- },
- ];
- validateAgainstSchema(testCases, relayerApiFeesResponseSchema);
- });
- it('should fail for invalid fees responses', () => {
- const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
- const testCases = [
- {},
- {
- makerFee: 10000000000000000,
- takerFee: 30000000000000000,
- },
- {
- feeRecipient: checksummedAddress,
- takerToSpecify: checksummedAddress,
- makerFee: '10000000000000000',
- takerFee: '30000000000000000',
- },
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiFeesResponseSchema, shouldFail);
- });
- });
- describe('#relayerApiTokenPairsResponseSchema', () => {
- it('should validate valid tokenPairs response', () => {
- const testCases = [
- [],
- [
- {
- tokenA: {
- address: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- minAmount: '0',
- maxAmount: '10000000000000000000',
- precision: 5,
- },
- tokenB: {
- address: '0xef7fff64389b814a946f3e92105513705ca6b990',
- minAmount: '0',
- maxAmount: '50000000000000000000',
- precision: 5,
- },
- },
- ],
- [
- {
- tokenA: {
- address: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- },
- tokenB: {
- address: '0xef7fff64389b814a946f3e92105513705ca6b990',
- },
- },
- ],
- ];
- validateAgainstSchema(testCases, relayerApiTokenPairsResponseSchema);
- });
- it('should fail for invalid tokenPairs responses', () => {
- const checksummedAddress = '0xA2b31daCf30a9C50ca473337c01d8A201ae33e32';
- const testCases = [
- [
- {
- tokenA: {
- address: checksummedAddress,
- },
- tokenB: {
- address: checksummedAddress,
- },
- },
- ],
- [
- {
- tokenA: {
- address: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- minAmount: 0,
- maxAmount: 10000000000000000000,
- },
- tokenB: {
- address: '0xef7fff64389b814a946f3e92105513705ca6b990',
- minAmount: 0,
- maxAmount: 50000000000000000000,
- },
- },
- ],
- [
- {
- tokenA: {
- address: '0x323b5d4c32345ced77393b3530b1eed0f346429d',
- precision: '5',
- },
- tokenB: {
- address: '0xef7fff64389b814a946f3e92105513705ca6b990',
- precision: '5',
- },
- },
- ],
- ];
- const shouldFail = true;
- validateAgainstSchema(testCases, relayerApiTokenPairsResponseSchema, shouldFail);
- });
- });
describe('#jsNumberSchema', () => {
it('should validate valid js number', () => {
+ // tslint:disable-next-line:custom-no-magic-numbers
const testCases = [1, 42];
validateAgainstSchema(testCases, jsNumber);
});
it('should fail for invalid js number', () => {
+ // tslint:disable-next-line:custom-no-magic-numbers
const testCases = [NaN, -1, new BigNumber(1)];
const shouldFail = true;
validateAgainstSchema(testCases, jsNumber, shouldFail);
@@ -881,13 +828,14 @@ describe('Schema', () => {
});
describe('#txDataSchema', () => {
it('should validate valid txData', () => {
+ const bigNumGasAmount = new BigNumber(42);
const testCases = [
{
from: NULL_ADDRESS,
},
{
from: NULL_ADDRESS,
- gas: new BigNumber(42),
+ gas: bigNumGasAmount,
},
{
from: NULL_ADDRESS,
@@ -901,10 +849,6 @@ describe('Schema', () => {
{
gas: new BigNumber(42),
},
- {
- from: NULL_ADDRESS,
- unknownProp: 'here',
- },
{},
[],
new BigNumber(1),
diff --git a/packages/metacoin/README.md b/packages/metacoin/README.md
new file mode 100644
index 000000000..15816cc67
--- /dev/null
+++ b/packages/metacoin/README.md
@@ -0,0 +1,97 @@
+## @0xproject/metacoin
+
+This is an example project that demonstrates how the many Ethereum dev tools developed by 0x can be used in any Solidity/TS project.
+It supports:
+
+* Compiling & testing smart contracts
+* Generating typed contract wrappers
+* Solidity coverage
+* Solidity gas profiling
+* Running tests against Ganache
+* Running tests against our fork of Geth (it supports snapshotting & time travel)
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/metacoin yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/metacoin yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Test providers
+
+By default tests run against an in-process Ganache instance. If you want to use Geth you'll need to [start a Geth dev node](https://github.com/0xProject/0x-monorepo/blob/v2-prototype/packages/devnet/README.md) first.
+
+```bash
+cd ../devnet
+docker build -t 0x-devnet .
+docker run -it --rm -p 8501:8501 0x-devnet
+```
+
+This Geth version supports snapshots and time travel. Then - run your tests against it.
+
+```
+TEST_PROVIDER=geth yarn test
+```
+
+### Coverage
+
+```bash
+yarn test:coverage
+yarn coverage:report:html
+```
+
+### Profiling
+
+Please note that traces emitted by ganache have incorrect gas costs so we recommend using Geth for profiling.
+
+```bash
+TEST_PROVIDER=geth yarn test:profile
+```
+
+You'll see a warning that you need to explicitly enable and disable the profiler before and after the block of code you want to profile.
+
+```typescript
+import { profiler } from './utils/profiler';
+profiler.start();
+// Some solidity stuff
+profiler.stop();
+```
diff --git a/packages/metacoin/compiler.json b/packages/metacoin/compiler.json
new file mode 100644
index 000000000..f5817e0c8
--- /dev/null
+++ b/packages/metacoin/compiler.json
@@ -0,0 +1,15 @@
+{
+ "compilerSettings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+}
diff --git a/packages/metacoin/contracts/Metacoin.sol b/packages/metacoin/contracts/Metacoin.sol
new file mode 100644
index 000000000..dc67e6242
--- /dev/null
+++ b/packages/metacoin/contracts/Metacoin.sol
@@ -0,0 +1,40 @@
+pragma solidity ^0.4.24;
+pragma experimental ABIEncoderV2;
+
+contract Metacoin {
+ mapping (address => uint) public balances;
+
+ event Transfer(address indexed _from, address indexed _to, uint256 _value);
+
+ struct TransferData {
+ address to;
+ uint256 amount;
+ }
+
+ struct NestedTransferData {
+ TransferData transferData;
+ uint32 callback;
+ }
+
+ constructor () public {
+ balances[msg.sender] = 10000;
+ }
+
+ function transfer(TransferData transferData) public returns (bool success) {
+ if (balances[msg.sender] < transferData.amount) return false;
+ balances[msg.sender] -= transferData.amount;
+ balances[transferData.to] += transferData.amount;
+ emit Transfer(msg.sender, transferData.to, transferData.amount);
+ return true;
+ }
+
+ function transfer(TransferData transferData, uint32 callback) public returns (int) {
+ transfer(transferData);
+ return callback;
+ }
+
+ function transfer(NestedTransferData nestedTransferData) public returns (int) {
+ return transfer(nestedTransferData.transferData, nestedTransferData.callback);
+ }
+
+}
diff --git a/packages/metacoin/coverage/.gitkeep b/packages/metacoin/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/metacoin/coverage/.gitkeep
diff --git a/packages/metacoin/package.json b/packages/metacoin/package.json
new file mode 100644
index 000000000..6900da198
--- /dev/null
+++ b/packages/metacoin/package.json
@@ -0,0 +1,61 @@
+{
+ "name": "@0xproject/metacoin",
+ "version": "0.0.15",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "private": true,
+ "description": "Example solidity project using 0x dev tools",
+ "scripts": {
+ "lint": "tslint --project . --exclude **/src/contract_wrappers/**/*",
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc",
+ "pre_build": "run-s compile generate_contract_wrappers copy_artifacts",
+ "clean": "shx rm -rf lib artifacts src/contract_wrappers",
+ "copy_artifacts": "copyfiles './artifacts/**/*' './contracts/**/*' ./lib",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
+ "test:coverage": "SOLIDITY_COVERAGE=true run-s build run_mocha coverage:report:text coverage:report:lcov",
+ "test:profile": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js lib/test/global_hooks.js --bail --exit --timeout 10000",
+ "generate_contract_wrappers": "abi-gen --abis 'artifacts/Metacoin.json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/contract_wrappers --backend ethers",
+ "coverage:report:text": "istanbul report text",
+ "coverage:report:html": "istanbul report html && open coverage/index.html",
+ "profiler:report:html": "istanbul report html && open coverage/index.html",
+ "coverage:report:lcov": "istanbul report lcov",
+ "test:circleci": "yarn test:coverage",
+ "compile": "sol-compiler compile"
+ },
+ "author": "",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/sol-cov": "^2.0.0",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@types/mocha": "^5.2.2",
+ "copyfiles": "^2.0.0",
+ "ethereum-types": "^1.0.4",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5",
+ "run-s": "^0.0.0"
+ },
+ "devDependencies": {
+ "@0xproject/dev-utils": "^1.0.4",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "chai-bignumber": "^2.0.1",
+ "dirty-chai": "^2.0.1",
+ "make-promises-safe": "^1.1.0",
+ "npm-run-all": "^4.1.2",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
+ }
+}
diff --git a/packages/metacoin/src/global.d.ts b/packages/metacoin/src/global.d.ts
new file mode 100644
index 000000000..783b92913
--- /dev/null
+++ b/packages/metacoin/src/global.d.ts
@@ -0,0 +1,4 @@
+declare module '*.json' {
+ const value: any;
+ export default value;
+}
diff --git a/packages/metacoin/test/global_hooks.ts b/packages/metacoin/test/global_hooks.ts
new file mode 100644
index 000000000..7328531e4
--- /dev/null
+++ b/packages/metacoin/test/global_hooks.ts
@@ -0,0 +1,15 @@
+import { env, EnvVars } from '@0xproject/dev-utils';
+
+import { coverage } from './utils/coverage';
+import { profiler } from './utils/profiler';
+
+after('generate coverage || profiler report', async () => {
+ if (env.parseBoolean(EnvVars.SolidityCoverage)) {
+ const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
+ await coverageSubprovider.writeCoverageAsync();
+ }
+ if (env.parseBoolean(EnvVars.SolidityProfiler)) {
+ const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
+ await profilerSubprovider.writeProfilerOutputAsync();
+ }
+});
diff --git a/packages/metacoin/test/metacoin_test.ts b/packages/metacoin/test/metacoin_test.ts
new file mode 100644
index 000000000..803e5f786
--- /dev/null
+++ b/packages/metacoin/test/metacoin_test.ts
@@ -0,0 +1,121 @@
+import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
+import { ContractArtifact } from '@0xproject/sol-compiler';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { LogWithDecodedArgs } from 'ethereum-types';
+
+import * as MetacoinArtifact from '../artifacts/Metacoin.json';
+import { MetacoinContract, MetacoinTransferEventArgs } from '../src/contract_wrappers/metacoin';
+
+import { chaiSetup } from './utils/chai_setup';
+import { config } from './utils/config';
+// Comment out the next line enable profiling
+// import { profiler } from './utils/profiler';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+const artifact: ContractArtifact = MetacoinArtifact as any;
+
+chaiSetup.configure();
+const { expect } = chai;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+// tslint:disable:no-unnecessary-type-assertion
+describe('Metacoin', () => {
+ let metacoin: MetacoinContract;
+ const ownerAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const INITIAL_BALANCE = new BigNumber(10000);
+ before(async () => {
+ metacoin = await MetacoinContract.deployFrom0xArtifactAsync(artifact, provider, config.txDefaults);
+ web3Wrapper.abiDecoder.addABI(metacoin.abi);
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#constructor', () => {
+ it(`should initialy give ${INITIAL_BALANCE} tokens to the creator`, async () => {
+ const balance = await metacoin.balances.callAsync(ownerAddress);
+ expect(balance).to.be.bignumber.equal(INITIAL_BALANCE);
+ });
+ });
+ describe('#transfer', () => {
+ it(`should successfully transfer tokens (via transfer1)`, async () => {
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
+ const amount = INITIAL_BALANCE.div(2);
+ const oldBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(oldBalance).to.be.bignumber.equal(0);
+ // profiler.start();
+ const txHash = await metacoin.transfer1.sendTransactionAsync(
+ {
+ to: ZERO_ADDRESS,
+ amount,
+ },
+ { from: devConstants.TESTRPC_FIRST_ADDRESS },
+ );
+ // profiler.stop();
+ const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ const transferLogs = txReceipt.logs[0] as LogWithDecodedArgs<MetacoinTransferEventArgs>;
+ expect(transferLogs.args).to.be.deep.equal({
+ _to: ZERO_ADDRESS,
+ _from: devConstants.TESTRPC_FIRST_ADDRESS,
+ _value: amount,
+ });
+ const newBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(newBalance).to.be.bignumber.equal(amount);
+ });
+
+ it(`should successfully transfer tokens (via transfer2)`, async () => {
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
+ const amount = INITIAL_BALANCE.div(2);
+ const oldBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(oldBalance).to.be.bignumber.equal(0);
+ const callback = 59;
+ const txHash = await metacoin.transfer2.sendTransactionAsync(
+ {
+ to: ZERO_ADDRESS,
+ amount,
+ },
+ callback,
+ { from: devConstants.TESTRPC_FIRST_ADDRESS },
+ );
+ const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ const transferLogs = txReceipt.logs[0] as LogWithDecodedArgs<MetacoinTransferEventArgs>;
+ expect(transferLogs.args).to.be.deep.equal({
+ _to: ZERO_ADDRESS,
+ _from: devConstants.TESTRPC_FIRST_ADDRESS,
+ _value: amount,
+ });
+ const newBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(newBalance).to.be.bignumber.equal(amount);
+ });
+
+ it(`should successfully transfer tokens (via transfer3)`, async () => {
+ const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
+ const amount = INITIAL_BALANCE.div(2);
+ const oldBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(oldBalance).to.be.bignumber.equal(0);
+ const callback = 59;
+ const txHash = await metacoin.transfer3.sendTransactionAsync(
+ {
+ transferData: {
+ to: ZERO_ADDRESS,
+ amount,
+ },
+ callback,
+ },
+ { from: devConstants.TESTRPC_FIRST_ADDRESS },
+ );
+ const txReceipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ const transferLogs = txReceipt.logs[0] as LogWithDecodedArgs<MetacoinTransferEventArgs>;
+ expect(transferLogs.args).to.be.deep.equal({
+ _to: ZERO_ADDRESS,
+ _from: devConstants.TESTRPC_FIRST_ADDRESS,
+ _value: amount,
+ });
+ const newBalance = await metacoin.balances.callAsync(ZERO_ADDRESS);
+ expect(newBalance).to.be.bignumber.equal(amount);
+ });
+ });
+});
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/metacoin/test/utils/chai_setup.ts b/packages/metacoin/test/utils/chai_setup.ts
new file mode 100644
index 000000000..1a8733093
--- /dev/null
+++ b/packages/metacoin/test/utils/chai_setup.ts
@@ -0,0 +1,13 @@
+import * as chai from 'chai';
+import chaiAsPromised = require('chai-as-promised');
+import ChaiBigNumber = require('chai-bignumber');
+import * as dirtyChai from 'dirty-chai';
+
+export const chaiSetup = {
+ configure(): void {
+ chai.config.includeStack = true;
+ chai.use(ChaiBigNumber());
+ chai.use(dirtyChai);
+ chai.use(chaiAsPromised);
+ },
+};
diff --git a/packages/metacoin/test/utils/config.ts b/packages/metacoin/test/utils/config.ts
new file mode 100644
index 000000000..c26fe5f25
--- /dev/null
+++ b/packages/metacoin/test/utils/config.ts
@@ -0,0 +1,12 @@
+import { devConstants } from '@0xproject/dev-utils';
+
+export const config = {
+ networkId: 50,
+ artifactsDir: 'artifacts',
+ contractsDir: 'contracts',
+ ganacheLogFile: 'ganache.log',
+ txDefaults: {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ },
+ mnemonic: 'concert load couple harbor equip island argue ramp clarify fence smart topic',
+};
diff --git a/packages/metacoin/test/utils/coverage.ts b/packages/metacoin/test/utils/coverage.ts
new file mode 100644
index 000000000..945afb0a7
--- /dev/null
+++ b/packages/metacoin/test/utils/coverage.ts
@@ -0,0 +1,21 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { CoverageSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov';
+import * as _ from 'lodash';
+
+import { config } from './config';
+
+let coverageSubprovider: CoverageSubprovider;
+
+export const coverage = {
+ getCoverageSubproviderSingleton(): CoverageSubprovider {
+ if (_.isUndefined(coverageSubprovider)) {
+ coverageSubprovider = coverage._getCoverageSubprovider();
+ }
+ return coverageSubprovider;
+ },
+ _getCoverageSubprovider(): CoverageSubprovider {
+ const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const zeroExArtifactsAdapter = new SolCompilerArtifactAdapter(config.artifactsDir, config.contractsDir);
+ return new CoverageSubprovider(zeroExArtifactsAdapter, defaultFromAddress);
+ },
+};
diff --git a/packages/metacoin/test/utils/profiler.ts b/packages/metacoin/test/utils/profiler.ts
new file mode 100644
index 000000000..701337451
--- /dev/null
+++ b/packages/metacoin/test/utils/profiler.ts
@@ -0,0 +1,27 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { ProfilerSubprovider, SolCompilerArtifactAdapter } from '@0xproject/sol-cov';
+import * as _ from 'lodash';
+
+import { config } from './config';
+
+let profilerSubprovider: ProfilerSubprovider;
+
+export const profiler = {
+ start(): void {
+ profiler.getProfilerSubproviderSingleton().start();
+ },
+ stop(): void {
+ profiler.getProfilerSubproviderSingleton().stop();
+ },
+ getProfilerSubproviderSingleton(): ProfilerSubprovider {
+ if (_.isUndefined(profilerSubprovider)) {
+ profilerSubprovider = profiler._getProfilerSubprovider();
+ }
+ return profilerSubprovider;
+ },
+ _getProfilerSubprovider(): ProfilerSubprovider {
+ const defaultFromAddress = devConstants.TESTRPC_FIRST_ADDRESS;
+ const zeroExArtifactsAdapter = new SolCompilerArtifactAdapter(config.artifactsDir, config.contractsDir);
+ return new ProfilerSubprovider(zeroExArtifactsAdapter, defaultFromAddress);
+ },
+};
diff --git a/packages/metacoin/test/utils/web3_wrapper.ts b/packages/metacoin/test/utils/web3_wrapper.ts
new file mode 100644
index 000000000..36bd6343f
--- /dev/null
+++ b/packages/metacoin/test/utils/web3_wrapper.ts
@@ -0,0 +1,76 @@
+import { env, EnvVars } from '@0xproject/dev-utils';
+import { GanacheSubprovider, prependSubprovider, RPCSubprovider, Web3ProviderEngine } from '@0xproject/subproviders';
+import { errorUtils, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as fs from 'fs';
+
+import { config } from './config';
+import { coverage } from './coverage';
+import { profiler } from './profiler';
+
+enum ProviderType {
+ Ganache = 'ganache',
+ Geth = 'geth',
+}
+
+let testProvider: ProviderType;
+switch (process.env.TEST_PROVIDER) {
+ case undefined:
+ testProvider = ProviderType.Ganache;
+ break;
+ case 'ganache':
+ testProvider = ProviderType.Ganache;
+ break;
+ case 'geth':
+ testProvider = ProviderType.Geth;
+ break;
+ default:
+ throw errorUtils.spawnSwitchErr('TEST_PROVIDER', process.env.TEST_PROVIDER);
+}
+
+export const provider = new Web3ProviderEngine();
+if (testProvider === ProviderType.Ganache) {
+ provider.addProvider(
+ new GanacheSubprovider({
+ logger: {
+ log: (arg: any) => {
+ fs.appendFileSync(config.ganacheLogFile, `${arg}\n`);
+ },
+ },
+ verbose: env.parseBoolean(EnvVars.SolidityCoverage),
+ networkId: config.networkId,
+ mnemonic: config.mnemonic,
+ }),
+ );
+} else {
+ provider.addProvider(new RPCSubprovider('http://localhost:8501'));
+}
+provider.start();
+
+const isCoverageEnabled = env.parseBoolean(EnvVars.SolidityCoverage);
+const isProfilerEnabled = env.parseBoolean(EnvVars.SolidityProfiler);
+if (isCoverageEnabled && isProfilerEnabled) {
+ throw new Error(
+ `Unfortunately for now you can't enable both coverage and profiler at the same time. They both use coverage.json file and there is no way to configure that.`,
+ );
+}
+if (isCoverageEnabled) {
+ const coverageSubprovider = coverage.getCoverageSubproviderSingleton();
+ prependSubprovider(provider, coverageSubprovider);
+}
+if (isProfilerEnabled) {
+ if (testProvider === ProviderType.Ganache) {
+ logUtils.warn(
+ "Gas costs in Ganache traces are incorrect and we don't recommend using it for profiling. Please switch to Geth. Check README for more details",
+ );
+ process.exit(1);
+ }
+ const profilerSubprovider = profiler.getProfilerSubproviderSingleton();
+ logUtils.log(
+ "By default profilerSubprovider is stopped so that you don't get noise from setup code. Don't forget to start it before the code you want to profile and stop it afterwards",
+ );
+ profilerSubprovider.stop();
+ prependSubprovider(provider, profilerSubprovider);
+}
+
+export const web3Wrapper = new Web3Wrapper(provider);
diff --git a/packages/metacoin/tsconfig.json b/packages/metacoin/tsconfig.json
new file mode 100644
index 000000000..bc3bd1e94
--- /dev/null
+++ b/packages/metacoin/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "outDir": "lib",
+ "lib": ["es2017"],
+ "skipLibCheck": true,
+ "typeRoots": [
+ "comment: for building within 0x-monorepo:",
+ "../../node_modules/@0xproject/typescript-typings/types",
+ "../../node_modules/@types",
+ "comment: for building in an isolated environment:",
+ "node_modules/@0xproject/typescript-typings/types",
+ "node_modules/@types"
+ ]
+ },
+ "include": ["src/**/*", "test/**/*"]
+}
diff --git a/packages/metacoin/tslint.json b/packages/metacoin/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/metacoin/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/migrations/CHANGELOG.json b/packages/migrations/CHANGELOG.json
new file mode 100644
index 000000000..f92bb48b4
--- /dev/null
+++ b/packages/migrations/CHANGELOG.json
@@ -0,0 +1,120 @@
+[
+ {
+ "timestamp": 1534210131,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Added migrations for 0x Protocol v2"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Use AssetProxyOwner instead of MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress",
+ "pr": 675
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524073495,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ }
+]
diff --git a/packages/migrations/CHANGELOG.md b/packages/migrations/CHANGELOG.md
new file mode 100644
index 000000000..7388c6ebc
--- /dev/null
+++ b/packages/migrations/CHANGELOG.md
@@ -0,0 +1,58 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.4 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Added migrations for 0x Protocol v2
+
+## v0.0.10 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.9 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.0.8 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _May 22, 2018_
+
+ * Use AssetProxyOwner instead of MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress (#675)
+
+## v0.0.6 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.5 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.4 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.3 - _April 18, 2018_
+
+ * Dependencies updated
diff --git a/packages/migrations/README.md b/packages/migrations/README.md
new file mode 100644
index 000000000..f4715cfa1
--- /dev/null
+++ b/packages/migrations/README.md
@@ -0,0 +1,82 @@
+## Migrations
+
+Migrate the 0x system of smart contracts on the network of your choice using these migrations.
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/migrations yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/migrations yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Migrate
+
+#### V2-beta smart contracts
+
+In order to migrate the V2-beta 0x smart contracts to Kovan using a Ledger Nano S, run:
+
+```bash
+yarn migrate:v2-beta-testnet
+```
+
+**Note:** Ledger settings `contract data` must be `on`, and `browser support` must be set to `off`.
+
+Post-publish steps:
+
+1. Since we don't re-deploy the `WETH9` nor `ZRXToken` contracts, manually copy over the artifacts for them from `2.0.0` into `2.0.0-beta-testnet` and add the Kovan & ganache addresses to both of their `networks` sections.
+2. We now need to copy over the network `50` settings from the `2.0.0` artifacts to the `2.0.0-beta-testnet` artifacts for the newly deployed contracts (e.g `Exchange`, `ERC20Proxy`, `ERC721Proxy` and `AssetProxyOwner`)
+
+#### V2 (under development) smart contracts
+
+In order to migrate the V2 (under development) 0x smart contracts to TestRPC/Ganache running at `http://localhost:8545`, run:
+
+```bash
+yarn migrate:v2
+```
+
+#### V1 smart contracts
+
+In order to migrate the V1 0x smart contracts to TestRPC/Ganache running at `http://localhost:8545`, run:
+
+```bash
+yarn migrate:v1
+```
diff --git a/packages/migrations/artifacts/1.0.0/DummyERC20Token.json b/packages/migrations/artifacts/1.0.0/DummyERC20Token.json
new file mode 100644
index 000000000..3ac218e24
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/DummyERC20Token.json
@@ -0,0 +1,375 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "DummyERC20Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "mint",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_target",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "setBalance",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ },
+ {
+ "name": "_decimals",
+ "type": "uint256"
+ },
+ {
+ "name": "_totalSupply",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b506040516200193b3803806200193b833981018060405262000037919081019062000228565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600490805190602001906200009092919062000105565b508260059080519060200190620000a992919062000105565b508160068190555080600281905550806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505062000361565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014857805160ff191683800117855562000179565b8280016001018555821562000179579182015b82811115620001785782518255916020019190600101906200015b565b5b5090506200018891906200018c565b5090565b620001b191905b80821115620001ad57600081600090555060010162000193565b5090565b90565b600082601f8301121515620001c857600080fd5b8151620001df620001d982620002f4565b620002c6565b91508082526020830160208301858383011115620001fc57600080fd5b620002098382846200032b565b50505092915050565b600062000220825162000321565b905092915050565b600080600080608085870312156200023f57600080fd5b600085015167ffffffffffffffff8111156200025a57600080fd5b6200026887828801620001b4565b945050602085015167ffffffffffffffff8111156200028657600080fd5b6200029487828801620001b4565b9350506040620002a78782880162000212565b9250506060620002ba8782880162000212565b91505092959194509250565b6000604051905081810181811067ffffffffffffffff82111715620002ea57600080fd5b8060405250919050565b600067ffffffffffffffff8211156200030c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b60005b838110156200034b5780820151818401526020810190506200032e565b838111156200035b576000848401525b50505050565b6115ca80620003716000396000f3006080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100ca578063095ea7b3146100f557806318160ddd1461013257806323b872dd1461015d578063313ce5671461019a57806370a08231146101c55780638da5cb5b1461020257806395d89b411461022d578063a0712d6814610258578063a9059cbb14610281578063dd62ed3e146102be578063e30443bc146102fb578063f2fde38b14610324575b600080fd5b3480156100d657600080fd5b506100df61034d565b6040516100ec9190611464565b60405180910390f35b34801561010157600080fd5b5061011c600480360361011791908101906112ac565b6103eb565b6040516101299190611449565b60405180910390f35b34801561013e57600080fd5b506101476104dd565b60405161015491906114c6565b60405180910390f35b34801561016957600080fd5b50610184600480360361017f919081019061125d565b6104e3565b6040516101919190611449565b60405180910390f35b3480156101a657600080fd5b506101af6109cc565b6040516101bc91906114c6565b60405180910390f35b3480156101d157600080fd5b506101ec60048036036101e791908101906111f8565b6109d2565b6040516101f991906114c6565b60405180910390f35b34801561020e57600080fd5b50610217610a1a565b604051610224919061142e565b60405180910390f35b34801561023957600080fd5b50610242610a40565b60405161024f9190611464565b60405180910390f35b34801561026457600080fd5b5061027f600480360361027a91908101906112e8565b610ade565b005b34801561028d57600080fd5b506102a860048036036102a391908101906112ac565b610bcb565b6040516102b59190611449565b60405180910390f35b3480156102ca57600080fd5b506102e560048036036102e09190810190611221565b610eda565b6040516102f291906114c6565b60405180910390f35b34801561030757600080fd5b50610322600480360361031d91908101906112ac565b610f61565b005b34801561033057600080fd5b5061034b600480360361034691908101906111f8565b61108c565b005b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103e35780601f106103b8576101008083540402835291602001916103e3565b820191906000526020600020905b8154815290600101906020018083116103c657829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104cb91906114c6565b60405180910390a36001905092915050565b60025481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015606060405190810160405280602a81526020017f496e73756666696369656e742062616c616e636520746f20636f6d706c65746581526020017f207472616e736665722e00000000000000000000000000000000000000000000815250901515610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e9190611464565b60405180910390fd5b5082811015606060405190810160405280602c81526020017f496e73756666696369656e7420616c6c6f77616e636520746f20636f6d706c6581526020017f7465207472616e736665722e00000000000000000000000000000000000000008152509015156106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e39190611464565b60405180910390fd5b506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015606060405190810160405280602581526020017f5472616e7366657220776f756c6420726573756c7420696e20616e206f76657281526020017f666c6f772e00000000000000000000000000000000000000000000000000000081525090151561080f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108069190611464565b60405180910390fd5b50826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561095b5782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516109b891906114c6565b60405180910390a360019150509392505050565b60065481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b505050505081565b68056bc75e2d631000008111151515610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b23906114a6565b60405180910390fd5b610b74816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611199565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610bc260025482611199565b60028190555050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015606060405190810160405280602a81526020017f496e73756666696369656e742062616c616e636520746f20636f6d706c65746581526020017f207472616e736665722e00000000000000000000000000000000000000000000815250901515610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69190611464565b60405180910390fd5b506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015606060405190810160405280602581526020017f5472616e7366657220776f756c6420726573756c7420696e20616e206f76657281526020017f666c6f772e000000000000000000000000000000000000000000000000000000815250901515610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99190611464565b60405180910390fd5b50816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ec891906114c6565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90611486565b60405180910390fd5b610ffe836109d2565b9050808210156110285761101d60025461101883856111b7565b6111b7565b600281905550611044565b61103d60025461103884846111b7565b611199565b6002819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590611486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156111965780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008082840190508381101515156111ad57fe5b8091505092915050565b60008282111515156111c557fe5b818303905092915050565b60006111dc8235611522565b905092915050565b60006111f08235611542565b905092915050565b60006020828403121561120a57600080fd5b6000611218848285016111d0565b91505092915050565b6000806040838503121561123457600080fd5b6000611242858286016111d0565b9250506020611253858286016111d0565b9150509250929050565b60008060006060848603121561127257600080fd5b6000611280868287016111d0565b9350506020611291868287016111d0565b92505060406112a2868287016111e4565b9150509250925092565b600080604083850312156112bf57600080fd5b60006112cd858286016111d0565b92505060206112de858286016111e4565b9150509250929050565b6000602082840312156112fa57600080fd5b6000611308848285016111e4565b91505092915050565b61131a816114ec565b82525050565b6113298161150c565b82525050565b600061133a826114e1565b80845261134e81602086016020860161154c565b6113578161157f565b602085010191505092915050565b6000603382527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208301527f6f2063616c6c2074686973206d6574686f642e000000000000000000000000006040830152606082019050919050565b6000603782527f4d696e74696e67206d6f7265207468616e20313030303030303030303030303060208301527f30303030303030206973206e6f7420616c6c6f7765642e0000000000000000006040830152606082019050919050565b61142881611518565b82525050565b60006020820190506114436000830184611311565b92915050565b600060208201905061145e6000830184611320565b92915050565b6000602082019050818103600083015261147e818461132f565b905092915050565b6000602082019050818103600083015261149f81611365565b9050919050565b600060208201905081810360008301526114bf816113c2565b9050919050565b60006020820190506114db600083018461141f565b92915050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561156a57808201518184015260208101905061154f565b83811115611579576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a723058208f9c89c6f85f64aec1e07cbf745526bbd793fd4abc535035dd77ee4efbc898c36c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x193B CODESIZE SUB DUP1 PUSH3 0x193B DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x228 JUMP JUMPDEST CALLER PUSH1 0x3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x4 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x90 SWAP3 SWAP2 SWAP1 PUSH3 0x105 JUMP JUMPDEST POP DUP3 PUSH1 0x5 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0xA9 SWAP3 SWAP2 SWAP1 PUSH3 0x105 JUMP JUMPDEST POP DUP2 PUSH1 0x6 DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x2 DUP2 SWAP1 SSTORE POP DUP1 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP POP POP POP POP PUSH3 0x361 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x148 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x179 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x179 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x178 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x15B JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x188 SWAP2 SWAP1 PUSH3 0x18C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x1B1 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x1AD JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x193 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x1F DUP4 ADD SLT ISZERO ISZERO PUSH3 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x1DF PUSH3 0x1D9 DUP3 PUSH3 0x2F4 JUMP JUMPDEST PUSH3 0x2C6 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x1FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x209 DUP4 DUP3 DUP5 PUSH3 0x32B JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x220 DUP3 MLOAD PUSH3 0x321 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH3 0x23F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x25A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x268 DUP8 DUP3 DUP9 ADD PUSH3 0x1B4 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD MLOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0x286 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x294 DUP8 DUP3 DUP9 ADD PUSH3 0x1B4 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH3 0x2A7 DUP8 DUP3 DUP9 ADD PUSH3 0x212 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 PUSH3 0x2BA DUP8 DUP3 DUP9 ADD PUSH3 0x212 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD SWAP1 POP DUP2 DUP2 ADD DUP2 DUP2 LT PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT OR ISZERO PUSH3 0x2EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x40 MSTORE POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0x30C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP PUSH1 0x20 DUP2 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x34B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH3 0x32E JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x35B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x15CA DUP1 PUSH3 0x371 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC5 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xCA JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xF5 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x15D JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x202 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x22D JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0x2FB JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x324 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x34D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x117 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0x3EB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x129 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x147 PUSH2 0x4DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x154 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x169 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x17F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x125D JUMP JUMPDEST PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x191 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x11F8 JUMP JUMPDEST PUSH2 0x9D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F9 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x217 PUSH2 0xA1A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x224 SWAP2 SWAP1 PUSH2 0x142E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x239 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH2 0xA40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x24F SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x27A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12E8 JUMP JUMPDEST PUSH2 0xADE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x2A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0xBCB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2B5 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x2E0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1221 JUMP JUMPDEST PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2F2 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x322 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x31D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x346 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x11F8 JUMP JUMPDEST PUSH2 0x108C JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x3E3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3B8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3E3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3C6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD PUSH2 0x4CB SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E742062616C616E636520746F20636F6D706C657465 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x207472616E736665722E00000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x647 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x63E SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP3 DUP2 LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E7420616C6C6F77616E636520746F20636F6D706C65 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7465207472616E736665722E0000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E3 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP4 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5472616E7366657220776F756C6420726573756C7420696E20616E206F766572 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x666C6F772E000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x80F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x806 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x95B JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD PUSH2 0x9B8 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xAD6 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAAB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xAD6 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xAB9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH9 0x56BC75E2D63100000 DUP2 GT ISZERO ISZERO ISZERO PUSH2 0xB2C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB23 SWAP1 PUSH2 0x14A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xB74 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xBC2 PUSH1 0x2 SLOAD DUP3 PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E742062616C616E636520746F20636F6D706C657465 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x207472616E736665722E00000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xCAF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCA6 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5472616E7366657220776F756C6420726573756C7420696E20616E206F766572 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x666C6F772E000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xDD2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xDC9 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xEC8 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xFF5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFEC SWAP1 PUSH2 0x1486 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xFFE DUP4 PUSH2 0x9D2 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 LT ISZERO PUSH2 0x1028 JUMPI PUSH2 0x101D PUSH1 0x2 SLOAD PUSH2 0x1018 DUP4 DUP6 PUSH2 0x11B7 JUMP JUMPDEST PUSH2 0x11B7 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x103D PUSH1 0x2 SLOAD PUSH2 0x1038 DUP5 DUP5 PUSH2 0x11B7 JUMP JUMPDEST PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP JUMPDEST DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x111E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1115 SWAP1 PUSH2 0x1486 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1196 JUMPI DUP1 PUSH1 0x3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x11AD JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x11C5 JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DC DUP3 CALLDATALOAD PUSH2 0x1522 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11F0 DUP3 CALLDATALOAD PUSH2 0x1542 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x120A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1218 DUP5 DUP3 DUP6 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1242 DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1253 DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1272 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1280 DUP7 DUP3 DUP8 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1291 DUP7 DUP3 DUP8 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x12A2 DUP7 DUP3 DUP8 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12CD DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x12DE DUP6 DUP3 DUP7 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1308 DUP5 DUP3 DUP6 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x131A DUP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1329 DUP2 PUSH2 0x150C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP3 PUSH2 0x14E1 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x134E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x154C JUMP JUMPDEST PUSH2 0x1357 DUP2 PUSH2 0x157F JUMP JUMPDEST PUSH1 0x20 DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x33 DUP3 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x37 DUP3 MSTORE PUSH32 0x4D696E74696E67206D6F7265207468616E203130303030303030303030303030 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x30303030303030206973206E6F7420616C6C6F7765642E000000000000000000 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1428 DUP2 PUSH2 0x1518 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1443 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1311 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x145E PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1320 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x147E DUP2 DUP5 PUSH2 0x132F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x149F DUP2 PUSH2 0x1365 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x14BF DUP2 PUSH2 0x13C2 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14DB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x141F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x156A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x154F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1579 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 DUP16 SWAP13 DUP10 0xc6 0xf8 0x5f PUSH5 0xAEC1E07CBF PUSH21 0x5526BBD793FD4ABC535035DD77EE4EFBC898C36C65 PUSH25 0x706572696D656E74616CF50037000000000000000000000000 ",
+ "sourceMap": "718:844:0:-;;;850:302;8:9:-1;5:2;;;30:1;27;20:12;5:2;850:302:0;;;;;;;;;;;;;;;;;;;;;;;;371:10:6;363:5;;:18;;;;;;;;;;;;;;;;;;1003:5:0;996:4;:12;;;;;;;;;;;;:::i;:::-;;1027:7;1018:6;:16;;;;;;;;;;;;:::i;:::-;;1055:9;1044:8;:20;;;;1088:12;1074:11;:26;;;;1133:12;1110:8;:20;1119:10;1110:20;;;;;;;;;;;;;;;:35;;;;850:302;;;;718:844;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6:444:-1:-;;119:3;112:4;104:6;100:17;96:27;89:35;86:2;;;137:1;134;127:12;86:2;167:6;161:13;189:65;204:49;246:6;204:49;;;189:65;;;180:74;;274:6;267:5;260:21;310:4;302:6;298:17;343:4;336:5;332:16;378:3;369:6;364:3;360:16;357:25;354:2;;;395:1;392;385:12;354:2;405:39;437:6;432:3;427;405:39;;;79:371;;;;;;;;458:122;;536:39;567:6;561:13;536:39;;;527:48;;521:59;;;;;587:870;;;;;773:3;761:9;752:7;748:23;744:33;741:2;;;790:1;787;780:12;741:2;846:1;835:9;831:17;825:24;869:18;861:6;858:30;855:2;;;901:1;898;891:12;855:2;921:74;987:7;978:6;967:9;963:22;921:74;;;911:84;;804:197;1053:2;1042:9;1038:18;1032:25;1077:18;1069:6;1066:30;1063:2;;;1109:1;1106;1099:12;1063:2;1129:74;1195:7;1186:6;1175:9;1171:22;1129:74;;;1119:84;;1011:198;1240:2;1258:64;1314:7;1305:6;1294:9;1290:22;1258:64;;;1248:74;;1219:109;1359:2;1377:64;1433:7;1424:6;1413:9;1409:22;1377:64;;;1367:74;;1338:109;735:722;;;;;;;;1464:256;;1526:2;1520:9;1510:19;;1564:4;1556:6;1552:17;1663:6;1651:10;1648:22;1627:18;1615:10;1612:34;1609:62;1606:2;;;1684:1;1681;1674:12;1606:2;1704:10;1700:2;1693:22;1504:216;;;;;1727:259;;1871:18;1863:6;1860:30;1857:2;;;1903:1;1900;1893:12;1857:2;1947:4;1943:9;1936:4;1928:6;1924:17;1920:33;1912:41;;1976:4;1970;1966:15;1958:23;;1794:192;;;;1993:79;;2062:5;2051:16;;2045:27;;;;2080:268;2145:1;2152:101;2166:6;2163:1;2160:13;2152:101;;;2242:1;2237:3;2233:11;2227:18;2223:1;2218:3;2214:11;2207:39;2188:2;2185:1;2181:10;2176:15;;2152:101;;;2268:6;2265:1;2262:13;2259:2;;;2333:1;2324:6;2319:3;2315:16;2308:27;2259:2;2129:219;;;;;718:844:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100c5576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100ca578063095ea7b3146100f557806318160ddd1461013257806323b872dd1461015d578063313ce5671461019a57806370a08231146101c55780638da5cb5b1461020257806395d89b411461022d578063a0712d6814610258578063a9059cbb14610281578063dd62ed3e146102be578063e30443bc146102fb578063f2fde38b14610324575b600080fd5b3480156100d657600080fd5b506100df61034d565b6040516100ec9190611464565b60405180910390f35b34801561010157600080fd5b5061011c600480360361011791908101906112ac565b6103eb565b6040516101299190611449565b60405180910390f35b34801561013e57600080fd5b506101476104dd565b60405161015491906114c6565b60405180910390f35b34801561016957600080fd5b50610184600480360361017f919081019061125d565b6104e3565b6040516101919190611449565b60405180910390f35b3480156101a657600080fd5b506101af6109cc565b6040516101bc91906114c6565b60405180910390f35b3480156101d157600080fd5b506101ec60048036036101e791908101906111f8565b6109d2565b6040516101f991906114c6565b60405180910390f35b34801561020e57600080fd5b50610217610a1a565b604051610224919061142e565b60405180910390f35b34801561023957600080fd5b50610242610a40565b60405161024f9190611464565b60405180910390f35b34801561026457600080fd5b5061027f600480360361027a91908101906112e8565b610ade565b005b34801561028d57600080fd5b506102a860048036036102a391908101906112ac565b610bcb565b6040516102b59190611449565b60405180910390f35b3480156102ca57600080fd5b506102e560048036036102e09190810190611221565b610eda565b6040516102f291906114c6565b60405180910390f35b34801561030757600080fd5b50610322600480360361031d91908101906112ac565b610f61565b005b34801561033057600080fd5b5061034b600480360361034691908101906111f8565b61108c565b005b60048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103e35780601f106103b8576101008083540402835291602001916103e3565b820191906000526020600020905b8154815290600101906020018083116103c657829003601f168201915b505050505081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516104cb91906114c6565b60405180910390a36001905092915050565b60025481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015606060405190810160405280602a81526020017f496e73756666696369656e742062616c616e636520746f20636f6d706c65746581526020017f207472616e736665722e00000000000000000000000000000000000000000000815250901515610647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063e9190611464565b60405180910390fd5b5082811015606060405190810160405280602c81526020017f496e73756666696369656e7420616c6c6f77616e636520746f20636f6d706c6581526020017f7465207472616e736665722e00000000000000000000000000000000000000008152509015156106ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e39190611464565b60405180910390fd5b506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015606060405190810160405280602581526020017f5472616e7366657220776f756c6420726573756c7420696e20616e206f76657281526020017f666c6f772e00000000000000000000000000000000000000000000000000000081525090151561080f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108069190611464565b60405180910390fd5b50826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561095b5782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516109b891906114c6565b60405180910390a360019150509392505050565b60065481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ad65780601f10610aab57610100808354040283529160200191610ad6565b820191906000526020600020905b815481529060010190602001808311610ab957829003601f168201915b505050505081565b68056bc75e2d631000008111151515610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b23906114a6565b60405180910390fd5b610b74816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611199565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610bc260025482611199565b60028190555050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015606060405190810160405280602a81526020017f496e73756666696369656e742062616c616e636520746f20636f6d706c65746581526020017f207472616e736665722e00000000000000000000000000000000000000000000815250901515610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69190611464565b60405180910390fd5b506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011015606060405190810160405280602581526020017f5472616e7366657220776f756c6420726573756c7420696e20616e206f76657281526020017f666c6f772e000000000000000000000000000000000000000000000000000000815250901515610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc99190611464565b60405180910390fd5b50816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ec891906114c6565b60405180910390a36001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90611486565b60405180910390fd5b610ffe836109d2565b9050808210156110285761101d60025461101883856111b7565b6111b7565b600281905550611044565b61103d60025461103884846111b7565b611199565b6002819055505b816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561111e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111590611486565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415156111965780600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008082840190508381101515156111ad57fe5b8091505092915050565b60008282111515156111c557fe5b818303905092915050565b60006111dc8235611522565b905092915050565b60006111f08235611542565b905092915050565b60006020828403121561120a57600080fd5b6000611218848285016111d0565b91505092915050565b6000806040838503121561123457600080fd5b6000611242858286016111d0565b9250506020611253858286016111d0565b9150509250929050565b60008060006060848603121561127257600080fd5b6000611280868287016111d0565b9350506020611291868287016111d0565b92505060406112a2868287016111e4565b9150509250925092565b600080604083850312156112bf57600080fd5b60006112cd858286016111d0565b92505060206112de858286016111e4565b9150509250929050565b6000602082840312156112fa57600080fd5b6000611308848285016111e4565b91505092915050565b61131a816114ec565b82525050565b6113298161150c565b82525050565b600061133a826114e1565b80845261134e81602086016020860161154c565b6113578161157f565b602085010191505092915050565b6000603382527f4f6e6c7920636f6e7472616374206f776e657220697320616c6c6f776564207460208301527f6f2063616c6c2074686973206d6574686f642e000000000000000000000000006040830152606082019050919050565b6000603782527f4d696e74696e67206d6f7265207468616e20313030303030303030303030303060208301527f30303030303030206973206e6f7420616c6c6f7765642e0000000000000000006040830152606082019050919050565b61142881611518565b82525050565b60006020820190506114436000830184611311565b92915050565b600060208201905061145e6000830184611320565b92915050565b6000602082019050818103600083015261147e818461132f565b905092915050565b6000602082019050818103600083015261149f81611365565b9050919050565b600060208201905081810360008301526114bf816113c2565b9050919050565b60006020820190506114db600083018461141f565b92915050565b600081519050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561156a57808201518184015260208101905061154f565b83811115611579576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a723058208f9c89c6f85f64aec1e07cbf745526bbd793fd4abc535035dd77ee4efbc898c36c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC5 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xCA JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0xF5 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x15D JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x19A JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x1C5 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x202 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x22D JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x281 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2BE JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0x2FB JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x324 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDF PUSH2 0x34D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xEC SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x101 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11C PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x117 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0x3EB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x129 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x147 PUSH2 0x4DD JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x154 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x169 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x17F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x125D JUMP JUMPDEST PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x191 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AF PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1BC SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1EC PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x1E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x11F8 JUMP JUMPDEST PUSH2 0x9D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F9 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x20E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x217 PUSH2 0xA1A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x224 SWAP2 SWAP1 PUSH2 0x142E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x239 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH2 0xA40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x24F SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x27F PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x27A SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12E8 JUMP JUMPDEST PUSH2 0xADE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A8 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x2A3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0xBCB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2B5 SWAP2 SWAP1 PUSH2 0x1449 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x2E0 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1221 JUMP JUMPDEST PUSH2 0xEDA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2F2 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x307 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x322 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x31D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x12AC JUMP JUMPDEST PUSH2 0xF61 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x330 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34B PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH2 0x346 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x11F8 JUMP JUMPDEST PUSH2 0x108C JUMP JUMPDEST STOP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x3E3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3B8 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3E3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3C6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD PUSH2 0x4CB SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E742062616C616E636520746F20636F6D706C657465 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x207472616E736665722E00000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x647 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x63E SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP3 DUP2 LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2C DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E7420616C6C6F77616E636520746F20636F6D706C65 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7465207472616E736665722E0000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x6EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6E3 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP4 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5472616E7366657220776F756C6420726573756C7420696E20616E206F766572 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x666C6F772E000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0x80F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x806 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x95B JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD PUSH2 0x9B8 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xAD6 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xAAB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xAD6 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xAB9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH9 0x56BC75E2D63100000 DUP2 GT ISZERO ISZERO ISZERO PUSH2 0xB2C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB23 SWAP1 PUSH2 0x14A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xB74 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xBC2 PUSH1 0x2 SLOAD DUP3 PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2A DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x496E73756666696369656E742062616C616E636520746F20636F6D706C657465 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x207472616E736665722E00000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xCAF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCA6 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x25 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5472616E7366657220776F756C6420726573756C7420696E20616E206F766572 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x666C6F772E000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 ISZERO ISZERO PUSH2 0xDD2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xDC9 SWAP2 SWAP1 PUSH2 0x1464 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xEC8 SWAP2 SWAP1 PUSH2 0x14C6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xFF5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFEC SWAP1 PUSH2 0x1486 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0xFFE DUP4 PUSH2 0x9D2 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 LT ISZERO PUSH2 0x1028 JUMPI PUSH2 0x101D PUSH1 0x2 SLOAD PUSH2 0x1018 DUP4 DUP6 PUSH2 0x11B7 JUMP JUMPDEST PUSH2 0x11B7 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH2 0x1044 JUMP JUMPDEST PUSH2 0x103D PUSH1 0x2 SLOAD PUSH2 0x1038 DUP5 DUP5 PUSH2 0x11B7 JUMP JUMPDEST PUSH2 0x1199 JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE POP JUMPDEST DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x111E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1115 SWAP1 PUSH2 0x1486 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1196 JUMPI DUP1 PUSH1 0x3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x11AD JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x11C5 JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11DC DUP3 CALLDATALOAD PUSH2 0x1522 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11F0 DUP3 CALLDATALOAD PUSH2 0x1542 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x120A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1218 DUP5 DUP3 DUP6 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1242 DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1253 DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1272 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1280 DUP7 DUP3 DUP8 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1291 DUP7 DUP3 DUP8 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x12A2 DUP7 DUP3 DUP8 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x12BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x12CD DUP6 DUP3 DUP7 ADD PUSH2 0x11D0 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x12DE DUP6 DUP3 DUP7 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x12FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1308 DUP5 DUP3 DUP6 ADD PUSH2 0x11E4 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x131A DUP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1329 DUP2 PUSH2 0x150C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x133A DUP3 PUSH2 0x14E1 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x134E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x154C JUMP JUMPDEST PUSH2 0x1357 DUP2 PUSH2 0x157F JUMP JUMPDEST PUSH1 0x20 DUP6 ADD ADD SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x33 DUP3 MSTORE PUSH32 0x4F6E6C7920636F6E7472616374206F776E657220697320616C6C6F7765642074 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x6F2063616C6C2074686973206D6574686F642E00000000000000000000000000 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x37 DUP3 MSTORE PUSH32 0x4D696E74696E67206D6F7265207468616E203130303030303030303030303030 PUSH1 0x20 DUP4 ADD MSTORE PUSH32 0x30303030303030206973206E6F7420616C6C6F7765642E000000000000000000 PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1428 DUP2 PUSH2 0x1518 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1443 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1311 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x145E PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1320 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x147E DUP2 DUP5 PUSH2 0x132F JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x149F DUP2 PUSH2 0x1365 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x14BF DUP2 PUSH2 0x13C2 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x14DB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x141F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 ISZERO ISZERO SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x156A JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x154F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1579 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F NOT PUSH1 0x1F DUP4 ADD AND SWAP1 POP SWAP2 SWAP1 POP JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 DUP16 SWAP13 DUP10 0xc6 0xf8 0x5f PUSH5 0xAEC1E07CBF PUSH21 0x5526BBD793FD4ABC535035DD77EE4EFBC898C36C65 PUSH25 0x706572696D656E74616CF50037000000000000000000000000 ",
+ "sourceMap": "718:844:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;770:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;770:18:0;;;;;;;;;;;;;;;;;;;;2171:222:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2171:222:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1073:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1073:26:2;;;;;;;;;;;;;;;;;;;;1108:697:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1108:697:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;820:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:23:0;;;;;;;;;;;;;;;;;;;;2399:125:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2399:125:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;292:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;292:20:6;;;;;;;;;;;;;;;;;;;;794::0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;794:20:0;;;;;;;;;;;;;;;;;;;;905:321:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;905:321:1;;;;;;;;;;;;;;;;;;;1106:445:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1106:445:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2530:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2530:160:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1158:402:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1158:402:0;;;;;;;;;;;;;;;;;;;566:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;566:167:6;;;;;;;;;;;;;;;;;;;770:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2171:222:2:-;2254:4;2306:6;2274:7;:19;2282:10;2274:19;;;;;;;;;;;;;;;:29;2294:8;2274:29;;;;;;;;;;;;;;;:38;;;;2348:8;2327:38;;2336:10;2327:38;;;2358:6;2327:38;;;;;;;;;;;;;;;2382:4;2375:11;;2171:222;;;;:::o;1073:26::-;;;;:::o;1108:697:4:-;1206:4;1226:17;1246:7;:14;1254:5;1246:14;;;;;;;;;;;;;;;:26;1261:10;1246:26;;;;;;;;;;;;;;;;1226:46;;1322:6;1303:8;:15;1312:5;1303:15;;;;;;;;;;;;;;;;:25;;1342:20;;;;;;;;;;;;;;;;;;;;;;;1282:90;;;;;;;;;;;;;;;;;;;;;;;;;;;1416:6;1403:9;:19;;1436:22;;;;;;;;;;;;;;;;;;;;;;;1382:86;;;;;;;;;;;;;;;;;;;;;;;;;;;1525:8;:13;1534:3;1525:13;;;;;;;;;;;;;;;;1515:6;1499:8;:13;1508:3;1499:13;;;;;;;;;;;;;;;;:22;:39;;1552:8;;;;;;;;;;;;;;;;;;;;;;;1478:92;;;;;;;;;;;;;;;;;;;;;;;;;;;1597:6;1580:8;:13;1589:3;1580:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;1632:6;1613:8;:15;1622:5;1613:15;;;;;;;;;;;;;;;;:25;;;;;;;;;;;762:10;1652:9;:20;1648:87;;;1718:6;1688:7;:14;1696:5;1688:14;;;;;;;;;;;;;;;:26;1703:10;1688:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;1648:87;1765:3;1749:28;;1758:5;1749:28;;;1770:6;1749:28;;;;;;;;;;;;;;;1794:4;1787:11;;1108:697;;;;;;:::o;820:23:0:-;;;;:::o;2399:125:2:-;2471:7;2501:8;:16;2510:6;2501:16;;;;;;;;;;;;;;;;2494:23;;2399:125;;;:::o;292:20:6:-;;;;;;;;;;;;;:::o;794::0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;905:321:1:-;995:21;985:6;:31;;964:133;;;;;;;;;;;;;;;;;;;;;;;;1130:37;1138:6;1146:8;:20;1155:10;1146:20;;;;;;;;;;;;;;;;1130:7;:37::i;:::-;1107:8;:20;1116:10;1107:20;;;;;;;;;;;;;;;:60;;;;1191:28;1199:11;;1212:6;1191:7;:28::i;:::-;1177:11;:42;;;;905:321;:::o;1106:445:2:-;1185:4;1250:6;1226:8;:20;1235:10;1226:20;;;;;;;;;;;;;;;;:30;;1270:20;;;;;;;;;;;;;;;;;;;;;;;1205:95;;;;;;;;;;;;;;;;;;;;;;;;;;;1357:8;:13;1366:3;1357:13;;;;;;;;;;;;;;;;1347:6;1331:8;:13;1340:3;1331:13;;;;;;;;;;;;;;;;:22;:39;;1384:8;;;;;;;;;;;;;;;;;;;;;;;1310:92;;;;;;;;;;;;;;;;;;;;;;;;;;;1436:6;1412:8;:20;1421:10;1412:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;1469:6;1452:8;:13;1461:3;1452:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;1511:3;1490:33;;1499:10;1490:33;;;1516:6;1490:33;;;;;;;;;;;;;;;1540:4;1533:11;;1106:445;;;;:::o;2530:160::-;2628:7;2658;:15;2666:6;2658:15;;;;;;;;;;;;;;;:25;2674:8;2658:25;;;;;;;;;;;;;;;;2651:32;;2530:160;;;;:::o;1158:402:0:-;1258:19;460:5:6;;;;;;;;;;;446:19;;:10;:19;;;425:117;;;;;;;;;;;;;;;;;;;;;;;;1280:18:0;1290:7;1280:9;:18::i;:::-;1258:40;;1321:11;1312:6;:20;1308:210;;;1362:50;1370:11;;1383:28;1391:11;1404:6;1383:7;:28::i;:::-;1362:7;:50::i;:::-;1348:11;:64;;;;1308:210;;;1457:50;1465:11;;1478:28;1486:6;1494:11;1478:7;:28::i;:::-;1457:7;:50::i;:::-;1443:11;:64;;;;1308:210;1547:6;1527:8;:17;1536:7;1527:17;;;;;;;;;;;;;;;:26;;;;1158:402;;;:::o;566:167:6:-;460:5;;;;;;;;;;;446:19;;:10;:19;;;425:117;;;;;;;;;;;;;;;;;;;;;;;;682:1;662:22;;:8;:22;;;;658:69;;;708:8;700:5;;:16;;;;;;;;;;;;;;;;;;658:69;566:167;:::o;570:166:7:-;650:7;673:6;686:1;682;:5;673:14;;709:1;704;:6;;697:14;;;;;;728:1;721:8;;570:166;;;;;:::o;418:146::-;498:7;533:1;528;:6;;521:14;;;;;;556:1;552;:5;545:12;;418:146;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;;57:66;;;;;130:118;;197:46;235:6;222:20;197:46;;;188:55;;182:66;;;;;255:241;;359:2;347:9;338:7;334:23;330:32;327:2;;;375:1;372;365:12;327:2;410:1;427:53;472:7;463:6;452:9;448:22;427:53;;;417:63;;389:97;321:175;;;;;503:366;;;624:2;612:9;603:7;599:23;595:32;592:2;;;640:1;637;630:12;592:2;675:1;692:53;737:7;728:6;717:9;713:22;692:53;;;682:63;;654:97;782:2;800:53;845:7;836:6;825:9;821:22;800:53;;;790:63;;761:98;586:283;;;;;;876:491;;;;1014:2;1002:9;993:7;989:23;985:32;982:2;;;1030:1;1027;1020:12;982:2;1065:1;1082:53;1127:7;1118:6;1107:9;1103:22;1082:53;;;1072:63;;1044:97;1172:2;1190:53;1235:7;1226:6;1215:9;1211:22;1190:53;;;1180:63;;1151:98;1280:2;1298:53;1343:7;1334:6;1323:9;1319:22;1298:53;;;1288:63;;1259:98;976:391;;;;;;1374:366;;;1495:2;1483:9;1474:7;1470:23;1466:32;1463:2;;;1511:1;1508;1501:12;1463:2;1546:1;1563:53;1608:7;1599:6;1588:9;1584:22;1563:53;;;1553:63;;1525:97;1653:2;1671:53;1716:7;1707:6;1696:9;1692:22;1671:53;;;1661:63;;1632:98;1457:283;;;;;;1747:241;;1851:2;1839:9;1830:7;1826:23;1822:32;1819:2;;;1867:1;1864;1857:12;1819:2;1902:1;1919:53;1964:7;1955:6;1944:9;1940:22;1919:53;;;1909:63;;1881:97;1813:175;;;;;1995:110;2068:31;2093:5;2068:31;;;2063:3;2056:44;2050:55;;;2112:101;2179:28;2201:5;2179:28;;;2174:3;2167:41;2161:52;;;2220:292;;2318:35;2347:5;2318:35;;;2370:6;2365:3;2358:19;2382:63;2438:6;2431:4;2426:3;2422:14;2415:4;2408:5;2404:16;2382:63;;;2477:29;2499:6;2477:29;;;2470:4;2465:3;2461:14;2457:50;2450:57;;2298:214;;;;;;2520:397;;2675:2;2670:3;2663:15;2712:66;2707:2;2702:3;2698:12;2691:88;2813:66;2808:2;2803:3;2799:12;2792:88;2908:2;2903:3;2899:12;2892:19;;2656:261;;;;2926:397;;3081:2;3076:3;3069:15;3118:66;3113:2;3108:3;3104:12;3097:88;3219:66;3214:2;3209:3;3205:12;3198:88;3314:2;3309:3;3305:12;3298:19;;3062:261;;;;3331:110;3404:31;3429:5;3404:31;;;3399:3;3392:44;3386:55;;;3448:193;;3556:2;3545:9;3541:18;3533:26;;3570:61;3628:1;3617:9;3613:17;3604:6;3570:61;;;3527:114;;;;;3648:181;;3750:2;3739:9;3735:18;3727:26;;3764:55;3816:1;3805:9;3801:17;3792:6;3764:55;;;3721:108;;;;;3836:273;;3960:2;3949:9;3945:18;3937:26;;4010:9;4004:4;4000:20;3996:1;3985:9;3981:17;3974:47;4035:64;4094:4;4085:6;4035:64;;;4027:72;;3931:178;;;;;4116:387;;4297:2;4286:9;4282:18;4274:26;;4347:9;4341:4;4337:20;4333:1;4322:9;4318:17;4311:47;4372:121;4488:4;4372:121;;;4364:129;;4268:235;;;;4510:387;;4691:2;4680:9;4676:18;4668:26;;4741:9;4735:4;4731:20;4727:1;4716:9;4712:17;4705:47;4766:121;4882:4;4766:121;;;4758:129;;4662:235;;;;4904:193;;5012:2;5001:9;4997:18;4989:26;;5026:61;5084:1;5073:9;5069:17;5060:6;5026:61;;;4983:114;;;;;5104:88;;5181:5;5175:12;5165:22;;5159:33;;;;5199:128;;5279:42;5272:5;5268:54;5257:65;;5251:76;;;;5334:92;;5414:5;5407:13;5400:21;5389:32;;5383:43;;;;5433:79;;5502:5;5491:16;;5485:27;;;;5519:128;;5599:42;5592:5;5588:54;5577:65;;5571:76;;;;5654:79;;5723:5;5712:16;;5706:27;;;;5741:268;5806:1;5813:101;5827:6;5824:1;5821:13;5813:101;;;5903:1;5898:3;5894:11;5888:18;5884:1;5879:3;5875:11;5868:39;5849:2;5846:1;5842:10;5837:15;;5813:101;;;5929:6;5926:1;5923:13;5920:2;;;5994:1;5985:6;5980:3;5976:16;5969:27;5920:2;5790:219;;;;;6017:97;;6105:2;6101:7;6096:2;6089:5;6085:14;6081:28;6071:38;;6065:49;;;"
+ }
+ }
+ },
+ "sources": {
+ "current/test/DummyERC20Token/DummyERC20Token.sol": {
+ "id": 0
+ },
+ "current/test/Mintable/Mintable.sol": {
+ "id": 1
+ },
+ "current/tokens/ERC20Token/ERC20Token.sol": {
+ "id": 2
+ },
+ "current/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 3
+ },
+ "current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol": {
+ "id": 4
+ },
+ "current/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "current/utils/Ownable/Ownable.sol": {
+ "id": 6
+ },
+ "current/utils/SafeMath/SafeMath.sol": {
+ "id": 7
+ }
+ },
+ "sourceCodes": {
+ "current/test/DummyERC20Token/DummyERC20Token.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 solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../Mintable/Mintable.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\n\ncontract DummyERC20Token is Mintable, Ownable {\n string public name;\n string public symbol;\n uint256 public decimals;\n\n constructor (\n string _name,\n string _symbol,\n uint256 _decimals,\n uint256 _totalSupply)\n public\n {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n totalSupply = _totalSupply;\n balances[msg.sender] = _totalSupply;\n }\n\n function setBalance(address _target, uint256 _value)\n public\n onlyOwner\n {\n uint256 currBalance = balanceOf(_target);\n if (_value < currBalance) {\n totalSupply = safeSub(totalSupply, safeSub(currBalance, _value));\n } else {\n totalSupply = safeAdd(totalSupply, safeSub(_value, currBalance));\n }\n balances[_target] = _value;\n }\n}\n",
+ "current/test/Mintable/Mintable.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 solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n/*\n * Mintable\n * Base contract that creates a mintable UnlimitedAllowanceToken\n */\ncontract Mintable is UnlimitedAllowanceToken, SafeMath {\n function mint(uint256 _value)\n public\n {\n require(\n _value <= 100000000000000000000,\n \"Minting more than 100000000000000000000 is not allowed.\"\n );\n balances[msg.sender] = safeAdd(_value, balances[msg.sender]);\n totalSupply = safeAdd(totalSupply, _value);\n }\n}\n",
+ "current/tokens/ERC20Token/ERC20Token.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 solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IERC20Token.sol\";\n\ncontract ERC20Token is IERC20Token {\n\n string constant INSUFFICIENT_BALANCE = \"Insufficient balance to complete transfer.\";\n string constant INSUFFICIENT_ALLOWANCE = \"Insufficient allowance to complete transfer.\";\n string constant OVERFLOW = \"Transfer would result in an overflow.\";\n\n mapping (address => uint256) balances;\n mapping (address => mapping (address => uint256)) allowed;\n\n uint256 public totalSupply;\n\n function transfer(address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[msg.sender] >= _value,\n INSUFFICIENT_BALANCE\n );\n require(\n balances[_to] + _value >= balances[_to],\n OVERFLOW\n );\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[_from] >= _value,\n INSUFFICIENT_BALANCE\n );\n require(\n allowed[_from][msg.sender] >= _value,\n INSUFFICIENT_ALLOWANCE\n );\n require(\n balances[_to] + _value >= balances[_to],\n OVERFLOW\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function approve(address _spender, uint256 _value)\n public\n returns (bool)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function balanceOf(address _owner)\n public view\n returns (uint256)\n {\n return balances[_owner];\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n returns (uint256)\n {\n return allowed[_owner][_spender];\n }\n}\n\n",
+ "current/tokens/ERC20Token/IERC20Token.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 solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "current/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.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 solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../ERC20Token/ERC20Token.sol\";\n\ncontract UnlimitedAllowanceToken is ERC20Token {\n\n uint256 constant MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n uint256 allowance = allowed[_from][msg.sender];\n require(\n balances[_from] >= _value,\n INSUFFICIENT_BALANCE\n );\n require(\n allowance >= _value,\n INSUFFICIENT_ALLOWANCE\n );\n require(\n balances[_to] + _value >= balances[_to],\n OVERFLOW\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value);\n return true;\n }\n}\n",
+ "current/utils/Ownable/IOwnable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "current/utils/Ownable/Ownable.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"Only contract owner is allowed to call this method.\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "current/utils/SafeMath/SafeMath.sol": "pragma solidity ^0.4.24;\npragma experimental ABIEncoderV2;\n\ncontract SafeMath {\n function safeMul(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n pure\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x4830433daa189b8c48beea455c8f20379bb7b5a33b1607b73e3938501a24bd2b",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.24",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/Exchange_v1.json b/packages/migrations/artifacts/1.0.0/Exchange_v1.json
new file mode 100644
index 000000000..5d89765f0
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/Exchange_v1.json
@@ -0,0 +1,678 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Exchange_v1",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "name": "denominator",
+ "type": "uint256"
+ },
+ {
+ "name": "target",
+ "type": "uint256"
+ }
+ ],
+ "name": "isRoundingError",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "filled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancelled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5][]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6][]"
+ },
+ {
+ "name": "fillTakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "shouldThrowOnInsufficientBalanceOrAllowance",
+ "type": "bool"
+ },
+ {
+ "name": "v",
+ "type": "uint8[]"
+ },
+ {
+ "name": "r",
+ "type": "bytes32[]"
+ },
+ {
+ "name": "s",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "fillOrdersUpTo",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6]"
+ },
+ {
+ "name": "cancelTakerTokenAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "cancelOrder",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "ZRX_TOKEN_CONTRACT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5][]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6][]"
+ },
+ {
+ "name": "fillTakerTokenAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "v",
+ "type": "uint8[]"
+ },
+ {
+ "name": "r",
+ "type": "bytes32[]"
+ },
+ {
+ "name": "s",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "batchFillOrKillOrders",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6]"
+ },
+ {
+ "name": "fillTakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "fillOrKillOrder",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getUnavailableTakerTokenAmount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "signer",
+ "type": "address"
+ },
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "name": "denominator",
+ "type": "uint256"
+ },
+ {
+ "name": "target",
+ "type": "uint256"
+ }
+ ],
+ "name": "getPartialAmount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "TOKEN_TRANSFER_PROXY_CONTRACT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5][]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6][]"
+ },
+ {
+ "name": "fillTakerTokenAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "shouldThrowOnInsufficientBalanceOrAllowance",
+ "type": "bool"
+ },
+ {
+ "name": "v",
+ "type": "uint8[]"
+ },
+ {
+ "name": "r",
+ "type": "bytes32[]"
+ },
+ {
+ "name": "s",
+ "type": "bytes32[]"
+ }
+ ],
+ "name": "batchFillOrders",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5][]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6][]"
+ },
+ {
+ "name": "cancelTakerTokenAmounts",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "batchCancelOrders",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6]"
+ },
+ {
+ "name": "fillTakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "shouldThrowOnInsufficientBalanceOrAllowance",
+ "type": "bool"
+ },
+ {
+ "name": "v",
+ "type": "uint8"
+ },
+ {
+ "name": "r",
+ "type": "bytes32"
+ },
+ {
+ "name": "s",
+ "type": "bytes32"
+ }
+ ],
+ "name": "fillOrder",
+ "outputs": [
+ {
+ "name": "filledTakerTokenAmount",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "orderAddresses",
+ "type": "address[5]"
+ },
+ {
+ "name": "orderValues",
+ "type": "uint256[6]"
+ }
+ ],
+ "name": "getOrderHash",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EXTERNAL_QUERY_GAS_LIMIT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint16"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "VERSION",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_zrxToken",
+ "type": "address"
+ },
+ {
+ "name": "_tokenTransferProxy",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "maker",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "taker",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "makerToken",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "takerToken",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "filledMakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "filledTakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "paidMakerFee",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "paidTakerFee",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "name": "tokens",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "orderHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "LogFill",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "maker",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipient",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "makerToken",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "takerToken",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "cancelledMakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "cancelledTakerTokenAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "name": "tokens",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "orderHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "LogCancel",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "errorId",
+ "type": "uint8"
+ },
+ {
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
+ }
+ ],
+ "name": "LogError",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50604051604080612d998339810180604052810190808051906020019092919080519060200190929190505050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612cca806100cf6000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806314df96ee14610101578063288cdc911461015a5780632ac126221461019f578063363349be146101e4578063394c21e7146103f85780633b30ba59146104975780634f150787146104ee578063741bcc931461071b5780637e9abb50146107cf5780638163681e1461081457806398024a8b146108a6578063add1cbc5146108fb578063b7b2c7d614610952578063baa0181d14610b8b578063bc61394a14610cef578063cfc4d0ec14610dc3578063f06bbf7514610e60578063ffa1ad7414610e93575b600080fd5b34801561010d57600080fd5b50610140600480360381019080803590602001909291908035906020019092919080359060200190929190505050610f23565b604051808215151515815260200191505060405180910390f35b34801561016657600080fd5b506101896004803603810190808035600019169060200190929190505050610f7b565b6040518082815260200191505060405180910390f35b3480156101ab57600080fd5b506101ce6004803603810190808035600019169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b3480156101f057600080fd5b506103e260048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561027257848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061022d565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156102f157848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906102ac565b5050505050919291929080359060200190929190803515159060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610fab565b6040518082815260200191505060405180910390f35b34801561040457600080fd5b506104816004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190505050611110565b6040518082815260200191505060405180910390f35b3480156104a357600080fd5b506104ac6115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104fa57600080fd5b5061071960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561057c57848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610537565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156105fb57848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906105b6565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061161d565b005b34801561072757600080fd5b506107cd6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506116da565b005b3480156107db57600080fd5b506107fe60048036038101908080356000191690602001909291905050506116ff565b6040518082815260200191505060405180910390f35b34801561082057600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611748565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108e5600480360381019080803590602001909291908035906020019092919080359060200190929190505050611849565b6040518082815260200191505060405180910390f35b34801561090757600080fd5b50610910611867565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b50610b8960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156109e057848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061099b565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610a5f57848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610a1a565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061188d565b005b348015610b9757600080fd5b50610ced60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c1957848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610bd4565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c9857848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610c53565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061194d565b005b348015610cfb57600080fd5b50610dad6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803515159060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506119c0565b6040518082815260200191505060405180910390f35b348015610dcf57600080fd5b50610e426004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c00190600680602002604051908101604052809291908260066020028082843782019150505050509192919290505050612160565b60405180826000191660001916815260200191505060405180910390f35b348015610e6c57600080fd5b50610e7561240b565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610e9f57600080fd5b50610ea8612411565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ee8578082015181840152602081019050610ecd565b50505050905090810190601f168015610f155780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600080600084801515610f3257fe5b86850991506000821415610f495760009250610f72565b610f68610f5983620f424061244a565b610f63888761244a565b61247d565b90506103e8811192505b50509392505050565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b6000806000809150600090505b895181101561110057896000815181101515610fd057fe5b906020019060200201516003600581101515610fe857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168a8281518110151561101157fe5b90602001906020020151600360058110151561102957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1614151561105057600080fd5b6110e4826110df8c8481518110151561106557fe5b906020019060200201518c8581518110151561107d57fe5b906020019060200201516110918d88612498565b8c8c888151811015156110a057fe5b906020019060200201518c898151811015156110b857fe5b906020019060200201518c8a8151811015156110d057fe5b906020019060200201516119c0565b6124b1565b9150878214156110f357611100565b8080600101915050610fb8565b8192505050979650505050505050565b600061111a612bd2565b6000806101606040519081016040528088600060058110151561113957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600160058110151561116857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600260058110151561119757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860036005811015156111c657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860046005811015156111f557fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200187600060068110151561122457fe5b6020020151815260200187600160068110151561123d57fe5b6020020151815260200187600260068110151561125657fe5b6020020151815260200187600360068110151561126f57fe5b6020020151815260200187600460068110151561128857fe5b6020020151815260200161129c8989612160565b6000191681525092503373ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161415156112e357600080fd5b60008360a001511180156112fb575060008360c00151115b80156113075750600085115b151561131257600080fd5b8261012001514210151561136f57826101400151600019166000600381111561133757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61138a8360c001516113858561014001516116ff565b612498565b915061139685836124cf565b905060008114156113f05782610140015160001916600160038111156113b857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61141a600360008561014001516000191660001916815260200190815260200160002054826124b1565b60036000856101400151600019166000191681526020019081526020016000208190555082604001518360600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916836080015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff167f67d66f160bc93d925d05dae1794c90d2d6d6688b29b84ff069398a9b0458713186604001518760600151611552878a60c001518b60a00151611849565b878a6101400151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182600019166000191681526020019550505050505060405180910390a48093505b5050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b86518110156116d1576116c4878281518110151561163d57fe5b90602001906020020151878381518110151561165557fe5b90602001906020020151878481518110151561166d57fe5b90602001906020020151878581518110151561168557fe5b90602001906020020151878681518110151561169d57fe5b9060200190602002015187878151811015156116b557fe5b906020019060200201516116da565b8080600101915050611623565b50505050505050565b836116eb87878760008888886119c0565b1415156116f757600080fd5b505050505050565b600061174160026000846000191660001916815260200190815260200160002054600360008560001916600019168152602001908152602001600020546124b1565b9050919050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015611806573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600061185e611858858461244a565b8461247d565b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b87518110156119435761193588828151811015156118ad57fe5b9060200190602002015188838151811015156118c557fe5b9060200190602002015188848151811015156118dd57fe5b906020019060200201518888868151811015156118f657fe5b90602001906020020151888781518110151561190e57fe5b90602001906020020151888881518110151561192657fe5b906020019060200201516119c0565b508080600101915050611893565b5050505050505050565b60008090505b83518110156119ba576119ac848281518110151561196d57fe5b90602001906020020151848381518110151561198557fe5b90602001906020020151848481518110151561199d57fe5b90602001906020020151611110565b508080600101915050611953565b50505050565b60006119ca612bd2565b600080600080610160604051908101604052808e60006005811015156119ec57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6001600581101515611a1b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6002600581101515611a4a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6003600581101515611a7957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6004600581101515611aa857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018d6000600681101515611ad757fe5b602002015181526020018d6001600681101515611af057fe5b602002015181526020018d6002600681101515611b0957fe5b602002015181526020018d6003600681101515611b2257fe5b602002015181526020018d6004600681101515611b3b57fe5b60200201518152602001611b4f8f8f612160565b600019168152509450600073ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161480611bc657503373ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16145b1515611bd157600080fd5b60008560a00151118015611be9575060008560c00151115b8015611bf5575060008b115b1515611c0057600080fd5b611c1685600001518661014001518b8b8b611748565b1515611c2157600080fd5b84610120015142101515611c7e578461014001516000191660006003811115611c4657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611c998560c00151611c948761014001516116ff565b612498565b9350611ca58b856124cf565b95506000861415611cff578461014001516000191660016003811115611cc757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611d12868660c001518760a00151610f23565b15611d66578461014001516000191660026003811115611d2e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b89158015611d7b5750611d7985876124e8565b155b15611dce5784610140015160001916600380811115611d9657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611de1868660c001518760a00151611849565b9250611e0d600260008761014001516000191660001916815260200190815260200160002054876124b1565b600260008761014001516000191660001916815260200190815260200160002081905550611e45856040015186600001513386612838565b1515611e5057600080fd5b611e64856060015133876000015189612838565b1515611e6f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff16141515611f6e5760008560e001511115611f0c57611ec9868660c001518760e00151611849565b9150611f006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151876080015185612838565b1515611f0b57600080fd5b5b60008561010001511115611f6d57611f2e868660c00151876101000151611849565b9050611f616000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633876080015184612838565b1515611f6c57600080fd5b5b5b84604001518560600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916856080015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182600019166000191681526020019850505050505050505060405180910390a48595505b5050505050979650505050505050565b60003083600060058110151561217257fe5b602002015184600160058110151561218657fe5b602002015185600260058110151561219a57fe5b60200201518660036005811015156121ae57fe5b60200201518760046005811015156121c257fe5b60200201518760006006811015156121d657fe5b60200201518860016006811015156121ea57fe5b60200201518960026006811015156121fe57fe5b60200201518a600360068110151561221257fe5b60200201518b600460068110151561222657fe5b60200201518c600560068110151561223a57fe5b6020020151604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018781526020018681526020018581526020018481526020018381526020018281526020019c505050505050505050505050506040518091039020905092915050565b61138781565b6040805190810160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808284029050600084148061246b575082848281151561246857fe5b04145b151561247357fe5b8091505092915050565b600080828481151561248b57fe5b0490508091505092915050565b60008282111515156124a657fe5b818303905092915050565b60008082840190508381101515156124c557fe5b8091505092915050565b60008183106124de57816124e0565b825b905092915050565b600080600080600080600080600033975061250c8a8c60c001518d60a00151611849565b9650600073ffffffffffffffffffffffffffffffffffffffff168b6080015173ffffffffffffffffffffffffffffffffffffffff161415156127b9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6040015173ffffffffffffffffffffffffffffffffffffffff161495506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6060015173ffffffffffffffffffffffffffffffffffffffff161494506126078a8c60c001518d60e00151611849565b935061261d8a8c60c001518d6101000151611849565b92508561262a5783612635565b61263487856124b1565b5b915084612642578261264d565b61264c8a846124b1565b5b90508161267f6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d600001516129ac565b10806126b85750816126b66000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60000151612a94565b105b806126ec5750806126ea6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a6129ac565b105b8061272057508061271e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612a94565b105b1561272e576000985061282a565b8515801561276757508661274a8c604001518d600001516129ac565b10806127665750866127648c604001518d60000151612a94565b105b5b15612775576000985061282a565b841580156127a657508961278d8c606001518a6129ac565b10806127a55750896127a38c606001518a612a94565b105b5b156127b4576000985061282a565b612825565b866127cc8c604001518d600001516129ac565b10806127e85750866127e68c604001518d60000151612a94565b105b806127ff5750896127fd8c606001518a6129ac565b105b806128165750896128148c606001518a612a94565b105b15612824576000985061282a565b5b600198505b505050505050505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15801561296757600080fd5b505af115801561297b573d6000803e3d6000fd5b505050506040513d602081101561299157600080fd5b81019080805190602001909291905050509050949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a0823161138761ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b158015612a5057600080fd5b5087f1158015612a64573d6000803e3d6000fd5b50505050506040513d6020811015612a7b57600080fd5b8101908080519060200190929190505050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61138761ffff1684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b158015612b8e57600080fd5b5087f1158015612ba2573d6000803e3d6000fd5b50505050506040513d6020811015612bb957600080fd5b8101908080519060200190929190505050905092915050565b61016060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815250905600a165627a7a723058203d2a5485da744cce47cf20cb3e00d3a32409b46698bfb0ea75bab61e857c14160029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x40 DUP1 PUSH2 0x2D99 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP2 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP POP PUSH2 0x2CCA DUP1 PUSH2 0xCF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xFC JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x14DF96EE EQ PUSH2 0x101 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x363349BE EQ PUSH2 0x1E4 JUMPI DUP1 PUSH4 0x394C21E7 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x3B30BA59 EQ PUSH2 0x497 JUMPI DUP1 PUSH4 0x4F150787 EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0x741BCC93 EQ PUSH2 0x71B JUMPI DUP1 PUSH4 0x7E9ABB50 EQ PUSH2 0x7CF JUMPI DUP1 PUSH4 0x8163681E EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x98024A8B EQ PUSH2 0x8A6 JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x8FB JUMPI DUP1 PUSH4 0xB7B2C7D6 EQ PUSH2 0x952 JUMPI DUP1 PUSH4 0xBAA0181D EQ PUSH2 0xB8B JUMPI DUP1 PUSH4 0xBC61394A EQ PUSH2 0xCEF JUMPI DUP1 PUSH4 0xCFC4D0EC EQ PUSH2 0xDC3 JUMPI DUP1 PUSH4 0xF06BBF75 EQ PUSH2 0xE60 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xE93 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF23 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x166 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x189 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF93 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x272 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x22D JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x2F1 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2AC JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0xFAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x481 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1110 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4AC PUSH2 0x15F8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x719 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x57C JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x537 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x5FB JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x5B6 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x161D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x727 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7CD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16DA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7FE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x820 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x88C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1748 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1849 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x907 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x910 PUSH2 0x1867 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x95E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB89 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x9E0 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x99B JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xA5F JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xA1A JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x188D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCED PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xC19 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xBD4 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xC98 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xC53 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x194D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDAD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE42 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE75 PUSH2 0x240B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEA8 PUSH2 0x2411 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEE8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xECD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF15 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0xF32 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0xF49 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0xF72 JUMP JUMPDEST PUSH2 0xF68 PUSH2 0xF59 DUP4 PUSH3 0xF4240 PUSH2 0x244A JUMP JUMPDEST PUSH2 0xF63 DUP9 DUP8 PUSH2 0x244A JUMP JUMPDEST PUSH2 0x247D JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP10 MLOAD DUP2 LT ISZERO PUSH2 0x1100 JUMPI DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFD0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0xFE8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1011 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1029 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1050 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10E4 DUP3 PUSH2 0x10DF DUP13 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1065 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x107D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1091 DUP14 DUP9 PUSH2 0x2498 JUMP JUMPDEST DUP13 DUP13 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP10 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10B8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP11 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x19C0 JUMP JUMPDEST PUSH2 0x24B1 JUMP JUMPDEST SWAP2 POP DUP8 DUP3 EQ ISZERO PUSH2 0x10F3 JUMPI PUSH2 0x1100 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xFB8 JUMP JUMPDEST DUP2 SWAP3 POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111A PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP9 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1139 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1168 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1197 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x11C6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x11F5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1224 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x123D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1256 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x126F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1288 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x129C DUP10 DUP10 PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x0 NOT AND DUP2 MSTORE POP SWAP3 POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x12E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 PUSH1 0xA0 ADD MLOAD GT DUP1 ISZERO PUSH2 0x12FB JUMPI POP PUSH1 0x0 DUP4 PUSH1 0xC0 ADD MLOAD GT JUMPDEST DUP1 ISZERO PUSH2 0x1307 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO ISZERO PUSH2 0x1312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x120 ADD MLOAD TIMESTAMP LT ISZERO ISZERO PUSH2 0x136F JUMPI DUP3 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1337 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP4 POP PUSH2 0x15EE JUMP JUMPDEST PUSH2 0x138A DUP4 PUSH1 0xC0 ADD MLOAD PUSH2 0x1385 DUP6 PUSH2 0x140 ADD MLOAD PUSH2 0x16FF JUMP JUMPDEST PUSH2 0x2498 JUMP JUMPDEST SWAP2 POP PUSH2 0x1396 DUP6 DUP4 PUSH2 0x24CF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0x13F0 JUMPI DUP3 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x13B8 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP4 POP PUSH2 0x15EE JUMP JUMPDEST PUSH2 0x141A PUSH1 0x3 PUSH1 0x0 DUP6 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH2 0x24B1 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP6 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND DUP4 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x67D66F160BC93D925D05DAE1794C90D2D6D6688B29B84FF069398A9B04587131 DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1552 DUP8 DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST DUP8 DUP11 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP1 SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP7 MLOAD DUP2 LT ISZERO PUSH2 0x16D1 JUMPI PUSH2 0x16C4 DUP8 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x163D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1655 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x166D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1685 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x169D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16B5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x16DA JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1623 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP4 PUSH2 0x16EB DUP8 DUP8 DUP8 PUSH1 0x0 DUP9 DUP9 DUP9 PUSH2 0x19C0 JUMP JUMPDEST EQ ISZERO ISZERO PUSH2 0x16F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1741 PUSH1 0x2 PUSH1 0x0 DUP5 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x3 PUSH1 0x0 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x24B1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1806 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x185E PUSH2 0x1858 DUP6 DUP5 PUSH2 0x244A JUMP JUMPDEST DUP5 PUSH2 0x247D JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x1943 JUMPI PUSH2 0x1935 DUP9 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18DD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18F6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x190E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1926 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x19C0 JUMP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1893 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x19BA JUMPI PUSH2 0x19AC DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x196D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1985 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1110 JUMP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1953 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19CA PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP15 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x19EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A4A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A79 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1AA8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1AD7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1AF0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B09 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B22 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B3B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B4F DUP16 DUP16 PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x0 NOT AND DUP2 MSTORE POP SWAP5 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x1BC6 JUMPI POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x1BD1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 PUSH1 0xA0 ADD MLOAD GT DUP1 ISZERO PUSH2 0x1BE9 JUMPI POP PUSH1 0x0 DUP6 PUSH1 0xC0 ADD MLOAD GT JUMPDEST DUP1 ISZERO PUSH2 0x1BF5 JUMPI POP PUSH1 0x0 DUP12 GT JUMPDEST ISZERO ISZERO PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C16 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH2 0x140 ADD MLOAD DUP12 DUP12 DUP12 PUSH2 0x1748 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x120 ADD MLOAD TIMESTAMP LT ISZERO ISZERO PUSH2 0x1C7E JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1C46 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1C99 DUP6 PUSH1 0xC0 ADD MLOAD PUSH2 0x1C94 DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x16FF JUMP JUMPDEST PUSH2 0x2498 JUMP JUMPDEST SWAP4 POP PUSH2 0x1CA5 DUP12 DUP6 PUSH2 0x24CF JUMP JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 EQ ISZERO PUSH2 0x1CFF JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1CC7 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1D12 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH2 0xF23 JUMP JUMPDEST ISZERO PUSH2 0x1D66 JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1D2E JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST DUP10 ISZERO DUP1 ISZERO PUSH2 0x1D7B JUMPI POP PUSH2 0x1D79 DUP6 DUP8 PUSH2 0x24E8 JUMP JUMPDEST ISZERO JUMPDEST ISZERO PUSH2 0x1DCE JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x3 DUP1 DUP2 GT ISZERO PUSH2 0x1D96 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1DE1 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP3 POP PUSH2 0x1E0D PUSH1 0x2 PUSH1 0x0 DUP8 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP8 PUSH2 0x24B1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP8 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x1E45 DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD CALLER DUP7 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E64 DUP6 PUSH1 0x60 ADD MLOAD CALLER DUP8 PUSH1 0x0 ADD MLOAD DUP10 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1F6E JUMPI PUSH1 0x0 DUP6 PUSH1 0xE0 ADD MLOAD GT ISZERO PUSH2 0x1F0C JUMPI PUSH2 0x1EC9 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xE0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP2 POP PUSH2 0x1F00 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1F0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST PUSH1 0x0 DUP6 PUSH2 0x100 ADD MLOAD GT ISZERO PUSH2 0x1F6D JUMPI PUSH2 0x1F2E DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH2 0x100 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP1 POP PUSH2 0x1F61 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP8 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1F6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST JUMPDEST DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD0B9391970D9A25552F37D436D2AAE2925E2BFE1B2A923754BADA030C498CB3 CALLER DUP10 PUSH1 0x40 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD DUP10 DUP14 DUP11 DUP11 DUP16 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP6 SWAP6 POP JUMPDEST POP POP POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS DUP4 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x2172 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP5 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x2186 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP6 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x219A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP7 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x21AE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP8 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x21C2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP8 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21D6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP9 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP10 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21FE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP11 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x2212 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP12 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x2226 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP13 PUSH1 0x5 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x223A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP14 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1387 DUP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 MUL SWAP1 POP PUSH1 0x0 DUP5 EQ DUP1 PUSH2 0x246B JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x2468 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x2473 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x248B JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x24A6 JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x24C5 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x24DE JUMPI DUP2 PUSH2 0x24E0 JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 CALLER SWAP8 POP PUSH2 0x250C DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP7 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27B9 JUMPI PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP6 POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP5 POP PUSH2 0x2607 DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH1 0xE0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP4 POP PUSH2 0x261D DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH2 0x100 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP3 POP DUP6 PUSH2 0x262A JUMPI DUP4 PUSH2 0x2635 JUMP JUMPDEST PUSH2 0x2634 DUP8 DUP6 PUSH2 0x24B1 JUMP JUMPDEST JUMPDEST SWAP2 POP DUP5 PUSH2 0x2642 JUMPI DUP3 PUSH2 0x264D JUMP JUMPDEST PUSH2 0x264C DUP11 DUP5 PUSH2 0x24B1 JUMP JUMPDEST JUMPDEST SWAP1 POP DUP2 PUSH2 0x267F PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x26B8 JUMPI POP DUP2 PUSH2 0x26B6 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x26EC JUMPI POP DUP1 PUSH2 0x26EA PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH2 0x29AC JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x2720 JUMPI POP DUP1 PUSH2 0x271E PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST ISZERO PUSH2 0x272E JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST DUP6 ISZERO DUP1 ISZERO PUSH2 0x2767 JUMPI POP DUP7 PUSH2 0x274A DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x2766 JUMPI POP DUP7 PUSH2 0x2764 DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST JUMPDEST ISZERO PUSH2 0x2775 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST DUP5 ISZERO DUP1 ISZERO PUSH2 0x27A6 JUMPI POP DUP10 PUSH2 0x278D DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x27A5 JUMPI POP DUP10 PUSH2 0x27A3 DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST JUMPDEST ISZERO PUSH2 0x27B4 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST PUSH2 0x2825 JUMP JUMPDEST DUP7 PUSH2 0x27CC DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x27E8 JUMPI POP DUP7 PUSH2 0x27E6 DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x27FF JUMPI POP DUP10 PUSH2 0x27FD DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x29AC JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x2816 JUMPI POP DUP10 PUSH2 0x2814 DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST ISZERO PUSH2 0x2824 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP9 POP JUMPDEST POP POP POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x15DACBEA DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x297B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2991 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 PUSH2 0x1387 PUSH2 0xFFFF AND DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2A50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x2A64 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E PUSH2 0x1387 PUSH2 0xFFFF AND DUP5 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x2BA2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0x2a SLOAD DUP6 0xda PUSH21 0x4CCE47CF20CB3E00D3A32409B46698BFB0EA75BAB6 0x1e DUP6 PUSH29 0x1416002900000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "993:22781:0:-;;;2960:177;8:9:-1;5:2;;;30:1;27;20:12;5:2;2960:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3060:9;3039:18;;:30;;;;;;;;;;;;;;;;;;3111:19;3079:29;;:51;;;;;;;;;;;;;;;;;;2960:177;;993:22781;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806314df96ee14610101578063288cdc911461015a5780632ac126221461019f578063363349be146101e4578063394c21e7146103f85780633b30ba59146104975780634f150787146104ee578063741bcc931461071b5780637e9abb50146107cf5780638163681e1461081457806398024a8b146108a6578063add1cbc5146108fb578063b7b2c7d614610952578063baa0181d14610b8b578063bc61394a14610cef578063cfc4d0ec14610dc3578063f06bbf7514610e60578063ffa1ad7414610e93575b600080fd5b34801561010d57600080fd5b50610140600480360381019080803590602001909291908035906020019092919080359060200190929190505050610f23565b604051808215151515815260200191505060405180910390f35b34801561016657600080fd5b506101896004803603810190808035600019169060200190929190505050610f7b565b6040518082815260200191505060405180910390f35b3480156101ab57600080fd5b506101ce6004803603810190808035600019169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b3480156101f057600080fd5b506103e260048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561027257848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061022d565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156102f157848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906102ac565b5050505050919291929080359060200190929190803515159060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610fab565b6040518082815260200191505060405180910390f35b34801561040457600080fd5b506104816004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190505050611110565b6040518082815260200191505060405180910390f35b3480156104a357600080fd5b506104ac6115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104fa57600080fd5b5061071960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561057c57848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610537565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156105fb57848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906105b6565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061161d565b005b34801561072757600080fd5b506107cd6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506116da565b005b3480156107db57600080fd5b506107fe60048036038101908080356000191690602001909291905050506116ff565b6040518082815260200191505060405180910390f35b34801561082057600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611748565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108e5600480360381019080803590602001909291908035906020019092919080359060200190929190505050611849565b6040518082815260200191505060405180910390f35b34801561090757600080fd5b50610910611867565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b50610b8960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156109e057848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061099b565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610a5f57848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610a1a565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061188d565b005b348015610b9757600080fd5b50610ced60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c1957848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610bd4565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c9857848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610c53565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061194d565b005b348015610cfb57600080fd5b50610dad6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803515159060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506119c0565b6040518082815260200191505060405180910390f35b348015610dcf57600080fd5b50610e426004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c00190600680602002604051908101604052809291908260066020028082843782019150505050509192919290505050612160565b60405180826000191660001916815260200191505060405180910390f35b348015610e6c57600080fd5b50610e7561240b565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610e9f57600080fd5b50610ea8612411565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ee8578082015181840152602081019050610ecd565b50505050905090810190601f168015610f155780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600080600084801515610f3257fe5b86850991506000821415610f495760009250610f72565b610f68610f5983620f424061244a565b610f63888761244a565b61247d565b90506103e8811192505b50509392505050565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b6000806000809150600090505b895181101561110057896000815181101515610fd057fe5b906020019060200201516003600581101515610fe857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168a8281518110151561101157fe5b90602001906020020151600360058110151561102957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1614151561105057600080fd5b6110e4826110df8c8481518110151561106557fe5b906020019060200201518c8581518110151561107d57fe5b906020019060200201516110918d88612498565b8c8c888151811015156110a057fe5b906020019060200201518c898151811015156110b857fe5b906020019060200201518c8a8151811015156110d057fe5b906020019060200201516119c0565b6124b1565b9150878214156110f357611100565b8080600101915050610fb8565b8192505050979650505050505050565b600061111a612bd2565b6000806101606040519081016040528088600060058110151561113957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600160058110151561116857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600260058110151561119757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860036005811015156111c657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860046005811015156111f557fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200187600060068110151561122457fe5b6020020151815260200187600160068110151561123d57fe5b6020020151815260200187600260068110151561125657fe5b6020020151815260200187600360068110151561126f57fe5b6020020151815260200187600460068110151561128857fe5b6020020151815260200161129c8989612160565b6000191681525092503373ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161415156112e357600080fd5b60008360a001511180156112fb575060008360c00151115b80156113075750600085115b151561131257600080fd5b8261012001514210151561136f57826101400151600019166000600381111561133757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61138a8360c001516113858561014001516116ff565b612498565b915061139685836124cf565b905060008114156113f05782610140015160001916600160038111156113b857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61141a600360008561014001516000191660001916815260200190815260200160002054826124b1565b60036000856101400151600019166000191681526020019081526020016000208190555082604001518360600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916836080015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff167f67d66f160bc93d925d05dae1794c90d2d6d6688b29b84ff069398a9b0458713186604001518760600151611552878a60c001518b60a00151611849565b878a6101400151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182600019166000191681526020019550505050505060405180910390a48093505b5050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b86518110156116d1576116c4878281518110151561163d57fe5b90602001906020020151878381518110151561165557fe5b90602001906020020151878481518110151561166d57fe5b90602001906020020151878581518110151561168557fe5b90602001906020020151878681518110151561169d57fe5b9060200190602002015187878151811015156116b557fe5b906020019060200201516116da565b8080600101915050611623565b50505050505050565b836116eb87878760008888886119c0565b1415156116f757600080fd5b505050505050565b600061174160026000846000191660001916815260200190815260200160002054600360008560001916600019168152602001908152602001600020546124b1565b9050919050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015611806573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600061185e611858858461244a565b8461247d565b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b87518110156119435761193588828151811015156118ad57fe5b9060200190602002015188838151811015156118c557fe5b9060200190602002015188848151811015156118dd57fe5b906020019060200201518888868151811015156118f657fe5b90602001906020020151888781518110151561190e57fe5b90602001906020020151888881518110151561192657fe5b906020019060200201516119c0565b508080600101915050611893565b5050505050505050565b60008090505b83518110156119ba576119ac848281518110151561196d57fe5b90602001906020020151848381518110151561198557fe5b90602001906020020151848481518110151561199d57fe5b90602001906020020151611110565b508080600101915050611953565b50505050565b60006119ca612bd2565b600080600080610160604051908101604052808e60006005811015156119ec57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6001600581101515611a1b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6002600581101515611a4a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6003600581101515611a7957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6004600581101515611aa857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018d6000600681101515611ad757fe5b602002015181526020018d6001600681101515611af057fe5b602002015181526020018d6002600681101515611b0957fe5b602002015181526020018d6003600681101515611b2257fe5b602002015181526020018d6004600681101515611b3b57fe5b60200201518152602001611b4f8f8f612160565b600019168152509450600073ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161480611bc657503373ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16145b1515611bd157600080fd5b60008560a00151118015611be9575060008560c00151115b8015611bf5575060008b115b1515611c0057600080fd5b611c1685600001518661014001518b8b8b611748565b1515611c2157600080fd5b84610120015142101515611c7e578461014001516000191660006003811115611c4657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611c998560c00151611c948761014001516116ff565b612498565b9350611ca58b856124cf565b95506000861415611cff578461014001516000191660016003811115611cc757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611d12868660c001518760a00151610f23565b15611d66578461014001516000191660026003811115611d2e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b89158015611d7b5750611d7985876124e8565b155b15611dce5784610140015160001916600380811115611d9657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611de1868660c001518760a00151611849565b9250611e0d600260008761014001516000191660001916815260200190815260200160002054876124b1565b600260008761014001516000191660001916815260200190815260200160002081905550611e45856040015186600001513386612838565b1515611e5057600080fd5b611e64856060015133876000015189612838565b1515611e6f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff16141515611f6e5760008560e001511115611f0c57611ec9868660c001518760e00151611849565b9150611f006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151876080015185612838565b1515611f0b57600080fd5b5b60008561010001511115611f6d57611f2e868660c00151876101000151611849565b9050611f616000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633876080015184612838565b1515611f6c57600080fd5b5b5b84604001518560600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916856080015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182600019166000191681526020019850505050505050505060405180910390a48595505b5050505050979650505050505050565b60003083600060058110151561217257fe5b602002015184600160058110151561218657fe5b602002015185600260058110151561219a57fe5b60200201518660036005811015156121ae57fe5b60200201518760046005811015156121c257fe5b60200201518760006006811015156121d657fe5b60200201518860016006811015156121ea57fe5b60200201518960026006811015156121fe57fe5b60200201518a600360068110151561221257fe5b60200201518b600460068110151561222657fe5b60200201518c600560068110151561223a57fe5b6020020151604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018781526020018681526020018581526020018481526020018381526020018281526020019c505050505050505050505050506040518091039020905092915050565b61138781565b6040805190810160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808284029050600084148061246b575082848281151561246857fe5b04145b151561247357fe5b8091505092915050565b600080828481151561248b57fe5b0490508091505092915050565b60008282111515156124a657fe5b818303905092915050565b60008082840190508381101515156124c557fe5b8091505092915050565b60008183106124de57816124e0565b825b905092915050565b600080600080600080600080600033975061250c8a8c60c001518d60a00151611849565b9650600073ffffffffffffffffffffffffffffffffffffffff168b6080015173ffffffffffffffffffffffffffffffffffffffff161415156127b9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6040015173ffffffffffffffffffffffffffffffffffffffff161495506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6060015173ffffffffffffffffffffffffffffffffffffffff161494506126078a8c60c001518d60e00151611849565b935061261d8a8c60c001518d6101000151611849565b92508561262a5783612635565b61263487856124b1565b5b915084612642578261264d565b61264c8a846124b1565b5b90508161267f6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d600001516129ac565b10806126b85750816126b66000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60000151612a94565b105b806126ec5750806126ea6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a6129ac565b105b8061272057508061271e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612a94565b105b1561272e576000985061282a565b8515801561276757508661274a8c604001518d600001516129ac565b10806127665750866127648c604001518d60000151612a94565b105b5b15612775576000985061282a565b841580156127a657508961278d8c606001518a6129ac565b10806127a55750896127a38c606001518a612a94565b105b5b156127b4576000985061282a565b612825565b866127cc8c604001518d600001516129ac565b10806127e85750866127e68c604001518d60000151612a94565b105b806127ff5750896127fd8c606001518a6129ac565b105b806128165750896128148c606001518a612a94565b105b15612824576000985061282a565b5b600198505b505050505050505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15801561296757600080fd5b505af115801561297b573d6000803e3d6000fd5b505050506040513d602081101561299157600080fd5b81019080805190602001909291905050509050949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a0823161138761ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b158015612a5057600080fd5b5087f1158015612a64573d6000803e3d6000fd5b50505050506040513d6020811015612a7b57600080fd5b8101908080519060200190929190505050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61138761ffff1684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b158015612b8e57600080fd5b5087f1158015612ba2573d6000803e3d6000fd5b50505050506040513d6020811015612bb957600080fd5b8101908080519060200190929190505050905092915050565b61016060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815250905600a165627a7a723058203d2a5485da744cce47cf20cb3e00d3a32409b46698bfb0ea75bab61e857c14160029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xFC JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x14DF96EE EQ PUSH2 0x101 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x15A JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x363349BE EQ PUSH2 0x1E4 JUMPI DUP1 PUSH4 0x394C21E7 EQ PUSH2 0x3F8 JUMPI DUP1 PUSH4 0x3B30BA59 EQ PUSH2 0x497 JUMPI DUP1 PUSH4 0x4F150787 EQ PUSH2 0x4EE JUMPI DUP1 PUSH4 0x741BCC93 EQ PUSH2 0x71B JUMPI DUP1 PUSH4 0x7E9ABB50 EQ PUSH2 0x7CF JUMPI DUP1 PUSH4 0x8163681E EQ PUSH2 0x814 JUMPI DUP1 PUSH4 0x98024A8B EQ PUSH2 0x8A6 JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x8FB JUMPI DUP1 PUSH4 0xB7B2C7D6 EQ PUSH2 0x952 JUMPI DUP1 PUSH4 0xBAA0181D EQ PUSH2 0xB8B JUMPI DUP1 PUSH4 0xBC61394A EQ PUSH2 0xCEF JUMPI DUP1 PUSH4 0xCFC4D0EC EQ PUSH2 0xDC3 JUMPI DUP1 PUSH4 0xF06BBF75 EQ PUSH2 0xE60 JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0xE93 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x140 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF23 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x166 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x189 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF7B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF93 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3E2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x272 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x22D JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x2F1 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2AC JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0xFAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x404 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x481 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1110 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4AC PUSH2 0x15F8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x719 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x57C JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x537 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x5FB JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x5B6 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x161D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x727 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7CD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16DA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7FE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16FF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x820 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x88C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1748 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8E5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1849 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x907 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x910 PUSH2 0x1867 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x95E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB89 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0x9E0 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x99B JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xA5F JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xA1A JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x188D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCED PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xC19 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xA0 MUL ADD PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xBD4 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 SWAP1 JUMPDEST DUP3 DUP3 LT ISZERO PUSH2 0xC98 JUMPI DUP5 DUP5 DUP4 SWAP1 POP PUSH1 0xC0 MUL ADD PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xC53 JUMP JUMPDEST POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x194D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCFB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDAD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH1 0x0 NOT AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDCF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE42 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 PUSH1 0xA0 ADD SWAP1 PUSH1 0x5 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x5 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 PUSH1 0xC0 ADD SWAP1 PUSH1 0x6 DUP1 PUSH1 0x20 MUL PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP3 PUSH1 0x6 PUSH1 0x20 MUL DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE75 PUSH2 0x240B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH2 0xFFFF AND PUSH2 0xFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xEA8 PUSH2 0x2411 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEE8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xECD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF15 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0xF32 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP PUSH1 0x0 DUP3 EQ ISZERO PUSH2 0xF49 JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0xF72 JUMP JUMPDEST PUSH2 0xF68 PUSH2 0xF59 DUP4 PUSH3 0xF4240 PUSH2 0x244A JUMP JUMPDEST PUSH2 0xF63 DUP9 DUP8 PUSH2 0x244A JUMP JUMPDEST PUSH2 0x247D JUMP JUMPDEST SWAP1 POP PUSH2 0x3E8 DUP2 GT SWAP3 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP10 MLOAD DUP2 LT ISZERO PUSH2 0x1100 JUMPI DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFD0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0xFE8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1011 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1029 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1050 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10E4 DUP3 PUSH2 0x10DF DUP13 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1065 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x107D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1091 DUP14 DUP9 PUSH2 0x2498 JUMP JUMPDEST DUP13 DUP13 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10A0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP10 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10B8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP13 DUP11 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x19C0 JUMP JUMPDEST PUSH2 0x24B1 JUMP JUMPDEST SWAP2 POP DUP8 DUP3 EQ ISZERO PUSH2 0x10F3 JUMPI PUSH2 0x1100 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xFB8 JUMP JUMPDEST DUP2 SWAP3 POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x111A PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP9 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1139 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1168 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1197 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x11C6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x11F5 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1224 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x123D JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1256 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x126F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1288 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x129C DUP10 DUP10 PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x0 NOT AND DUP2 MSTORE POP SWAP3 POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x12E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 PUSH1 0xA0 ADD MLOAD GT DUP1 ISZERO PUSH2 0x12FB JUMPI POP PUSH1 0x0 DUP4 PUSH1 0xC0 ADD MLOAD GT JUMPDEST DUP1 ISZERO PUSH2 0x1307 JUMPI POP PUSH1 0x0 DUP6 GT JUMPDEST ISZERO ISZERO PUSH2 0x1312 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x120 ADD MLOAD TIMESTAMP LT ISZERO ISZERO PUSH2 0x136F JUMPI DUP3 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1337 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP4 POP PUSH2 0x15EE JUMP JUMPDEST PUSH2 0x138A DUP4 PUSH1 0xC0 ADD MLOAD PUSH2 0x1385 DUP6 PUSH2 0x140 ADD MLOAD PUSH2 0x16FF JUMP JUMPDEST PUSH2 0x2498 JUMP JUMPDEST SWAP2 POP PUSH2 0x1396 DUP6 DUP4 PUSH2 0x24CF JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 EQ ISZERO PUSH2 0x13F0 JUMPI DUP3 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x13B8 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP4 POP PUSH2 0x15EE JUMP JUMPDEST PUSH2 0x141A PUSH1 0x3 PUSH1 0x0 DUP6 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH2 0x24B1 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x0 DUP6 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND DUP4 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x67D66F160BC93D925D05DAE1794C90D2D6D6688B29B84FF069398A9B04587131 DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH2 0x1552 DUP8 DUP11 PUSH1 0xC0 ADD MLOAD DUP12 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST DUP8 DUP11 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP1 SWAP4 POP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP7 MLOAD DUP2 LT ISZERO PUSH2 0x16D1 JUMPI PUSH2 0x16C4 DUP8 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x163D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1655 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x166D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1685 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x169D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16B5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x16DA JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1623 JUMP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST DUP4 PUSH2 0x16EB DUP8 DUP8 DUP8 PUSH1 0x0 DUP9 DUP9 DUP9 PUSH2 0x19C0 JUMP JUMPDEST EQ ISZERO ISZERO PUSH2 0x16F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1741 PUSH1 0x2 PUSH1 0x0 DUP5 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0x3 PUSH1 0x0 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x24B1 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1806 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD SUB MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP1 POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x185E PUSH2 0x1858 DUP6 DUP5 PUSH2 0x244A JUMP JUMPDEST DUP5 PUSH2 0x247D JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP8 MLOAD DUP2 LT ISZERO PUSH2 0x1943 JUMPI PUSH2 0x1935 DUP9 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18C5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18DD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP9 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x18F6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x190E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP9 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1926 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x19C0 JUMP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1893 JUMP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 POP JUMPDEST DUP4 MLOAD DUP2 LT ISZERO PUSH2 0x19BA JUMPI PUSH2 0x19AC DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x196D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1985 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1110 JUMP JUMPDEST POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1953 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x19CA PUSH2 0x2BD2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP15 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x19EC JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A1B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A4A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1A79 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP15 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x1AA8 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1AD7 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1AF0 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B09 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B22 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD DUP14 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x1B3B JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1B4F DUP16 DUP16 PUSH2 0x2160 JUMP JUMPDEST PUSH1 0x0 NOT AND DUP2 MSTORE POP SWAP5 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x1BC6 JUMPI POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO ISZERO PUSH2 0x1BD1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 PUSH1 0xA0 ADD MLOAD GT DUP1 ISZERO PUSH2 0x1BE9 JUMPI POP PUSH1 0x0 DUP6 PUSH1 0xC0 ADD MLOAD GT JUMPDEST DUP1 ISZERO PUSH2 0x1BF5 JUMPI POP PUSH1 0x0 DUP12 GT JUMPDEST ISZERO ISZERO PUSH2 0x1C00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C16 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH2 0x140 ADD MLOAD DUP12 DUP12 DUP12 PUSH2 0x1748 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x120 ADD MLOAD TIMESTAMP LT ISZERO ISZERO PUSH2 0x1C7E JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1C46 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1C99 DUP6 PUSH1 0xC0 ADD MLOAD PUSH2 0x1C94 DUP8 PUSH2 0x140 ADD MLOAD PUSH2 0x16FF JUMP JUMPDEST PUSH2 0x2498 JUMP JUMPDEST SWAP4 POP PUSH2 0x1CA5 DUP12 DUP6 PUSH2 0x24CF JUMP JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 EQ ISZERO PUSH2 0x1CFF JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x1 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1CC7 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1D12 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH2 0xF23 JUMP JUMPDEST ISZERO PUSH2 0x1D66 JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x2 PUSH1 0x3 DUP2 GT ISZERO PUSH2 0x1D2E JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST DUP10 ISZERO DUP1 ISZERO PUSH2 0x1D7B JUMPI POP PUSH2 0x1D79 DUP6 DUP8 PUSH2 0x24E8 JUMP JUMPDEST ISZERO JUMPDEST ISZERO PUSH2 0x1DCE JUMPI DUP5 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x3 DUP1 DUP2 GT ISZERO PUSH2 0x1D96 JUMPI INVALID JUMPDEST PUSH1 0xFF AND PUSH32 0x36D86C59E00BD73DC19BA3ADFE068E4B64AC7E92BE35546ADEDDF1B956A87E90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 SWAP6 POP PUSH2 0x2150 JUMP JUMPDEST PUSH2 0x1DE1 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP3 POP PUSH2 0x1E0D PUSH1 0x2 PUSH1 0x0 DUP8 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP8 PUSH2 0x24B1 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 DUP8 PUSH2 0x140 ADD MLOAD PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x1E45 DUP6 PUSH1 0x40 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD CALLER DUP7 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E64 DUP6 PUSH1 0x60 ADD MLOAD CALLER DUP8 PUSH1 0x0 ADD MLOAD DUP10 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1F6E JUMPI PUSH1 0x0 DUP6 PUSH1 0xE0 ADD MLOAD GT ISZERO PUSH2 0x1F0C JUMPI PUSH2 0x1EC9 DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH1 0xE0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP2 POP PUSH2 0x1F00 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1F0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST PUSH1 0x0 DUP6 PUSH2 0x100 ADD MLOAD GT ISZERO PUSH2 0x1F6D JUMPI PUSH2 0x1F2E DUP7 DUP7 PUSH1 0xC0 ADD MLOAD DUP8 PUSH2 0x100 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP1 POP PUSH2 0x1F61 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER DUP8 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2838 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1F6C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST JUMPDEST JUMPDEST DUP5 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND DUP6 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD0B9391970D9A25552F37D436D2AAE2925E2BFE1B2A923754BADA030C498CB3 CALLER DUP10 PUSH1 0x40 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD DUP10 DUP14 DUP11 DUP11 DUP16 PUSH2 0x140 ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP9 POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 DUP6 SWAP6 POP JUMPDEST POP POP POP POP POP SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS DUP4 PUSH1 0x0 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x2172 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP5 PUSH1 0x1 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x2186 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP6 PUSH1 0x2 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x219A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP7 PUSH1 0x3 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x21AE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP8 PUSH1 0x4 PUSH1 0x5 DUP2 LT ISZERO ISZERO PUSH2 0x21C2 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP8 PUSH1 0x0 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21D6 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP9 PUSH1 0x1 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21EA JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP10 PUSH1 0x2 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x21FE JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP11 PUSH1 0x3 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x2212 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP12 PUSH1 0x4 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x2226 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD DUP13 PUSH1 0x5 PUSH1 0x6 DUP2 LT ISZERO ISZERO PUSH2 0x223A JUMPI INVALID JUMPDEST PUSH1 0x20 MUL ADD MLOAD PUSH1 0x40 MLOAD DUP1 DUP14 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP11 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP13 POP POP POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1387 DUP2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x312E302E30000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 MUL SWAP1 POP PUSH1 0x0 DUP5 EQ DUP1 PUSH2 0x246B JUMPI POP DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x2468 JUMPI INVALID JUMPDEST DIV EQ JUMPDEST ISZERO ISZERO PUSH2 0x2473 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x248B JUMPI INVALID JUMPDEST DIV SWAP1 POP DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO ISZERO ISZERO PUSH2 0x24A6 JUMPI INVALID JUMPDEST DUP2 DUP4 SUB SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO ISZERO ISZERO PUSH2 0x24C5 JUMPI INVALID JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x24DE JUMPI DUP2 PUSH2 0x24E0 JUMP JUMPDEST DUP3 JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 CALLER SWAP8 POP PUSH2 0x250C DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH1 0xA0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP7 POP PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x80 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27B9 JUMPI PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP6 POP PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP12 PUSH1 0x60 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ SWAP5 POP PUSH2 0x2607 DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH1 0xE0 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP4 POP PUSH2 0x261D DUP11 DUP13 PUSH1 0xC0 ADD MLOAD DUP14 PUSH2 0x100 ADD MLOAD PUSH2 0x1849 JUMP JUMPDEST SWAP3 POP DUP6 PUSH2 0x262A JUMPI DUP4 PUSH2 0x2635 JUMP JUMPDEST PUSH2 0x2634 DUP8 DUP6 PUSH2 0x24B1 JUMP JUMPDEST JUMPDEST SWAP2 POP DUP5 PUSH2 0x2642 JUMPI DUP3 PUSH2 0x264D JUMP JUMPDEST PUSH2 0x264C DUP11 DUP5 PUSH2 0x24B1 JUMP JUMPDEST JUMPDEST SWAP1 POP DUP2 PUSH2 0x267F PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x26B8 JUMPI POP DUP2 PUSH2 0x26B6 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x26EC JUMPI POP DUP1 PUSH2 0x26EA PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH2 0x29AC JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x2720 JUMPI POP DUP1 PUSH2 0x271E PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST ISZERO PUSH2 0x272E JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST DUP6 ISZERO DUP1 ISZERO PUSH2 0x2767 JUMPI POP DUP7 PUSH2 0x274A DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x2766 JUMPI POP DUP7 PUSH2 0x2764 DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST JUMPDEST ISZERO PUSH2 0x2775 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST DUP5 ISZERO DUP1 ISZERO PUSH2 0x27A6 JUMPI POP DUP10 PUSH2 0x278D DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x27A5 JUMPI POP DUP10 PUSH2 0x27A3 DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST JUMPDEST ISZERO PUSH2 0x27B4 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST PUSH2 0x2825 JUMP JUMPDEST DUP7 PUSH2 0x27CC DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x29AC JUMP JUMPDEST LT DUP1 PUSH2 0x27E8 JUMPI POP DUP7 PUSH2 0x27E6 DUP13 PUSH1 0x40 ADD MLOAD DUP14 PUSH1 0x0 ADD MLOAD PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x27FF JUMPI POP DUP10 PUSH2 0x27FD DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x29AC JUMP JUMPDEST LT JUMPDEST DUP1 PUSH2 0x2816 JUMPI POP DUP10 PUSH2 0x2814 DUP13 PUSH1 0x60 ADD MLOAD DUP11 PUSH2 0x2A94 JUMP JUMPDEST LT JUMPDEST ISZERO PUSH2 0x2824 JUMPI PUSH1 0x0 SWAP9 POP PUSH2 0x282A JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP9 POP JUMPDEST POP POP POP POP POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x15DACBEA DUP7 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD DUP6 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2967 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x297B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2991 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 PUSH2 0x1387 PUSH2 0xFFFF AND DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2A50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x2A64 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xDD62ED3E PUSH2 0x1387 PUSH2 0xFFFF AND DUP5 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x2B8E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP8 CALL ISZERO DUP1 ISZERO PUSH2 0x2BA2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x160 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0x2a SLOAD DUP6 0xda PUSH21 0x4CCE47CF20CB3E00D3A32409B46698BFB0EA75BAB6 0x1e DUP6 PUSH29 0x1416002900000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "993:22781:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18080:458;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18080:458:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1737:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1737:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1782:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1782:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14315:989;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14315:989:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8303:1942;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8303:1942:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1566:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1566:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13066:512;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13066:512:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10866:419;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10866:419:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19212:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19212:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17491:350;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17491:350:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18787:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18787:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1605:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1605:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;11916:619;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11916:619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15662:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15662:381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3842:4043;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3842:4043:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16453:706;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16453:706:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1456:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1456:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1410:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1410:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1410:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18080:458;18201:4;18221:14;18351:30;18264:11;18238:38;;;;;;;18253:9;18245:6;18238:38;18221:55;;18303:1;18290:9;:14;18286:32;;;18313:5;18306:12;;;;18286:32;18384:98;18405:27;18413:9;18424:7;18405;:27::i;:::-;18446:26;18454:9;18465:6;18446:7;:26::i;:::-;18384:7;:98::i;:::-;18351:131;;18527:4;18499:25;:32;18492:39;;18080:458;;;;;;;;:::o;1737:39::-;;;;;;;;;;;;;;;;;:::o;1782:42::-;;;;;;;;;;;;;;;;;:::o;14315:989::-;14594:4;14614:27;14660:6;14644:1;14614:31;;14669:1;14660:10;;14655:604;14676:14;:21;14672:1;:25;14655:604;;;14750:14;14765:1;14750:17;;;;;;;;;;;;;;;;;;14768:1;14750:20;;;;;;;;;;;;;14726:44;;:14;14741:1;14726:17;;;;;;;;;;;;;;;;;;14744:1;14726:20;;;;;;;;;;;;;:44;;;14718:53;;;;;;;;14856:321;14864:22;14888:288;14915:14;14930:1;14915:17;;;;;;;;;;;;;;;;;;14950:11;14962:1;14950:14;;;;;;;;;;;;;;;;;;14982:53;14990:20;15012:22;14982:7;:53::i;:::-;15053:43;15114:1;15116;15114:4;;;;;;;;;;;;;;;;;;15136:1;15138;15136:4;;;;;;;;;;;;;;;;;;15158:1;15160;15158:4;;;;;;;;;;;;;;;;;;14888:9;:288::i;:::-;14856:7;:321::i;:::-;14831:346;;15221:20;15195:22;:46;15191:57;;;15243:5;;15191:57;14699:3;;;;;;;14655:604;;;15275:22;15268:29;;14315:989;;;;;;;;;;;:::o;8303:1942::-;8458:4;8478:18;;:::i;:::-;9338:30;9461;8499:512;;;;;;;;;8526:14;8541:1;8526:17;;;;;;;;;;;;;8499:512;;;;;;8564:14;8579:1;8564:17;;;;;;;;;;;;;8499:512;;;;;;8607:14;8622:1;8607:17;;;;;;;;;;;;;8499:512;;;;;;8650:14;8665:1;8650:17;;;;;;;;;;;;;8499:512;;;;;;8695:14;8710:1;8695:17;;;;;;;;;;;;;8499:512;;;;;;8744:11;8756:1;8744:14;;;;;;;;;;;;;8499:512;;;;8790:11;8802:1;8790:14;;;;;;;;;;;;;8499:512;;;;8828:11;8840:1;8828:14;;;;;;;;;;;;;8499:512;;;;8866:11;8878:1;8866:14;;;;;;;;;;;;;8499:512;;;;8920:11;8932:1;8920:14;;;;;;;;;;;;;8499:512;;;;8959:41;8972:14;8988:11;8959:12;:41::i;:::-;8499:512;;;;;;8478:533;;9045:10;9030:25;;:5;:11;;;:25;;;9022:34;;;;;;;;9099:1;9074:5;:22;;;:26;:56;;;;;9129:1;9104:5;:22;;;:26;9074:56;:86;;;;;9159:1;9134:22;:26;9074:86;9066:95;;;;;;;;9195:5;:30;;;9176:15;:49;;9172:156;;;9279:5;:15;;;9241:54;;;9256:20;9250:27;;;;;;;;9241:54;;;;;;;;;;;;9316:1;9309:8;;;;9172:156;9371:80;9379:5;:22;;;9403:47;9434:5;:15;;;9403:30;:47::i;:::-;9371:7;:80::i;:::-;9338:113;;9494:57;9501:22;9525:25;9494:6;:57::i;:::-;9461:90;;9594:1;9565:25;:30;9561:155;;;9667:5;:15;;;9611:72;;;9626:38;9620:45;;;;;;;;9611:72;;;;;;;;;;;;9704:1;9697:8;;;;9561:155;9755:62;9763:9;:26;9773:5;:15;;;9763:26;;;;;;;;;;;;;;;;;;9791:25;9755:7;:62::i;:::-;9726:9;:26;9736:5;:15;;;9726:26;;;;;;;;;;;;;;;;;:91;;;;10122:5;:16;;;10140:5;:16;;;10112:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9828:368;;;9876:5;:18;;;9828:368;;9851:5;:11;;;9828:368;;;9908:5;:16;;;9938:5;:16;;;9968:91;9985:25;10012:5;:22;;;10036:5;:22;;;9968:16;:91::i;:::-;10073:25;10171:5;:15;;;9828:368;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10213:25;10206:32;;8303:1942;;;;;;;;;:::o;1566:33::-;;;;;;;;;;;;;:::o;13066:512::-;13299:6;13308:1;13299:10;;13294:278;13315:14;:21;13311:1;:25;13294:278;;;13357:204;13390:14;13405:1;13390:17;;;;;;;;;;;;;;;;;;13425:11;13437:1;13425:14;;;;;;;;;;;;;;;;;;13457:21;13479:1;13457:24;;;;;;;;;;;;;;;;;;13499:1;13501;13499:4;;;;;;;;;;;;;;;;;;13521:1;13523;13521:4;;;;;;;;;;;;;;;;;;13543:1;13545;13543:4;;;;;;;;;;;;;;;;;;13357:15;:204::i;:::-;13338:3;;;;;;;13294:278;;;13066:512;;;;;;;:::o;10866:419::-;11257:20;11083:170;11106:14;11134:11;11159:20;11193:5;11212:1;11227;11242;11083:9;:170::i;:::-;:194;11075:203;;;;;;;;10866:419;;;;;;:::o;19212:190::-;19320:4;19347:48;19355:6;:17;19362:9;19355:17;;;;;;;;;;;;;;;;;;19374:9;:20;19384:9;19374:20;;;;;;;;;;;;;;;;;;19347:7;:48::i;:::-;19340:55;;19212:190;;;:::o;17491:350::-;17668:4;17705:129;17774:4;17728:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17793:1;17808;17823;17705:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17705:129:0;;;;;;;;17695:139;;:6;:139;;;17688:146;;17491:350;;;;;;;:::o;18787:204::-;18909:4;18936:48;18944:26;18952:9;18963:6;18944:7;:26::i;:::-;18972:11;18936:7;:48::i;:::-;18929:55;;18787:204;;;;;:::o;1605:44::-;;;;;;;;;;;;;:::o;11916:619::-;12201:6;12210:1;12201:10;;12196:333;12217:14;:21;12213:1;:25;12196:333;;;12259:259;12286:14;12301:1;12286:17;;;;;;;;;;;;;;;;;;12321:11;12333:1;12321:14;;;;;;;;;;;;;;;;;;12353:21;12375:1;12353:24;;;;;;;;;;;;;;;;;;12395:43;12456:1;12458;12456:4;;;;;;;;;;;;;;;;;;12478:1;12480;12478:4;;;;;;;;;;;;;;;;;;12500:1;12502;12500:4;;;;;;;;;;;;;;;;;;12259:9;:259::i;:::-;;12240:3;;;;;;;12196:333;;;11916:619;;;;;;;;:::o;15662:381::-;15832:6;15841:1;15832:10;;15827:210;15848:14;:21;15844:1;:25;15827:210;;;15890:136;15919:14;15934:1;15919:17;;;;;;;;;;;;;;;;;;15954:11;15966:1;15954:14;;;;;;;;;;;;;;;;;;15986:23;16010:1;15986:26;;;;;;;;;;;;;;;;;;15890:11;:136::i;:::-;;15871:3;;;;;;;15827:210;;;15662:381;;;;:::o;3842:4043::-;4124:27;4167:18;;:::i;:::-;5198:30;6019:27;6147:17;6174;4188:512;;;;;;;;;4215:14;4230:1;4215:17;;;;;;;;;;;;;4188:512;;;;;;4253:14;4268:1;4253:17;;;;;;;;;;;;;4188:512;;;;;;4296:14;4311:1;4296:17;;;;;;;;;;;;;4188:512;;;;;;4339:14;4354:1;4339:17;;;;;;;;;;;;;4188:512;;;;;;4384:14;4399:1;4384:17;;;;;;;;;;;;;4188:512;;;;;;4433:11;4445:1;4433:14;;;;;;;;;;;;;4188:512;;;;4479:11;4491:1;4479:14;;;;;;;;;;;;;4188:512;;;;4517:11;4529:1;4517:14;;;;;;;;;;;;;4188:512;;;;4555:11;4567:1;4555:14;;;;;;;;;;;;;4188:512;;;;4609:11;4621:1;4609:14;;;;;;;;;;;;;4188:512;;;;4648:41;4661:14;4677:11;4648:12;:41::i;:::-;4188:512;;;;;;4167:533;;4742:1;4719:25;;:5;:11;;;:25;;;:54;;;;4763:10;4748:25;;:5;:11;;;:25;;;4719:54;4711:63;;;;;;;;4817:1;4792:5;:22;;;:26;:56;;;;;4847:1;4822:5;:22;;;:26;4792:56;:84;;;;;4875:1;4852:20;:24;4792:84;4784:93;;;;;;;;4895:125;4925:5;:11;;;4950:5;:15;;;4979:1;4994;5009;4895:16;:125::i;:::-;4887:134;;;;;;;;5055:5;:30;;;5036:15;:49;;5032:156;;;5139:5;:15;;;5101:54;;;5116:20;5110:27;;;;;;;;5101:54;;;;;;;;;;;;5176:1;5169:8;;;;5032:156;5231:80;5239:5;:22;;;5263:47;5294:5;:15;;;5263:30;:47::i;:::-;5231:7;:80::i;:::-;5198:113;;5346:55;5353:20;5375:25;5346:6;:55::i;:::-;5321:80;;5441:1;5415:22;:27;5411:152;;;5514:5;:15;;;5458:72;;;5473:38;5467:45;;;;;;;;5458:72;;;;;;;;;;;;5551:1;5544:8;;;;5411:152;5577:87;5593:22;5617:5;:22;;;5641:5;:22;;;5577:15;:87::i;:::-;5573:205;;;5729:5;:15;;;5680:65;;;5695:31;5689:38;;;;;;;;5680:65;;;;;;;;;;;;5766:1;5759:8;;;;5573:205;5793:43;5792:44;:94;;;;;5841:45;5856:5;5863:22;5841:14;:45::i;:::-;5840:46;5792:94;5788:221;;;5960:5;:15;;;5902:74;;;5917:40;5911:47;;;;;;;;5902:74;;;;;;;;;;;;5997:1;5990:8;;;;5788:221;6049:88;6066:22;6090:5;:22;;;6114:5;:22;;;6049:16;:88::i;:::-;6019:118;;6227:56;6235:6;:23;6242:5;:15;;;6235:23;;;;;;;;;;;;;;;;;;6260:22;6227:7;:56::i;:::-;6201:6;:23;6208:5;:15;;;6201:23;;;;;;;;;;;;;;;;;:82;;;;6301:154;6344:5;:16;;;6374:5;:11;;;6399:10;6423:22;6301:29;:154::i;:::-;6293:163;;;;;;;;6474:154;6517:5;:16;;;6547:10;6571:5;:11;;;6596:22;6474:29;:154::i;:::-;6466:163;;;;;;;;6673:1;6643:32;;:5;:18;;;:32;;;;6639:820;;;6712:1;6695:5;:14;;;:18;6691:373;;;6748:80;6765:22;6789:5;:22;;;6813:5;:14;;;6748:16;:80::i;:::-;6733:95;;6854:194;6905:18;;;;;;;;;;;6945:5;:11;;;6978:5;:18;;;7018:12;6854:29;:194::i;:::-;6846:203;;;;;;;;6691:373;7098:1;7081:5;:14;;;:18;7077:372;;;7134:80;7151:22;7175:5;:22;;;7199:5;:14;;;7134:16;:80::i;:::-;7119:95;;7240:193;7291:18;;;;;;;;;;;7331:10;7363:5;:18;;;7403:12;7240:29;:193::i;:::-;7232:202;;;;;;;;7077:372;6639:820;7765:5;:16;;;7783:5;:16;;;7755:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7469:370;;;7539:5;:18;;;7469:370;;7490:5;:11;;;7469:370;;;7515:10;7571:5;:16;;;7601:5;:16;;;7631:22;7667;7703:12;7729;7814:5;:15;;;7469:370;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7856:22;7849:29;;3842:4043;;;;;;;;;;;;;;;:::o;16453:706::-;16572:7;16633:4;16652:14;16667:1;16652:17;;;;;;;;;;;;;16692:14;16707:1;16692:17;;;;;;;;;;;;;16732:14;16747:1;16732:17;;;;;;;;;;;;;16777:14;16792:1;16777:17;;;;;;;;;;;;;16822:14;16837:1;16822:17;;;;;;;;;;;;;16869:11;16881:1;16869:14;;;;;;;;;;;;;16920:11;16932:1;16920:14;;;;;;;;;;;;;16971:11;16983:1;16971:14;;;;;;;;;;;;;17014:11;17026:1;17014:14;;;;;;;;;;;;;17057:11;17069:1;17057:14;;;;;;;;;;;;;17116:11;17128:1;17116:14;;;;;;;;;;;;;16602:550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16595:557;;16453:706;;;;:::o;1456:54::-;1506:4;1456:54;:::o;1410:40::-;;;;;;;;;;;;;;;;;;;;:::o;53:184:2:-;137:7;160:6;173:1;169;:5;160:14;;196:1;191;:6;:20;;;;210:1;205;201;:5;;;;;;;;:10;191:20;184:28;;;;;;229:1;222:8;;53:184;;;;;:::o;243:146::-;327:7;350:6;363:1;359;:5;;;;;;;;350:14;;381:1;374:8;;243:146;;;;;:::o;395:150::-;479:7;514:1;509;:6;;502:14;;;;;;537:1;533;:5;526:12;;395:150;;;;:::o;551:170::-;635:7;658:6;671:1;667;:5;658:14;;694:1;689;:6;;682:14;;;;;;713:1;706:8;;551:170;;;;;:::o;1156:139::-;1245:7;1279:1;1275;:5;:13;;1287:1;1275:13;;;1283:1;1275:13;1268:20;;1156:139;;;;:::o;20292:2363:0:-;20541:4;20561:13;20597:25;20774:20;20849;20924:17;21036;21148:21;21262;20577:10;20561:26;;20625:86;20642:20;20664:5;:22;;;20688:5;:22;;;20625:16;:86::i;:::-;20597:114;;20756:1;20726:32;;:5;:18;;;:32;;;;20722:1904;;;20817:18;;;;;;;;;;;20797:38;;:5;:16;;;:38;;;20774:61;;20892:18;;;;;;;;;;;20872:38;;:5;:16;;;:38;;;20849:61;;20944:78;20961:20;20983:5;:22;;;21007:5;:14;;;20944:16;:78::i;:::-;20924:98;;21056:78;21073:20;21095:5;:22;;;21119:5;:14;;;21056:16;:78::i;:::-;21036:98;;21172:15;:76;;21236:12;21172:76;;;21190:43;21198:20;21220:12;21190:7;:43::i;:::-;21172:76;21148:100;;21286:15;:76;;21350:12;21286:76;;;21304:43;21312:20;21334:12;21304:7;:43::i;:::-;21286:76;21262:100;;21430:16;21384:43;21395:18;;;;;;;;;;;21415:5;:11;;;21384:10;:43::i;:::-;:62;:146;;;;21514:16;21466:45;21479:18;;;;;;;;;;;21499:5;:11;;;21466:12;:45::i;:::-;:64;21384:146;:222;;;;21590:16;21550:37;21561:18;;;;;;;;;;;21581:5;21550:10;:37::i;:::-;:56;21384:222;:300;;;;21668:16;21626:39;21639:18;;;;;;;;;;;21659:5;21626:12;:39::i;:::-;:58;21384:300;21377:334;;;21706:5;21699:12;;;;21377:334;21731:15;21730:16;:236;;;;;21798:20;21754:41;21765:5;:16;;;21783:5;:11;;;21754:10;:41::i;:::-;:64;:211;;;;21945:20;21899:43;21912:5;:16;;;21930:5;:11;;;21899:12;:43::i;:::-;:66;21754:211;21730:236;21726:267;;;21988:5;21981:12;;;;21726:267;22012:15;22011:16;:224;;;;;22073:20;22035:35;22046:5;:16;;;22064:5;22035:10;:35::i;:::-;:58;:199;;;;22214:20;22174:37;22187:5;:16;;;22205:5;22174:12;:37::i;:::-;:60;22035:199;22011:224;22007:255;;;22257:5;22250:12;;;;22007:255;20722:1904;;;22330:20;22286:41;22297:5;:16;;;22315:5;:11;;;22286:10;:41::i;:::-;:64;:153;;;;22419:20;22373:43;22386:5;:16;;;22404:5;:11;;;22373:12;:43::i;:::-;:66;22286:153;:234;;;;22500:20;22462:35;22473:5;:16;;;22491:5;22462:10;:35::i;:::-;:58;22286:234;:317;;;;22583:20;22543:37;22556:5;:16;;;22574:5;22543:12;:37::i;:::-;:60;22286:317;22279:347;;;22621:5;22614:12;;;;22279:347;20722:1904;22644:4;22637:11;;20292:2363;;;;;;;;;;;;;:::o;19766:279::-;19925:4;19971:29;;;;;;;;;;;19952:62;;;20015:5;20022:4;20028:2;20032:5;19952:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19952:86:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19952:86:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;19952:86:0;;;;;;;;;;;;;;;;19945:93;;19766:279;;;;;;:::o;22825:339::-;23036:4;23069:5;23063:22;;;1506:4;23063:52;;23116:5;23063:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23063:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23063:59:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23063:59:0;;;;;;;;;;;;;;;;23056:66;;22825:339;;;;:::o;23400:372::-;23613:4;23646:5;23640:22;;;1506:4;23640:52;;23693:5;23700:29;;;;;;;;;;;23640:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23640:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23640:90:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23640:90:0;;;;;;;;;;;;;;;;23633:97;;23400:372;;;;:::o;993:22781::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "previous/Exchange/Exchange_v1.sol": {
+ "id": 0
+ },
+ "previous/Ownable/Ownable_v1.sol": {
+ "id": 1
+ },
+ "previous/SafeMath/SafeMath_v1.sol": {
+ "id": 2
+ },
+ "previous/Token/Token_v1.sol": {
+ "id": 3
+ },
+ "previous/TokenTransferProxy/TokenTransferProxy_v1.sol": {
+ "id": 4
+ }
+ },
+ "sourceCodes": {
+ "previous/Exchange/Exchange_v1.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 solidity ^0.4.14;\n\nimport { TokenTransferProxy_v1 as TokenTransferProxy } from \"../TokenTransferProxy/TokenTransferProxy_v1.sol\";\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\nimport { SafeMath_v1 as SafeMath } from \"../SafeMath/SafeMath_v1.sol\";\n\n/// @title Exchange - Facilitates exchange of ERC20 tokens.\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract Exchange_v1 is SafeMath {\n\n // Error Codes\n enum Errors {\n ORDER_EXPIRED, // Order has already expired\n ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled\n ROUNDING_ERROR_TOO_LARGE, // Rounding error too large\n INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer\n }\n\n string constant public VERSION = \"1.0.0\";\n uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas\n\n address public ZRX_TOKEN_CONTRACT;\n address public TOKEN_TRANSFER_PROXY_CONTRACT;\n\n // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.\n mapping (bytes32 => uint) public filled;\n mapping (bytes32 => uint) public cancelled;\n\n event LogFill(\n address indexed maker,\n address taker,\n address indexed feeRecipient,\n address makerToken,\n address takerToken,\n uint filledMakerTokenAmount,\n uint filledTakerTokenAmount,\n uint paidMakerFee,\n uint paidTakerFee,\n bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair\n bytes32 orderHash\n );\n\n event LogCancel(\n address indexed maker,\n address indexed feeRecipient,\n address makerToken,\n address takerToken,\n uint cancelledMakerTokenAmount,\n uint cancelledTakerTokenAmount,\n bytes32 indexed tokens,\n bytes32 orderHash\n );\n\n event LogError(uint8 indexed errorId, bytes32 indexed orderHash);\n\n struct Order {\n address maker;\n address taker;\n address makerToken;\n address takerToken;\n address feeRecipient;\n uint makerTokenAmount;\n uint takerTokenAmount;\n uint makerFee;\n uint takerFee;\n uint expirationTimestampInSec;\n bytes32 orderHash;\n }\n\n function Exchange_v1(address _zrxToken, address _tokenTransferProxy) {\n ZRX_TOKEN_CONTRACT = _zrxToken;\n TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;\n }\n\n /*\n * Core exchange functions\n */\n\n /// @dev Fills the input order.\n /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.\n /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.\n /// @param fillTakerTokenAmount Desired amount of takerToken to fill.\n /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.\n /// @param v ECDSA signature parameter v.\n /// @param r ECDSA signature parameters r.\n /// @param s ECDSA signature parameters s.\n /// @return Total amount of takerToken filled in trade.\n function fillOrder(\n address[5] orderAddresses,\n uint[6] orderValues,\n uint fillTakerTokenAmount,\n bool shouldThrowOnInsufficientBalanceOrAllowance,\n uint8 v,\n bytes32 r,\n bytes32 s)\n public\n returns (uint filledTakerTokenAmount)\n {\n Order memory order = Order({\n maker: orderAddresses[0],\n taker: orderAddresses[1],\n makerToken: orderAddresses[2],\n takerToken: orderAddresses[3],\n feeRecipient: orderAddresses[4],\n makerTokenAmount: orderValues[0],\n takerTokenAmount: orderValues[1],\n makerFee: orderValues[2],\n takerFee: orderValues[3],\n expirationTimestampInSec: orderValues[4],\n orderHash: getOrderHash(orderAddresses, orderValues)\n });\n\n require(order.taker == address(0) || order.taker == msg.sender);\n require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);\n require(isValidSignature(\n order.maker,\n order.orderHash,\n v,\n r,\n s\n ));\n\n if (block.timestamp >= order.expirationTimestampInSec) {\n LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);\n return 0;\n }\n\n uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));\n filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);\n if (filledTakerTokenAmount == 0) {\n LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);\n return 0;\n }\n\n if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {\n LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);\n return 0;\n }\n\n if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {\n LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);\n return 0;\n }\n\n uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);\n uint paidMakerFee;\n uint paidTakerFee;\n filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);\n require(transferViaTokenTransferProxy(\n order.makerToken,\n order.maker,\n msg.sender,\n filledMakerTokenAmount\n ));\n require(transferViaTokenTransferProxy(\n order.takerToken,\n msg.sender,\n order.maker,\n filledTakerTokenAmount\n ));\n if (order.feeRecipient != address(0)) {\n if (order.makerFee > 0) {\n paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);\n require(transferViaTokenTransferProxy(\n ZRX_TOKEN_CONTRACT,\n order.maker,\n order.feeRecipient,\n paidMakerFee\n ));\n }\n if (order.takerFee > 0) {\n paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);\n require(transferViaTokenTransferProxy(\n ZRX_TOKEN_CONTRACT,\n msg.sender,\n order.feeRecipient,\n paidTakerFee\n ));\n }\n }\n\n LogFill(\n order.maker,\n msg.sender,\n order.feeRecipient,\n order.makerToken,\n order.takerToken,\n filledMakerTokenAmount,\n filledTakerTokenAmount,\n paidMakerFee,\n paidTakerFee,\n keccak256(order.makerToken, order.takerToken),\n order.orderHash\n );\n return filledTakerTokenAmount;\n }\n\n /// @dev Cancels the input order.\n /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.\n /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.\n /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.\n /// @return Amount of takerToken cancelled.\n function cancelOrder(\n address[5] orderAddresses,\n uint[6] orderValues,\n uint cancelTakerTokenAmount)\n public\n returns (uint)\n {\n Order memory order = Order({\n maker: orderAddresses[0],\n taker: orderAddresses[1],\n makerToken: orderAddresses[2],\n takerToken: orderAddresses[3],\n feeRecipient: orderAddresses[4],\n makerTokenAmount: orderValues[0],\n takerTokenAmount: orderValues[1],\n makerFee: orderValues[2],\n takerFee: orderValues[3],\n expirationTimestampInSec: orderValues[4],\n orderHash: getOrderHash(orderAddresses, orderValues)\n });\n\n require(order.maker == msg.sender);\n require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);\n\n if (block.timestamp >= order.expirationTimestampInSec) {\n LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);\n return 0;\n }\n\n uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));\n uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);\n if (cancelledTakerTokenAmount == 0) {\n LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);\n return 0;\n }\n\n cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);\n\n LogCancel(\n order.maker,\n order.feeRecipient,\n order.makerToken,\n order.takerToken,\n getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),\n cancelledTakerTokenAmount,\n keccak256(order.makerToken, order.takerToken),\n order.orderHash\n );\n return cancelledTakerTokenAmount;\n }\n\n /*\n * Wrapper functions\n */\n\n /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.\n /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.\n /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.\n /// @param fillTakerTokenAmount Desired amount of takerToken to fill.\n /// @param v ECDSA signature parameter v.\n /// @param r ECDSA signature parameters r.\n /// @param s ECDSA signature parameters s.\n function fillOrKillOrder(\n address[5] orderAddresses,\n uint[6] orderValues,\n uint fillTakerTokenAmount,\n uint8 v,\n bytes32 r,\n bytes32 s)\n public\n {\n require(fillOrder(\n orderAddresses,\n orderValues,\n fillTakerTokenAmount,\n false,\n v,\n r,\n s\n ) == fillTakerTokenAmount);\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction.\n /// @param orderAddresses Array of address arrays containing individual order addresses.\n /// @param orderValues Array of uint arrays containing individual order values.\n /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.\n /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.\n /// @param v Array ECDSA signature v parameters.\n /// @param r Array of ECDSA signature r parameters.\n /// @param s Array of ECDSA signature s parameters.\n function batchFillOrders(\n address[5][] orderAddresses,\n uint[6][] orderValues,\n uint[] fillTakerTokenAmounts,\n bool shouldThrowOnInsufficientBalanceOrAllowance,\n uint8[] v,\n bytes32[] r,\n bytes32[] s)\n public\n {\n for (uint i = 0; i < orderAddresses.length; i++) {\n fillOrder(\n orderAddresses[i],\n orderValues[i],\n fillTakerTokenAmounts[i],\n shouldThrowOnInsufficientBalanceOrAllowance,\n v[i],\n r[i],\n s[i]\n );\n }\n }\n\n /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.\n /// @param orderAddresses Array of address arrays containing individual order addresses.\n /// @param orderValues Array of uint arrays containing individual order values.\n /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.\n /// @param v Array ECDSA signature v parameters.\n /// @param r Array of ECDSA signature r parameters.\n /// @param s Array of ECDSA signature s parameters.\n function batchFillOrKillOrders(\n address[5][] orderAddresses,\n uint[6][] orderValues,\n uint[] fillTakerTokenAmounts,\n uint8[] v,\n bytes32[] r,\n bytes32[] s)\n public\n {\n for (uint i = 0; i < orderAddresses.length; i++) {\n fillOrKillOrder(\n orderAddresses[i],\n orderValues[i],\n fillTakerTokenAmounts[i],\n v[i],\n r[i],\n s[i]\n );\n }\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.\n /// @param orderAddresses Array of address arrays containing individual order addresses.\n /// @param orderValues Array of uint arrays containing individual order values.\n /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.\n /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.\n /// @param v Array ECDSA signature v parameters.\n /// @param r Array of ECDSA signature r parameters.\n /// @param s Array of ECDSA signature s parameters.\n /// @return Total amount of fillTakerTokenAmount filled in orders.\n function fillOrdersUpTo(\n address[5][] orderAddresses,\n uint[6][] orderValues,\n uint fillTakerTokenAmount,\n bool shouldThrowOnInsufficientBalanceOrAllowance,\n uint8[] v,\n bytes32[] r,\n bytes32[] s)\n public\n returns (uint)\n {\n uint filledTakerTokenAmount = 0;\n for (uint i = 0; i < orderAddresses.length; i++) {\n require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order\n filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(\n orderAddresses[i],\n orderValues[i],\n safeSub(fillTakerTokenAmount, filledTakerTokenAmount),\n shouldThrowOnInsufficientBalanceOrAllowance,\n v[i],\n r[i],\n s[i]\n ));\n if (filledTakerTokenAmount == fillTakerTokenAmount) break;\n }\n return filledTakerTokenAmount;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orderAddresses Array of address arrays containing individual order addresses.\n /// @param orderValues Array of uint arrays containing individual order values.\n /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.\n function batchCancelOrders(\n address[5][] orderAddresses,\n uint[6][] orderValues,\n uint[] cancelTakerTokenAmounts)\n public\n {\n for (uint i = 0; i < orderAddresses.length; i++) {\n cancelOrder(\n orderAddresses[i],\n orderValues[i],\n cancelTakerTokenAmounts[i]\n );\n }\n }\n\n /*\n * Constant public functions\n */\n\n /// @dev Calculates Keccak-256 hash of order with specified parameters.\n /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.\n /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.\n /// @return Keccak-256 hash of order.\n function getOrderHash(address[5] orderAddresses, uint[6] orderValues)\n public\n constant\n returns (bytes32)\n {\n return keccak256(\n address(this),\n orderAddresses[0], // maker\n orderAddresses[1], // taker\n orderAddresses[2], // makerToken\n orderAddresses[3], // takerToken\n orderAddresses[4], // feeRecipient\n orderValues[0], // makerTokenAmount\n orderValues[1], // takerTokenAmount\n orderValues[2], // makerFee\n orderValues[3], // takerFee\n orderValues[4], // expirationTimestampInSec\n orderValues[5] // salt\n );\n }\n\n /// @dev Verifies that an order signature is valid.\n /// @param signer address of signer.\n /// @param hash Signed Keccak-256 hash.\n /// @param v ECDSA signature parameter v.\n /// @param r ECDSA signature parameters r.\n /// @param s ECDSA signature parameters s.\n /// @return Validity of order signature.\n function isValidSignature(\n address signer,\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s)\n public\n constant\n returns (bool)\n {\n return signer == ecrecover(\n keccak256(\"\\x19Ethereum Signed Message:\\n32\", hash),\n v,\n r,\n s\n );\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(uint numerator, uint denominator, uint target)\n public\n constant\n returns (bool)\n {\n uint remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) return false; // No rounding error.\n\n uint errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n return errPercentageTimes1000000 > 1000;\n }\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(uint numerator, uint denominator, uint target)\n public\n constant\n returns (uint)\n {\n return safeDiv(safeMul(numerator, target), denominator);\n }\n\n /// @dev Calculates the sum of values already filled and cancelled for a given order.\n /// @param orderHash The Keccak-256 hash of the given order.\n /// @return Sum of values already filled and cancelled.\n function getUnavailableTakerTokenAmount(bytes32 orderHash)\n public\n constant\n returns (uint)\n {\n return safeAdd(filled[orderHash], cancelled[orderHash]);\n }\n\n\n /*\n * Internal functions\n */\n\n /// @dev Transfers a token using TokenTransferProxy transferFrom function.\n /// @param token Address of token to transferFrom.\n /// @param from Address transfering token.\n /// @param to Address receiving token.\n /// @param value Amount of token to transfer.\n /// @return Success of token transfer.\n function transferViaTokenTransferProxy(\n address token,\n address from,\n address to,\n uint value)\n internal\n returns (bool)\n {\n return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);\n }\n\n /// @dev Checks if any order transfers will fail.\n /// @param order Order struct of params that will be checked.\n /// @param fillTakerTokenAmount Desired amount of takerToken to fill.\n /// @return Predicted result of transfers.\n function isTransferable(Order order, uint fillTakerTokenAmount)\n internal\n constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.\n returns (bool)\n {\n address taker = msg.sender;\n uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);\n\n if (order.feeRecipient != address(0)) {\n bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;\n bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;\n uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);\n uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);\n uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;\n uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;\n\n if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX\n || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX\n || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX\n || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX\n ) return false;\n\n if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX\n || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)\n ) return false;\n if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX\n || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)\n ) return false;\n } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount\n || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount\n || getBalance(order.takerToken, taker) < fillTakerTokenAmount\n || getAllowance(order.takerToken, taker) < fillTakerTokenAmount\n ) return false;\n\n return true;\n }\n\n /// @dev Get token balance of an address.\n /// @param token Address of token.\n /// @param owner Address of owner.\n /// @return Token balance of owner.\n function getBalance(address token, address owner)\n internal\n constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.\n returns (uint)\n {\n return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy\n }\n\n /// @dev Get allowance of token given to TokenTransferProxy by an address.\n /// @param token Address of token.\n /// @param owner Address of owner.\n /// @return Allowance of token given to TokenTransferProxy by owner.\n function getAllowance(address token, address owner)\n internal\n constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.\n returns (uint)\n {\n return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy\n }\n}\n",
+ "previous/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "previous/SafeMath/SafeMath_v1.sol": "pragma solidity ^0.4.11;\n\ncontract SafeMath_v1 {\n function safeMul(uint a, uint b)\n internal\n constant\n returns (uint256)\n {\n uint c = a * b;\n assert(a == 0 || c / a == b);\n return c;\n }\n\n function safeDiv(uint a, uint b)\n internal\n constant\n returns (uint256)\n {\n uint c = a / b;\n return c;\n }\n\n function safeSub(uint a, uint b)\n internal\n constant\n returns (uint256)\n {\n assert(b <= a);\n return a - b;\n }\n\n function safeAdd(uint a, uint b)\n internal\n constant\n returns (uint256)\n {\n uint c = a + b;\n assert(c >= a);\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n constant\n returns (uint64)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n constant\n returns (uint64)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n constant\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n constant\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n",
+ "previous/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "previous/TokenTransferProxy/TokenTransferProxy_v1.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 solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenTransferProxy_v1 is Ownable {\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(authorized[msg.sender]);\n _;\n }\n\n modifier targetAuthorized(address target) {\n require(authorized[target]);\n _;\n }\n\n modifier targetNotAuthorized(address target) {\n require(!authorized[target]);\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n event LogAuthorizedAddressAdded(address indexed target, address indexed caller);\n event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);\n\n /*\n * Public functions\n */\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n public\n onlyOwner\n targetNotAuthorized(target)\n {\n authorized[target] = true;\n authorities.push(target);\n LogAuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n public\n onlyOwner\n targetAuthorized(target)\n {\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n LogAuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Calls into ERC20 Token contract, invoking transferFrom.\n /// @param token Address of token to transfer.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param value Amount of token to transfer.\n /// @return Success of transfer.\n function transferFrom(\n address token,\n address from,\n address to,\n uint value)\n public\n onlyAuthorized\n returns (bool)\n {\n return Token(token).transferFrom(from, to, value);\n }\n\n /*\n * Public constant functions\n */\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n public\n constant\n returns (address[])\n {\n return authorities;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xea4f765b6f4c7e5edd71d47b3d5c04db5d2ad5b4412f743cfd0c85a55fa42585",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x48bacb9266a570d521063ef5dd96e61686dbe788",
+ "links": {},
+ "constructorArgs": "[\"0x1d7022f5b17d2f8b695918fb48fa1089c9f85401\",\"0x1dc4c1cefef38a777b15aa20260a54e584b16c48\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/MultiSigWallet.json b/packages/migrations/artifacts/1.0.0/MultiSigWallet.json
new file mode 100644
index 000000000..474225616
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/MultiSigWallet.json
@@ -0,0 +1,580 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MultiSigWallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405162002385380380620023858339810180604052810190808051820192919060200180519060200190929190505050600082518260328211806200005757508181115b80620000635750600081145b806200006f5750600082145b156200007a57600080fd5b600092505b8451831015620001b1576002600086858151811015156200009c57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620001285750600085848151811015156200010657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16145b156200013357600080fd5b60016002600087868151811015156200014857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200007f565b8460039080519060200190620001c9929190620001dc565b50836004819055505050505050620002b1565b82805482825590600052602060002090810192821562000258579160200282015b82811115620002575782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190620001fd565b5b5090506200026791906200026b565b5090565b620002ae91905b80821115620002aa57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000272565b5090565b90565b6120c480620002c16000396000f30060806040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101e457806320ea8d86146102275780632f54bf6e146102545780633411c81c146102af57806354741525146103145780637065cb4814610363578063784547a7146103a65780638b51d13f146103eb5780639ace38c21461042c578063a0e67e2b14610517578063a8abe69a14610583578063b5dc40c314610627578063b77bf600146106a9578063ba51a6df146106d4578063c01a8c8414610701578063c64274741461072e578063d74f8edd146107d5578063dc8452cd14610800578063e20056e61461082b578063ee22610b1461088e575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34801561018357600080fd5b506101a2600480360381019080803590602001909291905050506108bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f057600080fd5b50610225600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108f9565b005b34801561023357600080fd5b5061025260048036038101908080359060200190929190505050610b92565b005b34801561026057600080fd5b50610295600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d38565b604051808215151515815260200191505060405180910390f35b3480156102bb57600080fd5b506102fa60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d58565b604051808215151515815260200191505060405180910390f35b34801561032057600080fd5b5061034d600480360381019080803515159060200190929190803515159060200190929190505050610d87565b6040518082815260200191505060405180910390f35b34801561036f57600080fd5b506103a4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e19565b005b3480156103b257600080fd5b506103d160048036038101908080359060200190929190505050611012565b604051808215151515815260200191505060405180910390f35b3480156103f757600080fd5b50610416600480360381019080803590602001909291905050506110f7565b6040518082815260200191505060405180910390f35b34801561043857600080fd5b50610457600480360381019080803590602001909291905050506111c2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561052357600080fd5b5061052c6112b7565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561056f578082015181840152602081019050610554565b505050509050019250505060405180910390f35b34801561058f57600080fd5b506105d06004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611345565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106135780820151818401526020810190506105f8565b505050509050019250505060405180910390f35b34801561063357600080fd5b50610652600480360381019080803590602001909291905050506114b6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561069557808201518184015260208101905061067a565b505050509050019250505060405180910390f35b3480156106b557600080fd5b506106be6116f3565b6040518082815260200191505060405180910390f35b3480156106e057600080fd5b506106ff600480360381019080803590602001909291905050506116f9565b005b34801561070d57600080fd5b5061072c600480360381019080803590602001909291905050506117ab565b005b34801561073a57600080fd5b506107bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611984565b6040518082815260200191505060405180910390f35b3480156107e157600080fd5b506107ea6119a3565b6040518082815260200191505060405180910390f35b34801561080c57600080fd5b506108156119a8565b6040518082815260200191505060405180910390f35b34801561083757600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ae565b005b34801561089a57600080fd5b506108b960048036038101908080359060200190929190505050611cc1565b005b6003818154811015156108ca57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093557600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561098e57600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b13578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a2157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b06576003600160038054905003815481101515610a7f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610ab957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b13565b81806001019250506109eb565b6001600381818054905003915081610b2b9190611fc7565b506003805490506004541115610b4a57610b496003805490506116f9565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610beb57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c5657600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610c8457600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610e1257838015610dc6575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610df95750828015610df8575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610e05576001820191505b8080600101915050610d8f565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e5357600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610eab57600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415610ed057600080fd5b6001600380549050016004546032821180610eea57508181115b80610ef55750600081145b80610f005750600082145b15610f0a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b6003805490508110156110ef5760016000858152602001908152602001600020600060038381548110151561105057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110cf576001820191505b6004548214156110e257600192506110f0565b808060010191505061101f565b5b5050919050565b600080600090505b6003805490508110156111bc5760016000848152602001908152602001600020600060038381548110151561113057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111af576001820191505b80806001019150506110ff565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561129a5780601f1061126f5761010080835404028352916020019161129a565b820191906000526020600020905b81548152906001019060200180831161127d57829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b6060600380548060200260200160405190810160405280929190818152602001828054801561133b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112f1575b5050505050905090565b60608060008060055460405190808252806020026020018201604052801561137c5781602001602082028038833980820191505090505b50925060009150600090505b600554811015611428578580156113bf575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806113f257508480156113f1575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b1561141b5780838381518110151561140657fe5b90602001906020020181815250506001820191505b8080600101915050611388565b8787036040519080825280602002602001820160405280156114595781602001602082028038833980820191505090505b5093508790505b868110156114ab57828181518110151561147657fe5b906020019060200201518489830381518110151561149057fe5b90602001906020020181815250508080600101915050611460565b505050949350505050565b6060806000806003805490506040519080825280602002602001820160405280156114f05781602001602082028038833980820191505090505b50925060009150600090505b60038054905081101561163d5760016000868152602001908152602001600020600060038381548110151561152d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611630576003818154811015156115b457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156115ed57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506114fc565b8160405190808252806020026020018201604052801561166c5781602001602082028038833980820191505090505b509350600090505b818110156116eb57828181518110151561168a57fe5b9060200190602002015184828151811015156116a257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611674565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173357600080fd5b60038054905081603282118061174857508181115b806117535750600081145b8061175e5750600082145b1561176857600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561180457600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561185e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118c857600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361197d85611cc1565b5050505050565b6000611991848484611e77565b905061199c816117ab565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119ea57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611a4357600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a9b57600080fd5b600092505b600380549050831015611b84578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611ad357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b775783600384815481101515611b2a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b84565b8280600101935050611aa0565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff1615611cf157600080fd5b611cfa83611012565b15611e7257600080848152602001908152602001600020915060018260030160006101000a81548160ff0219169083151502179055508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260010154836002016040518082805460018160011615610100020316600290048015611dd95780601f10611dae57610100808354040283529160200191611dd9565b820191906000526020600020905b815481529060010190602001808311611dbc57829003601f168201915b505091505060006040518083038185875af19250505015611e2657827f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e71565b827f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008260030160006101000a81548160ff0219169083151502179055505b5b505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415611e9e57600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f5d929190611ff3565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115611fee57818360005260206000209182019101611fed9190612073565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061203457805160ff1916838001178555612062565b82800160010185558215612062579182015b82811115612061578251825591602001919060010190612046565b5b50905061206f9190612073565b5090565b61209591905b80821115612091576000816000905550600101612079565b5090565b905600a165627a7a723058207800b1106b9c71e8a3e2369242d49547e78fd5ea65974850f4a1feca5658efbd0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2385 CODESIZE SUB DUP1 PUSH3 0x2385 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE DUP2 ADD SWAP1 DUP1 DUP1 MLOAD DUP3 ADD SWAP3 SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x57 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x63 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH3 0x6F JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH3 0x7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x1B1 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x9C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x128 JUMPI POP PUSH1 0x0 DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x106 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH3 0x133 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x148 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH3 0x7F JUMP JUMPDEST DUP5 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x1C9 SWAP3 SWAP2 SWAP1 PUSH3 0x1DC JUMP JUMPDEST POP DUP4 PUSH1 0x4 DUP2 SWAP1 SSTORE POP POP POP POP POP POP PUSH3 0x2B1 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x258 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x257 JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x1FD JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x267 SWAP2 SWAP1 PUSH3 0x26B JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x2AE SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x2AA JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x272 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x20C4 DUP1 PUSH3 0x2C1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11D JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x177 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1E4 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x314 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x42C JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x517 JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x627 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x72E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x7D5 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x82B JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x88E JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x175 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8F9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x252 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD38 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x320 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD87 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE19 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1012 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x416 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10F7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x438 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x457 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x11C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4D9 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x506 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x523 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x52C PUSH2 0x12B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x56F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x554 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1345 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x613 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5F8 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x633 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x652 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x14B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x695 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x67A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6BE PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6FF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16F9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x70D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x72C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x17AB JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x73A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1984 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7EA PUSH2 0x19A3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x80C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x815 PUSH2 0x19A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x88C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x19AE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B9 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1CC1 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8CA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x935 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x98E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xB13 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA21 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xB06 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAB9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xB13 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0x9EB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xB2B SWAP2 SWAP1 PUSH2 0x1FC7 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xB4A JUMPI PUSH2 0xB49 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x16F9 JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xBEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xC84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xE12 JUMPI DUP4 DUP1 ISZERO PUSH2 0xDC6 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xDF9 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xDF8 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xE05 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xD8F JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xE53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xEAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xED0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xEEA JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xEF5 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0xF00 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x10EF JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1050 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x10CF JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x10E2 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x10F0 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x101F JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x11BC JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1130 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x11AF JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x10FF JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x129A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x126F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x129A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x127D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x133B JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x12F1 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x137C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x1428 JUMPI DUP6 DUP1 ISZERO PUSH2 0x13BF JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x13F2 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x13F1 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x141B JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1406 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1388 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1459 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x14AB JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1476 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1490 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1460 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14F0 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x163D JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x152D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1630 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15B4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15ED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x14FC JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x166C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x16EB JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x168A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1674 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1748 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1753 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x175E JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1804 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x185E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x18C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x197D DUP6 PUSH2 0x1CC1 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1991 DUP5 DUP5 DUP5 PUSH2 0x1E77 JUMP JUMPDEST SWAP1 POP PUSH2 0x199C DUP2 PUSH2 0x17AB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x19EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1A43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1A9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x1B84 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1B77 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B2A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1B84 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x1AA0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1CF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFA DUP4 PUSH2 0x1012 JUMP JUMPDEST ISZERO PUSH2 0x1E72 JUMPI PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP PUSH1 0x1 DUP3 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1DD9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1DAE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1DD9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1DBC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1E26 JUMPI DUP3 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x1E71 JUMP JUMPDEST DUP3 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP3 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x1F5D SWAP3 SWAP2 SWAP1 PUSH2 0x1FF3 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1FEE JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FED SWAP2 SWAP1 PUSH2 0x2073 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2034 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2062 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2062 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2061 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2046 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x206F SWAP2 SWAP1 PUSH2 0x2073 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2095 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2091 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2079 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH25 0xB1106B9C71E8A3E2369242D49547E78FD5EA65974850F4A1 INVALID 0xca JUMP PC 0xef 0xbd STOP 0x29 ",
+ "sourceMap": "186:11249:0:-;;;2814:370;8:9:-1;5:2;;;30:1;27;20:12;5:2;2814:370:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2959:6;2913:7;:14;2929:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;2966:1;2959:8;;2954:168;2971:7;:14;2969:1;:16;2954:168;;;3010:7;:19;3018:7;3026:1;3018:10;;;;;;;;;;;;;;;;;;3010:19;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3047:1;3033:7;3041:1;3033:10;;;;;;;;;;;;;;;;;;:15;;;3010:38;3006:65;;;3066:5;;;3006:65;3107:4;3085:7;:19;3093:7;3101:1;3093:10;;;;;;;;;;;;;;;;;;3085:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;2987:3;;;;;;;2954:168;;;3140:7;3131:6;:16;;;;;;;;;;;;:::i;:::-;;3168:9;3157:8;:20;;;;2814:370;;;;;186:11249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610177578063173825d9146101e457806320ea8d86146102275780632f54bf6e146102545780633411c81c146102af57806354741525146103145780637065cb4814610363578063784547a7146103a65780638b51d13f146103eb5780639ace38c21461042c578063a0e67e2b14610517578063a8abe69a14610583578063b5dc40c314610627578063b77bf600146106a9578063ba51a6df146106d4578063c01a8c8414610701578063c64274741461072e578063d74f8edd146107d5578063dc8452cd14610800578063e20056e61461082b578063ee22610b1461088e575b6000341115610175573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b34801561018357600080fd5b506101a2600480360381019080803590602001909291905050506108bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f057600080fd5b50610225600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108f9565b005b34801561023357600080fd5b5061025260048036038101908080359060200190929190505050610b92565b005b34801561026057600080fd5b50610295600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d38565b604051808215151515815260200191505060405180910390f35b3480156102bb57600080fd5b506102fa60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d58565b604051808215151515815260200191505060405180910390f35b34801561032057600080fd5b5061034d600480360381019080803515159060200190929190803515159060200190929190505050610d87565b6040518082815260200191505060405180910390f35b34801561036f57600080fd5b506103a4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e19565b005b3480156103b257600080fd5b506103d160048036038101908080359060200190929190505050611012565b604051808215151515815260200191505060405180910390f35b3480156103f757600080fd5b50610416600480360381019080803590602001909291905050506110f7565b6040518082815260200191505060405180910390f35b34801561043857600080fd5b50610457600480360381019080803590602001909291905050506111c2565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156104d95780820151818401526020810190506104be565b50505050905090810190601f1680156105065780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561052357600080fd5b5061052c6112b7565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561056f578082015181840152602081019050610554565b505050509050019250505060405180910390f35b34801561058f57600080fd5b506105d06004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611345565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106135780820151818401526020810190506105f8565b505050509050019250505060405180910390f35b34801561063357600080fd5b50610652600480360381019080803590602001909291905050506114b6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561069557808201518184015260208101905061067a565b505050509050019250505060405180910390f35b3480156106b557600080fd5b506106be6116f3565b6040518082815260200191505060405180910390f35b3480156106e057600080fd5b506106ff600480360381019080803590602001909291905050506116f9565b005b34801561070d57600080fd5b5061072c600480360381019080803590602001909291905050506117ab565b005b34801561073a57600080fd5b506107bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611984565b6040518082815260200191505060405180910390f35b3480156107e157600080fd5b506107ea6119a3565b6040518082815260200191505060405180910390f35b34801561080c57600080fd5b506108156119a8565b6040518082815260200191505060405180910390f35b34801561083757600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119ae565b005b34801561089a57600080fd5b506108b960048036038101908080359060200190929190505050611cc1565b005b6003818154811015156108ca57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561093557600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561098e57600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610b13578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610a2157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610b06576003600160038054905003815481101515610a7f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610ab957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b13565b81806001019250506109eb565b6001600381818054905003915081610b2b9190611fc7565b506003805490506004541115610b4a57610b496003805490506116f9565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610beb57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610c5657600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610c8457600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b600554811015610e1257838015610dc6575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610df95750828015610df8575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610e05576001820191505b8080600101915050610d8f565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610e5357600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610eab57600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415610ed057600080fd5b6001600380549050016004546032821180610eea57508181115b80610ef55750600081145b80610f005750600082145b15610f0a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b6003805490508110156110ef5760016000858152602001908152602001600020600060038381548110151561105057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156110cf576001820191505b6004548214156110e257600192506110f0565b808060010191505061101f565b5b5050919050565b600080600090505b6003805490508110156111bc5760016000848152602001908152602001600020600060038381548110151561113057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111af576001820191505b80806001019150506110ff565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561129a5780601f1061126f5761010080835404028352916020019161129a565b820191906000526020600020905b81548152906001019060200180831161127d57829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b6060600380548060200260200160405190810160405280929190818152602001828054801561133b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112f1575b5050505050905090565b60608060008060055460405190808252806020026020018201604052801561137c5781602001602082028038833980820191505090505b50925060009150600090505b600554811015611428578580156113bf575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806113f257508480156113f1575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b1561141b5780838381518110151561140657fe5b90602001906020020181815250506001820191505b8080600101915050611388565b8787036040519080825280602002602001820160405280156114595781602001602082028038833980820191505090505b5093508790505b868110156114ab57828181518110151561147657fe5b906020019060200201518489830381518110151561149057fe5b90602001906020020181815250508080600101915050611460565b505050949350505050565b6060806000806003805490506040519080825280602002602001820160405280156114f05781602001602082028038833980820191505090505b50925060009150600090505b60038054905081101561163d5760016000868152602001908152602001600020600060038381548110151561152d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611630576003818154811015156115b457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683838151811015156115ed57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b80806001019150506114fc565b8160405190808252806020026020018201604052801561166c5781602001602082028038833980820191505090505b509350600090505b818110156116eb57828181518110151561168a57fe5b9060200190602002015184828151811015156116a257fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611674565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561173357600080fd5b60038054905081603282118061174857508181115b806117535750600081145b8061175e5750600082145b1561176857600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561180457600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561185e57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118c857600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361197d85611cc1565b5050505050565b6000611991848484611e77565b905061199c816117ab565b9392505050565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119ea57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611a4357600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a9b57600080fd5b600092505b600380549050831015611b84578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611ad357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611b775783600384815481101515611b2a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611b84565b8280600101935050611aa0565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff1615611cf157600080fd5b611cfa83611012565b15611e7257600080848152602001908152602001600020915060018260030160006101000a81548160ff0219169083151502179055508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260010154836002016040518082805460018160011615610100020316600290048015611dd95780601f10611dae57610100808354040283529160200191611dd9565b820191906000526020600020905b815481529060010190602001808311611dbc57829003601f168201915b505091505060006040518083038185875af19250505015611e2657827f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611e71565b827f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008260030160006101000a81548160ff0219169083151502179055505b5b505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff161415611e9e57600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190611f5d929190611ff3565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115611fee57818360005260206000209182019101611fed9190612073565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061203457805160ff1916838001178555612062565b82800160010185558215612062579182015b82811115612061578251825591602001919060010190612046565b5b50905061206f9190612073565b5090565b61209591905b80821115612091576000816000905550600101612079565b5090565b905600a165627a7a723058207800b1106b9c71e8a3e2369242d49547e78fd5ea65974850f4a1feca5658efbd0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11D JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x177 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1E4 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x254 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2AF JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x314 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x363 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x3A6 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x3EB JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x42C JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x517 JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x627 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x6A9 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x6D4 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x701 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x72E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x7D5 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x800 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x82B JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x88E JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x175 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8BB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x225 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x8F9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x252 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x295 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD38 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x320 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD87 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE19 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1012 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x416 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10F7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x438 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x457 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x11C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4D9 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4BE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x506 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x523 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x52C PUSH2 0x12B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x56F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x554 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5D0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1345 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x613 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5F8 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x633 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x652 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x14B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x695 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x67A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6BE PUSH2 0x16F3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6FF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x16F9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x70D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x72C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x17AB JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x73A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1984 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7EA PUSH2 0x19A3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x80C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x815 PUSH2 0x19A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x837 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x88C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x19AE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8B9 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1CC1 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8CA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x935 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x98E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xB13 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA21 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xB06 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAB9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xB13 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0x9EB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xB2B SWAP2 SWAP1 PUSH2 0x1FC7 JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xB4A JUMPI PUSH2 0xB49 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x16F9 JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xBEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xC56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xC84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xE12 JUMPI DUP4 DUP1 ISZERO PUSH2 0xDC6 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xDF9 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xDF8 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xE05 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xD8F JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xE53 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xEAB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xED0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xEEA JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xEF5 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0xF00 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0xF0A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x10EF JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1050 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x10CF JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x10E2 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x10F0 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x101F JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x11BC JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1130 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x11AF JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x10FF JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x129A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x126F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x129A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x127D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x133B JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x12F1 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x137C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x1428 JUMPI DUP6 DUP1 ISZERO PUSH2 0x13BF JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x13F2 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x13F1 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x141B JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1406 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1388 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1459 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x14AB JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1476 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1490 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1460 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14F0 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x163D JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x152D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1630 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15B4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15ED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x14FC JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x166C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x16EB JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x168A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16A2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1674 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1733 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1748 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1753 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x175E JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1804 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x185E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x18C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x197D DUP6 PUSH2 0x1CC1 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1991 DUP5 DUP5 DUP5 PUSH2 0x1E77 JUMP JUMPDEST SWAP1 POP PUSH2 0x199C DUP2 PUSH2 0x17AB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x19EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1A43 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1A9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x1B84 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AD3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1B77 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B2A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1B84 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x1AA0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1CF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFA DUP4 PUSH2 0x1012 JUMP JUMPDEST ISZERO PUSH2 0x1E72 JUMPI PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP PUSH1 0x1 DUP3 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1DD9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1DAE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1DD9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1DBC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1E26 JUMPI DUP3 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x1E71 JUMP JUMPDEST DUP3 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP3 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1E9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x1F5D SWAP3 SWAP2 SWAP1 PUSH2 0x1FF3 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x1FEE JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FED SWAP2 SWAP1 PUSH2 0x2073 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2034 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2062 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2062 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2061 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2046 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x206F SWAP2 SWAP1 PUSH2 0x2073 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2095 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2091 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x2079 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH25 0xB1106B9C71E8A3E2369242D49547E78FD5EA65974850F4A1 INVALID 0xca JUMP PC 0xef 0xbd STOP 0x29 ",
+ "sourceMap": "186:11249:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2519:1;2507:9;:13;2503:61;;;2542:10;2534:30;;;2554:9;2534:30;;;;;;;;;;;;;;;;;;2503:61;186:11249;936:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3711:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3711:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6274:291;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6274:291:0;;;;;;;;;;;;;;;;;;;;;;;;;;890:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;890:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;820:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9136:319;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9136:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3311:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3311:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7304:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7304:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8622:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8622:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;765:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9539:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9539:115:0;;;;;;;;;;;;;;;;;10757:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10757:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10757:676:0;;;;;;;;;;;;;;;;;9833:575;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9833:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9833:575:0;;;;;;;;;;;;;;;;;991:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;991:28:0;;;;;;;;;;;;;;;;;;;;;;;4990:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4990:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;5806:344;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5806:344:0;;;;;;;;;;;;;;;;;;;;;;;;;;5456:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5456:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;217:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;217:41:0;;;;;;;;;;;;;;;;;;;;;;;965:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;965:20:0;;;;;;;;;;;;;;;;;;;;;;;4370:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4370:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6679:474;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6679:474:0;;;;;;;;;;;;;;;;;;;;;;;;;;936:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3711:460::-;3859:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3801:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;3839:5;3822:7;:14;3830:5;3822:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3866:1;3859:8;;3854:170;3887:1;3871:6;:13;;;;:17;3869:1;:19;3854:170;;;3924:5;3911:18;;:6;3918:1;3911:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3907:117;;;3961:6;3984:1;3968:6;:13;;;;:17;3961:25;;;;;;;;;;;;;;;;;;;;;;;;;;;3949:6;3956:1;3949:9;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4004:5;;3907:117;3890:3;;;;;;;3854:170;;;4050:1;4033:6;:18;;;;;;;;;;;;;;:::i;:::-;;4076:6;:13;;;;4065:8;;:24;4061:74;;;4103:32;4121:6;:13;;;;4103:17;:32::i;:::-;4061:74;4158:5;4145:19;;;;;;;;;;;;1242:1;3711:460;;:::o;6274:291::-;6357:10;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;6387:13;6402:10;1694:13;:28;1708:13;1694:28;;;;;;;;;;;:35;1723:5;1694:35;;;;;;;;;;;;;;;;;;;;;;;;;1693:36;1689:59;;;1743:5;;;1689:59;6434:13;1976:12;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;6506:5;6463:13;:28;6477:13;6463:28;;;;;;;;;;;:40;6492:10;6463:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;6544:13;6532:10;6521:37;;;;;;;;;;;;1758:1;1463;;6274:291;;:::o;890:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;820:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9136:319::-;9243:10;9274:6;9281:1;9274:8;;9269:179;9286:16;;9284:1;:18;9269:179;;;9328:7;:36;;;;;9340:12;:15;9353:1;9340:15;;;;;;;;;;;:24;;;;;;;;;;;;9339:25;9328:36;:92;;;;9384:8;:36;;;;;9396:12;:15;9409:1;9396:15;;;;;;;;;;;:24;;;;;;;;;;;;9384:36;9328:92;9321:127;;;9447:1;9438:10;;;;9321:127;9304:3;;;;;;;9269:179;;;9136:319;;;;;:::o;3311:277::-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3404:5;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;3427:5;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;3475:1;3459:6;:13;;;;:17;3478:8;;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;3519:4;3502:7;:14;3510:5;3502:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3533:6;3545:5;3533:18;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;3533:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3575:5;3561:20;;;;;;;;;;;;2146:1;;1355;1242;3311:277;:::o;7304:337::-;7394:4;7414:10;7443:6;7427:1;7414:14;;7450:1;7443:8;;7438:197;7455:6;:13;;;;7453:1;:15;7438:197;;;7493:13;:28;7507:13;7493:28;;;;;;;;;;;:39;7522:6;7529:1;7522:9;;;;;;;;;;;;;;;;;;;;;;;;;;;7493:39;;;;;;;;;;;;;;;;;;;;;;;;;7489:71;;;7559:1;7550:10;;;;7489:71;7587:8;;7578:5;:17;7574:50;;;7620:4;7613:11;;;;7574:50;7470:3;;;;;;;7438:197;;;7304:337;;;;;;:::o;8622:252::-;8721:10;8752:6;8759:1;8752:8;;8747:120;8764:6;:13;;;;8762:1;:15;8747:120;;;8800:13;:28;8814:13;8800:28;;;;;;;;;;;:39;8829:6;8836:1;8829:9;;;;;;;;;;;;;;;;;;;;;;;;;;;8800:39;;;;;;;;;;;;;;;;;;;;;;;;;8796:71;;;8866:1;8857:10;;;;8796:71;8779:3;;;;;;;8747:120;;;8622:252;;;;:::o;765:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9539:115::-;9609:9;9641:6;9634:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;:::o;10757:676::-;10882:22;10920:32;10993:10;11017:6;10966:16;;10955:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10955:28:0;;;;10920:63;;11006:1;10993:14;;11040:1;11038:3;;11033:250;11045:16;;11043:1;:18;11033:250;;;11087:7;:36;;;;;11099:12;:15;11112:1;11099:15;;;;;;;;;;;:24;;;;;;;;;;;;11098:25;11087:36;:92;;;;11143:8;:36;;;;;11155:12;:15;11168:1;11155:15;;;;;;;;;;;:24;;;;;;;;;;;;11143:36;11087:92;11080:203;;;11239:1;11211:18;11230:5;11211:25;;;;;;;;;;;;;;;;;:29;;;;;11267:1;11258:10;;;;11080:203;11063:3;;;;;;;11033:250;;;11326:4;11321:2;:9;11310:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;11310:21:0;;;;11292:39;;11348:4;11346:6;;11341:85;11356:2;11354:1;:4;11341:85;;;11405:18;11424:1;11405:21;;;;;;;;;;;;;;;;;;11377:15;11397:4;11393:1;:8;11377:25;;;;;;;;;;;;;;;;;:49;;;;;11360:3;;;;;;;11341:85;;;10757:676;;;;;;;;;:::o;9833:575::-;9928:24;9968:34;10043:10;10067:6;10019;:13;;;;10005:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10005:28:0;;;;9968:65;;10056:1;10043:14;;10090:1;10088:3;;10083:186;10095:6;:13;;;;10093:1;:15;10083:186;;;10131:13;:28;10145:13;10131:28;;;;;;;;;;;:39;10160:6;10167:1;10160:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10131:39;;;;;;;;;;;;;;;;;;;;;;;;;10127:142;;;10217:6;10224:1;10217:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10190:17;10208:5;10190:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10253:1;10244:10;;;;10127:142;10110:3;;;;;;;10083:186;;;10309:5;10295:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10295:20:0;;;;10278:37;;10332:1;10330:3;;10325:76;10337:5;10335:1;:7;10325:76;;;10381:17;10399:1;10381:20;;;;;;;;;;;;;;;;;;10361:14;10376:1;10361:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10344:3;;;;;;;10325:76;;;9833:575;;;;;;:::o;991:28::-;;;;:::o;4990:207::-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;5092:6;:13;;;;5107:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;5143:9;5132:8;:20;;;;5162:28;5180:9;5162:28;;;;;;;;;;;;;;;;;;1242:1;;4990:207;:::o;5806:344::-;5889:10;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;5927:13;1581:1;1538:12;:27;1551:13;1538:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;1534:67;;;1596:5;;;1534:67;5963:13;5978:10;1843:13;:28;1857:13;1843:28;;;;;;;;;;;:35;1872:5;1843:35;;;;;;;;;;;;;;;;;;;;;;;;;1839:58;;;1892:5;;;1839:58;6047:4;6004:13;:28;6018:13;6004:28;;;;;;;;;;;:40;6033:10;6004:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;6086:13;6074:10;6061:39;;;;;;;;;;;;6110:33;6129:13;6110:18;:33::i;:::-;1611:1;;1463;5806:344;;:::o;5456:244::-;5560:18;5610:40;5625:11;5638:5;5645:4;5610:14;:40::i;:::-;5594:56;;5660:33;5679:13;5660:18;:33::i;:::-;5456:244;;;;;:::o;217:41::-;256:2;217:41;:::o;965:20::-;;;;:::o;4370:449::-;4541:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;4479:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;4512:8;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;4548:1;4541:8;;4536:149;4553:6;:13;;;;4551:1;:15;4536:149;;;4602:5;4589:18;;:6;4596:1;4589:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4585:100;;;4639:8;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4665:5;;4585:100;4568:3;;;;;;;4536:149;;;4711:5;4694:7;:14;4702:5;4694:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4746:4;4726:7;:17;4734:8;4726:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4773:5;4760:19;;;;;;;;;;;;4803:8;4789:23;;;;;;;;;;;;1463:1;1242;4370:449;;;:::o;6679:474::-;6837:14;6762:13;1976:12;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;6795:26;6807:13;6795:11;:26::i;:::-;6791:356;;;6854:12;:27;6867:13;6854:27;;;;;;;;;;;6837:44;;6909:4;6895:2;:11;;;:18;;;;;;;;;;;;;;;;;;6931:2;:14;;;;;;;;;;;;:19;;6957:2;:8;;;6967:2;:7;;6931:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6927:210;;;7003:13;6993:24;;;;;;;;;;6927:210;;;7071:13;7054:31;;;;;;;;;;7117:5;7103:2;:11;;;:19;;;;;;;;;;;;;;;;;;6927:210;6791:356;6679:474;;;:::o;7974:451::-;8106:18;8076:11;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;8156:16;;8140:32;;8212:140;;;;;;;;;8251:11;8212:140;;;;;;8283:5;8212:140;;;;8308:4;8212:140;;;;8336:5;8212:140;;;;;8182:12;:27;8195:13;8182:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8382:1;8362:16;;:21;;;;;;;;;;;8404:13;8393:25;;;;;;;;;;7974:451;;;;;;:::o;186:11249::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": "pragma solidity ^0.4.10;\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xe4dcaad5ebc708ef4258ff1a4152c7b94956a61f99db39fb7ae3003cc7087234",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLock.json b/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLock.json
new file mode 100644
index 000000000..89345817b
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLock.json
@@ -0,0 +1,664 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MultiSigWalletWithTimeLock",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b50604051620025af380380620025af8339810180604052810190808051820192919060200180519060200190929190805190602001909291905050508282600082518260328211806200006357508181115b806200006f5750600081145b806200007b5750600082145b156200008657600080fd5b600092505b8451831015620001bd57600260008685815181101515620000a857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620001345750600085848151811015156200011257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16145b156200013f57600080fd5b60016002600087868151811015156200015457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555082806001019350506200008b565b8460039080519060200190620001d5929190620001f2565b5083600481905550505050505080600681905550505050620002c7565b8280548282559060005260206000209081019282156200026e579160200282015b828111156200026d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000213565b5b5090506200027d919062000281565b5090565b620002c491905b80821115620002c057600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010162000288565b5090565b90565b6122d880620002d76000396000f30060806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610198578063173825d91461020557806320ea8d86146102485780632f54bf6e146102755780633411c81c146102d057806337bd78a01461033557806354741525146103605780637065cb48146103af578063784547a7146103f25780637ad28c51146104375780638b51d13f146104645780639ace38c2146104a5578063a0e67e2b14610590578063a8abe69a146105fc578063b5dc40c3146106a0578063b77bf60014610722578063ba51a6df1461074d578063c01a8c841461077a578063c6427474146107a7578063d38f2d821461084e578063d74f8edd1461088f578063dc8452cd146108ba578063e20056e6146108e5578063ee22610b14610948575b6000341115610196573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b3480156101a457600080fd5b506101c360048036038101908080359060200190929190505050610975565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561021157600080fd5b50610246600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109b3565b005b34801561025457600080fd5b5061027360048036038101908080359060200190929190505050610c4c565b005b34801561028157600080fd5b506102b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e09565b604051808215151515815260200191505060405180910390f35b3480156102dc57600080fd5b5061031b60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e29565b604051808215151515815260200191505060405180910390f35b34801561034157600080fd5b5061034a610e58565b6040518082815260200191505060405180910390f35b34801561036c57600080fd5b50610399600480360381019080803515159060200190929190803515159060200190929190505050610e5e565b6040518082815260200191505060405180910390f35b3480156103bb57600080fd5b506103f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef0565b005b3480156103fe57600080fd5b5061041d600480360381019080803590602001909291905050506110e9565b604051808215151515815260200191505060405180910390f35b34801561044357600080fd5b50610462600480360381019080803590602001909291905050506111ce565b005b34801561047057600080fd5b5061048f60048036038101908080359060200190929190505050611249565b6040518082815260200191505060405180910390f35b3480156104b157600080fd5b506104d060048036038101908080359060200190929190505050611314565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b83811015610552578082015181840152602081019050610537565b50505050905090810190601f16801561057f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561059c57600080fd5b506105a5611409565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e85780820151818401526020810190506105cd565b505050509050019250505060405180910390f35b34801561060857600080fd5b506106496004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611497565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068c578082015181840152602081019050610671565b505050509050019250505060405180910390f35b3480156106ac57600080fd5b506106cb60048036038101908080359060200190929190505050611608565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561070e5780820151818401526020810190506106f3565b505050509050019250505060405180910390f35b34801561072e57600080fd5b50610737611845565b6040518082815260200191505060405180910390f35b34801561075957600080fd5b506107786004803603810190808035906020019092919050505061184b565b005b34801561078657600080fd5b506107a5600480360381019080803590602001909291905050506118fd565b005b3480156107b357600080fd5b50610838600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611afd565b6040518082815260200191505060405180910390f35b34801561085a57600080fd5b5061087960048036038101908080359060200190929190505050611b1c565b6040518082815260200191505060405180910390f35b34801561089b57600080fd5b506108a4611b34565b6040518082815260200191505060405180910390f35b3480156108c657600080fd5b506108cf611b39565b6040518082815260200191505060405180910390f35b3480156108f157600080fd5b50610946600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b3f565b005b34801561095457600080fd5b5061097360048036038101908080359060200190929190505050611e52565b005b60038181548110151561098457fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109ef57600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610a4857600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610bcd578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610adb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610bc0576003600160038054905003815481101515610b3957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610b7357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bcd565b8180600101925050610aa5565b6001600381818054905003915081610be591906121db565b506003805490506004541115610c0457610c0360038054905061184b565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d1057600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610d3e57600080fd5b84610d48816110e9565b151515610d5457600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60065481565b600080600090505b600554811015610ee957838015610e9d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610ed05750828015610ecf575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610edc576001820191505b8080600101915050610e66565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f2a57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f8257600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415610fa757600080fd5b6001600380549050016004546032821180610fc157508181115b80610fcc5750600081145b80610fd75750600082145b15610fe157600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b6003805490508110156111c65760016000858152602001908152602001600020600060038381548110151561112757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111a6576001820191505b6004548214156111b957600192506111c7565b80806001019150506110f6565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561120857600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b60038054905081101561130e5760016000848152602001908152602001600020600060038381548110151561128257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611301576001820191505b8080600101915050611251565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ec5780601f106113c1576101008083540402835291602001916113ec565b820191906000526020600020905b8154815290600101906020018083116113cf57829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b6060600380548060200260200160405190810160405280929190818152602001828054801561148d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611443575b5050505050905090565b6060806000806005546040519080825280602002602001820160405280156114ce5781602001602082028038833980820191505090505b50925060009150600090505b60055481101561157a57858015611511575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806115445750848015611543575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b1561156d5780838381518110151561155857fe5b90602001906020020181815250506001820191505b80806001019150506114da565b8787036040519080825280602002602001820160405280156115ab5781602001602082028038833980820191505090505b5093508790505b868110156115fd5782818151811015156115c857fe5b90602001906020020151848983038151811015156115e257fe5b906020019060200201818152505080806001019150506115b2565b505050949350505050565b6060806000806003805490506040519080825280602002602001820160405280156116425781602001602082028038833980820191505090505b50925060009150600090505b60038054905081101561178f5760016000868152602001908152602001600020600060038381548110151561167f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117825760038181548110151561170657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561173f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061164e565b816040519080825280602002602001820160405280156117be5781602001602082028038833980820191505090505b509350600090505b8181101561183d5782818151811015156117dc57fe5b9060200190602002015184828151811015156117f457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117c6565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188557600080fd5b60038054905081603282118061189a57508181115b806118a55750600081145b806118b05750600082145b156118ba57600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561195657600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119b057600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a1a57600080fd5b84611a24816110e9565b151515611a3057600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611ae5866110e9565b15611af557611af48642612037565b5b505050505050565b6000611b0a84848461208b565b9050611b15816118fd565b9392505050565b60076020528060005260406000206000915090505481565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7b57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bd457600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c2c57600080fd5b600092505b600380549050831015611d15578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d085783600384815481101515611cbb57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d15565b8280600101935050611c31565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff1615611e8257600080fd5b82611e8c816110e9565b1515611e9757600080fd5b836006546007600083815260200190815260200160002054014210151515611ebe57600080fd5b600080868152602001908152602001600020935060018460030160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460010154856002016040518082805460018160011615610100020316600290048015611f985780601f10611f6d57610100808354040283529160200191611f98565b820191906000526020600020905b815481529060010190602001808311611f7b57829003601f168201915b505091505060006040518083038185875af19250505015611fe557847f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612030565b847f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008460030160006101000a81548160ff0219169083151502179055505b5050505050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614156120b257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190612171929190612207565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115612202578183600052602060002091820191016122019190612287565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061224857805160ff1916838001178555612276565b82800160010185558215612276579182015b8281111561227557825182559160200191906001019061225a565b5b5090506122839190612287565b5090565b6122a991905b808211156122a557600081600090555060010161228d565b5090565b905600a165627a7a723058202f1c20164401b86f77a2783be7a520331c1545ffca80947f1ae34489f487a9d60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x25AF CODESIZE SUB DUP1 PUSH3 0x25AF DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE DUP2 ADD SWAP1 DUP1 DUP1 MLOAD DUP3 ADD SWAP3 SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP3 DUP3 PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x63 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x6F JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH3 0x7B JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH3 0x86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x1BD JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xA8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x134 JUMPI POP PUSH1 0x0 DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x112 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH3 0x13F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x154 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH3 0x8B JUMP JUMPDEST DUP5 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x1D5 SWAP3 SWAP2 SWAP1 PUSH3 0x1F2 JUMP JUMPDEST POP DUP4 PUSH1 0x4 DUP2 SWAP1 SSTORE POP POP POP POP POP POP DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP PUSH3 0x2C7 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x26E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x26D JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x213 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x27D SWAP2 SWAP1 PUSH3 0x281 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x2C4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x2C0 JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x288 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x22D8 DUP1 PUSH3 0x2D7 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13E JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x437 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x464 JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x590 JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x5FC JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x6A0 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x74D JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x77A JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x7A7 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x84E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x88F JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x8BA JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x948 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x196 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x975 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x246 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9B3 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x273 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC4C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31B PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE29 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34A PUSH2 0xE58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x399 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE5E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3F0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xEF0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x443 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x462 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x11CE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x470 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1249 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4D0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1314 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x552 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x537 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x57F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A5 PUSH2 0x1409 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5E8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5CD JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x649 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1497 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x68C JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6CB PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1608 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x70E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6F3 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x737 PUSH2 0x1845 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x778 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x184B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x786 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7A5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x18FD JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x838 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1AFD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x879 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B1C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8A4 PUSH2 0x1B34 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8CF PUSH2 0x1B39 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B3F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x954 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x973 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E52 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x984 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x9EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xBCD JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB39 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB73 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xBCD JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xBE5 SWAP2 SWAP1 PUSH2 0x21DB JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xC04 JUMPI PUSH2 0xC03 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x184B JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xCA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xD3E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0xD48 DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0xD54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xEE9 JUMPI DUP4 DUP1 ISZERO PUSH2 0xE9D JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xED0 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xECF JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xEDC JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xE66 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xF2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xFA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xFC1 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xFCC JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0xFD7 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0xFE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x11C6 JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1127 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x11A6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x11B9 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x11C7 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x10F6 JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x130E JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1282 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1301 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1251 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x13EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x13C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x13EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x13CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x148D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1443 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14CE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x157A JUMPI DUP6 DUP1 ISZERO PUSH2 0x1511 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x1544 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x1543 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x156D JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1558 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x14DA JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x15AB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15FD JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15C8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15E2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x15B2 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1642 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x178F JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x167F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1782 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1706 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x173F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x164E JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17BE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x183D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17DC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17F4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x17C6 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1885 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x189A JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x18A5 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x18B0 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x18BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1A1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1A24 DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0x1A30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x1AE5 DUP7 PUSH2 0x10E9 JUMP JUMPDEST ISZERO PUSH2 0x1AF5 JUMPI PUSH2 0x1AF4 DUP7 TIMESTAMP PUSH2 0x2037 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B0A DUP5 DUP5 DUP5 PUSH2 0x208B JUMP JUMPDEST SWAP1 POP PUSH2 0x1B15 DUP2 PUSH2 0x18FD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1BD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1C2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x1D15 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C64 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1D08 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CBB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1D15 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x1C31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1E82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x1E8C DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD TIMESTAMP LT ISZERO ISZERO ISZERO PUSH2 0x1EBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP4 POP PUSH1 0x1 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x1 ADD SLOAD DUP6 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1F98 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F6D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1F98 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F7B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1FE5 JUMPI DUP5 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x2030 JUMP JUMPDEST DUP5 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x7 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x20B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2171 SWAP3 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2202 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2201 SWAP2 SWAP1 PUSH2 0x2287 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2248 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2276 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2276 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2275 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x225A JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2283 SWAP2 SWAP1 PUSH2 0x2287 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x22A9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x22A5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x228D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2f SHR KECCAK256 AND DIFFICULTY ADD 0xb8 PUSH16 0x77A2783BE7A520331C1545FFCA80947F BYTE 0xe3 DIFFICULTY DUP10 DELEGATECALL DUP8 0xa9 0xd6 STOP 0x29 ",
+ "sourceMap": "855:3594:1:-;;;1904:213;8:9:-1;5:2;;;30:1;27;20:12;5:2;1904:213:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2038:7;2047:9;2959:6:0;2913:7;:14;2929:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;2966:1;2959:8;;2954:168;2971:7;:14;2969:1;:16;2954:168;;;3010:7;:19;3018:7;3026:1;3018:10;;;;;;;;;;;;;;;;;;3010:19;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3047:1;3033:7;3041:1;3033:10;;;;;;;;;;;;;;;;;;:15;;;3010:38;3006:65;;;3066:5;;;3006:65;3107:4;3085:7;:19;3093:7;3101:1;3093:10;;;;;;;;;;;;;;;;;;3085:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;2987:3;;;;;;;2954:168;;;3140:7;3131:6;:16;;;;;;;;;;;;:::i;:::-;;3168:9;3157:8;:20;;;;2814:370;;;;;2092:18:1;2072:17;:38;;;;1904:213;;;855:3594;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c2714610198578063173825d91461020557806320ea8d86146102485780632f54bf6e146102755780633411c81c146102d057806337bd78a01461033557806354741525146103605780637065cb48146103af578063784547a7146103f25780637ad28c51146104375780638b51d13f146104645780639ace38c2146104a5578063a0e67e2b14610590578063a8abe69a146105fc578063b5dc40c3146106a0578063b77bf60014610722578063ba51a6df1461074d578063c01a8c841461077a578063c6427474146107a7578063d38f2d821461084e578063d74f8edd1461088f578063dc8452cd146108ba578063e20056e6146108e5578063ee22610b14610948575b6000341115610196573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b3480156101a457600080fd5b506101c360048036038101908080359060200190929190505050610975565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561021157600080fd5b50610246600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109b3565b005b34801561025457600080fd5b5061027360048036038101908080359060200190929190505050610c4c565b005b34801561028157600080fd5b506102b6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e09565b604051808215151515815260200191505060405180910390f35b3480156102dc57600080fd5b5061031b60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e29565b604051808215151515815260200191505060405180910390f35b34801561034157600080fd5b5061034a610e58565b6040518082815260200191505060405180910390f35b34801561036c57600080fd5b50610399600480360381019080803515159060200190929190803515159060200190929190505050610e5e565b6040518082815260200191505060405180910390f35b3480156103bb57600080fd5b506103f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ef0565b005b3480156103fe57600080fd5b5061041d600480360381019080803590602001909291905050506110e9565b604051808215151515815260200191505060405180910390f35b34801561044357600080fd5b50610462600480360381019080803590602001909291905050506111ce565b005b34801561047057600080fd5b5061048f60048036038101908080359060200190929190505050611249565b6040518082815260200191505060405180910390f35b3480156104b157600080fd5b506104d060048036038101908080359060200190929190505050611314565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b83811015610552578082015181840152602081019050610537565b50505050905090810190601f16801561057f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561059c57600080fd5b506105a5611409565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105e85780820151818401526020810190506105cd565b505050509050019250505060405180910390f35b34801561060857600080fd5b506106496004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611497565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561068c578082015181840152602081019050610671565b505050509050019250505060405180910390f35b3480156106ac57600080fd5b506106cb60048036038101908080359060200190929190505050611608565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561070e5780820151818401526020810190506106f3565b505050509050019250505060405180910390f35b34801561072e57600080fd5b50610737611845565b6040518082815260200191505060405180910390f35b34801561075957600080fd5b506107786004803603810190808035906020019092919050505061184b565b005b34801561078657600080fd5b506107a5600480360381019080803590602001909291905050506118fd565b005b3480156107b357600080fd5b50610838600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611afd565b6040518082815260200191505060405180910390f35b34801561085a57600080fd5b5061087960048036038101908080359060200190929190505050611b1c565b6040518082815260200191505060405180910390f35b34801561089b57600080fd5b506108a4611b34565b6040518082815260200191505060405180910390f35b3480156108c657600080fd5b506108cf611b39565b6040518082815260200191505060405180910390f35b3480156108f157600080fd5b50610946600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b3f565b005b34801561095457600080fd5b5061097360048036038101908080359060200190929190505050611e52565b005b60038181548110151561098457fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109ef57600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610a4857600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610bcd578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610adb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610bc0576003600160038054905003815481101515610b3957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610b7357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bcd565b8180600101925050610aa5565b6001600381818054905003915081610be591906121db565b506003805490506004541115610c0457610c0360038054905061184b565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610ca557600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d1057600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610d3e57600080fd5b84610d48816110e9565b151515610d5457600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60065481565b600080600090505b600554811015610ee957838015610e9d575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610ed05750828015610ecf575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610edc576001820191505b8080600101915050610e66565b5092915050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f2a57600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f8257600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff161415610fa757600080fd5b6001600380549050016004546032821180610fc157508181115b80610fcc5750600081145b80610fd75750600082145b15610fe157600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b6003805490508110156111c65760016000858152602001908152602001600020600060038381548110151561112757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156111a6576001820191505b6004548214156111b957600192506111c7565b80806001019150506110f6565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561120857600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b60038054905081101561130e5760016000848152602001908152602001600020600060038381548110151561128257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611301576001820191505b8080600101915050611251565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113ec5780601f106113c1576101008083540402835291602001916113ec565b820191906000526020600020905b8154815290600101906020018083116113cf57829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b6060600380548060200260200160405190810160405280929190818152602001828054801561148d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611443575b5050505050905090565b6060806000806005546040519080825280602002602001820160405280156114ce5781602001602082028038833980820191505090505b50925060009150600090505b60055481101561157a57858015611511575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806115445750848015611543575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b1561156d5780838381518110151561155857fe5b90602001906020020181815250506001820191505b80806001019150506114da565b8787036040519080825280602002602001820160405280156115ab5781602001602082028038833980820191505090505b5093508790505b868110156115fd5782818151811015156115c857fe5b90602001906020020151848983038151811015156115e257fe5b906020019060200201818152505080806001019150506115b2565b505050949350505050565b6060806000806003805490506040519080825280602002602001820160405280156116425781602001602082028038833980820191505090505b50925060009150600090505b60038054905081101561178f5760016000868152602001908152602001600020600060038381548110151561167f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117825760038181548110151561170657fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838381518110151561173f57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b808060010191505061164e565b816040519080825280602002602001820160405280156117be5781602001602082028038833980820191505090505b509350600090505b8181101561183d5782818151811015156117dc57fe5b9060200190602002015184828151811015156117f457fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506117c6565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561188557600080fd5b60038054905081603282118061189a57508181115b806118a55750600081145b806118b05750600082145b156118ba57600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561195657600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156119b057600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a1a57600080fd5b84611a24816110e9565b151515611a3057600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a3611ae5866110e9565b15611af557611af48642612037565b5b505050505050565b6000611b0a84848461208b565b9050611b15816118fd565b9392505050565b60076020528060005260406000206000915090505481565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b7b57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611bd457600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611c2c57600080fd5b600092505b600380549050831015611d15578473ffffffffffffffffffffffffffffffffffffffff16600384815481101515611c6457fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d085783600384815481101515611cbb57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611d15565b8280600101935050611c31565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff1615611e8257600080fd5b82611e8c816110e9565b1515611e9757600080fd5b836006546007600083815260200190815260200160002054014210151515611ebe57600080fd5b600080868152602001908152602001600020935060018460030160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168460010154856002016040518082805460018160011615610100020316600290048015611f985780601f10611f6d57610100808354040283529160200191611f98565b820191906000526020600020905b815481529060010190602001808311611f7b57829003601f168201915b505091505060006040518083038185875af19250505015611fe557847f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2612030565b847f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008460030160006101000a81548160ff0219169083151502179055505b5050505050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff1614156120b257600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190612171929190612207565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115612202578183600052602060002091820191016122019190612287565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061224857805160ff1916838001178555612276565b82800160010185558215612276579182015b8281111561227557825182559160200191906001019061225a565b5b5090506122839190612287565b5090565b6122a991905b808211156122a557600081600090555060010161228d565b5090565b905600a165627a7a723058202f1c20164401b86f77a2783be7a520331c1545ffca80947f1ae34489f487a9d60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13E JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x360 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x3AF JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x3F2 JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x437 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x464 JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x4A5 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x590 JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x5FC JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x6A0 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x722 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x74D JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x77A JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x7A7 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x84E JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x88F JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x8BA JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x8E5 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x948 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x196 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x975 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x211 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x246 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9B3 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x273 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC4C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x281 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE09 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31B PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE29 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34A PUSH2 0xE58 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x399 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xE5E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3F0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xEF0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41D PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x443 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x462 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x11CE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x470 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x48F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1249 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4D0 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1314 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x552 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x537 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x57F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5A5 PUSH2 0x1409 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5E8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5CD JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x649 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1497 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x68C JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x671 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6CB PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1608 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x70E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x6F3 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x72E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x737 PUSH2 0x1845 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x778 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x184B JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x786 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7A5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x18FD JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7B3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x838 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1AFD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x879 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B1C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8A4 PUSH2 0x1B34 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8CF PUSH2 0x1B39 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x946 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B3F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x954 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x973 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E52 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x984 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x9EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xBCD JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xADB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xBC0 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB39 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB73 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xBCD JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0xAA5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xBE5 SWAP2 SWAP1 PUSH2 0x21DB JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xC04 JUMPI PUSH2 0xC03 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x184B JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xCA5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xD10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xD3E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0xD48 DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0xD54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xEE9 JUMPI DUP4 DUP1 ISZERO PUSH2 0xE9D JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xED0 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xECF JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xEDC JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xE66 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xF2A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xF82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xFA7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xFC1 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xFCC JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0xFD7 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0xFE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x11C6 JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1127 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x11A6 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x11B9 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x11C7 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x10F6 JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x130E JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1282 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1301 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1251 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x13EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x13C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x13EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x13CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x148D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x1443 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x14CE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x157A JUMPI DUP6 DUP1 ISZERO PUSH2 0x1511 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x1544 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x1543 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x156D JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1558 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x14DA JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x15AB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x15FD JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15C8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x15E2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x15B2 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1642 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x178F JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x167F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1782 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1706 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x173F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x164E JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x17BE JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x183D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17DC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17F4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x17C6 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1885 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x189A JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x18A5 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x18B0 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x18BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1956 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x19B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1A1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1A24 DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0x1A30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x1AE5 DUP7 PUSH2 0x10E9 JUMP JUMPDEST ISZERO PUSH2 0x1AF5 JUMPI PUSH2 0x1AF4 DUP7 TIMESTAMP PUSH2 0x2037 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1B0A DUP5 DUP5 DUP5 PUSH2 0x208B JUMP JUMPDEST SWAP1 POP PUSH2 0x1B15 DUP2 PUSH2 0x18FD JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1B7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1BD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1C2C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x1D15 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C64 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1D08 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CBB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1D15 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x1C31 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1E82 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x1E8C DUP2 PUSH2 0x10E9 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1E97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD TIMESTAMP LT ISZERO ISZERO ISZERO PUSH2 0x1EBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP4 POP PUSH1 0x1 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x1 ADD SLOAD DUP6 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1F98 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F6D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1F98 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F7B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1FE5 JUMPI DUP5 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x2030 JUMP JUMPDEST DUP5 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x7 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x20B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2171 SWAP3 SWAP2 SWAP1 PUSH2 0x2207 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2202 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2201 SWAP2 SWAP1 PUSH2 0x2287 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2248 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2276 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2276 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2275 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x225A JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2283 SWAP2 SWAP1 PUSH2 0x2287 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x22A9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x22A5 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x228D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x2f SHR KECCAK256 AND DIFFICULTY ADD 0xb8 PUSH16 0x77A2783BE7A520331C1545FFCA80947F BYTE 0xe3 DIFFICULTY DUP10 DELEGATECALL DUP8 0xa9 0xd6 STOP 0x29 ",
+ "sourceMap": "855:3594:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2519:1:0;2507:9;:13;2503:61;;;2542:10;2534:30;;;2554:9;2534:30;;;;;;;;;;;;;;;;;;2503:61;855:3594:1;936:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3711:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3711:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3196:332:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3196:332:1;;;;;;;;;;;;;;;;;;;;;;;;;;890:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;890:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;820:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1049:29:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1049:29:1;;;;;;;;;;;;;;;;;;;;;;;9136:319:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9136:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3311:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3311:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7304:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7304:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:186:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2321:186:1;;;;;;;;;;;;;;;;;;;;;;;;;;8622:252:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8622:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;765:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9539:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9539:115:0;;;;;;;;;;;;;;;;;10757:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10757:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10757:676:0;;;;;;;;;;;;;;;;;9833:575;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9833:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9833:575:0;;;;;;;;;;;;;;;;;991:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;991:28:0;;;;;;;;;;;;;;;;;;;;;;;4990:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4990:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;2613:459:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2613:459:1;;;;;;;;;;;;;;;;;;;;;;;;;;5456:244:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5456:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:47:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1085:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;217:41:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;217:41:0;;;;;;;;;;;;;;;;;;;;;;;965:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;965:20:0;;;;;;;;;;;;;;;;;;;;;;;4370:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4370:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3642:472:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3642:472:1;;;;;;;;;;;;;;;;;;;;;;;;;;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3711:460::-;3859:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3801:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;3839:5;3822:7;:14;3830:5;3822:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3866:1;3859:8;;3854:170;3887:1;3871:6;:13;;;;:17;3869:1;:19;3854:170;;;3924:5;3911:18;;:6;3918:1;3911:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3907:117;;;3961:6;3984:1;3968:6;:13;;;;:17;3961:25;;;;;;;;;;;;;;;;;;;;;;;;;;;3949:6;3956:1;3949:9;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4004:5;;3907:117;3890:3;;;;;;;3854:170;;;4050:1;4033:6;:18;;;;;;;;;;;;;;:::i;:::-;;4076:6;:13;;;;4065:8;;:24;4061:74;;;4103:32;4121:6;:13;;;;4103:17;:32::i;:::-;4061:74;4158:5;4145:19;;;;;;;;;;;;1242:1;3711:460;;:::o;3196:332:1:-;3279:10;1420:7:0;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;3309:13:1;3324:10;1694:13:0;:28;1708:13;1694:28;;;;;;;;;;;:35;1723:5;1694:35;;;;;;;;;;;;;;;;;;;;;;;;;1693:36;1689:59;;;1743:5;;;1689:59;3356:13:1;1976:12:0;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;3397:13:1;1205:26;1217:13;1205:11;:26::i;:::-;1204:27;1196:36;;;;;;;;3469:5;3426:13;:28;3440:13;3426:28;;;;;;;;;;;:40;3455:10;3426:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;3507:13;3495:10;3484:37;;;;;;;;;;;;2041:1:0;1758;1463;;3196:332:1;;:::o;890:40:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;820:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1049:29:1:-;;;;:::o;9136:319:0:-;9243:10;9274:6;9281:1;9274:8;;9269:179;9286:16;;9284:1;:18;9269:179;;;9328:7;:36;;;;;9340:12;:15;9353:1;9340:15;;;;;;;;;;;:24;;;;;;;;;;;;9339:25;9328:36;:92;;;;9384:8;:36;;;;;9396:12;:15;9409:1;9396:15;;;;;;;;;;;:24;;;;;;;;;;;;9384:36;9328:92;9321:127;;;9447:1;9438:10;;;;9321:127;9304:3;;;;;;;9269:179;;;9136:319;;;;;:::o;3311:277::-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3404:5;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;3427:5;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;3475:1;3459:6;:13;;;;:17;3478:8;;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;3519:4;3502:7;:14;3510:5;3502:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3533:6;3545:5;3533:18;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;3533:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3575:5;3561:20;;;;;;;;;;;;2146:1;;1355;1242;3311:277;:::o;7304:337::-;7394:4;7414:10;7443:6;7427:1;7414:14;;7450:1;7443:8;;7438:197;7455:6;:13;;;;7453:1;:15;7438:197;;;7493:13;:28;7507:13;7493:28;;;;;;;;;;;:39;7522:6;7529:1;7522:9;;;;;;;;;;;;;;;;;;;;;;;;;;;7493:39;;;;;;;;;;;;;;;;;;;;;;;;;7489:71;;;7559:1;7550:10;;;;7489:71;7587:8;;7578:5;:17;7574:50;;;7620:4;7613:11;;;;7574:50;7470:3;;;;;;;7438:197;;;7304:337;;;;;;:::o;2321:186:1:-;1208:4:0;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;2438:18:1;2418:17;:38;;;;2466:34;2481:18;2466:34;;;;;;;;;;;;;;;;;;2321:186;:::o;8622:252:0:-;8721:10;8752:6;8759:1;8752:8;;8747:120;8764:6;:13;;;;8762:1;:15;8747:120;;;8800:13;:28;8814:13;8800:28;;;;;;;;;;;:39;8829:6;8836:1;8829:9;;;;;;;;;;;;;;;;;;;;;;;;;;;8800:39;;;;;;;;;;;;;;;;;;;;;;;;;8796:71;;;8866:1;8857:10;;;;8796:71;8779:3;;;;;;;8747:120;;;8622:252;;;;:::o;765:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9539:115::-;9609:9;9641:6;9634:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;:::o;10757:676::-;10882:22;10920:32;10993:10;11017:6;10966:16;;10955:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10955:28:0;;;;10920:63;;11006:1;10993:14;;11040:1;11038:3;;11033:250;11045:16;;11043:1;:18;11033:250;;;11087:7;:36;;;;;11099:12;:15;11112:1;11099:15;;;;;;;;;;;:24;;;;;;;;;;;;11098:25;11087:36;:92;;;;11143:8;:36;;;;;11155:12;:15;11168:1;11155:15;;;;;;;;;;;:24;;;;;;;;;;;;11143:36;11087:92;11080:203;;;11239:1;11211:18;11230:5;11211:25;;;;;;;;;;;;;;;;;:29;;;;;11267:1;11258:10;;;;11080:203;11063:3;;;;;;;11033:250;;;11326:4;11321:2;:9;11310:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;11310:21:0;;;;11292:39;;11348:4;11346:6;;11341:85;11356:2;11354:1;:4;11341:85;;;11405:18;11424:1;11405:21;;;;;;;;;;;;;;;;;;11377:15;11397:4;11393:1;:8;11377:25;;;;;;;;;;;;;;;;;:49;;;;;11360:3;;;;;;;11341:85;;;10757:676;;;;;;;;;:::o;9833:575::-;9928:24;9968:34;10043:10;10067:6;10019;:13;;;;10005:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10005:28:0;;;;9968:65;;10056:1;10043:14;;10090:1;10088:3;;10083:186;10095:6;:13;;;;10093:1;:15;10083:186;;;10131:13;:28;10145:13;10131:28;;;;;;;;;;;:39;10160:6;10167:1;10160:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10131:39;;;;;;;;;;;;;;;;;;;;;;;;;10127:142;;;10217:6;10224:1;10217:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10190:17;10208:5;10190:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10253:1;10244:10;;;;10127:142;10110:3;;;;;;;10083:186;;;10309:5;10295:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10295:20:0;;;;10278:37;;10332:1;10330:3;;10325:76;10337:5;10335:1;:7;10325:76;;;10381:17;10399:1;10381:20;;;;;;;;;;;;;;;;;;10361:14;10376:1;10361:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10344:3;;;;;;;10325:76;;;9833:575;;;;;;:::o;991:28::-;;;;:::o;4990:207::-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;5092:6;:13;;;;5107:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;5143:9;5132:8;:20;;;;5162:28;5180:9;5162:28;;;;;;;;;;;;;;;;;;1242:1;;4990:207;:::o;2613:459:1:-;2696:10;1420:7:0;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;2734:13:1;1581:1:0;1538:12;:27;1551:13;1538:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;1534:67;;;1596:5;;;1534:67;2770:13:1;2785:10;1843:13:0;:28;1857:13;1843:28;;;;;;;;;;;:35;1872:5;1843:35;;;;;;;;;;;;;;;;;;;;;;;;;1839:58;;;1892:5;;;1839:58;2823:13:1;1205:26;1217:13;1205:11;:26::i;:::-;1204:27;1196:36;;;;;;;;2895:4;2852:13;:28;2866:13;2852:28;;;;;;;;;;;:40;2881:10;2852:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;2934:13;2922:10;2909:39;;;;;;;;;;;;2962:26;2974:13;2962:11;:26::i;:::-;2958:108;;;3004:51;3024:13;3039:15;3004:19;:51::i;:::-;2958:108;1907:1:0;1611;;1463;2613:459:1;;:::o;5456:244:0:-;5560:18;5610:40;5625:11;5638:5;5645:4;5610:14;:40::i;:::-;5594:56;;5660:33;5679:13;5660:18;:33::i;:::-;5456:244;;;;;:::o;1085:47:1:-;;;;;;;;;;;;;;;;;:::o;217:41:0:-;256:2;217:41;:::o;965:20::-;;;;:::o;4370:449::-;4541:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;4479:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;4512:8;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;4548:1;4541:8;;4536:149;4553:6;:13;;;;4551:1;:15;4536:149;;;4602:5;4589:18;;:6;4596:1;4589:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4585:100;;;4639:8;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4665:5;;4585:100;4568:3;;;;;;;4536:149;;;4711:5;4694:7;:14;4702:5;4694:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4746:4;4726:7;:17;4734:8;4726:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4773:5;4760:19;;;;;;;;;;;;4803:8;4789:23;;;;;;;;;;;;1463:1;1242;4370:449;;;:::o;3642:472:1:-;3828:22;3725:13;1976:12:0;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;3763:13:1;1318:26;1330:13;1318:11;:26::i;:::-;1310:35;;;;;;;;3799:13;1483:17;;1448;:32;1466:13;1448:32;;;;;;;;;;;;:52;1429:15;:71;;1421:80;;;;;;;;3853:12;:27;3866:13;3853:27;;;;;;;;;;;3828:52;;3904:4;3890:2;:11;;;:18;;;;;;;;;;;;;;;;;;3922:2;:14;;;;;;;;;;;;:19;;3948:2;:8;;;3958:2;:7;;3922:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3918:190;;;3990:13;3980:24;;;;;;;;;;3918:190;;;4050:13;4033:31;;;;;;;;;;4092:5;4078:2;:11;;;:19;;;;;;;;;;;;;;;;;;3918:190;1355:1;2041::0;3642:472:1;;;:::o;4224:223::-;4362:16;4327:17;:32;4345:13;4327:32;;;;;;;;;;;:51;;;;4408:13;4388:52;4423:16;4388:52;;;;;;;;;;;;;;;;;;4224:223;;:::o;7974:451:0:-;8106:18;8076:11;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;8156:16;;8140:32;;8212:140;;;;;;;;;8251:11;8212:140;;;;;;8283:5;8212:140;;;;8308:4;8212:140;;;;8336:5;8212:140;;;;;8182:12;:27;8195:13;8182:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8382:1;8362:16;;:21;;;;;;;;;;;8404:13;8393:25;;;;;;;;;;7974:451;;;;;;:::o;855:3594:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": {
+ "id": 0
+ },
+ "current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": "pragma solidity ^0.4.10;\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.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 solidity ^0.4.10;\n\nimport { MultiSigWallet } from \"../MultiSigWallet/MultiSigWallet.sol\";\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xc72f66ef783226ce3add07370d926054508b0a3ae4a30e0773524310ddcdb9f8",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json b/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json
new file mode 100644
index 000000000..367f0ba07
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json
@@ -0,0 +1,725 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "isFunctionRemoveAuthorizedAddress",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeRemoveAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "TOKEN_TRANSFER_PROXY_CONTRACT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ {
+ "name": "_tokenTransferProxy",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405162002b9038038062002b90833981018060405281019080805182019291906020018051906020019092919080519060200190929190805190602001909291905050508383838282600082518260328211806200007057508181115b806200007c5750600081145b80620000885750600082145b156200009357600080fd5b600092505b8451831015620001ca57600260008685815181101515620000b557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620001415750600085848151811015156200011f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16145b156200014c57600080fd5b60016002600087868151811015156200016157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828060010193505062000098565b8460039080519060200190620001e292919062000244565b508360048190555050505050508060068190555050505080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000319565b828054828255906000526020600020908101928215620002c0579160200282015b82811115620002bf5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000265565b5b509050620002cf9190620002d3565b5090565b6200031691905b808211156200031257600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101620002da565b5090565b90565b61286780620003296000396000f30060806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101b9578063173825d91461022657806320ea8d86146102695780632f54bf6e146102965780633411c81c146102f157806337bd78a0146103565780635474152514610381578063553a48fd146103d05780635711b311146104515780637065cb481461047e578063784547a7146104c15780637ad28c51146105065780638b51d13f146105335780639ace38c214610574578063a0e67e2b1461065f578063a8abe69a146106cb578063add1cbc51461076f578063b5dc40c3146107c6578063b77bf60014610848578063ba51a6df14610873578063c01a8c84146108a0578063c6427474146108cd578063d38f2d8214610974578063d74f8edd146109b5578063dc8452cd146109e0578063e20056e614610a0b578063ee22610b14610a6e575b60003411156101b7573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b3480156101c557600080fd5b506101e460048036038101908080359060200190929190505050610a9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561023257600080fd5b50610267600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad9565b005b34801561027557600080fd5b5061029460048036038101908080359060200190929190505050610d72565b005b3480156102a257600080fd5b506102d7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2f565b604051808215151515815260200191505060405180910390f35b3480156102fd57600080fd5b5061033c60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b604051808215151515815260200191505060405180910390f35b34801561036257600080fd5b5061036b610f7e565b6040518082815260200191505060405180910390f35b34801561038d57600080fd5b506103ba600480360381019080803515159060200190929190803515159060200190929190505050610f84565b6040518082815260200191505060405180910390f35b3480156103dc57600080fd5b50610437600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611016565b604051808215151515815260200191505060405180910390f35b34801561045d57600080fd5b5061047c60048036038101908080359060200190929190505050611153565b005b34801561048a57600080fd5b506104bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611459565b005b3480156104cd57600080fd5b506104ec60048036038101908080359060200190929190505050611652565b604051808215151515815260200191505060405180910390f35b34801561051257600080fd5b5061053160048036038101908080359060200190929190505050611737565b005b34801561053f57600080fd5b5061055e600480360381019080803590602001909291905050506117b2565b6040518082815260200191505060405180910390f35b34801561058057600080fd5b5061059f6004803603810190808035906020019092919050505061187d565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b83811015610621578082015181840152602081019050610606565b50505050905090810190601f16801561064e5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561066b57600080fd5b50610674611972565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106b757808201518184015260208101905061069c565b505050509050019250505060405180910390f35b3480156106d757600080fd5b506107186004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611a00565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561075b578082015181840152602081019050610740565b505050509050019250505060405180910390f35b34801561077b57600080fd5b50610784611b71565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107d257600080fd5b506107f160048036038101908080359060200190929190505050611b97565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610834578082015181840152602081019050610819565b505050509050019250505060405180910390f35b34801561085457600080fd5b5061085d611dd4565b6040518082815260200191505060405180910390f35b34801561087f57600080fd5b5061089e60048036038101908080359060200190929190505050611dda565b005b3480156108ac57600080fd5b506108cb60048036038101908080359060200190929190505050611e8c565b005b3480156108d957600080fd5b5061095e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061208c565b6040518082815260200191505060405180910390f35b34801561098057600080fd5b5061099f600480360381019080803590602001909291905050506120ab565b6040518082815260200191505060405180910390f35b3480156109c157600080fd5b506109ca6120c3565b6040518082815260200191505060405180910390f35b3480156109ec57600080fd5b506109f56120c8565b6040518082815260200191505060405180910390f35b348015610a1757600080fd5b50610a6c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ce565b005b348015610a7a57600080fd5b50610a99600480360381019080803590602001909291905050506123e1565b005b600381815481101515610aaa57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b1557600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b6e57600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610cf3578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610c0157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ce6576003600160038054905003815481101515610c5f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610c9957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610cf3565b8180600101925050610bcb565b6001600381818054905003915081610d0b919061276a565b506003805490506004541115610d2a57610d29600380549050611dda565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610dcb57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610e3657600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610e6457600080fd5b84610e6e81611652565b151515610e7a57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60065481565b600080600090505b60055481101561100f57838015610fc3575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610ff65750828015610ff5575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611002576001820191505b8080600101915050610f8c565b5092915050565b600080600060405180807f72656d6f7665417574686f72697a656441646472657373286164647265737329815250602001905060405180910390209150600090505b600481101561114857818160048110151561106f57fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811015156110c257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151561113b57600080fd5b8080600101915050611058565b600192505050919050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff161561118357600080fd5b8261118d81611652565b151561119857600080fd5b8360008060008381526020019081526020016000209050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561122f57600080fd5b6112d4816002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112ca5780601f1061129f576101008083540402835291602001916112ca565b820191906000526020600020905b8154815290600101906020018083116112ad57829003601f168201915b5050505050611016565b15156112df57600080fd5b600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685600101548660020160405180828054600181600116156101000203166002900480156113b95780601f1061138e576101008083540402835291602001916113b9565b820191906000526020600020905b81548152906001019060200180831161139c57829003601f168201915b505091505060006040518083038185875af1925050501561140657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611451565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149357600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114eb57600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff16141561151057600080fd5b600160038054905001600454603282118061152a57508181115b806115355750600081145b806115405750600082145b1561154a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561172f5760016000858152602001908152602001600020600060038381548110151561169057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561170f576001820191505b6004548214156117225760019250611730565b808060010191505061165f565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561177157600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b600380549050811015611877576001600084815260200190815260200160002060006003838154811015156117eb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561186a576001820191505b80806001019150506117ba565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119555780601f1061192a57610100808354040283529160200191611955565b820191906000526020600020905b81548152906001019060200180831161193857829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b606060038054806020026020016040519081016040528092919081815260200182805480156119f657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116119ac575b5050505050905090565b606080600080600554604051908082528060200260200182016040528015611a375781602001602082028038833980820191505090505b50925060009150600090505b600554811015611ae357858015611a7a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80611aad5750848015611aac575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611ad657808383815181101515611ac157fe5b90602001906020020181815250506001820191505b8080600101915050611a43565b878703604051908082528060200260200182016040528015611b145781602001602082028038833980820191505090505b5093508790505b86811015611b66578281815181101515611b3157fe5b9060200190602002015184898303815181101515611b4b57fe5b90602001906020020181815250508080600101915050611b1b565b505050949350505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606080600080600380549050604051908082528060200260200182016040528015611bd15781602001602082028038833980820191505090505b50925060009150600090505b600380549050811015611d1e57600160008681526020019081526020016000206000600383815481101515611c0e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d1157600381815481101515611c9557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181101515611cce57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b8080600101915050611bdd565b81604051908082528060200260200182016040528015611d4d5781602001602082028038833980820191505090505b509350600090505b81811015611dcc578281815181101515611d6b57fe5b906020019060200201518482815181101515611d8357fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611d55565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e1457600080fd5b600380549050816032821180611e2957508181115b80611e345750600081145b80611e3f5750600082145b15611e4957600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611ee557600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f3f57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fa957600080fd5b84611fb381611652565b151515611fbf57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361207486611652565b156120845761208386426125c6565b5b505050505050565b600061209984848461261a565b90506120a481611e8c565b9392505050565b60076020528060005260406000206000915090505481565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561210a57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561216357600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121bb57600080fd5b600092505b6003805490508310156122a4578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156121f357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612297578360038481548110151561224a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122a4565b82806001019350506121c0565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff161561241157600080fd5b8261241b81611652565b151561242657600080fd5b83600654600760008381526020019081526020016000205401421015151561244d57600080fd5b600080868152602001908152602001600020935060018460030160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684600101548560020160405180828054600181600116156101000203166002900480156125275780601f106124fc57610100808354040283529160200191612527565b820191906000526020600020905b81548152906001019060200180831161250a57829003601f168201915b505091505060006040518083038185875af1925050501561257457847f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a26125bf565b847f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008460030160006101000a81548160ff0219169083151502179055505b5050505050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff16141561264157600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190612700929190612796565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115612791578183600052602060002091820191016127909190612816565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127d757805160ff1916838001178555612805565b82800160010185558215612805579182015b828111156128045782518255916020019190600101906127e9565b5b5090506128129190612816565b5090565b61283891905b8082111561283457600081600090555060010161281c565b5090565b905600a165627a7a723058205b3170311683dd42d70d319dd5251070967966a260fd2e2f3fcfdfe5074872320029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2B90 CODESIZE SUB DUP1 PUSH3 0x2B90 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE DUP2 ADD SWAP1 DUP1 DUP1 MLOAD DUP3 ADD SWAP3 SWAP2 SWAP1 PUSH1 0x20 ADD DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP4 DUP4 DUP4 DUP3 DUP3 PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x70 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x7C JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH3 0x88 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH3 0x93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x1CA JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xB5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP1 PUSH3 0x141 JUMPI POP PUSH1 0x0 DUP6 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x11F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x161 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH3 0x98 JUMP JUMPDEST DUP5 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH3 0x1E2 SWAP3 SWAP2 SWAP1 PUSH3 0x244 JUMP JUMPDEST POP DUP4 PUSH1 0x4 DUP2 SWAP1 SSTORE POP POP POP POP POP POP DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP DUP1 PUSH1 0x8 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP POP POP POP PUSH3 0x319 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x2C0 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x2BF JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x265 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH3 0x2CF SWAP2 SWAP1 PUSH3 0x2D3 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x316 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x312 JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH3 0x2DA JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x2867 DUP1 PUSH3 0x329 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x226 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2F1 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x356 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x381 JUMPI DUP1 PUSH4 0x553A48FD EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0x5711B311 EQ PUSH2 0x451 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x506 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x574 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x65F JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x6CB JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x76F JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x7C6 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x848 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x873 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x8A0 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x8CD JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x974 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x9B5 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x9E0 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0xA0B JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0xA6E JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x1B7 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA9B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x232 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAD9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD72 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF2F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x33C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF4F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x36B PUSH2 0xF7E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF84 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x437 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x45D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x47C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1153 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1459 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4EC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1737 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x55E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x17B2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x580 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x187D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x621 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x606 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x64E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x674 PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6B7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x69C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x718 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1A00 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x75B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x740 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x77B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x784 PUSH2 0x1B71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7F1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x834 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x819 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x854 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x85D PUSH2 0x1DD4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x87F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x89E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1DDA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8CB PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E8C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x208C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x980 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x99F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x20AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9CA PUSH2 0x20C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F5 PUSH2 0x20C8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x20CE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA99 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x23E1 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAAA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xCF3 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC01 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCE6 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC5F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC99 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xCF3 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0xBCB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xD0B SWAP2 SWAP1 PUSH2 0x276A JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xD2A JUMPI PUSH2 0xD29 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x1DDA JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xDCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xE36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0xE6E DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0xE7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x100F JUMPI DUP4 DUP1 ISZERO PUSH2 0xFC3 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xFF6 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xFF5 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x1002 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xF8C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x72656D6F7665417574686F72697A656441646472657373286164647265737329 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x1148 JUMPI DUP2 DUP2 PUSH1 0x4 DUP2 LT ISZERO ISZERO PUSH2 0x106F JUMPI INVALID JUMPDEST BYTE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ ISZERO ISZERO PUSH2 0x113B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1058 JUMP JUMPDEST PUSH1 0x1 SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x118D DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x122F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12D4 DUP2 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x12CA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x129F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH2 0x1016 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP5 POP PUSH1 0x1 DUP6 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x1 ADD SLOAD DUP7 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x13B9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x138E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x13B9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x139C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1406 JUMPI DUP6 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x1451 JUMP JUMPDEST DUP6 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP6 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x14EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1510 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x152A JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1535 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x1540 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x154A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x172F JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1690 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x170F JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x1722 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x1730 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x165F JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1771 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x1877 JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17EB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x186A JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x17BA JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1955 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x192A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1955 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1938 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x19F6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x19AC JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A37 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x1AE3 JUMPI DUP6 DUP1 ISZERO PUSH2 0x1A7A JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x1AAD JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x1AAC JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x1AD6 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AC1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1A43 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1B14 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1B66 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B31 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1B1B JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1BD1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x1D1E JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C0E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1D11 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C95 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CCE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1BDD JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1D4D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1DCC JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D6B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D83 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1D55 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1E14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1E29 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1E34 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x1E3F JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x1E49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1F3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1FA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1FB3 DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0x1FBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x2074 DUP7 PUSH2 0x1652 JUMP JUMPDEST ISZERO PUSH2 0x2084 JUMPI PUSH2 0x2083 DUP7 TIMESTAMP PUSH2 0x25C6 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2099 DUP5 DUP5 DUP5 PUSH2 0x261A JUMP JUMPDEST SWAP1 POP PUSH2 0x20A4 DUP2 PUSH2 0x1E8C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x210A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2163 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x21BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x22A4 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2297 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x224A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x22A4 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x21C0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x2411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x241B DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x2426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD TIMESTAMP LT ISZERO ISZERO ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP4 POP PUSH1 0x1 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x1 ADD SLOAD DUP6 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2527 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x24FC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2527 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x250A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x2574 JUMPI DUP5 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x25BF JUMP JUMPDEST DUP5 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x7 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2641 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2700 SWAP3 SWAP2 SWAP1 PUSH2 0x2796 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2791 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2790 SWAP2 SWAP1 PUSH2 0x2816 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x27D7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2805 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2805 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2804 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x27E9 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2812 SWAP2 SWAP1 PUSH2 0x2816 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2838 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2834 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x281C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 JUMPDEST BALANCE PUSH17 0x311683DD42D70D319DD5251070967966A2 PUSH1 0xFD 0x2e 0x2f 0x3f 0xcf 0xdf 0xe5 SMOD 0x48 PUSH19 0x32002900000000000000000000000000000000 ",
+ "sourceMap": "698:2422:2:-;;;1566:349;8:9:-1;5:2;;;30:1;27;20:12;5:2;1566:349:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1803:7;1812:9;1823:18;2038:7:1;2047:9;2959:6:0;2913:7;:14;2929:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;2966:1;2959:8;;2954:168;2971:7;:14;2969:1;:16;2954:168;;;3010:7;:19;3018:7;3026:1;3018:10;;;;;;;;;;;;;;;;;;3010:19;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3047:1;3033:7;3041:1;3033:10;;;;;;;;;;;;;;;;;;:15;;;3010:38;3006:65;;;3066:5;;;3006:65;3107:4;3085:7;:19;3093:7;3101:1;3093:10;;;;;;;;;;;;;;;;;;3085:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;2987:3;;;;;;;2954:168;;;3140:7;3131:6;:16;;;;;;;;;;;;:::i;:::-;;3168:9;3157:8;:20;;;;2814:370;;;;;2092:18:1;2072:17;:38;;;;1904:213;;;1889:19:2;1857:29;;:51;;;;;;;;;;;;;;;;;;1566:349;;;;698:2422;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c27146101b9578063173825d91461022657806320ea8d86146102695780632f54bf6e146102965780633411c81c146102f157806337bd78a0146103565780635474152514610381578063553a48fd146103d05780635711b311146104515780637065cb481461047e578063784547a7146104c15780637ad28c51146105065780638b51d13f146105335780639ace38c214610574578063a0e67e2b1461065f578063a8abe69a146106cb578063add1cbc51461076f578063b5dc40c3146107c6578063b77bf60014610848578063ba51a6df14610873578063c01a8c84146108a0578063c6427474146108cd578063d38f2d8214610974578063d74f8edd146109b5578063dc8452cd146109e0578063e20056e614610a0b578063ee22610b14610a6e575b60003411156101b7573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b005b3480156101c557600080fd5b506101e460048036038101908080359060200190929190505050610a9b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561023257600080fd5b50610267600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ad9565b005b34801561027557600080fd5b5061029460048036038101908080359060200190929190505050610d72565b005b3480156102a257600080fd5b506102d7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f2f565b604051808215151515815260200191505060405180910390f35b3480156102fd57600080fd5b5061033c60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b604051808215151515815260200191505060405180910390f35b34801561036257600080fd5b5061036b610f7e565b6040518082815260200191505060405180910390f35b34801561038d57600080fd5b506103ba600480360381019080803515159060200190929190803515159060200190929190505050610f84565b6040518082815260200191505060405180910390f35b3480156103dc57600080fd5b50610437600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611016565b604051808215151515815260200191505060405180910390f35b34801561045d57600080fd5b5061047c60048036038101908080359060200190929190505050611153565b005b34801561048a57600080fd5b506104bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611459565b005b3480156104cd57600080fd5b506104ec60048036038101908080359060200190929190505050611652565b604051808215151515815260200191505060405180910390f35b34801561051257600080fd5b5061053160048036038101908080359060200190929190505050611737565b005b34801561053f57600080fd5b5061055e600480360381019080803590602001909291905050506117b2565b6040518082815260200191505060405180910390f35b34801561058057600080fd5b5061059f6004803603810190808035906020019092919050505061187d565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b83811015610621578082015181840152602081019050610606565b50505050905090810190601f16801561064e5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561066b57600080fd5b50610674611972565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156106b757808201518184015260208101905061069c565b505050509050019250505060405180910390f35b3480156106d757600080fd5b506107186004803603810190808035906020019092919080359060200190929190803515159060200190929190803515159060200190929190505050611a00565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561075b578082015181840152602081019050610740565b505050509050019250505060405180910390f35b34801561077b57600080fd5b50610784611b71565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107d257600080fd5b506107f160048036038101908080359060200190929190505050611b97565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610834578082015181840152602081019050610819565b505050509050019250505060405180910390f35b34801561085457600080fd5b5061085d611dd4565b6040518082815260200191505060405180910390f35b34801561087f57600080fd5b5061089e60048036038101908080359060200190929190505050611dda565b005b3480156108ac57600080fd5b506108cb60048036038101908080359060200190929190505050611e8c565b005b3480156108d957600080fd5b5061095e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061208c565b6040518082815260200191505060405180910390f35b34801561098057600080fd5b5061099f600480360381019080803590602001909291905050506120ab565b6040518082815260200191505060405180910390f35b3480156109c157600080fd5b506109ca6120c3565b6040518082815260200191505060405180910390f35b3480156109ec57600080fd5b506109f56120c8565b6040518082815260200191505060405180910390f35b348015610a1757600080fd5b50610a6c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120ce565b005b348015610a7a57600080fd5b50610a99600480360381019080803590602001909291905050506123e1565b005b600381815481101515610aaa57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b1557600080fd5b81600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610b6e57600080fd5b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600091505b600160038054905003821015610cf3578273ffffffffffffffffffffffffffffffffffffffff16600383815481101515610c0157fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610ce6576003600160038054905003815481101515610c5f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600383815481101515610c9957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610cf3565b8180600101925050610bcb565b6001600381818054905003915081610d0b919061276a565b506003805490506004541115610d2a57610d29600380549050611dda565b5b8273ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a2505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610dcb57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610e3657600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615610e6457600080fd5b84610e6e81611652565b151515610e7a57600080fd5b60006001600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a3505050505050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60065481565b600080600090505b60055481101561100f57838015610fc3575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610ff65750828015610ff5575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611002576001820191505b8080600101915050610f8c565b5092915050565b600080600060405180807f72656d6f7665417574686f72697a656441646472657373286164647265737329815250602001905060405180910390209150600090505b600481101561114857818160048110151561106f57fe5b1a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811015156110c257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614151561113b57600080fd5b8080600101915050611058565b600192505050919050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff161561118357600080fd5b8261118d81611652565b151561119857600080fd5b8360008060008381526020019081526020016000209050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561122f57600080fd5b6112d4816002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112ca5780601f1061129f576101008083540402835291602001916112ca565b820191906000526020600020905b8154815290600101906020018083116112ad57829003601f168201915b5050505050611016565b15156112df57600080fd5b600080878152602001908152602001600020945060018560030160006101000a81548160ff0219169083151502179055508460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1685600101548660020160405180828054600181600116156101000203166002900480156113b95780601f1061138e576101008083540402835291602001916113b9565b820191906000526020600020905b81548152906001019060200180831161139c57829003601f168201915b505091505060006040518083038185875af1925050501561140657857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a2611451565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561149357600080fd5b80600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156114eb57600080fd5b8160008173ffffffffffffffffffffffffffffffffffffffff16141561151057600080fd5b600160038054905001600454603282118061152a57508181115b806115355750600081145b806115405750600082145b1561154a57600080fd5b6001600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060038590806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508473ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b6000806000809150600090505b60038054905081101561172f5760016000858152602001908152602001600020600060038381548110151561169057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561170f576001820191505b6004548214156117225760019250611730565b808060010191505061165f565b5b5050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561177157600080fd5b806006819055507fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b4377816040518082815260200191505060405180910390a150565b600080600090505b600380549050811015611877576001600084815260200190815260200160002060006003838154811015156117eb57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561186a576001820191505b80806001019150506117ba565b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015490806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119555780601f1061192a57610100808354040283529160200191611955565b820191906000526020600020905b81548152906001019060200180831161193857829003601f168201915b5050505050908060030160009054906101000a900460ff16905084565b606060038054806020026020016040519081016040528092919081815260200182805480156119f657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116119ac575b5050505050905090565b606080600080600554604051908082528060200260200182016040528015611a375781602001602082028038833980820191505090505b50925060009150600090505b600554811015611ae357858015611a7a575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80611aad5750848015611aac575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15611ad657808383815181101515611ac157fe5b90602001906020020181815250506001820191505b8080600101915050611a43565b878703604051908082528060200260200182016040528015611b145781602001602082028038833980820191505090505b5093508790505b86811015611b66578281815181101515611b3157fe5b9060200190602002015184898303815181101515611b4b57fe5b90602001906020020181815250508080600101915050611b1b565b505050949350505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606080600080600380549050604051908082528060200260200182016040528015611bd15781602001602082028038833980820191505090505b50925060009150600090505b600380549050811015611d1e57600160008681526020019081526020016000206000600383815481101515611c0e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611d1157600381815481101515611c9557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181101515611cce57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b8080600101915050611bdd565b81604051908082528060200260200182016040528015611d4d5781602001602082028038833980820191505090505b509350600090505b81811015611dcc578281815181101515611d6b57fe5b906020019060200201518482815181101515611d8357fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508080600101915050611d55565b505050919050565b60055481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611e1457600080fd5b600380549050816032821180611e2957508181115b80611e345750600081145b80611e3f5750600082145b15611e4957600080fd5b826004819055507fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a836040518082815260200191505060405180910390a1505050565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611ee557600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f3f57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fa957600080fd5b84611fb381611652565b151515611fbf57600080fd5b600180600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550853373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a361207486611652565b156120845761208386426125c6565b5b505050505050565b600061209984848461261a565b90506120a481611e8c565b9392505050565b60076020528060005260406000206000915090505481565b603281565b60045481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561210a57600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561216357600080fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156121bb57600080fd5b600092505b6003805490508310156122a4578473ffffffffffffffffffffffffffffffffffffffff166003848154811015156121f357fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612297578360038481548110151561224a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506122a4565b82806001019350506121c0565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9060405160405180910390a28373ffffffffffffffffffffffffffffffffffffffff167ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d60405160405180910390a25050505050565b60008160008082815260200190815260200160002060030160009054906101000a900460ff161561241157600080fd5b8261241b81611652565b151561242657600080fd5b83600654600760008381526020019081526020016000205401421015151561244d57600080fd5b600080868152602001908152602001600020935060018460030160006101000a81548160ff0219169083151502179055508360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684600101548560020160405180828054600181600116156101000203166002900480156125275780601f106124fc57610100808354040283529160200191612527565b820191906000526020600020905b81548152906001019060200180831161250a57829003601f168201915b505091505060006040518083038185875af1925050501561257457847f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a26125bf565b847f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008460030160006101000a81548160ff0219169083151502179055505b5050505050565b806007600084815260200190815260200160002081905550817f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d826040518082815260200191505060405180910390a25050565b60008360008173ffffffffffffffffffffffffffffffffffffffff16141561264157600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101556040820151816002019080519060200190612700929190612796565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a2509392505050565b815481835581811115612791578183600052602060002091820191016127909190612816565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127d757805160ff1916838001178555612805565b82800160010185558215612805579182015b828111156128045782518255916020019190600101906127e9565b5b5090506128129190612816565b5090565b61283891905b8082111561283457600081600090555060010161281c565b5090565b905600a165627a7a723058205b3170311683dd42d70d319dd5251070967966a260fd2e2f3fcfdfe5074872320029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x15F JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x25E7C27 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x226 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x269 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x296 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x2F1 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x356 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x381 JUMPI DUP1 PUSH4 0x553A48FD EQ PUSH2 0x3D0 JUMPI DUP1 PUSH4 0x5711B311 EQ PUSH2 0x451 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x47E JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x506 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x533 JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x574 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x65F JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x6CB JUMPI DUP1 PUSH4 0xADD1CBC5 EQ PUSH2 0x76F JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x7C6 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x848 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x873 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x8A0 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x8CD JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x974 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x9B5 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x9E0 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0xA0B JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0xA6E JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x1B7 JUMPI CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E4 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA9B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x232 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x267 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAD9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x275 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x294 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xD72 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2D7 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF2F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x33C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF4F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x362 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x36B PUSH2 0xF7E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x38D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3BA PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF84 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x437 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1016 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x45D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x47C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1153 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4BF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1459 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x4EC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x531 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1737 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x55E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x17B2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x580 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x187D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x621 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x606 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x64E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x66B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x674 PUSH2 0x1972 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x6B7 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x69C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x718 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD ISZERO ISZERO SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1A00 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x75B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x740 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x77B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x784 PUSH2 0x1B71 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7F1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1B97 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x834 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x819 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x854 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x85D PUSH2 0x1DD4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x87F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x89E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1DDA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8CB PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1E8C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x95E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x208C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x980 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x99F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x20AB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9CA PUSH2 0x20C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9F5 PUSH2 0x20C8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA17 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA6C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x20CE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA99 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x23E1 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xAAA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xB15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB6E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP3 LT ISZERO PUSH2 0xCF3 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC01 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0xCE6 JUMPI PUSH1 0x3 PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC5F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC99 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xCF3 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0xBCB JUMP JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0xD0B SWAP2 SWAP1 PUSH2 0x276A JUMP JUMPDEST POP PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x4 SLOAD GT ISZERO PUSH2 0xD2A JUMPI PUSH2 0xD29 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH2 0x1DDA JUMP JUMPDEST JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xDCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xE36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xE64 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0xE6E DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0xE7A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x100F JUMPI DUP4 DUP1 ISZERO PUSH2 0xFC3 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xFF6 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xFF5 JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x1002 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0xF8C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x72656D6F7665417574686F72697A656441646472657373286164647265737329 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x4 DUP2 LT ISZERO PUSH2 0x1148 JUMPI DUP2 DUP2 PUSH1 0x4 DUP2 LT ISZERO ISZERO PUSH2 0x106F JUMPI INVALID JUMPDEST BYTE PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND EQ ISZERO ISZERO PUSH2 0x113B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1058 JUMP JUMPDEST PUSH1 0x1 SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x118D DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x122F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x12D4 DUP2 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x12CA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x129F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH2 0x1016 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x12DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP5 POP PUSH1 0x1 DUP6 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x1 ADD SLOAD DUP7 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x13B9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x138E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x13B9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x139C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1406 JUMPI DUP6 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x1451 JUMP JUMPDEST DUP6 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP6 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1493 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x14EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1510 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x152A JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1535 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x1540 JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x154A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x3 DUP6 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x172F JUMPI PUSH1 0x1 PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1690 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x170F JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x1722 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x1730 JUMP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x165F JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1771 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x6 DUP2 SWAP1 SSTORE POP PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x1877 JUMPI PUSH1 0x1 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17EB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x186A JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x17BA JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1955 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x192A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1955 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1938 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x19F6 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x19AC JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1A37 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x1AE3 JUMPI DUP6 DUP1 ISZERO PUSH2 0x1A7A JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x1AAD JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x1AAC JUMPI POP PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x1AD6 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1AC1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1A43 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1B14 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1B66 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B31 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1B4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD DUP2 DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1B1B JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1BD1 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 LT ISZERO PUSH2 0x1D1E JUMPI PUSH1 0x1 PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C0E JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1D11 JUMPI PUSH1 0x3 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1C95 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1CCE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1BDD JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1D4D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1DCC JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D6B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1D83 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP1 DUP1 PUSH1 0x1 ADD SWAP2 POP POP PUSH2 0x1D55 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1E14 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1E29 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1E34 JUMPI POP PUSH1 0x0 DUP2 EQ JUMPDEST DUP1 PUSH2 0x1E3F JUMPI POP PUSH1 0x0 DUP3 EQ JUMPDEST ISZERO PUSH2 0x1E49 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x4 DUP2 SWAP1 SSTORE POP PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A DUP4 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x1F3F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 CALLER PUSH1 0x1 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1FA9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1FB3 DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO ISZERO PUSH2 0x1FBF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP6 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH2 0x2074 DUP7 PUSH2 0x1652 JUMP JUMPDEST ISZERO PUSH2 0x2084 JUMPI PUSH2 0x2083 DUP7 TIMESTAMP PUSH2 0x25C6 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2099 DUP5 DUP5 DUP5 PUSH2 0x261A JUMP JUMPDEST SWAP1 POP PUSH2 0x20A4 DUP2 PUSH2 0x1E8C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x210A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x2163 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x2 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x21BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP DUP4 LT ISZERO PUSH2 0x22A4 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2297 JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x224A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x22A4 JUMP JUMPDEST DUP3 DUP1 PUSH1 0x1 ADD SWAP4 POP POP PUSH2 0x21C0 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x2411 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x241B DUP2 PUSH2 0x1652 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x2426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH1 0x6 SLOAD PUSH1 0x7 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD TIMESTAMP LT ISZERO ISZERO ISZERO PUSH2 0x244D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP4 POP PUSH1 0x1 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP DUP4 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH1 0x1 ADD SLOAD DUP6 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2527 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x24FC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2527 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x250A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x2574 JUMPI DUP5 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH2 0x25BF JUMP JUMPDEST DUP5 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x0 DUP5 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP JUMPDEST POP POP POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x7 PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2641 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD SWAP2 POP PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 ISZERO ISZERO DUP2 MSTORE POP PUSH1 0x0 DUP1 DUP5 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SSTORE PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2700 SWAP3 SWAP2 SWAP1 PUSH2 0x2796 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP SWAP1 POP POP PUSH1 0x1 PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2791 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2790 SWAP2 SWAP1 PUSH2 0x2816 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x27D7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2805 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2805 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2804 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x27E9 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x2812 SWAP2 SWAP1 PUSH2 0x2816 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x2838 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2834 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x281C JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 JUMPDEST BALANCE PUSH17 0x311683DD42D70D319DD5251070967966A2 PUSH1 0xFD 0x2e 0x2f 0x3f 0xcf 0xdf 0xe5 SMOD 0x48 PUSH19 0x32002900000000000000000000000000000000 ",
+ "sourceMap": "698:2422:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2519:1:0;2507:9;:13;2503:61;;;2542:10;2534:30;;;2554:9;2534:30;;;;;;;;;;;;;;;;;;2503:61;698:2422:2;936:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3711:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3711:460:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3196:332:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3196:332:1;;;;;;;;;;;;;;;;;;;;;;;;;;890:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;890:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;820:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1049:29:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1049:29:1;;;;;;;;;;;;;;;;;;;;;;;9136:319:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9136:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2758:360:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2758:360:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2042:502;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2042:502:2;;;;;;;;;;;;;;;;;;;;;;;;;;3311:277:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3311:277:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7304:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7304:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2321:186:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2321:186:1;;;;;;;;;;;;;;;;;;;;;;;;;;8622:252:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8622:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;765:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;765:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9539:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9539:115:0;;;;;;;;;;;;;;;;;10757:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10757:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;10757:676:0;;;;;;;;;;;;;;;;;800:44:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;800:44:2;;;;;;;;;;;;;;;;;;;;;;;;;;;9833:575:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9833:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9833:575:0;;;;;;;;;;;;;;;;;991:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;991:28:0;;;;;;;;;;;;;;;;;;;;;;;4990:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4990:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;2613:459:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2613:459:1;;;;;;;;;;;;;;;;;;;;;;;;;;5456:244:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5456:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1085:47:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1085:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;217:41:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;217:41:0;;;;;;;;;;;;;;;;;;;;;;;965:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;965:20:0;;;;;;;;;;;;;;;;;;;;;;;4370:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4370:449:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3642:472:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3642:472:1;;;;;;;;;;;;;;;;;;;;;;;;;;936:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3711:460::-;3859:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3801:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;3839:5;3822:7;:14;3830:5;3822:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;3866:1;3859:8;;3854:170;3887:1;3871:6;:13;;;;:17;3869:1;:19;3854:170;;;3924:5;3911:18;;:6;3918:1;3911:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;3907:117;;;3961:6;3984:1;3968:6;:13;;;;:17;3961:25;;;;;;;;;;;;;;;;;;;;;;;;;;;3949:6;3956:1;3949:9;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4004:5;;3907:117;3890:3;;;;;;;3854:170;;;4050:1;4033:6;:18;;;;;;;;;;;;;;:::i;:::-;;4076:6;:13;;;;4065:8;;:24;4061:74;;;4103:32;4121:6;:13;;;;4103:17;:32::i;:::-;4061:74;4158:5;4145:19;;;;;;;;;;;;1242:1;3711:460;;:::o;3196:332:1:-;3279:10;1420:7:0;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;3309:13:1;3324:10;1694:13:0;:28;1708:13;1694:28;;;;;;;;;;;:35;1723:5;1694:35;;;;;;;;;;;;;;;;;;;;;;;;;1693:36;1689:59;;;1743:5;;;1689:59;3356:13:1;1976:12:0;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;3397:13:1;1205:26;1217:13;1205:11;:26::i;:::-;1204:27;1196:36;;;;;;;;3469:5;3426:13;:28;3440:13;3426:28;;;;;;;;;;;:40;3455:10;3426:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;3507:13;3495:10;3484:37;;;;;;;;;;;;2041:1:0;1758;1463;;3196:332:1;;:::o;890:40:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;820:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1049:29:1:-;;;;:::o;9136:319:0:-;9243:10;9274:6;9281:1;9274:8;;9269:179;9286:16;;9284:1;:18;9269:179;;;9328:7;:36;;;;;9340:12;:15;9353:1;9340:15;;;;;;;;;;;:24;;;;;;;;;;;;9339:25;9328:36;:92;;;;9384:8;:36;;;;;9396:12;:15;9409:1;9396:15;;;;;;;;;;;:24;;;;;;;;;;;;9384:36;9328:92;9321:127;;;9447:1;9438:10;;;;9321:127;9304:3;;;;;;;9269:179;;;9136:319;;;;;:::o;2758:360:2:-;2862:4;2882:39;2987:6;2931:40;;;;;;;;;;;;;;;;;;;2882:90;;2996:1;2987:10;;2982:109;3003:1;2999;:5;2982:109;;;3044:32;3077:1;3044:35;;;;;;;;;;;;3033:46;;;:4;3038:1;3033:7;;;;;;;;;;;;;;;;;;;;:46;;;;3025:55;;;;;;;;3006:3;;;;;;;2982:109;;;3107:4;3100:11;;2758:360;;;;;:::o;2042:502::-;2258:22;2137:13;1976:12:0;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;2175:13:2;1318:26:1;1330:13;1318:11;:26::i;:::-;1310:35;;;;;;;;2229:13:2;921:22;946:12;:27;959:13;946:27;;;;;;;;;;;921:52;;1009:29;;;;;;;;;;;991:47;;:2;:14;;;;;;;;;;;;:47;;;983:56;;;;;;;;1057:42;1091:2;:7;;1057:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;:42::i;:::-;1049:51;;;;;;;;2283:12;:27;2296:13;2283:27;;;;;;;;;;;2258:52;;2334:4;2320:2;:11;;;:18;;;;;;;;;;;;;;;;;;2352:2;:14;;;;;;;;;;;;:19;;2378:2;:8;;;2388:2;:7;;2352:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2348:190;;;2420:13;2410:24;;;;;;;;;;2348:190;;;2480:13;2463:31;;;;;;;;;;2522:5;2508:2;:11;;;:19;;;;;;;;;;;;;;;;;;2348:190;1355:1:1;;2041::0;2042:502:2;;;:::o;3311:277:0:-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;3404:5;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;3427:5;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;3475:1;3459:6;:13;;;;:17;3478:8;;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;3519:4;3502:7;:14;3510:5;3502:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;3533:6;3545:5;3533:18;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;3533:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3575:5;3561:20;;;;;;;;;;;;2146:1;;1355;1242;3311:277;:::o;7304:337::-;7394:4;7414:10;7443:6;7427:1;7414:14;;7450:1;7443:8;;7438:197;7455:6;:13;;;;7453:1;:15;7438:197;;;7493:13;:28;7507:13;7493:28;;;;;;;;;;;:39;7522:6;7529:1;7522:9;;;;;;;;;;;;;;;;;;;;;;;;;;;7493:39;;;;;;;;;;;;;;;;;;;;;;;;;7489:71;;;7559:1;7550:10;;;;7489:71;7587:8;;7578:5;:17;7574:50;;;7620:4;7613:11;;;;7574:50;7470:3;;;;;;;7438:197;;;7304:337;;;;;;:::o;2321:186:1:-;1208:4:0;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;2438:18:1;2418:17;:38;;;;2466:34;2481:18;2466:34;;;;;;;;;;;;;;;;;;2321:186;:::o;8622:252:0:-;8721:10;8752:6;8759:1;8752:8;;8747:120;8764:6;:13;;;;8762:1;:15;8747:120;;;8800:13;:28;8814:13;8800:28;;;;;;;;;;;:39;8829:6;8836:1;8829:9;;;;;;;;;;;;;;;;;;;;;;;;;;;8800:39;;;;;;;;;;;;;;;;;;;;;;;;;8796:71;;;8866:1;8857:10;;;;8796:71;8779:3;;;;;;;8747:120;;;8622:252;;;;:::o;765:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9539:115::-;9609:9;9641:6;9634:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9539:115;:::o;10757:676::-;10882:22;10920:32;10993:10;11017:6;10966:16;;10955:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10955:28:0;;;;10920:63;;11006:1;10993:14;;11040:1;11038:3;;11033:250;11045:16;;11043:1;:18;11033:250;;;11087:7;:36;;;;;11099:12;:15;11112:1;11099:15;;;;;;;;;;;:24;;;;;;;;;;;;11098:25;11087:36;:92;;;;11143:8;:36;;;;;11155:12;:15;11168:1;11155:15;;;;;;;;;;;:24;;;;;;;;;;;;11143:36;11087:92;11080:203;;;11239:1;11211:18;11230:5;11211:25;;;;;;;;;;;;;;;;;:29;;;;;11267:1;11258:10;;;;11080:203;11063:3;;;;;;;11033:250;;;11326:4;11321:2;:9;11310:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;11310:21:0;;;;11292:39;;11348:4;11346:6;;11341:85;11356:2;11354:1;:4;11341:85;;;11405:18;11424:1;11405:21;;;;;;;;;;;;;;;;;;11377:15;11397:4;11393:1;:8;11377:25;;;;;;;;;;;;;;;;;:49;;;;;11360:3;;;;;;;11341:85;;;10757:676;;;;;;;;;:::o;800:44:2:-;;;;;;;;;;;;;:::o;9833:575:0:-;9928:24;9968:34;10043:10;10067:6;10019;:13;;;;10005:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10005:28:0;;;;9968:65;;10056:1;10043:14;;10090:1;10088:3;;10083:186;10095:6;:13;;;;10093:1;:15;10083:186;;;10131:13;:28;10145:13;10131:28;;;;;;;;;;;:39;10160:6;10167:1;10160:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10131:39;;;;;;;;;;;;;;;;;;;;;;;;;10127:142;;;10217:6;10224:1;10217:9;;;;;;;;;;;;;;;;;;;;;;;;;;;10190:17;10208:5;10190:24;;;;;;;;;;;;;;;;;:36;;;;;;;;;;;10253:1;10244:10;;;;10127:142;10110:3;;;;;;;10083:186;;;10309:5;10295:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;10295:20:0;;;;10278:37;;10332:1;10330:3;;10325:76;10337:5;10335:1;:7;10325:76;;;10381:17;10399:1;10381:20;;;;;;;;;;;;;;;;;;10361:14;10376:1;10361:17;;;;;;;;;;;;;;;;;:40;;;;;;;;;;;10344:3;;;;;;;10325:76;;;9833:575;;;;;;:::o;991:28::-;;;;:::o;4990:207::-;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;5092:6;:13;;;;5107:9;256:2;2236:10;:28;:66;;;;2292:10;2280:9;:22;2236:66;:96;;;;2331:1;2318:9;:14;2236:96;:127;;;;2362:1;2348:10;:15;2236:127;2229:153;;;2377:5;;;2229:153;5143:9;5132:8;:20;;;;5162:28;5180:9;5162:28;;;;;;;;;;;;;;;;;;1242:1;;4990:207;:::o;2613:459:1:-;2696:10;1420:7:0;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;2734:13:1;1581:1:0;1538:12;:27;1551:13;1538:27;;;;;;;;;;;:39;;;;;;;;;;;;:44;;;1534:67;;;1596:5;;;1534:67;2770:13:1;2785:10;1843:13:0;:28;1857:13;1843:28;;;;;;;;;;;:35;1872:5;1843:35;;;;;;;;;;;;;;;;;;;;;;;;;1839:58;;;1892:5;;;1839:58;2823:13:1;1205:26;1217:13;1205:11;:26::i;:::-;1204:27;1196:36;;;;;;;;2895:4;2852:13;:28;2866:13;2852:28;;;;;;;;;;;:40;2881:10;2852:40;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;2934:13;2922:10;2909:39;;;;;;;;;;;;2962:26;2974:13;2962:11;:26::i;:::-;2958:108;;;3004:51;3024:13;3039:15;3004:19;:51::i;:::-;2958:108;1907:1:0;1611;;1463;2613:459:1;;:::o;5456:244:0:-;5560:18;5610:40;5625:11;5638:5;5645:4;5610:14;:40::i;:::-;5594:56;;5660:33;5679:13;5660:18;:33::i;:::-;5456:244;;;;;:::o;1085:47:1:-;;;;;;;;;;;;;;;;;:::o;217:41:0:-;256:2;217:41;:::o;965:20::-;;;;:::o;4370:449::-;4541:6;1208:4;1186:27;;:10;:27;;;;1182:50;;;1227:5;;;1182:50;4479:5;1420:7;:14;1428:5;1420:14;;;;;;;;;;;;;;;;;;;;;;;;;1419:15;1415:38;;;1448:5;;;1415:38;4512:8;1312:7;:14;1320:5;1312:14;;;;;;;;;;;;;;;;;;;;;;;;;1308:37;;;1340:5;;;1308:37;4548:1;4541:8;;4536:149;4553:6;:13;;;;4551:1;:15;4536:149;;;4602:5;4589:18;;:6;4596:1;4589:9;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;;;4585:100;;;4639:8;4627:6;4634:1;4627:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4665:5;;4585:100;4568:3;;;;;;;4536:149;;;4711:5;4694:7;:14;4702:5;4694:14;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;4746:4;4726:7;:17;4734:8;4726:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;4773:5;4760:19;;;;;;;;;;;;4803:8;4789:23;;;;;;;;;;;;1463:1;1242;4370:449;;;:::o;3642:472:1:-;3828:22;3725:13;1976:12:0;:27;1989:13;1976:27;;;;;;;;;;;:36;;;;;;;;;;;;1972:59;;;2026:5;;;1972:59;3763:13:1;1318:26;1330:13;1318:11;:26::i;:::-;1310:35;;;;;;;;3799:13;1483:17;;1448;:32;1466:13;1448:32;;;;;;;;;;;;:52;1429:15;:71;;1421:80;;;;;;;;3853:12;:27;3866:13;3853:27;;;;;;;;;;;3828:52;;3904:4;3890:2;:11;;;:18;;;;;;;;;;;;;;;;;;3922:2;:14;;;;;;;;;;;;:19;;3948:2;:8;;;3958:2;:7;;3922:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3918:190;;;3990:13;3980:24;;;;;;;;;;3918:190;;;4050:13;4033:31;;;;;;;;;;4092:5;4078:2;:11;;;:19;;;;;;;;;;;;;;;;;;3918:190;1355:1;2041::0;3642:472:1;;;:::o;4224:223::-;4362:16;4327:17;:32;4345:13;4327:32;;;;;;;;;;;:51;;;;4408:13;4388:52;4423:16;4388:52;;;;;;;;;;;;;;;;;;4224:223;;:::o;7974:451:0:-;8106:18;8076:11;2116:1;2104:8;:13;;;2100:36;;;2131:5;;;2100:36;8156:16;;8140:32;;8212:140;;;;;;;;;8251:11;8212:140;;;;;;8283:5;8212:140;;;;8308:4;8212:140;;;;8336:5;8212:140;;;;;8182:12;:27;8195:13;8182:27;;;;;;;;;;;:170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8382:1;8362:16;;:21;;;;;;;;;;;8404:13;8393:25;;;;;;;;;;7974:451;;;;;;:::o;698:2422:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": {
+ "id": 0
+ },
+ "current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol": {
+ "id": 1
+ },
+ "previous/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol": {
+ "id": 2
+ }
+ },
+ "sourceCodes": {
+ "current/multisig/MultiSigWallet/MultiSigWallet.sol": "pragma solidity ^0.4.10;\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.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 solidity ^0.4.10;\n\nimport { MultiSigWallet } from \"../MultiSigWallet/MultiSigWallet.sol\";\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n",
+ "previous/MultiSigWalletWithTImeLockExceptRemoveAuthorizedAddress/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.sol": "/*\n\n Copyright 2017 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 solidity ^0.4.10;\n\nimport \"../../current/multisig/MultiSigWalletWithTimeLock/MultiSigWalletWithTimeLock.sol\";\n\ncontract MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress is MultiSigWalletWithTimeLock {\n\n address public TOKEN_TRANSFER_PROXY_CONTRACT;\n\n modifier validRemoveAuthorizedAddressTx(uint transactionId) {\n Transaction storage tx = transactions[transactionId];\n require(tx.destination == TOKEN_TRANSFER_PROXY_CONTRACT);\n require(isFunctionRemoveAuthorizedAddress(tx.data));\n _;\n }\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, time lock, and tokenTransferProxy address.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n /// @param _tokenTransferProxy Address of TokenTransferProxy contract.\n function MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(\n address[] _owners,\n uint _required,\n uint _secondsTimeLocked,\n address _tokenTransferProxy)\n public\n MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)\n {\n TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;\n }\n\n /// @dev Allows execution of removeAuthorizedAddress without time lock.\n /// @param transactionId Transaction ID.\n function executeRemoveAuthorizedAddress(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n validRemoveAuthorizedAddressTx(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function signature.\n /// @param data Transaction data.\n /// @return Successful if data is a call to removeAuthorizedAddress.\n function isFunctionRemoveAuthorizedAddress(bytes data)\n public\n constant\n returns (bool)\n {\n bytes4 removeAuthorizedAddressSignature = bytes4(sha3(\"removeAuthorizedAddress(address)\"));\n for (uint i = 0; i < 4; i++) {\n require(data[i] == removeAuthorizedAddressSignature[i]);\n }\n return true;\n }\n}"
+ },
+ "sourceTreeHashHex": "0x25d91d4bcf6839a2bd776dd9169a3eac2062224b73bea074046888f19a7f52a4",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x34d402f14d58e001d8efbe6585051bf9706aa064",
+ "links": {},
+ "constructorArgs": "[[\"0x5409ed021d9299bf6814279a6a1411a7e866a631\",\"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb\"],\"2\",\"0\",\"0x1dc4c1cefef38a777b15aa20260a54e584b16c48\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/TokenRegistry.json b/packages/migrations/artifacts/1.0.0/TokenRegistry.json
new file mode 100644
index 000000000..aebb7c48a
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/TokenRegistry.json
@@ -0,0 +1,600 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TokenRegistry",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeToken",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenAddressByName",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenAddressBySymbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "setTokenSwarmHash",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ }
+ ],
+ "name": "getTokenMetaData",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_name",
+ "type": "string"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ },
+ {
+ "name": "_decimals",
+ "type": "uint8"
+ },
+ {
+ "name": "_ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "name": "_swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "addToken",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "setTokenName",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "tokens",
+ "outputs": [
+ {
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenByName",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getTokenAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_ipfsHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "setTokenIpfsHash",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenBySymbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "setTokenSymbol",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogAddToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogRemoveToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldName",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "newName",
+ "type": "string"
+ }
+ ],
+ "name": "LogTokenNameChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldSymbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "newSymbol",
+ "type": "string"
+ }
+ ],
+ "name": "LogTokenSymbolChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldIpfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "newIpfsHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogTokenIpfsHashChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldSwarmHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "newSwarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogTokenSwarmHashChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c80806100536000396000f3006080604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313baf1e6146100eb5780632fbfeba9146101385780633550b6d9146101e1578063563188201461028a5780637abccac9146103135780638da5cb5b14610553578063a880319d146105aa578063c370c86d14610712578063e48603391461079b578063e5df8b84146109db578063e73fc0c314610a48578063ee8c24b814610cae578063eef05f6514610d1a578063efa74f1f14610da3578063f036417f14611009578063f2fde38b14611092575b600080fd5b3480156100f757600080fd5b50610136600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110d5565b005b34801561014457600080fd5b5061019f600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506117e5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101ed57600080fd5b50610248600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061187a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561029657600080fd5b50610311600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061190f565b005b34801561031f57600080fd5b50610354600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bab565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b838110156103de5780820151818401526020810190506103c3565b50505050905090810190601f16801561040b5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610444578082015181840152602081019050610429565b50505050905090810190601f1680156104715780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156104aa57808201518184015260208101905061048f565b50505050905090810190601f1680156104d75780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b838110156105105780820151818401526020810190506104f5565b50505050905090810190601f16801561053d5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561055f57600080fd5b50610568611f45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b657600080fd5b50610710600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611f6a565b005b34801561071e57600080fd5b50610799600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612761565b005b3480156107a757600080fd5b506107dc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c06565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b8381101561086657808201518184015260208101905061084b565b50505050905090810190601f1680156108935780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b838110156108cc5780820151818401526020810190506108b1565b50505050905090810190601f1680156108f95780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610932578082015181840152602081019050610917565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561099857808201518184015260208101905061097d565b50505050905090810190601f1680156109c55780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b3480156109e757600080fd5b50610a0660048036038101908080359060200190929190505050612ecf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a5457600080fd5b50610aaf600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f0d565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610b39578082015181840152602081019050610b1e565b50505050905090810190601f168015610b665780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610b9f578082015181840152602081019050610b84565b50505050905090810190601f168015610bcc5780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610c05578082015181840152602081019050610bea565b50505050905090810190601f168015610c325780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015610c6b578082015181840152602081019050610c50565b50505050905090810190601f168015610c985780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cba57600080fd5b50610cc3612fc6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d06578082015181840152602081019050610ceb565b505050509050019250505060405180910390f35b348015610d2657600080fd5b50610da1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613054565b005b348015610daf57600080fd5b50610e0a600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506132f0565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610e94578082015181840152602081019050610e79565b50505050905090810190601f168015610ec15780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610efa578082015181840152602081019050610edf565b50505050905090810190601f168015610f275780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610f60578082015181840152602081019050610f45565b50505050905090810190601f168015610f8d5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015610fc6578082015181840152602081019050610fab565b50505050905090810190601f168015610ff35780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561101557600080fd5b50611090600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133a9565b005b34801561109e57600080fd5b506110d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061384e565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561113257600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111d157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166004848154811015156111f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561124457600080fd5b600460016004805490500381548110151561125b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048481548110151561129557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016004818180549050039150816112f59190613923565b50600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c683600101846002018560030160009054906101000a900460ff1686600401876005016040518080602001806020018660ff1660ff168152602001806020018060200185810385528a8181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b50508581038452898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156114d95780601f106114ae576101008083540402835291602001916114d9565b820191906000526020600020905b8154815290600101906020018083116114bc57829003601f168201915b505085810383528781815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561155c5780601f106115315761010080835404028352916020019161155c565b820191906000526020600020905b81548152906001019060200180831161153f57829003601f168201915b50508581038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156115df5780601f106115b4576101008083540402835291602001916115df565b820191906000526020600020905b8154815290600101906020018083116115c257829003601f168201915b5050995050505050505050505060405180910390a260028260020160405180828054600181600116156101000203166002900480156116555780601f10611633576101008083540402835291820191611655565b820191906000526020600020905b815481529060010190602001808311611641575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560038260010160405180828054600181600116156101000203166002900480156116ec5780601f106116ca5761010080835404028352918201916116ec565b820191906000526020600020905b8154815290600101906020018083116116d8575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000611799919061394f565b6002820160006117a9919061394f565b6003820160006101000a81549060ff02191690556004820160006117cd9190613997565b6005820160006117dd9190613997565b505050505050565b60006003826040518082805190602001908083835b60208310151561181f57805182526020820191506020810190506020830392506117fa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002826040518082805190602001908083835b6020831015156118b4578051825260208201915060208101905060208303925061188f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561196c57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611a0b57600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508373ffffffffffffffffffffffffffffffffffffffff167fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd8360050185604051808060200180602001838103835285818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611b165780601f10611aeb57610100808354040283529160200191611b16565b820191906000526020600020905b815481529060010190602001808311611af957829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b83811015611b50578082015181840152602081019050611b35565b50505050905090810190601f168015611b7d5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282826005019080519060200190611ba49291906139df565b5050505050565b60006060806000606080611bbd613a5f565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060c060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d995780601f10611d6e57610100808354040283529160200191611d99565b820191906000526020600020905b815481529060010190602001808311611d7c57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff168152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e585780601f10611e2d57610100808354040283529160200191611e58565b820191906000526020600020905b815481529060010190602001808311611e3b57829003601f168201915b50505050508152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efa5780601f10611ecf57610100808354040283529160200191611efa565b820191906000526020600020905b815481529060010190602001808311611edd57829003601f168201915b5050505050815250509050806000015181602001518260400151836060015184608001518560a001518494508393508191508090509650965096509650965096505091939550919395565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc557600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561206357600080fd5b86600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156120a057600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831015156120f157805182526020820191506020810190506020830392506120cc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216757600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831015156121b85780518252602082019150602081019050602083039250612193565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561222e57600080fd5b60c0604051908101604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860ff16815260200187815260200186815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612317929190613aaf565b506040820151816002019080519060200190612334929190613aaf565b5060608201518160030160006101000a81548160ff021916908360ff1602179055506080820151816004019080519060200190612372929190613b2f565b5060a082015181600501908051906020019061238f929190613b2f565b5090505060048a90806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050896002896040518082805190602001908083835b602083101515612432578051825260208201915060208101905060208303925061240d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508960038a6040518082805190602001908083835b6020831015156124dc57805182526020820191506020810190506020830392506124b7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508973ffffffffffffffffffffffffffffffffffffffff167fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa91448a8a8a8a8a6040518080602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b838110156125e25780820151818401526020810190506125c7565b50505050905090810190601f16801561260f5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b8381101561264857808201518184015260208101905061262d565b50505050905090810190601f1680156126755780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156126ae578082015181840152602081019050612693565b50505050905090810190601f1680156126db5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b838110156127145780820151818401526020810190506126f9565b50505050905090810190601f1680156127415780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127be57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561285d57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831015156128ae5780518252602082019150602081019050602083039250612889565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092508473ffffffffffffffffffffffffffffffffffffffff167f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae8460010186604051808060200180602001838103835285818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612a2f5780601f10612a0457610100808354040283529160200191612a2f565b820191906000526020600020905b815481529060010190602001808311612a1257829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b83811015612a69578082015181840152602081019050612a4e565b50505050905090810190601f168015612a965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015612b065780601f10612ae4576101008083540402835291820191612b06565b820191906000526020600020905b815481529060010190602001808311612af2575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055846003856040518082805190602001908083835b602083101515612b755780518252602082019150602081019050602083039250612b50565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083836001019080519060200190612bfe929190613baf565b505050505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cd85780601f10612cad57610100808354040283529160200191612cd8565b820191906000526020600020905b815481529060010190602001808311612cbb57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d765780601f10612d4b57610100808354040283529160200191612d76565b820191906000526020600020905b815481529060010190602001808311612d5957829003601f168201915b5050505050908060030160009054906101000a900460ff1690806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e275780601f10612dfc57610100808354040283529160200191612e27565b820191906000526020600020905b815481529060010190602001808311612e0a57829003601f168201915b505050505090806005018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ec55780601f10612e9a57610100808354040283529160200191612ec5565b820191906000526020600020905b815481529060010190602001808311612ea857829003601f168201915b5050505050905086565b600481815481101515612ede57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606080600060608060006003886040518082805190602001908083835b602083101515612f515780518252602082019150602081019050602083039250612f2c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612fb081611bab565b9650965096509650965096505091939550919395565b6060600480548060200260200160405190810160405280929190818152602001828054801561304a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613000575b5050505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130b157600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315057600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508373ffffffffffffffffffffffffffffffffffffffff167f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f908694836004018560405180806020018060200183810383528581815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561325b5780601f106132305761010080835404028352916020019161325b565b820191906000526020600020905b81548152906001019060200180831161323e57829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b8381101561329557808201518184015260208101905061327a565b50505050905090810190601f1680156132c25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2828260040190805190602001906132e99291906139df565b5050505050565b6000606080600060608060006002886040518082805190602001908083835b602083101515613334578051825260208201915060208101905060208303925061330f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061339381611bab565b9650965096509650965096505091939550919395565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561340657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156134a557600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831015156134f657805182526020820191506020810190506020830392506134d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561356c57600080fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092508473ffffffffffffffffffffffffffffffffffffffff167f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f84600201866040518080602001806020018381038352858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136775780601f1061364c57610100808354040283529160200191613677565b820191906000526020600020905b81548152906001019060200180831161365a57829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b838110156136b1578082015181840152602081019050613696565b50505050905090810190601f1680156136de5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2600283600201604051808280546001816001161561010002031660029004801561374e5780601f1061372c57610100808354040283529182019161374e565b820191906000526020600020905b81548152906001019060200180831161373a575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055846002856040518082805190602001908083835b6020831015156137bd5780518252602082019150602081019050602083039250613798565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083836002019080519060200190613846929190613baf565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561392057806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b81548183558181111561394a578183600052602060002091820191016139499190613c2f565b5b505050565b50805460018160011615610100020316600290046000825580601f106139755750613994565b601f0160209004906000526020600020908101906139939190613c2f565b5b50565b50805460018160011615610100020316600290046000825580601f106139bd57506139dc565b601f0160209004906000526020600020908101906139db9190613c2f565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a2057805160ff1916838001178555613a4e565b82800160010185558215613a4e579182015b82811115613a4d578251825591602001919060010190613a32565b5b509050613a5b9190613c2f565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613af057805160ff1916838001178555613b1e565b82800160010185558215613b1e579182015b82811115613b1d578251825591602001919060010190613b02565b5b509050613b2b9190613c2f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b7057805160ff1916838001178555613b9e565b82800160010185558215613b9e579182015b82811115613b9d578251825591602001919060010190613b82565b5b509050613bab9190613c2f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bf057805160ff1916838001178555613c1e565b82800160010185558215613c1e579182015b82811115613c1d578251825591602001919060010190613c02565b5b509050613c2b9190613c2f565b5090565b613c5191905b80821115613c4d576000816000905550600101613c35565b5090565b905600a165627a7a72305820d84e18f5e2a4225b867b811a1b72127ed7ad24cf5341436b1f500232eac44bc80029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x3C80 DUP1 PUSH2 0x53 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE6 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x13BAF1E6 EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x28A JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x313 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x5AA JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x712 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x79B JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x9DB JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0xA48 JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0xCAE JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0xD1A JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0xDA3 JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x1009 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1092 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10D5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x17E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x187A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x296 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x311 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x190F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x354 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1BAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DE JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3C3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x444 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x471 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4AA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x48F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x4D7 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x510 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4F5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x53D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x568 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x710 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1F6A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x71E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x799 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2761 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7DC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2C06 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x866 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x84B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x893 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x8CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x8B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x8F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x932 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x917 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x95F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x998 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x97D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9C5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA06 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2ECF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAAF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2F0D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB39 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB1E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB66 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB84 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBCC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC05 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xBEA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC32 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC6B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xC50 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC98 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCC3 PUSH2 0x2FC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xCEB JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x3054 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE0A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x32F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE94 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE79 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEC1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF27 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF60 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xF45 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF8D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xFC6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xFAB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xFF3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1015 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1090 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x33A9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10D3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x384E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1132 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x11D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11F7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x1 PUSH1 0x4 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x125B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1295 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x4 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x12F5 SWAP2 SWAP1 PUSH2 0x3923 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 DUP4 PUSH1 0x1 ADD DUP5 PUSH1 0x2 ADD DUP6 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP7 PUSH1 0x4 ADD DUP8 PUSH1 0x5 ADD PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1456 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x142B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1456 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1439 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x14D9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x155C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1531 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x155C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x153F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x15DF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x15B4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x15DF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x15C2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1655 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1633 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1655 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1641 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x16EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x16CA JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x16EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x16D8 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP1 DUP3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x1 DUP3 ADD PUSH1 0x0 PUSH2 0x1799 SWAP2 SWAP1 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x2 DUP3 ADD PUSH1 0x0 PUSH2 0x17A9 SWAP2 SWAP1 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x3 DUP3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x4 DUP3 ADD PUSH1 0x0 PUSH2 0x17CD SWAP2 SWAP1 PUSH2 0x3997 JUMP JUMPDEST PUSH1 0x5 DUP3 ADD PUSH1 0x0 PUSH2 0x17DD SWAP2 SWAP1 PUSH2 0x3997 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x181F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x17FA JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x18B4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x188F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x1A0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD DUP4 PUSH1 0x5 ADD DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1B16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1AEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1B16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B50 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B35 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 DUP3 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x1BA4 SWAP3 SWAP2 SWAP1 PUSH2 0x39DF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x1BBD PUSH2 0x3A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1CF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1CCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1CF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1CDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1D99 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D6E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D99 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D7C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1E58 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1E2D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1E58 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1E3B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1EFA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1ECF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EFA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EDD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP DUP1 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0xA0 ADD MLOAD DUP5 SWAP5 POP DUP4 SWAP4 POP DUP2 SWAP2 POP DUP1 SWAP1 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2063 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x20F1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x20CC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x21B8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2193 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x222E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE POP PUSH1 0x1 PUSH1 0x0 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2317 SWAP3 SWAP2 SWAP1 PUSH2 0x3AAF JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2334 SWAP3 SWAP2 SWAP1 PUSH2 0x3AAF JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2372 SWAP3 SWAP2 SWAP1 PUSH2 0x3B2F JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x238F SWAP3 SWAP2 SWAP1 PUSH2 0x3B2F JUMP JUMPDEST POP SWAP1 POP POP PUSH1 0x4 DUP11 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP10 PUSH1 0x2 DUP10 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2432 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x240D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP10 PUSH1 0x3 DUP11 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x24DC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x24B7 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x25E2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x25C7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x260F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2648 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x262D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2675 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26AE JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2693 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26DB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2714 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x26F9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2741 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x285D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x28AE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2889 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2924 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP3 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE DUP5 PUSH1 0x1 ADD DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A2F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A04 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2A2F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A12 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2A69 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2A4E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2A96 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2B06 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2AE4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2B06 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2AF2 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP5 PUSH1 0x3 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2B75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2B50 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 DUP4 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2BFE SWAP3 SWAP2 SWAP1 PUSH2 0x3BAF JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2CD8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2CAD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2CD8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2CBB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2D76 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2D4B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2D76 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2D59 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2E27 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2DFC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2E27 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2E0A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x5 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2EC5 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2E9A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2EC5 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2EA8 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2EDE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2F51 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2F2C JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x2FB0 DUP2 PUSH2 0x1BAB JUMP JUMPDEST SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x304A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x3000 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x30B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x3150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 DUP4 PUSH1 0x4 ADD DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x325B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3230 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x325B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x323E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3295 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x327A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x32C2 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 DUP3 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x32E9 SWAP3 SWAP2 SWAP1 PUSH2 0x39DF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x3334 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x330F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x3393 DUP2 PUSH2 0x1BAB JUMP JUMPDEST SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x34A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x34F6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x34D1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x356C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP3 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F DUP5 PUSH1 0x2 ADD DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x3677 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x364C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3677 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x365A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x36B1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3696 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x36DE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x374E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x372C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x374E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x373A JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP5 PUSH1 0x2 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x37BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x3798 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 DUP4 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3846 SWAP3 SWAP2 SWAP1 PUSH2 0x3BAF JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x38A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3920 JUMPI DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x394A JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3949 SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x3975 JUMPI POP PUSH2 0x3994 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3993 SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x39BD JUMPI POP PUSH2 0x39DC JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x39DB SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3A20 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3A4E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3A4E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3A4D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3A32 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3A5B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3AF0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3B1E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3B1E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3B1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3B02 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3B2B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3B70 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3B9E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3B9E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3B9D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3B82 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3BAB SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3BF0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3C1E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3C1E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3C1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3C02 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3C2B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3C51 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3C4D JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x3C35 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd8 0x4e XOR 0xf5 0xe2 LOG4 0x22 JUMPDEST DUP7 PUSH28 0x811A1B72127ED7AD24CF5341436B1F500232EAC44BC8002900000000 ",
+ "sourceMap": "886:8364:1:-;;;290:10:0;282:5;;:18;;;;;;;;;;;;;;;;;;886:8364:1;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100e6576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313baf1e6146100eb5780632fbfeba9146101385780633550b6d9146101e1578063563188201461028a5780637abccac9146103135780638da5cb5b14610553578063a880319d146105aa578063c370c86d14610712578063e48603391461079b578063e5df8b84146109db578063e73fc0c314610a48578063ee8c24b814610cae578063eef05f6514610d1a578063efa74f1f14610da3578063f036417f14611009578063f2fde38b14611092575b600080fd5b3480156100f757600080fd5b50610136600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506110d5565b005b34801561014457600080fd5b5061019f600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506117e5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101ed57600080fd5b50610248600480360381019080803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061187a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561029657600080fd5b50610311600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061190f565b005b34801561031f57600080fd5b50610354600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bab565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b838110156103de5780820151818401526020810190506103c3565b50505050905090810190601f16801561040b5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610444578082015181840152602081019050610429565b50505050905090810190601f1680156104715780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156104aa57808201518184015260208101905061048f565b50505050905090810190601f1680156104d75780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b838110156105105780820151818401526020810190506104f5565b50505050905090810190601f16801561053d5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561055f57600080fd5b50610568611f45565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b657600080fd5b50610710600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803560ff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611f6a565b005b34801561071e57600080fd5b50610799600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612761565b005b3480156107a757600080fd5b506107dc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c06565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b8381101561086657808201518184015260208101905061084b565b50505050905090810190601f1680156108935780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b838110156108cc5780820151818401526020810190506108b1565b50505050905090810190601f1680156108f95780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610932578082015181840152602081019050610917565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b8381101561099857808201518184015260208101905061097d565b50505050905090810190601f1680156109c55780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b3480156109e757600080fd5b50610a0660048036038101908080359060200190929190505050612ecf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a5457600080fd5b50610aaf600480360381019080803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f0d565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610b39578082015181840152602081019050610b1e565b50505050905090810190601f168015610b665780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610b9f578082015181840152602081019050610b84565b50505050905090810190601f168015610bcc5780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610c05578082015181840152602081019050610bea565b50505050905090810190601f168015610c325780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015610c6b578082015181840152602081019050610c50565b50505050905090810190601f168015610c985780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b348015610cba57600080fd5b50610cc3612fc6565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d06578082015181840152602081019050610ceb565b505050509050019250505060405180910390f35b348015610d2657600080fd5b50610da1600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613054565b005b348015610daf57600080fd5b50610e0a600480360381019080803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506132f0565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610e94578082015181840152602081019050610e79565b50505050905090810190601f168015610ec15780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b83811015610efa578082015181840152602081019050610edf565b50505050905090810190601f168015610f275780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015610f60578082015181840152602081019050610f45565b50505050905090810190601f168015610f8d5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015610fc6578082015181840152602081019050610fab565b50505050905090810190601f168015610ff35780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561101557600080fd5b50611090600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091929192905050506133a9565b005b34801561109e57600080fd5b506110d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061384e565b005b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561113257600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156111d157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff166004848154811015156111f757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561124457600080fd5b600460016004805490500381548110151561125b57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660048481548110151561129557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016004818180549050039150816112f59190613923565b50600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c683600101846002018560030160009054906101000a900460ff1686600401876005016040518080602001806020018660ff1660ff168152602001806020018060200185810385528a8181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156114565780601f1061142b57610100808354040283529160200191611456565b820191906000526020600020905b81548152906001019060200180831161143957829003601f168201915b50508581038452898181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156114d95780601f106114ae576101008083540402835291602001916114d9565b820191906000526020600020905b8154815290600101906020018083116114bc57829003601f168201915b505085810383528781815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561155c5780601f106115315761010080835404028352916020019161155c565b820191906000526020600020905b81548152906001019060200180831161153f57829003601f168201915b50508581038252868181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156115df5780601f106115b4576101008083540402835291602001916115df565b820191906000526020600020905b8154815290600101906020018083116115c257829003601f168201915b5050995050505050505050505060405180910390a260028260020160405180828054600181600116156101000203166002900480156116555780601f10611633576101008083540402835291820191611655565b820191906000526020600020905b815481529060010190602001808311611641575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560038260010160405180828054600181600116156101000203166002900480156116ec5780601f106116ca5761010080835404028352918201916116ec565b820191906000526020600020905b8154815290600101906020018083116116d8575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000611799919061394f565b6002820160006117a9919061394f565b6003820160006101000a81549060ff02191690556004820160006117cd9190613997565b6005820160006117dd9190613997565b505050505050565b60006003826040518082805190602001908083835b60208310151561181f57805182526020820191506020810190506020830392506117fa565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002826040518082805190602001908083835b6020831015156118b4578051825260208201915060208101905060208303925061188f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561196c57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515611a0b57600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508373ffffffffffffffffffffffffffffffffffffffff167fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd8360050185604051808060200180602001838103835285818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611b165780601f10611aeb57610100808354040283529160200191611b16565b820191906000526020600020905b815481529060010190602001808311611af957829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b83811015611b50578082015181840152602081019050611b35565b50505050905090810190601f168015611b7d5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282826005019080519060200190611ba49291906139df565b5050505050565b60006060806000606080611bbd613a5f565b600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060c060405190810160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611cf75780601f10611ccc57610100808354040283529160200191611cf7565b820191906000526020600020905b815481529060010190602001808311611cda57829003601f168201915b50505050508152602001600282018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d995780601f10611d6e57610100808354040283529160200191611d99565b820191906000526020600020905b815481529060010190602001808311611d7c57829003601f168201915b505050505081526020016003820160009054906101000a900460ff1660ff1660ff168152602001600482018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e585780601f10611e2d57610100808354040283529160200191611e58565b820191906000526020600020905b815481529060010190602001808311611e3b57829003601f168201915b50505050508152602001600582018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611efa5780601f10611ecf57610100808354040283529160200191611efa565b820191906000526020600020905b815481529060010190602001808311611edd57829003601f168201915b5050505050815250509050806000015181602001518260400151836060015184608001518560a001518494508393508191508090509650965096509650965096505091939550919395565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc557600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561206357600080fd5b86600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156120a057600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831015156120f157805182526020820191506020810190506020830392506120cc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561216757600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831015156121b85780518252602082019150602081019050602083039250612193565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561222e57600080fd5b60c0604051908101604052808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018860ff16815260200187815260200186815250600160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190612317929190613aaf565b506040820151816002019080519060200190612334929190613aaf565b5060608201518160030160006101000a81548160ff021916908360ff1602179055506080820151816004019080519060200190612372929190613b2f565b5060a082015181600501908051906020019061238f929190613b2f565b5090505060048a90806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050896002896040518082805190602001908083835b602083101515612432578051825260208201915060208101905060208303925061240d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508960038a6040518082805190602001908083835b6020831015156124dc57805182526020820191506020810190506020830392506124b7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508973ffffffffffffffffffffffffffffffffffffffff167fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa91448a8a8a8a8a6040518080602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b838110156125e25780820151818401526020810190506125c7565b50505050905090810190601f16801561260f5780820380516001836020036101000a031916815260200191505b50858103845289818151815260200191508051906020019080838360005b8381101561264857808201518184015260208101905061262d565b50505050905090810190601f1680156126755780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b838110156126ae578082015181840152602081019050612693565b50505050905090810190601f1680156126db5780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b838110156127145780820151818401526020810190506126f9565b50505050905090810190601f1680156127415780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156127be57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561285d57600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831015156128ae5780518252602082019150602081019050602083039250612889565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092508473ffffffffffffffffffffffffffffffffffffffff167f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae8460010186604051808060200180602001838103835285818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612a2f5780601f10612a0457610100808354040283529160200191612a2f565b820191906000526020600020905b815481529060010190602001808311612a1257829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b83811015612a69578082015181840152602081019050612a4e565b50505050905090810190601f168015612a965780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015612b065780601f10612ae4576101008083540402835291820191612b06565b820191906000526020600020905b815481529060010190602001808311612af2575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055846003856040518082805190602001908083835b602083101515612b755780518252602082019150602081019050602083039250612b50565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083836001019080519060200190612bfe929190613baf565b505050505050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cd85780601f10612cad57610100808354040283529160200191612cd8565b820191906000526020600020905b815481529060010190602001808311612cbb57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d765780601f10612d4b57610100808354040283529160200191612d76565b820191906000526020600020905b815481529060010190602001808311612d5957829003601f168201915b5050505050908060030160009054906101000a900460ff1690806004018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e275780601f10612dfc57610100808354040283529160200191612e27565b820191906000526020600020905b815481529060010190602001808311612e0a57829003601f168201915b505050505090806005018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612ec55780601f10612e9a57610100808354040283529160200191612ec5565b820191906000526020600020905b815481529060010190602001808311612ea857829003601f168201915b5050505050905086565b600481815481101515612ede57fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000606080600060608060006003886040518082805190602001908083835b602083101515612f515780518252602082019150602081019050602083039250612f2c565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612fb081611bab565b9650965096509650965096505091939550919395565b6060600480548060200260200160405190810160405280929190818152602001828054801561304a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311613000575b5050505050905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156130b157600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561315057600080fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002091508373ffffffffffffffffffffffffffffffffffffffff167f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f908694836004018560405180806020018060200183810383528581815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561325b5780601f106132305761010080835404028352916020019161325b565b820191906000526020600020905b81548152906001019060200180831161323e57829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b8381101561329557808201518184015260208101905061327a565b50505050905090810190601f1680156132c25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2828260040190805190602001906132e99291906139df565b5050505050565b6000606080600060608060006002886040518082805190602001908083835b602083101515613334578051825260208201915060208101905060208303925061330f565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061339381611bab565b9650965096509650965096505091939550919395565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561340657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156134a557600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831015156134f657805182526020820191506020810190506020830392506134d1565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561356c57600080fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002092508473ffffffffffffffffffffffffffffffffffffffff167f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f84600201866040518080602001806020018381038352858181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156136775780601f1061364c57610100808354040283529160200191613677565b820191906000526020600020905b81548152906001019060200180831161365a57829003601f168201915b5050838103825284818151815260200191508051906020019080838360005b838110156136b1578082015181840152602081019050613696565b50505050905090810190601f1680156136de5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2600283600201604051808280546001816001161561010002031660029004801561374e5780601f1061372c57610100808354040283529182019161374e565b820191906000526020600020905b81548152906001019060200180831161373a575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055846002856040518082805190602001908083835b6020831015156137bd5780518252602082019150602081019050602083039250613798565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083836002019080519060200190613846929190613baf565b505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156138a957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561392057806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b81548183558181111561394a578183600052602060002091820191016139499190613c2f565b5b505050565b50805460018160011615610100020316600290046000825580601f106139755750613994565b601f0160209004906000526020600020908101906139939190613c2f565b5b50565b50805460018160011615610100020316600290046000825580601f106139bd57506139dc565b601f0160209004906000526020600020908101906139db9190613c2f565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a2057805160ff1916838001178555613a4e565b82800160010185558215613a4e579182015b82811115613a4d578251825591602001919060010190613a32565b5b509050613a5b9190613c2f565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613af057805160ff1916838001178555613b1e565b82800160010185558215613b1e579182015b82811115613b1d578251825591602001919060010190613b02565b5b509050613b2b9190613c2f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b7057805160ff1916838001178555613b9e565b82800160010185558215613b9e579182015b82811115613b9d578251825591602001919060010190613b82565b5b509050613bab9190613c2f565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bf057805160ff1916838001178555613c1e565b82800160010185558215613c1e579182015b82811115613c1d578251825591602001919060010190613c02565b5b509050613c2b9190613c2f565b5090565b613c5191905b80821115613c4d576000816000905550600101613c35565b5090565b905600a165627a7a72305820d84e18f5e2a4225b867b811a1b72127ed7ad24cf5341436b1f500232eac44bc80029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE6 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x13BAF1E6 EQ PUSH2 0xEB JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x1E1 JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x28A JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x313 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x553 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x5AA JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x712 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x79B JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x9DB JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0xA48 JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0xCAE JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0xD1A JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0xDA3 JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x1009 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1092 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x136 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x10D5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19F PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x17E5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x248 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x187A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x296 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x311 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x190F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x354 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1BAB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3DE JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3C3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x444 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x471 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4AA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x48F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x4D7 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x510 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x4F5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x53D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x55F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x568 PUSH2 0x1F45 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x710 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD PUSH1 0xFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x1F6A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x71E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x799 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2761 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x7DC PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2C06 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x866 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x84B JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x893 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x8CC JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x8B1 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x8F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x932 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x917 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x95F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x998 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x97D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x9C5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA06 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x2ECF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAAF PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x2F0D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB39 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB1E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xB66 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xB9F JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB84 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBCC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC05 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xBEA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC32 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC6B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xC50 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC98 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCBA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCC3 PUSH2 0x2FC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD06 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xCEB JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD26 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA1 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x3054 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xDAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE0A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x32F0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE94 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xE79 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEC1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xEFA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEDF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF27 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF60 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xF45 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF8D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xFC6 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xFAB JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xFF3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1015 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1090 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x33A9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x10D3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x384E JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1132 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x11D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11F7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 PUSH1 0x1 PUSH1 0x4 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x125B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1295 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x4 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x12F5 SWAP2 SWAP1 PUSH2 0x3923 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP2 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 DUP4 PUSH1 0x1 ADD DUP5 PUSH1 0x2 ADD DUP6 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP7 PUSH1 0x4 ADD DUP8 PUSH1 0x5 ADD PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1456 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x142B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1456 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1439 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x14D9 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14AE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14D9 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14BC JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x155C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1531 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x155C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x153F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x15DF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x15B4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x15DF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x15C2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1655 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1633 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1655 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1641 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x16EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x16CA JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x16EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x16D8 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP1 DUP3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x1 DUP3 ADD PUSH1 0x0 PUSH2 0x1799 SWAP2 SWAP1 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x2 DUP3 ADD PUSH1 0x0 PUSH2 0x17A9 SWAP2 SWAP1 PUSH2 0x394F JUMP JUMPDEST PUSH1 0x3 DUP3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x4 DUP3 ADD PUSH1 0x0 PUSH2 0x17CD SWAP2 SWAP1 PUSH2 0x3997 JUMP JUMPDEST PUSH1 0x5 DUP3 ADD PUSH1 0x0 PUSH2 0x17DD SWAP2 SWAP1 PUSH2 0x3997 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x181F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x17FA JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x18B4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x188F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x196C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x1A0B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD DUP4 PUSH1 0x5 ADD DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1B16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1AEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1B16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1AF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B50 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B35 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 DUP3 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x1BA4 SWAP3 SWAP2 SWAP1 PUSH2 0x39DF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x1BBD PUSH2 0x3A5F JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE SWAP1 DUP2 PUSH1 0x0 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x1 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1CF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1CCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1CF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1CDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x2 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1D99 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1D6E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1D99 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1D7C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x3 DUP3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1E58 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1E2D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1E58 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1E3B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1EFA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1ECF JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EFA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EDD JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 MSTORE POP POP SWAP1 POP DUP1 PUSH1 0x0 ADD MLOAD DUP2 PUSH1 0x20 ADD MLOAD DUP3 PUSH1 0x40 ADD MLOAD DUP4 PUSH1 0x60 ADD MLOAD DUP5 PUSH1 0x80 ADD MLOAD DUP6 PUSH1 0xA0 ADD MLOAD DUP5 SWAP5 POP DUP4 SWAP4 POP DUP2 SWAP2 POP DUP1 SWAP1 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x1FC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2063 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x20A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x20F1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x20CC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x21B8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2193 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x222E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 DUP12 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP11 DUP2 MSTORE PUSH1 0x20 ADD DUP10 DUP2 MSTORE PUSH1 0x20 ADD DUP9 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 DUP2 MSTORE POP PUSH1 0x1 PUSH1 0x0 DUP13 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2317 SWAP3 SWAP2 SWAP1 PUSH2 0x3AAF JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP2 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2334 SWAP3 SWAP2 SWAP1 PUSH2 0x3AAF JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD DUP2 PUSH1 0x3 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x80 DUP3 ADD MLOAD DUP2 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2372 SWAP3 SWAP2 SWAP1 PUSH2 0x3B2F JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP2 PUSH1 0x5 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x238F SWAP3 SWAP2 SWAP1 PUSH2 0x3B2F JUMP JUMPDEST POP SWAP1 POP POP PUSH1 0x4 DUP11 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP DUP10 PUSH1 0x2 DUP10 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2432 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x240D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP10 PUSH1 0x3 DUP11 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x24DC JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x24B7 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 DUP11 DUP11 DUP11 DUP11 DUP11 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x25E2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x25C7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x260F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2648 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x262D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2675 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26AE JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2693 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26DB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2714 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x26F9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2741 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x27BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x285D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x28AE JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2889 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x2924 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP3 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE DUP5 PUSH1 0x1 ADD DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A2F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A04 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2A2F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A12 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x2A69 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x2A4E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2A96 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2B06 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2AE4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2B06 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2AF2 JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP5 PUSH1 0x3 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2B75 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2B50 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 DUP4 PUSH1 0x1 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x2BFE SWAP3 SWAP2 SWAP1 PUSH2 0x3BAF JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP1 PUSH1 0x1 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2CD8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2CAD JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2CD8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2CBB JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2D76 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2D4B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2D76 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2D59 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x3 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND SWAP1 DUP1 PUSH1 0x4 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2E27 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2DFC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2E27 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2E0A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 DUP1 PUSH1 0x5 ADD DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2EC5 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2E9A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2EC5 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2EA8 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2EDE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x2F51 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x2F2C JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x2FB0 DUP2 PUSH2 0x1BAB JUMP JUMPDEST SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x304A JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x3000 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x30B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x3150 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP2 POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 DUP4 PUSH1 0x4 ADD DUP6 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x325B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3230 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x325B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x323E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3295 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x327A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x32C2 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 DUP3 PUSH1 0x4 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x32E9 SWAP3 SWAP2 SWAP1 PUSH2 0x39DF JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x3334 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x330F JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x3393 DUP2 PUSH2 0x1BAB JUMP JUMPDEST SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP SWAP7 POP POP SWAP2 SWAP4 SWAP6 POP SWAP2 SWAP4 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3406 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO ISZERO PUSH2 0x34A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x34F6 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x34D1 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x356C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP3 POP DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F DUP5 PUSH1 0x2 ADD DUP7 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP6 DUP2 DUP2 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x3677 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x364C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3677 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x365A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x36B1 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x3696 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x36DE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x374E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x372C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x374E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x373A JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP5 PUSH1 0x2 DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT ISZERO ISZERO PUSH2 0x37BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP4 SUB SWAP3 POP PUSH2 0x3798 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP4 DUP4 PUSH1 0x2 ADD SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x3846 SWAP3 SWAP2 SWAP1 PUSH2 0x3BAF JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x38A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x3920 JUMPI DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x394A JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3949 SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x3975 JUMPI POP PUSH2 0x3994 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3993 SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x39BD JUMPI POP PUSH2 0x39DC JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x39DB SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST JUMPDEST POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3A20 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3A4E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3A4E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3A4D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3A32 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3A5B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3AF0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3B1E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3B1E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3B1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3B02 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3B2B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3B70 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3B9E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3B9E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3B9D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3B82 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3BAB SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x3BF0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x3C1E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x3C1E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x3C1D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x3C02 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x3C2B SWAP2 SWAP1 PUSH2 0x3C2F JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x3C51 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x3C4D JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x3C35 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd8 0x4e XOR 0xf5 0xe2 LOG4 0x22 JUMPDEST DUP7 PUSH28 0x811A1B72127ED7AD24CF5341436B1F500232EAC44BC8002900000000 ",
+ "sourceMap": "886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3940:650;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3940:650:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7067:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7067:114:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6781:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6781:122:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6273:295;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6273:295:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7345:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:20:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;223:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2960:852:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4738:370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4738:370:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1656:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1803:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1803:31:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8052:392;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9117:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9117:131:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;9117:131:1;;;;;;;;;;;;;;;;;5820:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5820:288:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8607:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5262:396;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5262:396:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;396:140:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;396:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3940:650:1;4230:27;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;4043:6:1;2102:1;2070:34;;:6;:14;2077:6;2070:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;;2062:43;;;;;;;;4099:6;4073:32;;:14;4088:6;4073:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;4065:41;;;;;;;;4142:14;4181:1;4157:14;:21;;;;:25;4142:41;;;;;;;;;;;;;;;;;;;;;;;;;;;4117:14;4132:6;4117:22;;;;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;4218:1;4193:14;:26;;;;;;;;;;;;;;:::i;:::-;;4260:6;:14;4267:6;4260:14;;;;;;;;;;;;;;;4230:44;;4312:5;:11;;;;;;;;;;;;4284:184;;;4337:5;:10;;4361:5;:12;;4387:5;:14;;;;;;;;;;;;4415:5;:14;;4443:5;:15;;4284:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4485:13;4499:5;:12;;4485:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:34;;;;;;;;;;;4529:11;4541:5;:10;;4529:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4522:30;;;;;;;;;;;4569:6;:14;4576:6;4569:14;;;;;;;;;;;;;;;;4562:21;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;382:1:0;3940:650:1;;;:::o;7067:114::-;7130:7;7156:11;7168:5;7156:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;7156:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7149:25;;7067:114;;;:::o;6781:122::-;6848:7;6874:13;6888:7;6874:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;6874:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6867:29;;6781:122;;;:::o;6273:295::-;6409:27;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;6387:6:1;2102:1;2070:34;;:6;:14;2077:6;2070:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;;2062:43;;;;;;;;6439:6;:14;6446:6;6439:14;;;;;;;;;;;;;;;6409:44;;6487:6;6463:60;;;6495:5;:15;;6512:10;6463:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6463:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6551:10;6533:5;:15;;:28;;;;;;;;;;;;:::i;:::-;;382:1:0;6273:295:1;;;:::o;7345:550::-;7449:7;7486:6;7515;7546:5;7579;7612;7658:26;;:::i;:::-;7687:6;:14;7694:6;7687:14;;;;;;;;;;;;;;;7658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7732:5;:11;;;7757:5;:10;;;7781:5;:12;;;7807:5;:14;;;7835:5;:14;;;7863:5;:15;;;7711:177;;;;;;;;;;;;;;;;;;;;;;;;7345:550;;;;;;;;:::o;223:20:0:-;;;;;;;;;;;;;:::o;2960:852:1:-;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;3184:6:1;2222:1;2190:34;;:6;:14;2197:6;2190:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;2182:43;;;;;;;;3215:6;2567:1;2547:22;;:8;:22;;;;2539:31;;;;;;;;3250:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2426:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;2418:45;;;;;;;;3284:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2307:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;2299:41;;;;;;;;3322:207;;;;;;;;;3357:6;3322:207;;;;;;3383:5;3322:207;;;;3410:7;3322:207;;;;3441:9;3322:207;;;;;;3474:9;3322:207;;;;3508:10;3322:207;;;3305:6;:14;3312:6;3305:14;;;;;;;;;;;;;;;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;3539:14;3559:6;3539:27;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;3539:27:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3601:6;3576:13;3590:7;3576:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3576:22:1;;;;;;;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;3638:6;3617:11;3629:5;3617:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3617:18:1;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;3679:6;3654:151;;;3699:5;3718:7;3739:9;3762;3785:10;3654:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:1;2580;2235;382::0;2960:852:1;;;;;;:::o;4738:370::-;4897:27;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;4843:6:1;2102:1;2070:34;;:6;:14;2077:6;2070:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;;2062:43;;;;;;;;4876:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2307:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;2299:41;;;;;;;;4927:6;:14;4934:6;4927:14;;;;;;;;;;;;;;;4897:44;;4970:6;4951:45;;;4978:5;:10;;4990:5;4951:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4951:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5013:11;5025:5;:10;;5013:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5006:30;;;;;;;;;;;5067:6;5046:11;5058:5;5046:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5046:18:1;;;;;;;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;5096:5;5083;:10;;:18;;;;;;;;;;;;:::i;:::-;;2115:1;382::0;4738:370:1;;;:::o;1656:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1803:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8052:392::-;8152:7;8189:6;8218;8249:5;8282;8315;8361:14;8378:11;8390:5;8378:18;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8378:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8361:35;;8413:24;8430:6;8413:16;:24::i;:::-;8406:31;;;;;;;;;;;;8052:392;;;;;;;;:::o;9117:131::-;9195:9;9227:14;9220:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9117:131;:::o;5820:288::-;5954:27;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;5932:6:1;2102:1;2070:34;;:6;:14;2077:6;2070:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;;2062:43;;;;;;;;5984:6;:14;5991:6;5984:14;;;;;;;;;;;;;;;5954:44;;6031:6;6008:57;;;6039:5;:14;;6055:9;6008:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;6008:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6092:9;6075:5;:14;;:26;;;;;;;;;;;;:::i;:::-;;382:1:0;5820:288:1;;;:::o;8607:400::-;8711:7;8748:6;8777;8808:5;8841;8874;8920:14;8937:13;8951:7;8937:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8937:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8920:39;;8976:24;8993:6;8976:16;:24::i;:::-;8969:31;;;;;;;;;;;;8607:400;;;;;;;;:::o;5262:396::-;5429:27;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;5371:6:1;2102:1;2070:34;;:6;:14;2077:6;2070:14;;;;;;;;;;;;;;;:20;;;;;;;;;;;;:34;;;;2062:43;;;;;;;;5406:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2426:22:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;2418:45;;;;;;;;5459:6;:14;5466:6;5459:14;;;;;;;;;;;;;;;5429:44;;5504:6;5483:51;;;5512:5;:12;;5526:7;5483:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5483:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5551:13;5565:5;:12;;5551:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5544:34;;;;;;;;;;;5613:6;5588:13;5602:7;5588:22;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5588:22:1;;;;;;;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;5644:7;5629:5;:12;;:22;;;;;;;;;;;;:::i;:::-;;2115:1;382::0;5262:396:1;;;:::o;396:140:0:-;366:5;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;485:1;465:22;;:8;:22;;;;461:69;;;511:8;503:5;;:16;;;;;;;;;;;;;;;;;;461:69;396:140;:::o;886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "previous/Ownable/Ownable_v1.sol": {
+ "id": 0
+ },
+ "previous/TokenRegistry/TokenRegistry.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "previous/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "previous/TokenRegistry/TokenRegistry.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 solidity ^0.4.11;\n\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenRegistry is Ownable {\n\n event LogAddToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogRemoveToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogTokenNameChange(address indexed token, string oldName, string newName);\n event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);\n event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);\n event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);\n\n mapping (address => TokenMetadata) public tokens;\n mapping (string => address) tokenBySymbol;\n mapping (string => address) tokenByName;\n\n address[] public tokenAddresses;\n\n struct TokenMetadata {\n address token;\n string name;\n string symbol;\n uint8 decimals;\n bytes ipfsHash;\n bytes swarmHash;\n }\n\n modifier tokenExists(address _token) {\n require(tokens[_token].token != address(0));\n _;\n }\n\n modifier tokenDoesNotExist(address _token) {\n require(tokens[_token].token == address(0));\n _;\n }\n\n modifier nameDoesNotExist(string _name) {\n require(tokenByName[_name] == address(0));\n _;\n }\n\n modifier symbolDoesNotExist(string _symbol) {\n require(tokenBySymbol[_symbol] == address(0));\n _;\n }\n\n modifier addressNotNull(address _address) {\n require(_address != address(0));\n _;\n }\n\n\n /// @dev Allows owner to add a new token to the registry.\n /// @param _token Address of new token.\n /// @param _name Name of new token.\n /// @param _symbol Symbol for new token.\n /// @param _decimals Number of decimals, divisibility of new token.\n /// @param _ipfsHash IPFS hash of token icon.\n /// @param _swarmHash Swarm hash of token icon.\n function addToken(\n address _token,\n string _name,\n string _symbol,\n uint8 _decimals,\n bytes _ipfsHash,\n bytes _swarmHash)\n public\n onlyOwner\n tokenDoesNotExist(_token)\n addressNotNull(_token)\n symbolDoesNotExist(_symbol)\n nameDoesNotExist(_name)\n {\n tokens[_token] = TokenMetadata({\n token: _token,\n name: _name,\n symbol: _symbol,\n decimals: _decimals,\n ipfsHash: _ipfsHash,\n swarmHash: _swarmHash\n });\n tokenAddresses.push(_token);\n tokenBySymbol[_symbol] = _token;\n tokenByName[_name] = _token;\n LogAddToken(\n _token,\n _name,\n _symbol,\n _decimals,\n _ipfsHash,\n _swarmHash\n );\n }\n\n /// @dev Allows owner to remove an existing token from the registry.\n /// @param _token Address of existing token.\n function removeToken(address _token, uint _index)\n public\n onlyOwner\n tokenExists(_token)\n {\n require(tokenAddresses[_index] == _token);\n\n tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];\n tokenAddresses.length -= 1;\n\n TokenMetadata storage token = tokens[_token];\n LogRemoveToken(\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n delete tokenBySymbol[token.symbol];\n delete tokenByName[token.name];\n delete tokens[_token];\n }\n\n /// @dev Allows owner to modify an existing token's name.\n /// @param _token Address of existing token.\n /// @param _name New name.\n function setTokenName(address _token, string _name)\n public\n onlyOwner\n tokenExists(_token)\n nameDoesNotExist(_name)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenNameChange(_token, token.name, _name);\n delete tokenByName[token.name];\n tokenByName[_name] = _token;\n token.name = _name;\n }\n\n /// @dev Allows owner to modify an existing token's symbol.\n /// @param _token Address of existing token.\n /// @param _symbol New symbol.\n function setTokenSymbol(address _token, string _symbol)\n public\n onlyOwner\n tokenExists(_token)\n symbolDoesNotExist(_symbol)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSymbolChange(_token, token.symbol, _symbol);\n delete tokenBySymbol[token.symbol];\n tokenBySymbol[_symbol] = _token;\n token.symbol = _symbol;\n }\n\n /// @dev Allows owner to modify an existing token's IPFS hash.\n /// @param _token Address of existing token.\n /// @param _ipfsHash New IPFS hash.\n function setTokenIpfsHash(address _token, bytes _ipfsHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);\n token.ipfsHash = _ipfsHash;\n }\n\n /// @dev Allows owner to modify an existing token's Swarm hash.\n /// @param _token Address of existing token.\n /// @param _swarmHash New Swarm hash.\n function setTokenSwarmHash(address _token, bytes _swarmHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);\n token.swarmHash = _swarmHash;\n }\n\n /*\n * Web3 call functions\n */\n\n /// @dev Provides a registered token's address when given the token symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token's address.\n function getTokenAddressBySymbol(string _symbol) constant returns (address) {\n return tokenBySymbol[_symbol];\n }\n\n /// @dev Provides a registered token's address when given the token name.\n /// @param _name Name of registered token.\n /// @return Token's address.\n function getTokenAddressByName(string _name) constant returns (address) {\n return tokenByName[_name];\n }\n\n /// @dev Provides a registered token's metadata, looked up by address.\n /// @param _token Address of registered token.\n /// @return Token metadata.\n function getTokenMetaData(address _token)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n TokenMetadata memory token = tokens[_token];\n return (\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n }\n\n /// @dev Provides a registered token's metadata, looked up by name.\n /// @param _name Name of registered token.\n /// @return Token metadata.\n function getTokenByName(string _name)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenByName[_name];\n return getTokenMetaData(_token);\n }\n\n /// @dev Provides a registered token's metadata, looked up by symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token metadata.\n function getTokenBySymbol(string _symbol)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenBySymbol[_symbol];\n return getTokenMetaData(_token);\n }\n\n /// @dev Returns an array containing all token addresses.\n /// @return Array of token addresses.\n function getTokenAddresses()\n public\n constant\n returns (address[])\n {\n return tokenAddresses;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x63a45b019e6836d66dc6b82f872f30b7cb9375dca2fd0b2e5975a1ceb586a40f",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/TokenTransferProxy_v1.json b/packages/migrations/artifacts/1.0.0/TokenTransferProxy_v1.json
new file mode 100644
index 000000000..4cea4801a
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/TokenTransferProxy_v1.json
@@ -0,0 +1,236 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TokenTransferProxy_v1",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "LogAuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "LogAuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610bdc806100536000396000f30060806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806315dacbea1461009357806342f1181e14610138578063494503d41461017b57806370712939146101e85780638da5cb5b1461022b578063b918161114610282578063d39de6e9146102dd578063f2fde38b14610349575b600080fd5b34801561009f57600080fd5b5061011e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061038c565b604051808215151515815260200191505060405180910390f35b34801561014457600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610502565b005b34801561018757600080fd5b506101a6600480360381019080803590602001909291905050506106d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f457600080fd5b50610229600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610710565b005b34801561023757600080fd5b506102406109b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561028e57600080fd5b506102c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109dc565b604051808215151515815260200191505060405180910390f35b3480156102e957600080fd5b506102f26109fc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561033557808201518184015260208101905061031a565b505050509050019250505060405180910390f35b34801561035557600080fd5b5061038a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a8a565b005b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156103e657600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156104bd57600080fd5b505af11580156104d1573d6000803e3d6000fd5b505050506040513d60208110156104e757600080fd5b81019080805190602001909291905050509050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561055d57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156105b757600080fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060028290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f94bb87f4c15c4587ff559a7584006fa01ddf9299359be6b512b94527aa961aca60405160405180910390a35050565b6002818154811015156106e157fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561076d57600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156107c657600080fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600091505b600280549050821015610958578273ffffffffffffffffffffffffffffffffffffffff1660028381548110151561084d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561094b5760026001600280549050038154811015156108ab57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002838154811015156108e557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016002818180549050039150816109459190610b5f565b50610958565b818060010192505061081a565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff5b347a1e40749dd050f5f07fbdbeb7e3efa9756903044dd29401fd1d4bb4a1c60405160405180910390a3505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610a8057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a36575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ae557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610b5c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b815481835581811115610b8657818360005260206000209182019101610b859190610b8b565b5b505050565b610bad91905b80821115610ba9576000816000905550600101610b91565b5090565b905600a165627a7a7230582023b41e8c3699cfeed714357f50f8f8caed14f2a0ac409b12b137198d0895e0dc0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0xBDC DUP1 PUSH2 0x53 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8E JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x15DACBEA EQ PUSH2 0x93 JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x349 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x38C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x179 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x502 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x229 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x710 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x240 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2C3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9DC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F2 PUSH2 0x9FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x335 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x31A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x38A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA8A JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4D1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x55D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x2 DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x94BB87F4C15C4587FF559A7584006FA01DDF9299359BE6B512B94527AA961ACA PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x2 DUP1 SLOAD SWAP1 POP DUP3 LT ISZERO PUSH2 0x958 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x94B JUMPI PUSH1 0x2 PUSH1 0x1 PUSH1 0x2 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8AB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8E5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x945 SWAP2 SWAP1 PUSH2 0xB5F JUMP JUMPDEST POP PUSH2 0x958 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0x81A JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF5B347A1E40749DD050F5F07FBDBEB7E3EFA9756903044DD29401FD1D4BB4A1C PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xA80 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0xA36 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xAE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xB5C JUMPI DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xB86 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB85 SWAP2 SWAP1 PUSH2 0xB8B JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xBAD SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xBA9 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xB91 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x23 0xb4 0x1e DUP13 CALLDATASIZE SWAP10 0xcf 0xee 0xd7 EQ CALLDATALOAD PUSH32 0x50F8F8CAED14F2A0AC409B12B137198D0895E0DC002900000000000000000000 ",
+ "sourceMap": "944:2478:2:-;;;290:10:0;282:5;;:18;;;;;;;;;;;;;;;;;;944:2478:2;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806315dacbea1461009357806342f1181e14610138578063494503d41461017b57806370712939146101e85780638da5cb5b1461022b578063b918161114610282578063d39de6e9146102dd578063f2fde38b14610349575b600080fd5b34801561009f57600080fd5b5061011e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061038c565b604051808215151515815260200191505060405180910390f35b34801561014457600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610502565b005b34801561018757600080fd5b506101a6600480360381019080803590602001909291905050506106d2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f457600080fd5b50610229600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610710565b005b34801561023757600080fd5b506102406109b7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561028e57600080fd5b506102c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109dc565b604051808215151515815260200191505060405180910390f35b3480156102e957600080fd5b506102f26109fc565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561033557808201518184015260208101905061031a565b505050509050019250505060405180910390f35b34801561035557600080fd5b5061038a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a8a565b005b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156103e657600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166323b872dd8585856040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156104bd57600080fd5b505af11580156104d1573d6000803e3d6000fd5b505050506040513d60208110156104e757600080fd5b81019080805190602001909291905050509050949350505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561055d57600080fd5b80600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515156105b757600080fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060028290806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f94bb87f4c15c4587ff559a7584006fa01ddf9299359be6b512b94527aa961aca60405160405180910390a35050565b6002818154811015156106e157fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561076d57600080fd5b81600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156107c657600080fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff0219169055600091505b600280549050821015610958578273ffffffffffffffffffffffffffffffffffffffff1660028381548110151561084d57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561094b5760026001600280549050038154811015156108ab57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166002838154811015156108e557fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060016002818180549050039150816109459190610b5f565b50610958565b818060010192505061081a565b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff5b347a1e40749dd050f5f07fbdbeb7e3efa9756903044dd29401fd1d4bb4a1c60405160405180910390a3505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610a8057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a36575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ae557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610b5c57806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b815481835581811115610b8657818360005260206000209182019101610b859190610b8b565b5b505050565b610bad91905b80821115610ba9576000816000905550600101610b91565b5090565b905600a165627a7a7230582023b41e8c3699cfeed714357f50f8f8caed14f2a0ac409b12b137198d0895e0dc0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8E JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x15DACBEA EQ PUSH2 0x93 JUMPI DUP1 PUSH4 0x42F1181E EQ PUSH2 0x138 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x282 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x2DD JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x349 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11E PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x38C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x179 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x502 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6D2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x229 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x710 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x237 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x240 PUSH2 0x9B7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x28E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2C3 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x9DC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F2 PUSH2 0x9FC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x335 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x31A JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x355 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x38A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA8A JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x3E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x23B872DD DUP6 DUP6 DUP6 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x4BD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x4D1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4E7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x55D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO ISZERO PUSH2 0x5B7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 DUP1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP PUSH1 0x2 DUP3 SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP SWAP1 PUSH1 0x1 DUP3 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SWAP2 SWAP3 SWAP1 SWAP2 SWAP1 SWAP2 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x94BB87F4C15C4587FF559A7584006FA01DDF9299359BE6B512B94527AA961ACA PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x2 DUP2 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6E1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x76D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0x0 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH1 0xFF MUL NOT AND SWAP1 SSTORE PUSH1 0x0 SWAP2 POP JUMPDEST PUSH1 0x2 DUP1 SLOAD SWAP1 POP DUP3 LT ISZERO PUSH2 0x958 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x84D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x94B JUMPI PUSH1 0x2 PUSH1 0x1 PUSH1 0x2 DUP1 SLOAD SWAP1 POP SUB DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8AB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8E5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x2 DUP2 DUP2 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP DUP2 PUSH2 0x945 SWAP2 SWAP1 PUSH2 0xB5F JUMP JUMPDEST POP PUSH2 0x958 JUMP JUMPDEST DUP2 DUP1 PUSH1 0x1 ADD SWAP3 POP POP PUSH2 0x81A JUMP JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xF5B347A1E40749DD050F5F07FBDBEB7E3EFA9756903044DD29401FD1D4BB4A1C PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xA80 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0xA36 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xAE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0xB5C JUMPI DUP1 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xB86 JUMPI DUP2 DUP4 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xB85 SWAP2 SWAP1 PUSH2 0xB8B JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xBAD SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xBA9 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xB91 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x23 0xb4 0x1e DUP13 CALLDATASIZE SWAP10 0xcf 0xee 0xd7 EQ CALLDATALOAD PUSH32 0x50F8F8CAED14F2A0AC409B12B137198D0895E0DC002900000000000000000000 ",
+ "sourceMap": "944:2478:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:239;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2902:239:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1749:250;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1749:250:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;1421:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1421:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2113:476;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2113:476:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:20:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;223:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:43:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1372:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3287:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3287:133:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3287:133:2;;;;;;;;;;;;;;;;;396:140:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;396:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:239:2;3065:4;1115:10;:22;1126:10;1115:22;;;;;;;;;;;;;;;;;;;;;;;;;1107:31;;;;;;;;3098:5;3092:25;;;3118:4;3124:2;3128:5;3092:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3092:42:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3092:42:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3092:42:2;;;;;;;;;;;;;;;;3085:49;;2902:239;;;;;;:::o;1749:250::-;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;1856:6:2;1329:10;:18;1340:6;1329:18;;;;;;;;;;;;;;;;;;;;;;;;;1328:19;1320:28;;;;;;;;1899:4;1878:10;:18;1889:6;1878:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;1913:11;1930:6;1913:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1913:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1981:10;1947:45;;1973:6;1947:45;;;;;;;;;;;;382:1:0;1749:250:2;:::o;1421:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2113:476::-;2282:6;366:5:0;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;2220:6:2;1222:10;:18;1233:6;1222:18;;;;;;;;;;;;;;;;;;;;;;;;;1214:27;;;;;;;;2249:10;:18;2260:6;2249:18;;;;;;;;;;;;;;;;2242:25;;;;;;;;;;;2291:1;2282:10;;2277:249;2298:11;:18;;;;2294:1;:22;2277:249;;;2359:6;2341:24;;:11;2353:1;2341:14;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;2337:179;;;2402:11;2435:1;2414:11;:18;;;;:22;2402:35;;;;;;;;;;;;;;;;;;;;;;;;;;;2385:11;2397:1;2385:14;;;;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;2477:1;2455:11;:23;;;;;;;;;;;;;;:::i;:::-;;2496:5;;2337:179;2318:3;;;;;;;2277:249;;;2571:10;2535:47;;2563:6;2535:47;;;;;;;;;;;;382:1:0;2113:476:2;;:::o;223:20:0:-;;;;;;;;;;;;;:::o;1372:43:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;3287:133::-;3370:9;3402:11;3395:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3287:133;:::o;396:140:0:-;366:5;;;;;;;;;;;352:19;;:10;:19;;;344:28;;;;;;;;485:1;465:22;;:8;:22;;;;461:69;;;511:8;503:5;;:16;;;;;;;;;;;;;;;;;;461:69;396:140;:::o;944:2478:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "previous/Ownable/Ownable_v1.sol": {
+ "id": 0
+ },
+ "previous/Token/Token_v1.sol": {
+ "id": 1
+ },
+ "previous/TokenTransferProxy/TokenTransferProxy_v1.sol": {
+ "id": 2
+ }
+ },
+ "sourceCodes": {
+ "previous/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "previous/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "previous/TokenTransferProxy/TokenTransferProxy_v1.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 solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenTransferProxy_v1 is Ownable {\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(authorized[msg.sender]);\n _;\n }\n\n modifier targetAuthorized(address target) {\n require(authorized[target]);\n _;\n }\n\n modifier targetNotAuthorized(address target) {\n require(!authorized[target]);\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n event LogAuthorizedAddressAdded(address indexed target, address indexed caller);\n event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);\n\n /*\n * Public functions\n */\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n public\n onlyOwner\n targetNotAuthorized(target)\n {\n authorized[target] = true;\n authorities.push(target);\n LogAuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n public\n onlyOwner\n targetAuthorized(target)\n {\n delete authorized[target];\n for (uint i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n LogAuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Calls into ERC20 Token contract, invoking transferFrom.\n /// @param token Address of token to transfer.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param value Amount of token to transfer.\n /// @return Success of transfer.\n function transferFrom(\n address token,\n address from,\n address to,\n uint value)\n public\n onlyAuthorized\n returns (bool)\n {\n return Token(token).transferFrom(from, to, value);\n }\n\n /*\n * Public constant functions\n */\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n public\n constant\n returns (address[])\n {\n return authorities;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xfd74ea4e3996cd1614eabbb4e39605e9ba33e07f4a259c7a25fcf7b78f0930ed",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/WETH9.json b/packages/migrations/artifacts/1.0.0/WETH9.json
new file mode 100644
index 000000000..493fae7e5
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/WETH9.json
@@ -0,0 +1,332 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "WETH9",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "guy",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdraw",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [],
+ "name": "deposit",
+ "outputs": [],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "guy",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawal",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526040805190810160405280600d81526020017f57726170706564204574686572000000000000000000000000000000000000008152506000908051906020019061004f9291906100ca565b506040805190810160405280600481526020017f57455448000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100ca565b506012600260006101000a81548160ff021916908360ff1602179055503480156100c457600080fd5b5061016f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010b57805160ff1916838001178555610139565b82800160010185558215610139579182015b8281111561013857825182559160200191906001019061011d565b5b509050610146919061014a565b5090565b61016c91905b80821115610168576000816000905550600101610150565b5090565b90565b610c848061017e6000396000f3006080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014957806318160ddd146101ae57806323b872dd146101d95780632e1a7d4d1461025e578063313ce5671461028b57806370a08231146102bc57806395d89b4114610313578063a9059cbb146103a3578063d0e30db014610408578063dd62ed3e14610412575b6100b7610489565b005b3480156100c557600080fd5b506100ce610526565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010e5780820151818401526020810190506100f3565b50505050905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015557600080fd5b50610194600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105c4565b604051808215151515815260200191505060405180910390f35b3480156101ba57600080fd5b506101c36106b6565b6040518082815260200191505060405180910390f35b3480156101e557600080fd5b50610244600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106d5565b604051808215151515815260200191505060405180910390f35b34801561026a57600080fd5b5061028960048036038101908080359060200190929190505050610a22565b005b34801561029757600080fd5b506102a0610b55565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102c857600080fd5b506102fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b68565b6040518082815260200191505060405180910390f35b34801561031f57600080fd5b50610328610b80565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036857808201518184015260208101905061034d565b50505050905090810190601f1680156103955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103af57600080fd5b506103ee600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c1e565b604051808215151515815260200191505060405180910390f35b610410610489565b005b34801561041e57600080fd5b50610473600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c33565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561072557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107fd57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156109185781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561088d57600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a7057600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b03573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081565b6000610c2b3384846106d5565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820f807d6d272ac434b0d6824e59082e62805442ec433029fe320e7d691f701e0e70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5772617070656420457468657200000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x0 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x4F SWAP3 SWAP2 SWAP1 PUSH2 0xCA JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5745544800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x9B SWAP3 SWAP2 SWAP1 PUSH2 0xCA JUMP JUMPDEST POP PUSH1 0x12 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xFF AND MUL OR SWAP1 SSTORE POP CALLVALUE DUP1 ISZERO PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x16F JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x10B JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x139 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x139 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x138 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x11D JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x146 SWAP2 SWAP1 PUSH2 0x14A JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x16C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x168 JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xC84 DUP1 PUSH2 0x17E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAF JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x149 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2BC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x313 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x3A3 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x408 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x412 JUMPI JUMPDEST PUSH2 0xB7 PUSH2 0x489 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCE PUSH2 0x526 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xF3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x194 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5C4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C3 PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x244 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6D5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x289 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA22 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A0 PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x328 PUSH2 0xB80 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x368 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x395 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3EE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x410 PUSH2 0x489 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x473 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC33 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x5BC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x591 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5BC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x59F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND BALANCE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x7FD JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO JUMPDEST ISZERO PUSH2 0x918 JUMPI DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0x88D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP2 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0xA70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xB03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xC16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC2B CALLER DUP5 DUP5 PUSH2 0x6D5 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xf8 SMOD 0xd6 0xd2 PUSH19 0xAC434B0D6824E59082E62805442EC433029FE3 KECCAK256 0xe7 0xd6 SWAP2 0xf7 ADD 0xe0 0xe7 STOP 0x29 ",
+ "sourceMap": "712:1778:0:-;;;733:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;779:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;841:2;816:27;;;;;;;;;;;;;;;;;;;;712:1778;8:9:-1;5:2;;;30:1;27;20:12;5:2;712:1778:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014957806318160ddd146101ae57806323b872dd146101d95780632e1a7d4d1461025e578063313ce5671461028b57806370a08231146102bc57806395d89b4114610313578063a9059cbb146103a3578063d0e30db014610408578063dd62ed3e14610412575b6100b7610489565b005b3480156100c557600080fd5b506100ce610526565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010e5780820151818401526020810190506100f3565b50505050905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015557600080fd5b50610194600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506105c4565b604051808215151515815260200191505060405180910390f35b3480156101ba57600080fd5b506101c36106b6565b6040518082815260200191505060405180910390f35b3480156101e557600080fd5b50610244600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106d5565b604051808215151515815260200191505060405180910390f35b34801561026a57600080fd5b5061028960048036038101908080359060200190929190505050610a22565b005b34801561029757600080fd5b506102a0610b55565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102c857600080fd5b506102fd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b68565b6040518082815260200191505060405180910390f35b34801561031f57600080fd5b50610328610b80565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036857808201518184015260208101905061034d565b50505050905090810190601f1680156103955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103af57600080fd5b506103ee600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c1e565b604051808215151515815260200191505060405180910390f35b610410610489565b005b34801561041e57600080fd5b50610473600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c33565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105bc5780601f10610591576101008083540402835291602001916105bc565b820191906000526020600020905b81548152906001019060200180831161059f57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561072557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107fd57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156109185781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561088d57600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a7057600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b03573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c165780601f10610beb57610100808354040283529160200191610c16565b820191906000526020600020905b815481529060010190602001808311610bf957829003601f168201915b505050505081565b6000610c2b3384846106d5565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820f807d6d272ac434b0d6824e59082e62805442ec433029fe320e7d691f701e0e70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAF JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0xB9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x149 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1D9 JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x25E JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x28B JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2BC JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x313 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x3A3 JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0x408 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x412 JUMPI JUMPDEST PUSH2 0xB7 PUSH2 0x489 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCE PUSH2 0x526 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10E JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xF3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13B JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x194 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5C4 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C3 PUSH2 0x6B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x244 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6D5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x26A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x289 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xA22 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x297 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A0 PUSH2 0xB55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FD PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x328 PUSH2 0xB80 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x368 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x34D JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x395 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3EE PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC1E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x410 PUSH2 0x489 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x41E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x473 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC33 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C CALLVALUE PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x5BC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x591 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x5BC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x59F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND BALANCE SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0x725 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 ISZERO PUSH2 0x7FD JUMPI POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD EQ ISZERO JUMPDEST ISZERO PUSH2 0x918 JUMPI DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0x88D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH1 0x4 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP2 PUSH1 0x3 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x3 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO ISZERO ISZERO PUSH2 0xA70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH1 0x3 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xB03 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xC16 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBEB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC16 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBF9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xC2B CALLER DUP5 DUP5 PUSH2 0x6D5 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE DUP2 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP2 POP POP SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xf8 SMOD 0xd6 0xd2 PUSH19 0xAC434B0D6824E59082E62805442EC433029FE3 KECCAK256 0xe7 0xd6 SWAP2 0xf7 ADD 0xe0 0xe7 STOP 0x29 ",
+ "sourceMap": "712:1778:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1281:9;:7;:9::i;:::-;712:1778;733:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;733:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;733:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1728:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1728:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1636:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1636:86:0;;;;;;;;;;;;;;;;;;;;;;;2033:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2033:455:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1432:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1432:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;816:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;816:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1102:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1102:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;779:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;779:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;779:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1906:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1906:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1302:125;;;;;;1173:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1173:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1302:125;1371:9;1346;:21;1356:10;1346:21;;;;;;;;;;;;;;;;:34;;;;;;;;;;;1398:10;1390:30;;;1410:9;1390:30;;;;;;;;;;;;;;;;;;1302:125::o;733:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1728:172::-;1784:4;1829:3;1800:9;:21;1810:10;1800:21;;;;;;;;;;;;;;;:26;1822:3;1800:26;;;;;;;;;;;;;;;:32;;;;1863:3;1842:30;;1851:10;1842:30;;;1868:3;1842:30;;;;;;;;;;;;;;;;;;1889:4;1882:11;;1728:172;;;;:::o;1636:86::-;1680:4;1703;:12;;;1696:19;;1636:86;:::o;2033:455::-;2123:4;2169:3;2151:9;:14;2161:3;2151:14;;;;;;;;;;;;;;;;:21;;2143:30;;;;;;;;2195:10;2188:17;;:3;:17;;;;:59;;;;;2244:2;2209:9;:14;2219:3;2209:14;;;;;;;;;;;;;;;:26;2224:10;2209:26;;;;;;;;;;;;;;;;:38;;2188:59;2184:179;;;2301:3;2271:9;:14;2281:3;2271:14;;;;;;;;;;;;;;;:26;2286:10;2271:26;;;;;;;;;;;;;;;;:33;;2263:42;;;;;;;;2349:3;2319:9;:14;2329:3;2319:14;;;;;;;;;;;;;;;:26;2334:10;2319:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;2184:179;2391:3;2373:9;:14;2383:3;2373:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;2422:3;2404:9;:14;2414:3;2404:14;;;;;;;;;;;;;;;;:21;;;;;;;;;;;2450:3;2436:23;;2445:3;2436:23;;;2455:3;2436:23;;;;;;;;;;;;;;;;;;2477:4;2470:11;;2033:455;;;;;:::o;1432:198::-;1510:3;1485:9;:21;1495:10;1485:21;;;;;;;;;;;;;;;;:28;;1477:37;;;;;;;;1549:3;1524:9;:21;1534:10;1524:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;1562:10;:19;;:24;1582:3;1562:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1562:24:0;1607:10;1596:27;;;1619:3;1596:27;;;;;;;;;;;;;;;;;;1432:198;:::o;816:27::-;;;;;;;;;;;;;:::o;1102:65::-;;;;;;;;;;;;;;;;;:::o;779:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1906:121::-;1963:4;1986:34;1999:10;2011:3;2016;1986:12;:34::i;:::-;1979:41;;1906:121;;;;:::o;1173:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "current/tokens/WETH9/WETH9.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "current/tokens/WETH9/WETH9.sol": "// Copyright (C) 2015, 2016, 2017 Dapphub\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\npragma solidity ^0.4.18;\n\ncontract WETH9 {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed src, address indexed guy, uint wad);\n event Transfer(address indexed src, address indexed dst, uint wad);\n event Deposit(address indexed dst, uint wad);\n event Withdrawal(address indexed src, uint wad);\n\n mapping (address => uint) public balanceOf;\n mapping (address => mapping (address => uint)) public allowance;\n\n function() public payable {\n deposit();\n }\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n Deposit(msg.sender, msg.value);\n }\n function withdraw(uint wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n msg.sender.transfer(wad);\n Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint) {\n return this.balance;\n }\n\n function approve(address guy, uint wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint wad)\n public\n returns (bool)\n {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n Transfer(src, dst, wad);\n\n return true;\n }\n}\n\n\n/*\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n Preamble\n\n The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users. We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors. You can apply it to\nyour programs, too.\n\n When we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights. Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received. You must make sure that they, too, receive\nor can get the source code. And you must show them these terms so they\nknow their rights.\n\n Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software. For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so. This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software. The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts. If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary. To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n The precise terms and conditions for copying, distribution and\nmodification follow.\n\n TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n The Corresponding Source for a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n Conveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n 5. Conveying Modified Source Versions.\n\n You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n\n b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n\n c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n\n d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\n A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n\n b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n\n c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n\n d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n\n e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\n A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n 7. Additional Terms.\n\n \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n\n b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n\n d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n\n e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n\n f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors.\n\n All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n You are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n 10. Automatic Licensing of Downstream Recipients.\n\n Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\n An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\n A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n 14. Revised Versions of this License.\n\n The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time. Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n Later license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n END OF TERMS AND CONDITIONS\n\n How to Apply These Terms to Your New Programs\n\n If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n To do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n <one line to give the program's name and a brief idea of what it does.>\n Copyright (C) <year> <name of author>\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n <program> Copyright (C) <year> <name of author>\n This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n This is free software, and you are welcome to redistribute it\n under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License. Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n The GNU General Public License does not permit incorporating your program\ninto proprietary programs. If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library. If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License. But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n*/\n"
+ },
+ "sourceTreeHashHex": "0xce985174db1a24d312c0d544abb926a9b107bd9abd6424288a8e54a16d3e006b",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/1.0.0/ZRXToken.json b/packages/migrations/artifacts/1.0.0/ZRXToken.json
new file mode 100644
index 000000000..089d16845
--- /dev/null
+++ b/packages/migrations/artifacts/1.0.0/ZRXToken.json
@@ -0,0 +1,288 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ZRXToken",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526b033b2e3c9fd0803ce800000060035534801561002057600080fd5b506003546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610baa806100756000396000f300608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461009e578063095ea7b31461012e57806318160ddd1461019357806323b872dd146101be578063313ce5671461024357806370a082311461027457806395d89b41146102cb578063a9059cbb1461035b578063dd62ed3e146103c0575b600080fd5b3480156100aa57600080fd5b506100b3610437565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f35780820151818401526020810190506100d8565b50505050905090810190601f1680156101205780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013a57600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610470565b604051808215151515815260200191505060405180910390f35b34801561019f57600080fd5b506101a8610562565b6040518082815260200191505060405180910390f35b3480156101ca57600080fd5b50610229600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610568565b604051808215151515815260200191505060405180910390f35b34801561024f57600080fd5b5061025861088d565b604051808260ff1660ff16815260200191505060405180910390f35b34801561028057600080fd5b506102b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610892565b6040518082815260200191505060405180910390f35b3480156102d757600080fd5b506102e06108da565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610320578082015181840152602081019050610305565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036757600080fd5b506103a6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610913565b604051808215151515815260200191505060405180910390f35b3480156103cc57600080fd5b50610421600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610af7565b6040518082815260200191505060405180910390f35b6040805190810160405280601181526020017f30782050726f746f636f6c20546f6b656e00000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60035481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156106385750828110155b80156106c257506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110155b1561088057826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108125782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150610885565b600091505b509392505050565b601281565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040805190810160405280600381526020017f5a5258000000000000000000000000000000000000000000000000000000000081525081565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156109e157506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110155b15610aec57816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610af1565b600090505b92915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582089db9c211e5af04f1310094c249a407cffeb6a192146db670149095578ff11390029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH12 0x33B2E3C9FD0803CE8000000 PUSH1 0x3 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x20 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0xBAA DUP1 PUSH2 0x75 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x99 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x12E JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x243 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x274 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x35B JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3C0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB3 PUSH2 0x437 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF3 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xD8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x120 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x179 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x470 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A8 PUSH2 0x562 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x229 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x568 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x258 PUSH2 0x88D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x280 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x892 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x320 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x305 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x913 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x421 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO DUP1 ISZERO PUSH2 0x638 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x6C2 JUMPI POP PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP4 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x880 JUMPI DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x812 JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x885 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO DUP1 ISZERO PUSH2 0x9E1 JUMPI POP PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO JUMPDEST ISZERO PUSH2 0xAEC JUMPI DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP PUSH2 0xAF1 JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP10 0xdb SWAP13 0x21 0x1e GAS CREATE 0x4f SGT LT MULMOD 0x4c 0x24 SWAP11 BLOCKHASH PUSH29 0xFFEB6A192146DB670149095578FF113900290000000000000000000000 ",
+ "sourceMap": "753:342:0:-;;;872:6;846:32;;1022:71;8:9:-1;5:2;;;30:1;27;20:12;5:2;1022:71:0;1075:11;;1052:8;:20;1061:10;1052:20;;;;;;;;;;;;;;;:34;;;;753:342;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde031461009e578063095ea7b31461012e57806318160ddd1461019357806323b872dd146101be578063313ce5671461024357806370a082311461027457806395d89b41146102cb578063a9059cbb1461035b578063dd62ed3e146103c0575b600080fd5b3480156100aa57600080fd5b506100b3610437565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100f35780820151818401526020810190506100d8565b50505050905090810190601f1680156101205780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013a57600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610470565b604051808215151515815260200191505060405180910390f35b34801561019f57600080fd5b506101a8610562565b6040518082815260200191505060405180910390f35b3480156101ca57600080fd5b50610229600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610568565b604051808215151515815260200191505060405180910390f35b34801561024f57600080fd5b5061025861088d565b604051808260ff1660ff16815260200191505060405180910390f35b34801561028057600080fd5b506102b5600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610892565b6040518082815260200191505060405180910390f35b3480156102d757600080fd5b506102e06108da565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610320578082015181840152602081019050610305565b50505050905090810190601f16801561034d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036757600080fd5b506103a6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610913565b604051808215151515815260200191505060405180910390f35b3480156103cc57600080fd5b50610421600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610af7565b6040518082815260200191505060405180910390f35b6040805190810160405280601181526020017f30782050726f746f636f6c20546f6b656e00000000000000000000000000000081525081565b600081600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60035481565b600080600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156106385750828110155b80156106c257506000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110155b1561088057826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156108125782600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a360019150610885565b600091505b509392505050565b601281565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6040805190810160405280600381526020017f5a5258000000000000000000000000000000000000000000000000000000000081525081565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101580156109e157506000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540110155b15610aec57816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540392505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050610af1565b600090505b92915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050929150505600a165627a7a7230582089db9c211e5af04f1310094c249a407cffeb6a192146db670149095578ff11390029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x99 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x12E JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x193 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x243 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x274 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x35B JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x3C0 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB3 PUSH2 0x437 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xF3 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xD8 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x120 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x179 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x470 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x19F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A8 PUSH2 0x562 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x229 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x568 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x24F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x258 PUSH2 0x88D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x280 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B5 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x892 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E0 PUSH2 0x8DA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x320 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x305 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34D JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x367 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A6 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x913 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x421 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xAF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x11 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x1 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO DUP1 ISZERO PUSH2 0x638 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x6C2 JUMPI POP PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP4 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x880 JUMPI DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x0 DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x812 JUMPI DUP3 PUSH1 0x1 PUSH1 0x0 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x885 JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD LT ISZERO DUP1 ISZERO PUSH2 0x9E1 JUMPI POP PUSH1 0x0 DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD DUP3 PUSH1 0x0 DUP1 DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD ADD LT ISZERO JUMPDEST ISZERO PUSH2 0xAEC JUMPI DUP2 PUSH1 0x0 DUP1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD SUB SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP2 PUSH1 0x0 DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP1 POP PUSH2 0xAF1 JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x0 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP10 0xdb SWAP13 0x21 0x1e GAS CREATE 0x4f SGT LT MULMOD 0x4c 0x24 SWAP11 BLOCKHASH PUSH29 0xFFEB6A192146DB670149095578FF113900290000000000000000000000 ",
+ "sourceMap": "753:342:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;923:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;923:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;923:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1087:187:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1087:187:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;846:32:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;846:32:0;;;;;;;;;;;;;;;;;;;;;;;1066:609:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1066:609:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;805:35:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;805:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;982:99:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;982:99:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;978:37:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;978:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;978:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125:410:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;125:410:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1280:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1280:126:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;923:49:0;;;;;;;;;;;;;;;;;;;;:::o;1087:187:1:-;1144:4;1192:6;1160:7;:19;1168:10;1160:19;;;;;;;;;;;;;;;:29;1180:8;1160:29;;;;;;;;;;;;;;;:38;;;;1229:8;1208:38;;1217:10;1208:38;;;1239:6;1208:38;;;;;;;;;;;;;;;;;;1263:4;1256:11;;1087:187;;;;:::o;846:32:0:-;;;;:::o;1066:609:3:-;1161:4;1181:14;1198:7;:14;1206:5;1198:14;;;;;;;;;;;;;;;:26;1213:10;1198:26;;;;;;;;;;;;;;;;1181:43;;1257:6;1238:8;:15;1247:5;1238:15;;;;;;;;;;;;;;;;:25;;:60;;;;;1292:6;1279:9;:19;;1238:60;:115;;;;;1340:8;:13;1349:3;1340:13;;;;;;;;;;;;;;;;1330:6;1314:8;:13;1323:3;1314:13;;;;;;;;;;;;;;;;:22;:39;;1238:115;1234:435;;;1395:6;1378:8;:13;1387:3;1378:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;1434:6;1415:8;:15;1424:5;1415:15;;;;;;;;;;;;;;;;:25;;;;;;;;;;;768:10;1458:9;:20;1454:95;;;1528:6;1498:7;:14;1506:5;1498:14;;;;;;;;;;;;;;;:26;1513:10;1498:26;;;;;;;;;;;;;;;;:36;;;;;;;;;;;1454:95;1578:3;1562:28;;1571:5;1562:28;;;1583:6;1562:28;;;;;;;;;;;;;;;;;;1611:4;1604:11;;;;1234:435;1653:5;1646:12;;1066:609;;;;;;;:::o;805:35:0:-;838:2;805:35;:::o;982:99:1:-;1035:4;1058:8;:16;1067:6;1058:16;;;;;;;;;;;;;;;;1051:23;;982:99;;;:::o;978:37:0:-;;;;;;;;;;;;;;;;;;;;:::o;125:410:1:-;178:4;291:6;267:8;:20;276:10;267:20;;;;;;;;;;;;;;;;:30;;:73;;;;;327:8;:13;336:3;327:13;;;;;;;;;;;;;;;;317:6;301:8;:13;310:3;301:13;;;;;;;;;;;;;;;;:22;:39;;267:73;263:266;;;380:6;356:8;:20;365:10;356:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;417:6;400:8;:13;409:3;400:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;458:3;437:33;;446:10;437:33;;;463:6;437:33;;;;;;;;;;;;;;;;;;491:4;484:11;;;;263:266;521:5;514:12;;125:410;;;;;:::o;1280:126::-;1351:4;1374:7;:15;1382:6;1374:15;;;;;;;;;;;;;;;:25;1390:8;1374:25;;;;;;;;;;;;;;;;1367:32;;1280:126;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "current/tokens/ZRXToken/ZRXToken.sol": {
+ "id": 0
+ },
+ "previous/ERC20Token/ERC20Token_v1.sol": {
+ "id": 1
+ },
+ "previous/Token/Token_v1.sol": {
+ "id": 2
+ },
+ "previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol": {
+ "id": 3
+ }
+ },
+ "sourceCodes": {
+ "current/tokens/ZRXToken/ZRXToken.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 solidity ^0.4.11;\n\nimport { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from \"../../../previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\";\n\ncontract ZRXToken is UnlimitedAllowanceToken {\n\n uint8 constant public decimals = 18;\n uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places\n string constant public name = \"0x Protocol Token\";\n string constant public symbol = \"ZRX\";\n\n function ZRXToken() {\n balances[msg.sender] = totalSupply;\n }\n}\n",
+ "previous/ERC20Token/ERC20Token_v1.sol": "pragma solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\n\ncontract ERC20Token_v1 is Token {\n\n function transfer(address _to, uint _value) returns (bool) {\n //Default assumes totalSupply can't be over max (2^256 - 1).\n if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n Transfer(msg.sender, _to, _value);\n return true;\n } else { return false; }\n }\n\n function transferFrom(address _from, address _to, uint _value) returns (bool) {\n if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n Transfer(_from, _to, _value);\n return true;\n } else { return false; }\n }\n\n function balanceOf(address _owner) constant returns (uint) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint _value) returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) constant returns (uint) {\n return allowed[_owner][_spender];\n }\n\n mapping (address => uint) balances;\n mapping (address => mapping (address => uint)) allowed;\n uint public totalSupply;\n}\n",
+ "previous/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "previous/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.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 solidity ^0.4.11;\n\nimport { ERC20Token_v1 as ERC20Token } from \"../ERC20Token/ERC20Token_v1.sol\";\n\ncontract UnlimitedAllowanceToken_v1 is ERC20Token {\n\n uint constant MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint _value)\n public\n returns (bool)\n {\n uint allowance = allowed[_from][msg.sender];\n if (balances[_from] >= _value\n && allowance >= _value\n && balances[_to] + _value >= balances[_to]\n ) {\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n Transfer(_from, _to, _value);\n return true;\n } else {\n return false;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xbaaa4c45ee7e505106ec3f265920d9be632c2dec05ba8ea8e7e7404805ee62a5",
+ "compiler": {
+ "name": "solc",
+ "version": "0.4.23",
+ "settings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/AssetProxyOwner.json b/packages/migrations/artifacts/2.0.0-beta-testnet/AssetProxyOwner.json
new file mode 100644
index 000000000..3e4b15864
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/AssetProxyOwner.json
@@ -0,0 +1,44483 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "AssetProxyOwner",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isAssetProxyRegistered",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_assetProxyContracts",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "AssetProxyRegistration",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.4.10+commit.f0d539ae\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeRemoveAuthorizedAddressAtIndex\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsTimeLocked\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"registerAssetProxy\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"changeTimeLock\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAssetProxyRegistered\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"confirmationTimes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_assetProxyContracts\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"},{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"AssetProxyRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"confirmationTime\",\"type\":\"uint256\"}],\"name\":\"ConfirmationTimeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"TimeLockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"addOwner(address)\":{\"details\":\"Allows to add a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"changeRequirement(uint256)\":{\"details\":\"Allows to change the number of required confirmations. Transaction has to be sent by wallet.\",\"params\":{\"_required\":\"Number of required confirmations.\"}},\"changeTimeLock(uint256)\":{\"details\":\"Changes the duration of the time lock for transactions.\",\"params\":{\"_secondsTimeLocked\":\"Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\"}},\"confirmTransaction(uint256)\":{\"details\":\"Allows an owner to confirm a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeRemoveAuthorizedAddressAtIndex(uint256)\":{\"details\":\"Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeTransaction(uint256)\":{\"details\":\"Allows anyone to execute a confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"getConfirmationCount(uint256)\":{\"details\":\"Returns number of confirmations of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Number of confirmations.\"},\"getConfirmations(uint256)\":{\"details\":\"Returns array with owner addresses, which confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Returns array of owner addresses.\"},\"getOwners()\":{\"details\":\"Returns list of owners.\",\"return\":\"List of owner addresses.\"},\"getTransactionCount(bool,bool)\":{\"details\":\"Returns total number of transactions after filers are applied.\",\"params\":{\"executed\":\"Include executed transactions.\",\"pending\":\"Include pending transactions.\"},\"return\":\"Total number of transactions after filters are applied.\"},\"getTransactionIds(uint256,uint256,bool,bool)\":{\"details\":\"Returns list of transaction IDs in defined range.\",\"params\":{\"executed\":\"Include executed transactions.\",\"from\":\"Index start position of transaction array.\",\"pending\":\"Include pending transactions.\",\"to\":\"Index end position of transaction array.\"},\"return\":\"Returns array of transaction IDs.\"},\"isConfirmed(uint256)\":{\"details\":\"Returns the confirmation status of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Confirmation status.\"},\"registerAssetProxy(address,bool)\":{\"details\":\"Registers or deregisters an AssetProxy to be able to execute `removeAuthorizedAddressAtIndex` without a timelock.\",\"params\":{\"assetProxyContract\":\"Address of AssetProxy contract.\",\"isRegistered\":\"Status of approval for AssetProxy contract.\"}},\"removeOwner(address)\":{\"details\":\"Allows to remove an owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of owner.\"}},\"replaceOwner(address,address)\":{\"details\":\"Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"revokeConfirmation(uint256)\":{\"details\":\"Allows an owner to revoke a confirmation for a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"submitTransaction(address,uint256,bytes)\":{\"details\":\"Allows an owner to submit and confirm a transaction.\",\"params\":{\"data\":\"Transaction data payload.\",\"destination\":\"Transaction target address.\",\"value\":\"Transaction ether value.\"},\"return\":\"Returns transaction ID.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol\":\"AssetProxyOwner\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"2.0.0/multisig/MultiSigWallet.sol\":{\"keccak256\":\"0x5ad0f32801e51d60f02235477477b56ff9ccd727d6d2646d7efb84d1ffbd7bff\",\"urls\":[\"bzzr://0ca2767e1cde91f44a40176939eef3a46da233b552520aec19aeb97f4ef6bb00\"]},\"2.0.0/multisig/MultiSigWalletWithTimeLock.sol\":{\"keccak256\":\"0xd90adae0adda1b23bad71a37af6fc78f645204d519b7f4eeadea858241483611\",\"urls\":[\"bzzr://9761abd10cebccfcc948cc04cd7a5ee0a555d67d4510c82ef84422374beb8c8f\"]},\"2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol\":{\"keccak256\":\"0x6a77cd3a41d2ff7feab497e257cbc378167ae2d96975957116edf73c203d75d2\",\"urls\":[\"bzzr://b987bce902d5f514cf1d258f490007749a70787bb285805bdb8c613238977e46\"]}},\"version\":1}",
+ "evm": {
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CODESIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SUB"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2381,
+ "end": 2390,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2448,
+ "end": 2466,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2322,
+ "end": 2329,
+ "name": "DUP6"
+ },
+ {
+ "begin": 2331,
+ "end": 2340,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2342,
+ "end": 2360,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2018,
+ "end": 2025,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2027,
+ "end": 2036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2979,
+ "end": 2985,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2933,
+ "end": 2940,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2933,
+ "end": 2947,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2949,
+ "end": 2958,
+ "name": "DUP3"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2986,
+ "end": 2987,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "POP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2991,
+ "end": 2998,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2991,
+ "end": 3005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2989,
+ "end": 2990,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2989,
+ "end": 3005,
+ "name": "LT"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3037,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3038,
+ "end": 3045,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3046,
+ "end": 3047,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "LT"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MUL"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "POP"
+ },
+ {
+ "begin": 3053,
+ "end": 3060,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3061,
+ "end": 3062,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "LT"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MUL"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "AND"
+ },
+ {
+ "begin": 3067,
+ "end": 3068,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "EQ"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "REVERT"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3127,
+ "end": 3131,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3105,
+ "end": 3112,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3113,
+ "end": 3120,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3121,
+ "end": 3122,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "LT"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MUL"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "OR"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "ADD"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "ADD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3177,
+ "end": 3185,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2052,
+ "end": 2069,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 2393,
+ "end": 2394,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "POP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2400,
+ "end": 2420,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2400,
+ "end": 2427,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2396,
+ "end": 2397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2396,
+ "end": 2427,
+ "name": "LT"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2489,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2490,
+ "end": 2491,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "LT"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MUL"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "AND"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "AND"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2575,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "AND"
+ },
+ {
+ "begin": 2590,
+ "end": 2594,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "OR"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "ADD"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MUL"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "OR"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "30"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "25E7C27"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "173825D9"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20EA8D86"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "2F54BF6E"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "3411C81C"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "3589B35C"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "37BD78A0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "54741525"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "5A1A66AF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "7065CB48"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "784547A7"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "7AD28C51"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "83250F79"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "8B51D13F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "9ACE38C2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "A0E67E2B"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "A8ABE69A"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "B5DC40C3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "B77BF600"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "BA51A6DF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "C01A8C84"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "C6427474"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "D38F2D82"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "D74F8EDD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "DC8452CD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "E20056E6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "EE22610B"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2539,
+ "end": 2540,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2527,
+ "end": 2536,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2527,
+ "end": 2540,
+ "name": "GT"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2574,
+ "end": 2583,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2562,
+ "end": 2572,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "AND"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "E1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SUB"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "ADD"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "36"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "AND"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "STOP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "39"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "STOP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "42"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "INVALID"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ADD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "RETURN"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "45"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "INVALID"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ADD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "STOP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "51"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SUB"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "56"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SUB"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ADD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "57"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "57"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "AND"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "59"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "58"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "STOP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "60"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "60"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "AND"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "62"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "61"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "STOP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "63"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "63"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "64"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SUB"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ADD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "66"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "66"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "68"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "67"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "STOP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "69"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "INVALID"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "69"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "70"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ADD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "RETURN"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "72"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "72"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "74"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "73"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SUB"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ADD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "RETURN"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "75"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "INVALID"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "75"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "76"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "77"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "76"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP7"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "LT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "79"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "79"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "GT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "81"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "81"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "83"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "82"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MUL"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "85"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "84"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "86"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "86"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "88"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "87"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MUL"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "90"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "89"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "91"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "91"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "93"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "92"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MUL"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "95"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "94"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "96"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "96"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "98"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "97"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SUB"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ADD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "RETURN"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "99"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "99"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "101"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "100"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "STOP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "102"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "102"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "104"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "103"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "STOP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "105"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "105"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DIV"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MUL"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "AND"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATACOPY"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "107"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "106"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "108"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "108"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "110"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "109"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SUB"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ADD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "RETURN"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "111"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "INVALID"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "111"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "113"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "112"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP3"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SUB"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ADD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "RETURN"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "114"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "INVALID"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "114"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "116"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "115"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP3"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SUB"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ADD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "RETURN"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "117"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "117"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "119"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "118"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "STOP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "120"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "120"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "122"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "121"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "LT"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "123"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "123"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SHA3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "124"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "POP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "EXP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3879,
+ "end": 3885,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "126"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "126"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "128"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "128"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "AND"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3849,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "AND"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "130"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3891,
+ "end": 3897,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3891,
+ "end": 3904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3891,
+ "end": 3908,
+ "name": "ADD"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "LT"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "131"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3944,
+ "end": 3949,
+ "name": "DUP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3937,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3938,
+ "end": 3939,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "LT"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH [tag]",
+ "value": "133"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "133"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ADD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "134"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "EXP"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "EQ"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "135"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 3987,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "ADD"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "LT"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH [tag]",
+ "value": "136"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "136"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "ADD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "137"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 3975,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3976,
+ "end": 3977,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "LT"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH [tag]",
+ "value": "138"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "138"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ADD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "139"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "NOT"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "OR"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "POP"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "PUSH [tag]",
+ "value": "131"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "tag",
+ "value": "135"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "132"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "ADD"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "130"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "131"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4053,
+ "end": 4059,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "ADD"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "140"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "tag",
+ "value": "140"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4096,
+ "end": 4102,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4096,
+ "end": 4109,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4109,
+ "name": "GT"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4141,
+ "end": 4147,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4141,
+ "end": 4154,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4123,
+ "end": 4140,
+ "name": "PUSH [tag]",
+ "value": "101"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "tag",
+ "value": "143"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "tag",
+ "value": "142"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "AND"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "129"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "127"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "125"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3259,
+ "end": 3269,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "145"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "145"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1727,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1713,
+ "end": 1749,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "PUSH [tag]",
+ "value": "147"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "tag",
+ "value": "147"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1996,
+ "end": 2008,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "149"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "149"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3377,
+ "end": 3390,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "151"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "151"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "152"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "152"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3449,
+ "end": 3454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3419,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3435,
+ "end": 3445,
+ "name": "CALLER"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "PUSH",
+ "value": "F6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "153"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "150"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "tag",
+ "value": "148"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "146"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "144"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SHA3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP5"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3575,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "155"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "155"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3463,
+ "end": 3476,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "157"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "157"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "158"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "158"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1418,
+ "end": 1440,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "AND"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1510,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "AND"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH [tag]",
+ "value": "160"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "tag",
+ "value": "160"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "72656D6F7665417574686F72697A6564416464726573734174496E6465782861"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "6464726573732C75696E74323536290000000000000000000000000000000000"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "2F"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SUB"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "161"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "LT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "163"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "163"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "164"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "GT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "164"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SUB"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1565,
+ "end": 1566,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1555,
+ "name": "PUSH [tag]",
+ "value": "165"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "161"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "EQ"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "166"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "tag",
+ "value": "166"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3578,
+ "end": 3590,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "ADD"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "AND"
+ },
+ {
+ "begin": 3629,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "OR"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "ADD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP12"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "LT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "169"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "169"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "170"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "170"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GAS"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "CALL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "171"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "171"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "ADD"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "AND"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "172"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "tag",
+ "value": "167"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "159"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "156"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "154"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "174"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9304,
+ "end": 9305,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9304,
+ "end": 9322,
+ "name": "LT"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "175"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9355,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9360,
+ "end": 9372,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "ADD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "AND"
+ },
+ {
+ "begin": 9359,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "tag",
+ "value": "177"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "179"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "POP"
+ },
+ {
+ "begin": 9404,
+ "end": 9412,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "179"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9416,
+ "end": 9428,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "ADD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "AND"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "tag",
+ "value": "179"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "tag",
+ "value": "178"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "180"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9467,
+ "end": 9468,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "ADD"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "POP"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "tag",
+ "value": "180"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "176"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "ADD"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "175"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "173"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "59"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "182"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "182"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3020,
+ "end": 3038,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "184"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "184"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3076,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "OR"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "PUSH",
+ "value": "DAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SUB"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "185"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "183"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "181"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "62"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "187"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "187"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "189"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "189"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3447,
+ "end": 3452,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "191"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "191"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3479,
+ "end": 3485,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "POP"
+ },
+ {
+ "begin": 3495,
+ "end": 3496,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3479,
+ "end": 3496,
+ "name": "ADD"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "193"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "193"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "194"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "194"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "195"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "195"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "196"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "196"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "AND"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3529,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "AND"
+ },
+ {
+ "begin": 3539,
+ "end": 3543,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "OR"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "198"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "198"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "200"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP11"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "EXP"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "NOT"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "OR"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "197"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "192"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "190"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "188"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "186"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "65"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "202"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7475,
+ "end": 7481,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7475,
+ "end": 7488,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "LT"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "203"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7526,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7548,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "LT"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH [tag]",
+ "value": "205"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "205"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "ADD"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "206"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "EXP"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DIV"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "AND"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "AND"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "PUSH [tag]",
+ "value": "207"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7579,
+ "end": 7580,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "ADD"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "POP"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "tag",
+ "value": "207"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7598,
+ "end": 7603,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7598,
+ "end": 7615,
+ "name": "EQ"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "208"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7640,
+ "end": 7644,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "POP"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "203"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "tag",
+ "value": "208"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "204"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "ADD"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "202"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "203"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "201"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "68"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "210"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "210"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2398,
+ "end": 2415,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "D1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SUB"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "ADD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "LOG1"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "211"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "209"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "POP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "71"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SHA3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "74"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "213"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8784,
+ "end": 8790,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8784,
+ "end": 8797,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "LT"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "214"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8833,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8855,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "LT"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH [tag]",
+ "value": "216"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "216"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "ADD"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "217"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "EXP"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DIV"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "AND"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "AND"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "218"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8886,
+ "end": 8887,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "ADD"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "POP"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "tag",
+ "value": "218"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "215"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "ADD"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "213"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "214"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "212"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "77"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "83"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "219"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "tag",
+ "value": "219"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9661,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "222"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "223"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "AND"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "GT"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "223"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "222"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "221"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "88"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "224"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "tag",
+ "value": "224"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "226"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "tag",
+ "value": "226"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11013,
+ "end": 11023,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11037,
+ "end": 11043,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "LT"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH [tag]",
+ "value": "228"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "228"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MUL"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "229"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 11026,
+ "end": 11027,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "POP"
+ },
+ {
+ "begin": 11060,
+ "end": 11061,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "POP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "230"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11063,
+ "end": 11064,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11063,
+ "end": 11081,
+ "name": "LT"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "231"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11114,
+ "name": "DUP6"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "PUSH [tag]",
+ "value": "233"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11119,
+ "end": 11131,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "ADD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "AND"
+ },
+ {
+ "begin": 11118,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "tag",
+ "value": "233"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "235"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "POP"
+ },
+ {
+ "begin": 11163,
+ "end": 11171,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "235"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11175,
+ "end": 11187,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "ADD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "AND"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "tag",
+ "value": "235"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "tag",
+ "value": "234"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "236"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11259,
+ "end": 11260,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11249,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11250,
+ "end": 11255,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "LT"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH [tag]",
+ "value": "237"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "tag",
+ "value": "237"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MUL"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11260,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11287,
+ "end": 11288,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "ADD"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "tag",
+ "value": "236"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "232"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "ADD"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "230"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "231"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11346,
+ "end": 11350,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11343,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11350,
+ "name": "SUB"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "LT"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH [tag]",
+ "value": "238"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "238"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MUL"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "239"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11368,
+ "end": 11372,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "POP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "240"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11376,
+ "end": 11378,
+ "name": "DUP7"
+ },
+ {
+ "begin": 11374,
+ "end": 11375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11374,
+ "end": 11378,
+ "name": "LT"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "241"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11443,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11444,
+ "end": 11445,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "LT"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "243"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "tag",
+ "value": "243"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MUL"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11412,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11417,
+ "end": 11421,
+ "name": "DUP10"
+ },
+ {
+ "begin": 11413,
+ "end": 11414,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11413,
+ "end": 11421,
+ "name": "SUB"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "LT"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH [tag]",
+ "value": "244"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "tag",
+ "value": "244"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MUL"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "242"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "ADD"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "240"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "241"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "227"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "93"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "245"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "tag",
+ "value": "245"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "246"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "tag",
+ "value": "246"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10039,
+ "end": 10045,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10039,
+ "end": 10052,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "LT"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH [tag]",
+ "value": "248"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "248"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MUL"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "249"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10076,
+ "end": 10077,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "POP"
+ },
+ {
+ "begin": 10110,
+ "end": 10111,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "POP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "250"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10115,
+ "end": 10121,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10115,
+ "end": 10128,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "LT"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "251"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10164,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10186,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "LT"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH [tag]",
+ "value": "253"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "253"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "ADD"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "254"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "EXP"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DIV"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "AND"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "AND"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "255"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10243,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "LT"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH [tag]",
+ "value": "256"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "256"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "ADD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "257"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "EXP"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10227,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10228,
+ "end": 10233,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "LT"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH [tag]",
+ "value": "258"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "tag",
+ "value": "258"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MUL"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10273,
+ "end": 10274,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "ADD"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "tag",
+ "value": "255"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "252"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "ADD"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "250"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "251"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10329,
+ "end": 10334,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "LT"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH [tag]",
+ "value": "259"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "259"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MUL"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "260"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10352,
+ "end": 10353,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "POP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "261"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10357,
+ "end": 10362,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10356,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10362,
+ "name": "LT"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "262"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10418,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10419,
+ "end": 10420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "LT"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "264"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "tag",
+ "value": "264"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MUL"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10395,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10396,
+ "end": 10397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "LT"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH [tag]",
+ "value": "265"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "tag",
+ "value": "265"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "AND"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MUL"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "263"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "ADD"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "261"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "262"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "247"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "98"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "101"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "267"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "267"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5112,
+ "end": 5118,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 5112,
+ "end": 5125,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 5127,
+ "end": 5136,
+ "name": "DUP2"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "269"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "269"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "270"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "270"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "271"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "271"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "272"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "272"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5152,
+ "end": 5160,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "A3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SUB"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "ADD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "273"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "268"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "266"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "104"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2676,
+ "end": 2686,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "275"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "275"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1558,
+ "end": 1570,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "AND"
+ },
+ {
+ "begin": 1558,
+ "end": 1602,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "PUSH [tag]",
+ "value": "277"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "tag",
+ "value": "277"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1876,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "PUSH [tag]",
+ "value": "279"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "tag",
+ "value": "279"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2803,
+ "end": 2816,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "281"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "281"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "282"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "282"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2875,
+ "end": 2879,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2861,
+ "end": 2871,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "OR"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "DUP9"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "PUSH",
+ "value": "4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "LOG3"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "PUSH [tag]",
+ "value": "284"
+ },
+ {
+ "begin": 2954,
+ "end": 2967,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2942,
+ "end": 2953,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "tag",
+ "value": "284"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 3004,
+ "end": 3017,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3019,
+ "end": 3034,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 2984,
+ "end": 3003,
+ "name": "PUSH [tag]",
+ "value": "287"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "tag",
+ "value": "286"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "tag",
+ "value": "285"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "283"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "tag",
+ "value": "280"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "tag",
+ "value": "278"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "276"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "274"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "107"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5580,
+ "end": 5598,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "PUSH [tag]",
+ "value": "289"
+ },
+ {
+ "begin": 5645,
+ "end": 5656,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5658,
+ "end": 5663,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5665,
+ "end": 5669,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5630,
+ "end": 5644,
+ "name": "PUSH [tag]",
+ "value": "290"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "tag",
+ "value": "289"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "POP"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "PUSH [tag]",
+ "value": "291"
+ },
+ {
+ "begin": 5699,
+ "end": 5712,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5680,
+ "end": 5698,
+ "name": "PUSH [tag]",
+ "value": "104"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "tag",
+ "value": "291"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "288"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "110"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "113"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "116"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "119"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4561,
+ "end": 4567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "293"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "293"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "295"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "295"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "297"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "297"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4568,
+ "end": 4569,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "POP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "299"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4573,
+ "end": 4579,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4573,
+ "end": 4586,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "LT"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "300"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4622,
+ "end": 4627,
+ "name": "DUP5"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4615,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4616,
+ "end": 4617,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "LT"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH [tag]",
+ "value": "302"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "302"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ADD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "303"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "EXP"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "EQ"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "304"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4659,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4647,
+ "end": 4653,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4654,
+ "end": 4655,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "LT"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH [tag]",
+ "value": "305"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "305"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ADD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "306"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "EXP"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "NOT"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "OR"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "POP"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "PUSH [tag]",
+ "value": "300"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "tag",
+ "value": "304"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "301"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "ADD"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "299"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "300"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP7"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "AND"
+ },
+ {
+ "begin": 4731,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4721,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP9"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "AND"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "OR"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "AND"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "298"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "296"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "294"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "292"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "122"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3808,
+ "end": 3830,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "308"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "308"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3743,
+ "end": 3756,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "310"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "310"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "311"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "311"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1445,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1480,
+ "name": "ADD"
+ },
+ {
+ "begin": 1409,
+ "end": 1424,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "LT"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH [tag]",
+ "value": "313"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "tag",
+ "value": "313"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3833,
+ "end": 3845,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "ADD"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "AND"
+ },
+ {
+ "begin": 3884,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "OR"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "ADD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP11"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "LT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "316"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "316"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "317"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "317"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GAS"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "CALL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "318"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "148"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "318"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "ADD"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "AND"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "319"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "tag",
+ "value": "314"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "312"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "309"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "307"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "165"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4242,
+ "end": 4255,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4291,
+ "end": 4296,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4299,
+ "end": 4300,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4291,
+ "end": 4300,
+ "name": "ADD"
+ },
+ {
+ "begin": 4279,
+ "end": 4280,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4279,
+ "end": 4287,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "LT"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH [tag]",
+ "value": "321"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "REVERT"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "tag",
+ "value": "321"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4357,
+ "end": 4359,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "ADD"
+ },
+ {
+ "begin": 4344,
+ "end": 4349,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4488,
+ "end": 4491,
+ "name": "AND"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "320"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "287"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4324,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "PUSH",
+ "value": "B237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SUB"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "ADD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "322"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "290"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8126,
+ "end": 8144,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8096,
+ "end": 8107,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "324"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "324"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP9"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP7"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP8"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "326"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "327"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "tag",
+ "value": "326"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8382,
+ "end": 8398,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "ADD"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "C0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "325"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "323"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "141"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "329"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "328"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "199"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "332"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "331"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "220"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "225"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "327"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MUL"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SUB"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "LT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "334"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "OR"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "334"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "335"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "335"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "333"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "221"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "339"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "339"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "340"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "338"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "bytecode": {
+ "object": "0x606060405234156200000d57fe5b60405162001e8338038062001e8383398101604090815281516020830151918301516060840151918401939290920191905b600060008584845b82825b600082518260328211806200005e57508181115b8062000068575080155b8062000072575081155b156200007e5760006000fd5b600092505b84518310156200015357600260008685815181101515620000a057fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000f357508483815181101515620000dc57fe5b90602001906020020151600160a060020a03166000145b15620000ff5760006000fd5b60016002600087868151811015156200011457fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790555b60019092019162000083565b845162000168906003906020880190620001fc565b5060048490555b5b505050600683905550505b505050600091505b8451821015620001ef5784828151811015156200019c57fe5b602090810290910101519050600160a060020a0381161515620001bf5760006000fd5b600160a060020a0381166000908152600860205260409020805460ff191660011790555b60019091019062000183565b5b50505050505062000295565b82805482825590600052602060002090810192821562000254579160200282015b82811115620002545782518254600160a060020a031916600160a060020a039091161782556020909201916001909101906200021d565b5b506200026392915062000267565b5090565b6200029291905b8082111562000263578054600160a060020a03191681556001016200026e565b5090565b90565b611bde80620002a56000396000f300606060405236156101435763ffffffff60e060020a600035041663025e7c278114610195578063173825d9146101c457806320ea8d86146101e25780632f54bf6e146101f75780633411c81c146102275780633589b35c1461025a57806337bd78a01461026f57806354741525146102915780635a1a66af146102bd5780637065cb48146102e0578063784547a7146102fe5780637ad28c511461032557806383250f791461033a5780638b51d13f1461036a5780639ace38c21461038f578063a0e67e2b1461044c578063a8abe69a146104b7578063b5dc40c314610532578063b77bf600146105a0578063ba51a6df146105c2578063c01a8c84146105d7578063c6427474146105ec578063d38f2d8214610661578063d74f8edd14610686578063dc8452cd146106a8578063e20056e6146106ca578063ee22610b146106ee575b6101935b600034111561019057604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b341561019d57fe5b6101a8600435610703565b60408051600160a060020a039092168252519081900360200190f35b34156101cc57fe5b610193600160a060020a0360043516610735565b005b34156101ea57fe5b6101936004356108e6565b005b34156101ff57fe5b610213600160a060020a03600435166109da565b604080519115158252519081900360200190f35b341561022f57fe5b610213600435600160a060020a03602435166109ef565b604080519115158252519081900360200190f35b341561026257fe5b610193600435610a0f565b005b341561027757fe5b61027f610cc9565b60408051918252519081900360200190f35b341561029957fe5b61027f60043515156024351515610ccf565b60408051918252519081900360200190f35b34156102c557fe5b610193600160a060020a03600435166024351515610d3e565b005b34156102e857fe5b610193600160a060020a0360043516610dde565b005b341561030657fe5b610213600435610f15565b604080519115158252519081900360200190f35b341561032d57fe5b610193600435610fa9565b005b341561034257fe5b610213600160a060020a0360043516611007565b604080519115158252519081900360200190f35b341561037257fe5b61027f60043561101c565b60408051918252519081900360200190f35b341561039757fe5b6103a260043561109b565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a08301908590801561043a5780601f1061040f5761010080835404028352916020019161043a565b820191906000526020600020905b81548152906001019060200180831161041d57829003601f168201915b50509550505050505060405180910390f35b341561045457fe5b61045c6110cf565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156104bf57fe5b61045c60043560243560443515156064351515611138565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b341561053a57fe5b61045c60043561126d565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156105a857fe5b61027f6113f5565b60408051918252519081900360200190f35b34156105ca57fe5b6101936004356113fb565b005b34156105df57fe5b61019360043561148b565b005b34156105f457fe5b604080516020600460443581810135601f810184900484028501840190955284845261027f948235600160a060020a03169460248035956064949293919092019181908401838280828437509496506115a095505050505050565b60408051918252519081900360200190f35b341561066957fe5b61027f6004356115c0565b60408051918252519081900360200190f35b341561068e57fe5b61027f6115d2565b60408051918252519081900360200190f35b34156106b057fe5b61027f6115d7565b60408051918252519081900360200190f35b34156106d257fe5b610193600160a060020a03600435811690602435166115dd565b005b34156106f657fe5b610193600435611799565b005b600380548290811061071157fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a03161415156107585760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156107825760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b6003546000190182101561087d5782600160a060020a03166003838154811015156107cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156108715760038054600019810190811061080d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561083c57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a0316021790555061087d565b5b6001909101906107a5565b6003805460001901906108909082611a9a565b5060035460045411156108a9576003546108a9906113fb565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff16151561090f5760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff1615156109455760006000fd5b600084815260208190526040902060030154849060ff16156109675760006000fd5b8461097181610f15565b1561097c5760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610a315760006000fd5b82610a3b81610f15565b1515610a475760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610a7e5760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e646578286181527f6464726573732c75696e743235362900000000000000000000000000000000006020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610b789392830182828015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050600061192e565b600160e060020a03191614610b8d5760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505091505060006040518083038185876185025a03f19250505015610c855760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109ce565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610d3657838015610cfc575060008181526020819052604090206003015460ff16155b80610d205750828015610d20575060008181526020819052604090206003015460ff165b5b15610d2d576001820191505b5b600101610cd3565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610d5f5760006000fd5b81600160a060020a0381161515610d765760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610dff5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610e285760006000fd5b81600160a060020a0381161515610e3f5760006000fd5b6003805490506001016004546032821180610e5957508181115b80610e62575080155b80610e6b575081155b15610e765760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610eae8382611a9a565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b600080805b600354811015610fa15760008481526001602052604081206003805491929184908110610f4357fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610f85576001820191505b600454821415610f985760019250610fa1565b5b600101610f1a565b5b5050919050565b30600160a060020a031633600160a060020a0316141515610fca5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b600354811015611094576000838152600160205260408120600380549192918490811061104957fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561108b576001820191505b5b600101611020565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b6110d7611aee565b600380548060200260200160405190810160405280929190818152602001828054801561112d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161110f575b505050505090505b90565b611140611aee565b611148611aee565b6000600060055460405180591061115c5750595b908082528060200260200182016040525b50925060009150600090505b6005548110156111f6578580156111a2575060008181526020819052604090206003015460ff16155b806111c657508480156111c6575060008181526020819052604090206003015460ff165b5b156111ed578083838151811015156111db57fe5b60209081029091010152600191909101905b5b600101611179565b8787036040518059106112065750595b908082528060200260200182016040525b5093508790505b8681101561126157828181518110151561123457fe5b906020019060200201518489830381518110151561124e57fe5b602090810290910101525b60010161121e565b5b505050949350505050565b611275611aee565b61127d611aee565b60035460405160009182918059106112925750595b908082528060200260200182016040525b50925060009150600090505b60035481101561137757600085815260016020526040812060038054919291849081106112d857fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561136e57600380548290811061132157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110151561134f57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b6001016112af565b816040518059106113855750595b908082528060200260200182016040525b509350600090505b818110156113ec5782818151811015156113b457fe5b9060200190602002015184828151811015156113cc57fe5b600160a060020a039092166020928302909101909101525b60010161139e565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a031614151561141c5760006000fd5b60035481603282118061142e57508181115b80611437575080155b80611440575081155b1561144b5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156114b45760006000fd5b6000828152602081905260409020548290600160a060020a031615156114da5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff161561150f5760006000fd5b8461151981610f15565b156115245760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361158386610f15565b156109ce576109ce864261195b565b5b5b5b505b50505b505b5050565b60006115ad8484846119a7565b90506115b88161148b565b5b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156116005760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16151561162a5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156116535760006000fd5b600092505b6003548310156116fb5784600160a060020a031660038481548110151561167b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156116ef57836003848154811015156116ba57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506116fb565b5b600190920191611658565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff16156117bb5760006000fd5b826117c581610f15565b15156117d15760006000fd5b6006546000858152600760205260409020548591014210156117f35760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a039093169594929391928392859260001991831615610100029190910190911604801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505091505060006040518083038185876185025a03f192505050156118eb5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109d1565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b6000816004018351101515156119445760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a03811615156119c05760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611a40926002850192910190611b12565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b5b50611b8d929150611b91565b5090565b61113591905b80821115611b8d5760008155600101611b97565b5090565b905600a165627a7a72305820de7348a39a18c2139f807a6077c790eed8049dfeaae504bf4a42607bfae3afce0029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH3 0xD JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x1E83 CODESIZE SUB DUP1 PUSH3 0x1E83 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD SWAP2 DUP5 ADD SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 SWAP1 JUMPDEST PUSH1 0x0 PUSH1 0x0 DUP6 DUP5 DUP5 JUMPDEST DUP3 DUP3 JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x5E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x68 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x72 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x7E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x153 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xA0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xF3 JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xDC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0xFF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x114 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x83 JUMP JUMPDEST DUP5 MLOAD PUSH3 0x168 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x1FC JUMP JUMPDEST POP PUSH1 0x4 DUP5 SWAP1 SSTORE JUMPDEST JUMPDEST POP POP POP PUSH1 0x6 DUP4 SWAP1 SSTORE POP POP JUMPDEST POP POP POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP5 MLOAD DUP3 LT ISZERO PUSH3 0x1EF JUMPI DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x19C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH3 0x1BF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x183 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP PUSH3 0x295 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x254 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x254 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x21D JUMP JUMPDEST JUMPDEST POP PUSH3 0x263 SWAP3 SWAP2 POP PUSH3 0x267 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x292 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x263 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x26E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BDE DUP1 PUSH3 0x2A5 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x143 JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1C4 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1E2 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x3589B35C EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x5A1A66AF EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2FE JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x325 JUMPI DUP1 PUSH4 0x83250F79 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x38F JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x4B7 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x532 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x5A0 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x5C2 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x5D7 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x5EC JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x686 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x6CA JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x6EE JUMPI JUMPDEST PUSH2 0x193 JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x190 JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST JUMPDEST JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x19D JUMPI INVALID JUMPDEST PUSH2 0x1A8 PUSH1 0x4 CALLDATALOAD PUSH2 0x703 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1CC JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x735 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x1EA JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x8E6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x1FF JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x9DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x22F JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x24 CALLDATALOAD AND PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x262 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0xA0F JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x277 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0xCC9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x299 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2C5 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xD3E JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x2E8 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDE JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x306 JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH2 0xF15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x32D JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0xFA9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x342 JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x1007 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x372 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD PUSH2 0x101C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x397 JUMPI INVALID JUMPDEST PUSH2 0x3A2 PUSH1 0x4 CALLDATALOAD PUSH2 0x109B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE DUP3 ISZERO ISZERO PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP2 DUP2 ADD DUP3 DUP2 MSTORE DUP5 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP3 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 SWAP2 PUSH1 0xA0 DUP4 ADD SWAP1 DUP6 SWAP1 DUP1 ISZERO PUSH2 0x43A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x40F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x43A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x41D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x454 JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x4BF JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0x1138 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x53A JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH1 0x4 CALLDATALOAD PUSH2 0x126D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x5A8 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x5CA JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x13FB JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x5DF JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x148B JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x5F4 JUMPI INVALID JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x27F SWAP5 DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 PUSH1 0x64 SWAP5 SWAP3 SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP7 POP PUSH2 0x15A0 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x669 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x68E JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x15D2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x6B0 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x15D7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x6D2 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x15DD JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x6F6 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x1799 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x711 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 NOT ADD DUP3 LT ISZERO PUSH2 0x87D JUMPI DUP3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7CC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x871 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x80D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x83C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x87D JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x7A5 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x890 SWAP1 DUP3 PUSH2 0x1A9A JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x8A9 JUMPI PUSH1 0x3 SLOAD PUSH2 0x8A9 SWAP1 PUSH2 0x13FB JUMP JUMPDEST JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x90F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x945 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0x971 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xA31 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0xA3B DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xA47 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP6 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA7E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A6564416464726573734174496E6465782861 DUP2 MSTORE PUSH32 0x6464726573732C75696E74323536290000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD PUSH1 0x2F SWAP3 DUP2 SWAP1 SUB SWAP3 SWAP1 SWAP3 ADD DUP3 SHA3 PUSH1 0x2 DUP6 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND SWAP4 PUSH2 0xB78 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB6C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB41 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB6C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB4F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH1 0x0 PUSH2 0x192E JUMP JUMPDEST PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND EQ PUSH2 0xB8D JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP12 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0xC36 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC0B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC36 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC19 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0xC85 JUMPI PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x9CE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP6 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xD36 JUMPI DUP4 DUP1 ISZERO PUSH2 0xCFC JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xD20 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xD20 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xD2D JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0xCD3 JUMP JUMPDEST JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xD76 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP4 DUP5 MSTORE SWAP1 DUP4 ADD MSTORE DUP1 MLOAD PUSH32 0xDAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xDFF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xE28 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xE59 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xE62 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xE6B JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xE76 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP2 DUP2 ADD PUSH2 0xEAE DUP4 DUP3 PUSH2 0x1A9A JUMP JUMPDEST SWAP2 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP11 AND PUSH2 0x100 SWAP4 SWAP1 SWAP4 EXP DUP4 DUP2 MUL SWAP2 MUL NOT SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xFA1 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xF43 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xF85 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xF98 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xFA1 JUMP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0xF1A JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xFCA JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1094 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x1049 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x108B JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x1020 JUMP JUMPDEST JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP2 PUSH1 0x2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH2 0x10D7 PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x112D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x110F JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1140 PUSH2 0x1AEE JUMP JUMPDEST PUSH2 0x1148 PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x115C JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x11F6 JUMPI DUP6 DUP1 ISZERO PUSH2 0x11A2 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x11C6 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x11C6 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x11ED JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11DB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x1179 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1206 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1261 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1234 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x124E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x121E JUMP JUMPDEST JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1275 PUSH2 0x1AEE JUMP JUMPDEST PUSH2 0x127D PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP1 MSIZE LT PUSH2 0x1292 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1377 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x12D8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x136E JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x1321 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x134F JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x12AF JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1385 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x13EC JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13B4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13CC JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x139E JUMP JUMPDEST JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x141C JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x142E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1437 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x1440 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x144B JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x14B4 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO ISZERO PUSH2 0x14DA JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x150F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0x1519 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x1524 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1583 DUP7 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x9CE JUMPI PUSH2 0x9CE DUP7 TIMESTAMP PUSH2 0x195B JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15AD DUP5 DUP5 DUP5 PUSH2 0x19A7 JUMP JUMPDEST SWAP1 POP PUSH2 0x15B8 DUP2 PUSH2 0x148B JUMP JUMPDEST JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x1600 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x162A JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1653 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x16FB JUMPI DUP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x167B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x16EF JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16BA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x16FB JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1658 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 SHA3 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x17C5 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x17D1 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x17F3 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x189C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1871 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x189C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x187F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0x18EB JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x9D1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1944 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x19C0 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 SHA3 DUP5 MLOAD DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x1A40 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1B12 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0x8DF JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0x8DF SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1B91 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0x8DF JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0x8DF SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1B91 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1B53 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1B80 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1B80 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1B80 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1B65 JUMP JUMPDEST JUMPDEST POP PUSH2 0x1B8D SWAP3 SWAP2 POP PUSH2 0x1B91 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1135 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1B8D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1B97 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 0xde PUSH20 0x48A39A18C2139F807A6077C790EED8049DFEAAE5 DIV 0xbf 0x4a TIMESTAMP PUSH1 0x7B 0xfa 0xe3 0xaf 0xce STOP 0x29 ",
+ "sourceMap": "663:3945:2:-;;;2097:514;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2381:9;2448:18;2322:7;2331:9;2342:18;1884:213:1;2018:7;2027:9;2834:370:0;2979:6;2933:7;:14;2949:9;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;2986:1;2979:8;;2974:168;2991:7;:14;2989:1;:16;2974:168;;;3030:7;:19;3038:7;3046:1;3038:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3030:19:0;;;;;;;;;;;-1:-1:-1;3030:19:0;;;;;:38;;;3053:7;3061:1;3053:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3053:15:0;3067:1;3053:15;3030:38;3026:65;;;3086:5;;;3026:65;3127:4;3105:7;:19;3113:7;3121:1;3113:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3105:19:0;;;;;;;;;;;-1:-1:-1;3105:19:0;:26;;-1:-1:-1;;3105:26:0;;;;;;;;;;2974:168;3007:3;;;;;2974:168;;;3151:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;3177:8:0;:20;;;2412:1;2834:370;-1:-1:-1;;;2052:17:1;:38;;;-1:-1:-1;;1884:213:1;;;;2393:1:2;2381:13;;2376:229;2400:20;:27;2396:1;:31;2376:229;;;2469:20;2490:1;2469:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2514:24:2;;;;2506:33;;;;;;-1:-1:-1;;;;;2553:34:2;;;;;;:22;:34;;;;;:41;;-1:-1:-1;;2553:41:2;2590:4;2553:41;;;2376:229;2429:3;;;;;2376:229;;;2097:514;;;;;;;663:3945;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;663:3945:2;-1:-1:-1;;;;;663:3945:2;;;;;;;;;;;-1:-1:-1;663:3945:2;;;;;;;;-1:-1:-1;663:3945:2;;;-1:-1:-1;663:3945:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;663:3945:2;;;;;;;;;;;;;:::o;:::-;;;;;;;",
+ "linkReferences": {}
+ },
+ "deployedBytecode": {
+ "object": "0x606060405236156101435763ffffffff60e060020a600035041663025e7c278114610195578063173825d9146101c457806320ea8d86146101e25780632f54bf6e146101f75780633411c81c146102275780633589b35c1461025a57806337bd78a01461026f57806354741525146102915780635a1a66af146102bd5780637065cb48146102e0578063784547a7146102fe5780637ad28c511461032557806383250f791461033a5780638b51d13f1461036a5780639ace38c21461038f578063a0e67e2b1461044c578063a8abe69a146104b7578063b5dc40c314610532578063b77bf600146105a0578063ba51a6df146105c2578063c01a8c84146105d7578063c6427474146105ec578063d38f2d8214610661578063d74f8edd14610686578063dc8452cd146106a8578063e20056e6146106ca578063ee22610b146106ee575b6101935b600034111561019057604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b341561019d57fe5b6101a8600435610703565b60408051600160a060020a039092168252519081900360200190f35b34156101cc57fe5b610193600160a060020a0360043516610735565b005b34156101ea57fe5b6101936004356108e6565b005b34156101ff57fe5b610213600160a060020a03600435166109da565b604080519115158252519081900360200190f35b341561022f57fe5b610213600435600160a060020a03602435166109ef565b604080519115158252519081900360200190f35b341561026257fe5b610193600435610a0f565b005b341561027757fe5b61027f610cc9565b60408051918252519081900360200190f35b341561029957fe5b61027f60043515156024351515610ccf565b60408051918252519081900360200190f35b34156102c557fe5b610193600160a060020a03600435166024351515610d3e565b005b34156102e857fe5b610193600160a060020a0360043516610dde565b005b341561030657fe5b610213600435610f15565b604080519115158252519081900360200190f35b341561032d57fe5b610193600435610fa9565b005b341561034257fe5b610213600160a060020a0360043516611007565b604080519115158252519081900360200190f35b341561037257fe5b61027f60043561101c565b60408051918252519081900360200190f35b341561039757fe5b6103a260043561109b565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a08301908590801561043a5780601f1061040f5761010080835404028352916020019161043a565b820191906000526020600020905b81548152906001019060200180831161041d57829003601f168201915b50509550505050505060405180910390f35b341561045457fe5b61045c6110cf565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156104bf57fe5b61045c60043560243560443515156064351515611138565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b341561053a57fe5b61045c60043561126d565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156105a857fe5b61027f6113f5565b60408051918252519081900360200190f35b34156105ca57fe5b6101936004356113fb565b005b34156105df57fe5b61019360043561148b565b005b34156105f457fe5b604080516020600460443581810135601f810184900484028501840190955284845261027f948235600160a060020a03169460248035956064949293919092019181908401838280828437509496506115a095505050505050565b60408051918252519081900360200190f35b341561066957fe5b61027f6004356115c0565b60408051918252519081900360200190f35b341561068e57fe5b61027f6115d2565b60408051918252519081900360200190f35b34156106b057fe5b61027f6115d7565b60408051918252519081900360200190f35b34156106d257fe5b610193600160a060020a03600435811690602435166115dd565b005b34156106f657fe5b610193600435611799565b005b600380548290811061071157fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a03161415156107585760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156107825760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b6003546000190182101561087d5782600160a060020a03166003838154811015156107cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156108715760038054600019810190811061080d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561083c57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a0316021790555061087d565b5b6001909101906107a5565b6003805460001901906108909082611a9a565b5060035460045411156108a9576003546108a9906113fb565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff16151561090f5760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff1615156109455760006000fd5b600084815260208190526040902060030154849060ff16156109675760006000fd5b8461097181610f15565b1561097c5760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610a315760006000fd5b82610a3b81610f15565b1515610a475760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610a7e5760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e646578286181527f6464726573732c75696e743235362900000000000000000000000000000000006020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610b789392830182828015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050600061192e565b600160e060020a03191614610b8d5760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505091505060006040518083038185876185025a03f19250505015610c855760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109ce565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610d3657838015610cfc575060008181526020819052604090206003015460ff16155b80610d205750828015610d20575060008181526020819052604090206003015460ff165b5b15610d2d576001820191505b5b600101610cd3565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610d5f5760006000fd5b81600160a060020a0381161515610d765760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610dff5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610e285760006000fd5b81600160a060020a0381161515610e3f5760006000fd5b6003805490506001016004546032821180610e5957508181115b80610e62575080155b80610e6b575081155b15610e765760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610eae8382611a9a565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b600080805b600354811015610fa15760008481526001602052604081206003805491929184908110610f4357fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610f85576001820191505b600454821415610f985760019250610fa1565b5b600101610f1a565b5b5050919050565b30600160a060020a031633600160a060020a0316141515610fca5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b600354811015611094576000838152600160205260408120600380549192918490811061104957fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561108b576001820191505b5b600101611020565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b6110d7611aee565b600380548060200260200160405190810160405280929190818152602001828054801561112d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161110f575b505050505090505b90565b611140611aee565b611148611aee565b6000600060055460405180591061115c5750595b908082528060200260200182016040525b50925060009150600090505b6005548110156111f6578580156111a2575060008181526020819052604090206003015460ff16155b806111c657508480156111c6575060008181526020819052604090206003015460ff165b5b156111ed578083838151811015156111db57fe5b60209081029091010152600191909101905b5b600101611179565b8787036040518059106112065750595b908082528060200260200182016040525b5093508790505b8681101561126157828181518110151561123457fe5b906020019060200201518489830381518110151561124e57fe5b602090810290910101525b60010161121e565b5b505050949350505050565b611275611aee565b61127d611aee565b60035460405160009182918059106112925750595b908082528060200260200182016040525b50925060009150600090505b60035481101561137757600085815260016020526040812060038054919291849081106112d857fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561136e57600380548290811061132157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110151561134f57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b6001016112af565b816040518059106113855750595b908082528060200260200182016040525b509350600090505b818110156113ec5782818151811015156113b457fe5b9060200190602002015184828151811015156113cc57fe5b600160a060020a039092166020928302909101909101525b60010161139e565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a031614151561141c5760006000fd5b60035481603282118061142e57508181115b80611437575080155b80611440575081155b1561144b5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156114b45760006000fd5b6000828152602081905260409020548290600160a060020a031615156114da5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff161561150f5760006000fd5b8461151981610f15565b156115245760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361158386610f15565b156109ce576109ce864261195b565b5b5b5b505b50505b505b5050565b60006115ad8484846119a7565b90506115b88161148b565b5b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156116005760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16151561162a5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156116535760006000fd5b600092505b6003548310156116fb5784600160a060020a031660038481548110151561167b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156116ef57836003848154811015156116ba57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506116fb565b5b600190920191611658565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff16156117bb5760006000fd5b826117c581610f15565b15156117d15760006000fd5b6006546000858152600760205260409020548591014210156117f35760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a039093169594929391928392859260001991831615610100029190910190911604801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505091505060006040518083038185876185025a03f192505050156118eb5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109d1565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b6000816004018351101515156119445760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a03811615156119c05760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611a40926002850192910190611b12565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b5b50611b8d929150611b91565b5090565b61113591905b80821115611b8d5760008155600101611b97565b5090565b905600a165627a7a72305820de7348a39a18c2139f807a6077c790eed8049dfeaae504bf4a42607bfae3afce0029",
+ "sourceMap": "663:3945:2:-;;;;;;;;-1:-1:-1;;;663:3945:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2482:109:0;2539:1;2527:9;:13;2523:61;;;2554:30;;;2574:9;2554:30;;;;-1:-1:-1;;;;;2562:10:0;2554:30;;;;;;;;;;;;2523:61;2482:109;:::o;663:3945:2:-;;956:23:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;;;;;;;;;;;;;3731:460;;;;;;;;-1:-1:-1;;;;;3731:460:0;;;;;;;3176:332:1;;;;;;;;;;;;;;910:40:0;;;;;;;;-1:-1:-1;;;;;910:40:0;;;;;;;;;;;;;;;;;;;;;;;840:64;;;;;;;;;;-1:-1:-1;;;;;840:64:0;;;;;;;;;;;;;;;;;;;;;;;3320:573:2;;;;;;;;;;;;;;1029:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;9156:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2895:289:2;;;;;;;;-1:-1:-1;;;;;2895:289:2;;;;;;;;;;;3331:277:0;;;;;;;;-1:-1:-1;;;;;3331:277:0;;;;;;;7324:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2301:186:1;;;;;;;;;;;;;;981:55:2;;;;;;;;-1:-1:-1;;;;;981:55:2;;;;;;;;;;;;;;;;;;;;;;;8642:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;785:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;10777:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;9853:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;1011:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;5010:207;;;;;;;;;;;;;;2593:459:1;;;;;;;;;;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5476:244:0;;-1:-1:-1;5476:244:0;;-1:-1:-1;;;;;;5476:244:0;;;;;;;;;;;;;;;;;1065:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;237:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;985:20;;;;;;;;;;;;;;;;;;;;;;;;;;4390:449;;;;;;;;-1:-1:-1;;;;;4390:449:0;;;;;;;;;;;;3622:472:1;;;;;;;;;;;;;;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;:::o;3731:460::-;3879:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;3821:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;3842:14:0;;3859:5;3842:14;;;:7;:14;;;;;:22;;-1:-1:-1;;3842:22:0;;;3859:5;-1:-1:-1;3874:170:0;3891:6;:13;-1:-1:-1;;3891:17:0;3889:19;;3874:170;;;3944:5;-1:-1:-1;;;;;3931:18:0;:6;3938:1;3931:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3931:9:0;-1:-1:-1;;;;;3931:18:0;;3927:117;;;3981:6;3988:13;;-1:-1:-1;;3988:17:0;;;3981:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3981:25:0;3969:6;3976:1;3969:9;;;;;;;;;;;;;;;;;;;;:37;;;;;-1:-1:-1;;;;;3969:37:0;;;;;-1:-1:-1;;;;;3969:37:0;;;;;;4024:5;;3927:117;3874:170;3910:3;;;;;3874:170;;;4053:6;:18;;-1:-1:-1;;4053:18:0;;;;;;:::i;:::-;-1:-1:-1;4096:6:0;:13;4085:8;;:24;4081:74;;;4141:6;:13;4123:32;;:17;:32::i;:::-;4081:74;4165:19;;-1:-1:-1;;;;;4165:19:0;;;;;;;;1483:1;1262;;3731:460;;;:::o;3176:332:1:-;3259:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1714:28;;;;:13;:28;;;;;;;;3304:10:1;-1:-1:-1;;;;;1714:35:0;;;;;;;;;;:28;;3304:10:1;1714:35:0;;1713:36;1709:59;;;1763:5;;;1709:59;1996:12;:27;;;;;;;;;;:36;;;3336:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3377:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;3449:5;3406:28;;;:13;:28;;;;;;;;-1:-1:-1;;;;;3435:10:1;3406:40;;;;;;;;;:48;;-1:-1:-1;;3406:48:1;;;3464:37;3420:13;;3464:37;;;1222:1;2061::0;;1778;;1483;;;3176:332:1;;;:::o;910:40:0:-;;;;;;;;;;;;;;;:::o;840:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3320:573:2:-;3553:22;1996:27:0;;;;;;;;;;:36;;;3425:13:2;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3463:13:2;1298:26:1;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1418:22:2;1443:27;;;;;;;;;;;1511:14;;-1:-1:-1;;;;;1511:14:2;1488:38;;:22;:38;;;;;;;3524:13;;1443:27;1488:38;;1480:47;;;;;;;;1121:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;1556:7;;;;1545:22;;;;;;;;-1:-1:-1;;1545:22:2;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1545:69:2;;;;:22;;1121:60;1545:22;;1556:7;1545:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1565:1;1545:10;:22::i;:::-;-1:-1:-1;;;;;;1545:69:2;;1537:78;;;;;;3578:12;:27;;;;;;;;;;;;3615:11;;;:18;;-1:-1:-1;;3615:18:2;3629:4;3615:18;;;;;;3701:14;;3727:8;;;;3701:44;;3737:7;;;;3701:44;;3578:27;;-1:-1:-1;;;;;;3701:14:2;;;;3727:8;3737:7;;3701:44;;;;3737:7;;-1:-1:-1;;3701:44:2;;;;3615:18;3701:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3697:190;;;3759:24;;3769:13;;3759:24;;;;;3697:190;;;3812:31;;3829:13;;3812:31;;;;;3857:11;;;:19;;-1:-1:-1;;3857:19:2;;;3697:190;1625:1;1335::1;;;2061::0;;3320:573:2;;;;:::o;1029:29:1:-;;;;:::o;9156:319:0:-;9263:10;;9289:179;9306:16;;9304:1;:18;9289:179;;;9348:7;:36;;;;-1:-1:-1;9360:12:0;:15;;;;;;;;;;:24;;;;;9359:25;9348:36;:92;;;;9404:8;:36;;;;-1:-1:-1;9416:12:0;:15;;;;;;;;;;:24;;;;;9404:36;9348:92;9341:127;;;9467:1;9458:10;;;;9341:127;9289:179;9324:3;;9289:179;;;9156:319;;;;;;:::o;2895:289:2:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;3020:18:2;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;-1:-1:-1;;;;;3054:42:2;;;;;;:22;:42;;;;;;;;;:57;;-1:-1:-1;;3054:57:2;;;;;;;;;;3121:56;;;;;;;;;;;;;;;;;;;;;2166:1:0;1262;;2895:289:2;;;:::o;3331:277:0:-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;3424:5;;1332:14;;1328:37;;;1360:5;;;1328:37;3447:5;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;3479:6;:13;;;;3495:1;3479:17;3498:8;;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;-1:-1:-1;;;;;3522:14:0;;;;;;:7;:14;;;;;:21;;-1:-1:-1;;3522:21:0;3539:4;3522:21;;;;;;3553:6;:18;;:6;;:18;;;:6;:18;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;3553:18:0;;;;;;;;;;;;;;;;;;;;;3581:20;;3553:18;;-1:-1:-1;3581:20:0;;-1:-1:-1;;3581:20:0;2412:1;2166;;;1375;;1262;;3331:277;;:::o;7324:337::-;7414:4;;;7458:197;7475:6;:13;7473:15;;7458:197;;;7513:28;;;;:13;:28;;;;;7542:6;:9;;7513:28;;;7549:1;;7542:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7542:9:0;;;;;;;;7513:39;;;;;;;;;;;-1:-1:-1;7513:39:0;;;;7509:71;;;7579:1;7570:10;;;;7509:71;7607:8;;7598:5;:17;7594:50;;;7640:4;7633:11;;;;7594:50;7458:197;7490:3;;7458:197;;;7324:337;;;;;;:::o;2301:186:1:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;2398:17:1;:38;;;2446:34;;;;;;;;;;;;;;;;;1262:1:0;2301:186:1;;:::o;981:55:2:-;;;;;;;;;;;;;;;:::o;8642:252:0:-;8741:10;;8767:120;8784:6;:13;8782:15;;8767:120;;;8820:28;;;;:13;:28;;;;;8849:6;:9;;8820:28;;;8856:1;;8849:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8849:9:0;;;;;;;;8820:39;;;;;;;;;;;-1:-1:-1;8820:39:0;;;;8816:71;;;8886:1;8877:10;;;;8816:71;8767:120;8799:3;;8767:120;;;8642:252;;;;;:::o;785:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;:::o;9559:115::-;9629:9;;:::i;:::-;9661:6;9654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9654:13:0;;;;;;;;;;;;;;;;;;;;;;;9559:115;;:::o;10777:676::-;10902:22;;:::i;:::-;10940:32;;:::i;:::-;11013:10;11037:6;10986:16;;10975:28;;;;;;;;;;;;;;;;;;;;;;;;;10940:63;;11026:1;11013:14;;11060:1;11058:3;;11053:250;11065:16;;11063:1;:18;11053:250;;;11107:7;:36;;;;-1:-1:-1;11119:12:0;:15;;;;;;;;;;:24;;;;;11118:25;11107:36;:92;;;;11163:8;:36;;;;-1:-1:-1;11175:12:0;:15;;;;;;;;;;:24;;;;;11163:36;11107:92;11100:203;;;11259:1;11231:18;11250:5;11231:25;;;;;;;;;;;;;;;;;;:29;11287:1;11278:10;;;;;11100:203;11053:250;11083:3;;11053:250;;;11346:4;11341:2;:9;11330:21;;;;;;;;;;;;;;;;;;;;;;;;;11312:39;;11368:4;11366:6;;11361:85;11376:2;11374:1;:4;11361:85;;;11425:18;11444:1;11425:21;;;;;;;;;;;;;;;;;;11397:15;11417:4;11413:1;:8;11397:25;;;;;;;;;;;;;;;;;;:49;11361:85;11380:3;;11361:85;;;10777:676;;;;;;;;;;:::o;9853:575::-;9948:24;;:::i;:::-;9988:34;;:::i;:::-;10039:6;:13;10025:28;;10063:10;;;;10025:28;;;;;;;;;;;;;;;;;;;;;;;9988:65;;10076:1;10063:14;;10110:1;10108:3;;10103:186;10115:6;:13;10113:15;;10103:186;;;10151:28;;;;:13;:28;;;;;10180:6;:9;;10151:28;;;10187:1;;10180:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10180:9:0;;;;;;;;10151:39;;;;;;;;;;;-1:-1:-1;10151:39:0;;;;10147:142;;;10237:6;:9;;10244:1;;10237:9;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10237:9:0;10210:17;10228:5;10210:24;;;;;;;;;;-1:-1:-1;;;;;10210:36:0;;;:24;;;;;;;;;;:36;10273:1;10264:10;;;;;10147:142;10103:186;10130:3;;10103:186;;;10329:5;10315:20;;;;;;;;;;;;;;;;;;;;;;;;;10298:37;;10352:1;10350:3;;10345:76;10357:5;10355:1;:7;10345:76;;;10401:17;10419:1;10401:20;;;;;;;;;;;;;;;;;;10381:14;10396:1;10381:17;;;;;;;;;;-1:-1:-1;;;;;10381:40:0;;;:17;;;;;;;;;;:40;10345:76;10364:3;;10345:76;;;9853:575;;;;;;;:::o;1011:28::-;;;;:::o;5010:207::-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;5112:6;:13;5127:9;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;5152:8;:20;;;5182:28;;;;;;;;;;;;;;;;;2412:1;1262;;;5010:207;;:::o;2593:459:1:-;2676:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1558:12;:27;;;;;;;;;;:39;2714:13:1;;-1:-1:-1;;;;;1558:39:0;:44;1554:67;;;1616:5;;;1554:67;1863:28;;;;:13;:28;;;;;;;;2765:10:1;-1:-1:-1;;;;;1863:35:0;;;;;;;;;;:28;;2765:10:1;1863:35:0;;1859:58;;;1912:5;;;1859:58;2803:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;2832:28;;;;2875:4;2832:28;;;;;;;;-1:-1:-1;;;;;2861:10:1;2832:40;;;;;;;;;:47;;-1:-1:-1;;2832:47:1;;;;;;;2889:39;;2846:13;;2889:39;;;2942:26;2954:13;2942:11;:26::i;:::-;2938:108;;;2984:51;3004:13;3019:15;2984:19;:51::i;:::-;2938:108;1222:1;1927::0;;1631;;;1483;;2593:459:1;;;:::o;5476:244:0:-;5580:18;5630:40;5645:11;5658:5;5665:4;5630:14;:40::i;:::-;5614:56;;5680:33;5699:13;5680:18;:33::i;:::-;5476:244;;;;;;:::o;1065:47:1:-;;;;;;;;;;;;;:::o;237:41:0:-;276:2;237:41;:::o;985:20::-;;;;:::o;4390:449::-;4561:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;4499:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;4532:8;;1332:14;;1328:37;;;1360:5;;;1328:37;4568:1;4561:8;;4556:149;4573:6;:13;4571:15;;4556:149;;;4622:5;-1:-1:-1;;;;;4609:18:0;:6;4616:1;4609:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4609:9:0;-1:-1:-1;;;;;4609:18:0;;4605:100;;;4659:8;4647:6;4654:1;4647:9;;;;;;;;;;;;;;;;;;;;:20;;;;;-1:-1:-1;;;;;4647:20:0;;;;;-1:-1:-1;;;;;4647:20:0;;;;;;4685:5;;4605:100;4556:149;4588:3;;;;;4556:149;;;-1:-1:-1;;;;;4714:14:0;;;4731:5;4714:14;;;:7;:14;;;;;;:22;;-1:-1:-1;;4714:22:0;;;;;;4746:17;;;;;;;;:24;;;;;4714:22;4746:24;;;;4780:19;;4714:14;;4780:19;;;4809:23;;-1:-1:-1;;;;;4809:23:0;;;;;;;;1375:1;1483;;1262;;4390:449;;;;:::o;3622:472:1:-;3808:22;1996:27:0;;;;;;;;;;:36;;;3705:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3743:13:1;1298:26;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1463:17;;1428:32;;;;:17;:32;;;;;;3779:13;;1428:52;1409:15;:71;;1401:80;;;;;;3833:12;:27;;;;;;;;;;;;3870:11;;;:18;;-1:-1:-1;;3870:18:1;3884:4;3870:18;;;;;;3902:14;;3928:8;;;;3902:44;;3938:7;;;;3902:44;;3833:27;;-1:-1:-1;;;;;;3902:14:1;;;;3928:8;3938:7;;3902:44;;;;3938:7;;-1:-1:-1;;3902:44:1;;;;3870:18;3902:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3898:190;;;3960:24;;3970:13;;3960:24;;;;;3898:190;;;4013:31;;4030:13;;4013:31;;;;;4058:11;;;:19;;-1:-1:-1;;4058:19:1;;;3898:190;1491:1;1335;;2061::0;;3622:472:1;;;;:::o;4135:471:2:-;4242:13;4291:5;4299:1;4291:9;4279:1;:8;:21;;4271:30;;;;;;;;-1:-1:-1;4357:2:2;4350:3;;4344:5;-1:-1:-1;;;;;;4488:3:2;4135:471;;;;;:::o;4204:223:1:-;4307:32;;;;:17;:32;;;;;;;;;:51;;;4368:52;;;;;;;4325:13;;4368:52;;;;;;;;;4204:223;;;:::o;7994:451:0:-;8126:18;8096:11;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;8176:16;;8232:140;;;;;;;;-1:-1:-1;;;;;8232:140:0;;;;;;;;;;;;;;;;;;-1:-1:-1;8232:140:0;;;;;;8202:27;;;;;;;;;;:170;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;-1:-1:-1;8202:170:0;;;;;;;8176:16;;-1:-1:-1;8232:140:0;;8202:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8202:170:0;;;;;;;;;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;8382:16;:21;;-1:-1:-1;8382:21:0;;;8413:25;;8424:13;;8413:25;;-1:-1:-1;;8413:25:0;2166:1;7994:451;;;;;;;:::o;663:3945:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;663:3945:2;;;:::o;:::-;;;;;;;;;;-1:-1:-1;663:3945:2;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;663:3945:2;;;-1:-1:-1;663:3945:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o",
+ "linkReferences": {}
+ },
+ "methodIdentifiers": {
+ "MAX_OWNER_COUNT()": "d74f8edd",
+ "addOwner(address)": "7065cb48",
+ "changeRequirement(uint256)": "ba51a6df",
+ "changeTimeLock(uint256)": "7ad28c51",
+ "confirmTransaction(uint256)": "c01a8c84",
+ "confirmationTimes(uint256)": "d38f2d82",
+ "confirmations(uint256,address)": "3411c81c",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "3589b35c",
+ "executeTransaction(uint256)": "ee22610b",
+ "getConfirmationCount(uint256)": "8b51d13f",
+ "getConfirmations(uint256)": "b5dc40c3",
+ "getOwners()": "a0e67e2b",
+ "getTransactionCount(bool,bool)": "54741525",
+ "getTransactionIds(uint256,uint256,bool,bool)": "a8abe69a",
+ "isAssetProxyRegistered(address)": "83250f79",
+ "isConfirmed(uint256)": "784547a7",
+ "isOwner(address)": "2f54bf6e",
+ "owners(uint256)": "025e7c27",
+ "registerAssetProxy(address,bool)": "5a1a66af",
+ "removeOwner(address)": "173825d9",
+ "replaceOwner(address,address)": "e20056e6",
+ "required()": "dc8452cd",
+ "revokeConfirmation(uint256)": "20ea8d86",
+ "secondsTimeLocked()": "37bd78a0",
+ "submitTransaction(address,uint256,bytes)": "c6427474",
+ "transactionCount()": "b77bf600",
+ "transactions(uint256)": "9ace38c2"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "1426800",
+ "executionCost": "infinite"
+ },
+ "internal": {
+ "readBytes4(bytes memory,uint256)": "infinite"
+ },
+ "external": {
+ "": "2187",
+ "MAX_OWNER_COUNT()": "1550",
+ "addOwner(address)": "infinite",
+ "changeRequirement(uint256)": "21901",
+ "changeTimeLock(uint256)": "21560",
+ "confirmTransaction(uint256)": "infinite",
+ "confirmationTimes(uint256)": "1550",
+ "confirmations(uint256,address)": "1550",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "infinite",
+ "executeTransaction(uint256)": "infinite",
+ "getConfirmationCount(uint256)": "infinite",
+ "getConfirmations(uint256)": "infinite",
+ "getOwners()": "infinite",
+ "getTransactionCount(bool,bool)": "infinite",
+ "getTransactionIds(uint256,uint256,bool,bool)": "infinite",
+ "isAssetProxyRegistered(address)": "1550",
+ "isConfirmed(uint256)": "infinite",
+ "isOwner(address)": "1550",
+ "owners(uint256)": "1550",
+ "registerAssetProxy(address,bool)": "22074",
+ "removeOwner(address)": "infinite",
+ "replaceOwner(address,address)": "infinite",
+ "required()": "1550",
+ "revokeConfirmation(uint256)": "infinite",
+ "secondsTimeLocked()": "1550",
+ "submitTransaction(address,uint256,bytes)": "infinite",
+ "transactionCount()": "1550",
+ "transactions(uint256)": "infinite"
+ }
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/multisig/MultiSigWallet.sol": {
+ "id": "0",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 458,
+ "name": "PragmaDirective",
+ "src": "19:24:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 1419
+ ],
+ "name": "MultiSigWallet"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "MAX_OWNER_COUNT",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 459,
+ "name": "ElementaryTypeName",
+ "src": "237:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3530",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 50",
+ "value": "50"
+ },
+ "id": 460,
+ "name": "Literal",
+ "src": "276:2:0"
+ }
+ ],
+ "id": 461,
+ "name": "VariableDeclaration",
+ "src": "237:41:0"
+ },
+ {
+ "attributes": {
+ "name": "Confirmation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 462,
+ "name": "ElementaryTypeName",
+ "src": "304:7:0"
+ }
+ ],
+ "id": 463,
+ "name": "VariableDeclaration",
+ "src": "304:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 464,
+ "name": "ElementaryTypeName",
+ "src": "328:4:0"
+ }
+ ],
+ "id": 465,
+ "name": "VariableDeclaration",
+ "src": "328:26:0"
+ }
+ ],
+ "id": 466,
+ "name": "ParameterList",
+ "src": "303:52:0"
+ }
+ ],
+ "id": 467,
+ "name": "EventDefinition",
+ "src": "285:71:0"
+ },
+ {
+ "attributes": {
+ "name": "Revocation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 468,
+ "name": "ElementaryTypeName",
+ "src": "378:7:0"
+ }
+ ],
+ "id": 469,
+ "name": "VariableDeclaration",
+ "src": "378:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 470,
+ "name": "ElementaryTypeName",
+ "src": "402:4:0"
+ }
+ ],
+ "id": 471,
+ "name": "VariableDeclaration",
+ "src": "402:26:0"
+ }
+ ],
+ "id": 472,
+ "name": "ParameterList",
+ "src": "377:52:0"
+ }
+ ],
+ "id": 473,
+ "name": "EventDefinition",
+ "src": "361:69:0"
+ },
+ {
+ "attributes": {
+ "name": "Submission"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 474,
+ "name": "ElementaryTypeName",
+ "src": "452:4:0"
+ }
+ ],
+ "id": 475,
+ "name": "VariableDeclaration",
+ "src": "452:26:0"
+ }
+ ],
+ "id": 476,
+ "name": "ParameterList",
+ "src": "451:28:0"
+ }
+ ],
+ "id": 477,
+ "name": "EventDefinition",
+ "src": "435:45:0"
+ },
+ {
+ "attributes": {
+ "name": "Execution"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 478,
+ "name": "ElementaryTypeName",
+ "src": "501:4:0"
+ }
+ ],
+ "id": 479,
+ "name": "VariableDeclaration",
+ "src": "501:26:0"
+ }
+ ],
+ "id": 480,
+ "name": "ParameterList",
+ "src": "500:28:0"
+ }
+ ],
+ "id": 481,
+ "name": "EventDefinition",
+ "src": "485:44:0"
+ },
+ {
+ "attributes": {
+ "name": "ExecutionFailure"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 482,
+ "name": "ElementaryTypeName",
+ "src": "557:4:0"
+ }
+ ],
+ "id": 483,
+ "name": "VariableDeclaration",
+ "src": "557:26:0"
+ }
+ ],
+ "id": 484,
+ "name": "ParameterList",
+ "src": "556:28:0"
+ }
+ ],
+ "id": 485,
+ "name": "EventDefinition",
+ "src": "534:51:0"
+ },
+ {
+ "attributes": {
+ "name": "Deposit"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 486,
+ "name": "ElementaryTypeName",
+ "src": "604:7:0"
+ }
+ ],
+ "id": 487,
+ "name": "VariableDeclaration",
+ "src": "604:22:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 488,
+ "name": "ElementaryTypeName",
+ "src": "628:4:0"
+ }
+ ],
+ "id": 489,
+ "name": "VariableDeclaration",
+ "src": "628:10:0"
+ }
+ ],
+ "id": 490,
+ "name": "ParameterList",
+ "src": "603:36:0"
+ }
+ ],
+ "id": 491,
+ "name": "EventDefinition",
+ "src": "590:50:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerAddition"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 492,
+ "name": "ElementaryTypeName",
+ "src": "665:7:0"
+ }
+ ],
+ "id": 493,
+ "name": "VariableDeclaration",
+ "src": "665:21:0"
+ }
+ ],
+ "id": 494,
+ "name": "ParameterList",
+ "src": "664:23:0"
+ }
+ ],
+ "id": 495,
+ "name": "EventDefinition",
+ "src": "645:43:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerRemoval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 496,
+ "name": "ElementaryTypeName",
+ "src": "712:7:0"
+ }
+ ],
+ "id": 497,
+ "name": "VariableDeclaration",
+ "src": "712:21:0"
+ }
+ ],
+ "id": 498,
+ "name": "ParameterList",
+ "src": "711:23:0"
+ }
+ ],
+ "id": 499,
+ "name": "EventDefinition",
+ "src": "693:42:0"
+ },
+ {
+ "attributes": {
+ "name": "RequirementChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 500,
+ "name": "ElementaryTypeName",
+ "src": "764:4:0"
+ }
+ ],
+ "id": 501,
+ "name": "VariableDeclaration",
+ "src": "764:13:0"
+ }
+ ],
+ "id": 502,
+ "name": "ParameterList",
+ "src": "763:15:0"
+ }
+ ],
+ "id": 503,
+ "name": "EventDefinition",
+ "src": "740:39:0"
+ },
+ {
+ "attributes": {
+ "name": "transactions",
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 504,
+ "name": "ElementaryTypeName",
+ "src": "794:4:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 505,
+ "name": "UserDefinedTypeName",
+ "src": "802:11:0"
+ }
+ ],
+ "id": 506,
+ "name": "Mapping",
+ "src": "785:29:0"
+ }
+ ],
+ "id": 507,
+ "name": "VariableDeclaration",
+ "src": "785:49:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmations",
+ "type": "mapping(uint256 => mapping(address => bool))"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 508,
+ "name": "ElementaryTypeName",
+ "src": "849:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 509,
+ "name": "ElementaryTypeName",
+ "src": "866:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 510,
+ "name": "ElementaryTypeName",
+ "src": "877:4:0"
+ }
+ ],
+ "id": 511,
+ "name": "Mapping",
+ "src": "857:25:0"
+ }
+ ],
+ "id": 512,
+ "name": "Mapping",
+ "src": "840:43:0"
+ }
+ ],
+ "id": 513,
+ "name": "VariableDeclaration",
+ "src": "840:64:0"
+ },
+ {
+ "attributes": {
+ "name": "isOwner",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 514,
+ "name": "ElementaryTypeName",
+ "src": "919:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 515,
+ "name": "ElementaryTypeName",
+ "src": "930:4:0"
+ }
+ ],
+ "id": 516,
+ "name": "Mapping",
+ "src": "910:25:0"
+ }
+ ],
+ "id": 517,
+ "name": "VariableDeclaration",
+ "src": "910:40:0"
+ },
+ {
+ "attributes": {
+ "name": "owners",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 518,
+ "name": "ElementaryTypeName",
+ "src": "956:7:0"
+ }
+ ],
+ "id": 519,
+ "name": "ArrayTypeName",
+ "src": "956:9:0"
+ }
+ ],
+ "id": 520,
+ "name": "VariableDeclaration",
+ "src": "956:23:0"
+ },
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 521,
+ "name": "ElementaryTypeName",
+ "src": "985:4:0"
+ }
+ ],
+ "id": 522,
+ "name": "VariableDeclaration",
+ "src": "985:20:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 523,
+ "name": "ElementaryTypeName",
+ "src": "1011:4:0"
+ }
+ ],
+ "id": 524,
+ "name": "VariableDeclaration",
+ "src": "1011:28:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 525,
+ "name": "ElementaryTypeName",
+ "src": "1075:7:0"
+ }
+ ],
+ "id": 526,
+ "name": "VariableDeclaration",
+ "src": "1075:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 527,
+ "name": "ElementaryTypeName",
+ "src": "1104:4:0"
+ }
+ ],
+ "id": 528,
+ "name": "VariableDeclaration",
+ "src": "1104:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 529,
+ "name": "ElementaryTypeName",
+ "src": "1124:5:0"
+ }
+ ],
+ "id": 530,
+ "name": "VariableDeclaration",
+ "src": "1124:10:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 531,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 532,
+ "name": "VariableDeclaration",
+ "src": "1144:13:0"
+ }
+ ],
+ "id": 533,
+ "name": "StructDefinition",
+ "src": "1046:118:0"
+ },
+ {
+ "attributes": {
+ "name": "onlyWallet"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 534,
+ "name": "ParameterList",
+ "src": "1189:2:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 535,
+ "name": "Identifier",
+ "src": "1206:3:0"
+ }
+ ],
+ "id": 536,
+ "name": "MemberAccess",
+ "src": "1206:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 537,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1220:7:0"
+ },
+ {
+ "attributes": {
+ "type": "contract MultiSigWallet",
+ "value": "this"
+ },
+ "id": 538,
+ "name": "Identifier",
+ "src": "1228:4:0"
+ }
+ ],
+ "id": 539,
+ "name": "FunctionCall",
+ "src": "1220:13:0"
+ }
+ ],
+ "id": 540,
+ "name": "BinaryOperation",
+ "src": "1206:27:0"
+ },
+ {
+ "children": [],
+ "id": 541,
+ "name": "Throw",
+ "src": "1247:5:0"
+ }
+ ],
+ "id": 542,
+ "name": "IfStatement",
+ "src": "1202:50:0"
+ },
+ {
+ "id": 543,
+ "name": "PlaceholderStatement",
+ "src": "1262:1:0"
+ }
+ ],
+ "id": 544,
+ "name": "Block",
+ "src": "1192:78:0"
+ }
+ ],
+ "id": 545,
+ "name": "ModifierDefinition",
+ "src": "1170:100:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerDoesNotExist"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 546,
+ "name": "ElementaryTypeName",
+ "src": "1303:7:0"
+ }
+ ],
+ "id": 547,
+ "name": "VariableDeclaration",
+ "src": "1303:13:0"
+ }
+ ],
+ "id": 548,
+ "name": "ParameterList",
+ "src": "1302:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 549,
+ "name": "Identifier",
+ "src": "1332:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 550,
+ "name": "Identifier",
+ "src": "1340:5:0"
+ }
+ ],
+ "id": 551,
+ "name": "IndexAccess",
+ "src": "1332:14:0"
+ },
+ {
+ "children": [],
+ "id": 552,
+ "name": "Throw",
+ "src": "1360:5:0"
+ }
+ ],
+ "id": 553,
+ "name": "IfStatement",
+ "src": "1328:37:0"
+ },
+ {
+ "id": 554,
+ "name": "PlaceholderStatement",
+ "src": "1375:1:0"
+ }
+ ],
+ "id": 555,
+ "name": "Block",
+ "src": "1318:65:0"
+ }
+ ],
+ "id": 556,
+ "name": "ModifierDefinition",
+ "src": "1276:107:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 557,
+ "name": "ElementaryTypeName",
+ "src": "1410:7:0"
+ }
+ ],
+ "id": 558,
+ "name": "VariableDeclaration",
+ "src": "1410:13:0"
+ }
+ ],
+ "id": 559,
+ "name": "ParameterList",
+ "src": "1409:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 560,
+ "name": "Identifier",
+ "src": "1440:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 561,
+ "name": "Identifier",
+ "src": "1448:5:0"
+ }
+ ],
+ "id": 562,
+ "name": "IndexAccess",
+ "src": "1440:14:0"
+ }
+ ],
+ "id": 563,
+ "name": "UnaryOperation",
+ "src": "1439:15:0"
+ },
+ {
+ "children": [],
+ "id": 564,
+ "name": "Throw",
+ "src": "1468:5:0"
+ }
+ ],
+ "id": 565,
+ "name": "IfStatement",
+ "src": "1435:38:0"
+ },
+ {
+ "id": 566,
+ "name": "PlaceholderStatement",
+ "src": "1483:1:0"
+ }
+ ],
+ "id": 567,
+ "name": "Block",
+ "src": "1425:66:0"
+ }
+ ],
+ "id": 568,
+ "name": "ModifierDefinition",
+ "src": "1389:102:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 569,
+ "name": "ElementaryTypeName",
+ "src": "1524:4:0"
+ }
+ ],
+ "id": 570,
+ "name": "VariableDeclaration",
+ "src": "1524:18:0"
+ }
+ ],
+ "id": 571,
+ "name": "ParameterList",
+ "src": "1523:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 572,
+ "name": "Identifier",
+ "src": "1558:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 573,
+ "name": "Identifier",
+ "src": "1571:13:0"
+ }
+ ],
+ "id": 574,
+ "name": "IndexAccess",
+ "src": "1558:27:0"
+ }
+ ],
+ "id": 575,
+ "name": "MemberAccess",
+ "src": "1558:39:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 576,
+ "name": "Literal",
+ "src": "1601:1:0"
+ }
+ ],
+ "id": 577,
+ "name": "BinaryOperation",
+ "src": "1558:44:0"
+ },
+ {
+ "children": [],
+ "id": 578,
+ "name": "Throw",
+ "src": "1616:5:0"
+ }
+ ],
+ "id": 579,
+ "name": "IfStatement",
+ "src": "1554:67:0"
+ },
+ {
+ "id": 580,
+ "name": "PlaceholderStatement",
+ "src": "1631:1:0"
+ }
+ ],
+ "id": 581,
+ "name": "Block",
+ "src": "1544:95:0"
+ }
+ ],
+ "id": 582,
+ "name": "ModifierDefinition",
+ "src": "1497:142:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 583,
+ "name": "ElementaryTypeName",
+ "src": "1664:4:0"
+ }
+ ],
+ "id": 584,
+ "name": "VariableDeclaration",
+ "src": "1664:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 585,
+ "name": "ElementaryTypeName",
+ "src": "1684:7:0"
+ }
+ ],
+ "id": 586,
+ "name": "VariableDeclaration",
+ "src": "1684:13:0"
+ }
+ ],
+ "id": 587,
+ "name": "ParameterList",
+ "src": "1663:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 588,
+ "name": "Identifier",
+ "src": "1714:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 589,
+ "name": "Identifier",
+ "src": "1728:13:0"
+ }
+ ],
+ "id": 590,
+ "name": "IndexAccess",
+ "src": "1714:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 591,
+ "name": "Identifier",
+ "src": "1743:5:0"
+ }
+ ],
+ "id": 592,
+ "name": "IndexAccess",
+ "src": "1714:35:0"
+ }
+ ],
+ "id": 593,
+ "name": "UnaryOperation",
+ "src": "1713:36:0"
+ },
+ {
+ "children": [],
+ "id": 594,
+ "name": "Throw",
+ "src": "1763:5:0"
+ }
+ ],
+ "id": 595,
+ "name": "IfStatement",
+ "src": "1709:59:0"
+ },
+ {
+ "id": 596,
+ "name": "PlaceholderStatement",
+ "src": "1778:1:0"
+ }
+ ],
+ "id": 597,
+ "name": "Block",
+ "src": "1699:87:0"
+ }
+ ],
+ "id": 598,
+ "name": "ModifierDefinition",
+ "src": "1645:141:0"
+ },
+ {
+ "attributes": {
+ "name": "notConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 599,
+ "name": "ElementaryTypeName",
+ "src": "1814:4:0"
+ }
+ ],
+ "id": 600,
+ "name": "VariableDeclaration",
+ "src": "1814:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 601,
+ "name": "ElementaryTypeName",
+ "src": "1834:7:0"
+ }
+ ],
+ "id": 602,
+ "name": "VariableDeclaration",
+ "src": "1834:13:0"
+ }
+ ],
+ "id": 603,
+ "name": "ParameterList",
+ "src": "1813:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 604,
+ "name": "Identifier",
+ "src": "1863:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 605,
+ "name": "Identifier",
+ "src": "1877:13:0"
+ }
+ ],
+ "id": 606,
+ "name": "IndexAccess",
+ "src": "1863:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 607,
+ "name": "Identifier",
+ "src": "1892:5:0"
+ }
+ ],
+ "id": 608,
+ "name": "IndexAccess",
+ "src": "1863:35:0"
+ },
+ {
+ "children": [],
+ "id": 609,
+ "name": "Throw",
+ "src": "1912:5:0"
+ }
+ ],
+ "id": 610,
+ "name": "IfStatement",
+ "src": "1859:58:0"
+ },
+ {
+ "id": 611,
+ "name": "PlaceholderStatement",
+ "src": "1927:1:0"
+ }
+ ],
+ "id": 612,
+ "name": "Block",
+ "src": "1849:86:0"
+ }
+ ],
+ "id": 613,
+ "name": "ModifierDefinition",
+ "src": "1792:143:0"
+ },
+ {
+ "attributes": {
+ "name": "notExecuted"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 614,
+ "name": "ElementaryTypeName",
+ "src": "1962:4:0"
+ }
+ ],
+ "id": 615,
+ "name": "VariableDeclaration",
+ "src": "1962:18:0"
+ }
+ ],
+ "id": 616,
+ "name": "ParameterList",
+ "src": "1961:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 617,
+ "name": "Identifier",
+ "src": "1996:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 618,
+ "name": "Identifier",
+ "src": "2009:13:0"
+ }
+ ],
+ "id": 619,
+ "name": "IndexAccess",
+ "src": "1996:27:0"
+ }
+ ],
+ "id": 620,
+ "name": "MemberAccess",
+ "src": "1996:36:0"
+ },
+ {
+ "children": [],
+ "id": 621,
+ "name": "Throw",
+ "src": "2046:5:0"
+ }
+ ],
+ "id": 622,
+ "name": "IfStatement",
+ "src": "1992:59:0"
+ },
+ {
+ "id": 623,
+ "name": "PlaceholderStatement",
+ "src": "2061:1:0"
+ }
+ ],
+ "id": 624,
+ "name": "Block",
+ "src": "1982:87:0"
+ }
+ ],
+ "id": 625,
+ "name": "ModifierDefinition",
+ "src": "1941:128:0"
+ },
+ {
+ "attributes": {
+ "name": "notNull"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_address",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 626,
+ "name": "ElementaryTypeName",
+ "src": "2092:7:0"
+ }
+ ],
+ "id": 627,
+ "name": "VariableDeclaration",
+ "src": "2092:16:0"
+ }
+ ],
+ "id": 628,
+ "name": "ParameterList",
+ "src": "2091:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_address"
+ },
+ "id": 629,
+ "name": "Identifier",
+ "src": "2124:8:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 630,
+ "name": "Literal",
+ "src": "2136:1:0"
+ }
+ ],
+ "id": 631,
+ "name": "BinaryOperation",
+ "src": "2124:13:0"
+ },
+ {
+ "children": [],
+ "id": 632,
+ "name": "Throw",
+ "src": "2151:5:0"
+ }
+ ],
+ "id": 633,
+ "name": "IfStatement",
+ "src": "2120:36:0"
+ },
+ {
+ "id": 634,
+ "name": "PlaceholderStatement",
+ "src": "2166:1:0"
+ }
+ ],
+ "id": 635,
+ "name": "Block",
+ "src": "2110:64:0"
+ }
+ ],
+ "id": 636,
+ "name": "ModifierDefinition",
+ "src": "2075:99:0"
+ },
+ {
+ "attributes": {
+ "name": "validRequirement"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ownerCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 637,
+ "name": "ElementaryTypeName",
+ "src": "2206:4:0"
+ }
+ ],
+ "id": 638,
+ "name": "VariableDeclaration",
+ "src": "2206:15:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 639,
+ "name": "ElementaryTypeName",
+ "src": "2223:4:0"
+ }
+ ],
+ "id": 640,
+ "name": "VariableDeclaration",
+ "src": "2223:14:0"
+ }
+ ],
+ "id": 641,
+ "name": "ParameterList",
+ "src": "2205:33:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 642,
+ "name": "Identifier",
+ "src": "2256:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_OWNER_COUNT"
+ },
+ "id": 643,
+ "name": "Identifier",
+ "src": "2269:15:0"
+ }
+ ],
+ "id": 644,
+ "name": "BinaryOperation",
+ "src": "2256:28:0"
+ },
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 645,
+ "name": "Identifier",
+ "src": "2300:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 646,
+ "name": "Identifier",
+ "src": "2312:10:0"
+ }
+ ],
+ "id": 647,
+ "name": "BinaryOperation",
+ "src": "2300:22:0"
+ }
+ ],
+ "id": 648,
+ "name": "BinaryOperation",
+ "src": "2256:66:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 649,
+ "name": "Identifier",
+ "src": "2338:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 650,
+ "name": "Literal",
+ "src": "2351:1:0"
+ }
+ ],
+ "id": 651,
+ "name": "BinaryOperation",
+ "src": "2338:14:0"
+ }
+ ],
+ "id": 652,
+ "name": "BinaryOperation",
+ "src": "2256:96:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 653,
+ "name": "Identifier",
+ "src": "2368:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 654,
+ "name": "Literal",
+ "src": "2382:1:0"
+ }
+ ],
+ "id": 655,
+ "name": "BinaryOperation",
+ "src": "2368:15:0"
+ }
+ ],
+ "id": 656,
+ "name": "BinaryOperation",
+ "src": "2256:127:0"
+ },
+ {
+ "children": [],
+ "id": 657,
+ "name": "Throw",
+ "src": "2397:5:0"
+ }
+ ],
+ "id": 658,
+ "name": "IfStatement",
+ "src": "2249:153:0"
+ },
+ {
+ "id": 659,
+ "name": "PlaceholderStatement",
+ "src": "2412:1:0"
+ }
+ ],
+ "id": 660,
+ "name": "Block",
+ "src": "2239:181:0"
+ }
+ ],
+ "id": 661,
+ "name": "ModifierDefinition",
+ "src": "2180:240:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "payable": true,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 662,
+ "name": "ParameterList",
+ "src": "2490:2:0"
+ },
+ {
+ "children": [],
+ "id": 663,
+ "name": "ParameterList",
+ "src": "2513:0:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 664,
+ "name": "Identifier",
+ "src": "2527:3:0"
+ }
+ ],
+ "id": 665,
+ "name": "MemberAccess",
+ "src": "2527:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 666,
+ "name": "Literal",
+ "src": "2539:1:0"
+ }
+ ],
+ "id": 667,
+ "name": "BinaryOperation",
+ "src": "2527:13:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Deposit"
+ },
+ "id": 668,
+ "name": "Identifier",
+ "src": "2554:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 669,
+ "name": "Identifier",
+ "src": "2562:3:0"
+ }
+ ],
+ "id": 670,
+ "name": "MemberAccess",
+ "src": "2562:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 671,
+ "name": "Identifier",
+ "src": "2574:3:0"
+ }
+ ],
+ "id": 672,
+ "name": "MemberAccess",
+ "src": "2574:9:0"
+ }
+ ],
+ "id": 673,
+ "name": "FunctionCall",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 674,
+ "name": "ExpressionStatement",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 675,
+ "name": "IfStatement",
+ "src": "2523:61:0"
+ }
+ ],
+ "id": 676,
+ "name": "Block",
+ "src": "2513:78:0"
+ }
+ ],
+ "id": 677,
+ "name": "FunctionDefinition",
+ "src": "2482:109:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWallet",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 678,
+ "name": "ElementaryTypeName",
+ "src": "2858:7:0"
+ }
+ ],
+ "id": 679,
+ "name": "ArrayTypeName",
+ "src": "2858:9:0"
+ }
+ ],
+ "id": 680,
+ "name": "VariableDeclaration",
+ "src": "2858:17:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 681,
+ "name": "ElementaryTypeName",
+ "src": "2877:4:0"
+ }
+ ],
+ "id": 682,
+ "name": "VariableDeclaration",
+ "src": "2877:14:0"
+ }
+ ],
+ "id": 683,
+ "name": "ParameterList",
+ "src": "2857:35:0"
+ },
+ {
+ "children": [],
+ "id": 689,
+ "name": "ParameterList",
+ "src": "2964:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 684,
+ "name": "Identifier",
+ "src": "2916:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 685,
+ "name": "Identifier",
+ "src": "2933:7:0"
+ }
+ ],
+ "id": 686,
+ "name": "MemberAccess",
+ "src": "2933:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 687,
+ "name": "Identifier",
+ "src": "2949:9:0"
+ }
+ ],
+ "id": 688,
+ "name": "ModifierInvocation",
+ "src": "2916:43:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 690,
+ "name": "ElementaryTypeName",
+ "src": "2979:4:0"
+ }
+ ],
+ "id": 691,
+ "name": "VariableDeclaration",
+ "src": "2979:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 692,
+ "name": "Literal",
+ "src": "2986:1:0"
+ }
+ ],
+ "id": 693,
+ "name": "VariableDeclarationStatement",
+ "src": "2979:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 694,
+ "name": "Identifier",
+ "src": "2989:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 695,
+ "name": "Identifier",
+ "src": "2991:7:0"
+ }
+ ],
+ "id": 696,
+ "name": "MemberAccess",
+ "src": "2991:14:0"
+ }
+ ],
+ "id": 697,
+ "name": "BinaryOperation",
+ "src": "2989:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 698,
+ "name": "Identifier",
+ "src": "3007:1:0"
+ }
+ ],
+ "id": 699,
+ "name": "UnaryOperation",
+ "src": "3007:3:0"
+ }
+ ],
+ "id": 700,
+ "name": "ExpressionStatement",
+ "src": "3007:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 701,
+ "name": "Identifier",
+ "src": "3030:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 702,
+ "name": "Identifier",
+ "src": "3038:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 703,
+ "name": "Identifier",
+ "src": "3046:1:0"
+ }
+ ],
+ "id": 704,
+ "name": "IndexAccess",
+ "src": "3038:10:0"
+ }
+ ],
+ "id": 705,
+ "name": "IndexAccess",
+ "src": "3030:19:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 706,
+ "name": "Identifier",
+ "src": "3053:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 707,
+ "name": "Identifier",
+ "src": "3061:1:0"
+ }
+ ],
+ "id": 708,
+ "name": "IndexAccess",
+ "src": "3053:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 709,
+ "name": "Literal",
+ "src": "3067:1:0"
+ }
+ ],
+ "id": 710,
+ "name": "BinaryOperation",
+ "src": "3053:15:0"
+ }
+ ],
+ "id": 711,
+ "name": "BinaryOperation",
+ "src": "3030:38:0"
+ },
+ {
+ "children": [],
+ "id": 712,
+ "name": "Throw",
+ "src": "3086:5:0"
+ }
+ ],
+ "id": 713,
+ "name": "IfStatement",
+ "src": "3026:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 714,
+ "name": "Identifier",
+ "src": "3105:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 715,
+ "name": "Identifier",
+ "src": "3113:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 716,
+ "name": "Identifier",
+ "src": "3121:1:0"
+ }
+ ],
+ "id": 717,
+ "name": "IndexAccess",
+ "src": "3113:10:0"
+ }
+ ],
+ "id": 718,
+ "name": "IndexAccess",
+ "src": "3105:19:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 719,
+ "name": "Literal",
+ "src": "3127:4:0"
+ }
+ ],
+ "id": 720,
+ "name": "Assignment",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 721,
+ "name": "ExpressionStatement",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 722,
+ "name": "Block",
+ "src": "3012:130:0"
+ }
+ ],
+ "id": 723,
+ "name": "ForStatement",
+ "src": "2974:168:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 724,
+ "name": "Identifier",
+ "src": "3151:6:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 725,
+ "name": "Identifier",
+ "src": "3160:7:0"
+ }
+ ],
+ "id": 726,
+ "name": "Assignment",
+ "src": "3151:16:0"
+ }
+ ],
+ "id": 727,
+ "name": "ExpressionStatement",
+ "src": "3151:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 728,
+ "name": "Identifier",
+ "src": "3177:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 729,
+ "name": "Identifier",
+ "src": "3188:9:0"
+ }
+ ],
+ "id": 730,
+ "name": "Assignment",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 731,
+ "name": "ExpressionStatement",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 732,
+ "name": "Block",
+ "src": "2964:240:0"
+ }
+ ],
+ "id": 733,
+ "name": "FunctionDefinition",
+ "src": "2834:370:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 734,
+ "name": "ElementaryTypeName",
+ "src": "3349:7:0"
+ }
+ ],
+ "id": 735,
+ "name": "VariableDeclaration",
+ "src": "3349:13:0"
+ }
+ ],
+ "id": 736,
+ "name": "ParameterList",
+ "src": "3348:15:0"
+ },
+ {
+ "children": [],
+ "id": 752,
+ "name": "ParameterList",
+ "src": "3512:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 737,
+ "name": "Identifier",
+ "src": "3387:10:0"
+ }
+ ],
+ "id": 738,
+ "name": "ModifierInvocation",
+ "src": "3387:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 739,
+ "name": "Identifier",
+ "src": "3406:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 740,
+ "name": "Identifier",
+ "src": "3424:5:0"
+ }
+ ],
+ "id": 741,
+ "name": "ModifierInvocation",
+ "src": "3406:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 742,
+ "name": "Identifier",
+ "src": "3439:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 743,
+ "name": "Identifier",
+ "src": "3447:5:0"
+ }
+ ],
+ "id": 744,
+ "name": "ModifierInvocation",
+ "src": "3439:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 745,
+ "name": "Identifier",
+ "src": "3462:16:0"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 746,
+ "name": "Identifier",
+ "src": "3479:6:0"
+ }
+ ],
+ "id": 747,
+ "name": "MemberAccess",
+ "src": "3479:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 748,
+ "name": "Literal",
+ "src": "3495:1:0"
+ }
+ ],
+ "id": 749,
+ "name": "BinaryOperation",
+ "src": "3479:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 750,
+ "name": "Identifier",
+ "src": "3498:8:0"
+ }
+ ],
+ "id": 751,
+ "name": "ModifierInvocation",
+ "src": "3462:45:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 753,
+ "name": "Identifier",
+ "src": "3522:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 754,
+ "name": "Identifier",
+ "src": "3530:5:0"
+ }
+ ],
+ "id": 755,
+ "name": "IndexAccess",
+ "src": "3522:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 756,
+ "name": "Literal",
+ "src": "3539:4:0"
+ }
+ ],
+ "id": 757,
+ "name": "Assignment",
+ "src": "3522:21:0"
+ }
+ ],
+ "id": 758,
+ "name": "ExpressionStatement",
+ "src": "3522:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "push",
+ "type": "function (address) returns (uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 759,
+ "name": "Identifier",
+ "src": "3553:6:0"
+ }
+ ],
+ "id": 761,
+ "name": "MemberAccess",
+ "src": "3553:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 762,
+ "name": "Identifier",
+ "src": "3565:5:0"
+ }
+ ],
+ "id": 763,
+ "name": "FunctionCall",
+ "src": "3553:18:0"
+ }
+ ],
+ "id": 764,
+ "name": "ExpressionStatement",
+ "src": "3553:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 765,
+ "name": "Identifier",
+ "src": "3581:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 766,
+ "name": "Identifier",
+ "src": "3595:5:0"
+ }
+ ],
+ "id": 767,
+ "name": "FunctionCall",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 768,
+ "name": "ExpressionStatement",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 769,
+ "name": "Block",
+ "src": "3512:96:0"
+ }
+ ],
+ "id": 770,
+ "name": "FunctionDefinition",
+ "src": "3331:277:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "removeOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 771,
+ "name": "ElementaryTypeName",
+ "src": "3752:7:0"
+ }
+ ],
+ "id": 772,
+ "name": "VariableDeclaration",
+ "src": "3752:13:0"
+ }
+ ],
+ "id": 773,
+ "name": "ParameterList",
+ "src": "3751:15:0"
+ },
+ {
+ "children": [],
+ "id": 779,
+ "name": "ParameterList",
+ "src": "3832:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 774,
+ "name": "Identifier",
+ "src": "3790:10:0"
+ }
+ ],
+ "id": 775,
+ "name": "ModifierInvocation",
+ "src": "3790:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 776,
+ "name": "Identifier",
+ "src": "3809:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 777,
+ "name": "Identifier",
+ "src": "3821:5:0"
+ }
+ ],
+ "id": 778,
+ "name": "ModifierInvocation",
+ "src": "3809:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 780,
+ "name": "Identifier",
+ "src": "3842:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 781,
+ "name": "Identifier",
+ "src": "3850:5:0"
+ }
+ ],
+ "id": 782,
+ "name": "IndexAccess",
+ "src": "3842:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 783,
+ "name": "Literal",
+ "src": "3859:5:0"
+ }
+ ],
+ "id": 784,
+ "name": "Assignment",
+ "src": "3842:22:0"
+ }
+ ],
+ "id": 785,
+ "name": "ExpressionStatement",
+ "src": "3842:22:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 786,
+ "name": "ElementaryTypeName",
+ "src": "3879:4:0"
+ }
+ ],
+ "id": 787,
+ "name": "VariableDeclaration",
+ "src": "3879:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 788,
+ "name": "Literal",
+ "src": "3886:1:0"
+ }
+ ],
+ "id": 789,
+ "name": "VariableDeclarationStatement",
+ "src": "3879:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 790,
+ "name": "Identifier",
+ "src": "3889:1:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 791,
+ "name": "Identifier",
+ "src": "3891:6:0"
+ }
+ ],
+ "id": 792,
+ "name": "MemberAccess",
+ "src": "3891:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 793,
+ "name": "Literal",
+ "src": "3907:1:0"
+ }
+ ],
+ "id": 794,
+ "name": "BinaryOperation",
+ "src": "3891:17:0"
+ }
+ ],
+ "id": 795,
+ "name": "BinaryOperation",
+ "src": "3889:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 796,
+ "name": "Identifier",
+ "src": "3910:1:0"
+ }
+ ],
+ "id": 797,
+ "name": "UnaryOperation",
+ "src": "3910:3:0"
+ }
+ ],
+ "id": 798,
+ "name": "ExpressionStatement",
+ "src": "3910:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 799,
+ "name": "Identifier",
+ "src": "3931:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 800,
+ "name": "Identifier",
+ "src": "3938:1:0"
+ }
+ ],
+ "id": 801,
+ "name": "IndexAccess",
+ "src": "3931:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 802,
+ "name": "Identifier",
+ "src": "3944:5:0"
+ }
+ ],
+ "id": 803,
+ "name": "BinaryOperation",
+ "src": "3931:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 804,
+ "name": "Identifier",
+ "src": "3969:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 805,
+ "name": "Identifier",
+ "src": "3976:1:0"
+ }
+ ],
+ "id": 806,
+ "name": "IndexAccess",
+ "src": "3969:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 807,
+ "name": "Identifier",
+ "src": "3981:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 808,
+ "name": "Identifier",
+ "src": "3988:6:0"
+ }
+ ],
+ "id": 809,
+ "name": "MemberAccess",
+ "src": "3988:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 810,
+ "name": "Literal",
+ "src": "4004:1:0"
+ }
+ ],
+ "id": 811,
+ "name": "BinaryOperation",
+ "src": "3988:17:0"
+ }
+ ],
+ "id": 812,
+ "name": "IndexAccess",
+ "src": "3981:25:0"
+ }
+ ],
+ "id": 813,
+ "name": "Assignment",
+ "src": "3969:37:0"
+ }
+ ],
+ "id": 814,
+ "name": "ExpressionStatement",
+ "src": "3969:37:0"
+ },
+ {
+ "id": 815,
+ "name": "Break",
+ "src": "4024:5:0"
+ }
+ ],
+ "id": 816,
+ "name": "Block",
+ "src": "3951:93:0"
+ }
+ ],
+ "id": 817,
+ "name": "IfStatement",
+ "src": "3927:117:0"
+ }
+ ],
+ "id": 818,
+ "name": "ForStatement",
+ "src": "3874:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 819,
+ "name": "Identifier",
+ "src": "4053:6:0"
+ }
+ ],
+ "id": 821,
+ "name": "MemberAccess",
+ "src": "4053:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 822,
+ "name": "Literal",
+ "src": "4070:1:0"
+ }
+ ],
+ "id": 823,
+ "name": "Assignment",
+ "src": "4053:18:0"
+ }
+ ],
+ "id": 824,
+ "name": "ExpressionStatement",
+ "src": "4053:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 825,
+ "name": "Identifier",
+ "src": "4085:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 826,
+ "name": "Identifier",
+ "src": "4096:6:0"
+ }
+ ],
+ "id": 827,
+ "name": "MemberAccess",
+ "src": "4096:13:0"
+ }
+ ],
+ "id": 828,
+ "name": "BinaryOperation",
+ "src": "4085:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "changeRequirement"
+ },
+ "id": 829,
+ "name": "Identifier",
+ "src": "4123:17:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 830,
+ "name": "Identifier",
+ "src": "4141:6:0"
+ }
+ ],
+ "id": 831,
+ "name": "MemberAccess",
+ "src": "4141:13:0"
+ }
+ ],
+ "id": 832,
+ "name": "FunctionCall",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 833,
+ "name": "ExpressionStatement",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 834,
+ "name": "IfStatement",
+ "src": "4081:74:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 835,
+ "name": "Identifier",
+ "src": "4165:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 836,
+ "name": "Identifier",
+ "src": "4178:5:0"
+ }
+ ],
+ "id": 837,
+ "name": "FunctionCall",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 838,
+ "name": "ExpressionStatement",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 839,
+ "name": "Block",
+ "src": "3832:359:0"
+ }
+ ],
+ "id": 840,
+ "name": "FunctionDefinition",
+ "src": "3731:460:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "replaceOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 841,
+ "name": "ElementaryTypeName",
+ "src": "4412:7:0"
+ }
+ ],
+ "id": 842,
+ "name": "VariableDeclaration",
+ "src": "4412:13:0"
+ },
+ {
+ "attributes": {
+ "name": "newOwner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 843,
+ "name": "ElementaryTypeName",
+ "src": "4427:7:0"
+ }
+ ],
+ "id": 844,
+ "name": "VariableDeclaration",
+ "src": "4427:16:0"
+ }
+ ],
+ "id": 845,
+ "name": "ParameterList",
+ "src": "4411:33:0"
+ },
+ {
+ "children": [],
+ "id": 854,
+ "name": "ParameterList",
+ "src": "4546:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 846,
+ "name": "Identifier",
+ "src": "4468:10:0"
+ }
+ ],
+ "id": 847,
+ "name": "ModifierInvocation",
+ "src": "4468:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 848,
+ "name": "Identifier",
+ "src": "4487:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 849,
+ "name": "Identifier",
+ "src": "4499:5:0"
+ }
+ ],
+ "id": 850,
+ "name": "ModifierInvocation",
+ "src": "4487:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 851,
+ "name": "Identifier",
+ "src": "4514:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 852,
+ "name": "Identifier",
+ "src": "4532:8:0"
+ }
+ ],
+ "id": 853,
+ "name": "ModifierInvocation",
+ "src": "4514:27:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 855,
+ "name": "ElementaryTypeName",
+ "src": "4561:4:0"
+ }
+ ],
+ "id": 856,
+ "name": "VariableDeclaration",
+ "src": "4561:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 857,
+ "name": "Literal",
+ "src": "4568:1:0"
+ }
+ ],
+ "id": 858,
+ "name": "VariableDeclarationStatement",
+ "src": "4561:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 859,
+ "name": "Identifier",
+ "src": "4571:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 860,
+ "name": "Identifier",
+ "src": "4573:6:0"
+ }
+ ],
+ "id": 861,
+ "name": "MemberAccess",
+ "src": "4573:13:0"
+ }
+ ],
+ "id": 862,
+ "name": "BinaryOperation",
+ "src": "4571:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 863,
+ "name": "Identifier",
+ "src": "4588:1:0"
+ }
+ ],
+ "id": 864,
+ "name": "UnaryOperation",
+ "src": "4588:3:0"
+ }
+ ],
+ "id": 865,
+ "name": "ExpressionStatement",
+ "src": "4588:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 866,
+ "name": "Identifier",
+ "src": "4609:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 867,
+ "name": "Identifier",
+ "src": "4616:1:0"
+ }
+ ],
+ "id": 868,
+ "name": "IndexAccess",
+ "src": "4609:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 869,
+ "name": "Identifier",
+ "src": "4622:5:0"
+ }
+ ],
+ "id": 870,
+ "name": "BinaryOperation",
+ "src": "4609:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 871,
+ "name": "Identifier",
+ "src": "4647:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 872,
+ "name": "Identifier",
+ "src": "4654:1:0"
+ }
+ ],
+ "id": 873,
+ "name": "IndexAccess",
+ "src": "4647:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 874,
+ "name": "Identifier",
+ "src": "4659:8:0"
+ }
+ ],
+ "id": 875,
+ "name": "Assignment",
+ "src": "4647:20:0"
+ }
+ ],
+ "id": 876,
+ "name": "ExpressionStatement",
+ "src": "4647:20:0"
+ },
+ {
+ "id": 877,
+ "name": "Break",
+ "src": "4685:5:0"
+ }
+ ],
+ "id": 878,
+ "name": "Block",
+ "src": "4629:76:0"
+ }
+ ],
+ "id": 879,
+ "name": "IfStatement",
+ "src": "4605:100:0"
+ }
+ ],
+ "id": 880,
+ "name": "ForStatement",
+ "src": "4556:149:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 881,
+ "name": "Identifier",
+ "src": "4714:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 882,
+ "name": "Identifier",
+ "src": "4722:5:0"
+ }
+ ],
+ "id": 883,
+ "name": "IndexAccess",
+ "src": "4714:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 884,
+ "name": "Literal",
+ "src": "4731:5:0"
+ }
+ ],
+ "id": 885,
+ "name": "Assignment",
+ "src": "4714:22:0"
+ }
+ ],
+ "id": 886,
+ "name": "ExpressionStatement",
+ "src": "4714:22:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 887,
+ "name": "Identifier",
+ "src": "4746:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 888,
+ "name": "Identifier",
+ "src": "4754:8:0"
+ }
+ ],
+ "id": 889,
+ "name": "IndexAccess",
+ "src": "4746:17:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 890,
+ "name": "Literal",
+ "src": "4766:4:0"
+ }
+ ],
+ "id": 891,
+ "name": "Assignment",
+ "src": "4746:24:0"
+ }
+ ],
+ "id": 892,
+ "name": "ExpressionStatement",
+ "src": "4746:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 893,
+ "name": "Identifier",
+ "src": "4780:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 894,
+ "name": "Identifier",
+ "src": "4793:5:0"
+ }
+ ],
+ "id": 895,
+ "name": "FunctionCall",
+ "src": "4780:19:0"
+ }
+ ],
+ "id": 896,
+ "name": "ExpressionStatement",
+ "src": "4780:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 897,
+ "name": "Identifier",
+ "src": "4809:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 898,
+ "name": "Identifier",
+ "src": "4823:8:0"
+ }
+ ],
+ "id": 899,
+ "name": "FunctionCall",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 900,
+ "name": "ExpressionStatement",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 901,
+ "name": "Block",
+ "src": "4546:293:0"
+ }
+ ],
+ "id": 902,
+ "name": "FunctionDefinition",
+ "src": "4390:449:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeRequirement",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 903,
+ "name": "ElementaryTypeName",
+ "src": "5037:4:0"
+ }
+ ],
+ "id": 904,
+ "name": "VariableDeclaration",
+ "src": "5037:14:0"
+ }
+ ],
+ "id": 905,
+ "name": "ParameterList",
+ "src": "5036:16:0"
+ },
+ {
+ "children": [],
+ "id": 913,
+ "name": "ParameterList",
+ "src": "5142:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 906,
+ "name": "Identifier",
+ "src": "5076:10:0"
+ }
+ ],
+ "id": 907,
+ "name": "ModifierInvocation",
+ "src": "5076:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 908,
+ "name": "Identifier",
+ "src": "5095:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 909,
+ "name": "Identifier",
+ "src": "5112:6:0"
+ }
+ ],
+ "id": 910,
+ "name": "MemberAccess",
+ "src": "5112:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 911,
+ "name": "Identifier",
+ "src": "5127:9:0"
+ }
+ ],
+ "id": 912,
+ "name": "ModifierInvocation",
+ "src": "5095:42:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 914,
+ "name": "Identifier",
+ "src": "5152:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 915,
+ "name": "Identifier",
+ "src": "5163:9:0"
+ }
+ ],
+ "id": 916,
+ "name": "Assignment",
+ "src": "5152:20:0"
+ }
+ ],
+ "id": 917,
+ "name": "ExpressionStatement",
+ "src": "5152:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "RequirementChange"
+ },
+ "id": 918,
+ "name": "Identifier",
+ "src": "5182:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 919,
+ "name": "Identifier",
+ "src": "5200:9:0"
+ }
+ ],
+ "id": 920,
+ "name": "FunctionCall",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 921,
+ "name": "ExpressionStatement",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 922,
+ "name": "Block",
+ "src": "5142:75:0"
+ }
+ ],
+ "id": 923,
+ "name": "FunctionDefinition",
+ "src": "5010:207:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "submitTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 924,
+ "name": "ElementaryTypeName",
+ "src": "5503:7:0"
+ }
+ ],
+ "id": 925,
+ "name": "VariableDeclaration",
+ "src": "5503:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 926,
+ "name": "ElementaryTypeName",
+ "src": "5524:4:0"
+ }
+ ],
+ "id": 927,
+ "name": "VariableDeclaration",
+ "src": "5524:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 928,
+ "name": "ElementaryTypeName",
+ "src": "5536:5:0"
+ }
+ ],
+ "id": 929,
+ "name": "VariableDeclaration",
+ "src": "5536:10:0"
+ }
+ ],
+ "id": 930,
+ "name": "ParameterList",
+ "src": "5502:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 931,
+ "name": "ElementaryTypeName",
+ "src": "5580:4:0"
+ }
+ ],
+ "id": 932,
+ "name": "VariableDeclaration",
+ "src": "5580:18:0"
+ }
+ ],
+ "id": 933,
+ "name": "ParameterList",
+ "src": "5579:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 934,
+ "name": "Identifier",
+ "src": "5614:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256,bytes memory) returns (uint256)",
+ "value": "addTransaction"
+ },
+ "id": 935,
+ "name": "Identifier",
+ "src": "5630:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 936,
+ "name": "Identifier",
+ "src": "5645:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 937,
+ "name": "Identifier",
+ "src": "5658:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 938,
+ "name": "Identifier",
+ "src": "5665:4:0"
+ }
+ ],
+ "id": 939,
+ "name": "FunctionCall",
+ "src": "5630:40:0"
+ }
+ ],
+ "id": 940,
+ "name": "Assignment",
+ "src": "5614:56:0"
+ }
+ ],
+ "id": 941,
+ "name": "ExpressionStatement",
+ "src": "5614:56:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "confirmTransaction"
+ },
+ "id": 942,
+ "name": "Identifier",
+ "src": "5680:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 943,
+ "name": "Identifier",
+ "src": "5699:13:0"
+ }
+ ],
+ "id": 944,
+ "name": "FunctionCall",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 945,
+ "name": "ExpressionStatement",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 946,
+ "name": "Block",
+ "src": "5604:116:0"
+ }
+ ],
+ "id": 947,
+ "name": "FunctionDefinition",
+ "src": "5476:244:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 948,
+ "name": "ElementaryTypeName",
+ "src": "5854:4:0"
+ }
+ ],
+ "id": 949,
+ "name": "VariableDeclaration",
+ "src": "5854:18:0"
+ }
+ ],
+ "id": 950,
+ "name": "ParameterList",
+ "src": "5853:20:0"
+ },
+ {
+ "children": [],
+ "id": 963,
+ "name": "ParameterList",
+ "src": "6014:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 951,
+ "name": "Identifier",
+ "src": "5897:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 952,
+ "name": "Identifier",
+ "src": "5909:3:0"
+ }
+ ],
+ "id": 953,
+ "name": "MemberAccess",
+ "src": "5909:10:0"
+ }
+ ],
+ "id": 954,
+ "name": "ModifierInvocation",
+ "src": "5897:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 955,
+ "name": "Identifier",
+ "src": "5929:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 956,
+ "name": "Identifier",
+ "src": "5947:13:0"
+ }
+ ],
+ "id": 957,
+ "name": "ModifierInvocation",
+ "src": "5929:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 958,
+ "name": "Identifier",
+ "src": "5970:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 959,
+ "name": "Identifier",
+ "src": "5983:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 960,
+ "name": "Identifier",
+ "src": "5998:3:0"
+ }
+ ],
+ "id": 961,
+ "name": "MemberAccess",
+ "src": "5998:10:0"
+ }
+ ],
+ "id": 962,
+ "name": "ModifierInvocation",
+ "src": "5970:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 964,
+ "name": "Identifier",
+ "src": "6024:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 965,
+ "name": "Identifier",
+ "src": "6038:13:0"
+ }
+ ],
+ "id": 968,
+ "name": "IndexAccess",
+ "src": "6024:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 966,
+ "name": "Identifier",
+ "src": "6053:3:0"
+ }
+ ],
+ "id": 967,
+ "name": "MemberAccess",
+ "src": "6053:10:0"
+ }
+ ],
+ "id": 969,
+ "name": "IndexAccess",
+ "src": "6024:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 970,
+ "name": "Literal",
+ "src": "6067:4:0"
+ }
+ ],
+ "id": 971,
+ "name": "Assignment",
+ "src": "6024:47:0"
+ }
+ ],
+ "id": 972,
+ "name": "ExpressionStatement",
+ "src": "6024:47:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 973,
+ "name": "Identifier",
+ "src": "6081:12:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 974,
+ "name": "Identifier",
+ "src": "6094:3:0"
+ }
+ ],
+ "id": 975,
+ "name": "MemberAccess",
+ "src": "6094:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 976,
+ "name": "Identifier",
+ "src": "6106:13:0"
+ }
+ ],
+ "id": 977,
+ "name": "FunctionCall",
+ "src": "6081:39:0"
+ }
+ ],
+ "id": 978,
+ "name": "ExpressionStatement",
+ "src": "6081:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "executeTransaction"
+ },
+ "id": 979,
+ "name": "Identifier",
+ "src": "6130:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 980,
+ "name": "Identifier",
+ "src": "6149:13:0"
+ }
+ ],
+ "id": 981,
+ "name": "FunctionCall",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 982,
+ "name": "ExpressionStatement",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 983,
+ "name": "Block",
+ "src": "6014:156:0"
+ }
+ ],
+ "id": 984,
+ "name": "FunctionDefinition",
+ "src": "5826:344:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 985,
+ "name": "ElementaryTypeName",
+ "src": "6322:4:0"
+ }
+ ],
+ "id": 986,
+ "name": "VariableDeclaration",
+ "src": "6322:18:0"
+ }
+ ],
+ "id": 987,
+ "name": "ParameterList",
+ "src": "6321:20:0"
+ },
+ {
+ "children": [],
+ "id": 1000,
+ "name": "ParameterList",
+ "src": "6473:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 988,
+ "name": "Identifier",
+ "src": "6365:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 989,
+ "name": "Identifier",
+ "src": "6377:3:0"
+ }
+ ],
+ "id": 990,
+ "name": "MemberAccess",
+ "src": "6377:10:0"
+ }
+ ],
+ "id": 991,
+ "name": "ModifierInvocation",
+ "src": "6365:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 992,
+ "name": "Identifier",
+ "src": "6397:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 993,
+ "name": "Identifier",
+ "src": "6407:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 994,
+ "name": "Identifier",
+ "src": "6422:3:0"
+ }
+ ],
+ "id": 995,
+ "name": "MemberAccess",
+ "src": "6422:10:0"
+ }
+ ],
+ "id": 996,
+ "name": "ModifierInvocation",
+ "src": "6397:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 997,
+ "name": "Identifier",
+ "src": "6442:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 998,
+ "name": "Identifier",
+ "src": "6454:13:0"
+ }
+ ],
+ "id": 999,
+ "name": "ModifierInvocation",
+ "src": "6442:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1001,
+ "name": "Identifier",
+ "src": "6483:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1002,
+ "name": "Identifier",
+ "src": "6497:13:0"
+ }
+ ],
+ "id": 1005,
+ "name": "IndexAccess",
+ "src": "6483:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1003,
+ "name": "Identifier",
+ "src": "6512:3:0"
+ }
+ ],
+ "id": 1004,
+ "name": "MemberAccess",
+ "src": "6512:10:0"
+ }
+ ],
+ "id": 1006,
+ "name": "IndexAccess",
+ "src": "6483:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1007,
+ "name": "Literal",
+ "src": "6526:5:0"
+ }
+ ],
+ "id": 1008,
+ "name": "Assignment",
+ "src": "6483:48:0"
+ }
+ ],
+ "id": 1009,
+ "name": "ExpressionStatement",
+ "src": "6483:48:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 1010,
+ "name": "Identifier",
+ "src": "6541:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1011,
+ "name": "Identifier",
+ "src": "6552:3:0"
+ }
+ ],
+ "id": 1012,
+ "name": "MemberAccess",
+ "src": "6552:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1013,
+ "name": "Identifier",
+ "src": "6564:13:0"
+ }
+ ],
+ "id": 1014,
+ "name": "FunctionCall",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1015,
+ "name": "ExpressionStatement",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1016,
+ "name": "Block",
+ "src": "6473:112:0"
+ }
+ ],
+ "id": 1017,
+ "name": "FunctionDefinition",
+ "src": "6294:291:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1018,
+ "name": "ElementaryTypeName",
+ "src": "6727:4:0"
+ }
+ ],
+ "id": 1019,
+ "name": "VariableDeclaration",
+ "src": "6727:18:0"
+ }
+ ],
+ "id": 1020,
+ "name": "ParameterList",
+ "src": "6726:20:0"
+ },
+ {
+ "children": [],
+ "id": 1024,
+ "name": "ParameterList",
+ "src": "6801:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 1021,
+ "name": "Identifier",
+ "src": "6770:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1022,
+ "name": "Identifier",
+ "src": "6782:13:0"
+ }
+ ],
+ "id": 1023,
+ "name": "ModifierInvocation",
+ "src": "6770:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 1025,
+ "name": "Identifier",
+ "src": "6815:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1026,
+ "name": "Identifier",
+ "src": "6827:13:0"
+ }
+ ],
+ "id": 1027,
+ "name": "FunctionCall",
+ "src": "6815:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 1028,
+ "name": "UserDefinedTypeName",
+ "src": "6857:11:0"
+ }
+ ],
+ "id": 1029,
+ "name": "VariableDeclaration",
+ "src": "6857:14:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1030,
+ "name": "Identifier",
+ "src": "6874:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1031,
+ "name": "Identifier",
+ "src": "6887:13:0"
+ }
+ ],
+ "id": 1032,
+ "name": "IndexAccess",
+ "src": "6874:27:0"
+ }
+ ],
+ "id": 1033,
+ "name": "VariableDeclarationStatement",
+ "src": "6857:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1034,
+ "name": "Identifier",
+ "src": "6915:2:0"
+ }
+ ],
+ "id": 1036,
+ "name": "MemberAccess",
+ "src": "6915:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1037,
+ "name": "Literal",
+ "src": "6929:4:0"
+ }
+ ],
+ "id": 1038,
+ "name": "Assignment",
+ "src": "6915:18:0"
+ }
+ ],
+ "id": 1039,
+ "name": "ExpressionStatement",
+ "src": "6915:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1040,
+ "name": "Identifier",
+ "src": "6951:2:0"
+ }
+ ],
+ "id": 1041,
+ "name": "MemberAccess",
+ "src": "6951:14:0"
+ }
+ ],
+ "id": 1042,
+ "name": "MemberAccess",
+ "src": "6951:19:0"
+ }
+ ],
+ "id": 1043,
+ "name": "MemberAccess",
+ "src": "6951:25:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1044,
+ "name": "Identifier",
+ "src": "6977:2:0"
+ }
+ ],
+ "id": 1045,
+ "name": "MemberAccess",
+ "src": "6977:8:0"
+ }
+ ],
+ "id": 1046,
+ "name": "FunctionCall",
+ "src": "6951:35:0"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1047,
+ "name": "Identifier",
+ "src": "6987:2:0"
+ }
+ ],
+ "id": 1048,
+ "name": "MemberAccess",
+ "src": "6987:7:0"
+ }
+ ],
+ "id": 1049,
+ "name": "FunctionCall",
+ "src": "6951:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 1050,
+ "name": "Identifier",
+ "src": "7013:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1051,
+ "name": "Identifier",
+ "src": "7023:13:0"
+ }
+ ],
+ "id": 1052,
+ "name": "FunctionCall",
+ "src": "7013:24:0"
+ }
+ ],
+ "id": 1053,
+ "name": "ExpressionStatement",
+ "src": "7013:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 1054,
+ "name": "Identifier",
+ "src": "7074:16:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1055,
+ "name": "Identifier",
+ "src": "7091:13:0"
+ }
+ ],
+ "id": 1056,
+ "name": "FunctionCall",
+ "src": "7074:31:0"
+ }
+ ],
+ "id": 1057,
+ "name": "ExpressionStatement",
+ "src": "7074:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1058,
+ "name": "Identifier",
+ "src": "7123:2:0"
+ }
+ ],
+ "id": 1060,
+ "name": "MemberAccess",
+ "src": "7123:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1061,
+ "name": "Literal",
+ "src": "7137:5:0"
+ }
+ ],
+ "id": 1062,
+ "name": "Assignment",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1063,
+ "name": "ExpressionStatement",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1064,
+ "name": "Block",
+ "src": "7056:101:0"
+ }
+ ],
+ "id": 1065,
+ "name": "IfStatement",
+ "src": "6947:210:0"
+ }
+ ],
+ "id": 1066,
+ "name": "Block",
+ "src": "6843:324:0"
+ }
+ ],
+ "id": 1067,
+ "name": "IfStatement",
+ "src": "6811:356:0"
+ }
+ ],
+ "id": 1068,
+ "name": "Block",
+ "src": "6801:372:0"
+ }
+ ],
+ "id": 1069,
+ "name": "FunctionDefinition",
+ "src": "6699:474:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "isConfirmed",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1070,
+ "name": "ElementaryTypeName",
+ "src": "7345:4:0"
+ }
+ ],
+ "id": 1071,
+ "name": "VariableDeclaration",
+ "src": "7345:18:0"
+ }
+ ],
+ "id": 1072,
+ "name": "ParameterList",
+ "src": "7344:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1073,
+ "name": "ElementaryTypeName",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1074,
+ "name": "VariableDeclaration",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1075,
+ "name": "ParameterList",
+ "src": "7413:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1076,
+ "name": "ElementaryTypeName",
+ "src": "7434:4:0"
+ }
+ ],
+ "id": 1077,
+ "name": "VariableDeclaration",
+ "src": "7434:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1078,
+ "name": "Literal",
+ "src": "7447:1:0"
+ }
+ ],
+ "id": 1079,
+ "name": "VariableDeclarationStatement",
+ "src": "7434:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1080,
+ "name": "ElementaryTypeName",
+ "src": "7463:4:0"
+ }
+ ],
+ "id": 1081,
+ "name": "VariableDeclaration",
+ "src": "7463:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1082,
+ "name": "Literal",
+ "src": "7470:1:0"
+ }
+ ],
+ "id": 1083,
+ "name": "VariableDeclarationStatement",
+ "src": "7463:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1084,
+ "name": "Identifier",
+ "src": "7473:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1085,
+ "name": "Identifier",
+ "src": "7475:6:0"
+ }
+ ],
+ "id": 1086,
+ "name": "MemberAccess",
+ "src": "7475:13:0"
+ }
+ ],
+ "id": 1087,
+ "name": "BinaryOperation",
+ "src": "7473:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1088,
+ "name": "Identifier",
+ "src": "7490:1:0"
+ }
+ ],
+ "id": 1089,
+ "name": "UnaryOperation",
+ "src": "7490:3:0"
+ }
+ ],
+ "id": 1090,
+ "name": "ExpressionStatement",
+ "src": "7490:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1091,
+ "name": "Identifier",
+ "src": "7513:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1092,
+ "name": "Identifier",
+ "src": "7527:13:0"
+ }
+ ],
+ "id": 1093,
+ "name": "IndexAccess",
+ "src": "7513:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1094,
+ "name": "Identifier",
+ "src": "7542:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1095,
+ "name": "Identifier",
+ "src": "7549:1:0"
+ }
+ ],
+ "id": 1096,
+ "name": "IndexAccess",
+ "src": "7542:9:0"
+ }
+ ],
+ "id": 1097,
+ "name": "IndexAccess",
+ "src": "7513:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1098,
+ "name": "Identifier",
+ "src": "7570:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1099,
+ "name": "Literal",
+ "src": "7579:1:0"
+ }
+ ],
+ "id": 1100,
+ "name": "Assignment",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1101,
+ "name": "ExpressionStatement",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1102,
+ "name": "IfStatement",
+ "src": "7509:71:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1103,
+ "name": "Identifier",
+ "src": "7598:5:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 1104,
+ "name": "Identifier",
+ "src": "7607:8:0"
+ }
+ ],
+ "id": 1105,
+ "name": "BinaryOperation",
+ "src": "7598:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1106,
+ "name": "Literal",
+ "src": "7640:4:0"
+ }
+ ],
+ "id": 1107,
+ "name": "Return",
+ "src": "7633:11:0"
+ }
+ ],
+ "id": 1108,
+ "name": "IfStatement",
+ "src": "7594:50:0"
+ }
+ ],
+ "id": 1109,
+ "name": "Block",
+ "src": "7495:160:0"
+ }
+ ],
+ "id": 1110,
+ "name": "ForStatement",
+ "src": "7458:197:0"
+ }
+ ],
+ "id": 1111,
+ "name": "Block",
+ "src": "7424:237:0"
+ }
+ ],
+ "id": 1112,
+ "name": "FunctionDefinition",
+ "src": "7324:337:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addTransaction",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1113,
+ "name": "ElementaryTypeName",
+ "src": "8018:7:0"
+ }
+ ],
+ "id": 1114,
+ "name": "VariableDeclaration",
+ "src": "8018:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1115,
+ "name": "ElementaryTypeName",
+ "src": "8039:4:0"
+ }
+ ],
+ "id": 1116,
+ "name": "VariableDeclaration",
+ "src": "8039:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 1117,
+ "name": "ElementaryTypeName",
+ "src": "8051:5:0"
+ }
+ ],
+ "id": 1118,
+ "name": "VariableDeclaration",
+ "src": "8051:10:0"
+ }
+ ],
+ "id": 1119,
+ "name": "ParameterList",
+ "src": "8017:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1123,
+ "name": "ElementaryTypeName",
+ "src": "8126:4:0"
+ }
+ ],
+ "id": 1124,
+ "name": "VariableDeclaration",
+ "src": "8126:18:0"
+ }
+ ],
+ "id": 1125,
+ "name": "ParameterList",
+ "src": "8125:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 1120,
+ "name": "Identifier",
+ "src": "8088:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1121,
+ "name": "Identifier",
+ "src": "8096:11:0"
+ }
+ ],
+ "id": 1122,
+ "name": "ModifierInvocation",
+ "src": "8088:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1126,
+ "name": "Identifier",
+ "src": "8160:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1127,
+ "name": "Identifier",
+ "src": "8176:16:0"
+ }
+ ],
+ "id": 1128,
+ "name": "Assignment",
+ "src": "8160:32:0"
+ }
+ ],
+ "id": 1129,
+ "name": "ExpressionStatement",
+ "src": "8160:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1130,
+ "name": "Identifier",
+ "src": "8202:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1131,
+ "name": "Identifier",
+ "src": "8215:13:0"
+ }
+ ],
+ "id": 1132,
+ "name": "IndexAccess",
+ "src": "8202:27:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(struct MultiSigWallet.Transaction storage pointer)",
+ "value": "Transaction"
+ },
+ "id": 1133,
+ "name": "Identifier",
+ "src": "8232:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1134,
+ "name": "Identifier",
+ "src": "8271:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 1135,
+ "name": "Identifier",
+ "src": "8303:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 1136,
+ "name": "Identifier",
+ "src": "8328:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1137,
+ "name": "Literal",
+ "src": "8356:5:0"
+ }
+ ],
+ "id": 1138,
+ "name": "FunctionCall",
+ "src": "8232:140:0"
+ }
+ ],
+ "id": 1139,
+ "name": "Assignment",
+ "src": "8202:170:0"
+ }
+ ],
+ "id": 1140,
+ "name": "ExpressionStatement",
+ "src": "8202:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1141,
+ "name": "Identifier",
+ "src": "8382:16:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1142,
+ "name": "Literal",
+ "src": "8402:1:0"
+ }
+ ],
+ "id": 1143,
+ "name": "Assignment",
+ "src": "8382:21:0"
+ }
+ ],
+ "id": 1144,
+ "name": "ExpressionStatement",
+ "src": "8382:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Submission"
+ },
+ "id": 1145,
+ "name": "Identifier",
+ "src": "8413:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1146,
+ "name": "Identifier",
+ "src": "8424:13:0"
+ }
+ ],
+ "id": 1147,
+ "name": "FunctionCall",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1148,
+ "name": "ExpressionStatement",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1149,
+ "name": "Block",
+ "src": "8150:295:0"
+ }
+ ],
+ "id": 1150,
+ "name": "FunctionDefinition",
+ "src": "7994:451:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmationCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1151,
+ "name": "ElementaryTypeName",
+ "src": "8672:4:0"
+ }
+ ],
+ "id": 1152,
+ "name": "VariableDeclaration",
+ "src": "8672:18:0"
+ }
+ ],
+ "id": 1153,
+ "name": "ParameterList",
+ "src": "8671:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1154,
+ "name": "ElementaryTypeName",
+ "src": "8741:4:0"
+ }
+ ],
+ "id": 1155,
+ "name": "VariableDeclaration",
+ "src": "8741:10:0"
+ }
+ ],
+ "id": 1156,
+ "name": "ParameterList",
+ "src": "8740:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1157,
+ "name": "ElementaryTypeName",
+ "src": "8772:4:0"
+ }
+ ],
+ "id": 1158,
+ "name": "VariableDeclaration",
+ "src": "8772:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1159,
+ "name": "Literal",
+ "src": "8779:1:0"
+ }
+ ],
+ "id": 1160,
+ "name": "VariableDeclarationStatement",
+ "src": "8772:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1161,
+ "name": "Identifier",
+ "src": "8782:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1162,
+ "name": "Identifier",
+ "src": "8784:6:0"
+ }
+ ],
+ "id": 1163,
+ "name": "MemberAccess",
+ "src": "8784:13:0"
+ }
+ ],
+ "id": 1164,
+ "name": "BinaryOperation",
+ "src": "8782:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1165,
+ "name": "Identifier",
+ "src": "8799:1:0"
+ }
+ ],
+ "id": 1166,
+ "name": "UnaryOperation",
+ "src": "8799:3:0"
+ }
+ ],
+ "id": 1167,
+ "name": "ExpressionStatement",
+ "src": "8799:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1168,
+ "name": "Identifier",
+ "src": "8820:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1169,
+ "name": "Identifier",
+ "src": "8834:13:0"
+ }
+ ],
+ "id": 1170,
+ "name": "IndexAccess",
+ "src": "8820:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1171,
+ "name": "Identifier",
+ "src": "8849:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1172,
+ "name": "Identifier",
+ "src": "8856:1:0"
+ }
+ ],
+ "id": 1173,
+ "name": "IndexAccess",
+ "src": "8849:9:0"
+ }
+ ],
+ "id": 1174,
+ "name": "IndexAccess",
+ "src": "8820:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1175,
+ "name": "Identifier",
+ "src": "8877:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1176,
+ "name": "Literal",
+ "src": "8886:1:0"
+ }
+ ],
+ "id": 1177,
+ "name": "Assignment",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1178,
+ "name": "ExpressionStatement",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1179,
+ "name": "IfStatement",
+ "src": "8816:71:0"
+ }
+ ],
+ "id": 1180,
+ "name": "ForStatement",
+ "src": "8767:120:0"
+ }
+ ],
+ "id": 1181,
+ "name": "Block",
+ "src": "8757:137:0"
+ }
+ ],
+ "id": 1182,
+ "name": "FunctionDefinition",
+ "src": "8642:252:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1183,
+ "name": "ElementaryTypeName",
+ "src": "9185:4:0"
+ }
+ ],
+ "id": 1184,
+ "name": "VariableDeclaration",
+ "src": "9185:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1185,
+ "name": "ElementaryTypeName",
+ "src": "9199:4:0"
+ }
+ ],
+ "id": 1186,
+ "name": "VariableDeclaration",
+ "src": "9199:13:0"
+ }
+ ],
+ "id": 1187,
+ "name": "ParameterList",
+ "src": "9184:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1188,
+ "name": "ElementaryTypeName",
+ "src": "9263:4:0"
+ }
+ ],
+ "id": 1189,
+ "name": "VariableDeclaration",
+ "src": "9263:10:0"
+ }
+ ],
+ "id": 1190,
+ "name": "ParameterList",
+ "src": "9262:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1191,
+ "name": "ElementaryTypeName",
+ "src": "9294:4:0"
+ }
+ ],
+ "id": 1192,
+ "name": "VariableDeclaration",
+ "src": "9294:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1193,
+ "name": "Literal",
+ "src": "9301:1:0"
+ }
+ ],
+ "id": 1194,
+ "name": "VariableDeclarationStatement",
+ "src": "9294:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1195,
+ "name": "Identifier",
+ "src": "9304:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1196,
+ "name": "Identifier",
+ "src": "9306:16:0"
+ }
+ ],
+ "id": 1197,
+ "name": "BinaryOperation",
+ "src": "9304:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1198,
+ "name": "Identifier",
+ "src": "9324:1:0"
+ }
+ ],
+ "id": 1199,
+ "name": "UnaryOperation",
+ "src": "9324:3:0"
+ }
+ ],
+ "id": 1200,
+ "name": "ExpressionStatement",
+ "src": "9324:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1201,
+ "name": "Identifier",
+ "src": "9348:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1202,
+ "name": "Identifier",
+ "src": "9360:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1203,
+ "name": "Identifier",
+ "src": "9373:1:0"
+ }
+ ],
+ "id": 1204,
+ "name": "IndexAccess",
+ "src": "9360:15:0"
+ }
+ ],
+ "id": 1205,
+ "name": "MemberAccess",
+ "src": "9360:24:0"
+ }
+ ],
+ "id": 1206,
+ "name": "UnaryOperation",
+ "src": "9359:25:0"
+ }
+ ],
+ "id": 1207,
+ "name": "BinaryOperation",
+ "src": "9348:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1208,
+ "name": "Identifier",
+ "src": "9404:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1209,
+ "name": "Identifier",
+ "src": "9416:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1210,
+ "name": "Identifier",
+ "src": "9429:1:0"
+ }
+ ],
+ "id": 1211,
+ "name": "IndexAccess",
+ "src": "9416:15:0"
+ }
+ ],
+ "id": 1212,
+ "name": "MemberAccess",
+ "src": "9416:24:0"
+ }
+ ],
+ "id": 1213,
+ "name": "BinaryOperation",
+ "src": "9404:36:0"
+ }
+ ],
+ "id": 1214,
+ "name": "BinaryOperation",
+ "src": "9348:92:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1215,
+ "name": "Identifier",
+ "src": "9458:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1216,
+ "name": "Literal",
+ "src": "9467:1:0"
+ }
+ ],
+ "id": 1217,
+ "name": "Assignment",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1218,
+ "name": "ExpressionStatement",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1219,
+ "name": "IfStatement",
+ "src": "9341:127:0"
+ }
+ ],
+ "id": 1220,
+ "name": "ForStatement",
+ "src": "9289:179:0"
+ }
+ ],
+ "id": 1221,
+ "name": "Block",
+ "src": "9279:196:0"
+ }
+ ],
+ "id": 1222,
+ "name": "FunctionDefinition",
+ "src": "9156:319:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getOwners",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 1223,
+ "name": "ParameterList",
+ "src": "9577:2:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1224,
+ "name": "ElementaryTypeName",
+ "src": "9629:7:0"
+ }
+ ],
+ "id": 1225,
+ "name": "ArrayTypeName",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1226,
+ "name": "VariableDeclaration",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1227,
+ "name": "ParameterList",
+ "src": "9628:11:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1228,
+ "name": "Identifier",
+ "src": "9661:6:0"
+ }
+ ],
+ "id": 1229,
+ "name": "Return",
+ "src": "9654:13:0"
+ }
+ ],
+ "id": 1230,
+ "name": "Block",
+ "src": "9644:30:0"
+ }
+ ],
+ "id": 1231,
+ "name": "FunctionDefinition",
+ "src": "9559:115:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmations",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1232,
+ "name": "ElementaryTypeName",
+ "src": "9879:4:0"
+ }
+ ],
+ "id": 1233,
+ "name": "VariableDeclaration",
+ "src": "9879:18:0"
+ }
+ ],
+ "id": 1234,
+ "name": "ParameterList",
+ "src": "9878:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_confirmations",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1235,
+ "name": "ElementaryTypeName",
+ "src": "9948:7:0"
+ }
+ ],
+ "id": 1236,
+ "name": "ArrayTypeName",
+ "src": "9948:9:0"
+ }
+ ],
+ "id": 1237,
+ "name": "VariableDeclaration",
+ "src": "9948:24:0"
+ }
+ ],
+ "id": 1238,
+ "name": "ParameterList",
+ "src": "9947:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "confirmationsTemp",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1240,
+ "name": "ElementaryTypeName",
+ "src": "9988:7:0"
+ }
+ ],
+ "id": 1241,
+ "name": "ArrayTypeName",
+ "src": "9988:9:0"
+ }
+ ],
+ "id": 1242,
+ "name": "VariableDeclaration",
+ "src": "9988:34:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1243,
+ "name": "ElementaryTypeName",
+ "src": "10029:7:0"
+ }
+ ],
+ "id": 1244,
+ "name": "ArrayTypeName",
+ "src": "10029:9:0"
+ }
+ ],
+ "id": 1245,
+ "name": "NewExpression",
+ "src": "10025:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1246,
+ "name": "Identifier",
+ "src": "10039:6:0"
+ }
+ ],
+ "id": 1247,
+ "name": "MemberAccess",
+ "src": "10039:13:0"
+ }
+ ],
+ "id": 1248,
+ "name": "FunctionCall",
+ "src": "10025:28:0"
+ }
+ ],
+ "id": 1249,
+ "name": "VariableDeclarationStatement",
+ "src": "9988:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1250,
+ "name": "ElementaryTypeName",
+ "src": "10063:4:0"
+ }
+ ],
+ "id": 1251,
+ "name": "VariableDeclaration",
+ "src": "10063:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1252,
+ "name": "Literal",
+ "src": "10076:1:0"
+ }
+ ],
+ "id": 1253,
+ "name": "VariableDeclarationStatement",
+ "src": "10063:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1254,
+ "name": "ElementaryTypeName",
+ "src": "10087:4:0"
+ }
+ ],
+ "id": 1255,
+ "name": "VariableDeclaration",
+ "src": "10087:6:0"
+ }
+ ],
+ "id": 1256,
+ "name": "VariableDeclarationStatement",
+ "src": "10087:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1257,
+ "name": "Identifier",
+ "src": "10108:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1258,
+ "name": "Literal",
+ "src": "10110:1:0"
+ }
+ ],
+ "id": 1259,
+ "name": "Assignment",
+ "src": "10108:3:0"
+ }
+ ],
+ "id": 1260,
+ "name": "ExpressionStatement",
+ "src": "10108:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1261,
+ "name": "Identifier",
+ "src": "10113:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1262,
+ "name": "Identifier",
+ "src": "10115:6:0"
+ }
+ ],
+ "id": 1263,
+ "name": "MemberAccess",
+ "src": "10115:13:0"
+ }
+ ],
+ "id": 1264,
+ "name": "BinaryOperation",
+ "src": "10113:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1265,
+ "name": "Identifier",
+ "src": "10130:1:0"
+ }
+ ],
+ "id": 1266,
+ "name": "UnaryOperation",
+ "src": "10130:3:0"
+ }
+ ],
+ "id": 1267,
+ "name": "ExpressionStatement",
+ "src": "10130:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1268,
+ "name": "Identifier",
+ "src": "10151:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1269,
+ "name": "Identifier",
+ "src": "10165:13:0"
+ }
+ ],
+ "id": 1270,
+ "name": "IndexAccess",
+ "src": "10151:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1271,
+ "name": "Identifier",
+ "src": "10180:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1272,
+ "name": "Identifier",
+ "src": "10187:1:0"
+ }
+ ],
+ "id": 1273,
+ "name": "IndexAccess",
+ "src": "10180:9:0"
+ }
+ ],
+ "id": 1274,
+ "name": "IndexAccess",
+ "src": "10151:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1275,
+ "name": "Identifier",
+ "src": "10210:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1276,
+ "name": "Identifier",
+ "src": "10228:5:0"
+ }
+ ],
+ "id": 1277,
+ "name": "IndexAccess",
+ "src": "10210:24:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1278,
+ "name": "Identifier",
+ "src": "10237:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1279,
+ "name": "Identifier",
+ "src": "10244:1:0"
+ }
+ ],
+ "id": 1280,
+ "name": "IndexAccess",
+ "src": "10237:9:0"
+ }
+ ],
+ "id": 1281,
+ "name": "Assignment",
+ "src": "10210:36:0"
+ }
+ ],
+ "id": 1282,
+ "name": "ExpressionStatement",
+ "src": "10210:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1283,
+ "name": "Identifier",
+ "src": "10264:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1284,
+ "name": "Literal",
+ "src": "10273:1:0"
+ }
+ ],
+ "id": 1285,
+ "name": "Assignment",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1286,
+ "name": "ExpressionStatement",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1287,
+ "name": "Block",
+ "src": "10192:97:0"
+ }
+ ],
+ "id": 1288,
+ "name": "IfStatement",
+ "src": "10147:142:0"
+ }
+ ],
+ "id": 1289,
+ "name": "ForStatement",
+ "src": "10103:186:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1290,
+ "name": "Identifier",
+ "src": "10298:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1291,
+ "name": "ElementaryTypeName",
+ "src": "10319:7:0"
+ }
+ ],
+ "id": 1292,
+ "name": "ArrayTypeName",
+ "src": "10319:9:0"
+ }
+ ],
+ "id": 1293,
+ "name": "NewExpression",
+ "src": "10315:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1294,
+ "name": "Identifier",
+ "src": "10329:5:0"
+ }
+ ],
+ "id": 1295,
+ "name": "FunctionCall",
+ "src": "10315:20:0"
+ }
+ ],
+ "id": 1296,
+ "name": "Assignment",
+ "src": "10298:37:0"
+ }
+ ],
+ "id": 1297,
+ "name": "ExpressionStatement",
+ "src": "10298:37:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1298,
+ "name": "Identifier",
+ "src": "10350:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1299,
+ "name": "Literal",
+ "src": "10352:1:0"
+ }
+ ],
+ "id": 1300,
+ "name": "Assignment",
+ "src": "10350:3:0"
+ }
+ ],
+ "id": 1301,
+ "name": "ExpressionStatement",
+ "src": "10350:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1302,
+ "name": "Identifier",
+ "src": "10355:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1303,
+ "name": "Identifier",
+ "src": "10357:5:0"
+ }
+ ],
+ "id": 1304,
+ "name": "BinaryOperation",
+ "src": "10355:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1305,
+ "name": "Identifier",
+ "src": "10364:1:0"
+ }
+ ],
+ "id": 1306,
+ "name": "UnaryOperation",
+ "src": "10364:3:0"
+ }
+ ],
+ "id": 1307,
+ "name": "ExpressionStatement",
+ "src": "10364:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1308,
+ "name": "Identifier",
+ "src": "10381:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1309,
+ "name": "Identifier",
+ "src": "10396:1:0"
+ }
+ ],
+ "id": 1310,
+ "name": "IndexAccess",
+ "src": "10381:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1311,
+ "name": "Identifier",
+ "src": "10401:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1312,
+ "name": "Identifier",
+ "src": "10419:1:0"
+ }
+ ],
+ "id": 1313,
+ "name": "IndexAccess",
+ "src": "10401:20:0"
+ }
+ ],
+ "id": 1314,
+ "name": "Assignment",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1315,
+ "name": "ExpressionStatement",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1316,
+ "name": "ForStatement",
+ "src": "10345:76:0"
+ }
+ ],
+ "id": 1317,
+ "name": "Block",
+ "src": "9978:450:0"
+ }
+ ],
+ "id": 1318,
+ "name": "FunctionDefinition",
+ "src": "9853:575:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionIds",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "from",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1319,
+ "name": "ElementaryTypeName",
+ "src": "10804:4:0"
+ }
+ ],
+ "id": 1320,
+ "name": "VariableDeclaration",
+ "src": "10804:9:0"
+ },
+ {
+ "attributes": {
+ "name": "to",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1321,
+ "name": "ElementaryTypeName",
+ "src": "10815:4:0"
+ }
+ ],
+ "id": 1322,
+ "name": "VariableDeclaration",
+ "src": "10815:7:0"
+ },
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1323,
+ "name": "ElementaryTypeName",
+ "src": "10824:4:0"
+ }
+ ],
+ "id": 1324,
+ "name": "VariableDeclaration",
+ "src": "10824:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1325,
+ "name": "ElementaryTypeName",
+ "src": "10838:4:0"
+ }
+ ],
+ "id": 1326,
+ "name": "VariableDeclaration",
+ "src": "10838:13:0"
+ }
+ ],
+ "id": 1327,
+ "name": "ParameterList",
+ "src": "10803:49:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_transactionIds",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1328,
+ "name": "ElementaryTypeName",
+ "src": "10902:4:0"
+ }
+ ],
+ "id": 1329,
+ "name": "ArrayTypeName",
+ "src": "10902:6:0"
+ }
+ ],
+ "id": 1330,
+ "name": "VariableDeclaration",
+ "src": "10902:22:0"
+ }
+ ],
+ "id": 1331,
+ "name": "ParameterList",
+ "src": "10901:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionIdsTemp",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1333,
+ "name": "ElementaryTypeName",
+ "src": "10940:4:0"
+ }
+ ],
+ "id": 1334,
+ "name": "ArrayTypeName",
+ "src": "10940:6:0"
+ }
+ ],
+ "id": 1335,
+ "name": "VariableDeclaration",
+ "src": "10940:32:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1336,
+ "name": "ElementaryTypeName",
+ "src": "10979:4:0"
+ }
+ ],
+ "id": 1337,
+ "name": "ArrayTypeName",
+ "src": "10979:6:0"
+ }
+ ],
+ "id": 1338,
+ "name": "NewExpression",
+ "src": "10975:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1339,
+ "name": "Identifier",
+ "src": "10986:16:0"
+ }
+ ],
+ "id": 1340,
+ "name": "FunctionCall",
+ "src": "10975:28:0"
+ }
+ ],
+ "id": 1341,
+ "name": "VariableDeclarationStatement",
+ "src": "10940:63:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1342,
+ "name": "ElementaryTypeName",
+ "src": "11013:4:0"
+ }
+ ],
+ "id": 1343,
+ "name": "VariableDeclaration",
+ "src": "11013:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1344,
+ "name": "Literal",
+ "src": "11026:1:0"
+ }
+ ],
+ "id": 1345,
+ "name": "VariableDeclarationStatement",
+ "src": "11013:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1346,
+ "name": "ElementaryTypeName",
+ "src": "11037:4:0"
+ }
+ ],
+ "id": 1347,
+ "name": "VariableDeclaration",
+ "src": "11037:6:0"
+ }
+ ],
+ "id": 1348,
+ "name": "VariableDeclarationStatement",
+ "src": "11037:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1349,
+ "name": "Identifier",
+ "src": "11058:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1350,
+ "name": "Literal",
+ "src": "11060:1:0"
+ }
+ ],
+ "id": 1351,
+ "name": "Assignment",
+ "src": "11058:3:0"
+ }
+ ],
+ "id": 1352,
+ "name": "ExpressionStatement",
+ "src": "11058:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1353,
+ "name": "Identifier",
+ "src": "11063:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1354,
+ "name": "Identifier",
+ "src": "11065:16:0"
+ }
+ ],
+ "id": 1355,
+ "name": "BinaryOperation",
+ "src": "11063:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1356,
+ "name": "Identifier",
+ "src": "11083:1:0"
+ }
+ ],
+ "id": 1357,
+ "name": "UnaryOperation",
+ "src": "11083:3:0"
+ }
+ ],
+ "id": 1358,
+ "name": "ExpressionStatement",
+ "src": "11083:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1359,
+ "name": "Identifier",
+ "src": "11107:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1360,
+ "name": "Identifier",
+ "src": "11119:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1361,
+ "name": "Identifier",
+ "src": "11132:1:0"
+ }
+ ],
+ "id": 1362,
+ "name": "IndexAccess",
+ "src": "11119:15:0"
+ }
+ ],
+ "id": 1363,
+ "name": "MemberAccess",
+ "src": "11119:24:0"
+ }
+ ],
+ "id": 1364,
+ "name": "UnaryOperation",
+ "src": "11118:25:0"
+ }
+ ],
+ "id": 1365,
+ "name": "BinaryOperation",
+ "src": "11107:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1366,
+ "name": "Identifier",
+ "src": "11163:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1367,
+ "name": "Identifier",
+ "src": "11175:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1368,
+ "name": "Identifier",
+ "src": "11188:1:0"
+ }
+ ],
+ "id": 1369,
+ "name": "IndexAccess",
+ "src": "11175:15:0"
+ }
+ ],
+ "id": 1370,
+ "name": "MemberAccess",
+ "src": "11175:24:0"
+ }
+ ],
+ "id": 1371,
+ "name": "BinaryOperation",
+ "src": "11163:36:0"
+ }
+ ],
+ "id": 1372,
+ "name": "BinaryOperation",
+ "src": "11107:92:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1373,
+ "name": "Identifier",
+ "src": "11231:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1374,
+ "name": "Identifier",
+ "src": "11250:5:0"
+ }
+ ],
+ "id": 1375,
+ "name": "IndexAccess",
+ "src": "11231:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1376,
+ "name": "Identifier",
+ "src": "11259:1:0"
+ }
+ ],
+ "id": 1377,
+ "name": "Assignment",
+ "src": "11231:29:0"
+ }
+ ],
+ "id": 1378,
+ "name": "ExpressionStatement",
+ "src": "11231:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1379,
+ "name": "Identifier",
+ "src": "11278:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1380,
+ "name": "Literal",
+ "src": "11287:1:0"
+ }
+ ],
+ "id": 1381,
+ "name": "Assignment",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1382,
+ "name": "ExpressionStatement",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1383,
+ "name": "Block",
+ "src": "11213:90:0"
+ }
+ ],
+ "id": 1384,
+ "name": "IfStatement",
+ "src": "11100:203:0"
+ }
+ ],
+ "id": 1385,
+ "name": "ForStatement",
+ "src": "11053:250:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1386,
+ "name": "Identifier",
+ "src": "11312:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1387,
+ "name": "ElementaryTypeName",
+ "src": "11334:4:0"
+ }
+ ],
+ "id": 1388,
+ "name": "ArrayTypeName",
+ "src": "11334:6:0"
+ }
+ ],
+ "id": 1389,
+ "name": "NewExpression",
+ "src": "11330:10:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1390,
+ "name": "Identifier",
+ "src": "11341:2:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1391,
+ "name": "Identifier",
+ "src": "11346:4:0"
+ }
+ ],
+ "id": 1392,
+ "name": "BinaryOperation",
+ "src": "11341:9:0"
+ }
+ ],
+ "id": 1393,
+ "name": "FunctionCall",
+ "src": "11330:21:0"
+ }
+ ],
+ "id": 1394,
+ "name": "Assignment",
+ "src": "11312:39:0"
+ }
+ ],
+ "id": 1395,
+ "name": "ExpressionStatement",
+ "src": "11312:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1396,
+ "name": "Identifier",
+ "src": "11366:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1397,
+ "name": "Identifier",
+ "src": "11368:4:0"
+ }
+ ],
+ "id": 1398,
+ "name": "Assignment",
+ "src": "11366:6:0"
+ }
+ ],
+ "id": 1399,
+ "name": "ExpressionStatement",
+ "src": "11366:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1400,
+ "name": "Identifier",
+ "src": "11374:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1401,
+ "name": "Identifier",
+ "src": "11376:2:0"
+ }
+ ],
+ "id": 1402,
+ "name": "BinaryOperation",
+ "src": "11374:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1403,
+ "name": "Identifier",
+ "src": "11380:1:0"
+ }
+ ],
+ "id": 1404,
+ "name": "UnaryOperation",
+ "src": "11380:3:0"
+ }
+ ],
+ "id": 1405,
+ "name": "ExpressionStatement",
+ "src": "11380:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1406,
+ "name": "Identifier",
+ "src": "11397:15:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1407,
+ "name": "Identifier",
+ "src": "11413:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1408,
+ "name": "Identifier",
+ "src": "11417:4:0"
+ }
+ ],
+ "id": 1409,
+ "name": "BinaryOperation",
+ "src": "11413:8:0"
+ }
+ ],
+ "id": 1410,
+ "name": "IndexAccess",
+ "src": "11397:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1411,
+ "name": "Identifier",
+ "src": "11425:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1412,
+ "name": "Identifier",
+ "src": "11444:1:0"
+ }
+ ],
+ "id": 1413,
+ "name": "IndexAccess",
+ "src": "11425:21:0"
+ }
+ ],
+ "id": 1414,
+ "name": "Assignment",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1415,
+ "name": "ExpressionStatement",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1416,
+ "name": "ForStatement",
+ "src": "11361:85:0"
+ }
+ ],
+ "id": 1417,
+ "name": "Block",
+ "src": "10930:523:0"
+ }
+ ],
+ "id": 1418,
+ "name": "FunctionDefinition",
+ "src": "10777:676:0"
+ }
+ ],
+ "id": 1419,
+ "name": "ContractDefinition",
+ "src": "206:11249:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.sol": {
+ "id": "1",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 204,
+ "name": "PragmaDirective",
+ "src": "599:24:1"
+ },
+ {
+ "attributes": {
+ "file": "./MultiSigWallet.sol"
+ },
+ "id": 205,
+ "name": "ImportDirective",
+ "src": "625:30:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 456,
+ 1419
+ ],
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWallet"
+ },
+ "id": 206,
+ "name": "UserDefinedTypeName",
+ "src": "874:14:1"
+ }
+ ],
+ "id": 207,
+ "name": "InheritanceSpecifier",
+ "src": "874:14:1"
+ },
+ {
+ "attributes": {
+ "name": "ConfirmationTimeSet"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 208,
+ "name": "ElementaryTypeName",
+ "src": "922:4:1"
+ }
+ ],
+ "id": 209,
+ "name": "VariableDeclaration",
+ "src": "922:26:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 210,
+ "name": "ElementaryTypeName",
+ "src": "950:4:1"
+ }
+ ],
+ "id": 211,
+ "name": "VariableDeclaration",
+ "src": "950:21:1"
+ }
+ ],
+ "id": 212,
+ "name": "ParameterList",
+ "src": "921:51:1"
+ }
+ ],
+ "id": 213,
+ "name": "EventDefinition",
+ "src": "896:77:1"
+ },
+ {
+ "attributes": {
+ "name": "TimeLockChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 214,
+ "name": "ElementaryTypeName",
+ "src": "999:4:1"
+ }
+ ],
+ "id": 215,
+ "name": "VariableDeclaration",
+ "src": "999:22:1"
+ }
+ ],
+ "id": 216,
+ "name": "ParameterList",
+ "src": "998:24:1"
+ }
+ ],
+ "id": 217,
+ "name": "EventDefinition",
+ "src": "978:45:1"
+ },
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 218,
+ "name": "ElementaryTypeName",
+ "src": "1029:4:1"
+ }
+ ],
+ "id": 219,
+ "name": "VariableDeclaration",
+ "src": "1029:29:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTimes",
+ "type": "mapping(uint256 => uint256)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 220,
+ "name": "ElementaryTypeName",
+ "src": "1074:4:1"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 221,
+ "name": "ElementaryTypeName",
+ "src": "1082:4:1"
+ }
+ ],
+ "id": 222,
+ "name": "Mapping",
+ "src": "1065:22:1"
+ }
+ ],
+ "id": 223,
+ "name": "VariableDeclaration",
+ "src": "1065:47:1"
+ },
+ {
+ "attributes": {
+ "name": "notFullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 224,
+ "name": "ElementaryTypeName",
+ "src": "1146:4:1"
+ }
+ ],
+ "id": 225,
+ "name": "VariableDeclaration",
+ "src": "1146:18:1"
+ }
+ ],
+ "id": 226,
+ "name": "ParameterList",
+ "src": "1145:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "1176:7:1"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 228,
+ "name": "Identifier",
+ "src": "1185:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 229,
+ "name": "Identifier",
+ "src": "1197:13:1"
+ }
+ ],
+ "id": 230,
+ "name": "FunctionCall",
+ "src": "1185:26:1"
+ }
+ ],
+ "id": 231,
+ "name": "UnaryOperation",
+ "src": "1184:27:1"
+ }
+ ],
+ "id": 232,
+ "name": "FunctionCall",
+ "src": "1176:36:1"
+ }
+ ],
+ "id": 233,
+ "name": "ExpressionStatement",
+ "src": "1176:36:1"
+ },
+ {
+ "id": 234,
+ "name": "PlaceholderStatement",
+ "src": "1222:1:1"
+ }
+ ],
+ "id": 235,
+ "name": "Block",
+ "src": "1166:64:1"
+ }
+ ],
+ "id": 236,
+ "name": "ModifierDefinition",
+ "src": "1119:111:1"
+ },
+ {
+ "attributes": {
+ "name": "fullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 237,
+ "name": "ElementaryTypeName",
+ "src": "1260:4:1"
+ }
+ ],
+ "id": 238,
+ "name": "VariableDeclaration",
+ "src": "1260:18:1"
+ }
+ ],
+ "id": 239,
+ "name": "ParameterList",
+ "src": "1259:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "1290:7:1"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 241,
+ "name": "Identifier",
+ "src": "1298:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 242,
+ "name": "Identifier",
+ "src": "1310:13:1"
+ }
+ ],
+ "id": 243,
+ "name": "FunctionCall",
+ "src": "1298:26:1"
+ }
+ ],
+ "id": 244,
+ "name": "FunctionCall",
+ "src": "1290:35:1"
+ }
+ ],
+ "id": 245,
+ "name": "ExpressionStatement",
+ "src": "1290:35:1"
+ },
+ {
+ "id": 246,
+ "name": "PlaceholderStatement",
+ "src": "1335:1:1"
+ }
+ ],
+ "id": 247,
+ "name": "Block",
+ "src": "1280:63:1"
+ }
+ ],
+ "id": 248,
+ "name": "ModifierDefinition",
+ "src": "1236:107:1"
+ },
+ {
+ "attributes": {
+ "name": "pastTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 249,
+ "name": "ElementaryTypeName",
+ "src": "1371:4:1"
+ }
+ ],
+ "id": 250,
+ "name": "VariableDeclaration",
+ "src": "1371:18:1"
+ }
+ ],
+ "id": 251,
+ "name": "ParameterList",
+ "src": "1370:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 252,
+ "name": "Identifier",
+ "src": "1401:7:1"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 253,
+ "name": "Identifier",
+ "src": "1409:5:1"
+ }
+ ],
+ "id": 254,
+ "name": "MemberAccess",
+ "src": "1409:15:1"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 255,
+ "name": "Identifier",
+ "src": "1428:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 256,
+ "name": "Identifier",
+ "src": "1446:13:1"
+ }
+ ],
+ "id": 257,
+ "name": "IndexAccess",
+ "src": "1428:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 258,
+ "name": "Identifier",
+ "src": "1463:17:1"
+ }
+ ],
+ "id": 259,
+ "name": "BinaryOperation",
+ "src": "1428:52:1"
+ }
+ ],
+ "id": 260,
+ "name": "BinaryOperation",
+ "src": "1409:71:1"
+ }
+ ],
+ "id": 261,
+ "name": "FunctionCall",
+ "src": "1401:80:1"
+ }
+ ],
+ "id": 262,
+ "name": "ExpressionStatement",
+ "src": "1401:80:1"
+ },
+ {
+ "id": 263,
+ "name": "PlaceholderStatement",
+ "src": "1491:1:1"
+ }
+ ],
+ "id": 264,
+ "name": "Block",
+ "src": "1391:108:1"
+ }
+ ],
+ "id": 265,
+ "name": "ModifierDefinition",
+ "src": "1349:150:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWalletWithTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 266,
+ "name": "ElementaryTypeName",
+ "src": "1920:7:1"
+ }
+ ],
+ "id": 267,
+ "name": "ArrayTypeName",
+ "src": "1920:9:1"
+ }
+ ],
+ "id": 268,
+ "name": "VariableDeclaration",
+ "src": "1920:17:1"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 269,
+ "name": "ElementaryTypeName",
+ "src": "1939:4:1"
+ }
+ ],
+ "id": 270,
+ "name": "VariableDeclaration",
+ "src": "1939:14:1"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 271,
+ "name": "ElementaryTypeName",
+ "src": "1955:4:1"
+ }
+ ],
+ "id": 272,
+ "name": "VariableDeclaration",
+ "src": "1955:23:1"
+ }
+ ],
+ "id": 273,
+ "name": "ParameterList",
+ "src": "1919:60:1"
+ },
+ {
+ "children": [],
+ "id": 278,
+ "name": "ParameterList",
+ "src": "2042:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWallet)",
+ "value": "MultiSigWallet"
+ },
+ "id": 274,
+ "name": "Identifier",
+ "src": "2003:14:1"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 275,
+ "name": "Identifier",
+ "src": "2018:7:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 276,
+ "name": "Identifier",
+ "src": "2027:9:1"
+ }
+ ],
+ "id": 277,
+ "name": "ModifierInvocation",
+ "src": "2003:34:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 279,
+ "name": "Identifier",
+ "src": "2052:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 280,
+ "name": "Identifier",
+ "src": "2072:18:1"
+ }
+ ],
+ "id": 281,
+ "name": "Assignment",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 282,
+ "name": "ExpressionStatement",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 283,
+ "name": "Block",
+ "src": "2042:55:1"
+ }
+ ],
+ "id": 284,
+ "name": "FunctionDefinition",
+ "src": "1884:213:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 285,
+ "name": "ElementaryTypeName",
+ "src": "2325:4:1"
+ }
+ ],
+ "id": 286,
+ "name": "VariableDeclaration",
+ "src": "2325:23:1"
+ }
+ ],
+ "id": 287,
+ "name": "ParameterList",
+ "src": "2324:25:1"
+ },
+ {
+ "children": [],
+ "id": 290,
+ "name": "ParameterList",
+ "src": "2388:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 288,
+ "name": "Identifier",
+ "src": "2373:10:1"
+ }
+ ],
+ "id": 289,
+ "name": "ModifierInvocation",
+ "src": "2373:10:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 291,
+ "name": "Identifier",
+ "src": "2398:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 292,
+ "name": "Identifier",
+ "src": "2418:18:1"
+ }
+ ],
+ "id": 293,
+ "name": "Assignment",
+ "src": "2398:38:1"
+ }
+ ],
+ "id": 294,
+ "name": "ExpressionStatement",
+ "src": "2398:38:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "TimeLockChange"
+ },
+ "id": 295,
+ "name": "Identifier",
+ "src": "2446:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 296,
+ "name": "Identifier",
+ "src": "2461:18:1"
+ }
+ ],
+ "id": 297,
+ "name": "FunctionCall",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 298,
+ "name": "ExpressionStatement",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 299,
+ "name": "Block",
+ "src": "2388:99:1"
+ }
+ ],
+ "id": 300,
+ "name": "FunctionDefinition",
+ "src": "2301:186:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 301,
+ "name": "ElementaryTypeName",
+ "src": "2621:4:1"
+ }
+ ],
+ "id": 302,
+ "name": "VariableDeclaration",
+ "src": "2621:18:1"
+ }
+ ],
+ "id": 303,
+ "name": "ParameterList",
+ "src": "2620:20:1"
+ },
+ {
+ "children": [],
+ "id": 319,
+ "name": "ParameterList",
+ "src": "2822:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 304,
+ "name": "Identifier",
+ "src": "2664:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 305,
+ "name": "Identifier",
+ "src": "2676:3:1"
+ }
+ ],
+ "id": 306,
+ "name": "MemberAccess",
+ "src": "2676:10:1"
+ }
+ ],
+ "id": 307,
+ "name": "ModifierInvocation",
+ "src": "2664:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 308,
+ "name": "Identifier",
+ "src": "2696:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 309,
+ "name": "Identifier",
+ "src": "2714:13:1"
+ }
+ ],
+ "id": 310,
+ "name": "ModifierInvocation",
+ "src": "2696:32:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 311,
+ "name": "Identifier",
+ "src": "2737:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 312,
+ "name": "Identifier",
+ "src": "2750:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 313,
+ "name": "Identifier",
+ "src": "2765:3:1"
+ }
+ ],
+ "id": 314,
+ "name": "MemberAccess",
+ "src": "2765:10:1"
+ }
+ ],
+ "id": 315,
+ "name": "ModifierInvocation",
+ "src": "2737:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 316,
+ "name": "Identifier",
+ "src": "2785:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 317,
+ "name": "Identifier",
+ "src": "2803:13:1"
+ }
+ ],
+ "id": 318,
+ "name": "ModifierInvocation",
+ "src": "2785:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 320,
+ "name": "Identifier",
+ "src": "2832:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 321,
+ "name": "Identifier",
+ "src": "2846:13:1"
+ }
+ ],
+ "id": 324,
+ "name": "IndexAccess",
+ "src": "2832:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 322,
+ "name": "Identifier",
+ "src": "2861:3:1"
+ }
+ ],
+ "id": 323,
+ "name": "MemberAccess",
+ "src": "2861:10:1"
+ }
+ ],
+ "id": 325,
+ "name": "IndexAccess",
+ "src": "2832:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 326,
+ "name": "Literal",
+ "src": "2875:4:1"
+ }
+ ],
+ "id": 327,
+ "name": "Assignment",
+ "src": "2832:47:1"
+ }
+ ],
+ "id": 328,
+ "name": "ExpressionStatement",
+ "src": "2832:47:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 329,
+ "name": "Identifier",
+ "src": "2889:12:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 330,
+ "name": "Identifier",
+ "src": "2902:3:1"
+ }
+ ],
+ "id": 331,
+ "name": "MemberAccess",
+ "src": "2902:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 332,
+ "name": "Identifier",
+ "src": "2914:13:1"
+ }
+ ],
+ "id": 333,
+ "name": "FunctionCall",
+ "src": "2889:39:1"
+ }
+ ],
+ "id": 334,
+ "name": "ExpressionStatement",
+ "src": "2889:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 335,
+ "name": "Identifier",
+ "src": "2942:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 336,
+ "name": "Identifier",
+ "src": "2954:13:1"
+ }
+ ],
+ "id": 337,
+ "name": "FunctionCall",
+ "src": "2942:26:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256)",
+ "value": "setConfirmationTime"
+ },
+ "id": 338,
+ "name": "Identifier",
+ "src": "2984:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 339,
+ "name": "Identifier",
+ "src": "3004:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 340,
+ "name": "Identifier",
+ "src": "3019:5:1"
+ }
+ ],
+ "id": 341,
+ "name": "MemberAccess",
+ "src": "3019:15:1"
+ }
+ ],
+ "id": 342,
+ "name": "FunctionCall",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 343,
+ "name": "ExpressionStatement",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 344,
+ "name": "Block",
+ "src": "2970:76:1"
+ }
+ ],
+ "id": 345,
+ "name": "IfStatement",
+ "src": "2938:108:1"
+ }
+ ],
+ "id": 346,
+ "name": "Block",
+ "src": "2822:230:1"
+ }
+ ],
+ "id": 347,
+ "name": "FunctionDefinition",
+ "src": "2593:459:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 348,
+ "name": "ElementaryTypeName",
+ "src": "3204:4:1"
+ }
+ ],
+ "id": 349,
+ "name": "VariableDeclaration",
+ "src": "3204:18:1"
+ }
+ ],
+ "id": 350,
+ "name": "ParameterList",
+ "src": "3203:20:1"
+ },
+ {
+ "children": [],
+ "id": 366,
+ "name": "ParameterList",
+ "src": "3396:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 351,
+ "name": "Identifier",
+ "src": "3247:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 352,
+ "name": "Identifier",
+ "src": "3259:3:1"
+ }
+ ],
+ "id": 353,
+ "name": "MemberAccess",
+ "src": "3259:10:1"
+ }
+ ],
+ "id": 354,
+ "name": "ModifierInvocation",
+ "src": "3247:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 355,
+ "name": "Identifier",
+ "src": "3279:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 356,
+ "name": "Identifier",
+ "src": "3289:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 357,
+ "name": "Identifier",
+ "src": "3304:3:1"
+ }
+ ],
+ "id": 358,
+ "name": "MemberAccess",
+ "src": "3304:10:1"
+ }
+ ],
+ "id": 359,
+ "name": "ModifierInvocation",
+ "src": "3279:36:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 360,
+ "name": "Identifier",
+ "src": "3324:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 361,
+ "name": "Identifier",
+ "src": "3336:13:1"
+ }
+ ],
+ "id": 362,
+ "name": "ModifierInvocation",
+ "src": "3324:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 363,
+ "name": "Identifier",
+ "src": "3359:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 364,
+ "name": "Identifier",
+ "src": "3377:13:1"
+ }
+ ],
+ "id": 365,
+ "name": "ModifierInvocation",
+ "src": "3359:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 367,
+ "name": "Identifier",
+ "src": "3406:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 368,
+ "name": "Identifier",
+ "src": "3420:13:1"
+ }
+ ],
+ "id": 371,
+ "name": "IndexAccess",
+ "src": "3406:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 369,
+ "name": "Identifier",
+ "src": "3435:3:1"
+ }
+ ],
+ "id": 370,
+ "name": "MemberAccess",
+ "src": "3435:10:1"
+ }
+ ],
+ "id": 372,
+ "name": "IndexAccess",
+ "src": "3406:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 373,
+ "name": "Literal",
+ "src": "3449:5:1"
+ }
+ ],
+ "id": 374,
+ "name": "Assignment",
+ "src": "3406:48:1"
+ }
+ ],
+ "id": 375,
+ "name": "ExpressionStatement",
+ "src": "3406:48:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 376,
+ "name": "Identifier",
+ "src": "3464:10:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 377,
+ "name": "Identifier",
+ "src": "3475:3:1"
+ }
+ ],
+ "id": 378,
+ "name": "MemberAccess",
+ "src": "3475:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 379,
+ "name": "Identifier",
+ "src": "3487:13:1"
+ }
+ ],
+ "id": 380,
+ "name": "FunctionCall",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 381,
+ "name": "ExpressionStatement",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 382,
+ "name": "Block",
+ "src": "3396:112:1"
+ }
+ ],
+ "id": 383,
+ "name": "FunctionDefinition",
+ "src": "3176:332:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 384,
+ "name": "ElementaryTypeName",
+ "src": "3650:4:1"
+ }
+ ],
+ "id": 385,
+ "name": "VariableDeclaration",
+ "src": "3650:18:1"
+ }
+ ],
+ "id": 386,
+ "name": "ParameterList",
+ "src": "3649:20:1"
+ },
+ {
+ "children": [],
+ "id": 396,
+ "name": "ParameterList",
+ "src": "3798:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 387,
+ "name": "Identifier",
+ "src": "3693:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 388,
+ "name": "Identifier",
+ "src": "3705:13:1"
+ }
+ ],
+ "id": 389,
+ "name": "ModifierInvocation",
+ "src": "3693:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 390,
+ "name": "Identifier",
+ "src": "3728:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 391,
+ "name": "Identifier",
+ "src": "3743:13:1"
+ }
+ ],
+ "id": 392,
+ "name": "ModifierInvocation",
+ "src": "3728:29:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "pastTimeLock"
+ },
+ "id": 393,
+ "name": "Identifier",
+ "src": "3766:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 394,
+ "name": "Identifier",
+ "src": "3779:13:1"
+ }
+ ],
+ "id": 395,
+ "name": "ModifierInvocation",
+ "src": "3766:27:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 397,
+ "name": "UserDefinedTypeName",
+ "src": "3808:11:1"
+ }
+ ],
+ "id": 398,
+ "name": "VariableDeclaration",
+ "src": "3808:22:1"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 399,
+ "name": "Identifier",
+ "src": "3833:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 400,
+ "name": "Identifier",
+ "src": "3846:13:1"
+ }
+ ],
+ "id": 401,
+ "name": "IndexAccess",
+ "src": "3833:27:1"
+ }
+ ],
+ "id": 402,
+ "name": "VariableDeclarationStatement",
+ "src": "3808:52:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 403,
+ "name": "Identifier",
+ "src": "3870:2:1"
+ }
+ ],
+ "id": 405,
+ "name": "MemberAccess",
+ "src": "3870:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 406,
+ "name": "Literal",
+ "src": "3884:4:1"
+ }
+ ],
+ "id": 407,
+ "name": "Assignment",
+ "src": "3870:18:1"
+ }
+ ],
+ "id": 408,
+ "name": "ExpressionStatement",
+ "src": "3870:18:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 409,
+ "name": "Identifier",
+ "src": "3902:2:1"
+ }
+ ],
+ "id": 410,
+ "name": "MemberAccess",
+ "src": "3902:14:1"
+ }
+ ],
+ "id": 411,
+ "name": "MemberAccess",
+ "src": "3902:19:1"
+ }
+ ],
+ "id": 412,
+ "name": "MemberAccess",
+ "src": "3902:25:1"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 413,
+ "name": "Identifier",
+ "src": "3928:2:1"
+ }
+ ],
+ "id": 414,
+ "name": "MemberAccess",
+ "src": "3928:8:1"
+ }
+ ],
+ "id": 415,
+ "name": "FunctionCall",
+ "src": "3902:35:1"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 416,
+ "name": "Identifier",
+ "src": "3938:2:1"
+ }
+ ],
+ "id": 417,
+ "name": "MemberAccess",
+ "src": "3938:7:1"
+ }
+ ],
+ "id": 418,
+ "name": "FunctionCall",
+ "src": "3902:44:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 419,
+ "name": "Identifier",
+ "src": "3960:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 420,
+ "name": "Identifier",
+ "src": "3970:13:1"
+ }
+ ],
+ "id": 421,
+ "name": "FunctionCall",
+ "src": "3960:24:1"
+ }
+ ],
+ "id": 422,
+ "name": "ExpressionStatement",
+ "src": "3960:24:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 423,
+ "name": "Identifier",
+ "src": "4013:16:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 424,
+ "name": "Identifier",
+ "src": "4030:13:1"
+ }
+ ],
+ "id": 425,
+ "name": "FunctionCall",
+ "src": "4013:31:1"
+ }
+ ],
+ "id": 426,
+ "name": "ExpressionStatement",
+ "src": "4013:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 427,
+ "name": "Identifier",
+ "src": "4058:2:1"
+ }
+ ],
+ "id": 429,
+ "name": "MemberAccess",
+ "src": "4058:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 430,
+ "name": "Literal",
+ "src": "4072:5:1"
+ }
+ ],
+ "id": 431,
+ "name": "Assignment",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 432,
+ "name": "ExpressionStatement",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 433,
+ "name": "Block",
+ "src": "3999:89:1"
+ }
+ ],
+ "id": 434,
+ "name": "IfStatement",
+ "src": "3898:190:1"
+ }
+ ],
+ "id": 435,
+ "name": "Block",
+ "src": "3798:296:1"
+ }
+ ],
+ "id": 436,
+ "name": "FunctionDefinition",
+ "src": "3622:472:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "setConfirmationTime",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 437,
+ "name": "ElementaryTypeName",
+ "src": "4233:4:1"
+ }
+ ],
+ "id": 438,
+ "name": "VariableDeclaration",
+ "src": "4233:18:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 439,
+ "name": "ElementaryTypeName",
+ "src": "4253:4:1"
+ }
+ ],
+ "id": 440,
+ "name": "VariableDeclaration",
+ "src": "4253:21:1"
+ }
+ ],
+ "id": 441,
+ "name": "ParameterList",
+ "src": "4232:43:1"
+ },
+ {
+ "children": [],
+ "id": 442,
+ "name": "ParameterList",
+ "src": "4297:0:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 443,
+ "name": "Identifier",
+ "src": "4307:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 444,
+ "name": "Identifier",
+ "src": "4325:13:1"
+ }
+ ],
+ "id": 445,
+ "name": "IndexAccess",
+ "src": "4307:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 446,
+ "name": "Identifier",
+ "src": "4342:16:1"
+ }
+ ],
+ "id": 447,
+ "name": "Assignment",
+ "src": "4307:51:1"
+ }
+ ],
+ "id": 448,
+ "name": "ExpressionStatement",
+ "src": "4307:51:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256) constant",
+ "value": "ConfirmationTimeSet"
+ },
+ "id": 449,
+ "name": "Identifier",
+ "src": "4368:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 450,
+ "name": "Identifier",
+ "src": "4388:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 451,
+ "name": "Identifier",
+ "src": "4403:16:1"
+ }
+ ],
+ "id": 452,
+ "name": "FunctionCall",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 453,
+ "name": "ExpressionStatement",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 454,
+ "name": "Block",
+ "src": "4297:130:1"
+ }
+ ],
+ "id": 455,
+ "name": "FunctionDefinition",
+ "src": "4204:223:1"
+ }
+ ],
+ "id": 456,
+ "name": "ContractDefinition",
+ "src": "835:3594:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol": {
+ "id": "2",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:2"
+ },
+ {
+ "attributes": {
+ "file": "../../multisig/MultiSigWalletWithTimeLock.sol"
+ },
+ "id": 2,
+ "name": "ImportDirective",
+ "src": "605:55:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 202,
+ 456,
+ 1419
+ ],
+ "name": "AssetProxyOwner"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "id": 3,
+ "name": "UserDefinedTypeName",
+ "src": "695:26:2"
+ }
+ ],
+ "id": 4,
+ "name": "InheritanceSpecifier",
+ "src": "695:26:2"
+ },
+ {
+ "attributes": {
+ "name": "AssetProxyRegistration"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 5,
+ "name": "ElementaryTypeName",
+ "src": "758:7:2"
+ }
+ ],
+ "id": 6,
+ "name": "VariableDeclaration",
+ "src": "758:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 7,
+ "name": "ElementaryTypeName",
+ "src": "786:4:2"
+ }
+ ],
+ "id": 8,
+ "name": "VariableDeclaration",
+ "src": "786:17:2"
+ }
+ ],
+ "id": 9,
+ "name": "ParameterList",
+ "src": "757:47:2"
+ }
+ ],
+ "id": 10,
+ "name": "EventDefinition",
+ "src": "729:76:2"
+ },
+ {
+ "attributes": {
+ "name": "isAssetProxyRegistered",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 11,
+ "name": "ElementaryTypeName",
+ "src": "990:7:2"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 12,
+ "name": "ElementaryTypeName",
+ "src": "1001:4:2"
+ }
+ ],
+ "id": 13,
+ "name": "Mapping",
+ "src": "981:25:2"
+ }
+ ],
+ "id": 14,
+ "name": "VariableDeclaration",
+ "src": "981:55:2"
+ },
+ {
+ "attributes": {
+ "name": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 15,
+ "name": "ElementaryTypeName",
+ "src": "1043:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(bytes4)",
+ "value": "bytes4"
+ },
+ "id": 16,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1114:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes32",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () returns (bytes32)",
+ "value": "keccak256"
+ },
+ "id": 17,
+ "name": "Identifier",
+ "src": "1121:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "72656d6f7665417574686f72697a6564416464726573734174496e64657828616464726573732c75696e7432353629",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"removeAuthorizedAddressAtIndex(address,uint256)\"",
+ "value": "removeAuthorizedAddressAtIndex(address,uint256)"
+ },
+ "id": 18,
+ "name": "Literal",
+ "src": "1131:49:2"
+ }
+ ],
+ "id": 19,
+ "name": "FunctionCall",
+ "src": "1121:60:2"
+ }
+ ],
+ "id": 20,
+ "name": "FunctionCall",
+ "src": "1114:68:2"
+ }
+ ],
+ "id": 21,
+ "name": "VariableDeclaration",
+ "src": "1043:139:2"
+ },
+ {
+ "attributes": {
+ "name": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 22,
+ "name": "ElementaryTypeName",
+ "src": "1385:7:2"
+ }
+ ],
+ "id": 23,
+ "name": "VariableDeclaration",
+ "src": "1385:21:2"
+ }
+ ],
+ "id": 24,
+ "name": "ParameterList",
+ "src": "1384:23:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 25,
+ "name": "UserDefinedTypeName",
+ "src": "1418:11:2"
+ }
+ ],
+ "id": 26,
+ "name": "VariableDeclaration",
+ "src": "1418:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 27,
+ "name": "Identifier",
+ "src": "1443:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 28,
+ "name": "Identifier",
+ "src": "1456:13:2"
+ }
+ ],
+ "id": 29,
+ "name": "IndexAccess",
+ "src": "1443:27:2"
+ }
+ ],
+ "id": 30,
+ "name": "VariableDeclarationStatement",
+ "src": "1418:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 31,
+ "name": "Identifier",
+ "src": "1480:7:2"
+ },
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 32,
+ "name": "Identifier",
+ "src": "1488:22:2"
+ },
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 33,
+ "name": "Identifier",
+ "src": "1511:2:2"
+ }
+ ],
+ "id": 34,
+ "name": "MemberAccess",
+ "src": "1511:14:2"
+ }
+ ],
+ "id": 35,
+ "name": "IndexAccess",
+ "src": "1488:38:2"
+ }
+ ],
+ "id": 36,
+ "name": "FunctionCall",
+ "src": "1480:47:2"
+ }
+ ],
+ "id": 37,
+ "name": "ExpressionStatement",
+ "src": "1480:47:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 38,
+ "name": "Identifier",
+ "src": "1537:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bytes memory,uint256) returns (bytes4)",
+ "value": "readBytes4"
+ },
+ "id": 39,
+ "name": "Identifier",
+ "src": "1545:10:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 40,
+ "name": "Identifier",
+ "src": "1556:2:2"
+ }
+ ],
+ "id": 41,
+ "name": "MemberAccess",
+ "src": "1556:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 42,
+ "name": "Literal",
+ "src": "1565:1:2"
+ }
+ ],
+ "id": 43,
+ "name": "FunctionCall",
+ "src": "1545:22:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR"
+ },
+ "id": 44,
+ "name": "Identifier",
+ "src": "1571:43:2"
+ }
+ ],
+ "id": 45,
+ "name": "BinaryOperation",
+ "src": "1545:69:2"
+ }
+ ],
+ "id": 46,
+ "name": "FunctionCall",
+ "src": "1537:78:2"
+ }
+ ],
+ "id": 47,
+ "name": "ExpressionStatement",
+ "src": "1537:78:2"
+ },
+ {
+ "id": 48,
+ "name": "PlaceholderStatement",
+ "src": "1625:1:2"
+ }
+ ],
+ "id": 49,
+ "name": "Block",
+ "src": "1408:225:2"
+ }
+ ],
+ "id": 50,
+ "name": "ModifierDefinition",
+ "src": "1338:295:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "AssetProxyOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 51,
+ "name": "ElementaryTypeName",
+ "src": "2131:7:2"
+ }
+ ],
+ "id": 52,
+ "name": "ArrayTypeName",
+ "src": "2131:9:2"
+ }
+ ],
+ "id": 53,
+ "name": "VariableDeclaration",
+ "src": "2131:24:2"
+ },
+ {
+ "attributes": {
+ "name": "_assetProxyContracts",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 54,
+ "name": "ElementaryTypeName",
+ "src": "2165:7:2"
+ }
+ ],
+ "id": 55,
+ "name": "ArrayTypeName",
+ "src": "2165:9:2"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "2165:37:2"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 57,
+ "name": "ElementaryTypeName",
+ "src": "2212:7:2"
+ }
+ ],
+ "id": 58,
+ "name": "VariableDeclaration",
+ "src": "2212:17:2"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 59,
+ "name": "ElementaryTypeName",
+ "src": "2239:7:2"
+ }
+ ],
+ "id": 60,
+ "name": "VariableDeclaration",
+ "src": "2239:26:2"
+ }
+ ],
+ "id": 61,
+ "name": "ParameterList",
+ "src": "2121:150:2"
+ },
+ {
+ "children": [],
+ "id": 67,
+ "name": "ParameterList",
+ "src": "2366:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWalletWithTimeLock)",
+ "value": "MultiSigWalletWithTimeLock"
+ },
+ "id": 62,
+ "name": "Identifier",
+ "src": "2295:26:2"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 63,
+ "name": "Identifier",
+ "src": "2322:7:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "2331:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 65,
+ "name": "Identifier",
+ "src": "2342:18:2"
+ }
+ ],
+ "id": 66,
+ "name": "ModifierInvocation",
+ "src": "2295:66:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 68,
+ "name": "ElementaryTypeName",
+ "src": "2381:7:2"
+ }
+ ],
+ "id": 69,
+ "name": "VariableDeclaration",
+ "src": "2381:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 70,
+ "name": "Literal",
+ "src": "2393:1:2"
+ }
+ ],
+ "id": 71,
+ "name": "VariableDeclarationStatement",
+ "src": "2381:13:2"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 72,
+ "name": "Identifier",
+ "src": "2396:1:2"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 73,
+ "name": "Identifier",
+ "src": "2400:20:2"
+ }
+ ],
+ "id": 74,
+ "name": "MemberAccess",
+ "src": "2400:27:2"
+ }
+ ],
+ "id": 75,
+ "name": "BinaryOperation",
+ "src": "2396:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "2429:1:2"
+ }
+ ],
+ "id": 77,
+ "name": "UnaryOperation",
+ "src": "2429:3:2"
+ }
+ ],
+ "id": 78,
+ "name": "ExpressionStatement",
+ "src": "2429:3:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxy",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 79,
+ "name": "ElementaryTypeName",
+ "src": "2448:7:2"
+ }
+ ],
+ "id": 80,
+ "name": "VariableDeclaration",
+ "src": "2448:18:2"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 81,
+ "name": "Identifier",
+ "src": "2469:20:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 82,
+ "name": "Identifier",
+ "src": "2490:1:2"
+ }
+ ],
+ "id": 83,
+ "name": "IndexAccess",
+ "src": "2469:23:2"
+ }
+ ],
+ "id": 84,
+ "name": "VariableDeclarationStatement",
+ "src": "2448:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 85,
+ "name": "Identifier",
+ "src": "2506:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 86,
+ "name": "Identifier",
+ "src": "2514:10:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 87,
+ "name": "ElementaryTypeNameExpression",
+ "src": "2528:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 88,
+ "name": "Literal",
+ "src": "2536:1:2"
+ }
+ ],
+ "id": 89,
+ "name": "FunctionCall",
+ "src": "2528:10:2"
+ }
+ ],
+ "id": 90,
+ "name": "BinaryOperation",
+ "src": "2514:24:2"
+ }
+ ],
+ "id": 91,
+ "name": "FunctionCall",
+ "src": "2506:33:2"
+ }
+ ],
+ "id": 92,
+ "name": "ExpressionStatement",
+ "src": "2506:33:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 93,
+ "name": "Identifier",
+ "src": "2553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 94,
+ "name": "Identifier",
+ "src": "2576:10:2"
+ }
+ ],
+ "id": 95,
+ "name": "IndexAccess",
+ "src": "2553:34:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 96,
+ "name": "Literal",
+ "src": "2590:4:2"
+ }
+ ],
+ "id": 97,
+ "name": "Assignment",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 98,
+ "name": "ExpressionStatement",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 99,
+ "name": "Block",
+ "src": "2434:171:2"
+ }
+ ],
+ "id": 100,
+ "name": "ForStatement",
+ "src": "2376:229:2"
+ }
+ ],
+ "id": 101,
+ "name": "Block",
+ "src": "2366:245:2"
+ }
+ ],
+ "id": 102,
+ "name": "FunctionDefinition",
+ "src": "2097:514:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "registerAssetProxy",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 103,
+ "name": "ElementaryTypeName",
+ "src": "2923:7:2"
+ }
+ ],
+ "id": 104,
+ "name": "VariableDeclaration",
+ "src": "2923:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 105,
+ "name": "ElementaryTypeName",
+ "src": "2951:4:2"
+ }
+ ],
+ "id": 106,
+ "name": "VariableDeclaration",
+ "src": "2951:17:2"
+ }
+ ],
+ "id": 107,
+ "name": "ParameterList",
+ "src": "2922:47:2"
+ },
+ {
+ "children": [],
+ "id": 113,
+ "name": "ParameterList",
+ "src": "3044:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 108,
+ "name": "Identifier",
+ "src": "2993:10:2"
+ }
+ ],
+ "id": 109,
+ "name": "ModifierInvocation",
+ "src": "2993:10:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 110,
+ "name": "Identifier",
+ "src": "3012:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "3020:18:2"
+ }
+ ],
+ "id": 112,
+ "name": "ModifierInvocation",
+ "src": "3012:27:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 114,
+ "name": "Identifier",
+ "src": "3054:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 115,
+ "name": "Identifier",
+ "src": "3077:18:2"
+ }
+ ],
+ "id": 116,
+ "name": "IndexAccess",
+ "src": "3054:42:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 117,
+ "name": "Identifier",
+ "src": "3099:12:2"
+ }
+ ],
+ "id": 118,
+ "name": "Assignment",
+ "src": "3054:57:2"
+ }
+ ],
+ "id": 119,
+ "name": "ExpressionStatement",
+ "src": "3054:57:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,bool) constant",
+ "value": "AssetProxyRegistration"
+ },
+ "id": 120,
+ "name": "Identifier",
+ "src": "3121:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 121,
+ "name": "Identifier",
+ "src": "3144:18:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 122,
+ "name": "Identifier",
+ "src": "3164:12:2"
+ }
+ ],
+ "id": 123,
+ "name": "FunctionCall",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 124,
+ "name": "ExpressionStatement",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 125,
+ "name": "Block",
+ "src": "3044:140:2"
+ }
+ ],
+ "id": 126,
+ "name": "FunctionDefinition",
+ "src": "2895:289:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 127,
+ "name": "ElementaryTypeName",
+ "src": "3367:7:2"
+ }
+ ],
+ "id": 128,
+ "name": "VariableDeclaration",
+ "src": "3367:21:2"
+ }
+ ],
+ "id": 129,
+ "name": "ParameterList",
+ "src": "3366:23:2"
+ },
+ {
+ "children": [],
+ "id": 139,
+ "name": "ParameterList",
+ "src": "3543:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 130,
+ "name": "Identifier",
+ "src": "3413:11:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 131,
+ "name": "Identifier",
+ "src": "3425:13:2"
+ }
+ ],
+ "id": 132,
+ "name": "ModifierInvocation",
+ "src": "3413:26:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 133,
+ "name": "Identifier",
+ "src": "3448:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 134,
+ "name": "Identifier",
+ "src": "3463:13:2"
+ }
+ ],
+ "id": 135,
+ "name": "ModifierInvocation",
+ "src": "3448:29:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "id": 136,
+ "name": "Identifier",
+ "src": "3486:37:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 137,
+ "name": "Identifier",
+ "src": "3524:13:2"
+ }
+ ],
+ "id": 138,
+ "name": "ModifierInvocation",
+ "src": "3486:52:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 140,
+ "name": "UserDefinedTypeName",
+ "src": "3553:11:2"
+ }
+ ],
+ "id": 141,
+ "name": "VariableDeclaration",
+ "src": "3553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 142,
+ "name": "Identifier",
+ "src": "3578:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 143,
+ "name": "Identifier",
+ "src": "3591:13:2"
+ }
+ ],
+ "id": 144,
+ "name": "IndexAccess",
+ "src": "3578:27:2"
+ }
+ ],
+ "id": 145,
+ "name": "VariableDeclarationStatement",
+ "src": "3553:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "3615:2:2"
+ }
+ ],
+ "id": 148,
+ "name": "MemberAccess",
+ "src": "3615:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 149,
+ "name": "Literal",
+ "src": "3629:4:2"
+ }
+ ],
+ "id": 150,
+ "name": "Assignment",
+ "src": "3615:18:2"
+ }
+ ],
+ "id": 151,
+ "name": "ExpressionStatement",
+ "src": "3615:18:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 152,
+ "name": "Identifier",
+ "src": "3701:2:2"
+ }
+ ],
+ "id": 153,
+ "name": "MemberAccess",
+ "src": "3701:14:2"
+ }
+ ],
+ "id": 154,
+ "name": "MemberAccess",
+ "src": "3701:19:2"
+ }
+ ],
+ "id": 155,
+ "name": "MemberAccess",
+ "src": "3701:25:2"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "3727:2:2"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "3727:8:2"
+ }
+ ],
+ "id": 158,
+ "name": "FunctionCall",
+ "src": "3701:35:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "3737:2:2"
+ }
+ ],
+ "id": 160,
+ "name": "MemberAccess",
+ "src": "3737:7:2"
+ }
+ ],
+ "id": 161,
+ "name": "FunctionCall",
+ "src": "3701:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 162,
+ "name": "Identifier",
+ "src": "3759:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 163,
+ "name": "Identifier",
+ "src": "3769:13:2"
+ }
+ ],
+ "id": 164,
+ "name": "FunctionCall",
+ "src": "3759:24:2"
+ }
+ ],
+ "id": 165,
+ "name": "ExpressionStatement",
+ "src": "3759:24:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 166,
+ "name": "Identifier",
+ "src": "3812:16:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 167,
+ "name": "Identifier",
+ "src": "3829:13:2"
+ }
+ ],
+ "id": 168,
+ "name": "FunctionCall",
+ "src": "3812:31:2"
+ }
+ ],
+ "id": 169,
+ "name": "ExpressionStatement",
+ "src": "3812:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 170,
+ "name": "Identifier",
+ "src": "3857:2:2"
+ }
+ ],
+ "id": 172,
+ "name": "MemberAccess",
+ "src": "3857:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 173,
+ "name": "Literal",
+ "src": "3871:5:2"
+ }
+ ],
+ "id": 174,
+ "name": "Assignment",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 175,
+ "name": "ExpressionStatement",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 176,
+ "name": "Block",
+ "src": "3798:89:2"
+ }
+ ],
+ "id": 177,
+ "name": "IfStatement",
+ "src": "3697:190:2"
+ }
+ ],
+ "id": 178,
+ "name": "Block",
+ "src": "3543:350:2"
+ }
+ ],
+ "id": 179,
+ "name": "FunctionDefinition",
+ "src": "3320:573:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "readBytes4",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "b",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 180,
+ "name": "ElementaryTypeName",
+ "src": "4164:5:2"
+ }
+ ],
+ "id": 181,
+ "name": "VariableDeclaration",
+ "src": "4164:14:2"
+ },
+ {
+ "attributes": {
+ "name": "index",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 182,
+ "name": "ElementaryTypeName",
+ "src": "4188:7:2"
+ }
+ ],
+ "id": 183,
+ "name": "VariableDeclaration",
+ "src": "4188:13:2"
+ }
+ ],
+ "id": 184,
+ "name": "ParameterList",
+ "src": "4154:53:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "result",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 185,
+ "name": "ElementaryTypeName",
+ "src": "4242:6:2"
+ }
+ ],
+ "id": 186,
+ "name": "VariableDeclaration",
+ "src": "4242:13:2"
+ }
+ ],
+ "id": 187,
+ "name": "ParameterList",
+ "src": "4241:15:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 188,
+ "name": "Identifier",
+ "src": "4271:7:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "b"
+ },
+ "id": 189,
+ "name": "Identifier",
+ "src": "4279:1:2"
+ }
+ ],
+ "id": 190,
+ "name": "MemberAccess",
+ "src": "4279:8:2"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "index"
+ },
+ "id": 191,
+ "name": "Identifier",
+ "src": "4291:5:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "34",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 4",
+ "value": "4"
+ },
+ "id": 192,
+ "name": "Literal",
+ "src": "4299:1:2"
+ }
+ ],
+ "id": 193,
+ "name": "BinaryOperation",
+ "src": "4291:9:2"
+ }
+ ],
+ "id": 194,
+ "name": "BinaryOperation",
+ "src": "4279:21:2"
+ }
+ ],
+ "id": 195,
+ "name": "FunctionCall",
+ "src": "4271:30:2"
+ }
+ ],
+ "id": 196,
+ "name": "ExpressionStatement",
+ "src": "4271:30:2"
+ },
+ {
+ "children": [],
+ "id": 197,
+ "name": "InlineAssembly",
+ "src": "4311:281:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "result"
+ },
+ "id": 198,
+ "name": "Identifier",
+ "src": "4593:6:2"
+ }
+ ],
+ "id": 199,
+ "name": "Return",
+ "src": "4586:13:2"
+ }
+ ],
+ "id": 200,
+ "name": "Block",
+ "src": "4261:345:2"
+ }
+ ],
+ "id": 201,
+ "name": "FunctionDefinition",
+ "src": "4135:471:2"
+ }
+ ],
+ "id": 202,
+ "name": "ContractDefinition",
+ "src": "663:3945:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/multisig/MultiSigWallet.sol": "// solhint-disable\npragma solidity ^0.4.10;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.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\n// solhint-disable\npragma solidity ^0.4.10;\n\nimport \"./MultiSigWallet.sol\";\n\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n",
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.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 solidity 0.4.10;\n\nimport \"../../multisig/MultiSigWalletWithTimeLock.sol\";\n\n\ncontract AssetProxyOwner is\n MultiSigWalletWithTimeLock\n{\n\n event AssetProxyRegistration(address assetProxyContract, bool isRegistered);\n\n // Mapping of AssetProxy contract address =>\n // if this contract is allowed to call the AssetProxy's `removeAuthorizedAddressAtIndex` method without a time lock.\n mapping (address => bool) public isAssetProxyRegistered;\n\n bytes4 constant internal REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR = bytes4(keccak256(\"removeAuthorizedAddressAtIndex(address,uint256)\"));\n\n /// @dev Function will revert if the transaction does not call `removeAuthorizedAddressAtIndex`\n /// on an approved AssetProxy contract.\n modifier validRemoveAuthorizedAddressAtIndexTx(uint256 transactionId) {\n Transaction storage tx = transactions[transactionId];\n require(isAssetProxyRegistered[tx.destination]);\n require(readBytes4(tx.data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR);\n _;\n }\n\n /// @dev Contract constructor sets initial owners, required number of confirmations,\n /// time lock, and list of AssetProxy addresses.\n /// @param _owners List of initial owners.\n /// @param _assetProxyContracts Array of AssetProxy contract addresses.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function AssetProxyOwner(\n address[] memory _owners,\n address[] memory _assetProxyContracts,\n uint256 _required,\n uint256 _secondsTimeLocked\n )\n public\n MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)\n {\n for (uint256 i = 0; i < _assetProxyContracts.length; i++) {\n address assetProxy = _assetProxyContracts[i];\n require(assetProxy != address(0));\n isAssetProxyRegistered[assetProxy] = true;\n }\n }\n\n /// @dev Registers or deregisters an AssetProxy to be able to execute\n /// `removeAuthorizedAddressAtIndex` without a timelock.\n /// @param assetProxyContract Address of AssetProxy contract.\n /// @param isRegistered Status of approval for AssetProxy contract.\n function registerAssetProxy(address assetProxyContract, bool isRegistered)\n public\n onlyWallet\n notNull(assetProxyContract)\n {\n isAssetProxyRegistered[assetProxyContract] = isRegistered;\n AssetProxyRegistration(assetProxyContract, isRegistered);\n }\n\n /// @dev Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\n /// @param transactionId Transaction ID.\n function executeRemoveAuthorizedAddressAtIndex(uint256 transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n validRemoveAuthorizedAddressAtIndexTx(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n // solhint-disable-next-line avoid-call-value\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n returns (bytes4 result)\n {\n require(b.length >= index + 4);\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x8c882ef490c011257c7406ca74aba8787c3f078c7c628553e046883c81244681",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.10+commit.f0d539ae.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0x33f780fbc29bd180b2d0ed55c4d036c6a09262b5",
+ "links": {},
+ "constructorArgs": "[[\"0x9df8137872ac09a8fee71d0da5c7539923fb9bf0\",\"0xcf34d44db312d188789f43a63d11cf2bebb4da15\",\"0x73fd50f2a6beac9cdac9fe87ef68a18edc415831\"],[\"0x9ad1b8209cea603892c9dfaa676bc737088b499a\",\"0xbb428f7108971ecf1144700c4d37792f8b74f6b0\"],\"1\",\"0\"]"
+ },
+ "50": {
+ "address": "0x34d402f14d58e001d8efbe6585051bf9706aa064",
+ "links": {},
+ "constructorArgs": "[[\"0x5409ed021d9299bf6814279a6a1411a7e866a631\",\"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb\"],[\"0x1dc4c1cefef38a777b15aa20260a54e584b16c48\",\"0x1d7022f5b17d2f8b695918fb48fa1089c9f85401\"],\"2\",\"0\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Proxy.json b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Proxy.json
new file mode 100644
index 000000000..a75d3b653
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Proxy.json
@@ -0,0 +1,267 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC20Proxy",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getProxyId",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610f48806100256000396000f3006080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610246578063494503d41461027657806370712939146102b75780638da5cb5b146102e55780639ad26744146102fa578063ae25532e1461032b578063b918161114610375578063d39de6e9146103b7578063f2fde38b1461041c575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e40000000000000000000000000000000000000000000000000000000081141561024357604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b602860043501357f23b872dd0000000000000000000000000000000000000000000000000000000060005260606024600437602060006064600080855af1600080511160203d14163d15178116905080156101d257005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b34801561025257600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661044a565b005b34801561028257600080fd5b5061028e600435610636565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102c357600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661066b565b3480156102f157600080fd5b5061028e610964565b34801561030657600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516602435610980565b34801561033757600080fd5b50610340610d35565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561038157600080fd5b506103a373ffffffffffffffffffffffffffffffffffffffff60043516610d6b565b604080519115158252519081900360200190f35b3480156103c357600080fd5b506103cc610d80565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104085781810151838201526020016103f0565b505050509050019250505060405180910390f35b34801561042857600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516610def565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561056557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061064457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146106f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561078857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561091d578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561080557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561091557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061085d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061089057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061090f9082610ed5565b5061091d565b6001016107d5565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a0657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610a9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610b3257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610bc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610c3b57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610c6e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ced9082610ed5565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610de557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dba575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610ed257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610ef957600083815260209020610ef9918101908301610efe565b505050565b610d6891905b80821115610f185760008155600101610f04565b50905600a165627a7a723058201466e5e24b5bc03ee391f9e0fc49b2c9d54685fe6a0f7742a10783f481e82a7b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0xF48 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x2FA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x3B7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x41C JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x243 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x28 PUSH1 0x4 CALLDATALOAD ADD CALLDATALOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x60 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x20 PUSH1 0x0 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL PUSH1 0x0 DUP1 MLOAD GT PUSH1 0x20 RETURNDATASIZE EQ AND RETURNDATASIZE ISZERO OR DUP2 AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x44A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x66B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x964 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x980 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x340 PUSH2 0xD35 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CC PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x408 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F0 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDEF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x565 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x788 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x91D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x805 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x915 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x85D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x890 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x90F SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH2 0x91D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA06 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xC3B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xCED SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDBA JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xE75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xED2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEF9 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEFE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD68 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF18 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF04 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EQ PUSH7 0xE5E24B5BC03EE3 SWAP2 0xf9 0xe0 0xfc 0x49 0xb2 0xc9 0xd5 0x46 DUP6 INVALID PUSH11 0xF7742A10783F481E82A7B STOP 0x29 ",
+ "sourceMap": "685:5140:0:-;;;329:5:6;:18;;-1:-1:-1;;;;;;329:18:6;337:10;329:18;;;685:5140:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610246578063494503d41461027657806370712939146102b75780638da5cb5b146102e55780639ad26744146102fa578063ae25532e1461032b578063b918161114610375578063d39de6e9146103b7578063f2fde38b1461041c575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e40000000000000000000000000000000000000000000000000000000081141561024357604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b602860043501357f23b872dd0000000000000000000000000000000000000000000000000000000060005260606024600437602060006064600080855af1600080511160203d14163d15178116905080156101d257005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b34801561025257600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661044a565b005b34801561028257600080fd5b5061028e600435610636565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102c357600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661066b565b3480156102f157600080fd5b5061028e610964565b34801561030657600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516602435610980565b34801561033757600080fd5b50610340610d35565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561038157600080fd5b506103a373ffffffffffffffffffffffffffffffffffffffff60043516610d6b565b604080519115158252519081900360200190f35b3480156103c357600080fd5b506103cc610d80565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104085781810151838201526020016103f0565b505050509050019250505060405180910390f35b34801561042857600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516610def565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561056557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061064457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146106f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561078857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561091d578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561080557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561091557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061085d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061089057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061090f9082610ed5565b5061091d565b6001016107d5565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a0657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610a9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610b3257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610bc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610c3b57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610c6e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ced9082610ed5565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610de557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dba575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610ed257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610ef957600083815260209020610ef9918101908301610efe565b505050565b610d6891905b80821115610f185760008155600101610f04565b50905600a165627a7a723058201466e5e24b5bc03ee391f9e0fc49b2c9d54685fe6a0f7742a10783f481e82a7b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x2FA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x3B7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x41C JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x243 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x28 PUSH1 0x4 CALLDATALOAD ADD CALLDATALOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x60 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x20 PUSH1 0x0 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL PUSH1 0x0 DUP1 MLOAD GT PUSH1 0x20 RETURNDATASIZE EQ AND RETURNDATASIZE ISZERO OR DUP2 AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x44A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x66B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x964 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x980 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x340 PUSH2 0xD35 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CC PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x408 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F0 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDEF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x565 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x788 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x91D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x805 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x915 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x85D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x890 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x90F SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH2 0x91D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA06 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xC3B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xCED SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDBA JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xE75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xED2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEF9 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEFE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD68 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF18 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF04 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EQ PUSH7 0xE5E24B5BC03EE3 SWAP2 0xf9 0xe0 0xfc 0x49 0xb2 0xc9 0xd5 0x46 DUP6 INVALID PUSH11 0xF7742A10783F481E82A7B STOP 0x29 ",
+ "sourceMap": "685:5140:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;685:5140:0;1075:66;1071:1;1058:15;1054:88;1537:66;1527:8;1524:80;1521:2;;;1833;1827:9;;1871:6;1853:70;;1963:15;1958:2;1947:14;;1940:39;2074:20;;;2068:27;2061:35;2058:2;;;2197:66;2194:1;2187:77;2296:66;2292:2;2285:78;2395:66;2391:2;2384:78;2494:1;2490:2;2483:13;2527:3;2524:1;2517:14;2058:2;3123;3119:1;3106:15;3102:24;3089:38;3419:66;3416:1;3409:77;3724:2;3720;3717:1;3704:23;4229:2;4166:1;4111:3;4046:1;3988;3918:5;3863:3;3837:459;5039:1;5035;5029:8;5026:15;4997:2;4981:14;4978:22;4949:114;4912:14;4905:22;4881:200;4872:7;4868:214;4857:225;;5102:7;5099:2;;;5132:12;5099:2;5264:66;5261:1;5254:77;5359:66;5355:2;5348:78;5454:66;5450:2;5443:78;5549:1;5545:2;5538:13;5578:3;5575:1;5568:14;1521:2;951:4655;685:5140;1146:320:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1146:320:1;;;;;;;;;1031:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1031:28:1;;;;;;;;;;;;;;;;;;;;;;;;1580:547;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1580:547:1;;;;;;;258:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:6;;;;2300:643:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2300:643:1;;;;;;;;;5710:113:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5710:113:0;;;;;;;;;;;;;;;;;;;;;;;982:43:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;982:43:1;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3040:138:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3040:138:1;;;;;;;;;;;;;;;;;500:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:6;;;;;;;1146:320:1;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1263:18:1;;;;;;;:10;:18;;;;;;;;1262:19;1241:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:18;;;;;;;1364:4;1343:18;;;;;;;;:25;;;;;;;;1378:11;27:10:-1;;23:18;;;45:23;;1378:24:1;;;;;;;;;;;;;;1417:42;1448:10;;1343:18;1417:42;;;1146:320;:::o;1031:28::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1031:28:1;:::o;1580:547::-;1815:9;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1699:18:1;;;;;;;:10;:18;;;;;;;;1678:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:18:1;;;;;;;:10;:18;;;;;1775:25;;;;;;1810:252;1834:11;:18;1830:22;;1810:252;;;1895:6;1877:24;;:11;1889:1;1877:14;;;;;;;;;;;;;;;;;;;;;;:24;1873:179;;;1938:11;1950:18;;:22;;;;1938:35;;;;;;;;;;;;;;;;1921:11;:14;;1938:35;;;;;1933:1;;1921:14;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;1991:11;:23;;;;;;;;;:::i;:::-;;2032:5;;1873:179;1854:3;;1810:252;;;2076:44;;2109:10;;2076:44;;;;;;;;;1580:547;;:::o;258:20:6:-;;;;;;:::o;2300:643:1:-;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:18:1;;;;;;;:10;:18;;;;;;;;2442:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:11;:18;2559:26;;2538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2683:6;2661:28;;:11;2673:5;2661:18;;;;;;;;;;;;;;;;;;;;;;:28;2640:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:18;;;;;;;:10;:18;;;;;2753:25;;;;;;2809:11;2821:18;;:22;;;;2809:35;;;;;;;;;;;;;;;;2788:11;:18;;2809:35;;;;;2800:5;;2788:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;2854:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;2892:44:1;;2925:10;;2892:44;;;;;;;;;2300:643;;:::o;5710:113:0:-;804:32;;;;;;;;;;;;;;;;5710:113;;:::o;982:43:1:-;;;;;;;;;;;;;;;:::o;3040:138::-;3121:9;3160:11;3153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;:::o;500:167:6:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;685:5140:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/ERC20Proxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/ERC20Proxy.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAuthorizable.sol\";\n\n\ncontract ERC20Proxy is\n MixinAuthorizable\n{\n // Id of this proxy.\n bytes4 constant internal PROXY_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n \n // solhint-disable-next-line payable-fallback\n function () \n external\n {\n assembly {\n // The first 4 bytes of calldata holds the function selector\n let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)\n\n // `transferFrom` will be called with the following parameters:\n // assetData Encoded byte array.\n // from Address to transfer asset from.\n // to Address to transfer asset to.\n // amount Amount of asset to transfer.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {\n\n // To lookup a value in a mapping, we load from the storage location keccak256(k, p),\n // where k is the key left padded to 32 bytes and p is the storage slot\n let start := mload(64)\n mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(start, 32), authorized_slot)\n\n // Revert if authorized[msg.sender] == false\n if iszero(sload(keccak256(start, 64))) {\n // Revert with `Error(\"SENDER_NOT_AUTHORIZED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n \n /////// Token contract address ///////\n // The token address is found as follows:\n // * It is stored at offset 4 in `assetData` contents.\n // * This is stored at offset 32 from `assetData`.\n // * The offset to `assetData` from Params is stored at offset\n // 4 in calldata.\n // * The offset of Params in calldata is 4.\n // So we read location 4 and add 32 + 4 + 4 to it.\n let token := calldataload(add(calldataload(4), 40))\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFrom` selector.\n // Any trailing data in transferFromSelector will be\n // overwritten in the next `mstore` call.\n mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // We copy the fields `from`, `to` and `amount` in bulk\n // from our own calldata to the new calldata.\n calldatacopy(4, 36, 96)\n\n /////// Call `token.transferFrom` using the calldata ///////\n let success := call(\n gas, // forward all gas\n token, // call address of token contract\n 0, // don't send any ETH\n 0, // pointer to start of input\n 100, // length of input\n 0, // write output over input\n 32 // output size should be 32 bytes\n )\n\n /////// Check return data. ///////\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // nonzero 32 bytes value.\n // So the transfer succeeded if the call succeeded and either\n // returned nothing, or returned a non-zero 32 byte value. \n success := and(success, or(\n iszero(returndatasize),\n and(\n eq(returndatasize, 32),\n gt(mload(0), 0)\n )\n ))\n if success {\n return(0, 0)\n }\n \n // Revert with `Error(\"TRANSFER_FAILED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4)\n {\n return PROXY_ID;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\n\ncontract MixinAuthorizable is\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n \"SENDER_NOT_AUTHORIZED\"\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n \"TARGET_ALREADY_AUTHORIZED\"\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n\n delete authorized[target];\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n require(\n index < authorities.length,\n \"INDEX_OUT_OF_BOUNDS\"\n );\n require(\n authorities[index] == target,\n \"AUTHORIZED_ADDRESS_MISMATCH\"\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.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 solidity 0.4.24;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xde9de8664ed39125c63cc0d58d264a030799b57b5ca904c5c69d1ddd8352ad77",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0x9ad1b8209cea603892c9dfaa676bc737088b499a",
+ "links": {},
+ "constructorArgs": "[]"
+ },
+ "50": {
+ "address": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Token.json b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Token.json
new file mode 100644
index 000000000..837780e45
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC20Token.json
@@ -0,0 +1,230 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC20Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b506106a0806100206000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100c157806323b872dd146100e857806370a082311461011f578063a9059cbb1461014d578063dd62ed3e1461017e575b600080fd5b34801561008857600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356101b2565b604080519115158252519081900360200190f35b3480156100cd57600080fd5b506100d6610225565b60408051918252519081900360200190f35b3480156100f457600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561022b565b34801561012b57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff60043516610487565b34801561015957600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356104af565b34801561018a57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff6004358116906024351661063c565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120548211156102bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915290205482111561035e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156103f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526020818152604080832080548801905593881680835284832080548890039055600182528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3360009081526020819052604081205482111561052d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156105c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600160209081526040808320939094168252919091522054905600a165627a7a7230582049a166026f124a2c987796c84fbdc971bb7b3d917c525a7aeca272ff944e84c60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6A0 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x17E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x1B2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x22B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x487 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x4AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x63C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x35E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP4 DUP9 AND DUP1 DUP4 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE PUSH1 0x1 DUP3 MSTORE DUP5 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x49 LOG1 PUSH7 0x26F124A2C9877 SWAP7 0xc8 0x4f 0xbd 0xc9 PUSH18 0xBB7B3D917C525A7AECA272FF944E84C60029 ",
+ "sourceMap": "635:1822:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;635:1822:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100c157806323b872dd146100e857806370a082311461011f578063a9059cbb1461014d578063dd62ed3e1461017e575b600080fd5b34801561008857600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356101b2565b604080519115158252519081900360200190f35b3480156100cd57600080fd5b506100d6610225565b60408051918252519081900360200190f35b3480156100f457600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561022b565b34801561012b57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff60043516610487565b34801561015957600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356104af565b34801561018a57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff6004358116906024351661063c565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120548211156102bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915290205482111561035e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156103f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526020818152604080832080548801905593881680835284832080548890039055600182528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3360009081526020819052604081205482111561052d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156105c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600160209081526040808320939094168252919091522054905600a165627a7a7230582049a166026f124a2c987796c84fbdc971bb7b3d917c525a7aeca272ff944e84c60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x17E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x1B2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x22B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x487 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x4AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x63C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x35E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP4 DUP9 AND DUP1 DUP4 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE PUSH1 0x1 DUP3 MSTORE DUP5 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x49 LOG1 PUSH7 0x26F124A2C9877 SWAP7 0xc8 0x4f 0xbd 0xc9 PUSH18 0xBB7B3D917C525A7AECA272FF944E84C60029 ",
+ "sourceMap": "635:1822:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1928:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1928:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;802:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;802:26:0;;;;;;;;;;;;;;;;;;;;1296:626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1296:626:0;;;;;;;;;;;;;;2156:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2156:133:0;;;;;;;835:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;835:455:0;;;;;;;;;2295:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2295:160:0;;;;;;;;;;;;1928:222;2039:10;2011:4;2031:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;:38;;;2084;;;;;;;2011:4;;2031:29;;2039:10;;2084:38;;;;;;;;-1:-1:-1;2139:4:0;1928:222;;;;:::o;802:26::-;;;;:::o;1296:626::-;1435:15;;;1394:4;1435:15;;;;;;;;;;;:25;-1:-1:-1;1435:25:0;1414:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1543:14;;;;;;;:7;:14;;;;;;;;1558:10;1543:26;;;;;;;;:36;-1:-1:-1;1543:36:0;1522:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1690:13;;;:8;:13;;;;;;;;;;;1664:22;;;:39;;1643:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1747:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1780:15;;;;;;;;;:25;;;;;;;-1:-1:-1;1815:14:0;;;;;1830:10;1815:26;;;;;;;;:36;;;;;;;1866:28;;;;;;;1747:13;;1780:15;;1866:28;;;;;;;;;;-1:-1:-1;1911:4:0;1296:626;;;;;:::o;2156:133::-;2266:16;;2236:7;2266:16;;;;;;;;;;;;2156:133::o;835:455::-;964:10;914:4;955:20;;;;;;;;;;;:30;-1:-1:-1;955:30:0;934:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1094:13;;;:8;:13;;;;;;;;;;;1068:22;;;:39;;1047:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1160:10;1151:8;:20;;;;;;;;;;;:30;;;;;;;:20;1191:13;;;;;;;;;:23;;;;;;1229:33;;;;;;;1191:13;;1160:10;1229:33;;;;;;;;;;;-1:-1:-1;1279:4:0;835:455;;;;:::o;2295:160::-;2423:15;;;;2393:7;2423:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;2295:160::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/tokens/ERC20Token/ERC20Token.sol": {
+ "id": 0
+ },
+ "2.0.0/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/tokens/ERC20Token/ERC20Token.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 solidity 0.4.24;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract ERC20Token is IERC20Token {\n\n mapping (address => uint256) internal balances;\n mapping (address => mapping (address => uint256)) internal allowed;\n\n uint256 public totalSupply;\n\n function transfer(address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[_from] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n allowed[_from][msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_ALLOWANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function approve(address _spender, uint256 _value)\n public\n returns (bool)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n return balances[_owner];\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n returns (uint256)\n {\n return allowed[_owner][_spender];\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/IERC20Token.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 solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n"
+ },
+ "sourceTreeHashHex": "0x83f5c6eaadc10f6b60d2712425bd0f2d431ea54ee3d85bc82bed38f3d559d4f8",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Proxy.json b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Proxy.json
new file mode 100644
index 000000000..7fc4282da
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Proxy.json
@@ -0,0 +1,267 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC721Proxy",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getProxyId",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610fbc806100256000396000f3006080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146102ba578063494503d4146102ea578063707129391461032b5780638da5cb5b146103595780639ad267441461036e578063ae25532e1461039f578063b9181611146103e9578063d39de6e91461042b578063f2fde38b14610490575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e4000000000000000000000000000000000000000000000000000000008114156102b757604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b600160643503156101f7577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0e494e56414c49445f414d4f554e540000000000000000000000000000604052600060605260646000fd5b7f23b872dd000000000000000000000000000000000000000000000000000000006000526040602460043760043560206048820160443760288101356000806064600080855af1801561024657005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b3480156102c657600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166104be565b005b3480156102f657600080fd5b506103026004356106aa565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561033757600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166106df565b34801561036557600080fd5b506103026109d8565b34801561037a57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166024356109f4565b3480156103ab57600080fd5b506103b4610da9565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b3480156103f557600080fd5b5061041773ffffffffffffffffffffffffffffffffffffffff60043516610ddf565b604080519115158252519081900360200190f35b34801561043757600080fd5b50610440610df4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047c578181015183820152602001610464565b505050509050019250505060405180910390f35b34801561049c57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff60043516610e63565b60005473ffffffffffffffffffffffffffffffffffffffff16331461054457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156105d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106106b857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461076657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1615156107fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610991578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561087957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561098957600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108d157fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061090457fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906109839082610f49565b50610991565b600101610849565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610ba657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610c3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610caf57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610ce257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610d619082610f49565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610e5957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610f4657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610f6d57600083815260209020610f6d918101908301610f72565b505050565b610ddc91905b80821115610f8c5760008155600101610f78565b50905600a165627a7a723058206ee4875fb64ae5fa7cc19d60ec6f97889c210374b015734d3f22447404752fd70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0xFBC DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x2EA JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x359 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x490 JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x64 CALLDATALOAD SUB ISZERO PUSH2 0x1F7 JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xE494E56414C49445F414D4F554E540000000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x4 CALLDATALOAD PUSH1 0x20 PUSH1 0x48 DUP3 ADD PUSH1 0x44 CALLDATACOPY PUSH1 0x28 DUP2 ADD CALLDATALOAD PUSH1 0x0 DUP1 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL DUP1 ISZERO PUSH2 0x246 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x4BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH1 0x4 CALLDATALOAD PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x9D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x9F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B4 PUSH2 0xDA9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x417 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x437 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440 PUSH2 0xDF4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x464 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x544 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x766 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x991 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x989 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x904 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x983 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH2 0x991 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x849 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB10 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB80 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC34 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xCAF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xCE2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xD61 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE59 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE2E JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xF6D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xF72 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDDC SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF8C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF78 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH15 0xE4875FB64AE5FA7CC19D60EC6F9788 SWAP13 0x21 SUB PUSH21 0xB015734D3F22447404752FD7002900000000000000 ",
+ "sourceMap": "685:7681:0:-;;;329:5:6;:18;;-1:-1:-1;;;;;;329:18:6;337:10;329:18;;;685:7681:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146102ba578063494503d4146102ea578063707129391461032b5780638da5cb5b146103595780639ad267441461036e578063ae25532e1461039f578063b9181611146103e9578063d39de6e91461042b578063f2fde38b14610490575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e4000000000000000000000000000000000000000000000000000000008114156102b757604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b600160643503156101f7577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0e494e56414c49445f414d4f554e540000000000000000000000000000604052600060605260646000fd5b7f23b872dd000000000000000000000000000000000000000000000000000000006000526040602460043760043560206048820160443760288101356000806064600080855af1801561024657005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b3480156102c657600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166104be565b005b3480156102f657600080fd5b506103026004356106aa565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561033757600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166106df565b34801561036557600080fd5b506103026109d8565b34801561037a57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166024356109f4565b3480156103ab57600080fd5b506103b4610da9565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b3480156103f557600080fd5b5061041773ffffffffffffffffffffffffffffffffffffffff60043516610ddf565b604080519115158252519081900360200190f35b34801561043757600080fd5b50610440610df4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047c578181015183820152602001610464565b505050509050019250505060405180910390f35b34801561049c57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff60043516610e63565b60005473ffffffffffffffffffffffffffffffffffffffff16331461054457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156105d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106106b857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461076657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1615156107fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610991578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561087957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561098957600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108d157fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061090457fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906109839082610f49565b50610991565b600101610849565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610ba657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610c3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610caf57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610ce257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610d619082610f49565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610e5957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610f4657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610f6d57600083815260209020610f6d918101908301610f72565b505050565b610ddc91905b80821115610f8c5760008155600101610f78565b50905600a165627a7a723058206ee4875fb64ae5fa7cc19d60ec6f97889c210374b015734d3f22447404752fd70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x2EA JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x359 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x490 JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x64 CALLDATALOAD SUB ISZERO PUSH2 0x1F7 JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xE494E56414C49445F414D4F554E540000000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x4 CALLDATALOAD PUSH1 0x20 PUSH1 0x48 DUP3 ADD PUSH1 0x44 CALLDATACOPY PUSH1 0x28 DUP2 ADD CALLDATALOAD PUSH1 0x0 DUP1 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL DUP1 ISZERO PUSH2 0x246 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x4BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH1 0x4 CALLDATALOAD PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x9D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x9F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B4 PUSH2 0xDA9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x417 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x437 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440 PUSH2 0xDF4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x464 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x544 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x766 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x991 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x989 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x904 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x983 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH2 0x991 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x849 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB10 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB80 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC34 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xCAF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xCE2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xD61 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE59 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE2E JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xF6D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xF72 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDDC SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF8C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF78 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH15 0xE4875FB64AE5FA7CC19D60EC6F9788 SWAP13 0x21 SUB PUSH21 0xB015734D3F22447404752FD7002900000000000000 ",
+ "sourceMap": "685:7681:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;685:7681:0;1081:66;1077:1;1064:15;1060:88;1543:66;1533:8;1530:80;1527:2;;;1839;1833:9;;1877:6;1859:70;;1969:15;1964:2;1953:14;;1946:39;2080:20;;;2074:27;2067:35;2064:2;;;2203:66;2200:1;2193:77;2302:66;2298:2;2291:78;2401:66;2397:2;2390:78;2500:1;2496:2;2489:13;2533:3;2530:1;2523:14;2064:2;5773:1;5767:3;5754:17;5750:25;5747:2;;;5869:66;5866:1;5859:77;5968:66;5964:2;5957:78;6067:66;6063:2;6056:78;6166:1;6162:2;6155:13;6199:3;6196:1;6189:14;5747:2;6497:66;6494:1;6487:77;6792:2;6788;6785:1;6772:23;6932:1;6919:15;6994:2;6989;6972:15;6968:24;6964:2;6951:46;7139:2;7122:15;7118:24;7105:38;7564:1;7504;7449:3;7384:1;7326;7256:5;7201:3;7175:448;7643:7;7640:2;;;7673:12;7640:2;7805:66;7802:1;7795:77;7900:66;7896:2;7889:78;7995:66;7991:2;7984:78;8090:1;8086:2;8079:13;8119:3;8116:1;8109:14;1527:2;957:7190;685:7681;1146:320:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1146:320:1;;;;;;;;;1031:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1031:28:1;;;;;;;;;;;;;;;;;;;;;;;;1580:547;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1580:547:1;;;;;;;258:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:6;;;;2300:643:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2300:643:1;;;;;;;;;8251:113:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8251:113:0;;;;;;;;;;;;;;;;;;;;;;;982:43:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;982:43:1;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3040:138:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3040:138:1;;;;;;;;;;;;;;;;;500:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:6;;;;;;;1146:320:1;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1263:18:1;;;;;;;:10;:18;;;;;;;;1262:19;1241:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:18;;;;;;;1364:4;1343:18;;;;;;;;:25;;;;;;;;1378:11;27:10:-1;;23:18;;;45:23;;1378:24:1;;;;;;;;;;;;;;1417:42;1448:10;;1343:18;1417:42;;;1146:320;:::o;1031:28::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1031:28:1;:::o;1580:547::-;1815:9;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1699:18:1;;;;;;;:10;:18;;;;;;;;1678:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:18:1;;;;;;;:10;:18;;;;;1775:25;;;;;;1810:252;1834:11;:18;1830:22;;1810:252;;;1895:6;1877:24;;:11;1889:1;1877:14;;;;;;;;;;;;;;;;;;;;;;:24;1873:179;;;1938:11;1950:18;;:22;;;;1938:35;;;;;;;;;;;;;;;;1921:11;:14;;1938:35;;;;;1933:1;;1921:14;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;1991:11;:23;;;;;;;;;:::i;:::-;;2032:5;;1873:179;1854:3;;1810:252;;;2076:44;;2109:10;;2076:44;;;;;;;;;1580:547;;:::o;258:20:6:-;;;;;;:::o;2300:643:1:-;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:18:1;;;;;;;:10;:18;;;;;;;;2442:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:11;:18;2559:26;;2538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2683:6;2661:28;;:11;2673:5;2661:18;;;;;;;;;;;;;;;;;;;;;;:28;2640:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:18;;;;;;;:10;:18;;;;;2753:25;;;;;;2809:11;2821:18;;:22;;;;2809:35;;;;;;;;;;;;;;;;2788:11;:18;;2809:35;;;;;2800:5;;2788:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;2854:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;2892:44:1;;2925:10;;2892:44;;;;;;;;;2300:643;;:::o;8251:113:0:-;805:41;;;;;;;;;;;;;;;;8251:113;;:::o;982:43:1:-;;;;;;;;;;;;;;;:::o;3040:138::-;3121:9;3160:11;3153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;:::o;500:167:6:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;685:7681:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/ERC721Proxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/ERC721Proxy.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAuthorizable.sol\";\n\n\ncontract ERC721Proxy is\n MixinAuthorizable\n{\n // Id of this proxy.\n bytes4 constant internal PROXY_ID = bytes4(keccak256(\"ERC721Token(address,uint256)\"));\n\n // solhint-disable-next-line payable-fallback\n function () \n external\n {\n assembly {\n // The first 4 bytes of calldata holds the function selector\n let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)\n\n // `transferFrom` will be called with the following parameters:\n // assetData Encoded byte array.\n // from Address to transfer asset from.\n // to Address to transfer asset to.\n // amount Amount of asset to transfer.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {\n\n // To lookup a value in a mapping, we load from the storage location keccak256(k, p),\n // where k is the key left padded to 32 bytes and p is the storage slot\n let start := mload(64)\n mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(start, 32), authorized_slot)\n\n // Revert if authorized[msg.sender] == false\n if iszero(sload(keccak256(start, 64))) {\n // Revert with `Error(\"SENDER_NOT_AUTHORIZED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n\n // `transferFrom`.\n // The function is marked `external`, so no abi decodeding is done for\n // us. Instead, we expect the `calldata` memory to contain the\n // following:\n //\n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n //\n // (*): offset is computed from start of function parameters, so offset\n // by an additional 4 bytes in the calldata.\n //\n // WARNING: The ABIv2 specification allows additional padding between\n // the Params and Data section. This will result in a larger\n // offset to assetData.\n\n // Asset data itself is encoded as follows:\n //\n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 2 * 32 | function parameters: |\n // | | 4 | 12 + 20 | 1. token address |\n // | | 36 | | 2. tokenId |\n \n // We construct calldata for the `token.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 4 | | 1. from |\n // | | 36 | | 2. to |\n // | | 68 | | 3. tokenId |\n\n // There exists only 1 of each token.\n // require(amount == 1, \"INVALID_AMOUNT\")\n if sub(calldataload(100), 1) {\n // Revert with `Error(\"INVALID_AMOUNT\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000e494e56414c49445f414d4f554e540000000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n\n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFrom` selector.\n // Any trailing data in transferFromSelector will be\n // overwritten in the next `mstore` call.\n mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // We copy the fields `from` and `to` in bulk\n // from our own calldata to the new calldata.\n calldatacopy(4, 36, 64)\n\n // Copy `tokenId` field from our own calldata to the new calldata.\n let assetDataOffset := calldataload(4)\n calldatacopy(68, add(assetDataOffset, 72), 32)\n\n /////// Call `token.transferFrom` using the calldata ///////\n let token := calldataload(add(assetDataOffset, 40))\n let success := call(\n gas, // forward all gas\n token, // call address of token contract\n 0, // don't send any ETH\n 0, // pointer to start of input\n 100, // length of input\n 0, // write output to null\n 0 // output size is 0 bytes\n )\n if success {\n return(0, 0)\n }\n \n // Revert with `Error(\"TRANSFER_FAILED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4)\n {\n return PROXY_ID;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\n\ncontract MixinAuthorizable is\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n \"SENDER_NOT_AUTHORIZED\"\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n \"TARGET_ALREADY_AUTHORIZED\"\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n\n delete authorized[target];\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n require(\n index < authorities.length,\n \"INDEX_OUT_OF_BOUNDS\"\n );\n require(\n authorities[index] == target,\n \"AUTHORIZED_ADDRESS_MISMATCH\"\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.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 solidity 0.4.24;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xd9839b45ce637bedd02bd42cea1eac40261f2294e1b3566bf59a434ea31b2542",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0xbb428f7108971ecf1144700c4d37792f8b74f6b0",
+ "links": {},
+ "constructorArgs": "[]"
+ },
+ "50": {
+ "address": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Token.json b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Token.json
new file mode 100644
index 000000000..5597bc0ed
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/ERC721Token.json
@@ -0,0 +1,379 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC721Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "exists",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ },
+ {
+ "name": "_data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_approved",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b506040516200102d3803806200102d83398101604052805160208083015191830180519093929092019161004a9160009190850190610066565b50805161005e906001906020840190610066565b505050610101565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100a757805160ff19168380011785556100d4565b828001600101855582156100d4579182015b828111156100d45782518255916020019190600101906100b9565b506100e09291506100e4565b5090565b6100fe91905b808211156100e057600081556001016100ea565b90565b610f1c80620001116000396000f3006080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e6d565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610ee8565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015610ee157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a72305820aacec74571ad3fdadc48934e85686b1de73bc8471f19f195a66397983622eed90029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x102D CODESIZE SUB DUP1 PUSH3 0x102D DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP2 DUP4 ADD DUP1 MLOAD SWAP1 SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x4A SWAP2 PUSH1 0x0 SWAP2 SWAP1 DUP6 ADD SWAP1 PUSH2 0x66 JUMP JUMPDEST POP DUP1 MLOAD PUSH2 0x5E SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH2 0x66 JUMP JUMPDEST POP POP POP PUSH2 0x101 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xA7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xD4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xD4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xD4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xB9 JUMP JUMPDEST POP PUSH2 0xE0 SWAP3 SWAP2 POP PUSH2 0xE4 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xFE SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xEA JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xF1C DUP1 PUSH3 0x111 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xEE8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xaa 0xce 0xc7 GASLIMIT PUSH18 0xAD3FDADC48934E85686B1DE73BC8471F19F1 SWAP6 0xa6 PUSH4 0x97983622 0xee 0xd9 STOP 0x29 ",
+ "sourceMap": "1506:12636:0:-;;;2797:136;8:9:-1;5:2;;;30:1;27;20:12;5:2;2797:136:0;;;;;;;;;;;;;;;;;;;;;;;;2886:13;;2797:136;;;;;;;2886:13;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;2909:17:0;;;;:7;;:17;;;;;:::i;:::-;;2797:136;;1506:12636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1506:12636:0;;;-1:-1:-1;1506:12636:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063081812fc14610148578063095ea7b31461018957806323b872dd146101bc57806342842e0e146101f35780634f558e791461022a5780636352211e1461025657806370a082311461026e57806395d89b41146102ae578063a22cb465146102c3578063b88d4fde146102f6578063e985e9c514610372575b600080fd5b3480156100ca57600080fd5b506100d36103a6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010d5781810151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015457600080fd5b5061016060043561045a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561019557600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff60043516602435610482565b005b3480156101c857600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356105c0565b3480156101ff57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356106a3565b34801561023657600080fd5b506102426004356106db565b604080519115158252519081900360200190f35b34801561026257600080fd5b50610160600435610705565b34801561027a57600080fd5b5061029c73ffffffffffffffffffffffffffffffffffffffff6004351661073c565b60408051918252519081900360200190f35b3480156102ba57600080fd5b506100d3610789565b3480156102cf57600080fd5b506101ba73ffffffffffffffffffffffffffffffffffffffff600435166024351515610807565b34801561030257600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101ba9473ffffffffffffffffffffffffffffffffffffffff81358116956024803590921695604435953695608494019181908401838280828437509497506108c39650505050505050565b34801561037e57600080fd5b5061024273ffffffffffffffffffffffffffffffffffffffff60043581169060243516610902565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b820191906000526020600020905b81548152906001019060200180831161043357829003601f168201915b5050505050905090565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061048d82610705565b905073ffffffffffffffffffffffffffffffffffffffff83811690821614156104b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806104de57506104de8133610902565b15156104e957600080fd5b60006104f48361045a565b73ffffffffffffffffffffffffffffffffffffffff1614158061052c575073ffffffffffffffffffffffffffffffffffffffff831615155b156105bb5760008281526003602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b806105cb338261093d565b15156105d657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156105f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316151561061a57600080fd5b61062484836109d0565b61062e8483610abd565b6106388383610b8c565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b806106ae338261093d565b15156106b957600080fd5b6106d584848460206040519081016040528060008152506108c3565b50505050565b60009081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561073657600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561076057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156104505780601f1061042557610100808354040283529160200191610450565b73ffffffffffffffffffffffffffffffffffffffff821633141561082a57600080fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b816108ce338261093d565b15156108d957600080fd5b6108e48585856105c0565b6108f085858585610c4f565b15156108fb57600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60008061094983610705565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806109b857508373ffffffffffffffffffffffffffffffffffffffff166109a08461045a565b73ffffffffffffffffffffffffffffffffffffffff16145b806109c857506109c88185610902565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff166109f082610705565b73ffffffffffffffffffffffffffffffffffffffff1614610a1057600080fd5b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ab957600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b5050565b8173ffffffffffffffffffffffffffffffffffffffff16610add82610705565b73ffffffffffffffffffffffffffffffffffffffff1614610afd57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040902054610b2e906001610df6565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602090815260408083209490945591815260029091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610bbb57600080fd5b600081815260026020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff871690811790915583526004909152902054610c22906001610e6d565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526004602052604090209190915550565b600080610c5b85610ee8565b1515610c6a5760019150610ded565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d29578181015183820152602001610d11565b50505050905090810190601f168015610d565780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505050506040513d6020811015610da157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b600082821115610e6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b50900390565b600082820183811015610ee157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a72305820aacec74571ad3fdadc48934e85686b1de73bc8471f19f195a66397983622eed90029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xBE JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x148 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BC JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x26E JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x2AE JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x2C3 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x2F6 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x372 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x3A6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x10D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xF5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x13A JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x154 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x45A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x482 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x5C0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x6A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x236 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH1 0x4 CALLDATALOAD PUSH2 0x6DB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x160 PUSH1 0x4 CALLDATALOAD PUSH2 0x705 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x73C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD3 PUSH2 0x789 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1BA PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x807 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x302 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1BA SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x8C3 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x242 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x902 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x433 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x48D DUP3 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x4B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x4DE JUMPI POP PUSH2 0x4DE DUP2 CALLER PUSH2 0x902 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x4E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4F4 DUP4 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x52C JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x5BB JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x5CB CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5D6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x5F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x624 DUP5 DUP4 PUSH2 0x9D0 JUMP JUMPDEST PUSH2 0x62E DUP5 DUP4 PUSH2 0xABD JUMP JUMPDEST PUSH2 0x638 DUP4 DUP4 PUSH2 0xB8C JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x6AE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6D5 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0x8C3 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x736 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x760 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x450 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x425 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x450 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0x82A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0x8CE CALLER DUP3 PUSH2 0x93D JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8E4 DUP6 DUP6 DUP6 PUSH2 0x5C0 JUMP JUMPDEST PUSH2 0x8F0 DUP6 DUP6 DUP6 DUP6 PUSH2 0xC4F JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8FB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x949 DUP4 PUSH2 0x705 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0x9B8 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9A0 DUP5 PUSH2 0x45A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0x9C8 JUMPI POP PUSH2 0x9C8 DUP2 DUP6 PUSH2 0x902 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x9F0 DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xA10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xAB9 JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xADD DUP3 PUSH2 0x705 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xAFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xB2E SWAP1 PUSH1 0x1 PUSH2 0xDF6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x2 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xBBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0xC22 SWAP1 PUSH1 0x1 PUSH2 0xE6D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xC5B DUP6 PUSH2 0xEE8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC6A JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0xDED JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD29 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD11 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xD56 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD77 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD8B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xE67 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xEE1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xaa 0xce 0xc7 GASLIMIT PUSH18 0xAD3FDADC48934E85686B1DE73BC8471F19F1 SWAP6 0xa6 PUSH4 0x97983622 0xee 0xd9 STOP 0x29 ",
+ "sourceMap": "1506:12636:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3034:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3034:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5587:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5587:145:0;;;;;;;;;;;;;;;;;;;;;;;;4949:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4949:401:0;;;;;;;;;;;7191:362;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7191:362:0;;;;;;;;;;;;;;8184:254;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8184:254:0;;;;;;;;;;;;;;4340:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4340:178:0;;;;;;;;;;;;;;;;;;;;;;;3948:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3948:206:0;;;;;3547:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3547:180:0;;;;;;;;;;;;;;;;;;;;;;;3241:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3241:106:0;;;;6026:231;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6026:231:0;;;;;;;;;;;9140:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9140:339:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9140:339:0;;-1:-1:-1;9140:339:0;;-1:-1:-1;;;;;;;9140:339:0;6575:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6575:176:0;;;;;;;;;;;;3034:102;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3095:6;;3117:12;;3124:5;;3117:12;;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102;:::o;5587:145::-;5671:7;5701:24;;;:14;:24;;;;;;;;;5587:145::o;4949:401::-;5026:13;5042:17;5050:8;5042:7;:17::i;:::-;5026:33;-1:-1:-1;5077:12:0;;;;;;;;;5069:21;;;;;;5108:10;:19;;;;;:58;;;5131:35;5148:5;5155:10;5131:16;:35::i;:::-;5100:67;;;;;;;;5215:1;5182:21;5194:8;5182:11;:21::i;:::-;:35;;;;:56;;;-1:-1:-1;5221:17:0;;;;;5182:56;5178:166;;;5254:24;;;;:14;:24;;;;;;;;;:30;;;;;;;;;;;;;;5303;;;;;;;5254;;5303;;;;;;;;;;;;5178:166;4949:401;;;:::o;7191:362::-;7294:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;7326:19;;;;;7318:28;;;;;;7364:17;;;;;7356:26;;;;;;7393:30;7407:5;7414:8;7393:13;:30::i;:::-;7433:32;7449:5;7456:8;7433:15;:32::i;:::-;7475:25;7486:3;7491:8;7475:10;:25::i;:::-;7532:3;7516:30;;7525:5;7516:30;;;7537:8;7516:30;;;;;;;;;;;;;;;;;;7191:362;;;;:::o;8184:254::-;8316:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;8389:42;8406:5;8413:3;8418:8;8389:42;;;;;;;;;;;;;:16;:42::i;:::-;8184:254;;;;:::o;4340:178::-;4419:4;4455:20;;;:10;:20;;;;;;;;4492:19;;;4340:178::o;3948:206::-;4028:7;4067:20;;;:10;:20;;;;;;;;4105:19;;;4097:28;;;;;;4142:5;3948:206;-1:-1:-1;;3948:206:0:o;3547:180::-;3627:7;3658:20;;;;;3650:29;;;;;;-1:-1:-1;3696:24:0;;;;;;:16;:24;;;;;;;3547:180::o;3241:106::-;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3304:6;;3326:14;;3333:7;;3326:14;;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;6026:231;6119:17;;;6126:10;6119:17;;6111:26;;;;;;6165:10;6147:29;;;;:17;:29;;;;;;;;;:34;;;;;;;;;;;;:46;;;;;;;;;;;;;6208:42;;;;;;;6147:34;;6165:10;6208:42;;;;;;;;;;;6026:231;;:::o;9140:339::-;9293:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;9317:34;9330:5;9337:3;9342:8;9317:12;:34::i;:::-;9418:53;9443:5;9450:3;9455:8;9465:5;9418:24;:53::i;:::-;9410:62;;;;;;;;9140:339;;;;;:::o;6575:176::-;6708:25;;;;6681:4;6708:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;6575:176::o;9836:278::-;9946:4;9966:13;9982:17;9990:8;9982:7;:17::i;:::-;9966:33;;10028:5;10016:17;;:8;:17;;;:54;;;;10062:8;10037:33;;:21;10049:8;10037:11;:21::i;:::-;:33;;;10016:54;:91;;;;10074:33;10091:5;10098:8;10074:16;:33::i;:::-;10009:98;9836:278;-1:-1:-1;;;;9836:278:0:o;11261:303::-;11378:6;11357:27;;:17;11365:8;11357:7;:17::i;:::-;:27;;;11349:36;;;;;;11435:1;11399:24;;;:14;:24;;;;;;:38;:24;:38;11395:163;;11488:1;11453:24;;;:14;:24;;;;;;;;:37;;;;;;11509:38;;;;;;;11453:37;11509:38;;;;;;;;;;;11395:163;11261:303;;:::o;12357:245::-;12475:5;12454:26;;:17;12462:8;12454:7;:17::i;:::-;:26;;;12446:35;;;;;;12525:23;;;;;;;:16;:23;;;;;;12517:35;;12550:1;12517:7;:35::i;:::-;12491:23;;;;;;;;:16;:23;;;;;;;;:61;;;;12562:20;;;:10;:20;;;;:33;;;;;;12357:245::o;11835:235::-;11957:1;11925:20;;;:10;:20;;;;;;:34;:20;:34;11917:43;;;;;;11970:20;;;;:10;:20;;;;;;;;:26;;;;;;;;;;;;;12038:21;;:16;:21;;;;;;12030:33;;-1:-1:-1;12030:7:0;:33::i;:::-;12006:21;;;;;;;;:16;:21;;;;;:57;;;;-1:-1:-1;11835:235:0:o;13125:375::-;13285:4;13372:13;13310:15;13321:3;13310:10;:15::i;:::-;13309:16;13305:58;;;13348:4;13341:11;;;;13305:58;13404:3;13388:37;;;13426:5;13433:8;13443:5;13388:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13388:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13388:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13388:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13388:61:0;13467:25;;;13477:15;13467:25;;-1:-1:-1;13388:61:0;-1:-1:-1;13125:375:0;;;;;;;;:::o;501:208:3:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;697:5:3;;;501:208::o;715:230::-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:1;715:230;-1:-1:-1;;;715:230:3:o;13506:634:0:-;13587:4;14038:17;;14125:8;;13506:634::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": {
+ "id": 0
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": {
+ "id": 1
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": {
+ "id": 2
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 3
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n constructor (\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x3ec335d79ccc32077f0e27d3f570045c7e8434ce2c2d6bfdff32fce9a578ac57",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/Exchange.json b/packages/migrations/artifacts/2.0.0-beta-testnet/Exchange.json
new file mode 100644
index 000000000..b79053b5f
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/Exchange.json
@@ -0,0 +1,2244 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Exchange",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "filled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancelled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "preSign",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "leftOrder",
+ "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": "rightOrder",
+ "type": "tuple"
+ },
+ {
+ "name": "leftSignature",
+ "type": "bytes"
+ },
+ {
+ "name": "rightSignature",
+ "type": "bytes"
+ }
+ ],
+ "name": "matchOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "left",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "right",
+ "type": "tuple"
+ },
+ {
+ "name": "leftMakerAssetSpreadAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "matchedFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrderNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "name": "assetProxies",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "batchCancelOrders",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrKillOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "targetOrderEpoch",
+ "type": "uint256"
+ }
+ ],
+ "name": "cancelOrdersUpTo",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "assetProxyId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "getAssetProxy",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrKillOrder",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "name": "approval",
+ "type": "bool"
+ }
+ ],
+ "name": "setSignatureValidatorApproval",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowedValidators",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketSellOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "getOrdersInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "orderStatus",
+ "type": "uint8"
+ },
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "name": "orderTakerAssetFilledAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "",
+ "type": "tuple[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "preSigned",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketBuyOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrder",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "getOrderInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "orderStatus",
+ "type": "uint8"
+ },
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "name": "orderTakerAssetFilledAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderInfo",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "cancelOrder",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "orderEpoch",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "ZRX_ASSET_DATA",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketSellOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "abiEncodeFillOrder",
+ "outputs": [
+ {
+ "name": "fillOrderCalldata",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EIP712_DOMAIN_HASH",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketBuyOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "currentContextAddress",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "VERSION",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_zrxAssetData",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "SignatureValidatorApproval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipientAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "takerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "takerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "Fill",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipientAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "Cancel",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "orderEpoch",
+ "type": "uint256"
+ }
+ ],
+ "name": "CancelUpTo",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "id",
+ "type": "bytes4"
+ },
+ {
+ "indexed": false,
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "AssetProxyRegistered",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b506040516200573338038062005733833981018060405262000037919081019062000433565b805181906200004e90600090602084019062000332565b5050604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b60208310620001585780518252601f19909201916020918201910162000137565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b60208310620001e25780518252601f199092019160209182019101620001c1565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106200026c5780518252601f1990920191602091820191016200024b565b51815160209384036101000a6000190180199092169116179052604051919093018190038120620002a797969550935030920190506200048f565b6040516020818303038152906040526040518082805190602001908083835b60208310620002e75780518252601f199092019160209182019101620002c6565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600155505060028054600160a060020a0319163317905550620005639050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200037557805160ff1916838001178555620003a5565b82800160010185558215620003a5579182015b82811115620003a557825182559160200191906001019062000388565b50620003b3929150620003b7565b5090565b620003d491905b80821115620003b35760008155600101620003be565b90565b6000601f82018313620003e957600080fd5b815162000400620003fa82620004fc565b620004d5565b915080825260208301602083018583830111156200041d57600080fd5b6200042a83828462000530565b50505092915050565b6000602082840312156200044657600080fd5b81516001604060020a038111156200045d57600080fd5b6200046b84828501620003d7565b949350505050565b6200047e8162000524565b82525050565b6200047e81620003d4565b608081016200049f828762000484565b620004ae602083018662000484565b620004bd604083018562000484565b620004cc606083018462000473565b95945050505050565b6040518181016001604060020a0381118282101715620004f457600080fd5b604052919050565b60006001604060020a038211156200051357600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b60005b838110156200054d57818101518382015260200162000533565b838111156200055d576000848401525b50505050565b6151c080620005736000396000f3006080604052600436106101cc5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101d1578063288cdc91146101fc578063297bb70b1461021c5780632ac12622146102495780633683ef8e146102765780633c28d861146102985780633e228bae146102c55780633fd3c997146102e55780634ac14782146103125780634d0ae546146103325780634f9559b11461035257806350dde190146103725780636070410814610392578063642f2eaf146103bf57806364a3bc15146103df57806377fcce68146103ff5780637b8e35141461041f5780637e1d98081461043f5780637e9d74dc1461045f57806382c174d01461048c5780638da5cb5b146104ac57806393634702146104c1578063a3e20380146104e1578063b4be83d514610501578063bfc8bfce14610521578063c585bb9314610541578063c75e0a8114610561578063d46b02c31461058e578063d9bfa73e146105ae578063db123b1a146105ce578063dd1c7d18146105f0578063e2e4951114610610578063e306f77914610630578063e5fa431b14610645578063eea086ba14610665578063f2fde38b1461067a578063ffa1ad741461069a575b600080fd5b3480156101dd57600080fd5b506101e66106af565b6040516101f39190614d72565b60405180910390f35b34801561020857600080fd5b506101e661021736600461420d565b610803565b34801561022857600080fd5b5061023c610237366004614112565b610815565b6040516101f3919061500c565b34801561025557600080fd5b5061026961026436600461420d565b6108a9565b6040516101f39190614d64565b34801561028257600080fd5b5061029661029136600461424a565b6108be565b005b3480156102a457600080fd5b506102b86102b336600461437e565b610997565b6040516101f3919061501a565b3480156102d157600080fd5b5061023c6102e036600461443e565b610a83565b3480156102f157600080fd5b5061030561030036600461430d565b610b04565b6040516101f39190614e2e565b34801561031e57600080fd5b5061029661032d3660046140dd565b610b2c565b34801561033e57600080fd5b5061023c61034d366004614112565b610b65565b34801561035e57600080fd5b5061029661036d36600461420d565b610bef565b34801561037e57600080fd5b5061023c61038d366004614112565b610d13565b34801561039e57600080fd5b506103b26103ad36600461430d565b610d9d565b6040516101f39190614c84565b3480156103cb57600080fd5b506102696103da36600461420d565b610deb565b3480156103eb57600080fd5b5061023c6103fa36600461443e565b610e00565b34801561040b57600080fd5b5061029661041a3660046140ad565b610e5a565b34801561042b57600080fd5b5061026961043a366004614073565b610f05565b34801561044b57600080fd5b5061023c61045a3660046141a6565b610f25565b34801561046b57600080fd5b5061047f61047a3660046140dd565b610ffa565b6040516101f39190614d53565b34801561049857600080fd5b506102696104a736600461422b565b611097565b3480156104b857600080fd5b506103b26110b7565b3480156104cd57600080fd5b506102696104dc3660046142b2565b6110d3565b3480156104ed57600080fd5b5061023c6104fc3660046141a6565b6118f9565b34801561050d57600080fd5b5061023c61051c36600461443e565b611a0c565b34801561052d57600080fd5b5061029661053c366004614487565b611a9b565b34801561054d57600080fd5b5061029661055c366004614055565b611d34565b34801561056d57600080fd5b5061058161057c366004614349565b611f5f565b6040516101f39190615029565b34801561059a57600080fd5b506102966105a9366004614349565b612059565b3480156105ba57600080fd5b506101e66105c9366004614073565b612088565b3480156105da57600080fd5b506105e36120a5565b6040516101f39190614e1d565b3480156105fc57600080fd5b5061023c61060b3660046141a6565b612151565b34801561061c57600080fd5b506105e361062b36600461443e565b61221a565b34801561063c57600080fd5b506101e66123ce565b34801561065157600080fd5b5061023c6106603660046141a6565b6123d4565b34801561067157600080fd5b506103b26124aa565b34801561068657600080fd5b50610296610695366004614055565b6124c6565b3480156106a657600080fd5b506105e3612577565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b602083106107d357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610796565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b61081d613c7b565b600080610828613c7b565b86519250600091505b81831461089f57610888878381518110151561084957fe5b90602001906020020151878481518110151561086157fe5b90602001906020020151878581518110151561087957fe5b90602001906020020151611a0c565b905061089484826125ae565b600190910190610831565b5050509392505050565b60046020526000908152604090205460ff1681565b6108f9848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506110d3945050505050565b151561093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614edc565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61099f613ca4565b6109a7613cd3565b6109af613cd3565b61016080880151610140808901919091528801519087015260006109d288611f5f565b92506109dd87611f5f565b91506109e7612610565b90506109f38888612659565b610a078888856040015185604001516126b5565b805160200151909450610a2190899085908490808b612779565b6020808501510151610a3a90889084908490808a612779565b610a538882856020015186604001518860000151612996565b610a6c8782846020015185604001518860200151612996565b610a7888888387612a42565b505050949350505050565b610a8b613c7b565b6060610a9885858561221a565b9050608081825160208401305af4808015610aba5760018114610ad85761089f565b6000845260006020850152600060408501526000606085015261089f565b825184526020830151602085015260408301516040850152606083015160608501525050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b805160005b808214610b6057610b588382815181101515610b4957fe5b90602001906020020151612059565b600101610b31565b505050565b610b6d613c7b565b600080610b78613c7b565b86519250600091505b81831461089f57610bd88783815181101515610b9957fe5b906020019060200201518784815181101515610bb157fe5b906020019060200201518785815181101515610bc957fe5b90602001906020020151610e00565b9050610be484826125ae565b600190910190610b81565b600080600080610bfd612610565b935073ffffffffffffffffffffffffffffffffffffffff84163314610c225733610c25565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f5c565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610d04908690614d72565b60405180910390a35050505050565b610d1b613c7b565b600080610d26613c7b565b86519250600091505b81831461089f57610d868783815181101515610d4757fe5b906020019060200201518784815181101515610d5f57fe5b906020019060200201518785815181101515610d7757fe5b90602001906020020151610a83565b9050610d9284826125ae565b600190910190610d2f565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610e08613c7b565b610e13848484611a0c565b60208101519091508314610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f7c565b9392505050565b6000610e64612610565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610ef8908690614d64565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b610f2d613c7b565b60606000806000610f3c613c7b565b886000815181101515610f4b57fe5b906020019060200201516101600151945088519350600092505b828414610fee57848984815181101515610f7b57fe5b906020019060200201516101600181905250610f9b888760200151612c22565b9150610fc78984815181101515610fae57fe5b9060200190602002015183898681518110151561087957fe5b9050610fd386826125ae565b60208601518811610fe357610fee565b600190920191610f65565b50505050509392505050565b6060600060606000845192508260405190808252806020026020018201604052801561104057816020015b61102d613cd3565b8152602001906001900390816110255790505b509150600090505b80831461108f5761106f858281518110151561106057fe5b90602001906020020151611f5f565b828281518110151561107d57fe5b60209081029091010152600101611048565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000895111151561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f4c565b61112589612c64565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e8c565b8660ff16600981111561119657fe5b955060008660098111156111a657fe5b14156111de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f3c565b60018660098111156111ec57fe5b14156112345788511561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ffc565b600097506118eb565b600286600981111561124257fe5b141561137d578851604114611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b88600081518110151561129257fe5b01602001517f01000000000000000000000000000000000000000000000000000000000000009081900481020494506112d289600163ffffffff612d2816565b93506112e589602163ffffffff612d2816565b925060018b8686866040516000815260200160405260405161130a9493929190614dcd565b60206040516020810390808403906000865af115801561132e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c811690821614995092506118eb9050565b600386600981111561138b57fe5b14156115315788516041146113cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b8860008151811015156113db57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061141b89600163ffffffff612d2816565b935061142e89602163ffffffff612d2816565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114cf57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611492565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261130a9450925089918991508890614dcd565b600486600981111561153f57fe5b141561159e5788511561157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ffc565b73ffffffffffffffffffffffffffffffffffffffff8a16331497506118eb565b60058660098111156115ac57fe5b141561165f576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611606908e908d90600401614dad565b602060405180830381600087803b15801561162057600080fd5b505af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061165891908101906141ef565b97506118eb565b600686600981111561166d57fe5b141561171a5761167c89612d73565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff1615156116c457600097506118eb565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611606908e908e908e90600401614d80565b600786600981111561172857fe5b14156117685760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff1697506118eb565b600886600981111561177657fe5b14156118b95788516041146117b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b8860008151811015156117c657fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061180689600163ffffffff612d2816565b935061181989602163ffffffff612d2816565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b018260001916600019168152602001915050604051602081830303815290604052604051808280519060200190808383602083106114cf57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611492565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e8c565b505050505050509392505050565b611901613c7b565b6060600080600080611911613c7b565b89600081518110151561192057fe5b906020019060200201516101400151955089519450600093505b8385146119ff57858a8581518110151561195057fe5b602090810290910101516101400152865161196c908a90612c22565b92506119af8a8581518110151561197f57fe5b9060200190602002015160a001518b8681518110151561199b57fe5b906020019060200201516080015185612dec565b91506119db8a858151811015156119c257fe5b90602001906020020151838a87815181101515610d7757fe5b90506119e787826125ae565b865189116119f4576119ff565b60019093019261193a565b5050505050509392505050565b611a14613c7b565b611a1c613cd3565b6000806000611a2a88611f5f565b9350611a34612610565b9250611a488860a001518560400151612c22565b9150611a548783612e09565b9050611a648885858a858b612779565b611a6e8882612e1f565b9450611a8588848660200151876040015189612996565b611a90888487612e7f565b505050509392505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f8c565b611b31611b2c888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612f94945050505050565b6131dc565b60008181526008602052604090205490915060ff1615611b7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ecc565b73ffffffffffffffffffffffffffffffffffffffff86163314611c4e57611bd5818785858080601f016020809104026020016040519081016040528093929190818152602001838380828437506110d3945050505050565b1515611c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614efc565b73ffffffffffffffffffffffffffffffffffffffff86163314611d2b57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611d8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f9c565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e2b919081019061432b565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e6c565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611f519084908790614e02565b60405180910390a150505050565b611f67613cd3565b611f708261335c565b6020808301829052600091825260039052604090819020549082015260808201511515611fa45760015b60ff168152610de6565b60a08201511515611fb6576002611f9a565b60a0820151604082015110611fcc576005611f9a565b6101008201514210611fdf576004611f9a565b60208082015160009081526004909152604090205460ff1615612003576006611f9a565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115612050576006611f9a565b60038152919050565b612061613cd3565b61206a82611f5f565b9050612076828261336a565b61208482826020015161347c565b5050565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156121495780601f1061211e57610100808354040283529160200191612149565b820191906000526020600020905b81548152906001019060200180831161212c57829003601f168201915b505050505081565b612159613c7b565b60606000806000612168613c7b565b88600081518110151561217757fe5b906020019060200201516101600151945088519350600092505b828414610fee578489848151811015156121a757fe5b9060200190602002015161016001819052506121c7888760200151612c22565b91506121f389848151811015156121da57fe5b90602001906020020151838986815181101515610d7757fe5b90506121ff86826125ae565b6020860151881161220f57610fee565b600190920191612191565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b81811015612321578351855260209485019490930192600101612303565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561236a57835185526020948501949093019260010161234c565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b818110156123b2578351855260209485019490930192600101612394565b5060208a0184038a525050505050505050508090509392505050565b60015481565b6123dc613c7b565b60606000806000806123ec613c7b565b8960008151811015156123fb57fe5b906020019060200201516101400151955089519450600093505b8385146119ff57858a8581518110151561242b57fe5b6020908102909101015161014001528651612447908a90612c22565b925061245a8a8581518110151561197f57fe5b91506124868a8581518110151561246d57fe5b90602001906020020151838a8781518110151561087957fe5b905061249287826125ae565b8651891161249f576119ff565b600190930192612415565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff163314612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f9c565b73ffffffffffffffffffffffffffffffffffffffff81161561257457600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b815181516125bc9190613523565b8252602080830151908201516125d29190613523565b6020830152604080830151908201516125eb9190613523565b6040830152606080830151908201516126049190613523565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156126515760095473ffffffffffffffffffffffffffffffffffffffff16612653565b335b92915050565b61266b8260a001518260a0015161356d565b61267d8360800151836080015161356d565b1015612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fdc565b6126bd613ca4565b6000806000806126d18960a0015188612c22565b93506126e18860a0015187612c22565b92506126f183896080015161356d565b6126ff858a60a0015161356d565b116127215783915061271a8860a00151896080015184612dec565b905061273a565b82905061273788608001518960a0015183612dec565b91505b6127448983612e1f565b85526127508882612e1f565b60208087018290528651519101516127689190612c22565b604086015250505050949350505050565b845160ff166003146127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fbc565b8215156127f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f0c565b606086015173ffffffffffffffffffffffffffffffffffffffff161561286357606086015173ffffffffffffffffffffffffffffffffffffffff163314612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fcc565b602086015173ffffffffffffffffffffffffffffffffffffffff16156128ee578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff161415156128ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e4c565b604085015115156129445761290c85602001518760000151836110d3565b1515612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e9c565b612957828760a0015188608001516135c8565b1561298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614eec565b505050505050565b6129a4828260200151613523565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c37112996612a33968f96339692959194909390614c92565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612aec5780601f10612ac157610100808354040283529160200191612aec565b820191906000526020600020905b815481529060010190602001808311612acf57829003601f168201915b50505050509050612b1485610140015186600001518660000151856020015160200151613619565b61014084015184518651845160200151612b3093929190613619565b612b498561014001518660000151858560400151613619565b612b658186600001518760400151856000015160400151613619565b612b818185600001518660400151856020015160400151613619565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612beb57612be681848760400151612be1866000015160600151876020015160600151613523565b613619565b612c1b565b612c0381848760400151856000015160600151613619565b612c1b81848660400151856020015160600151613619565b5050505050565b600082821115612c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e5c565b50900390565b6000808251111515612ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f2c565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612cd257fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e7c565b50016020015190565b60006014825110151515612db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fac565b612dc18260148451036137aa565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612e01612dfb858461356d565b8461380b565b949350505050565b6000818310612e185781610e53565b5090919050565b612e27613c7b565b6020810182905260a08301516080840151612e43918491612dec565b815260a083015160c0840151612e5a918491612dec565b604082015260a083015160e0840151612e74918491612dec565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612f295780601f10612efe57610100808354040283529160200191612f29565b820191906000526020600020905b815481529060010190602001808311612f0c57829003601f168201915b50505050509050612f498461014001518560000151858560000151613619565b612f628461016001518486600001518560200151613619565b612f7a81856000015186604001518560400151613619565b612f8e818486604001518560600151613619565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b602083106130bd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613080565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061315357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613116565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208883529082018c905273ffffffffffffffffffffffffffffffffffffffff8b1693820193909352606081018390526080902096509093505050505b50509392505050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b6020831061326857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161322b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b6020831061330c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016132cf565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000612653611b2c83613822565b805160009060ff166003146133ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fbc565b606083015173ffffffffffffffffffffffffffffffffffffffff161561341e57606083015173ffffffffffffffffffffffffffffffffffffffff16331461341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fcc565b613426612610565b835190915073ffffffffffffffffffffffffffffffffffffffff808316911614610b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614eac565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf79261351792339290614d16565b60405180910390a45050565b600082820183811015613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ebc565b8091505b5092915050565b6000808315156135805760009150613566565b5082820282848281151561359057fe5b0414613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ebc565b6000806000848015156135d757fe5b86850991508115156135ec57600092506131d3565b61360b6135fc83620f424061356d565b613606888761356d565b61380b565b6103e8109695505050505050565b600080600083111561298e578551600310613660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f6c565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff168015156136e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f1c565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561378557895181526020998a01990161376d565b61020084858403866000895af180151561379d573d85fd5b5050505050505050505050565b6000816014018351101515156137ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fac565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600080828481151561381957fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310613aaa57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a6d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310613b4557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b08565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613be057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613ba3565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613cb9613c7b565b8152602001613cc6613c7b565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610e5382356150cf565b6000601f82018313613d1057600080fd5b8135613d23613d1e8261505e565b615037565b81815260209384019390925082018360005b83811015613d615781358601613d4b8882613ebd565b8452506020928301929190910190600101613d35565b5050505092915050565b6000601f82018313613d7c57600080fd5b8135613d8a613d1e8261505e565b81815260209384019390925082018360005b83811015613d615781358601613db28882613f0c565b8452506020928301929190910190600101613d9c565b6000601f82018313613dd957600080fd5b8135613de7613d1e8261505e565b91508181835260208401935060208101905083856020840282011115613e0c57600080fd5b60005b83811015613d615781613e228882613e50565b8452506020928301929190910190600101613e0f565b6000610e5382356150e8565b6000610e5382516150e8565b6000610e5382356150ed565b6000610e5382356150f0565b6000610e5382516150f0565b600080601f83018413613e8657600080fd5b50813567ffffffffffffffff811115613e9e57600080fd5b602083019150836001820283011115613eb657600080fd5b9250929050565b6000601f82018313613ece57600080fd5b8135613edc613d1e8261507f565b91508082526020830160208301858383011115613ef857600080fd5b613f03838284615126565b50505092915050565b60006101808284031215613f1f57600080fd5b613f2a610180615037565b90506000613f388484613cf3565b8252506020613f4984848301613cf3565b6020830152506040613f5d84828501613cf3565b6040830152506060613f7184828501613cf3565b6060830152506080613f8584828501613e50565b60808301525060a0613f9984828501613e50565b60a08301525060c0613fad84828501613e50565b60c08301525060e0613fc184828501613e50565b60e083015250610100613fd684828501613e50565b61010083015250610120613fec84828501613e50565b6101208301525061014082013567ffffffffffffffff81111561400e57600080fd5b61401a84828501613ebd565b6101408301525061016082013567ffffffffffffffff81111561403c57600080fd5b61404884828501613ebd565b6101608301525092915050565b60006020828403121561406757600080fd5b6000612e018484613cf3565b6000806040838503121561408657600080fd5b60006140928585613cf3565b92505060206140a385828601613cf3565b9150509250929050565b600080604083850312156140c057600080fd5b60006140cc8585613cf3565b92505060206140a385828601613e38565b6000602082840312156140ef57600080fd5b813567ffffffffffffffff81111561410657600080fd5b612e0184828501613d6b565b60008060006060848603121561412757600080fd5b833567ffffffffffffffff81111561413e57600080fd5b61414a86828701613d6b565b935050602084013567ffffffffffffffff81111561416757600080fd5b61417386828701613dc8565b925050604084013567ffffffffffffffff81111561419057600080fd5b61419c86828701613cff565b9150509250925092565b6000806000606084860312156141bb57600080fd5b833567ffffffffffffffff8111156141d257600080fd5b6141de86828701613d6b565b935050602061417386828701613e50565b60006020828403121561420157600080fd5b6000612e018484613e44565b60006020828403121561421f57600080fd5b6000612e018484613e50565b6000806040838503121561423e57600080fd5b60006140928585613e50565b6000806000806060858703121561426057600080fd5b600061426c8787613e50565b945050602061427d87828801613cf3565b935050604085013567ffffffffffffffff81111561429a57600080fd5b6142a687828801613e74565b95989497509550505050565b6000806000606084860312156142c757600080fd5b60006142d38686613e50565b93505060206142e486828701613cf3565b925050604084013567ffffffffffffffff81111561430157600080fd5b61419c86828701613ebd565b60006020828403121561431f57600080fd5b6000612e018484613e5c565b60006020828403121561433d57600080fd5b6000612e018484613e68565b60006020828403121561435b57600080fd5b813567ffffffffffffffff81111561437257600080fd5b612e0184828501613f0c565b6000806000806080858703121561439457600080fd5b843567ffffffffffffffff8111156143ab57600080fd5b6143b787828801613f0c565b945050602085013567ffffffffffffffff8111156143d457600080fd5b6143e087828801613f0c565b935050604085013567ffffffffffffffff8111156143fd57600080fd5b61440987828801613ebd565b925050606085013567ffffffffffffffff81111561442657600080fd5b61443287828801613ebd565b91505092959194509250565b60008060006060848603121561445357600080fd5b833567ffffffffffffffff81111561446a57600080fd5b61447686828701613f0c565b93505060206142e486828701613e50565b600080600080600080608087890312156144a057600080fd5b60006144ac8989613e50565b96505060206144bd89828a01613cf3565b955050604087013567ffffffffffffffff8111156144da57600080fd5b6144e689828a01613e74565b9450945050606087013567ffffffffffffffff81111561450557600080fd5b61451189828a01613e74565b92509250509295509295509295565b614529816150cf565b82525050565b600061453a826150cb565b80845260208401935061454c836150c5565b60005b8281101561457c57614562868351614c44565b61456b826150c5565b60609690960195915060010161454f565b5093949350505050565b614529816150e8565b614529816150ed565b614529816150f0565b60006145ac826150cb565b8084526145c0816020860160208601615132565b6145c98161515e565b9093016020019392505050565b6145298161511b565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b80516080830190614bd2848261458f565b506020820151614be5602085018261458f565b506040820151614bf8604085018261458f565b506060820151612f8e606085018261458f565b8051610120830190614c1d8482614bc1565b506020820151614c306080850182614bc1565b506040820151612f8e61010085018261458f565b80516060830190614c558482614c7b565b506020820151614c68602085018261458f565b506040820151612f8e604085018261458f565b61452981615115565b602081016126538284614520565b6101008101614ca1828b614520565b614cae602083018a614520565b614cbb604083018961458f565b614cc8606083018861458f565b614cd5608083018761458f565b614ce260a083018661458f565b81810360c0830152614cf481856145a1565b905081810360e0830152614d0881846145a1565b9a9950505050505050505050565b60608101614d248286614520565b8181036020830152614d3681856145a1565b90508181036040830152614d4a81846145a1565b95945050505050565b60208082528101610e53818461452f565b602081016126538284614586565b60208101612653828461458f565b60608101614d8e828661458f565b614d9b6020830185614520565b8181036040830152614d4a81846145a1565b60408101614dbb828561458f565b8181036020830152612e0181846145a1565b60808101614ddb828761458f565b614de86020830186614c7b565b614df5604083018561458f565b614d4a606083018461458f565b60408101614e108285614598565b610e536020830184614520565b60208082528101610e5381846145a1565b6020810161265382846145d6565b60208082528101612653816145df565b602080825281016126538161460f565b602080825281016126538161463f565b602080825281016126538161466f565b602080825281016126538161469f565b60208082528101612653816146f5565b6020808252810161265381614725565b6020808252810161265381614755565b6020808252810161265381614785565b60208082528101612653816147b5565b60208082528101612653816147e5565b6020808252810161265381614815565b6020808252810161265381614845565b6020808252810161265381614875565b60208082528101612653816148a5565b60208082528101612653816148d5565b602080825281016126538161492b565b602080825281016126538161495b565b602080825281016126538161498b565b60208082528101612653816149bb565b60208082528101612653816149eb565b6020808252810161265381614a1b565b6020808252810161265381614a4b565b6020808252810161265381614a7b565b6020808252810161265381614ad1565b6020808252810161265381614b01565b6020808252810161265381614b31565b6020808252810161265381614b61565b6020808252810161265381614b91565b608081016126538284614bc1565b61012081016126538284614c0b565b606081016126538284614c44565b60405181810167ffffffffffffffff8111828210171561505657600080fd5b604052919050565b600067ffffffffffffffff82111561507557600080fd5b5060209081020190565b600067ffffffffffffffff82111561509657600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b6000612653826150cf565b82818337506000910152565b60005b8381101561514d578181015183820152602001615135565b83811115612f8e5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058205b35b998f509ef17d5ed53396f0d09790e407be84326372fe36670a99687e30b6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5733 CODESIZE SUB DUP1 PUSH3 0x5733 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x433 JUMP JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH3 0x4E SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x332 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x158 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x137 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x1E2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x1C1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x26C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x24B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH3 0x2A7 SWAP8 SWAP7 SWAP6 POP SWAP4 POP ADDRESS SWAP3 ADD SWAP1 POP PUSH3 0x48F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x2E7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x2C6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x1 SSTORE POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE POP PUSH3 0x563 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x375 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3A5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3A5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3A5 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x388 JUMP JUMPDEST POP PUSH3 0x3B3 SWAP3 SWAP2 POP PUSH3 0x3B7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3D4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3B3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3BE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x400 PUSH3 0x3FA DUP3 PUSH3 0x4FC JUMP JUMPDEST PUSH3 0x4D5 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x41D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x42A DUP4 DUP3 DUP5 PUSH3 0x530 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x446 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x45D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x46B DUP5 DUP3 DUP6 ADD PUSH3 0x3D7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x524 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x47E DUP2 PUSH3 0x3D4 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH3 0x49F DUP3 DUP8 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4AE PUSH1 0x20 DUP4 ADD DUP7 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4BD PUSH1 0x40 DUP4 ADD DUP6 PUSH3 0x484 JUMP JUMPDEST PUSH3 0x4CC PUSH1 0x60 DUP4 ADD DUP5 PUSH3 0x473 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x4F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x54D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x533 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x55D JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x51C0 DUP1 PUSH3 0x573 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CC JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1D1 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x249 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x372 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x392 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3BF JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3DF JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3FF JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x43F JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x45F JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x48C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4AC JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4E1 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x5AE JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5F0 JUMPI DUP1 PUSH4 0xE2E49511 EQ PUSH2 0x610 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x630 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x645 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x67A JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x69A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x6AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0x803 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0x815 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x500C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x264 CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0x8A9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D64 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x291 CALLDATASIZE PUSH1 0x4 PUSH2 0x424A JUMP JUMPDEST PUSH2 0x8BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B8 PUSH2 0x2B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x437E JUMP JUMPDEST PUSH2 0x997 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x501A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x2E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x305 PUSH2 0x300 CALLDATASIZE PUSH1 0x4 PUSH2 0x430D JUMP JUMPDEST PUSH2 0xB04 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4E2E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x32D CALLDATASIZE PUSH1 0x4 PUSH2 0x40DD JUMP JUMPDEST PUSH2 0xB2C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0xB65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x36D CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0xBEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x38D CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0xD13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x430D JUMP JUMPDEST PUSH2 0xD9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4C84 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x3DA CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0xDEB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x3FA CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0xE00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x40B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x41A CALLDATASIZE PUSH1 0x4 PUSH2 0x40AD JUMP JUMPDEST PUSH2 0xE5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x43A CALLDATASIZE PUSH1 0x4 PUSH2 0x4073 JUMP JUMPDEST PUSH2 0xF05 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x45A CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0xF25 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x47F PUSH2 0x47A CALLDATASIZE PUSH1 0x4 PUSH2 0x40DD JUMP JUMPDEST PUSH2 0xFFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D53 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x498 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x4A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x422B JUMP JUMPDEST PUSH2 0x1097 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x10B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x4DC CALLDATASIZE PUSH1 0x4 PUSH2 0x42B2 JUMP JUMPDEST PUSH2 0x10D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x4FC CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x18F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x51C CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0x1A0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x4487 JUMP JUMPDEST PUSH2 0x1A9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x4055 JUMP JUMPDEST PUSH2 0x1D34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x581 PUSH2 0x57C CALLDATASIZE PUSH1 0x4 PUSH2 0x4349 JUMP JUMPDEST PUSH2 0x1F5F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x5029 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x5A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4349 JUMP JUMPDEST PUSH2 0x2059 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x5C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4073 JUMP JUMPDEST PUSH2 0x2088 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x20A5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4E1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x60B CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x2151 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x62B CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0x221A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x651 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x23D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x24AA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x686 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x695 CALLDATASIZE PUSH1 0x4 PUSH2 0x4055 JUMP JUMPDEST PUSH2 0x24C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x2577 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x7D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x796 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x81D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x828 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0x888 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x849 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x861 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1A0C JUMP JUMPDEST SWAP1 POP PUSH2 0x894 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x831 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x8F9 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10D3 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x93A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EDC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x99F PUSH2 0x3CA4 JUMP JUMPDEST PUSH2 0x9A7 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x9AF PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x9D2 DUP9 PUSH2 0x1F5F JUMP JUMPDEST SWAP3 POP PUSH2 0x9DD DUP8 PUSH2 0x1F5F JUMP JUMPDEST SWAP2 POP PUSH2 0x9E7 PUSH2 0x2610 JUMP JUMPDEST SWAP1 POP PUSH2 0x9F3 DUP9 DUP9 PUSH2 0x2659 JUMP JUMPDEST PUSH2 0xA07 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x26B5 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0xA21 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2779 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0xA3A SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2779 JUMP JUMPDEST PUSH2 0xA53 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2996 JUMP JUMPDEST PUSH2 0xA6C DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2996 JUMP JUMPDEST PUSH2 0xA78 DUP9 DUP9 DUP4 DUP8 PUSH2 0x2A42 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA8B PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA98 DUP6 DUP6 DUP6 PUSH2 0x221A JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP2 DUP3 MLOAD PUSH1 0x20 DUP5 ADD ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xABA JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xAD8 JUMPI PUSH2 0x89F JUMP JUMPDEST PUSH1 0x0 DUP5 MSTORE PUSH1 0x0 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x89F JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP1 DUP3 EQ PUSH2 0xB60 JUMPI PUSH2 0xB58 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB49 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x2059 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB31 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xB78 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0xBD8 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB99 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBB1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBC9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE00 JUMP JUMPDEST SWAP1 POP PUSH2 0xBE4 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xB81 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xBFD PUSH2 0x2610 JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xC22 JUMPI CALLER PUSH2 0xC25 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xC9C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F5C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xD04 SWAP1 DUP7 SWAP1 PUSH2 0x4D72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD1B PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xD26 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0xD86 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD47 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD5F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA83 JUMP JUMPDEST SWAP1 POP PUSH2 0xD92 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xD2F JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE08 PUSH2 0x3C7B JUMP JUMPDEST PUSH2 0xE13 DUP5 DUP5 DUP5 PUSH2 0x1A0C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xE53 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F7C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE64 PUSH2 0x2610 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xEF8 SWAP1 DUP7 SWAP1 PUSH2 0x4D64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF2D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xF3C PUSH2 0x3C7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xFEE JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xF9B DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0xFC7 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFAE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xFD3 DUP7 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0xFE3 JUMPI PUSH2 0xFEE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1040 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x102D PUSH2 0x3CD3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1025 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0x108F JUMPI PUSH2 0x106F DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1060 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1F5F JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x107D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1048 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x111C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F4C JUMP JUMPDEST PUSH2 0x1125 DUP10 PUSH2 0x2C64 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x1187 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E8C JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1196 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11A6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11DE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F3C JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11EC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1234 JUMPI DUP9 MLOAD ISZERO PUSH2 0x122B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FFC JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1242 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x137D JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1283 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1292 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x12D2 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x12E5 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x130A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4DCD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x132E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x18EB SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x138B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1531 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x13CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13DB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x141B DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x142E DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x14CF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1492 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x130A SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4DCD JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x153F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x159E JUMPI DUP9 MLOAD ISZERO PUSH2 0x157E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15AC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x165F JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1606 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4DAD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1620 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1634 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1658 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41EF JUMP JUMPDEST SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x166D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x171A JUMPI PUSH2 0x167C DUP10 PUSH2 0x2D73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x16C4 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1606 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D80 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1728 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1776 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x18B9 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x17B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C6 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1806 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1819 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x14CF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E8C JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1901 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1911 PUSH2 0x3C7B JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1920 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x19FF JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1950 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x196C SWAP1 DUP11 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x19AF DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x197F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2DEC JUMP JUMPDEST SWAP2 POP PUSH2 0x19DB DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x19E7 DUP8 DUP3 PUSH2 0x25AE JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x19F4 JUMPI PUSH2 0x19FF JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x193A JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A14 PUSH2 0x3C7B JUMP JUMPDEST PUSH2 0x1A1C PUSH2 0x3CD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1A2A DUP9 PUSH2 0x1F5F JUMP JUMPDEST SWAP4 POP PUSH2 0x1A34 PUSH2 0x2610 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A48 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A54 DUP8 DUP4 PUSH2 0x2E09 JUMP JUMPDEST SWAP1 POP PUSH2 0x1A64 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2779 JUMP JUMPDEST PUSH2 0x1A6E DUP9 DUP3 PUSH2 0x2E1F JUMP JUMPDEST SWAP5 POP PUSH2 0x1A85 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2996 JUMP JUMPDEST PUSH2 0x1A90 DUP9 DUP5 DUP8 PUSH2 0x2E7F JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1AEE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F8C JUMP JUMPDEST PUSH2 0x1B31 PUSH2 0x1B2C DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2F94 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x31DC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1B7D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4ECC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1C4E JUMPI PUSH2 0x1BD5 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10D3 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C0D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FEC JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1CE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D2B JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1D8C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F9C JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1E2B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x432B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1EB0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E6C JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1F51 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4E02 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1F67 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x1F70 DUP3 PUSH2 0x335C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FA4 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FB6 JUMPI PUSH1 0x2 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x1FCC JUMPI PUSH1 0x5 PUSH2 0x1F9A JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1FDF JUMPI PUSH1 0x4 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2003 JUMPI PUSH1 0x6 PUSH2 0x1F9A JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2050 JUMPI PUSH1 0x6 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2061 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x206A DUP3 PUSH2 0x1F5F JUMP JUMPDEST SWAP1 POP PUSH2 0x2076 DUP3 DUP3 PUSH2 0x336A JUMP JUMPDEST PUSH2 0x2084 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x347C JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2149 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x211E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2149 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x212C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x2159 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2168 PUSH2 0x3C7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2177 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xFEE JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21A7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x21C7 DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0x21F3 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21DA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x21FF DUP7 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0x220F JUMPI PUSH2 0xFEE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x2191 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2321 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2303 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x236A JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x234C JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x23B2 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2394 JUMP JUMPDEST POP PUSH1 0x20 DUP11 ADD DUP5 SUB DUP11 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23DC PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x23EC PUSH2 0x3C7B JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23FB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x19FF JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x242B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x2447 SWAP1 DUP11 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x245A DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x197F JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2486 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x246D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2492 DUP8 DUP3 PUSH2 0x25AE JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x249F JUMPI PUSH2 0x19FF JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x2415 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2517 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F9C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2574 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x25BC SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x25D2 SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x25EB SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2604 SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2651 JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2653 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x266B DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST PUSH2 0x267D DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST LT ISZERO PUSH2 0x2084 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FDC JUMP JUMPDEST PUSH2 0x26BD PUSH2 0x3CA4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x26D1 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2C22 JUMP JUMPDEST SWAP4 POP PUSH2 0x26E1 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x26F1 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST PUSH2 0x26FF DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST GT PUSH2 0x2721 JUMPI DUP4 SWAP2 POP PUSH2 0x271A DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2DEC JUMP JUMPDEST SWAP1 POP PUSH2 0x273A JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x2737 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2DEC JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x2744 DUP10 DUP4 PUSH2 0x2E1F JUMP JUMPDEST DUP6 MSTORE PUSH2 0x2750 DUP9 DUP3 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2768 SWAP2 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x27B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FBC JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x27F0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F0C JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2863 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2863 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x28EE JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x28EE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E4C JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2944 JUMPI PUSH2 0x290C DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x10D3 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x2944 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E9C JUMP JUMPDEST PUSH2 0x2957 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x35C8 JUMP JUMPDEST ISZERO PUSH2 0x298E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EEC JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x29A4 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x2A33 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4C92 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2AEC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2AC1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2AEC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2ACF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2B14 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2B30 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B49 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B65 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B81 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2BEB JUMPI PUSH2 0x2BE6 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2BE1 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3523 JUMP JUMPDEST PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2C1B JUMP JUMPDEST PUSH2 0x2C03 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2C1B DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2C5E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E5C JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2CA2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F2C JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2CD2 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2D6A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E7C JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2DB3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FAC JUMP JUMPDEST PUSH2 0x2DC1 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x37AA JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E01 PUSH2 0x2DFB DUP6 DUP5 PUSH2 0x356D JUMP JUMPDEST DUP5 PUSH2 0x380B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2E18 JUMPI DUP2 PUSH2 0xE53 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2E27 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2E43 SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2E5A SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2E74 SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2F29 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EFE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2F29 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2F0C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2F49 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F62 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F7A DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F8E DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3080 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3153 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3116 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP9 DUP4 MSTORE SWAP1 DUP3 ADD DUP13 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP7 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3268 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x322B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x330C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x32CF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2653 PUSH2 0x1B2C DUP4 PUSH2 0x3822 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x33AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FBC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x341E JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x341E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST PUSH2 0x3426 PUSH2 0x2610 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0xB60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EAC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x3517 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4D16 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x3562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EBC JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3580 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x3566 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3590 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x3562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EBC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x35D7 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x35EC JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x31D3 JUMP JUMPDEST PUSH2 0x360B PUSH2 0x35FC DUP4 PUSH3 0xF4240 PUSH2 0x356D JUMP JUMPDEST PUSH2 0x3606 DUP9 DUP8 PUSH2 0x356D JUMP JUMPDEST PUSH2 0x380B JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x298E JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x3660 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F6C JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x36E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F1C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3785 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x376D JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x379D JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x37EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FAC JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x3819 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3AAA JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A6D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B45 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B08 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3BE0 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BA3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3CB9 PUSH2 0x3C7B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3CC6 PUSH2 0x3C7B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50CF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D23 PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST PUSH2 0x5037 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3D4B DUP9 DUP3 PUSH2 0x3EBD JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D35 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D8A PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3DB2 DUP9 DUP3 PUSH2 0x3F0C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D9C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3DD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3DE7 PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3E0C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 PUSH2 0x3E22 DUP9 DUP3 PUSH2 0x3E50 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3E0F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 MLOAD PUSH2 0x50E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 MLOAD PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3E86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3EB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3ECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3EDC PUSH2 0x3D1E DUP3 PUSH2 0x507F JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F03 DUP4 DUP3 DUP5 PUSH2 0x5126 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F2A PUSH2 0x180 PUSH2 0x5037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F38 DUP5 DUP5 PUSH2 0x3CF3 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3F49 DUP5 DUP5 DUP4 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3F5D DUP5 DUP3 DUP6 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3F71 DUP5 DUP3 DUP6 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3F85 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3F99 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3FAD DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3FC1 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3FD6 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3FEC DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x400E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401A DUP5 DUP3 DUP6 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x403C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4048 DUP5 DUP3 DUP6 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4067 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4086 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4092 DUP6 DUP6 PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x40A3 DUP6 DUP3 DUP7 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x40C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x40CC DUP6 DUP6 PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x40A3 DUP6 DUP3 DUP7 ADD PUSH2 0x3E38 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E01 DUP5 DUP3 DUP6 ADD PUSH2 0x3D6B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x413E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x414A DUP7 DUP3 DUP8 ADD PUSH2 0x3D6B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4173 DUP7 DUP3 DUP8 ADD PUSH2 0x3DC8 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x419C DUP7 DUP3 DUP8 ADD PUSH2 0x3CFF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x41BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41DE DUP7 DUP3 DUP8 ADD PUSH2 0x3D6B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4173 DUP7 DUP3 DUP8 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E44 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x421F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x423E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4092 DUP6 DUP6 PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x426C DUP8 DUP8 PUSH2 0x3E50 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x427D DUP8 DUP3 DUP9 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x429A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42A6 DUP8 DUP3 DUP9 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x42C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x42D3 DUP7 DUP7 PUSH2 0x3E50 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x42E4 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x419C DUP7 DUP3 DUP8 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x431F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E5C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x433D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x435B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E01 DUP5 DUP3 DUP6 ADD PUSH2 0x3F0C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43B7 DUP8 DUP3 DUP9 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43E0 DUP8 DUP3 DUP9 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4409 DUP8 DUP3 DUP9 ADD PUSH2 0x3EBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4432 DUP8 DUP3 DUP9 ADD PUSH2 0x3EBD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x446A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4476 DUP7 DUP3 DUP8 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x42E4 DUP7 DUP3 DUP8 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x44A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x44AC DUP10 DUP10 PUSH2 0x3E50 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x44BD DUP10 DUP3 DUP11 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x44DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x44E6 DUP10 DUP3 DUP11 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4505 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4511 DUP10 DUP3 DUP11 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50CF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x453A DUP3 PUSH2 0x50CB JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x454C DUP4 PUSH2 0x50C5 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x457C JUMPI PUSH2 0x4562 DUP7 DUP4 MLOAD PUSH2 0x4C44 JUMP JUMPDEST PUSH2 0x456B DUP3 PUSH2 0x50C5 JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x454F JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50E8 JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50ED JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x45AC DUP3 PUSH2 0x50CB JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x45C0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5132 JUMP JUMPDEST PUSH2 0x45C9 DUP2 PUSH2 0x515E JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x511B JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4BD2 DUP5 DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4BE5 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4BF8 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4C1D DUP5 DUP3 PUSH2 0x4BC1 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4C30 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4BC1 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4C55 DUP5 DUP3 PUSH2 0x4C7B JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4C68 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x5115 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4CA1 DUP3 DUP12 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x4CAE PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x4CBB PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CC8 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CD5 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CE2 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x458F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4CF4 DUP2 DUP6 PUSH2 0x45A1 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4D08 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4D24 DUP3 DUP7 PUSH2 0x4520 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4D36 DUP2 DUP6 PUSH2 0x45A1 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4D4A DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE53 DUP2 DUP5 PUSH2 0x452F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4586 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x458F JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4D8E DUP3 DUP7 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4D9B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x4520 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4D4A DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4DBB DUP3 DUP6 PUSH2 0x458F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E01 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4DDB DUP3 DUP8 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4DE8 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4C7B JUMP JUMPDEST PUSH2 0x4DF5 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4D4A PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x458F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4E10 DUP3 DUP6 PUSH2 0x4598 JUMP JUMPDEST PUSH2 0xE53 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4520 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE53 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x45D6 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x45DF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x460F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x463F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x466F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x469F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x46F5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4725 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4755 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4785 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x47B5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x47E5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4815 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4845 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4875 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x48A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x48D5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x492B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x495B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x498B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x49BB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x49EB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A1B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A4B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A7B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4AD1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B01 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B31 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B61 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B91 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4BC1 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4C0B JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4C44 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5056 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5075 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5096 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2653 DUP3 PUSH2 0x50CF JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x514D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5135 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2F8E JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 JUMPDEST CALLDATALOAD 0xb9 SWAP9 0xf5 MULMOD 0xef OR 0xd5 0xed MSTORE8 CODECOPY PUSH16 0xD09790E407BE84326372FE36670A996 DUP8 0xe3 SIGNEXTEND PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
+ "sourceMap": "931:616:2:-;;;1229:316;8:9:-1;5:2;;;30:1;27;20:12;5:2;1229:316:2;;;;;;;;;;;;;;;;;;;;;;;;1919:29:17;;1306:13:2;;1919:29:17;;:14;;:29;;;;;:::i;:::-;-1:-1:-1;;1042:148:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1042:148:18;;;;;;;;1032:159;;1042:148;;;;;1032:159;;;;1042:148;1032:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1032:159:18;;;;;;;;;;;;1502:18;;;;;;;;;;;;;;;;1486:36;;1032:159;;-1:-1:-1;1032:159:18;;-1:-1:-1;1486:36:18;;;;-1:-1:-1;1502:18:18;1486:36;1502:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1486:36:18;;;;;;;;;;;;1552:21;;;;;274:1:-1;1552:21:18;;;;;;;;;;1536:39;;1486:36;;-1:-1:-1;1486:36:18;;-1:-1:-1;1536:39:18;;;;-1:-1:-1;274:1;1536:39:18;1552:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1536:39:18;;;;;;;;;;;1413:199;;;;-1:-1:-1;1536:39:18;-1:-1:-1;1597:4:18;;1413:199;;-1:-1:-1;1413:199:18;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1413:199:18;;;1403:210;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1403:210:18;;;;;;;;;;274:1:-1;1382:231:18;-1:-1:-1;;329:5:30;:18;;-1:-1:-1;;;;;;329:18:30;337:10;329:18;;;-1:-1:-1;931:616:2;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;931:616:2;;;-1:-1:-1;931:616:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;6:442:-1:-;;111:4;99:17;;95:27;-1:-1;85:2;;136:1;133;126:12;85:2;166:6;160:13;188:64;203:48;244:6;203:48;;;188:64;;;179:73;;272:6;265:5;258:21;308:4;300:6;296:17;341:4;334:5;330:16;376:3;367:6;362:3;358:16;355:25;352:2;;;393:1;390;383:12;352:2;403:39;435:6;430:3;425;403:39;;;78:370;;;;;;;;456:360;;580:2;568:9;559:7;555:23;551:32;548:2;;;596:1;593;586:12;548:2;631:24;;-1:-1;;;;;664:30;;661:2;;;707:1;704;697:12;661:2;727:73;792:7;783:6;772:9;768:22;727:73;;;717:83;542:274;-1:-1;;;;542:274;823:110;896:31;921:5;896:31;;;891:3;884:44;878:55;;;940:110;1013:31;1038:5;1013:31;;1057:497;1249:3;1234:19;;1264:61;1238:9;1298:6;1264:61;;;1336:62;1394:2;1383:9;1379:18;1370:6;1336:62;;;1409;1467:2;1456:9;1452:18;1443:6;1409:62;;;1482;1540:2;1529:9;1525:18;1516:6;1482:62;;;1220:334;;;;;;;;1561:256;1623:2;1617:9;1649:17;;;-1:-1;;;;;1709:34;;1745:22;;;1706:62;1703:2;;;1781:1;1778;1771:12;1703:2;1797;1790:22;1601:216;;-1:-1;1601:216;1824:258;;-1:-1;;;;;1959:6;1956:30;1953:2;;;1999:1;1996;1989:12;1953:2;-1:-1;2072:4;2043;2020:17;;;;-1:-1;;2016:33;2062:15;;1890:192;2089:128;-1:-1;;;;;2158:54;;2141:76;2311:268;2376:1;2383:101;2397:6;2394:1;2391:13;2383:101;;;2464:11;;;2458:18;2445:11;;;2438:39;2419:2;2412:10;2383:101;;;2499:6;2496:1;2493:13;2490:2;;;2564:1;2555:6;2550:3;2546:16;2539:27;2490:2;2360:219;;;;;;931:616:2;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106101cc5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416632624b2d981146101d1578063288cdc91146101fc578063297bb70b1461021c5780632ac12622146102495780633683ef8e146102765780633c28d861146102985780633e228bae146102c55780633fd3c997146102e55780634ac14782146103125780634d0ae546146103325780634f9559b11461035257806350dde190146103725780636070410814610392578063642f2eaf146103bf57806364a3bc15146103df57806377fcce68146103ff5780637b8e35141461041f5780637e1d98081461043f5780637e9d74dc1461045f57806382c174d01461048c5780638da5cb5b146104ac57806393634702146104c1578063a3e20380146104e1578063b4be83d514610501578063bfc8bfce14610521578063c585bb9314610541578063c75e0a8114610561578063d46b02c31461058e578063d9bfa73e146105ae578063db123b1a146105ce578063dd1c7d18146105f0578063e2e4951114610610578063e306f77914610630578063e5fa431b14610645578063eea086ba14610665578063f2fde38b1461067a578063ffa1ad741461069a575b600080fd5b3480156101dd57600080fd5b506101e66106af565b6040516101f39190614d72565b60405180910390f35b34801561020857600080fd5b506101e661021736600461420d565b610803565b34801561022857600080fd5b5061023c610237366004614112565b610815565b6040516101f3919061500c565b34801561025557600080fd5b5061026961026436600461420d565b6108a9565b6040516101f39190614d64565b34801561028257600080fd5b5061029661029136600461424a565b6108be565b005b3480156102a457600080fd5b506102b86102b336600461437e565b610997565b6040516101f3919061501a565b3480156102d157600080fd5b5061023c6102e036600461443e565b610a83565b3480156102f157600080fd5b5061030561030036600461430d565b610b04565b6040516101f39190614e2e565b34801561031e57600080fd5b5061029661032d3660046140dd565b610b2c565b34801561033e57600080fd5b5061023c61034d366004614112565b610b65565b34801561035e57600080fd5b5061029661036d36600461420d565b610bef565b34801561037e57600080fd5b5061023c61038d366004614112565b610d13565b34801561039e57600080fd5b506103b26103ad36600461430d565b610d9d565b6040516101f39190614c84565b3480156103cb57600080fd5b506102696103da36600461420d565b610deb565b3480156103eb57600080fd5b5061023c6103fa36600461443e565b610e00565b34801561040b57600080fd5b5061029661041a3660046140ad565b610e5a565b34801561042b57600080fd5b5061026961043a366004614073565b610f05565b34801561044b57600080fd5b5061023c61045a3660046141a6565b610f25565b34801561046b57600080fd5b5061047f61047a3660046140dd565b610ffa565b6040516101f39190614d53565b34801561049857600080fd5b506102696104a736600461422b565b611097565b3480156104b857600080fd5b506103b26110b7565b3480156104cd57600080fd5b506102696104dc3660046142b2565b6110d3565b3480156104ed57600080fd5b5061023c6104fc3660046141a6565b6118f9565b34801561050d57600080fd5b5061023c61051c36600461443e565b611a0c565b34801561052d57600080fd5b5061029661053c366004614487565b611a9b565b34801561054d57600080fd5b5061029661055c366004614055565b611d34565b34801561056d57600080fd5b5061058161057c366004614349565b611f5f565b6040516101f39190615029565b34801561059a57600080fd5b506102966105a9366004614349565b612059565b3480156105ba57600080fd5b506101e66105c9366004614073565b612088565b3480156105da57600080fd5b506105e36120a5565b6040516101f39190614e1d565b3480156105fc57600080fd5b5061023c61060b3660046141a6565b612151565b34801561061c57600080fd5b506105e361062b36600461443e565b61221a565b34801561063c57600080fd5b506101e66123ce565b34801561065157600080fd5b5061023c6106603660046141a6565b6123d4565b34801561067157600080fd5b506103b26124aa565b34801561068657600080fd5b50610296610695366004614055565b6124c6565b3480156106a657600080fd5b506105e3612577565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b602083106107d357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610796565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902081565b60036020526000908152604090205481565b61081d613c7b565b600080610828613c7b565b86519250600091505b81831461089f57610888878381518110151561084957fe5b90602001906020020151878481518110151561086157fe5b90602001906020020151878581518110151561087957fe5b90602001906020020151611a0c565b905061089484826125ae565b600190910190610831565b5050509392505050565b60046020526000908152604090205460ff1681565b6108f9848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506110d3945050505050565b151561093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614edc565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61099f613ca4565b6109a7613cd3565b6109af613cd3565b61016080880151610140808901919091528801519087015260006109d288611f5f565b92506109dd87611f5f565b91506109e7612610565b90506109f38888612659565b610a078888856040015185604001516126b5565b805160200151909450610a2190899085908490808b612779565b6020808501510151610a3a90889084908490808a612779565b610a538882856020015186604001518860000151612996565b610a6c8782846020015185604001518860200151612996565b610a7888888387612a42565b505050949350505050565b610a8b613c7b565b6060610a9885858561221a565b9050608081825160208401305af4808015610aba5760018114610ad85761089f565b6000845260006020850152600060408501526000606085015261089f565b825184526020830151602085015260408301516040850152606083015160608501525050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b805160005b808214610b6057610b588382815181101515610b4957fe5b90602001906020020151612059565b600101610b31565b505050565b610b6d613c7b565b600080610b78613c7b565b86519250600091505b81831461089f57610bd88783815181101515610b9957fe5b906020019060200201518784815181101515610bb157fe5b906020019060200201518785815181101515610bc957fe5b90602001906020020151610e00565b9050610be484826125ae565b600190910190610b81565b600080600080610bfd612610565b935073ffffffffffffffffffffffffffffffffffffffff84163314610c225733610c25565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610c9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f5c565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610d04908690614d72565b60405180910390a35050505050565b610d1b613c7b565b600080610d26613c7b565b86519250600091505b81831461089f57610d868783815181101515610d4757fe5b906020019060200201518784815181101515610d5f57fe5b906020019060200201518785815181101515610d7757fe5b90602001906020020151610a83565b9050610d9284826125ae565b600190910190610d2f565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610e08613c7b565b610e13848484611a0c565b60208101519091508314610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f7c565b9392505050565b6000610e64612610565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610ef8908690614d64565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b610f2d613c7b565b60606000806000610f3c613c7b565b886000815181101515610f4b57fe5b906020019060200201516101600151945088519350600092505b828414610fee57848984815181101515610f7b57fe5b906020019060200201516101600181905250610f9b888760200151612c22565b9150610fc78984815181101515610fae57fe5b9060200190602002015183898681518110151561087957fe5b9050610fd386826125ae565b60208601518811610fe357610fee565b600190920191610f65565b50505050509392505050565b6060600060606000845192508260405190808252806020026020018201604052801561104057816020015b61102d613cd3565b8152602001906001900390816110255790505b509150600090505b80831461108f5761106f858281518110151561106057fe5b90602001906020020151611f5f565b828281518110151561107d57fe5b60209081029091010152600101611048565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000895111151561111c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f4c565b61112589612c64565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610611187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e8c565b8660ff16600981111561119657fe5b955060008660098111156111a657fe5b14156111de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f3c565b60018660098111156111ec57fe5b14156112345788511561122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ffc565b600097506118eb565b600286600981111561124257fe5b141561137d578851604114611283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b88600081518110151561129257fe5b01602001517f01000000000000000000000000000000000000000000000000000000000000009081900481020494506112d289600163ffffffff612d2816565b93506112e589602163ffffffff612d2816565b925060018b8686866040516000815260200160405260405161130a9493929190614dcd565b60206040516020810390808403906000865af115801561132e573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c811690821614995092506118eb9050565b600386600981111561138b57fe5b14156115315788516041146113cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b8860008151811015156113db57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061141b89600163ffffffff612d2816565b935061142e89602163ffffffff612d2816565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114cf57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611492565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261130a9450925089918991508890614dcd565b600486600981111561153f57fe5b141561159e5788511561157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ffc565b73ffffffffffffffffffffffffffffffffffffffff8a16331497506118eb565b60058660098111156115ac57fe5b141561165f576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611606908e908d90600401614dad565b602060405180830381600087803b15801561162057600080fd5b505af1158015611634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061165891908101906141ef565b97506118eb565b600686600981111561166d57fe5b141561171a5761167c89612d73565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff1615156116c457600097506118eb565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611606908e908e908e90600401614d80565b600786600981111561172857fe5b14156117685760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff1697506118eb565b600886600981111561177657fe5b14156118b95788516041146117b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e3c565b8860008151811015156117c657fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061180689600163ffffffff612d2816565b935061181989602163ffffffff612d2816565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b018260001916600019168152602001915050604051602081830303815290604052604051808280519060200190808383602083106114cf57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611492565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e8c565b505050505050509392505050565b611901613c7b565b6060600080600080611911613c7b565b89600081518110151561192057fe5b906020019060200201516101400151955089519450600093505b8385146119ff57858a8581518110151561195057fe5b602090810290910101516101400152865161196c908a90612c22565b92506119af8a8581518110151561197f57fe5b9060200190602002015160a001518b8681518110151561199b57fe5b906020019060200201516080015185612dec565b91506119db8a858151811015156119c257fe5b90602001906020020151838a87815181101515610d7757fe5b90506119e787826125ae565b865189116119f4576119ff565b60019093019261193a565b5050505050509392505050565b611a14613c7b565b611a1c613cd3565b6000806000611a2a88611f5f565b9350611a34612610565b9250611a488860a001518560400151612c22565b9150611a548783612e09565b9050611a648885858a858b612779565b611a6e8882612e1f565b9450611a8588848660200151876040015189612996565b611a90888487612e7f565b505050509392505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff1615611aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f8c565b611b31611b2c888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612f94945050505050565b6131dc565b60008181526008602052604090205490915060ff1615611b7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ecc565b73ffffffffffffffffffffffffffffffffffffffff86163314611c4e57611bd5818785858080601f016020809104026020016040519081016040528093929190818152602001838380828437506110d3945050505050565b1515611c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fec565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611ce5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614efc565b73ffffffffffffffffffffffffffffffffffffffff86163314611d2b57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611d8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f9c565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e2b919081019061432b565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e6c565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611f519084908790614e02565b60405180910390a150505050565b611f67613cd3565b611f708261335c565b6020808301829052600091825260039052604090819020549082015260808201511515611fa45760015b60ff168152610de6565b60a08201511515611fb6576002611f9a565b60a0820151604082015110611fcc576005611f9a565b6101008201514210611fdf576004611f9a565b60208082015160009081526004909152604090205460ff1615612003576006611f9a565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115612050576006611f9a565b60038152919050565b612061613cd3565b61206a82611f5f565b9050612076828261336a565b61208482826020015161347c565b5050565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156121495780601f1061211e57610100808354040283529160200191612149565b820191906000526020600020905b81548152906001019060200180831161212c57829003601f168201915b505050505081565b612159613c7b565b60606000806000612168613c7b565b88600081518110151561217757fe5b906020019060200201516101600151945088519350600092505b828414610fee578489848151811015156121a757fe5b9060200190602002015161016001819052506121c7888760200151612c22565b91506121f389848151811015156121da57fe5b90602001906020020151838986815181101515610d7757fe5b90506121ff86826125ae565b6020860151881161220f57610fee565b600190920191612191565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b81811015612321578351855260209485019490930192600101612303565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561236a57835185526020948501949093019260010161234c565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b818110156123b2578351855260209485019490930192600101612394565b5060208a0184038a525050505050505050508090509392505050565b60015481565b6123dc613c7b565b60606000806000806123ec613c7b565b8960008151811015156123fb57fe5b906020019060200201516101400151955089519450600093505b8385146119ff57858a8581518110151561242b57fe5b6020908102909101015161014001528651612447908a90612c22565b925061245a8a8581518110151561197f57fe5b91506124868a8581518110151561246d57fe5b90602001906020020151838a8781518110151561087957fe5b905061249287826125ae565b8651891161249f576119ff565b600190930192612415565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff163314612517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f9c565b73ffffffffffffffffffffffffffffffffffffffff81161561257457600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b815181516125bc9190613523565b8252602080830151908201516125d29190613523565b6020830152604080830151908201516125eb9190613523565b6040830152606080830151908201516126049190613523565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156126515760095473ffffffffffffffffffffffffffffffffffffffff16612653565b335b92915050565b61266b8260a001518260a0015161356d565b61267d8360800151836080015161356d565b1015612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fdc565b6126bd613ca4565b6000806000806126d18960a0015188612c22565b93506126e18860a0015187612c22565b92506126f183896080015161356d565b6126ff858a60a0015161356d565b116127215783915061271a8860a00151896080015184612dec565b905061273a565b82905061273788608001518960a0015183612dec565b91505b6127448983612e1f565b85526127508882612e1f565b60208087018290528651519101516127689190612c22565b604086015250505050949350505050565b845160ff166003146127b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fbc565b8215156127f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f0c565b606086015173ffffffffffffffffffffffffffffffffffffffff161561286357606086015173ffffffffffffffffffffffffffffffffffffffff163314612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fcc565b602086015173ffffffffffffffffffffffffffffffffffffffff16156128ee578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff161415156128ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e4c565b604085015115156129445761290c85602001518760000151836110d3565b1515612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e9c565b612957828760a0015188608001516135c8565b1561298e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614eec565b505050505050565b6129a4828260200151613523565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c37112996612a33968f96339692959194909390614c92565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612aec5780601f10612ac157610100808354040283529160200191612aec565b820191906000526020600020905b815481529060010190602001808311612acf57829003601f168201915b50505050509050612b1485610140015186600001518660000151856020015160200151613619565b61014084015184518651845160200151612b3093929190613619565b612b498561014001518660000151858560400151613619565b612b658186600001518760400151856000015160400151613619565b612b818185600001518660400151856020015160400151613619565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612beb57612be681848760400151612be1866000015160600151876020015160600151613523565b613619565b612c1b565b612c0381848760400151856000015160600151613619565b612c1b81848660400151856020015160600151613619565b5050505050565b600082821115612c5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e5c565b50900390565b6000808251111515612ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f2c565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612cd257fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614e7c565b50016020015190565b60006014825110151515612db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fac565b612dc18260148451036137aa565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612e01612dfb858461356d565b8461380b565b949350505050565b6000818310612e185781610e53565b5090919050565b612e27613c7b565b6020810182905260a08301516080840151612e43918491612dec565b815260a083015160c0840151612e5a918491612dec565b604082015260a083015160e0840151612e74918491612dec565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612f295780601f10612efe57610100808354040283529160200191612f29565b820191906000526020600020905b815481529060010190602001808311612f0c57829003601f168201915b50505050509050612f498461014001518560000151858560000151613619565b612f628461016001518486600001518560200151613619565b612f7a81856000015186604001518560400151613619565b612f8e818486604001518560600151613619565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b602083106130bd57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613080565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061315357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613116565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208883529082018c905273ffffffffffffffffffffffffffffffffffffffff8b1693820193909352606081018390526080902096509093505050505b50509392505050565b60006040805190810160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250600154836040516020018084805190602001908083835b6020831061326857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161322b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250838101929092525060408051808403830181529281019081905282519293509182918401908083835b6020831061330c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016132cf565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169216919091179052604051920182900390912095945050505050565b6000612653611b2c83613822565b805160009060ff166003146133ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fbc565b606083015173ffffffffffffffffffffffffffffffffffffffff161561341e57606083015173ffffffffffffffffffffffffffffffffffffffff16331461341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fcc565b613426612610565b835190915073ffffffffffffffffffffffffffffffffffffffff808316911614610b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614eac565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf79261351792339290614d16565b60405180910390a45050565b600082820183811015613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ebc565b8091505b5092915050565b6000808315156135805760009150613566565b5082820282848281151561359057fe5b0414613562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614ebc565b6000806000848015156135d757fe5b86850991508115156135ec57600092506131d3565b61360b6135fc83620f424061356d565b613606888761356d565b61380b565b6103e8109695505050505050565b600080600083111561298e578551600310613660576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f6c565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff168015156136e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614f1c565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b8181101561378557895181526020998a01990161376d565b61020084858403866000895af180151561379d573d85fd5b5050505050505050505050565b6000816014018351101515156137ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093190614fac565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600080828481151561381957fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310613aaa57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613a6d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310613b4557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613b08565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310613be057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613ba3565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b61012060405190810160405280613cb9613c7b565b8152602001613cc6613c7b565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610e5382356150cf565b6000601f82018313613d1057600080fd5b8135613d23613d1e8261505e565b615037565b81815260209384019390925082018360005b83811015613d615781358601613d4b8882613ebd565b8452506020928301929190910190600101613d35565b5050505092915050565b6000601f82018313613d7c57600080fd5b8135613d8a613d1e8261505e565b81815260209384019390925082018360005b83811015613d615781358601613db28882613f0c565b8452506020928301929190910190600101613d9c565b6000601f82018313613dd957600080fd5b8135613de7613d1e8261505e565b91508181835260208401935060208101905083856020840282011115613e0c57600080fd5b60005b83811015613d615781613e228882613e50565b8452506020928301929190910190600101613e0f565b6000610e5382356150e8565b6000610e5382516150e8565b6000610e5382356150ed565b6000610e5382356150f0565b6000610e5382516150f0565b600080601f83018413613e8657600080fd5b50813567ffffffffffffffff811115613e9e57600080fd5b602083019150836001820283011115613eb657600080fd5b9250929050565b6000601f82018313613ece57600080fd5b8135613edc613d1e8261507f565b91508082526020830160208301858383011115613ef857600080fd5b613f03838284615126565b50505092915050565b60006101808284031215613f1f57600080fd5b613f2a610180615037565b90506000613f388484613cf3565b8252506020613f4984848301613cf3565b6020830152506040613f5d84828501613cf3565b6040830152506060613f7184828501613cf3565b6060830152506080613f8584828501613e50565b60808301525060a0613f9984828501613e50565b60a08301525060c0613fad84828501613e50565b60c08301525060e0613fc184828501613e50565b60e083015250610100613fd684828501613e50565b61010083015250610120613fec84828501613e50565b6101208301525061014082013567ffffffffffffffff81111561400e57600080fd5b61401a84828501613ebd565b6101408301525061016082013567ffffffffffffffff81111561403c57600080fd5b61404884828501613ebd565b6101608301525092915050565b60006020828403121561406757600080fd5b6000612e018484613cf3565b6000806040838503121561408657600080fd5b60006140928585613cf3565b92505060206140a385828601613cf3565b9150509250929050565b600080604083850312156140c057600080fd5b60006140cc8585613cf3565b92505060206140a385828601613e38565b6000602082840312156140ef57600080fd5b813567ffffffffffffffff81111561410657600080fd5b612e0184828501613d6b565b60008060006060848603121561412757600080fd5b833567ffffffffffffffff81111561413e57600080fd5b61414a86828701613d6b565b935050602084013567ffffffffffffffff81111561416757600080fd5b61417386828701613dc8565b925050604084013567ffffffffffffffff81111561419057600080fd5b61419c86828701613cff565b9150509250925092565b6000806000606084860312156141bb57600080fd5b833567ffffffffffffffff8111156141d257600080fd5b6141de86828701613d6b565b935050602061417386828701613e50565b60006020828403121561420157600080fd5b6000612e018484613e44565b60006020828403121561421f57600080fd5b6000612e018484613e50565b6000806040838503121561423e57600080fd5b60006140928585613e50565b6000806000806060858703121561426057600080fd5b600061426c8787613e50565b945050602061427d87828801613cf3565b935050604085013567ffffffffffffffff81111561429a57600080fd5b6142a687828801613e74565b95989497509550505050565b6000806000606084860312156142c757600080fd5b60006142d38686613e50565b93505060206142e486828701613cf3565b925050604084013567ffffffffffffffff81111561430157600080fd5b61419c86828701613ebd565b60006020828403121561431f57600080fd5b6000612e018484613e5c565b60006020828403121561433d57600080fd5b6000612e018484613e68565b60006020828403121561435b57600080fd5b813567ffffffffffffffff81111561437257600080fd5b612e0184828501613f0c565b6000806000806080858703121561439457600080fd5b843567ffffffffffffffff8111156143ab57600080fd5b6143b787828801613f0c565b945050602085013567ffffffffffffffff8111156143d457600080fd5b6143e087828801613f0c565b935050604085013567ffffffffffffffff8111156143fd57600080fd5b61440987828801613ebd565b925050606085013567ffffffffffffffff81111561442657600080fd5b61443287828801613ebd565b91505092959194509250565b60008060006060848603121561445357600080fd5b833567ffffffffffffffff81111561446a57600080fd5b61447686828701613f0c565b93505060206142e486828701613e50565b600080600080600080608087890312156144a057600080fd5b60006144ac8989613e50565b96505060206144bd89828a01613cf3565b955050604087013567ffffffffffffffff8111156144da57600080fd5b6144e689828a01613e74565b9450945050606087013567ffffffffffffffff81111561450557600080fd5b61451189828a01613e74565b92509250509295509295509295565b614529816150cf565b82525050565b600061453a826150cb565b80845260208401935061454c836150c5565b60005b8281101561457c57614562868351614c44565b61456b826150c5565b60609690960195915060010161454f565b5093949350505050565b614529816150e8565b614529816150ed565b614529816150f0565b60006145ac826150cb565b8084526145c0816020860160208601615132565b6145c98161515e565b9093016020019392505050565b6145298161511b565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b80516080830190614bd2848261458f565b506020820151614be5602085018261458f565b506040820151614bf8604085018261458f565b506060820151612f8e606085018261458f565b8051610120830190614c1d8482614bc1565b506020820151614c306080850182614bc1565b506040820151612f8e61010085018261458f565b80516060830190614c558482614c7b565b506020820151614c68602085018261458f565b506040820151612f8e604085018261458f565b61452981615115565b602081016126538284614520565b6101008101614ca1828b614520565b614cae602083018a614520565b614cbb604083018961458f565b614cc8606083018861458f565b614cd5608083018761458f565b614ce260a083018661458f565b81810360c0830152614cf481856145a1565b905081810360e0830152614d0881846145a1565b9a9950505050505050505050565b60608101614d248286614520565b8181036020830152614d3681856145a1565b90508181036040830152614d4a81846145a1565b95945050505050565b60208082528101610e53818461452f565b602081016126538284614586565b60208101612653828461458f565b60608101614d8e828661458f565b614d9b6020830185614520565b8181036040830152614d4a81846145a1565b60408101614dbb828561458f565b8181036020830152612e0181846145a1565b60808101614ddb828761458f565b614de86020830186614c7b565b614df5604083018561458f565b614d4a606083018461458f565b60408101614e108285614598565b610e536020830184614520565b60208082528101610e5381846145a1565b6020810161265382846145d6565b60208082528101612653816145df565b602080825281016126538161460f565b602080825281016126538161463f565b602080825281016126538161466f565b602080825281016126538161469f565b60208082528101612653816146f5565b6020808252810161265381614725565b6020808252810161265381614755565b6020808252810161265381614785565b60208082528101612653816147b5565b60208082528101612653816147e5565b6020808252810161265381614815565b6020808252810161265381614845565b6020808252810161265381614875565b60208082528101612653816148a5565b60208082528101612653816148d5565b602080825281016126538161492b565b602080825281016126538161495b565b602080825281016126538161498b565b60208082528101612653816149bb565b60208082528101612653816149eb565b6020808252810161265381614a1b565b6020808252810161265381614a4b565b6020808252810161265381614a7b565b6020808252810161265381614ad1565b6020808252810161265381614b01565b6020808252810161265381614b31565b6020808252810161265381614b61565b6020808252810161265381614b91565b608081016126538284614bc1565b61012081016126538284614c0b565b606081016126538284614c44565b60405181810167ffffffffffffffff8111828210171561505657600080fd5b604052919050565b600067ffffffffffffffff82111561507557600080fd5b5060209081020190565b600067ffffffffffffffff82111561509657600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b6000612653826150cf565b82818337506000910152565b60005b8381101561514d578181015183820152602001615135565b83811115612f8e5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058205b35b998f509ef17d5ed53396f0d09790e407be84326372fe36670a99687e30b6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1CC JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x2624B2D9 DUP2 EQ PUSH2 0x1D1 JUMPI DUP1 PUSH4 0x288CDC91 EQ PUSH2 0x1FC JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x21C JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x249 JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x2C5 JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x332 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x352 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x372 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x392 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x3BF JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3DF JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3FF JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x41F JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x43F JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x45F JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x48C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x4AC JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4E1 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x501 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x521 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x541 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x561 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x58E JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x5AE JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5CE JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5F0 JUMPI DUP1 PUSH4 0xE2E49511 EQ PUSH2 0x610 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x630 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x645 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x665 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x67A JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x69A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x6AF JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x208 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x217 CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0x803 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x228 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x237 CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0x815 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x500C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x255 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x264 CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0x8A9 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D64 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x291 CALLDATASIZE PUSH1 0x4 PUSH2 0x424A JUMP JUMPDEST PUSH2 0x8BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B8 PUSH2 0x2B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x437E JUMP JUMPDEST PUSH2 0x997 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x501A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x2E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0xA83 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x305 PUSH2 0x300 CALLDATASIZE PUSH1 0x4 PUSH2 0x430D JUMP JUMPDEST PUSH2 0xB04 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4E2E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x32D CALLDATASIZE PUSH1 0x4 PUSH2 0x40DD JUMP JUMPDEST PUSH2 0xB2C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x33E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x34D CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0xB65 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x36D CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0xBEF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x38D CALLDATASIZE PUSH1 0x4 PUSH2 0x4112 JUMP JUMPDEST PUSH2 0xD13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x39E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x3AD CALLDATASIZE PUSH1 0x4 PUSH2 0x430D JUMP JUMPDEST PUSH2 0xD9D JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4C84 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x3DA CALLDATASIZE PUSH1 0x4 PUSH2 0x420D JUMP JUMPDEST PUSH2 0xDEB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3EB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x3FA CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0xE00 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x40B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x41A CALLDATASIZE PUSH1 0x4 PUSH2 0x40AD JUMP JUMPDEST PUSH2 0xE5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x43A CALLDATASIZE PUSH1 0x4 PUSH2 0x4073 JUMP JUMPDEST PUSH2 0xF05 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x44B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x45A CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0xF25 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x47F PUSH2 0x47A CALLDATASIZE PUSH1 0x4 PUSH2 0x40DD JUMP JUMPDEST PUSH2 0xFFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4D53 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x498 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x4A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x422B JUMP JUMPDEST PUSH2 0x1097 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x10B7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x269 PUSH2 0x4DC CALLDATASIZE PUSH1 0x4 PUSH2 0x42B2 JUMP JUMPDEST PUSH2 0x10D3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4ED JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x4FC CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x18F9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x51C CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0x1A0C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x53C CALLDATASIZE PUSH1 0x4 PUSH2 0x4487 JUMP JUMPDEST PUSH2 0x1A9B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x55C CALLDATASIZE PUSH1 0x4 PUSH2 0x4055 JUMP JUMPDEST PUSH2 0x1D34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x581 PUSH2 0x57C CALLDATASIZE PUSH1 0x4 PUSH2 0x4349 JUMP JUMPDEST PUSH2 0x1F5F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x5029 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x59A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x5A9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4349 JUMP JUMPDEST PUSH2 0x2059 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x5C9 CALLDATASIZE PUSH1 0x4 PUSH2 0x4073 JUMP JUMPDEST PUSH2 0x2088 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x20A5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1F3 SWAP2 SWAP1 PUSH2 0x4E1D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5FC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x60B CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x2151 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x61C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x62B CALLDATASIZE PUSH1 0x4 PUSH2 0x443E JUMP JUMPDEST PUSH2 0x221A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x651 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23C PUSH2 0x660 CALLDATASIZE PUSH1 0x4 PUSH2 0x41A6 JUMP JUMPDEST PUSH2 0x23D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B2 PUSH2 0x24AA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x686 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x296 PUSH2 0x695 CALLDATASIZE PUSH1 0x4 PUSH2 0x4055 JUMP JUMPDEST PUSH2 0x24C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5E3 PUSH2 0x2577 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x7D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x796 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x81D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x828 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0x888 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x849 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x861 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1A0C JUMP JUMPDEST SWAP1 POP PUSH2 0x894 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x831 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x8F9 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10D3 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x93A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EDC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x99F PUSH2 0x3CA4 JUMP JUMPDEST PUSH2 0x9A7 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x9AF PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x9D2 DUP9 PUSH2 0x1F5F JUMP JUMPDEST SWAP3 POP PUSH2 0x9DD DUP8 PUSH2 0x1F5F JUMP JUMPDEST SWAP2 POP PUSH2 0x9E7 PUSH2 0x2610 JUMP JUMPDEST SWAP1 POP PUSH2 0x9F3 DUP9 DUP9 PUSH2 0x2659 JUMP JUMPDEST PUSH2 0xA07 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x26B5 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0xA21 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2779 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0xA3A SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2779 JUMP JUMPDEST PUSH2 0xA53 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2996 JUMP JUMPDEST PUSH2 0xA6C DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2996 JUMP JUMPDEST PUSH2 0xA78 DUP9 DUP9 DUP4 DUP8 PUSH2 0x2A42 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA8B PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH2 0xA98 DUP6 DUP6 DUP6 PUSH2 0x221A JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP2 DUP3 MLOAD PUSH1 0x20 DUP5 ADD ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0xABA JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0xAD8 JUMPI PUSH2 0x89F JUMP JUMPDEST PUSH1 0x0 DUP5 MSTORE PUSH1 0x0 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x89F JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP1 DUP3 EQ PUSH2 0xB60 JUMPI PUSH2 0xB58 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB49 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x2059 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB31 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xB6D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xB78 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0xBD8 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB99 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBB1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBC9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xE00 JUMP JUMPDEST SWAP1 POP PUSH2 0xBE4 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xB81 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xBFD PUSH2 0x2610 JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xC22 JUMPI CALLER PUSH2 0xC25 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xC9C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F5C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xD04 SWAP1 DUP7 SWAP1 PUSH2 0x4D72 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xD1B PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xD26 PUSH2 0x3C7B JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x89F JUMPI PUSH2 0xD86 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD47 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD5F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA83 JUMP JUMPDEST SWAP1 POP PUSH2 0xD92 DUP5 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xD2F JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xE08 PUSH2 0x3C7B JUMP JUMPDEST PUSH2 0xE13 DUP5 DUP5 DUP5 PUSH2 0x1A0C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xE53 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F7C JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE64 PUSH2 0x2610 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xEF8 SWAP1 DUP7 SWAP1 PUSH2 0x4D64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xF2D PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xF3C PUSH2 0x3C7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF4B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xFEE JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF7B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xF9B DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0xFC7 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xFAE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xFD3 DUP7 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0xFE3 JUMPI PUSH2 0xFEE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xF65 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x1040 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0x102D PUSH2 0x3CD3 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0x1025 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0x108F JUMPI PUSH2 0x106F DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1060 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1F5F JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x107D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0x1048 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x111C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F4C JUMP JUMPDEST PUSH2 0x1125 DUP10 PUSH2 0x2C64 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x1187 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E8C JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1196 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11A6 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11DE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F3C JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11EC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1234 JUMPI DUP9 MLOAD ISZERO PUSH2 0x122B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FFC JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1242 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x137D JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1283 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1292 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x12D2 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x12E5 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x130A SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4DCD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x132E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x18EB SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x138B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1531 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x13CC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13DB JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x141B DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x142E DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x14CF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1492 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x130A SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4DCD JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x153F JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x159E JUMPI DUP9 MLOAD ISZERO PUSH2 0x157E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15AC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x165F JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1606 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4DAD JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1620 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1634 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1658 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x41EF JUMP JUMPDEST SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x166D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x171A JUMPI PUSH2 0x167C DUP10 PUSH2 0x2D73 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x16C4 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1606 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4D80 JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1728 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1768 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x18EB JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1776 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x18B9 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x17B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E3C JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17C6 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1806 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1819 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2D28 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x14CF JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1492 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E8C JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1901 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1911 PUSH2 0x3C7B JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1920 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x19FF JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1950 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x196C SWAP1 DUP11 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x19AF DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x197F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x199B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2DEC JUMP JUMPDEST SWAP2 POP PUSH2 0x19DB DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x19E7 DUP8 DUP3 PUSH2 0x25AE JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x19F4 JUMPI PUSH2 0x19FF JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x193A JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1A14 PUSH2 0x3C7B JUMP JUMPDEST PUSH2 0x1A1C PUSH2 0x3CD3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1A2A DUP9 PUSH2 0x1F5F JUMP JUMPDEST SWAP4 POP PUSH2 0x1A34 PUSH2 0x2610 JUMP JUMPDEST SWAP3 POP PUSH2 0x1A48 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0x1A54 DUP8 DUP4 PUSH2 0x2E09 JUMP JUMPDEST SWAP1 POP PUSH2 0x1A64 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2779 JUMP JUMPDEST PUSH2 0x1A6E DUP9 DUP3 PUSH2 0x2E1F JUMP JUMPDEST SWAP5 POP PUSH2 0x1A85 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2996 JUMP JUMPDEST PUSH2 0x1A90 DUP9 DUP5 DUP8 PUSH2 0x2E7F JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1AEE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F8C JUMP JUMPDEST PUSH2 0x1B31 PUSH2 0x1B2C DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2F94 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x31DC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x1B7D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4ECC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1C4E JUMPI PUSH2 0x1BD5 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x10D3 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1C0D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FEC JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1CE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EFC JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1D2B JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1D8C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F9C JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1DF3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1E07 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1E2B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x432B JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1EB0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E6C JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1F51 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4E02 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1F67 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x1F70 DUP3 PUSH2 0x335C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FA4 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xDE6 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1FB6 JUMPI PUSH1 0x2 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x1FCC JUMPI PUSH1 0x5 PUSH2 0x1F9A JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1FDF JUMPI PUSH1 0x4 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x2003 JUMPI PUSH1 0x6 PUSH2 0x1F9A JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x2050 JUMPI PUSH1 0x6 PUSH2 0x1F9A JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2061 PUSH2 0x3CD3 JUMP JUMPDEST PUSH2 0x206A DUP3 PUSH2 0x1F5F JUMP JUMPDEST SWAP1 POP PUSH2 0x2076 DUP3 DUP3 PUSH2 0x336A JUMP JUMPDEST PUSH2 0x2084 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x347C JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2149 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x211E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2149 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x212C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x2159 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x2168 PUSH2 0x3C7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2177 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xFEE JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21A7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x21C7 DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2C22 JUMP JUMPDEST SWAP2 POP PUSH2 0x21F3 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x21DA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xD77 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x21FF DUP7 DUP3 PUSH2 0x25AE JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0x220F JUMPI PUSH2 0xFEE JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x2191 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2321 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2303 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x236A JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x234C JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x23B2 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2394 JUMP JUMPDEST POP PUSH1 0x20 DUP11 ADD DUP5 SUB DUP11 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x23DC PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x23EC PUSH2 0x3C7B JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x23FB JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x19FF JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x242B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x2447 SWAP1 DUP11 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x245A DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x197F JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2486 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x246D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2492 DUP8 DUP3 PUSH2 0x25AE JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x249F JUMPI PUSH2 0x19FF JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x2415 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2517 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F9C JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2574 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x25BC SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x25D2 SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x25EB SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2604 SWAP2 SWAP1 PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2651 JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2653 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x266B DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST PUSH2 0x267D DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST LT ISZERO PUSH2 0x2084 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FDC JUMP JUMPDEST PUSH2 0x26BD PUSH2 0x3CA4 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x26D1 DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2C22 JUMP JUMPDEST SWAP4 POP PUSH2 0x26E1 DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2C22 JUMP JUMPDEST SWAP3 POP PUSH2 0x26F1 DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST PUSH2 0x26FF DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x356D JUMP JUMPDEST GT PUSH2 0x2721 JUMPI DUP4 SWAP2 POP PUSH2 0x271A DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2DEC JUMP JUMPDEST SWAP1 POP PUSH2 0x273A JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x2737 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2DEC JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x2744 DUP10 DUP4 PUSH2 0x2E1F JUMP JUMPDEST DUP6 MSTORE PUSH2 0x2750 DUP9 DUP3 PUSH2 0x2E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2768 SWAP2 SWAP1 PUSH2 0x2C22 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x27B7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FBC JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x27F0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F0C JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2863 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2863 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x28EE JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x28EE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E4C JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x2944 JUMPI PUSH2 0x290C DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0x10D3 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x2944 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E9C JUMP JUMPDEST PUSH2 0x2957 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x35C8 JUMP JUMPDEST ISZERO PUSH2 0x298E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EEC JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x29A4 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3523 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x2A33 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x4C92 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2AEC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2AC1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2AEC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2ACF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2B14 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x2B30 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B49 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B65 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2B81 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2BEB JUMPI PUSH2 0x2BE6 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x2BE1 DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3523 JUMP JUMPDEST PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2C1B JUMP JUMPDEST PUSH2 0x2C03 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2C1B DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2C5E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E5C JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2CA2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F2C JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2CD2 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2D6A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4E7C JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2DB3 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FAC JUMP JUMPDEST PUSH2 0x2DC1 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x37AA JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2E01 PUSH2 0x2DFB DUP6 DUP5 PUSH2 0x356D JUMP JUMPDEST DUP5 PUSH2 0x380B JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2E18 JUMPI DUP2 PUSH2 0xE53 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2E27 PUSH2 0x3C7B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2E43 SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2E5A SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2E74 SWAP2 DUP5 SWAP2 PUSH2 0x2DEC JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2F29 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2EFE JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2F29 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2F0C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2F49 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F62 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F7A DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST PUSH2 0x2F8E DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x3619 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x30BD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3080 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3153 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3116 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP9 DUP4 MSTORE SWAP1 DUP3 ADD DUP13 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP7 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x2 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x1 SLOAD DUP4 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3268 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x322B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP DUP4 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP5 SUB DUP4 ADD DUP2 MSTORE SWAP3 DUP2 ADD SWAP1 DUP2 SWAP1 MSTORE DUP3 MLOAD SWAP3 SWAP4 POP SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x330C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x32CF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2653 PUSH2 0x1B2C DUP4 PUSH2 0x3822 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x33AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FBC JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x341E JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x341E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FCC JUMP JUMPDEST PUSH2 0x3426 PUSH2 0x2610 JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0xB60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EAC JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x3517 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4D16 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x3562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EBC JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x3580 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x3566 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x3590 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x3562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4EBC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x35D7 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x35EC JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x31D3 JUMP JUMPDEST PUSH2 0x360B PUSH2 0x35FC DUP4 PUSH3 0xF4240 PUSH2 0x356D JUMP JUMPDEST PUSH2 0x3606 DUP9 DUP8 PUSH2 0x356D JUMP JUMPDEST PUSH2 0x380B JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x298E JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x3660 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F6C JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x36E9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4F1C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x3785 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x376D JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x379D JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x37EC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x931 SWAP1 PUSH2 0x4FAC JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x3819 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3AAA JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3A6D JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3B45 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3B08 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3BE0 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3BA3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x3CB9 PUSH2 0x3C7B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3CC6 PUSH2 0x3C7B JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50CF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D23 PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST PUSH2 0x5037 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3D4B DUP9 DUP3 PUSH2 0x3EBD JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D35 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3D7C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3D8A PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3DB2 DUP9 DUP3 PUSH2 0x3F0C JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3D9C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3DD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3DE7 PUSH2 0x3D1E DUP3 PUSH2 0x505E JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3E0C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3D61 JUMPI DUP2 PUSH2 0x3E22 DUP9 DUP3 PUSH2 0x3E50 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3E0F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 MLOAD PUSH2 0x50E8 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50ED JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 CALLDATALOAD PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE53 DUP3 MLOAD PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3E86 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3EB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3ECE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3EDC PUSH2 0x3D1E DUP3 PUSH2 0x507F JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3EF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F03 DUP4 DUP3 DUP5 PUSH2 0x5126 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F2A PUSH2 0x180 PUSH2 0x5037 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3F38 DUP5 DUP5 PUSH2 0x3CF3 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3F49 DUP5 DUP5 DUP4 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3F5D DUP5 DUP3 DUP6 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3F71 DUP5 DUP3 DUP6 ADD PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3F85 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3F99 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3FAD DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3FC1 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3FD6 DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3FEC DUP5 DUP3 DUP6 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x400E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401A DUP5 DUP3 DUP6 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x403C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4048 DUP5 DUP3 DUP6 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4067 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3CF3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x4086 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4092 DUP6 DUP6 PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x40A3 DUP6 DUP3 DUP7 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x40C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x40CC DUP6 DUP6 PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x40A3 DUP6 DUP3 DUP7 ADD PUSH2 0x3E38 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x40EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E01 DUP5 DUP3 DUP6 ADD PUSH2 0x3D6B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x413E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x414A DUP7 DUP3 DUP8 ADD PUSH2 0x3D6B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4167 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4173 DUP7 DUP3 DUP8 ADD PUSH2 0x3DC8 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4190 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x419C DUP7 DUP3 DUP8 ADD PUSH2 0x3CFF JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x41BB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41DE DUP7 DUP3 DUP8 ADD PUSH2 0x3D6B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4173 DUP7 DUP3 DUP8 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x4201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E44 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x421F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x423E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4092 DUP6 DUP6 PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4260 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x426C DUP8 DUP8 PUSH2 0x3E50 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x427D DUP8 DUP3 DUP9 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x429A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x42A6 DUP8 DUP3 DUP9 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x42C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x42D3 DUP7 DUP7 PUSH2 0x3E50 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x42E4 DUP7 DUP3 DUP8 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4301 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x419C DUP7 DUP3 DUP8 ADD PUSH2 0x3EBD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x431F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E5C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x433D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2E01 DUP5 DUP5 PUSH2 0x3E68 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x435B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2E01 DUP5 DUP3 DUP6 ADD PUSH2 0x3F0C JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x4394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43B7 DUP8 DUP3 DUP9 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x43E0 DUP8 DUP3 DUP9 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x43FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4409 DUP8 DUP3 DUP9 ADD PUSH2 0x3EBD JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4426 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4432 DUP8 DUP3 DUP9 ADD PUSH2 0x3EBD JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x446A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4476 DUP7 DUP3 DUP8 ADD PUSH2 0x3F0C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x42E4 DUP7 DUP3 DUP8 ADD PUSH2 0x3E50 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x44A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x44AC DUP10 DUP10 PUSH2 0x3E50 JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x44BD DUP10 DUP3 DUP11 ADD PUSH2 0x3CF3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x44DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x44E6 DUP10 DUP3 DUP11 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4505 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4511 DUP10 DUP3 DUP11 ADD PUSH2 0x3E74 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50CF JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x453A DUP3 PUSH2 0x50CB JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x454C DUP4 PUSH2 0x50C5 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x457C JUMPI PUSH2 0x4562 DUP7 DUP4 MLOAD PUSH2 0x4C44 JUMP JUMPDEST PUSH2 0x456B DUP3 PUSH2 0x50C5 JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x454F JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50E8 JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50ED JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x50F0 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x45AC DUP3 PUSH2 0x50CB JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x45C0 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x5132 JUMP JUMPDEST PUSH2 0x45C9 DUP2 PUSH2 0x515E JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x511B JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4BD2 DUP5 DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4BE5 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4BF8 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x4C1D DUP5 DUP3 PUSH2 0x4BC1 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4C30 PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4BC1 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4C55 DUP5 DUP3 PUSH2 0x4C7B JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4C68 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2F8E PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4529 DUP2 PUSH2 0x5115 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x4CA1 DUP3 DUP12 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x4CAE PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x4520 JUMP JUMPDEST PUSH2 0x4CBB PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CC8 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CD5 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4CE2 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x458F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4CF4 DUP2 DUP6 PUSH2 0x45A1 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4D08 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4D24 DUP3 DUP7 PUSH2 0x4520 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4D36 DUP2 DUP6 PUSH2 0x45A1 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4D4A DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE53 DUP2 DUP5 PUSH2 0x452F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4586 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x458F JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4D8E DUP3 DUP7 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4D9B PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x4520 JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4D4A DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4DBB DUP3 DUP6 PUSH2 0x458F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2E01 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4DDB DUP3 DUP8 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4DE8 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x4C7B JUMP JUMPDEST PUSH2 0x4DF5 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x458F JUMP JUMPDEST PUSH2 0x4D4A PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x458F JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4E10 DUP3 DUP6 PUSH2 0x4598 JUMP JUMPDEST PUSH2 0xE53 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x4520 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE53 DUP2 DUP5 PUSH2 0x45A1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x45D6 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x45DF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x460F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x463F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x466F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x469F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x46F5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4725 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4755 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4785 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x47B5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x47E5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4815 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4845 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4875 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x48A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x48D5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x492B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x495B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x498B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x49BB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x49EB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A1B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A4B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4A7B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4AD1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B01 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B31 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B61 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2653 DUP2 PUSH2 0x4B91 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4BC1 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4C0B JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2653 DUP3 DUP5 PUSH2 0x4C44 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x5056 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5075 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x5096 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2653 DUP3 PUSH2 0x50CF JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x514D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x5135 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2F8E JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 JUMPDEST CALLDATALOAD 0xb9 SWAP9 0xf5 MULMOD 0xef OR 0xd5 0xed MSTORE8 CODECOPY PUSH16 0xD09790E407BE84326372FE36670A996 DUP8 0xe3 SIGNEXTEND PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
+ "sourceMap": "931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;970:221:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;970:221:18;;;;;;;;;;;;;;;;;;;;1198:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1198:42:4;;;;;;;;;4305:618:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4305:618:8;;;;;;;;;;;;;;;;;1288:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1288:42:4;;;;;;;;;;;;;;;;;1493:360:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1493:360:6;;;;;;;;;;;1791:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1791:2557:5;;;;;;;;;;;;;;;;;2097:1729:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2097:1729:8;;;;;;;;;976:51:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:51:3;;;;;;;;;;;;;;;;;15793:231:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15793:231:8;;;;;;;;;5403:630;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5403:630:8;;;;;;;;;1939:1012:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1939:1012:4;;;;;;;;;6592:632:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6592:632:8;;;;;;;;;2092:154:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2092:154:3;;;;;;;;;;;;;;;;;968:45:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;968:45:7;;;;;;;;;1215:495:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1215:495:8;;;;;;;;;2090:391:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2090:391:6;;;;;;;;;1087:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1087:71:6;;;;;;;;;7612:1478:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7612:1478:8;;;;;;;;;16218:419;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16218:419:8;;;;;;;;;;;;;;;;;967:63:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;967:63:6;;;;;;;;;258:20:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:30;;;;2853:6652:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2853:6652:6;;;;;;;;;13764:1894:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13764:1894:8;;;;;;;;;3268:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3268:1327:4;;;;;;;;;1710:1456:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:1456:7;;;;;;;;;1236:666:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1236:666:3;;;;;;;;;5422:2261:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5422:2261:4;;;;;;;;;;;;;;;;;4826:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4826:322:4;;;;;;;;;1548:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1548:67:4;;;;;;;;;1779:27:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1779:27:17;;;;;;;;;;;;9547:1488:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9547:1488:8;;;;;;;;;1255:10059:16;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1255:10059:16;;;;;;;;;1298:33:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1298:33:18;;;;11423:1880:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11423:1880:8;;;;;;;;;1065:36:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1065:36:7;;;;500:167:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:30;;;;;;;;;1113:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1113:46:2;;;;970:221:18;1042:148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1042:148:18;;;;;;;;1032:159;;1042:148;;;;;1032:159;;;;1042:148;1032:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1032:159:18;;;;;;;;;;;;;;;;970:221;:::o;1198:42:4:-;;;;;;;;;;;;;:::o;4305:618:8:-;4491:35;;:::i;:::-;4542:20;4593:9;4646:36;;:::i;:::-;4565:6;:13;4542:36;;4605:1;4593:13;;4588:296;4608:17;;;4588:296;;4685:123;4712:6;4719:1;4712:9;;;;;;;;;;;;;;;;;;4739:21;4761:1;4739:24;;;;;;;;;;;;;;;;;;4781:10;4792:1;4781:13;;;;;;;;;;;;;;;;;;4685:9;:123::i;:::-;4646:162;;4822:51;4837:16;4855:17;4822:14;:51::i;:::-;4627:3;;;;;4588:296;;;4305:618;;;;;;;;:::o;1288:42:4:-;;;;;;;;;;;;;;;:::o;1493:360:6:-;1646:110;1680:4;1702:13;1733:9;;1646:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1646:16:6;;-1:-1:-1;;;;;1646:110:6:i;:::-;1625:174;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1809:15:6;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;:37;;;;1842:4;1809:37;;;1493:360::o;1791:2557:5:-;2006:59;;:::i;:::-;2471:39;;:::i;:::-;2546:40;;:::i;:::-;2335:24;;;;;2307:25;;;;:52;;;;2397:24;;;2369:25;;;:52;2655:20;2513:23;2335:9;2513:12;:23::i;:::-;2471:65;;2589:24;2602:10;2589:12;:24::i;:::-;2546:67;;2678:26;:24;:26::i;:::-;2655:49;;2767:39;2784:9;2795:10;2767:16;:39::i;:::-;2883:195;2924:9;2947:10;2971:13;:41;;;3026:14;:42;;;2883:27;:195::i;:::-;3228:23;;:46;;;2862:216;;-1:-1:-1;3123:248:5;;3152:9;;3175:13;;3202:12;;3228:46;3348:13;3123:15;:248::i;:::-;3488:24;;;;;:47;;3381:253;;3410:10;;3434:14;;3462:12;;3488:47;3610:14;3381:15;:253::i;:::-;3678:205;3709:9;3732:12;3758:13;:23;;;3795:13;:41;;;3850:18;:23;;;3678:17;:205::i;:::-;3893:209;3924:10;3948:12;3974:14;:24;;;4012:14;:42;;;4068:18;:24;;;3893:17;:209::i;:::-;4171:134;4204:9;4227:10;4251:12;4277:18;4171:19;:134::i;:::-;1791:2557;;;;;;;;;:::o;2097:1729:8:-;2268:30;;:::i;:::-;2361;2394:104;2426:5;2445:20;2479:9;2394:18;:104::i;:::-;2361:137;;3123:3;3044:17;2979;2973:24;2877:2;2858:17;2854:26;2769:7;2649:3;2619:581;3220:7;3240:205;;;;3463:1;3458:324;;;;3213:569;;3240:205;3285:1;3272:11;3265:22;3333:1;3328:2;3315:11;3311:20;3304:31;3381:1;3376:2;3363:11;3359:20;3352:31;3429:1;3424:2;3411:11;3407:20;3400:31;3240:205;;3458:324;3509:17;3503:24;3490:11;3483:45;3603:2;3584:17;3580:26;3574:33;3569:2;3556:11;3552:20;3545:63;3683:2;3664:17;3660:26;3654:33;3649:2;3636:11;3632:20;3625:63;3763:2;3744:17;3740:26;3734:33;3729:2;3716:11;3712:20;3705:63;-1:-1:-1;;2097:1729:8;;;;;;:::o;976:51:3:-;;;;;;;;;;;;;;;:::o;15793:231:8:-;15904:13;;15881:20;15927:91;15947:17;;;15927:91;;15985:22;15997:6;16004:1;15997:9;;;;;;;;;;;;;;;;;;15985:11;:22::i;:::-;15966:3;;15927:91;;;15793:231;;;:::o;5403:630::-;5595:35;;:::i;:::-;5646:20;5697:9;5750:36;;:::i;:::-;5669:6;:13;5646:36;;5709:1;5697:13;;5692:302;5712:17;;;5692:302;;5789:129;5822:6;5829:1;5822:9;;;;;;;;;;;;;;;;;;5849:21;5871:1;5849:24;;;;;;;;;;;;;;;;;;5891:10;5902:1;5891:13;;;;;;;;;;;;;;;;;;5789:15;:129::i;:::-;5750:168;;5932:51;5947:16;5965:17;5932:14;:51::i;:::-;5731:3;;;;;5692:302;;1939:1012:4;2022:20;2329:21;2493;2549;2045:26;:24;:26::i;:::-;2022:49;-1:-1:-1;2353:26:4;;;2369:10;2353:26;:52;;2395:10;2353:52;;;2390:1;2353:52;2573:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;2329:76;;-1:-1:-1;2536:1:4;2517:20;;;-1:-1:-1;2573:39:4;-1:-1:-1;2701:29:4;;;2680:100;;;;;;;;;;;;;;2820:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;;;;;:55;;;2890:54;;;;;2862:13;;2890:54;;;;;;;;;;1939:1012;;;;;:::o;6592:632:8:-;6785:35;;:::i;:::-;6836:20;6887:9;6940:36;;:::i;:::-;6859:6;:13;6836:36;;6899:1;6887:13;;6882:303;6902:17;;;6882:303;;6979:130;7013:6;7020:1;7013:9;;;;;;;;;;;;;;;;;;7040:21;7062:1;7040:24;;;;;;;;;;;;;;;;;;7082:10;7093:1;7082:13;;;;;;;;;;;;;;;;;;6979:16;:130::i;:::-;6940:169;;7123:51;7138:16;7156:17;7123:14;:51::i;:::-;6921:3;;;;;6882:303;;2092:154:3;2213:26;;;2183:7;2213:26;;;:12;:26;;;;;;;;2092:154;;;;:::o;968:45:7:-;;;;;;;;;;;;;;;:::o;1215:495:8:-;1385:30;;:::i;:::-;1445:95;1468:5;1487:20;1521:9;1445;:95::i;:::-;1571:34;;;;1431:109;;-1:-1:-1;1571:58:8;;1550:125;;;;;;;;;;;;;;1215:495;;;;;:::o;2090:391:6:-;2223:21;2247:26;:24;:26::i;:::-;2283:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;;:61;;;;;;;;;;2359:115;2283:32;;-1:-1:-1;2283:50:6;;2359:115;;;;2283:61;;2359:115;;;;;;;;;;2090:391;;;:::o;1087:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7612:1478:8:-;7789:35;;:::i;:::-;7840:27;7909:20;7960:9;8346:37;8537:36;;:::i;:::-;7870:6;7877:1;7870:9;;;;;;;;;;;;;;;;;;:24;;;7840:54;;7932:6;:13;7909:36;;7972:1;7960:13;;7955:1096;7975:17;;;7955:1096;;8249:14;8222:6;8229:1;8222:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;8386:70;8394:20;8416:16;:39;;;8386:7;:70::i;:::-;8346:110;;8576:128;8603:6;8610:1;8603:9;;;;;;;;;;;;;;;;;;8630:29;8677:10;8688:1;8677:13;;;;;;;;;8576:128;8537:167;;8789:51;8804:16;8822:17;8789:14;:51::i;:::-;8938:39;;;;:63;-1:-1:-1;8934:107:8;;9021:5;;8934:107;7994:3;;;;;7955:1096;;;7612:1478;;;;;;;;;;:::o;16218:419::-;16318:20;16361;16407:38;16501:9;16384:6;:13;16361:36;;16473:12;16448:38;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16407:79;;16513:1;16501:13;;16496:108;16516:17;;;16496:108;;16570:23;16583:6;16590:1;16583:9;;;;;;;;;;;;;;;;;;16570:12;:23::i;:::-;16554:10;16565:1;16554:13;;;;;;;;;;;;;;;;;;:39;16535:3;;16496:108;;;-1:-1:-1;16620:10:8;16218:419;-1:-1:-1;;;16218:419:8:o;967:63:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;258:20:30:-;;;;;;:::o;2853:6652:6:-;3015:12;3192:22;3445:27;3566:7;3583:9;3602;3621:17;7350:24;3083:1;3064:9;:16;:20;3043:97;;;;;;;;;;;;;;;;3223:23;:9;:21;:23::i;:::-;3217:30;;;;-1:-1:-1;3303:29:6;3278:55;;;;3257:123;;;;;;;;;;;;;;3489:16;3475:31;;;;;;;;;;3445:61;-1:-1:-1;3988:21:6;3971:13;:38;;;;;;;;;3967:5188;;;4025:27;;;;;;;;;;;3967:5188;4334:21;4317:13;:38;;;;;;;;;4313:4842;;;4396:16;;:21;4371:97;;;;;;;;;;;;;;4492:5;;-1:-1:-1;4511:14:6;;4313:4842;4598:20;4581:13;:37;;;;;;;;;4577:4578;;;4659:16;;4679:2;4659:22;4634:99;;;;;;;;;;;;;;4757:9;4767:1;4757:12;;;;;;;;;;;;;;;;;;;;;4751:19;;-1:-1:-1;4788:24:6;:9;4810:1;4788:24;:21;:24;:::i;:::-;4784:28;-1:-1:-1;4830:25:6;:9;4852:2;4830:25;:21;:25;:::i;:::-;4826:29;;4881:24;4891:4;4897:1;4900;4903;4881:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4881:24:6;;;;;4929:26;;;;;;;;;-1:-1:-1;4881:24:6;-1:-1:-1;4969:14:6;;-1:-1:-1;4969:14:6;4577:4578;5060:21;5043:13;:38;;;;;;;;;5039:4116;;;5122:16;;5142:2;5122:22;5097:99;;;;;;;;;;;;;;5220:9;5230:1;5220:12;;;;;;;;;;;;;;;;;;;;;5214:19;;-1:-1:-1;5251:24:6;:9;5273:1;5251:24;:21;:24;:::i;:::-;5247:28;-1:-1:-1;5293:25:6;:9;5315:2;5293:25;:21;:25;:::i;:::-;5289:29;;5344:225;5475:4;5381:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5381:116:6;;;5371:127;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5371:127:6;;;;;;;;;;;;-1:-1:-1;5344:225:6;;;;;;;;;;-1:-1:-1;5371:127:6;-1:-1:-1;5516:1:6;;5535;;-1:-1:-1;5554:1:6;;5344:225;;5039:4116;6237:20;6220:13;:37;;;;;;;;;6216:2939;;;6298:16;;:21;6273:97;;;;;;;;;;;;;;6394:27;;;6411:10;6394:27;;-1:-1:-1;6435:14:6;;6216:2939;6619:20;6602:13;:37;;;;;;;;;6598:2557;;;6665:56;;;;;:39;;;;;;:56;;6705:4;;6711:9;;6665:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6665:56:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6665:56:6;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6665:56:6;;;;;;;;;6655:66;-1:-1:-1;6735:14:6;;6598:2557;7248:23;7231:13;:40;;;;;;;;;7227:1928;;;7377:26;:9;:24;:26::i;:::-;7488:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;7350:53;;-1:-1:-1;7488:50:6;;7487:51;7483:102;;;7565:5;7558:12;;;;7483:102;7608:139;;;;;:45;;;;;;:139;;7671:4;;7693:13;;7724:9;;7608:139;;;;7227:1928;7883:23;7866:13;:40;;;;;;;;;7862:1293;;;7932:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;7976:14:6;;7862:1293;8556:20;8539:13;:37;;;;;;;;;8535:620;;;8617:16;;8637:2;8617:22;8592:99;;;;;;;;;;;;;;8715:9;8725:1;8715:12;;;;;;;;;;;;;;;;;;;;;8709:19;;-1:-1:-1;8746:24:6;:9;8768:1;8746:24;:21;:24;:::i;:::-;8742:28;-1:-1:-1;8788:25:6;:9;8810:2;8788:25;:21;:25;:::i;:::-;8784:29;;8839:227;8972:4;8876:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8876:118:6;;;8866:129;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;8535:620:6;9467:31;;;;;;;;;;;2853:6652;;;;;;;;;;;;;:::o;13764:1894:8:-;13947:35;;:::i;:::-;13998:27;14063:20;14114:9;14504:37;14810;15096:36;;:::i;:::-;14028:6;14035:1;14028:9;;;;;;;;;;;;;;;;;;:24;;;13998:54;;14086:6;:13;14063:36;;14126:1;14114:13;;14109:1510;14129:17;;;14109:1510;;14408:14;14381:6;14388:1;14381:9;;;;;;;;;;;;;;;;;;;:24;;:41;14574:39;;14544:70;;14552:20;;14544:7;:70::i;:::-;14504:110;;14850:165;14884:6;14891:1;14884:9;;;;;;;;;;;;;;;;;;:26;;;14928:6;14935:1;14928:9;;;;;;;;;;;;;;;;;;:26;;;14972:29;14850:16;:165::i;:::-;14810:205;;15135:135;15169:6;15176:1;15169:9;;;;;;;;;;;;;;;;;;15196:29;15243:10;15254:1;15243:13;;;;;;;;;15135:135;15096:174;;15355:51;15370:16;15388:17;15355:14;:51::i;:::-;15506:39;;:63;-1:-1:-1;15502:107:8;;15589:5;;15502:107;14148:3;;;;;14109:1510;;;13764:1894;;;;;;;;;;;:::o;3268:1327:4:-;3423:30;;:::i;:::-;3497:26;;:::i;:::-;3587:20;3691:33;3807:30;3526:19;3539:5;3526:12;:19::i;:::-;3497:48;;3610:26;:24;:26::i;:::-;3587:49;;3727:70;3735:5;:22;;;3759:9;:37;;;3727:7;:70::i;:::-;3691:106;;3840:55;3847:20;3869:25;3840:6;:55::i;:::-;3807:88;;3934:186;3963:5;3982:9;4005:12;4031:20;4065:22;4101:9;3934:15;:186::i;:::-;4190:51;4211:5;4218:22;4190:20;:51::i;:::-;4176:65;;4294:181;4325:5;4344:12;4370:9;:19;;;4403:9;:37;;;4454:11;4294:17;:181::i;:::-;4514:45;4526:5;4533:12;4547:11;4514;:45::i;:::-;3268:1327;;;;;;;;;:::o;1710:1456:7:-;1924:21;;2014:23;;1924:35;:21;:35;1903:100;;;;;;;;;;;;;;2040:113;2058:94;2093:4;2111:13;2138:4;;2058:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:21:7;;-1:-1:-1;;;;;2058:94:7:i;:::-;2040:17;:113::i;:::-;2240:29;;;;:12;:29;;;;;;2014:139;;-1:-1:-1;2240:29:7;;2239:30;2218:92;;;;;;;;;;;;;;2396:27;;;2413:10;2396:27;2392:410;;2498:137;2536:15;2573:13;2608:9;;2498:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2498:16:7;;-1:-1:-1;;;;;2498:137:7:i;:::-;2473:216;;;;;;;;;;;;;;;;2754:21;:37;;;;;;;;;;2392:410;2843:29;;;;:12;:29;;;;;;;:36;;;;2875:4;2843:36;;;2910:32;2918:4;;2937;;;;2910:32;2937:4;;;;2910:32;;;;;;;;;;;;;;;;;;;;;;;;2889:95;;;;;;;;;;;;;;;;3072:27;;;3089:10;3072:27;3068:92;;3115:21;:34;;;;;;3068:92;1710:1456;;;;;;;:::o;1236:666:3:-;426:5:30;;1333:30:3;;;;;;426:5:30;;412:10;:19;391:85;;;;;;;;;;;;;;1378:10:3;1333:56;;1484:18;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1484:31:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1484:31:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1484:31:3;;;;;;;;;1553:26;;;;;;;:12;:26;;;;;;1462:53;;-1:-1:-1;1553:26:3;;;-1:-1:-1;1610:31:3;;1589:104;;;;;;;;;;;;;;1753:26;;;;;;;:12;:26;;;;;;;:47;;;;;;;;;;1815:80;;;;;1753:26;;1875:10;;1815:80;;;;;;;;;;1236:666;;;;:::o;5422:2261:4:-;5509:26;;:::i;:::-;5607:19;5620:5;5607:12;:19::i;:::-;5585;;;;:41;;;;5708:27;;;:6;:27;;;;;;;;5668:37;;;:67;6037:22;;;;:27;6033:157;;;6110:38;6104:45;6080:69;;;;6163:16;;6033:157;6503:22;;;;:27;6499:157;;;6576:38;6570:45;;6499:157;6750:22;;;;6709:37;;;;:63;6705:179;;6818:24;6812:31;;6705:179;7008:27;;;;6989:15;:46;6985:157;;7081:19;7075:26;;6985:157;7211:19;;;;;7201:30;;;;:9;:30;;;;;;;;;7197:143;;;7277:21;7271:28;;7197:143;7407:10;;;;7364:18;;7353:30;;;;;;;;:10;:30;;;;;;;;7384:19;;;;7353:51;;;;;;;;;;:64;7349:177;;;7463:21;7457:28;;7349:177;7629:20;7599:51;;;5422:2261;-1:-1:-1;5422:2261:4:o;4826:322::-;4934:26;;:::i;:::-;4963:19;4976:5;4963:12;:19::i;:::-;4934:48;;5021:35;5039:5;5046:9;5021:17;:35::i;:::-;5093:48;5114:5;5121:9;:19;;;5093:20;:48::i;:::-;4826:322;;:::o;1548:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;1779:27:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9547:1488:8:-;9731:35;;:::i;:::-;9782:27;9847:20;9898:9;10284:37;10475:36;;:::i;:::-;9812:6;9819:1;9812:9;;;;;;;;;;;;;;;;;;:24;;;9782:54;;9870:6;:13;9847:36;;9910:1;9898:13;;9893:1103;9913:17;;;9893:1103;;10187:14;10160:6;10167:1;10160:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;10324:70;10332:20;10354:16;:39;;;10324:7;:70::i;:::-;10284:110;;10514:135;10548:6;10555:1;10548:9;;;;;;;;;;;;;;;;;;10575:29;10622:10;10633:1;10622:13;;;;;;;;;10514:135;10475:174;;10734:51;10749:16;10767:17;10734:14;:51::i;:::-;10883:39;;;;:63;-1:-1:-1;10879:107:8;;10966:5;;10879:107;9932:3;;;;;9893:1103;;1255:10059:16;5273:4;5267:11;;5563:66;5556:4;5533:28;;;5526:104;;;;1441:30;5687:4;5664:28;;6686:59;;;7012:19;;5978:26;;;6992:40;;;7125:23;;;7119:30;7095:22;;;7088:62;7221:23;;;7215:30;7191:22;;;7184:62;7324:23;;;7318:30;7294:22;;;7287:62;7439:4;7421:23;;7415:30;7391:22;;;7384:62;7539:4;7521:23;;7515:30;7491:22;;;7484:62;7639:4;7621:23;;7615:30;7591:22;;;7584:62;7737:4;7719:23;;7713:30;7689:22;;;7682:62;7836:5;7818:24;;7812:31;7787:23;;;7780:64;7941:5;7923:24;;7917:31;7892:23;;;7885:64;8029:5;8011:24;;8005:31;;7980:23;;;7973:64;;;8137:5;8119:24;;8113:31;8088:23;;;8081:64;8221:5;8348:74;;8510:24;8582:19;;8204:23;;;8786:34;;;5267:11;;5664:28;;;;6778:27;;;;5978:26;;8848:22;;;;8630:23;;;;8706:4;8687:24;;8683:35;6432:1;8940:237;8963:13;8960:1;8957:20;8940:237;;;9033:19;;9013:40;;9102:4;9085:22;;;;9140:23;;;;8991:1;8984:9;8940:237;;;-1:-1:-1;;;;9287:31:16;;;9271:13;9252:33;;;9245:74;;;;9413:17;;9407:24;9479:19;;9683:34;;;9279:4;9745:22;;;;9527:23;;;;9603:4;9584:24;;9580:35;9852:1;9838:237;9861:13;9858:1;9855:20;9838:237;;;9931:19;;9911:40;;10000:4;9983:22;;;;10038:23;;;;9889:1;9882:9;9838:237;;;-1:-1:-1;;;10144:46:16;;;-1:-1:-1;10375:33:16;;;10245:4;10223:27;;;10350:59;;;10523:19;;10714:34;;;10223:27;;10776:22;;;;10571:23;;;;10523:19;10647:4;10628:24;;10624:35;-1:-1:-1;10855:237:16;10878:13;10875:1;10872:20;10855:237;;;10948:19;;10928:40;;11017:4;11000:22;;;;11055:23;;;;10906:1;10899:9;10855:237;;;10859:12;11243:4;11224:17;11220:28;11207:11;11203:46;11168:17;11144:119;4539:6734;;;;;;;;;11290:17;11283:24;;1255:10059;;;;;:::o;1298:33:18:-;;;;:::o;11423:1880:8:-;11599:35;;:::i;:::-;11650:27;11715:20;11766:9;12156:37;12462;12748:36;;:::i;:::-;11680:6;11687:1;11680:9;;;;;;;;;;;;;;;;;;:24;;;11650:54;;11738:6;:13;11715:36;;11778:1;11766:13;;11761:1503;11781:17;;;11761:1503;;12060:14;12033:6;12040:1;12033:9;;;;;;;;;;;;;;;;;;;:24;;:41;12226:39;;12196:70;;12204:20;;12196:7;:70::i;:::-;12156:110;;12502:165;12536:6;12543:1;12536:9;;;;;;;;;12502:165;12462:205;;12787:128;12814:6;12821:1;12814:9;;;;;;;;;;;;;;;;;;12841:29;12888:10;12899:1;12888:13;;;;;;;;;12787:128;12748:167;;13000:51;13015:16;13033:17;13000:14;:51::i;:::-;13151:39;;:63;-1:-1:-1;13147:107:8;;13234:5;;13147:107;11800:3;;;;;11761:1503;;1065:36:7;;;;;;:::o;500:167:30:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1113:46:2:-;;;;;;;;;;;;;;;;;;;:::o;1772:648:20:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:20:o;4805:241:7:-;4936:21;;4888:7;;;;4936:35;:21;:35;:72;;4987:21;;;;4936:72;;;4974:10;4936:72;4911:97;4805:241;-1:-1:-1;;4805:241:7:o;4518:1075:5:-;5472:64;5480:9;:26;;;5508:10;:27;;;5472:7;:64::i;:::-;5392;5400:9;:26;;;5428:10;:27;;;5392:7;:64::i;:::-;:144;;5371:215;;;;;;;;;;;;;6329:3311;6601:59;;:::i;:::-;7557:37;7675:38;7796:34;7840:35;7597:68;7605:9;:26;;;7633:31;7597:7;:68::i;:::-;7557:108;;7716:70;7724:10;:27;;;7753:32;7716:7;:70::i;:::-;7675:111;;7985:68;7993:30;8025:10;:27;;;7985:7;:68::i;:::-;7902:67;7910:29;7941:10;:27;;;7902:7;:67::i;:::-;:151;7885:1080;;8175:29;8146:58;;8335:164;8369:10;:27;;;8414:10;:27;;;8459:26;8335:16;:164::i;:::-;8305:194;;7885:1080;;;8630:30;8600:60;;8789:165;8823:10;:27;;;8868:10;:27;;;8913;8789:16;:165::i;:::-;8760:194;;7885:1080;9050:93;9084:9;9107:26;9050:20;:93::i;:::-;9024:119;;9231:95;9265:10;9289:27;9231:20;:95::i;:::-;9204:24;;;;:122;;;9449:23;;:46;9509:47;;;9428:138;;9449:46;9428:7;:138::i;:::-;9380:45;;;:186;6329:3311;;;;;;;;;;:::o;9994:1727:4:-;10360:21;;:52;;10391:20;10360:52;10339:115;;;;;;;;;;;;;;10530:25;;;10509:92;;;;;;;;;;;;;;10673:19;;;;:33;;;10669:170;;10747:19;;;;:33;;10770:10;10747:33;10722:106;;;;;;;;;;;;;;10909:18;;;;:32;;;10905:169;;11004:12;10982:34;;:5;:18;;;:34;;;10957:106;;;;;;;;;;;;;;;;11156:37;;;;:42;11152:301;;;11239:146;11277:9;:19;;;11318:5;:18;;;11358:9;11239:16;:146::i;:::-;11214:228;;;;;;;;;;;;;;;;11525:149;11558:22;11598:5;:22;;;11638:5;:22;;;11525:15;:149::i;:::-;11524:150;11503:211;;;;;;;;;;;;;;9994:1727;;;;;;:::o;8003:792::-;8281:72;8289:27;8318:11;:34;;;8281:7;:72::i;:::-;8261:17;;;;:6;:17;;;;;;;;;:92;;;;8440:25;;;;8408:18;;8529:34;;8577;;;;8625:24;;;;8663;;;;8724:20;;;;8758;;;;8390:398;;8261:17;;8390:398;;;;;;;;;;;;;;8479:12;;8505:10;;8529:34;;8577;;8625:24;;8758:20;8390:398;;;;;;;;;;8003:792;;;;;:::o;10086:2233:5:-;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;10361:14;;10333:42;;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10419:202;10453:9;:24;;;10491:9;:22;;;10527:10;:23;;;10564:18;:24;;;:47;;;10419:20;:202::i;:::-;10665:25;;;;10704:23;;10741:22;;10777:23;;:46;;;10631:202;;10665:25;10704:23;10741:22;10631:20;:202::i;:::-;10843:189;10877:9;:24;;;10915:9;:22;;;10951:12;10977:18;:45;;;10843:20;:189::i;:::-;11065:185;11099:12;11125:9;:22;;;11161:9;:29;;;11204:18;:23;;;:36;;;11065:20;:185::i;:::-;11260:188;11294:12;11320:10;:23;;;11357:10;:30;;;11401:18;:24;;;:37;;;11260:20;:188::i;:::-;11518:10;:30;;;11485:63;;:9;:29;;;:63;;;11481:832;;;11564:301;11602:12;11632;11662:9;:29;;;11709:142;11738:18;:23;;;:36;;;11796:18;:24;;;:37;;;11709:7;:142::i;:::-;11564:20;:301::i;:::-;11481:832;;;11896:195;11934:12;11964;11994:9;:29;;;12041:18;:23;;;:36;;;11896:20;:195::i;:::-;12105:197;12143:12;12173;12203:10;:30;;;12251:18;:24;;;:37;;;12105:20;:197::i;:::-;10086:2233;;;;;:::o;501:208:31:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;-1:-1:-1;697:5:31;;;501:208::o;8304:448:28:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:28;;;;;;;8304:448::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:28;13620:2;13718:13;13712:20;;13281:490::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:28;8947:482::o;937:331:21:-;1096:21;1149:82;1170:26;1178:9;1189:6;1170:7;:26::i;:::-;1210:11;1149:7;:82::i;:::-;1133:98;937:331;-1:-1:-1;;;;937:331:21:o;1370:135:31:-;1455:7;1489:1;1485;:5;:13;;1497:1;1485:13;;;-1:-1:-1;1493:1:31;;1478:20;-1:-1:-1;1370:135:31:o;13005:848:4:-;13156:30;;:::i;:::-;13251:34;;;:59;;;13423:22;;;;13459;;;;13357:134;;13288:22;;13357:16;:134::i;:::-;13320:171;;13594:22;;;;13630:14;;;;13528:126;;13558:22;;13528:16;:126::i;:::-;13501:24;;;:153;13757:22;;;;13793:14;;;;13691:126;;13721:22;;13691:16;:126::i;:::-;13664:24;;;:153;13005:848;;;;:::o;14163:932::-;14370:14;14342:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;14370:14;;14342:42;;14370:14;14342:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14394:170;14428:5;:20;;;14462:5;:18;;;14494:12;14520:11;:34;;;14394:20;:170::i;:::-;14574;14608:5;:20;;;14642:12;14668:5;:18;;;14700:11;:34;;;14574:20;:170::i;:::-;14754:165;14788:12;14814:5;:18;;;14846:5;:25;;;14885:11;:24;;;14754:20;:165::i;:::-;14929:159;14963:12;14989;15015:5;:25;;;15054:11;:24;;;14929:20;:159::i;:::-;14163:932;;;;:::o;3459:902:7:-;1237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1237:146:7;;;;;;;;1227:157;;3623:14;;;;;;1237:146;;;;1227:157;;;;1237:146;1227:157;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1227:157:7;;;;;;;;;;;3740:15;;1227:157;;-1:-1:-1;3740:15:7;;-1:-1:-1;1227:157:7;;-1:-1:-1;1227:157:7;;3740:15;;;-1:-1:-1;3740:15:7;1227:157;3740:15;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3740:15:7;;;;;;;;;;;;4062:26;;;4108:15;;;4101:29;;;4186:42;4167:62;;4150:15;;;4143:87;;;;4262:2;4250:15;;4243:33;;;4317:3;4299:22;;;-1:-1:-1;3740:15:7;;-1:-1:-1;;;;3459:902:7;;;;;;;;:::o;1816:205:18:-;1910:7;1967:13;;;;;;;;;;;;;;;;;;1982:18;;2002:10;1950:63;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1950:63:18;;;;;-1:-1:-1;1950:63:18;;;;;;;-1:-1:-1;1950:63:18;;;26:21:-1;;;22:32;;6:49;;1950:63:18;;;;;;;1940:74;;1950:63;;-1:-1:-1;1950:63:18;;;1940:74;;;;1950:63;1940:74;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;1940:74:18;;;;;;;;;;;;-1:-1:-1;;;;;1816:205:18:o;4212:202:22:-;4301:17;4346:35;4364:16;4374:5;4364:9;:16::i;11918:816:4:-;12182:21;;12574:20;;12182:52;;12213:20;12182:52;12161:115;;;;;;;;;;;;;;12350:19;;;;:33;;;12346:170;;12424:19;;;;:33;;12447:10;12424:33;12399:106;;;;;;;;;;;;;;12597:26;:24;:26::i;:::-;12654:18;;12574:49;;-1:-1:-1;12654:34:4;;;;;;;12633:94;;;;;;;;;;;;;9097:422;9245:20;;;;:9;:20;;;;;;;:27;;;;9268:4;9245:27;;;9362:25;;;;9330:18;;9448:20;;;;9482;;;;9310:202;;9255:9;;9310:202;;;;;;;;;;;;;;9401:10;;9482:20;9310:202;;;;;;;;;;9097:422;;:::o;715:230:31:-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;937:1;930:8;;715:230;;;;;;:::o;50:288::-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:31;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;1507:560:21;1665:12;1693:17;1850:33;1739:11;1713:38;;;;;;;1728:9;1720:6;1713:38;1693:58;-1:-1:-1;1765:14:21;;1761:79;;;1802:5;1795:12;;;;1761:79;1886:98;1907:27;1915:9;1926:7;1907;:27::i;:::-;1948:26;1956:9;1967:6;1948:7;:26::i;:::-;1886:7;:98::i;:::-;2032:4;-1:-1:-1;2004:32:21;1507:560;-1:-1:-1;;;;;;1507:560:21:o;2561:5068:3:-;3031:19;3290:18;2797:1;2788:6;:10;2784:4839;;;2887:16;;2906:1;-1:-1:-1;2862:109:3;;;;;;;;;;;;;;-1:-1:-1;;3153:2:3;3138:18;;;3111:46;3179:66;3107:156;3311:26;;;;:12;:26;;;;;;;;;;3422:24;;;3397:109;;;;;;;;;;;;;;4923:2;4917:9;5239:15;5234:2;5222:9;5216:16;5212:25;5208:47;5392:14;5387:3;5383:24;5374:7;5370:38;5676:66;5667:7;5660:83;6160:3;6156:1;6147:7;6143:15;6136:28;6216:42;6210:4;6206:53;6201:2;6192:7;6188:16;6181:79;6310:42;6306:2;6302:51;6297:2;6288:7;6284:16;6277:77;6397:6;6391:3;6382:7;6378:17;6371:33;6563:3;6554:7;6550:17;6645:206;6665:5;6655:8;6652:19;6645:206;;;6714:16;;6697:34;;6778:2;6815:18;;;;6764:17;6645:206;;;7417:3;7346:7;7292;7285:5;7281:19;7208:7;7142:1;7067:10;7004:3;6978:512;7517:7;7510:15;7507:2;;;7564:16;7555:7;7548:33;7507:2;4724:2889;;;;;2561:5068;;;;;;:::o;10259:886:28:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:28;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;344:151:31:-;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:31:o;4554:1679:22:-;778:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:22;;;;;;;;768:468;;4640:14;;;;;;;;778:457;;;;;768:468;;;;778:457;768:468;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;768:468:22;;;;;;;;;;;4764:20;;;;4754:31;;768:468;;-1:-1:-1;4764:20:22;-1:-1:-1;768:468:22;;-1:-1:-1;768:468:22;;4754:31;;;-1:-1:-1;4754:31:22;768:468;4754:31;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;4754:31:22;;;;;;;;;;;4834:20;;;;4824:31;;4754;;-1:-1:-1;4834:20:22;-1:-1:-1;4754:31:22;;-1:-1:-1;4754:31:22;;4824;;;-1:-1:-1;4824:31:22;4754;4824;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;4824:31:22;;;;;;;;;;5544:15;;;5538:22;;5603:3;5592:15;;5586:22;;5651:3;5640:15;;;5634:22;;5770:35;;;5818:43;;;5874;;;5966:3;5940:30;;6078;;6121;;;-1:-1:-1;;;6164:30:22;;;-1:-1:-1;5940:30:22;;4554:1679;-1:-1:-1;4554:1679:22:o;931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2722:116;;2788:45;2825:6;2812:20;2788:45;;2845:120;;2922:38;2952:6;2946:13;2922:38;;2986:335;;;3093:4;3081:17;;3077:27;-1:-1;3067:2;;3118:1;3115;3108:12;3067:2;-1:-1;3138:20;;3178:18;3167:30;;3164:2;;;3210:1;3207;3200:12;3164:2;3244:4;3236:6;3232:17;3220:29;;3294:3;3287;3279:6;3275:16;3265:8;3261:31;3258:40;3255:2;;;3311:1;3308;3301:12;3255:2;3060:261;;;;;;3330:432;;3420:4;3408:17;;3404:27;-1:-1;3394:2;;3445:1;3442;3435:12;3394:2;3482:6;3469:20;3504:60;3519:44;3556:6;3519:44;;3504:60;3495:69;;3584:6;3577:5;3570:21;3620:4;3612:6;3608:17;3653:4;3646:5;3642:16;3688:3;3679:6;3674:3;3670:16;3667:25;3664:2;;;3705:1;3702;3695:12;3664:2;3715:41;3749:6;3744:3;3739;3715:41;;;3387:375;;;;;;;;4247:2205;;4355:5;4343:9;4338:3;4334:19;4330:31;4327:2;;;4374:1;4371;4364:12;4327:2;4392:21;4407:5;4392:21;;;4383:30;-1:-1;4471:1;4502:49;4547:3;4527:9;4502:49;;;4478:74;;-1:-1;4621:2;4654:49;4699:3;4675:22;;;4654:49;;;4647:4;4640:5;4636:16;4629:75;4573:142;4780:2;4813:49;4858:3;4849:6;4838:9;4834:22;4813:49;;;4806:4;4799:5;4795:16;4788:75;4725:149;4933:2;4966:49;5011:3;5002:6;4991:9;4987:22;4966:49;;;4959:4;4952:5;4948:16;4941:75;4884:143;5089:3;5123:49;5168:3;5159:6;5148:9;5144:22;5123:49;;;5116:4;5109:5;5105:16;5098:75;5037:147;5246:3;5280:49;5325:3;5316:6;5305:9;5301:22;5280:49;;;5273:4;5266:5;5262:16;5255:75;5194:147;5395:3;5429:49;5474:3;5465:6;5454:9;5450:22;5429:49;;;5422:4;5415:5;5411:16;5404:75;5351:139;5544:3;5578:49;5623:3;5614:6;5603:9;5599:22;5578:49;;;5571:4;5564:5;5560:16;5553:75;5500:139;5706:3;5741:49;5786:3;5777:6;5766:9;5762:22;5741:49;;;5733:5;5726;5722:17;5715:76;5649:153;5852:3;5887:49;5932:3;5923:6;5912:9;5908:22;5887:49;;;5879:5;5872;5868:17;5861:76;5812:136;6036:3;6025:9;6021:19;6008:33;6061:18;6053:6;6050:30;6047:2;;;6093:1;6090;6083:12;6047:2;6129:54;6179:3;6170:6;6159:9;6155:22;6129:54;;;6121:5;6114;6110:17;6103:81;5958:237;6283:3;6272:9;6268:19;6255:33;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:54;6426:3;6417:6;6406:9;6402:22;6376:54;;;6368:5;6361;6357:17;6350:81;6205:237;4321:2131;;;;;8828:241;;8932:2;8920:9;8911:7;8907:23;8903:32;8900:2;;;8948:1;8945;8938:12;8900:2;8983:1;9000:53;9045:7;9025:9;9000:53;;9076:366;;;9197:2;9185:9;9176:7;9172:23;9168:32;9165:2;;;9213:1;9210;9203:12;9165:2;9248:1;9265:53;9310:7;9290:9;9265:53;;;9255:63;;9227:97;9355:2;9373:53;9418:7;9409:6;9398:9;9394:22;9373:53;;;9363:63;;9334:98;9159:283;;;;;;9449:360;;;9567:2;9555:9;9546:7;9542:23;9538:32;9535:2;;;9583:1;9580;9573:12;9535:2;9618:1;9635:53;9680:7;9660:9;9635:53;;;9625:63;;9597:97;9725:2;9743:50;9785:7;9776:6;9765:9;9761:22;9743:50;;9816:415;;9964:2;9952:9;9943:7;9939:23;9935:32;9932:2;;;9980:1;9977;9970:12;9932:2;10015:31;;10066:18;10055:30;;10052:2;;;10098:1;10095;10088:12;10052:2;10118:97;10207:7;10198:6;10187:9;10183:22;10118:97;;10238:947;;;;10475:2;10463:9;10454:7;10450:23;10446:32;10443:2;;;10491:1;10488;10481:12;10443:2;10526:31;;10577:18;10566:30;;10563:2;;;10609:1;10606;10599:12;10563:2;10629:97;10718:7;10709:6;10698:9;10694:22;10629:97;;;10619:107;;10505:227;10791:2;10780:9;10776:18;10763:32;10815:18;10807:6;10804:30;10801:2;;;10847:1;10844;10837:12;10801:2;10867:78;10937:7;10928:6;10917:9;10913:22;10867:78;;;10857:88;;10742:209;11010:2;10999:9;10995:18;10982:32;11034:18;11026:6;11023:30;11020:2;;;11066:1;11063;11056:12;11020:2;11086:83;11161:7;11152:6;11141:9;11137:22;11086:83;;;11076:93;;10961:214;10437:748;;;;;;11192:811;;;;11404:2;11392:9;11383:7;11379:23;11375:32;11372:2;;;11420:1;11417;11410:12;11372:2;11455:31;;11506:18;11495:30;;11492:2;;;11538:1;11535;11528:12;11492:2;11558:97;11647:7;11638:6;11627:9;11623:22;11558:97;;;11548:107;;11434:227;11692:2;11710:53;11755:7;11746:6;11735:9;11731:22;11710:53;;12010:257;;12122:2;12110:9;12101:7;12097:23;12093:32;12090:2;;;12138:1;12135;12128:12;12090:2;12173:1;12190:61;12243:7;12223:9;12190:61;;12274:241;;12378:2;12366:9;12357:7;12353:23;12349:32;12346:2;;;12394:1;12391;12384:12;12346:2;12429:1;12446:53;12491:7;12471:9;12446:53;;12522:366;;;12643:2;12631:9;12622:7;12618:23;12614:32;12611:2;;;12659:1;12656;12649:12;12611:2;12694:1;12711:53;12756:7;12736:9;12711:53;;12895:615;;;;;13052:2;13040:9;13031:7;13027:23;13023:32;13020:2;;;13068:1;13065;13058:12;13020:2;13103:1;13120:53;13165:7;13145:9;13120:53;;;13110:63;;13082:97;13210:2;13228:53;13273:7;13264:6;13253:9;13249:22;13228:53;;;13218:63;;13189:98;13346:2;13335:9;13331:18;13318:32;13370:18;13362:6;13359:30;13356:2;;;13402:1;13399;13392:12;13356:2;13430:64;13486:7;13477:6;13466:9;13462:22;13430:64;;;13014:496;;;;-1:-1;13412:82;-1:-1;;;;13014:496;13517:595;;;;13664:2;13652:9;13643:7;13639:23;13635:32;13632:2;;;13680:1;13677;13670:12;13632:2;13715:1;13732:53;13777:7;13757:9;13732:53;;;13722:63;;13694:97;13822:2;13840:53;13885:7;13876:6;13865:9;13861:22;13840:53;;;13830:63;;13801:98;13958:2;13947:9;13943:18;13930:32;13982:18;13974:6;13971:30;13968:2;;;14014:1;14011;14004:12;13968:2;14034:62;14088:7;14079:6;14068:9;14064:22;14034:62;;14119:239;;14222:2;14210:9;14201:7;14197:23;14193:32;14190:2;;;14238:1;14235;14228:12;14190:2;14273:1;14290:52;14334:7;14314:9;14290:52;;14365:261;;14479:2;14467:9;14458:7;14454:23;14450:32;14447:2;;;14495:1;14492;14485:12;14447:2;14530:1;14547:63;14602:7;14582:9;14547:63;;14633:373;;14760:2;14748:9;14739:7;14735:23;14731:32;14728:2;;;14776:1;14773;14766:12;14728:2;14811:31;;14862:18;14851:30;;14848:2;;;14894:1;14891;14884:12;14848:2;14914:76;14982:7;14973:6;14962:9;14958:22;14914:76;;15013:1089;;;;;15232:3;15220:9;15211:7;15207:23;15203:33;15200:2;;;15249:1;15246;15239:12;15200:2;15284:31;;15335:18;15324:30;;15321:2;;;15367:1;15364;15357:12;15321:2;15387:76;15455:7;15446:6;15435:9;15431:22;15387:76;;;15377:86;;15263:206;15528:2;15517:9;15513:18;15500:32;15552:18;15544:6;15541:30;15538:2;;;15584:1;15581;15574:12;15538:2;15604:76;15672:7;15663:6;15652:9;15648:22;15604:76;;;15594:86;;15479:207;15745:2;15734:9;15730:18;15717:32;15769:18;15761:6;15758:30;15755:2;;;15801:1;15798;15791:12;15755:2;15821:62;15875:7;15866:6;15855:9;15851:22;15821:62;;;15811:72;;15696:193;15948:2;15937:9;15933:18;15920:32;15972:18;15964:6;15961:30;15958:2;;;16004:1;16001;15994:12;15958:2;16024:62;16078:7;16069:6;16058:9;16054:22;16024:62;;;16014:72;;15899:193;15194:908;;;;;;;;16109:727;;;;16279:2;16267:9;16258:7;16254:23;16250:32;16247:2;;;16295:1;16292;16285:12;16247:2;16330:31;;16381:18;16370:30;;16367:2;;;16413:1;16410;16403:12;16367:2;16433:76;16501:7;16492:6;16481:9;16477:22;16433:76;;;16423:86;;16309:206;16546:2;16564:53;16609:7;16600:6;16589:9;16585:22;16564:53;;17091:865;;;;;;;17284:3;17272:9;17263:7;17259:23;17255:33;17252:2;;;17301:1;17298;17291:12;17252:2;17336:1;17353:53;17398:7;17378:9;17353:53;;;17343:63;;17315:97;17443:2;17461:53;17506:7;17497:6;17486:9;17482:22;17461:53;;;17451:63;;17422:98;17579:2;17568:9;17564:18;17551:32;17603:18;17595:6;17592:30;17589:2;;;17635:1;17632;17625:12;17589:2;17663:64;17719:7;17710:6;17699:9;17695:22;17663:64;;;17645:82;;;;17530:203;17792:2;17781:9;17777:18;17764:32;17816:18;17808:6;17805:30;17802:2;;;17848:1;17845;17838:12;17802:2;17876:64;17932:7;17923:6;17912:9;17908:22;17876:64;;;17858:82;;;;17743:203;17246:710;;;;;;;;;17963:110;18036:31;18061:5;18036:31;;;18031:3;18024:44;18018:55;;;18147:755;;18328:77;18399:5;18328:77;;;18423:6;18418:3;18411:19;18447:4;18442:3;18438:14;18431:21;;18492:79;18565:5;18492:79;;;18592:1;18577:303;18602:6;18599:1;18596:13;18577:303;;;18642:103;18741:3;18732:6;18726:13;18642:103;;;18762:83;18838:6;18762:83;;;18868:4;18859:14;;;;;18752:93;-1:-1;18624:1;18617:9;18577:303;;;-1:-1;18893:3;;18307:595;-1:-1;;;;18307:595;18910:101;18977:28;18999:5;18977:28;;19018:110;19091:31;19116:5;19091:31;;19135:107;19206:30;19230:5;19206:30;;19249:297;;19349:38;19381:5;19349:38;;;19404:6;19399:3;19392:19;19416:63;19472:6;19465:4;19460:3;19456:14;19449:4;19442:5;19438:16;19416:63;;;19511:29;19533:6;19511:29;;;19491:50;;;19504:4;19491:50;;19329:217;-1:-1;;;19329:217;19849:156;19942:57;19993:5;19942:57;;20312:296;20467:2;20455:15;;20504:66;20499:2;20490:12;;20483:88;20599:2;20590:12;;20448:160;20617:296;20772:2;20760:15;;20809:66;20804:2;20795:12;;20788:88;20904:2;20895:12;;20753:160;20922:296;21077:2;21065:15;;21114:66;21109:2;21100:12;;21093:88;21209:2;21200:12;;21058:160;21227:296;21382:2;21370:15;;21419:66;21414:2;21405:12;;21398:88;21514:2;21505:12;;21363:160;21532:397;21687:2;21675:15;;21724:66;21719:2;21710:12;;21703:88;21825:66;21820:2;21811:12;;21804:88;21920:2;21911:12;;21668:261;21938:296;22093:2;22081:15;;22130:66;22125:2;22116:12;;22109:88;22225:2;22216:12;;22074:160;22243:296;22398:2;22386:15;;22435:66;22430:2;22421:12;;22414:88;22530:2;22521:12;;22379:160;22548:296;22703:2;22691:15;;22740:66;22735:2;22726:12;;22719:88;22835:2;22826:12;;22684:160;22853:296;23008:2;22996:15;;23045:66;23040:2;23031:12;;23024:88;23140:2;23131:12;;22989:160;23158:296;23313:2;23301:15;;23350:66;23345:2;23336:12;;23329:88;23445:2;23436:12;;23294:160;23463:296;23618:2;23606:15;;23655:66;23650:2;23641:12;;23634:88;23750:2;23741:12;;23599:160;23768:296;23923:2;23911:15;;23960:66;23955:2;23946:12;;23939:88;24055:2;24046:12;;23904:160;24073:296;24228:2;24216:15;;24265:66;24260:2;24251:12;;24244:88;24360:2;24351:12;;24209:160;24378:296;24533:2;24521:15;;24570:66;24565:2;24556:12;;24549:88;24665:2;24656:12;;24514:160;24683:296;24838:2;24826:15;;24875:66;24870:2;24861:12;;24854:88;24970:2;24961:12;;24819:160;24988:397;25143:2;25131:15;;25180:66;25175:2;25166:12;;25159:88;25281:66;25276:2;25267:12;;25260:88;25376:2;25367:12;;25124:261;25394:296;25549:2;25537:15;;25586:66;25581:2;25572:12;;25565:88;25681:2;25672:12;;25530:160;25699:296;25854:2;25842:15;;25891:66;25886:2;25877:12;;25870:88;25986:2;25977:12;;25835:160;26004:296;26159:2;26147:15;;26196:66;26191:2;26182:12;;26175:88;26291:2;26282:12;;26140:160;26309:296;26464:2;26452:15;;26501:66;26496:2;26487:12;;26480:88;26596:2;26587:12;;26445:160;26614:296;26769:2;26757:15;;26806:66;26801:2;26792:12;;26785:88;26901:2;26892:12;;26750:160;26919:296;27074:2;27062:15;;27111:66;27106:2;27097:12;;27090:88;27206:2;27197:12;;27055:160;27224:296;27379:2;27367:15;;27416:66;27411:2;27402:12;;27395:88;27511:2;27502:12;;27360:160;27529:397;27684:2;27672:15;;27721:66;27716:2;27707:12;;27700:88;27822:66;27817:2;27808:12;;27801:88;27917:2;27908:12;;27665:261;27935:296;28090:2;28078:15;;28127:66;28122:2;28113:12;;28106:88;28222:2;28213:12;;28071:160;28240:296;28395:2;28383:15;;28432:66;28427:2;28418:12;;28411:88;28527:2;28518:12;;28376:160;28545:296;28700:2;28688:15;;28737:66;28732:2;28723:12;;28716:88;28832:2;28823:12;;28681:160;28850:296;29005:2;28993:15;;29042:66;29037:2;29028:12;;29021:88;29137:2;29128:12;;28986:160;29155:296;29310:2;29298:15;;29347:66;29342:2;29333:12;;29326:88;29442:2;29433:12;;29291:160;29536:888;29764:22;;29677:4;29668:14;;;29798:61;29672:3;29764:22;29798:61;;;29697:174;29965:4;29958:5;29954:16;29948:23;29983:62;30039:4;30034:3;30030:14;30017:11;29983:62;;;29881:176;30141:4;30134:5;30130:16;30124:23;30159:62;30215:4;30210:3;30206:14;30193:11;30159:62;;;30067:166;30317:4;30310:5;30306:16;30300:23;30335:62;30391:4;30386:3;30382:14;30369:11;30335:62;;31490:815;31715:22;;31645:5;31636:15;;;31749:115;31640:3;31715:22;31749:115;;;31666:210;31953:4;31946:5;31942:16;31936:23;31971:116;32081:4;32076:3;32072:14;32059:11;31971:116;;;31886:213;32197:4;32190:5;32186:16;32180:23;32215:63;32271:5;32266:3;32262:15;32249:11;32215:63;;32373:695;32586:22;;32510:4;32501:14;;;32620:57;32505:3;32586:22;32620:57;;;32530:159;32770:4;32763:5;32759:16;32753:23;32788:62;32844:4;32839:3;32835:14;32822:11;32788:62;;;32699:163;32961:4;32954:5;32950:16;32944:23;32979:62;33035:4;33030:3;33026:14;33013:11;32979:62;;33951:104;34020:29;34043:5;34020:29;;34062:193;34170:2;34155:18;;34184:61;34159:9;34218:6;34184:61;;34262:1057;34594:3;34579:19;;34609:61;34583:9;34643:6;34609:61;;;34681:62;34739:2;34728:9;34724:18;34715:6;34681:62;;;34754;34812:2;34801:9;34797:18;34788:6;34754:62;;;34827;34885:2;34874:9;34870:18;34861:6;34827:62;;;34900:63;34958:3;34947:9;34943:19;34934:6;34900:63;;;34974;35032:3;35021:9;35017:19;35008:6;34974:63;;;35086:9;35080:4;35076:20;35070:3;35059:9;35055:19;35048:49;35111:62;35168:4;35159:6;35111:62;;;35103:70;;35222:9;35216:4;35212:20;35206:3;35195:9;35191:19;35184:49;35247:62;35304:4;35295:6;35247:62;;;35239:70;34565:754;-1:-1;;;;;;;;;;34565:754;35326:547;35518:2;35503:18;;35532:61;35507:9;35566:6;35532:61;;;35641:9;35635:4;35631:20;35626:2;35615:9;35611:18;35604:48;35666:62;35723:4;35714:6;35666:62;;;35658:70;;35776:9;35770:4;35766:20;35761:2;35750:9;35746:18;35739:48;35801:62;35858:4;35849:6;35801:62;;;35793:70;35489:384;-1:-1;;;;;35489:384;35880:433;36084:2;36098:47;;;36069:18;;36159:144;36069:18;36289:6;36159:144;;36320:181;36422:2;36407:18;;36436:55;36411:9;36464:6;36436:55;;36508:193;36616:2;36601:18;;36630:61;36605:9;36664:6;36630:61;;36708:479;36890:2;36875:18;;36904:61;36879:9;36938:6;36904:61;;;36976:62;37034:2;37023:9;37019:18;37010:6;36976:62;;;37086:9;37080:4;37076:20;37071:2;37060:9;37056:18;37049:48;37111:66;37172:4;37163:6;37111:66;;37194:378;37348:2;37333:18;;37362:61;37337:9;37396:6;37362:61;;;37471:9;37465:4;37461:20;37456:2;37445:9;37441:18;37434:48;37496:66;37557:4;37548:6;37496:66;;37579:489;37767:3;37752:19;;37782:61;37756:9;37816:6;37782:61;;;37854:58;37908:2;37897:9;37893:18;37884:6;37854:58;;;37923:62;37981:2;37970:9;37966:18;37957:6;37923:62;;;37996;38054:2;38043:9;38039:18;38030:6;37996:62;;38075:290;38209:2;38194:18;;38223:59;38198:9;38255:6;38223:59;;;38293:62;38351:2;38340:9;38336:18;38327:6;38293:62;;38372:269;38494:2;38508:47;;;38479:18;;38569:62;38479:18;38617:6;38569:62;;38932:233;39060:2;39045:18;;39074:81;39049:9;39128:6;39074:81;;39452:387;39633:2;39647:47;;;39618:18;;39708:121;39618:18;39708:121;;39846:387;40027:2;40041:47;;;40012:18;;40102:121;40012:18;40102:121;;40240:387;40421:2;40435:47;;;40406:18;;40496:121;40406:18;40496:121;;40634:387;40815:2;40829:47;;;40800:18;;40890:121;40800:18;40890:121;;41028:387;41209:2;41223:47;;;41194:18;;41284:121;41194:18;41284:121;;41422:387;41603:2;41617:47;;;41588:18;;41678:121;41588:18;41678:121;;41816:387;41997:2;42011:47;;;41982:18;;42072:121;41982:18;42072:121;;42210:387;42391:2;42405:47;;;42376:18;;42466:121;42376:18;42466:121;;42604:387;42785:2;42799:47;;;42770:18;;42860:121;42770:18;42860:121;;42998:387;43179:2;43193:47;;;43164:18;;43254:121;43164:18;43254:121;;43392:387;43573:2;43587:47;;;43558:18;;43648:121;43558:18;43648:121;;43786:387;43967:2;43981:47;;;43952:18;;44042:121;43952:18;44042:121;;44180:387;44361:2;44375:47;;;44346:18;;44436:121;44346:18;44436:121;;44574:387;44755:2;44769:47;;;44740:18;;44830:121;44740:18;44830:121;;44968:387;45149:2;45163:47;;;45134:18;;45224:121;45134:18;45224:121;;45362:387;45543:2;45557:47;;;45528:18;;45618:121;45528:18;45618:121;;45756:387;45937:2;45951:47;;;45922:18;;46012:121;45922:18;46012:121;;46150:387;46331:2;46345:47;;;46316:18;;46406:121;46316:18;46406:121;;46544:387;46725:2;46739:47;;;46710:18;;46800:121;46710:18;46800:121;;46938:387;47119:2;47133:47;;;47104:18;;47194:121;47104:18;47194:121;;47332:387;47513:2;47527:47;;;47498:18;;47588:121;47498:18;47588:121;;47726:387;47907:2;47921:47;;;47892:18;;47982:121;47892:18;47982:121;;48120:387;48301:2;48315:47;;;48286:18;;48376:121;48286:18;48376:121;;48514:387;48695:2;48709:47;;;48680:18;;48770:121;48680:18;48770:121;;48908:387;49089:2;49103:47;;;49074:18;;49164:121;49074:18;49164:121;;49302:387;49483:2;49497:47;;;49468:18;;49558:121;49468:18;49558:121;;49696:387;49877:2;49891:47;;;49862:18;;49952:121;49862:18;49952:121;;50090:387;50271:2;50285:47;;;50256:18;;50346:121;50256:18;50346:121;;50484:387;50665:2;50679:47;;;50650:18;;50740:121;50650:18;50740:121;;50878:310;51044:3;51029:19;;51059:119;51033:9;51151:6;51059:119;;51195:338;51375:3;51360:19;;51390:133;51364:9;51496:6;51390:133;;51540:301;51702:2;51687:18;;51716:115;51691:9;51804:6;51716:115;;52048:256;52110:2;52104:9;52136:17;;;52211:18;52196:34;;52232:22;;;52193:62;52190:2;;;52268:1;52265;52258:12;52190:2;52284;52277:22;52088:216;;-1:-1;52088:216;52311:263;;52475:18;52467:6;52464:30;52461:2;;;52507:1;52504;52497:12;52461:2;-1:-1;52536:4;52524:17;;;52554:15;;52398:176;53130:254;;53269:18;53261:6;53258:30;53255:2;;;53301:1;53298;53291:12;53255:2;-1:-1;53374:4;53345;53322:17;;;;53341:9;53318:33;53364:15;;53192:192;53658:144;53790:4;53778:17;;53759:43;53811:130;53924:12;;53908:33;54389:128;54469:42;54458:54;;54441:76;54524:92;54597:13;54590:21;;54573:43;54623:79;54692:5;54675:27;54709:151;54788:66;54777:78;;54760:100;54953:88;55031:4;55020:16;;55003:38;55612:135;;55711:31;55736:5;55711:31;;55755:145;55836:6;55831:3;55826;55813:30;-1:-1;55892:1;55874:16;;55867:27;55806:94;55909:268;55974:1;55981:101;55995:6;55992:1;55989:13;55981:101;;;56062:11;;;56056:18;56043:11;;;56036:39;56017:2;56010:10;55981:101;;;56097:6;56094:1;56091:13;56088:2;;;-1:-1;;56162:1;56144:16;;56137:27;55958:219;56185:97;56273:2;56253:14;56269:7;56249:28;;56233:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/Exchange.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/MixinExchangeCore.sol": {
+ "id": 4
+ },
+ "2.0.0/protocol/Exchange/MixinMatchOrders.sol": {
+ "id": 5
+ },
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.sol": {
+ "id": 6
+ },
+ "2.0.0/protocol/Exchange/MixinTransactions.sol": {
+ "id": 7
+ },
+ "2.0.0/protocol/Exchange/MixinWrapperFunctions.sol": {
+ "id": 8
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 9
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 10
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 11
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 12
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 13
+ },
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 14
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 15
+ },
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol": {
+ "id": 16
+ },
+ "2.0.0/protocol/Exchange/libs/LibConstants.sol": {
+ "id": 17
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 18
+ },
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol": {
+ "id": 19
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 20
+ },
+ "2.0.0/protocol/Exchange/libs/LibMath.sol": {
+ "id": 21
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 22
+ },
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol": {
+ "id": 23
+ },
+ "2.0.0/protocol/Exchange/mixins/MExchangeCore.sol": {
+ "id": 24
+ },
+ "2.0.0/protocol/Exchange/mixins/MMatchOrders.sol": {
+ "id": 25
+ },
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol": {
+ "id": 26
+ },
+ "2.0.0/protocol/Exchange/mixins/MTransactions.sol": {
+ "id": 27
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 28
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 29
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 30
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 31
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.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 solidity 0.4.24;\n\nimport \"./IAuthorizable.sol\";\n\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/Exchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinExchangeCore.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinAssetProxyDispatcher.sol\";\nimport \"./MixinTransactions.sol\";\nimport \"./MixinMatchOrders.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Exchange is\n MixinExchangeCore,\n MixinMatchOrders,\n MixinSignatureValidator,\n MixinTransactions,\n MixinAssetProxyDispatcher,\n MixinWrapperFunctions\n{\n\n string constant public VERSION = \"2.0.1-alpha\";\n\n // Mixins are instantiated in the order they are inherited\n constructor (bytes memory _zrxAssetData)\n public\n LibConstants(_zrxAssetData) // @TODO: Remove when we deploy.\n MixinExchangeCore()\n MixinMatchOrders()\n MixinSignatureValidator()\n MixinTransactions()\n MixinAssetProxyDispatcher()\n MixinWrapperFunctions()\n {}\n}\n",
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\nimport \"../AssetProxy/interfaces/IAssetProxy.sol\";\n\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n MAssetProxyDispatcher\n{\n using LibBytes for bytes;\n \n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => IAssetProxy) public assetProxies;\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external\n onlyOwner\n {\n IAssetProxy assetProxyContract = IAssetProxy(assetProxy);\n\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = assetProxyContract.getProxyId();\n address currentAssetProxy = assetProxies[assetProxyId];\n require(\n currentAssetProxy == address(0),\n \"ASSET_PROXY_ALREADY_EXISTS\"\n );\n\n // Add asset proxy and log registration.\n assetProxies[assetProxyId] = assetProxyContract;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address)\n {\n return assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n // Ensure assetData length is valid\n require(\n assetData.length > 3,\n \"LENGTH_GREATER_THAN_3_REQUIRED\"\n );\n \n // Lookup assetProxy\n bytes4 assetProxyId;\n assembly {\n assetProxyId := and(mload(\n add(assetData, 32)),\n 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000\n )\n }\n address assetProxy = assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n require(\n assetProxy != address(0),\n \"ASSET_PROXY_DOES_NOT_EXIST\"\n );\n \n // We construct calldata for the `assetProxy.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n\n assembly {\n /////// Setup State ///////\n // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).\n let cdStart := mload(64)\n // `dataAreaLength` is the total number of words needed to store `assetData`\n // As-per the ABI spec, this value is padded up to the nearest multiple of 32,\n // and includes 32-bytes for length.\n let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)\n // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.\n let cdEnd := add(cdStart, add(132, dataAreaLength))\n\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFromSelector`.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.\n // Notes:\n // 1. The offset to `assetData` is the length of the Params Area (128 bytes).\n // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.\n mstore(add(cdStart, 4), 128)\n mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 100), amount)\n \n /////// Setup Data Area ///////\n // This area holds `assetData`.\n let dataArea := add(cdStart, 132)\n // solhint-disable-next-line no-empty-blocks\n for {} lt(dataArea, cdEnd) {} {\n mstore(dataArea, mload(assetData))\n dataArea := add(dataArea, 32)\n assetData := add(assetData, 32)\n }\n\n /////// Call `assetProxy.transferFrom` using the constructed calldata ///////\n let success := call(\n gas, // forward all gas\n assetProxy, // call address of asset proxy\n 0, // don't send any ETH\n cdStart, // pointer to start of input\n sub(cdEnd, cdStart), // length of input \n cdStart, // write output over input\n 512 // reserve 512 bytes for output\n )\n if iszero(success) {\n revert(cdStart, returndatasize())\n }\n }\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinExchangeCore is\n LibConstants,\n LibMath,\n LibOrder,\n LibFillResults,\n MAssetProxyDispatcher,\n MExchangeCore,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n // Orders with specified senderAddress and with a salt less than their epoch are considered cancelled\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n {\n address makerAddress = getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1; \n uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n require(\n newOrderEpoch > oldOrderEpoch, \n \"INVALID_NEW_ORDER_EPOCH\"\n );\n\n // Update orderEpoch\n orderEpoch[makerAddress][senderAddress] = newOrderEpoch;\n emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // Fetch filled amount\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order availability\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // Validate order expiration\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n msg.sender,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n \"INVALID_TAKER_AMOUNT\"\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n \"INVALID_TAKER\"\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ),\n \"INVALID_ORDER_SIGNATURE\"\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n \"ROUNDING_ERROR\"\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n \"INVALID_MAKER\"\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinMatchOrders.sol": "/*\n Copyright 2018 ZeroEx Intl.\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 http://www.apache.org/licenses/LICENSE-2.0\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\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinMatchOrders is\n LibConstants,\n LibMath,\n MAssetProxyDispatcher,\n MExchangeCore,\n MMatchOrders,\n MTransactions\n{\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Either our context is valid or we revert\n assertValidMatch(leftOrder, rightOrder);\n\n // Compute proportional fill amounts\n matchedFillResults = calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount\n );\n\n // Validate fill contexts\n assertValidFill(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n matchedFillResults.left.takerAssetFilledAmount,\n matchedFillResults.left.takerAssetFilledAmount,\n leftSignature\n );\n assertValidFill(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n matchedFillResults.right.takerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount,\n rightSignature\n );\n\n // Update exchange state\n updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n \n // Settle matched orders. Succeeds or throws.\n settleMatchedOrders(\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n require(\n safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=\n safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),\n \"NEGATIVE_SPREAD_REQUIRED\"\n );\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We settle orders at the exchange rate of the right order.\n // The amount saved by the left maker goes to the taker.\n // Either the left or right order will be fully filled; possibly both.\n // The left order is fully filled iff the right order can sell more than left can buy.\n // That is: the amount required to fill the left order is less than or equal to\n // the amount we can spend from the right order:\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>\n // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>\n uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);\n uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);\n uint256 leftTakerAssetFilledAmount;\n uint256 rightTakerAssetFilledAmount;\n if (\n safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=\n safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)\n ) {\n // Left order will be fully filled: maximally fill left\n leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;\n\n // The right order receives an amount proportional to how much was spent.\n rightTakerAssetFilledAmount = getPartialAmount(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetFilledAmount\n );\n } else {\n // Right order will be fully filled: maximally fill right\n rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n // The left order receives an amount proportional to how much was spent.\n leftTakerAssetFilledAmount = getPartialAmount(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetFilledAmount\n );\n }\n\n // Calculate fill results for left order\n matchedFillResults.left = calculateFillResults(\n leftOrder,\n leftTakerAssetFilledAmount\n );\n\n // Calculate fill results for right order\n matchedFillResults.right = calculateFillResults(\n rightOrder,\n rightTakerAssetFilledAmount\n );\n\n // Calculate amount given to taker\n matchedFillResults.leftMakerAssetSpreadAmount = safeSub(\n matchedFillResults.left.makerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n // Order makers and taker\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n rightOrder.makerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n rightOrder.makerAssetData,\n rightOrder.makerAddress,\n leftOrder.makerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n takerAddress,\n matchedFillResults.leftMakerAssetSpreadAmount\n );\n\n // Maker fees\n dispatchTransferFrom(\n zrxAssetData,\n leftOrder.makerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n rightOrder.makerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Taker fees\n if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n safeAdd(\n matchedFillResults.left.takerFeePaid,\n matchedFillResults.right.takerFeePaid\n )\n );\n } else {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator,\n MTransactions\n{\n using LibBytes for bytes;\n \n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(\n hash,\n signerAddress,\n signature\n ),\n \"INVALID_SIGNATURE\"\n );\n preSigned[hash][signerAddress] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n {\n address signerAddress = getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Ensure signature is supported\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n // Pop last byte off of signature byte array.\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(hash, v, r, s);\n isValid = signerAddress == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = signerAddress == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signerAddress).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n\n address validatorAddress = signature.popLast20Bytes();\n \n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n return false;\n }\n isValid = IValidator(validatorAddress).isValidSignature(\n hash,\n signerAddress,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signerAddress];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n\\x20\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./libs/LibEIP712.sol\";\n\n\ncontract MixinTransactions is\n LibEIP712,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n // Hash for the EIP712 ZeroEx Transaction Schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n \"REENTRANCY_ILLEGAL\"\n );\n\n bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(\n salt,\n signerAddress,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n \"INVALID_TX_HASH\"\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signerAddress != msg.sender) {\n // Validate signature\n require(\n isValidSignature(\n transactionHash,\n signerAddress,\n signature\n ),\n \"INVALID_TX_SIGNATURE\"\n );\n\n // Set the current transaction signer\n currentContextAddress = signerAddress;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n \"FAILED_EXECUTION\"\n );\n\n // Reset current transaction signer if it was previously updated\n if (signerAddress != msg.sender) {\n currentContextAddress = address(0);\n }\n }\n\n /// @dev Calculates EIP712 hash of the Transaction.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @return EIP712 hash of the Transaction.\n function hashZeroExTransaction(\n uint256 salt,\n address signerAddress,\n bytes memory data\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(data);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // salt,\n // signerAddress,\n // keccak256(data)\n // ));\n\n assembly {\n let memPtr := mload(64)\n mstore(memPtr, schemaHash)\n mstore(add(memPtr, 32), salt)\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(memPtr, 96), dataHash)\n result := keccak256(memPtr, 128)\n }\n\n return result;\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibAbiEncoder.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n LibAbiEncoder,\n MExchangeCore\n{\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return fillResults;\n }\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // ABI encode calldata for `fillOrder`\n bytes memory fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n\n // Delegate to `fillOrder` and handle any exceptions gracefully\n assembly {\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)\n mload(fillOrderCalldata), // length of input\n fillOrderCalldata, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(fillOrderCalldata))\n mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))\n mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))\n mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n cancelOrder(orders[i]);\n }\n }\n\n /// @dev Fetches information for all passed in orders.\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory)\n {\n uint256 ordersLength = orders.length;\n LibOrder.OrderInfo[] memory ordersInfo = new LibOrder.OrderInfo[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n ordersInfo[i] = getOrderInfo(orders[i]);\n }\n return ordersInfo;\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder` in memory and returns the address range.\n /// This range can be passed into `call` or `delegatecall` to invoke an external\n /// call to `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return calldataBegin Memory address of ABI encoded calldata.\n /// @return calldataLength Lenfgth of ABI encoded calldata.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(\n fillOrderCalldata,\n sub(dataAreaEnd, add(fillOrderCalldata, 0x20))\n )\n }\n\n return fillOrderCalldata;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibConstants.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 solidity 0.4.24;\n\n\n// solhint-disable max-line-length\ncontract LibConstants {\n \n // Asset data for ZRX token. Used for fee transfers.\n // @TODO: Hardcode constant when we deploy. Currently \n // not constant to make testing easier.\n\n // The proxyId for ZRX_ASSET_DATA is bytes4(keccak256(\"ERC20Token(address)\")) = 0xf47261b0\n \n // Kovan ZRX address is 0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570.\n // The ABI encoded proxyId and address is 0xf47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac68346570\n // bytes constant public ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x6f\\xf6\\xc0\\xff\\x1d\\x68\\xb9\\x64\\x90\\x1f\\x98\\x6d\\x4c\\x9f\\xa3\\xac\\x68\\x34\\x65\\x70\";\n \n // Mainnet ZRX address is 0xe41d2489571d322189246dafa5ebde1f4699f498.\n // The ABI encoded proxyId and address is 0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498\n // bytes constant public ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xe4\\x1d\\x24\\x89\\x57\\x1d\\x32\\x21\\x89\\x24\\x6d\\xaf\\xa5\\xeb\\xde\\x1f\\x46\\x99\\xf4\\x98\";\n \n // solhint-disable-next-line var-name-mixedcase\n bytes public ZRX_ASSET_DATA;\n\n // @TODO: Remove when we deploy.\n constructor (bytes memory zrxAssetData)\n public\n {\n ZRX_ASSET_DATA = zrxAssetData;\n }\n}\n// solhint-enable max-line-length\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.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\n// solhint-disable\npragma solidity 0.4.24;\n\n\n/// @dev This contract documents the revert reasons used in the Exchange contract.\n/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.\ncontract LibExchangeErrors {\n\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_ORDER_EPOCH = \"INVALID_NEW_ORDER_EPOCH\"; // Specified salt must be greater than or equal to existing orderEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_ALREADY_EXISTS = \"ASSET_PROXY_ALREADY_EXISTS\"; // AssetProxy with same id already exists.\n\n /// dispatchTransferFrom errors ///\n string constant ASSET_PROXY_DOES_NOT_EXIST = \"ASSET_PROXY_DOES_NOT_EXIST\"; // No assetProxy registered at given id.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Asset transfer unsuccesful.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_GREATER_THAN_3_REQUIRED = \"LENGTH_GREATER_THAN_3_REQUIRED\"; // Byte array must have a length greater than 3.\n string constant LENGTH_0_REQUIRED = \"LENGTH_0_REQUIRED\"; // Byte array must have a length of 0.\n string constant LENGTH_65_REQUIRED = \"LENGTH_65_REQUIRED\"; // Byte array must have a length of 65.\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibMath.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // order.senderAddress,\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../interfaces/IAssetProxyDispatcher.sol\";\n\n\ncontract MAssetProxyDispatcher is\n IAssetProxyDispatcher\n{\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IExchangeCore.sol\";\n\n\ncontract MExchangeCore is\n IExchangeCore\n{\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that received fees.\n address takerAddress, // Address that filled the order.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker. \n uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.\n uint256 makerFeePaid, // Amount of ZRX paid to feeRecipient by maker.\n uint256 takerFeePaid, // Amount of ZRX paid to feeRecipient by taker.\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled. \n address senderAddress, // Address that called the Exchange contract (msg.sender).\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress, // Orders cancelled must have been created by this address.\n address indexed senderAddress, // Orders cancelled must have a `senderAddress` equal to this address.\n uint256 orderEpoch // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n );\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n LibOrder.Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n LibFillResults.FillResults memory fillResults\n )\n internal;\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n internal;\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo Status, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view;\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo\n )\n internal\n view;\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.FillResults memory fillResults);\n\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IMatchOrders.sol\";\n\n\ncontract MMatchOrders is\n IMatchOrders\n{\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure;\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.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 solidity 0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool approved // Approval or disapproval of validator contract.\n );\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor, // 0x08\n NSignatureTypes // 0x09, number of signature types. Always leave at end.\n }\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x7b49d7ad30bba0a2365f69c8cd33140edb16e3f66a897f3158c54db1dc8c7193",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0xa458ec0709468996ef2ef668f5e52f37ceb66627",
+ "links": {},
+ "constructorArgs": "[\"0xf47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac68346570\"]"
+ },
+ "50": {
+ "address": "0x48bacb9266a570d521063ef5dd96e61686dbe788",
+ "links": {},
+ "constructorArgs": "[\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/Forwarder.json b/packages/migrations/artifacts/2.0.0-beta-testnet/Forwarder.json
new file mode 100644
index 000000000..900c0c0e8
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/Forwarder.json
@@ -0,0 +1,696 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Forwarder",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ },
+ {
+ "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": "feeOrders",
+ "type": "tuple[]"
+ },
+ {
+ "name": "feeSignatures",
+ "type": "bytes[]"
+ },
+ {
+ "name": "feePercentage",
+ "type": "uint256"
+ },
+ {
+ "name": "feeRecipient",
+ "type": "address"
+ }
+ ],
+ "name": "marketBuyOrdersWithEth",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderFillResults",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "feeOrderFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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[]"
+ },
+ {
+ "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": "feeOrders",
+ "type": "tuple[]"
+ },
+ {
+ "name": "feeSignatures",
+ "type": "bytes[]"
+ },
+ {
+ "name": "feePercentage",
+ "type": "uint256"
+ },
+ {
+ "name": "feeRecipient",
+ "type": "address"
+ }
+ ],
+ "name": "marketSellOrdersWithEth",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderFillResults",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "feeOrderFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawERC20",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "abiEncodeFillOrder",
+ "outputs": [
+ {
+ "name": "fillOrderCalldata",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_exchange",
+ "type": "address"
+ },
+ {
+ "name": "_etherToken",
+ "type": "address"
+ },
+ {
+ "name": "_zrxToken",
+ "type": "address"
+ },
+ {
+ "name": "_zrxAssetData",
+ "type": "bytes"
+ },
+ {
+ "name": "_wethAssetData",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405162002d2238038062002d2283398101806040526200003791908101906200043f565b6000805433600160a060020a0319918216178255600180548216600160a060020a0389811691909117909155600280548316888316179055600380549092169086161790558251869086908690869086906200009b906004906020850190620002f2565b508051620000b1906005906020840190620002f2565b5050600154604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a0390921695506360704108945062000131935090915060040162000556565b602060405180830381600087803b1580156200014c57600080fd5b505af115801562000161573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000187919081019062000416565b9050600160a060020a03811615620002e6576002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001e89084906000199060040162000537565b602060405180830381600087803b1580156200020357600080fd5b505af115801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200023e9190810190620004ef565b506003546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b3906200028e9084906000199060040162000537565b602060405180830381600087803b158015620002a957600080fd5b505af1158015620002be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002e49190810190620004ef565b505b50505050505062000624565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200033557805160ff191683800117855562000365565b8280016001018555821562000365579182015b828111156200036557825182559160200191906001019062000348565b506200037392915062000377565b5090565b6200039491905b808211156200037357600081556001016200037e565b90565b6000620003a58251620005bb565b9392505050565b6000620003a58251620005ec565b6000601f82018313620003cc57600080fd5b8151620003e3620003dd8262000593565b6200056c565b915080825260208301602083018583830111156200040057600080fd5b6200040d838284620005f1565b50505092915050565b6000602082840312156200042957600080fd5b600062000437848462000397565b949350505050565b600080600080600060a086880312156200045857600080fd5b600062000466888862000397565b9550506020620004798882890162000397565b94505060406200048c8882890162000397565b93505060608601516001604060020a03811115620004a957600080fd5b620004b788828901620003ba565b92505060808601516001604060020a03811115620004d457600080fd5b620004e288828901620003ba565b9150509295509295909350565b6000602082840312156200050257600080fd5b6000620004378484620003ac565b6200051b81620005bb565b82525050565b6200051b81620005c7565b6200051b8162000394565b6040810162000547828562000510565b620003a560208301846200052c565b6020810162000566828462000521565b92915050565b6040518181016001604060020a03811182821017156200058b57600080fd5b604052919050565b60006001604060020a03821115620005aa57600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b838110156200060e578181015183820152602001620005f4565b838111156200061e576000848401525b50505050565b6126ee80620006346000396000f3006080604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318978e8281146100d35780638da5cb5b146100fd5780639395525c1461011f578063a1db978214610132578063e2e4951114610152578063f2fde38b1461017f575b60025473ffffffffffffffffffffffffffffffffffffffff1633146100d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612477565b60405180910390fd5b005b6100e66100e1366004611e55565b61019f565b6040516100f4929190612577565b60405180910390f35b34801561010957600080fd5b5061011261033a565b6040516100f49190612415565b6100e661012d366004611d6f565b610356565b34801561013e57600080fd5b506100d161014d366004611d35565b6104c7565b34801561015e57600080fd5b5061017261016d366004611f6e565b6105fa565b6040516100f49190612466565b34801561018b57600080fd5b506100d161019a366004611d17565b6107af565b6101a7611a69565b6101af611a69565b6000806101ba610860565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815261029493909290918301828280156102655780601f1061023a57610100808354040283529160200191610265565b820191906000526020600020905b81548152906001019060200180831161024857829003601f168201915b50505050508c600081518110151561027957fe5b6020908102909101015161014001519063ffffffff61093b16565b156102bf576102a48b8b8b610a68565b93506102b884600001518560600151610d36565b90506102e6565b6102ca8b8b8b610d78565b9350836060015191506102de888389610a68565b845190935090505b6102f1848484610f5a565b610305846020015184602001518888610ff9565b61032c8b600081518110151561031757fe5b906020019060200201516101400151826111ce565b505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61035e611a69565b610366611a69565b6000806000610373610860565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526103f393909290918301828280156102655780601f1061023a57610100808354040283529160200191610265565b156104445761041c670de0b6b3a7640000610416670de0b6b3a76400008a6112ef565b34611339565b92506104298b848c611356565b945061043d85600001518660600151610d36565b9050610488565b61045f670d2f13f7789f0000670de0b6b3a764000034611339565b925061046c8b848c611356565b94508460600151915061048089838a610a68565b855190945090505b610493858584610f5a565b6104a7856020015185602001518989610ff9565b6104b98b600081518110151561031757fe5b505050965096945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612517565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb9061056c903390859060040161244b565b602060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105be9190810190611f50565b15156105f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124e7565b5050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156107015783518552602094850194909301926001016106e3565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561074a57835185526020948501949093019260010161072c565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015610792578351855260209485019490930192600101610774565b5060208a0184038a525050505050505050508090505b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612517565b73ffffffffffffffffffffffffffffffffffffffff81161561085d57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6000341161089a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612487565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561092057600080fd5b505af1158015610934573d6000803e3d6000fd5b5050505050565b600081518351148015610a5f5750816040518082805190602001908083835b6020831061099757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161095a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b60208310610a2c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b90505b92915050565b610a70611a69565b6060806000806000806000610a83611a69565b8a1515610a8f57610d27565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b505060058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152969e5091945092508401905082828015610be25780601f10610bb757610100808354040283529160200191610be2565b820191906000526020600020905b815481529060010190602001808311610bc557829003601f168201915b50505050509650600095508b519450600093505b838514610d2757878c85815181101515610c0c57fe5b6020908102909101015161014001528b5187908d9086908110610c2b57fe5b602090810290910101516101600152610c448b87610d36565b9250610cab8c85815181101515610c5757fe5b9060200190602002015160a00151610ca58e87815181101515610c7657fe5b90602001906020020151608001518f88815181101515610c9257fe5b9060200190602002015160e00151610d36565b85611339565b9150610cf08c85815181101515610cbe57fe5b90602001906020020151610cd38460016112ef565b8c87815181101515610ce157fe5b906020019060200201516114fa565b9050610cfc898261159f565b610d0e89600001518a60600151610d36565b95508a8610610d1c57610d27565b600190930192610bf6565b50505050505050509392505050565b600082821115610d72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124a7565b50900390565b610d80611a69565b606080600080600080610d91611a69565b8a6000815181101515610da057fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929a5092909190830182828015610e585780601f10610e2d57610100808354040283529160200191610e58565b820191906000526020600020905b815481529060010190602001808311610e3b57829003601f168201915b505050505095508a519450600093505b838514610f4c57868b85815181101515610e7e57fe5b6020908102909101015161014001528a5186908c9086908110610e9d57fe5b6020908102909101015161016001528751610eb9908b90610d36565b9250610efc8b85815181101515610ecc57fe5b9060200190602002015160a001518c86815181101515610ee857fe5b906020019060200201516080015185611339565b9150610f288b85815181101515610f0f57fe5b90602001906020020151838b87815181101515610ce157fe5b9050610f34888261159f565b87518a11610f4157610f4c565b600190930192610e68565b505050505050509392505050565b600080610f6f84600001518560600151610d36565b915082821015610fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124f7565b610fbd856020015185602001516112ef565b905034811115610934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612497565b6000808066b1a2bc2ec5000085111561103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612527565b6110513461104c89896112ef565b610d36565b925061106685670de0b6b3a764000089611339565b9150828211156110a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612507565b60008311156111c5576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611101908690600401612593565b600060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b5050505060008211156111815760405173ffffffffffffffffffffffffffffffffffffffff85169083156108fc029084906000818181858888f1935050505015801561117f573d6000803e3d6000fd5b505b61118b8383610d36565b905060008111156111c557604051339082156108fc029083906000818181858888f193505050501580156111c3573d6000803e3d6000fd5b505b50505050505050565b60006111e0838263ffffffff61160116565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614156112505761124b838361166e565b6112ea565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156112b85761124b838361185c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612547565b505050565b60008282018381101561132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124c7565b8091505b5092915050565b600061134e6113488584611944565b8461199f565b949350505050565b61135e611a69565b606080600080600061136e611a69565b89600081518110151561137d57fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929950929091908301828280156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050945089519350600092505b8284146114ed57858a8481518110151561145b57fe5b602090810290910101516101400152895185908b908590811061147a57fe5b90602001906020020151610160018190525061149a898860200151610d36565b91506114c68a848151811015156114ad57fe5b90602001906020020151838a86815181101515610ce157fe5b90506114d2878261159f565b602087015189116114e2576114ed565b600190920191611445565b5050505050509392505050565b611502611a69565b606060006115118686866105fa565b600154815191935073ffffffffffffffffffffffffffffffffffffffff1691506080908390602082016000855af1808015611553576001811461157157611594565b60008552600060208601526000604086015260006060860152611594565b835185526020840151602086015260408401516040860152606084015160608601525b505050509392505050565b815181516115ad91906112ef565b8252602080830151908201516115c391906112ef565b6020830152604080830151908201516115dc91906112ef565b6040830152606080830151908201516115f591906112ef565b60609092019190915250565b600081600401835110151515611643576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612557565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60008061168284601063ffffffff6119b616565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812091935073ffffffffffffffffffffffffffffffffffffffff841691906116e0903390879060240161244b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b8381101561178457818101518382015260200161176c565b50505050905090810190601f1680156117b15780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124d7565b3d1561181d575060003d6020141561181d5760206000803e506000515b801515611856576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124d7565b50505050565b60008060018314611899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612567565b6118aa84601063ffffffff6119b616565b91506118bd84602463ffffffff611a1716565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061191690309033908690600401612423565b600060405180830381600087803b15801561193057600080fd5b505af11580156111c3573d6000803e3d6000fd5b6000808315156119575760009150611332565b5082820282848281151561196757fe5b041461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124c7565b60008082848115156119ad57fe5b04949350505050565b6000816014018351101515156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612537565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610a5f8383600081602001835110151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124b7565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610a5f8235612633565b6000601f82018313611aaf57600080fd5b8135611ac2611abd826125c8565b6125a1565b81815260209384019390925082018360005b83811015611b005781358601611aea8882611b73565b8452506020928301929190910190600101611ad4565b5050505092915050565b6000601f82018313611b1b57600080fd5b8135611b29611abd826125c8565b81815260209384019390925082018360005b83811015611b005781358601611b518882611bc2565b8452506020928301929190910190600101611b3b565b6000610a5f825161264f565b6000601f82018313611b8457600080fd5b8135611b92611abd826125e9565b91508082526020830160208301858383011115611bae57600080fd5b611bb9838284612654565b50505092915050565b60006101808284031215611bd557600080fd5b611be06101806125a1565b90506000611bee8484611a92565b8252506020611bff84848301611a92565b6020830152506040611c1384828501611a92565b6040830152506060611c2784828501611a92565b6060830152506080611c3b84828501611d0b565b60808301525060a0611c4f84828501611d0b565b60a08301525060c0611c6384828501611d0b565b60c08301525060e0611c7784828501611d0b565b60e083015250610100611c8c84828501611d0b565b61010083015250610120611ca284828501611d0b565b6101208301525061014082013567ffffffffffffffff811115611cc457600080fd5b611cd084828501611b73565b6101408301525061016082013567ffffffffffffffff811115611cf257600080fd5b611cfe84828501611b73565b6101608301525092915050565b6000610a5f823561264c565b600060208284031215611d2957600080fd5b600061134e8484611a92565b60008060408385031215611d4857600080fd5b6000611d548585611a92565b9250506020611d6585828601611d0b565b9150509250929050565b60008060008060008060c08789031215611d8857600080fd5b863567ffffffffffffffff811115611d9f57600080fd5b611dab89828a01611b0a565b965050602087013567ffffffffffffffff811115611dc857600080fd5b611dd489828a01611a9e565b955050604087013567ffffffffffffffff811115611df157600080fd5b611dfd89828a01611b0a565b945050606087013567ffffffffffffffff811115611e1a57600080fd5b611e2689828a01611a9e565b9350506080611e3789828a01611d0b565b92505060a0611e4889828a01611a92565b9150509295509295509295565b600080600080600080600060e0888a031215611e7057600080fd5b873567ffffffffffffffff811115611e8757600080fd5b611e938a828b01611b0a565b9750506020611ea48a828b01611d0b565b965050604088013567ffffffffffffffff811115611ec157600080fd5b611ecd8a828b01611a9e565b955050606088013567ffffffffffffffff811115611eea57600080fd5b611ef68a828b01611b0a565b945050608088013567ffffffffffffffff811115611f1357600080fd5b611f1f8a828b01611a9e565b93505060a0611f308a828b01611d0b565b92505060c0611f418a828b01611a92565b91505092959891949750929550565b600060208284031215611f6257600080fd5b600061134e8484611b67565b600080600060608486031215611f8357600080fd5b833567ffffffffffffffff811115611f9a57600080fd5b611fa686828701611bc2565b9350506020611fb786828701611d0b565b925050604084013567ffffffffffffffff811115611fd457600080fd5b611fe086828701611b73565b9150509250925092565b611ff381612633565b82525050565b60006120048261262f565b808452612018816020860160208601612660565b6120218161268c565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b600d81527f4f564552534f4c445f5745544800000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601181527f5749544844524157414c5f4641494c4544000000000000000000000000000000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601a81527f494e53554646494349454e545f4554485f52454d41494e494e47000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601881527f4645455f50455243454e544147455f544f4f5f4c415247450000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260400190565b805160808301906123d7848261240c565b5060208201516123ea602085018261240c565b5060408201516123fd604085018261240c565b50606082015161185660608501825b611ff38161264c565b60208101610a628284611fea565b606081016124318286611fea565b61243e6020830185611fea565b61134e604083018461240c565b604081016124598285611fea565b6107a8602083018461240c565b60208082528101610a5f8184611ff9565b60208082528101610a628161202e565b60208082528101610a6281612084565b60208082528101610a62816120b4565b60208082528101610a62816120e4565b60208082528101610a6281612114565b60208082528101610a628161216a565b60208082528101610a628161219a565b60208082528101610a62816121ca565b60208082528101610a62816121fa565b60208082528101610a628161222a565b60208082528101610a628161225a565b60208082528101610a628161228a565b60208082528101610a62816122ba565b60208082528101610a6281612310565b60208082528101610a6281612340565b60208082528101610a6281612396565b610100810161258682856123c6565b6107a860808301846123c6565b60208101610a62828461240c565b60405181810167ffffffffffffffff811182821017156125c057600080fd5b604052919050565b600067ffffffffffffffff8211156125df57600080fd5b5060209081020190565b600067ffffffffffffffff82111561260057600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b151590565b82818337506000910152565b60005b8381101561267b578181015183820152602001612663565b838111156118565750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058201014403b71ec46f28abdfcc7707141b4b514ccc3456289a0dc344079f8ecf10b6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2D22 CODESIZE SUB DUP1 PUSH3 0x2D22 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x43F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR DUP3 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD DUP4 AND DUP9 DUP4 AND OR SWAP1 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 DUP7 AND OR SWAP1 SSTORE DUP3 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x9B SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2F2 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xB1 SWAP1 PUSH1 0x5 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2F2 JUMP JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x131 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x556 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x161 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x187 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x416 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2E6 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1E8 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x537 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x218 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x23E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4EF JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x28E SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x537 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2BE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4EF JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP PUSH3 0x624 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x335 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x365 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x365 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x365 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x348 JUMP JUMPDEST POP PUSH3 0x373 SWAP3 SWAP2 POP PUSH3 0x377 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x394 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x373 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x37E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3A5 DUP3 MLOAD PUSH3 0x5BB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3A5 DUP3 MLOAD PUSH3 0x5EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3E3 PUSH3 0x3DD DUP3 PUSH3 0x593 JUMP JUMPDEST PUSH3 0x56C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x40D DUP4 DUP3 DUP5 PUSH3 0x5F1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x429 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x437 DUP5 DUP5 PUSH3 0x397 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x458 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x466 DUP9 DUP9 PUSH3 0x397 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x479 DUP9 DUP3 DUP10 ADD PUSH3 0x397 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x48C DUP9 DUP3 DUP10 ADD PUSH3 0x397 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4B7 DUP9 DUP3 DUP10 ADD PUSH3 0x3BA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4E2 DUP9 DUP3 DUP10 ADD PUSH3 0x3BA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x437 DUP5 DUP5 PUSH3 0x3AC JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x5BB JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x5C7 JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x394 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x547 DUP3 DUP6 PUSH3 0x510 JUMP JUMPDEST PUSH3 0x3A5 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x52C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x566 DUP3 DUP5 PUSH3 0x521 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x60E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5F4 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x61E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x26EE DUP1 PUSH3 0x634 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18978E82 DUP2 EQ PUSH2 0xD3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xFD JUMPI DUP1 PUSH4 0x9395525C EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA1DB9782 EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0xE2E49511 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x17F JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2477 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST PUSH2 0xE6 PUSH2 0xE1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E55 JUMP JUMPDEST PUSH2 0x19F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP3 SWAP2 SWAP1 PUSH2 0x2577 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x112 PUSH2 0x33A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP2 SWAP1 PUSH2 0x2415 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x12D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D6F JUMP JUMPDEST PUSH2 0x356 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD1 PUSH2 0x14D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D35 JUMP JUMPDEST PUSH2 0x4C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x172 PUSH2 0x16D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F6E JUMP JUMPDEST PUSH2 0x5FA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP2 SWAP1 PUSH2 0x2466 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD1 PUSH2 0x19A CALLDATASIZE PUSH1 0x4 PUSH2 0x1D17 JUMP JUMPDEST PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x1A7 PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x1AF PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1BA PUSH2 0x860 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x294 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x265 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x23A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x265 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x248 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP13 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x279 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x93B AND JUMP JUMPDEST ISZERO PUSH2 0x2BF JUMPI PUSH2 0x2A4 DUP12 DUP12 DUP12 PUSH2 0xA68 JUMP JUMPDEST SWAP4 POP PUSH2 0x2B8 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH2 0x2E6 JUMP JUMPDEST PUSH2 0x2CA DUP12 DUP12 DUP12 PUSH2 0xD78 JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x2DE DUP9 DUP4 DUP10 PUSH2 0xA68 JUMP JUMPDEST DUP5 MLOAD SWAP1 SWAP4 POP SWAP1 POP JUMPDEST PUSH2 0x2F1 DUP5 DUP5 DUP5 PUSH2 0xF5A JUMP JUMPDEST PUSH2 0x305 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0xFF9 JUMP JUMPDEST PUSH2 0x32C DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x317 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD DUP3 PUSH2 0x11CE JUMP JUMPDEST POP POP SWAP8 POP SWAP8 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x35E PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x366 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x373 PUSH2 0x860 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x3F3 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x265 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x23A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x265 JUMP JUMPDEST ISZERO PUSH2 0x444 JUMPI PUSH2 0x41C PUSH8 0xDE0B6B3A7640000 PUSH2 0x416 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x12EF JUMP JUMPDEST CALLVALUE PUSH2 0x1339 JUMP JUMPDEST SWAP3 POP PUSH2 0x429 DUP12 DUP5 DUP13 PUSH2 0x1356 JUMP JUMPDEST SWAP5 POP PUSH2 0x43D DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH2 0x488 JUMP JUMPDEST PUSH2 0x45F PUSH8 0xD2F13F7789F0000 PUSH8 0xDE0B6B3A7640000 CALLVALUE PUSH2 0x1339 JUMP JUMPDEST SWAP3 POP PUSH2 0x46C DUP12 DUP5 DUP13 PUSH2 0x1356 JUMP JUMPDEST SWAP5 POP DUP5 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x480 DUP10 DUP4 DUP11 PUSH2 0xA68 JUMP JUMPDEST DUP6 MLOAD SWAP1 SWAP5 POP SWAP1 POP JUMPDEST PUSH2 0x493 DUP6 DUP6 DUP5 PUSH2 0xF5A JUMP JUMPDEST PUSH2 0x4A7 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP10 DUP10 PUSH2 0xFF9 JUMP JUMPDEST PUSH2 0x4B9 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x317 JUMPI INVALID JUMPDEST POP POP POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x518 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2517 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x56C SWAP1 CALLER SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x244B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x5BE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1F50 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24E7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x701 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x6E3 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x74A JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x72C JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x792 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x774 JUMP JUMPDEST POP PUSH1 0x20 DUP11 ADD DUP5 SUB DUP11 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x800 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x85D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLVALUE GT PUSH2 0x89A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2487 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 CALLVALUE PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x920 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x934 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xA5F JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x997 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x95A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA2C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA70 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA83 PUSH2 0x1A69 JUMP JUMPDEST DUP11 ISZERO ISZERO PUSH2 0xA8F JUMPI PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB33 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB08 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB33 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB16 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP7 SWAP15 POP SWAP2 SWAP5 POP SWAP3 POP DUP5 ADD SWAP1 POP DUP3 DUP3 DUP1 ISZERO PUSH2 0xBE2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBB7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBE2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBC5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP PUSH1 0x0 SWAP6 POP DUP12 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xD27 JUMPI DUP8 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC0C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xC2B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH2 0xC44 DUP12 DUP8 PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0xCAB DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC57 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xCA5 DUP15 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC76 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP16 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC92 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST DUP6 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP PUSH2 0xCF0 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCBE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xCD3 DUP5 PUSH1 0x1 PUSH2 0x12EF JUMP JUMPDEST DUP13 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x14FA JUMP JUMPDEST SWAP1 POP PUSH2 0xCFC DUP10 DUP3 PUSH2 0x159F JUMP JUMPDEST PUSH2 0xD0E DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP6 POP DUP11 DUP7 LT PUSH2 0xD1C JUMPI PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xBF6 JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24A7 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0xD80 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD91 PUSH2 0x1A69 JUMP JUMPDEST DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDA0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP11 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xE58 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE2D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xE58 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE3B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP6 POP DUP11 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xF4C JUMPI DUP7 DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE7E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP11 MLOAD DUP7 SWAP1 DUP13 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xE9D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP8 MLOAD PUSH2 0xEB9 SWAP1 DUP12 SWAP1 PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0xEFC DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xECC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEE8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP PUSH2 0xF28 DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF0F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP12 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xF34 DUP9 DUP3 PUSH2 0x159F JUMP JUMPDEST DUP8 MLOAD DUP11 GT PUSH2 0xF41 JUMPI PUSH2 0xF4C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xE68 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xF6F DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 LT ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24F7 JUMP JUMPDEST PUSH2 0xFBD DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x12EF JUMP JUMPDEST SWAP1 POP CALLVALUE DUP2 GT ISZERO PUSH2 0x934 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2497 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH7 0xB1A2BC2EC50000 DUP6 GT ISZERO PUSH2 0x103E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2527 JUMP JUMPDEST PUSH2 0x1051 CALLVALUE PUSH2 0x104C DUP10 DUP10 PUSH2 0x12EF JUMP JUMPDEST PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0x1066 DUP6 PUSH8 0xDE0B6B3A7640000 DUP10 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 GT ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2507 JUMP JUMPDEST PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x11C5 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1101 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2593 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x112F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x1181 JUMPI PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0x118B DUP4 DUP4 PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x11C5 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x11C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11E0 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1601 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0x1250 JUMPI PUSH2 0x124B DUP4 DUP4 PUSH2 0x166E JUMP JUMPDEST PUSH2 0x12EA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x124B DUP4 DUP4 PUSH2 0x185C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2547 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x132E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24C7 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x134E PUSH2 0x1348 DUP6 DUP5 PUSH2 0x1944 JUMP JUMPDEST DUP5 PUSH2 0x199F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x135E PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x136E PUSH2 0x1A69 JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x137D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP10 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1435 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1435 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1418 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP5 POP DUP10 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0x14ED JUMPI DUP6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP10 MLOAD DUP6 SWAP1 DUP12 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x147A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x149A DUP10 DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP2 POP PUSH2 0x14C6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x14D2 DUP8 DUP3 PUSH2 0x159F JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD DUP10 GT PUSH2 0x14E2 JUMPI PUSH2 0x14ED JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1445 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1502 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x1511 DUP7 DUP7 DUP7 PUSH2 0x5FA JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 POP PUSH1 0x80 SWAP1 DUP4 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x0 DUP6 GAS CALL DUP1 DUP1 ISZERO PUSH2 0x1553 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x1571 JUMPI PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH1 0x0 PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x1594 JUMP JUMPDEST DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x15AD SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15C3 SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15DC SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15F5 SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1643 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2557 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1682 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x19B6 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 SWAP1 PUSH2 0x16E0 SWAP1 CALLER SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x244B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1784 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x176C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17B1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1800 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24D7 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x181D JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x181D JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x1856 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24D7 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 DUP4 EQ PUSH2 0x1899 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2567 JUMP JUMPDEST PUSH2 0x18AA DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x19B6 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x18BD DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x1A17 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x1916 SWAP1 ADDRESS SWAP1 CALLER SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2423 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1957 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1332 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1967 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x132E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24C7 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x19AD JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x19F8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2537 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1A60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24B7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 CALLDATALOAD PUSH2 0x2633 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1AAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1AC2 PUSH2 0x1ABD DUP3 PUSH2 0x25C8 JUMP JUMPDEST PUSH2 0x25A1 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B00 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1AEA DUP9 DUP3 PUSH2 0x1B73 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1AD4 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1B1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B29 PUSH2 0x1ABD DUP3 PUSH2 0x25C8 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B00 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1B51 DUP9 DUP3 PUSH2 0x1BC2 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1B3B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 MLOAD PUSH2 0x264F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1B84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B92 PUSH2 0x1ABD DUP3 PUSH2 0x25E9 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB9 DUP4 DUP3 DUP5 PUSH2 0x2654 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BE0 PUSH2 0x180 PUSH2 0x25A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1BEE DUP5 DUP5 PUSH2 0x1A92 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1BFF DUP5 DUP5 DUP4 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x1C13 DUP5 DUP3 DUP6 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1C27 DUP5 DUP3 DUP6 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1C3B DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1C4F DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1C63 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1C77 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1C8C DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1CA2 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CD0 DUP5 DUP3 DUP6 ADD PUSH2 0x1B73 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFE DUP5 DUP3 DUP6 ADD PUSH2 0x1B73 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 CALLDATALOAD PUSH2 0x264C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP5 DUP5 PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D54 DUP6 DUP6 PUSH2 0x1A92 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D65 DUP6 DUP3 DUP7 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1D88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DAB DUP10 DUP3 DUP11 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DD4 DUP10 DUP3 DUP11 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DFD DUP10 DUP3 DUP11 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E26 DUP10 DUP3 DUP11 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x1E37 DUP10 DUP3 DUP11 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x1E48 DUP10 DUP3 DUP11 ADD PUSH2 0x1A92 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1E70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E93 DUP11 DUP3 DUP12 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH2 0x1EA4 DUP11 DUP3 DUP12 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1ECD DUP11 DUP3 DUP12 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EF6 DUP11 DUP3 DUP12 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F1F DUP11 DUP3 DUP12 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x1F30 DUP11 DUP3 DUP12 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x1F41 DUP11 DUP3 DUP12 ADD PUSH2 0x1A92 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP5 DUP5 PUSH2 0x1B67 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FA6 DUP7 DUP3 DUP8 ADD PUSH2 0x1BC2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1FB7 DUP7 DUP3 DUP8 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1FD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FE0 DUP7 DUP3 DUP8 ADD PUSH2 0x1B73 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x1FF3 DUP2 PUSH2 0x2633 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2004 DUP3 PUSH2 0x262F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2018 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x2021 DUP2 PUSH2 0x268C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x4F564552534F4C445F5745544800000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5749544844524157414C5F4641494C4544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E53554646494349454E545F4554485F52454D41494E494E47000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50455243454E544147455F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x23D7 DUP5 DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x23EA PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x23FD PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1856 PUSH1 0x60 DUP6 ADD DUP3 JUMPDEST PUSH2 0x1FF3 DUP2 PUSH2 0x264C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA62 DUP3 DUP5 PUSH2 0x1FEA JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2431 DUP3 DUP7 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x243E PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x134E PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2459 DUP3 DUP6 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x7A8 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA5F DUP2 DUP5 PUSH2 0x1FF9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x202E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2084 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x20B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x20E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2114 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x216A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x219A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x21CA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x21FA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x222A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x225A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x228A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x22BA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2310 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2340 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2396 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x2586 DUP3 DUP6 PUSH2 0x23C6 JUMP JUMPDEST PUSH2 0x7A8 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x23C6 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA62 DUP3 DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x25C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x25DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2600 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x267B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2663 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1856 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LT EQ BLOCKHASH EXTCODESIZE PUSH18 0xEC46F28ABDFCC7707141B4B514CCC3456289 LOG0 0xdc CALLVALUE BLOCKHASH PUSH26 0xF8ECF10B6C6578706572696D656E74616CF50037000000000000 ",
+ "sourceMap": "836:512:0:-;;;964:382;8:9:-1;5:2;;;30:1;27;20:12;5:2;964:382:0;;;;;;;;;;;;;;;;;;;;;;;;1333:20:3;329:18:29;;337:10;-1:-1:-1;;;;;;329:18:29;;;;;;-1:-1:-1;1764:31:7;;;;-1:-1:-1;;;;;1764:31:7;;;;;;;;;;1805:11;:38;;;;;;;;;;1853:9;:34;;;;;;;;;;;1897:30;;1764:31;;1805:38;;1853:34;;1897:30;;1286:14:0;;1897:30:7;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1937:32:7;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1356:8:3;;843:32:7;;;;;;;;;;;;;;;;1356:37:3;;;-1:-1:-1;;;;;1356:8:3;;;;-1:-1:-1;1356:22:3;;-1:-1:-1;1356:37:3;;-1:-1:-1;843:32:7;;-1:-1:-1;1356:37:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1356:37:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1356:37:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1356:37:3;;;;;;;;;1333:60;-1:-1:-1;;;;;;1407:26:3;;;1403:155;;1449:11;;:43;;;;;-1:-1:-1;;;;;1449:11:3;;;;:19;;:43;;1469:12;;-1:-1:-1;;1016:10:7;1449:43:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1449:43:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1449:43:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1449:43:3;;;;;;;;;-1:-1:-1;1506:9:3;;:41;;;;;-1:-1:-1;;;;;1506:9:3;;;;:17;;:41;;1524:12;;-1:-1:-1;;1016:10:7;1506:41:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1506:41:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1506:41:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1506:41:3;;;;;;;;;;1403:155;1289:275;964:382:0;;;;;836:512;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;836:512:0;;;-1:-1:-1;836:512:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;258:442;;363:4;351:17;;347:27;-1:-1;337:2;;388:1;385;378:12;337:2;418:6;412:13;440:64;455:48;496:6;455:48;;;440:64;;;431:73;;524:6;517:5;510:21;560:4;552:6;548:17;593:4;586:5;582:16;628:3;619:6;614:3;610:16;607:25;604:2;;;645:1;642;635:12;604:2;655:39;687:6;682:3;677;655:39;;;330:370;;;;;;;;708:263;;823:2;811:9;802:7;798:23;794:32;791:2;;;839:1;836;829:12;791:2;874:1;891:64;947:7;927:9;891:64;;;881:74;785:186;-1:-1;;;;785:186;978:1003;;;;;;1179:3;1167:9;1158:7;1154:23;1150:33;1147:2;;;1196:1;1193;1186:12;1147:2;1231:1;1248:64;1304:7;1284:9;1248:64;;;1238:74;;1210:108;1349:2;1367:64;1423:7;1414:6;1403:9;1399:22;1367:64;;;1357:74;;1328:109;1468:2;1486:64;1542:7;1533:6;1522:9;1518:22;1486:64;;;1476:74;;1447:109;1608:2;1597:9;1593:18;1587:25;-1:-1;;;;;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1684:73;1749:7;1740:6;1729:9;1725:22;1684:73;;;1674:83;;1566:197;1815:3;1804:9;1800:19;1794:26;-1:-1;;;;;1832:6;1829:30;1826:2;;;1872:1;1869;1862:12;1826:2;1892:73;1957:7;1948:6;1937:9;1933:22;1892:73;;;1882:83;;1773:198;1141:840;;;;;;;;;1988:257;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:61;2221:7;2201:9;2168:61;;2252:110;2325:31;2350:5;2325:31;;;2320:3;2313:44;2307:55;;;2369:107;2440:30;2464:5;2440:30;;2483:110;2556:31;2581:5;2556:31;;2600:294;2736:2;2721:18;;2750:61;2725:9;2784:6;2750:61;;;2822:62;2880:2;2869:9;2865:18;2856:6;2822:62;;2901:189;3007:2;2992:18;;3021:59;2996:9;3053:6;3021:59;;;2978:112;;;;;3097:256;3159:2;3153:9;3185:17;;;-1:-1;;;;;3245:34;;3281:22;;;3242:62;3239:2;;;3317:1;3314;3307:12;3239:2;3333;3326:22;3137:216;;-1:-1;3137:216;3360:258;;-1:-1;;;;;3495:6;3492:30;3489:2;;;3535:1;3532;3525:12;3489:2;-1:-1;3608:4;3579;3556:17;;;;-1:-1;;3552:33;3598:15;;3426:192;3625:128;-1:-1;;;;;3694:54;;3677:76;3760:151;3839:66;3828:78;;3811:100;4139:92;4212:13;4205:21;;4188:43;4239:268;4304:1;4311:101;4325:6;4322:1;4319:13;4311:101;;;4392:11;;;4386:18;4373:11;;;4366:39;4347:2;4340:10;4311:101;;;4427:6;4424:1;4421:13;4418:2;;;4492:1;4483:6;4478:3;4474:16;4467:27;4418:2;4288:219;;;;;;836:512:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100775763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318978e8281146100d35780638da5cb5b146100fd5780639395525c1461011f578063a1db978214610132578063e2e4951114610152578063f2fde38b1461017f575b60025473ffffffffffffffffffffffffffffffffffffffff1633146100d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612477565b60405180910390fd5b005b6100e66100e1366004611e55565b61019f565b6040516100f4929190612577565b60405180910390f35b34801561010957600080fd5b5061011261033a565b6040516100f49190612415565b6100e661012d366004611d6f565b610356565b34801561013e57600080fd5b506100d161014d366004611d35565b6104c7565b34801561015e57600080fd5b5061017261016d366004611f6e565b6105fa565b6040516100f49190612466565b34801561018b57600080fd5b506100d161019a366004611d17565b6107af565b6101a7611a69565b6101af611a69565b6000806101ba610860565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815261029493909290918301828280156102655780601f1061023a57610100808354040283529160200191610265565b820191906000526020600020905b81548152906001019060200180831161024857829003601f168201915b50505050508c600081518110151561027957fe5b6020908102909101015161014001519063ffffffff61093b16565b156102bf576102a48b8b8b610a68565b93506102b884600001518560600151610d36565b90506102e6565b6102ca8b8b8b610d78565b9350836060015191506102de888389610a68565b845190935090505b6102f1848484610f5a565b610305846020015184602001518888610ff9565b61032c8b600081518110151561031757fe5b906020019060200201516101400151826111ce565b505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b61035e611a69565b610366611a69565b6000806000610373610860565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018816150201909516949094049384018190048102820181019092528281526103f393909290918301828280156102655780601f1061023a57610100808354040283529160200191610265565b156104445761041c670de0b6b3a7640000610416670de0b6b3a76400008a6112ef565b34611339565b92506104298b848c611356565b945061043d85600001518660600151610d36565b9050610488565b61045f670d2f13f7789f0000670de0b6b3a764000034611339565b925061046c8b848c611356565b94508460600151915061048089838a610a68565b855190945090505b610493858584610f5a565b6104a7856020015185602001518989610ff9565b6104b98b600081518110151561031757fe5b505050965096945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610518576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612517565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb9061056c903390859060040161244b565b602060405180830381600087803b15801561058657600080fd5b505af115801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105be9190810190611f50565b15156105f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124e7565b5050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156107015783518552602094850194909301926001016106e3565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561074a57835185526020948501949093019260010161072c565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015610792578351855260209485019490930192600101610774565b5060208a0184038a525050505050505050508090505b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612517565b73ffffffffffffffffffffffffffffffffffffffff81161561085d57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b6000341161089a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612487565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561092057600080fd5b505af1158015610934573d6000803e3d6000fd5b5050505050565b600081518351148015610a5f5750816040518082805190602001908083835b6020831061099757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161095a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b60208310610a2c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109ef565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b90505b92915050565b610a70611a69565b6060806000806000806000610a83611a69565b8a1515610a8f57610d27565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b505060058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152969e5091945092508401905082828015610be25780601f10610bb757610100808354040283529160200191610be2565b820191906000526020600020905b815481529060010190602001808311610bc557829003601f168201915b50505050509650600095508b519450600093505b838514610d2757878c85815181101515610c0c57fe5b6020908102909101015161014001528b5187908d9086908110610c2b57fe5b602090810290910101516101600152610c448b87610d36565b9250610cab8c85815181101515610c5757fe5b9060200190602002015160a00151610ca58e87815181101515610c7657fe5b90602001906020020151608001518f88815181101515610c9257fe5b9060200190602002015160e00151610d36565b85611339565b9150610cf08c85815181101515610cbe57fe5b90602001906020020151610cd38460016112ef565b8c87815181101515610ce157fe5b906020019060200201516114fa565b9050610cfc898261159f565b610d0e89600001518a60600151610d36565b95508a8610610d1c57610d27565b600190930192610bf6565b50505050505050509392505050565b600082821115610d72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124a7565b50900390565b610d80611a69565b606080600080600080610d91611a69565b8a6000815181101515610da057fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929a5092909190830182828015610e585780601f10610e2d57610100808354040283529160200191610e58565b820191906000526020600020905b815481529060010190602001808311610e3b57829003601f168201915b505050505095508a519450600093505b838514610f4c57868b85815181101515610e7e57fe5b6020908102909101015161014001528a5186908c9086908110610e9d57fe5b6020908102909101015161016001528751610eb9908b90610d36565b9250610efc8b85815181101515610ecc57fe5b9060200190602002015160a001518c86815181101515610ee857fe5b906020019060200201516080015185611339565b9150610f288b85815181101515610f0f57fe5b90602001906020020151838b87815181101515610ce157fe5b9050610f34888261159f565b87518a11610f4157610f4c565b600190930192610e68565b505050505050509392505050565b600080610f6f84600001518560600151610d36565b915082821015610fab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124f7565b610fbd856020015185602001516112ef565b905034811115610934576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612497565b6000808066b1a2bc2ec5000085111561103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612527565b6110513461104c89896112ef565b610d36565b925061106685670de0b6b3a764000089611339565b9150828211156110a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612507565b60008311156111c5576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90611101908690600401612593565b600060405180830381600087803b15801561111b57600080fd5b505af115801561112f573d6000803e3d6000fd5b5050505060008211156111815760405173ffffffffffffffffffffffffffffffffffffffff85169083156108fc029084906000818181858888f1935050505015801561117f573d6000803e3d6000fd5b505b61118b8383610d36565b905060008111156111c557604051339082156108fc029083906000818181858888f193505050501580156111c3573d6000803e3d6000fd5b505b50505050505050565b60006111e0838263ffffffff61160116565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff00000000000000000000000000000000000000000000000000000000808316911614156112505761124b838361166e565b6112ea565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff00000000000000000000000000000000000000000000000000000000828116911614156112b85761124b838361185c565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612547565b505050565b60008282018381101561132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124c7565b8091505b5092915050565b600061134e6113488584611944565b8461199f565b949350505050565b61135e611a69565b606080600080600061136e611a69565b89600081518110151561137d57fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929950929091908301828280156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b5050505050945089519350600092505b8284146114ed57858a8481518110151561145b57fe5b602090810290910101516101400152895185908b908590811061147a57fe5b90602001906020020151610160018190525061149a898860200151610d36565b91506114c68a848151811015156114ad57fe5b90602001906020020151838a86815181101515610ce157fe5b90506114d2878261159f565b602087015189116114e2576114ed565b600190920191611445565b5050505050509392505050565b611502611a69565b606060006115118686866105fa565b600154815191935073ffffffffffffffffffffffffffffffffffffffff1691506080908390602082016000855af1808015611553576001811461157157611594565b60008552600060208601526000604086015260006060860152611594565b835185526020840151602086015260408401516040860152606084015160608601525b505050509392505050565b815181516115ad91906112ef565b8252602080830151908201516115c391906112ef565b6020830152604080830151908201516115dc91906112ef565b6040830152606080830151908201516115f591906112ef565b60609092019190915250565b600081600401835110151515611643576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612557565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60008061168284601063ffffffff6119b616565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812091935073ffffffffffffffffffffffffffffffffffffffff841691906116e0903390879060240161244b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b8381101561178457818101518382015260200161176c565b50505050905090810190601f1680156117b15780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124d7565b3d1561181d575060003d6020141561181d5760206000803e506000515b801515611856576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124d7565b50505050565b60008060018314611899576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612567565b6118aa84601063ffffffff6119b616565b91506118bd84602463ffffffff611a1716565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd9061191690309033908690600401612423565b600060405180830381600087803b15801561193057600080fd5b505af11580156111c3573d6000803e3d6000fd5b6000808315156119575760009150611332565b5082820282848281151561196757fe5b041461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124c7565b60008082848115156119ad57fe5b04949350505050565b6000816014018351101515156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c890612537565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b6000610a5f8383600081602001835110151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100c8906124b7565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610a5f8235612633565b6000601f82018313611aaf57600080fd5b8135611ac2611abd826125c8565b6125a1565b81815260209384019390925082018360005b83811015611b005781358601611aea8882611b73565b8452506020928301929190910190600101611ad4565b5050505092915050565b6000601f82018313611b1b57600080fd5b8135611b29611abd826125c8565b81815260209384019390925082018360005b83811015611b005781358601611b518882611bc2565b8452506020928301929190910190600101611b3b565b6000610a5f825161264f565b6000601f82018313611b8457600080fd5b8135611b92611abd826125e9565b91508082526020830160208301858383011115611bae57600080fd5b611bb9838284612654565b50505092915050565b60006101808284031215611bd557600080fd5b611be06101806125a1565b90506000611bee8484611a92565b8252506020611bff84848301611a92565b6020830152506040611c1384828501611a92565b6040830152506060611c2784828501611a92565b6060830152506080611c3b84828501611d0b565b60808301525060a0611c4f84828501611d0b565b60a08301525060c0611c6384828501611d0b565b60c08301525060e0611c7784828501611d0b565b60e083015250610100611c8c84828501611d0b565b61010083015250610120611ca284828501611d0b565b6101208301525061014082013567ffffffffffffffff811115611cc457600080fd5b611cd084828501611b73565b6101408301525061016082013567ffffffffffffffff811115611cf257600080fd5b611cfe84828501611b73565b6101608301525092915050565b6000610a5f823561264c565b600060208284031215611d2957600080fd5b600061134e8484611a92565b60008060408385031215611d4857600080fd5b6000611d548585611a92565b9250506020611d6585828601611d0b565b9150509250929050565b60008060008060008060c08789031215611d8857600080fd5b863567ffffffffffffffff811115611d9f57600080fd5b611dab89828a01611b0a565b965050602087013567ffffffffffffffff811115611dc857600080fd5b611dd489828a01611a9e565b955050604087013567ffffffffffffffff811115611df157600080fd5b611dfd89828a01611b0a565b945050606087013567ffffffffffffffff811115611e1a57600080fd5b611e2689828a01611a9e565b9350506080611e3789828a01611d0b565b92505060a0611e4889828a01611a92565b9150509295509295509295565b600080600080600080600060e0888a031215611e7057600080fd5b873567ffffffffffffffff811115611e8757600080fd5b611e938a828b01611b0a565b9750506020611ea48a828b01611d0b565b965050604088013567ffffffffffffffff811115611ec157600080fd5b611ecd8a828b01611a9e565b955050606088013567ffffffffffffffff811115611eea57600080fd5b611ef68a828b01611b0a565b945050608088013567ffffffffffffffff811115611f1357600080fd5b611f1f8a828b01611a9e565b93505060a0611f308a828b01611d0b565b92505060c0611f418a828b01611a92565b91505092959891949750929550565b600060208284031215611f6257600080fd5b600061134e8484611b67565b600080600060608486031215611f8357600080fd5b833567ffffffffffffffff811115611f9a57600080fd5b611fa686828701611bc2565b9350506020611fb786828701611d0b565b925050604084013567ffffffffffffffff811115611fd457600080fd5b611fe086828701611b73565b9150509250925092565b611ff381612633565b82525050565b60006120048261262f565b808452612018816020860160208601612660565b6120218161268c565b9093016020019392505050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b600d81527f4f564552534f4c445f5745544800000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601181527f5749544844524157414c5f4641494c4544000000000000000000000000000000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601a81527f494e53554646494349454e545f4554485f52454d41494e494e47000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601881527f4645455f50455243454e544147455f544f4f5f4c415247450000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260400190565b805160808301906123d7848261240c565b5060208201516123ea602085018261240c565b5060408201516123fd604085018261240c565b50606082015161185660608501825b611ff38161264c565b60208101610a628284611fea565b606081016124318286611fea565b61243e6020830185611fea565b61134e604083018461240c565b604081016124598285611fea565b6107a8602083018461240c565b60208082528101610a5f8184611ff9565b60208082528101610a628161202e565b60208082528101610a6281612084565b60208082528101610a62816120b4565b60208082528101610a62816120e4565b60208082528101610a6281612114565b60208082528101610a628161216a565b60208082528101610a628161219a565b60208082528101610a62816121ca565b60208082528101610a62816121fa565b60208082528101610a628161222a565b60208082528101610a628161225a565b60208082528101610a628161228a565b60208082528101610a62816122ba565b60208082528101610a6281612310565b60208082528101610a6281612340565b60208082528101610a6281612396565b610100810161258682856123c6565b6107a860808301846123c6565b60208101610a62828461240c565b60405181810167ffffffffffffffff811182821017156125c057600080fd5b604052919050565b600067ffffffffffffffff8211156125df57600080fd5b5060209081020190565b600067ffffffffffffffff82111561260057600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b151590565b82818337506000910152565b60005b8381101561267b578181015183820152602001612663565b838111156118565750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058201014403b71ec46f28abdfcc7707141b4b514ccc3456289a0dc344079f8ecf10b6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18978E82 DUP2 EQ PUSH2 0xD3 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xFD JUMPI DUP1 PUSH4 0x9395525C EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA1DB9782 EQ PUSH2 0x132 JUMPI DUP1 PUSH4 0xE2E49511 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x17F JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xD1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2477 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST PUSH2 0xE6 PUSH2 0xE1 CALLDATASIZE PUSH1 0x4 PUSH2 0x1E55 JUMP JUMPDEST PUSH2 0x19F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP3 SWAP2 SWAP1 PUSH2 0x2577 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x109 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x112 PUSH2 0x33A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP2 SWAP1 PUSH2 0x2415 JUMP JUMPDEST PUSH2 0xE6 PUSH2 0x12D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D6F JUMP JUMPDEST PUSH2 0x356 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD1 PUSH2 0x14D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D35 JUMP JUMPDEST PUSH2 0x4C7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x172 PUSH2 0x16D CALLDATASIZE PUSH1 0x4 PUSH2 0x1F6E JUMP JUMPDEST PUSH2 0x5FA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xF4 SWAP2 SWAP1 PUSH2 0x2466 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD1 PUSH2 0x19A CALLDATASIZE PUSH1 0x4 PUSH2 0x1D17 JUMP JUMPDEST PUSH2 0x7AF JUMP JUMPDEST PUSH2 0x1A7 PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x1AF PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1BA PUSH2 0x860 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x294 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x265 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x23A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x265 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x248 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP13 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x279 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x93B AND JUMP JUMPDEST ISZERO PUSH2 0x2BF JUMPI PUSH2 0x2A4 DUP12 DUP12 DUP12 PUSH2 0xA68 JUMP JUMPDEST SWAP4 POP PUSH2 0x2B8 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH2 0x2E6 JUMP JUMPDEST PUSH2 0x2CA DUP12 DUP12 DUP12 PUSH2 0xD78 JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x2DE DUP9 DUP4 DUP10 PUSH2 0xA68 JUMP JUMPDEST DUP5 MLOAD SWAP1 SWAP4 POP SWAP1 POP JUMPDEST PUSH2 0x2F1 DUP5 DUP5 DUP5 PUSH2 0xF5A JUMP JUMPDEST PUSH2 0x305 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0xFF9 JUMP JUMPDEST PUSH2 0x32C DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x317 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD DUP3 PUSH2 0x11CE JUMP JUMPDEST POP POP SWAP8 POP SWAP8 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x35E PUSH2 0x1A69 JUMP JUMPDEST PUSH2 0x366 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x373 PUSH2 0x860 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x3F3 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x265 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x23A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x265 JUMP JUMPDEST ISZERO PUSH2 0x444 JUMPI PUSH2 0x41C PUSH8 0xDE0B6B3A7640000 PUSH2 0x416 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x12EF JUMP JUMPDEST CALLVALUE PUSH2 0x1339 JUMP JUMPDEST SWAP3 POP PUSH2 0x429 DUP12 DUP5 DUP13 PUSH2 0x1356 JUMP JUMPDEST SWAP5 POP PUSH2 0x43D DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH2 0x488 JUMP JUMPDEST PUSH2 0x45F PUSH8 0xD2F13F7789F0000 PUSH8 0xDE0B6B3A7640000 CALLVALUE PUSH2 0x1339 JUMP JUMPDEST SWAP3 POP PUSH2 0x46C DUP12 DUP5 DUP13 PUSH2 0x1356 JUMP JUMPDEST SWAP5 POP DUP5 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x480 DUP10 DUP4 DUP11 PUSH2 0xA68 JUMP JUMPDEST DUP6 MLOAD SWAP1 SWAP5 POP SWAP1 POP JUMPDEST PUSH2 0x493 DUP6 DUP6 DUP5 PUSH2 0xF5A JUMP JUMPDEST PUSH2 0x4A7 DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP10 DUP10 PUSH2 0xFF9 JUMP JUMPDEST PUSH2 0x4B9 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x317 JUMPI INVALID JUMPDEST POP POP POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x518 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2517 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xA9059CBB00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0xA9059CBB SWAP1 PUSH2 0x56C SWAP1 CALLER SWAP1 DUP6 SWAP1 PUSH1 0x4 ADD PUSH2 0x244B JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x586 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x59A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x5BE SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1F50 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24E7 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x701 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x6E3 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x74A JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x72C JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x792 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x774 JUMP JUMPDEST POP PUSH1 0x20 DUP11 ADD DUP5 SUB DUP11 MSTORE POP POP POP POP POP POP POP POP POP DUP1 SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x800 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2517 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x85D JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLVALUE GT PUSH2 0x89A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2487 JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 CALLVALUE PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x920 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x934 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0xA5F JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x997 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x95A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA2C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xA70 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xA83 PUSH2 0x1A69 JUMP JUMPDEST DUP11 ISZERO ISZERO PUSH2 0xA8F JUMPI PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB33 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB08 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB33 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB16 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP7 SWAP15 POP SWAP2 SWAP5 POP SWAP3 POP DUP5 ADD SWAP1 POP DUP3 DUP3 DUP1 ISZERO PUSH2 0xBE2 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBB7 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBE2 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBC5 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP PUSH1 0x0 SWAP6 POP DUP12 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xD27 JUMPI DUP8 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC0C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xC2B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH2 0xC44 DUP12 DUP8 PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0xCAB DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC57 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xCA5 DUP15 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC76 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP16 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC92 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST DUP6 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP PUSH2 0xCF0 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCBE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xCD3 DUP5 PUSH1 0x1 PUSH2 0x12EF JUMP JUMPDEST DUP13 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x14FA JUMP JUMPDEST SWAP1 POP PUSH2 0xCFC DUP10 DUP3 PUSH2 0x159F JUMP JUMPDEST PUSH2 0xD0E DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP6 POP DUP11 DUP7 LT PUSH2 0xD1C JUMPI PUSH2 0xD27 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xBF6 JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xD72 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24A7 JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0xD80 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xD91 PUSH2 0x1A69 JUMP JUMPDEST DUP11 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDA0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP11 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xE58 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE2D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xE58 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE3B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP6 POP DUP11 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xF4C JUMPI DUP7 DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE7E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP11 MLOAD DUP7 SWAP1 DUP13 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0xE9D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP8 MLOAD PUSH2 0xEB9 SWAP1 DUP12 SWAP1 PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0xEFC DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xECC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEE8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP PUSH2 0xF28 DUP12 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF0F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP12 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xF34 DUP9 DUP3 PUSH2 0x159F JUMP JUMPDEST DUP8 MLOAD DUP11 GT PUSH2 0xF41 JUMPI PUSH2 0xF4C JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0xE68 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xF6F DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 LT ISZERO PUSH2 0xFAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24F7 JUMP JUMPDEST PUSH2 0xFBD DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x12EF JUMP JUMPDEST SWAP1 POP CALLVALUE DUP2 GT ISZERO PUSH2 0x934 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2497 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH7 0xB1A2BC2EC50000 DUP6 GT ISZERO PUSH2 0x103E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2527 JUMP JUMPDEST PUSH2 0x1051 CALLVALUE PUSH2 0x104C DUP10 DUP10 PUSH2 0x12EF JUMP JUMPDEST PUSH2 0xD36 JUMP JUMPDEST SWAP3 POP PUSH2 0x1066 DUP6 PUSH8 0xDE0B6B3A7640000 DUP10 PUSH2 0x1339 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 GT ISZERO PUSH2 0x10A2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2507 JUMP JUMPDEST PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x11C5 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0x1101 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2593 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x112F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP3 GT ISZERO PUSH2 0x1181 JUMPI PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x117F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0x118B DUP4 DUP4 PUSH2 0xD36 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0x11C5 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x11C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11E0 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1601 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0x1250 JUMPI PUSH2 0x124B DUP4 DUP4 PUSH2 0x166E JUMP JUMPDEST PUSH2 0x12EA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x12B8 JUMPI PUSH2 0x124B DUP4 DUP4 PUSH2 0x185C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2547 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x132E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24C7 JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x134E PUSH2 0x1348 DUP6 DUP5 PUSH2 0x1944 JUMP JUMPDEST DUP5 PUSH2 0x199F JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x135E PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x136E PUSH2 0x1A69 JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x137D JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP10 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1435 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1435 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1418 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP5 POP DUP10 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0x14ED JUMPI DUP6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x145B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP10 MLOAD DUP6 SWAP1 DUP12 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x147A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x149A DUP10 DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0xD36 JUMP JUMPDEST SWAP2 POP PUSH2 0x14C6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14AD JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCE1 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x14D2 DUP8 DUP3 PUSH2 0x159F JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD DUP10 GT PUSH2 0x14E2 JUMPI PUSH2 0x14ED JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1445 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1502 PUSH2 0x1A69 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x1511 DUP7 DUP7 DUP7 PUSH2 0x5FA JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 POP PUSH1 0x80 SWAP1 DUP4 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x0 DUP6 GAS CALL DUP1 DUP1 ISZERO PUSH2 0x1553 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x1571 JUMPI PUSH2 0x1594 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH1 0x0 PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x1594 JUMP JUMPDEST DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x15AD SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15C3 SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15DC SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x15F5 SWAP2 SWAP1 PUSH2 0x12EF JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1643 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2557 JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1682 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x19B6 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 SWAP1 PUSH2 0x16E0 SWAP1 CALLER SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x244B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1784 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x176C JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x17B1 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1800 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24D7 JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x181D JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x181D JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x1856 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24D7 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 DUP4 EQ PUSH2 0x1899 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2567 JUMP JUMPDEST PUSH2 0x18AA DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x19B6 AND JUMP JUMPDEST SWAP2 POP PUSH2 0x18BD DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x1A17 AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x1916 SWAP1 ADDRESS SWAP1 CALLER SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2423 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1930 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x11C3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x1957 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1332 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x1967 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x132E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24C7 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x19AD JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x19F8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x2537 JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1A60 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC8 SWAP1 PUSH2 0x24B7 JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 CALLDATALOAD PUSH2 0x2633 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1AAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1AC2 PUSH2 0x1ABD DUP3 PUSH2 0x25C8 JUMP JUMPDEST PUSH2 0x25A1 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B00 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1AEA DUP9 DUP3 PUSH2 0x1B73 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1AD4 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1B1B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B29 PUSH2 0x1ABD DUP3 PUSH2 0x25C8 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B00 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1B51 DUP9 DUP3 PUSH2 0x1BC2 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1B3B JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 MLOAD PUSH2 0x264F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1B84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B92 PUSH2 0x1ABD DUP3 PUSH2 0x25E9 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB9 DUP4 DUP3 DUP5 PUSH2 0x2654 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1BD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BE0 PUSH2 0x180 PUSH2 0x25A1 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1BEE DUP5 DUP5 PUSH2 0x1A92 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1BFF DUP5 DUP5 DUP4 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x1C13 DUP5 DUP3 DUP6 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1C27 DUP5 DUP3 DUP6 ADD PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1C3B DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1C4F DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1C63 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1C77 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1C8C DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1CA2 DUP5 DUP3 DUP6 ADD PUSH2 0x1D0B JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CD0 DUP5 DUP3 DUP6 ADD PUSH2 0x1B73 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CFE DUP5 DUP3 DUP6 ADD PUSH2 0x1B73 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA5F DUP3 CALLDATALOAD PUSH2 0x264C JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP5 DUP5 PUSH2 0x1A92 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D48 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D54 DUP6 DUP6 PUSH2 0x1A92 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D65 DUP6 DUP3 DUP7 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1D88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DAB DUP10 DUP3 DUP11 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DD4 DUP10 DUP3 DUP11 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DFD DUP10 DUP3 DUP11 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E1A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E26 DUP10 DUP3 DUP11 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x1E37 DUP10 DUP3 DUP11 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x1E48 DUP10 DUP3 DUP11 ADD PUSH2 0x1A92 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1E70 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E93 DUP11 DUP3 DUP12 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH2 0x1EA4 DUP11 DUP3 DUP12 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EC1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1ECD DUP11 DUP3 DUP12 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EEA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EF6 DUP11 DUP3 DUP12 ADD PUSH2 0x1B0A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F13 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1F1F DUP11 DUP3 DUP12 ADD PUSH2 0x1A9E JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x1F30 DUP11 DUP3 DUP12 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x1F41 DUP11 DUP3 DUP12 ADD PUSH2 0x1A92 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1F62 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x134E DUP5 DUP5 PUSH2 0x1B67 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1F83 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1F9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FA6 DUP7 DUP3 DUP8 ADD PUSH2 0x1BC2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1FB7 DUP7 DUP3 DUP8 ADD PUSH2 0x1D0B JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1FD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1FE0 DUP7 DUP3 DUP8 ADD PUSH2 0x1B73 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x1FF3 DUP2 PUSH2 0x2633 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2004 DUP3 PUSH2 0x262F JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x2018 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x2660 JUMP JUMPDEST PUSH2 0x2021 DUP2 PUSH2 0x268C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x4F564552534F4C445F5745544800000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5749544844524157414C5F4641494C4544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E53554646494349454E545F4554485F52454D41494E494E47000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50455243454E544147455F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x23D7 DUP5 DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x23EA PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x23FD PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x240C JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x1856 PUSH1 0x60 DUP6 ADD DUP3 JUMPDEST PUSH2 0x1FF3 DUP2 PUSH2 0x264C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA62 DUP3 DUP5 PUSH2 0x1FEA JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2431 DUP3 DUP7 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x243E PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x134E PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x2459 DUP3 DUP6 PUSH2 0x1FEA JUMP JUMPDEST PUSH2 0x7A8 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA5F DUP2 DUP5 PUSH2 0x1FF9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x202E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2084 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x20B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x20E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2114 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x216A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x219A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x21CA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x21FA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x222A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x225A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x228A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x22BA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2310 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2340 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xA62 DUP2 PUSH2 0x2396 JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x2586 DUP3 DUP6 PUSH2 0x23C6 JUMP JUMPDEST PUSH2 0x7A8 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x23C6 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xA62 DUP3 DUP5 PUSH2 0x240C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x25C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x25DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2600 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x267B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x2663 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x1856 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 LT EQ BLOCKHASH EXTCODESIZE PUSH18 0xEC46F28ABDFCC7707141B4B514CCC3456289 LOG0 0xdc CALLVALUE BLOCKHASH PUSH26 0xF8ECF10B6C6578706572696D656E74616CF50037000000000000 ",
+ "sourceMap": "836:512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;960:11:4;;;;938:10;:34;917:116;;;;;;;;;;;;;;;;;;;;;;836:512:0;6752:2594:3;;;;;;;;;;;;;;;;;;;;;;;;;;;258:20:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:29;;;;;;;;;;;;2694:2991:3;;;;;;;;;;1466:243:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1466:243:1;;;;;;;;;1255:10059:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1255:10059:19;;;;;;;;;;;;;;;;;500:167:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:29;;;;;;;;;6752:2594:3;7107:35;;:::i;:::-;7156:38;;:::i;:::-;7280:20;7310:33;7251:18;:16;:18::i;:::-;7389:14;7357:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7389:14;;7357:47;;7389:14;7357:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;7364:1;7357:9;;;;;;;;;;;;;;;;;;;:24;;;;:47;:31;:47;:::i;:::-;7353:1254;;;7618:124;7656:6;7680:20;7718:10;7618:20;:124::i;:::-;7599:143;;7874:79;7882:16;:39;;;7923:16;:29;;;7874:7;:79::i;:::-;7846:107;;7353:1254;;;8131:121;8166:6;8190:20;8228:10;8131:17;:121::i;:::-;8112:140;;8328:16;:29;;;8313:44;;8393:122;8431:9;8458:12;8488:13;8393:20;:122::i;:::-;8557:39;;8371:144;;-1:-1:-1;8557:39:3;-1:-1:-1;7353:1254:3;8731:121;8767:16;8797:19;8830:12;8731:22;:121::i;:::-;8998:195;9035:16;:39;;;9088:19;:42;;;9144:13;9171:12;8998:23;:195::i;:::-;9256:83;9287:6;9294:1;9287:9;;;;;;;;;;;;;;;;;;:24;;;9313:25;9256:30;:83::i;:::-;6752:2594;;;;;;;;;;;;:::o;258:20:29:-;;;;;;:::o;2694:2991:3:-;3012:35;;:::i;:::-;3061:38;;:::i;:::-;3185:22;3217:20;3247:33;3156:18;:16;:18::i;:::-;3326:14;3294:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3326:14;;3294:47;;3326:14;3294:47;;;;;;;;;;;;;;;;;;;;;;;;;3290:1656;;;3447:161;1083:6:7;3521:46:3;1083:6:7;3553:13:3;3521:7;:46::i;:::-;3585:9;3447:16;:161::i;:::-;3430:178;;3747:112;3779:6;3803:14;3835:10;3747:14;:112::i;:::-;3728:131;;3991:79;3999:16;:39;;;4040:16;:29;;;3991:7;:79::i;:::-;3963:107;;3290:1656;;;4203:139;1248:33:7;1083:6;4319:9:3;4203:16;:139::i;:::-;4186:156;;4479:112;4511:6;4535:14;4567:10;4479:14;:112::i;:::-;4460:131;;4667:16;:29;;;4652:44;;4732:122;4770:9;4797:12;4827:13;4732:20;:122::i;:::-;4896:39;;4710:144;;-1:-1:-1;4896:39:3;-1:-1:-1;3290:1656:3;5070:121;5106:16;5136:19;5169:12;5070:22;:121::i;:::-;5337:195;5374:16;:39;;;5427:19;:42;;;5483:13;5510:12;5337:23;:195::i;:::-;5595:83;5626:6;5633:1;5626:9;;;;;;;;;5595:83;2694:2991;;;;;;;;;;;;:::o;1466:243:1:-;426:5:29;;;;412:10;:19;391:85;;;;;;;;;;;;;;1612:47:1;;;;;:27;;;;;;:47;;1640:10;;1652:6;;1612:47;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1612:47:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1612:47:1;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1612:47:1;;;;;;;;;1591:111;;;;;;;;;;;;;;;;1466:243;;:::o;1255:10059:19:-;5273:4;5267:11;;5563:66;5556:4;5533:28;;;5526:104;;;;1441:30;5687:4;5664:28;;6686:59;;;7012:19;;5978:26;;;6992:40;;;7125:23;;;7119:30;7095:22;;;7088:62;7221:23;;;7215:30;7191:22;;;7184:62;7324:23;;;7318:30;7294:22;;;7287:62;7439:4;7421:23;;7415:30;7391:22;;;7384:62;7539:4;7521:23;;7515:30;7491:22;;;7484:62;7639:4;7621:23;;7615:30;7591:22;;;7584:62;7737:4;7719:23;;7713:30;7689:22;;;7682:62;7836:5;7818:24;;7812:31;7787:23;;;7780:64;7941:5;7923:24;;7917:31;7892:23;;;7885:64;8029:5;8011:24;;8005:31;;7980:23;;;7973:64;;;8137:5;8119:24;;8113:31;8088:23;;;8081:64;8221:5;8348:74;;8510:24;8582:19;;8204:23;;;8786:34;;;5267:11;;5664:28;;;;6778:27;;;;5978:26;;8848:22;;;;8630:23;;;;8706:4;8687:24;;8683:35;6432:1;8940:237;8963:13;8960:1;8957:20;8940:237;;;9033:19;;9013:40;;9102:4;9085:22;;;;9140:23;;;;8991:1;8984:9;8940:237;;;-1:-1:-1;;;;9287:31:19;;;9271:13;9252:33;;;9245:74;;;;9413:17;;9407:24;9479:19;;9683:34;;;9279:4;9745:22;;;;9527:23;;;;9603:4;9584:24;;9580:35;9852:1;9838:237;9861:13;9858:1;9855:20;9838:237;;;9931:19;;9911:40;;10000:4;9983:22;;;;10038:23;;;;9889:1;9882:9;9838:237;;;-1:-1:-1;;;10144:46:19;;;-1:-1:-1;10375:33:19;;;10245:4;10223:27;;;10350:59;;;10523:19;;10714:34;;;10223:27;;10776:22;;;;10571:23;;;;10523:19;10647:4;10628:24;;10624:35;-1:-1:-1;10855:237:19;10878:13;10875:1;10872:20;10855:237;;;10948:19;;10928:40;;11017:4;11000:22;;;;11055:23;;;;10906:1;10899:9;10855:237;;;10859:12;11243:4;11224:17;11220:28;11207:11;11203:46;11168:17;11144:119;4539:6734;;;;;;;;;11290:17;11283:24;;1255:10059;;;;;;:::o;500:167:29:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1104:191:4:-;1196:1;1184:9;:13;1163:77;;;;;;;;;;;;;;1250:11;;;;;;;;;;;:19;;;1276:9;1250:38;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1250:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1250:38:4;;;;;1104:191::o;9642:403:27:-;9763:10;9992:3;:10;9978:3;:10;:24;:60;;;;;10034:3;10024:14;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;10024:14:27;;;;;;;;;;;10006;;10024;;-1:-1:-1;10006:14:27;;-1:-1:-1;10024:14:27;;;;-1:-1:-1;10006:14:27;;;;10024;10006;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10006:14:27;;;;;;;;;;;;;;;;:32;;;;9978:60;9971:67;;9642:403;;;;;:::o;8539:2145:2:-;8714:35;;:::i;:::-;8889:25;8941:26;8995:20;9030;9081:9;9401:29;9652:31;9982:35;;:::i;:::-;8812:17;;8808:71;;;8845:23;;8808:71;8917:14;8889:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8917:14;8889:42;;8917:14;8889:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8970:15:2;8941:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8889:42;;-1:-1:-1;8970:15:2;;-1:-1:-1;8941:44:2;-1:-1:-1;8941:44:2;;;-1:-1:-1;8970:15:2;8941:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9018:1;8995:24;;9053:6;:13;9030:36;;9093:1;9081:13;;9076:1568;9096:17;;;9076:1568;;9259:12;9232:6;9239:1;9232:9;;;;;;;;;;;;;;;;;;;:24;;:39;9285:9;;9312:13;;9285:6;;9292:1;;9285:9;;;;;;;;;;;;;;;:24;;:40;9433:35;9441:12;9455;9433:7;:35::i;:::-;9401:67;;9686:220;9720:6;9727:1;9720:9;;;;;;;;;;;;;;;;;;:26;;;9764:55;9772:6;9779:1;9772:9;;;;;;;;;;;;;;;;;;:26;;;9800:6;9807:1;9800:9;;;;;;;;;;;;;;;;;;:18;;;9764:7;:55::i;:::-;9871:21;9686:16;:220::i;:::-;9652:254;;10020:208;10054:6;10061:1;10054:9;;;;;;;;;;;;;;;;;;10081:35;10089:23;10114:1;10081:7;:35::i;:::-;10201:10;10212:1;10201:13;;;;;;;;;;;;;;;;;;10020:16;:208::i;:::-;9982:246;;10314:50;10329:16;10347;10314:14;:50::i;:::-;10393:79;10401:16;:39;;;10442:16;:29;;;10393:7;:79::i;:::-;10378:94;-1:-1:-1;10566:28:2;;;10562:72;;10614:5;;10562:72;9115:3;;;;;9076:1568;;;8539:2145;;;;;;;;;;;;;:::o;501:208:30:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;-1:-1:-1;697:5:30;;;501:208::o;5757:1952:2:-;5937:35;;:::i;:::-;5988:27;6052:26;6107:20;6158:9;6555:37;6861;7147:36;;:::i;:::-;6018:6;6025:1;6018:9;;;;;;;;;;;;;;;;;;;;;:24;;;6081:15;6052:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6018:24;;-1:-1:-1;6052:44:2;6081:15;;6052:44;;;6081:15;6052:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6130:6;:13;6107:36;;6170:1;6158:13;;6153:1517;6173:17;;;6153:1517;;6405:14;6378:6;6385:1;6378:9;;;;;;;;;;;;;;;;;;;:24;;:41;6433:9;;6460:13;;6433:6;;6440:1;;6433:9;;;;;;;;;;;;;;;:24;;:40;6625:39;;6595:70;;6603:20;;6595:7;:70::i;:::-;6555:110;;6901:165;6935:6;6942:1;6935:9;;;;;;;;;;;;;;;;;;:26;;;6979:6;6986:1;6979:9;;;;;;;;;;;;;;;;;;:26;;;7023:29;6901:16;:165::i;:::-;6861:205;;7186:135;7220:6;7227:1;7220:9;;;;;;;;;;;;;;;;;;7247:29;7294:10;7305:1;7294:13;;;;;;;;;7186:135;7147:174;;7406:51;7421:16;7439:17;7406:14;:51::i;:::-;7557:39;;:63;-1:-1:-1;7553:107:2;;7640:5;;7553:107;6192:3;;;;;6153:1517;;;5757:1952;;;;;;;;;;;;:::o;9736:801:3:-;10029:20;10328:16;10052:85;10060:19;:42;;;10104:19;:32;;;10052:7;:85::i;:::-;10029:108;-1:-1:-1;10168:28:3;;;;10147:95;;;;;;;;;;;;;;10347:92;10355:16;:39;;;10396:19;:42;;;10347:7;:92::i;:::-;10328:111;-1:-1:-1;10482:9:3;10470:21;;;10449:81;;;;;;;;;;;;;1827:1473:4;2259:21;;;1143:32:7;2104:35:4;;;2083:106;;;;;;;;;;;;;;2283:105;2304:9;2327:51;2335:26;2363:14;2327:7;:51::i;:::-;2283:7;:105::i;:::-;2259:129;;2469;2499:13;1083:6:7;2562:26:4;2469:16;:129::i;:::-;2452:146;-1:-1:-1;2691:23:4;;;;2670:96;;;;;;;;;;;;;;2844:1;2828:13;:17;2824:470;;;2906:11;;:35;;;;;:11;;;;;:20;;:35;;2927:13;;2906:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2906:35:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2906:35:4;;;;3008:1;2999:6;:10;2995:78;;;3029:29;;:21;;;;:29;;;;;3051:6;;3029:29;;;;3051:6;3029:21;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3029:29:4;2995:78;3158:30;3166:13;3181:6;3158:7;:30::i;:::-;3138:50;;3218:1;3206:9;:13;3202:82;;;3239:30;;:10;;:30;;;;;3259:9;;3239:30;;;;3259:9;3239:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3239:30:4;3202:82;1827:1473;;;;;;;:::o;1908:446:1:-;2041:14;2058:23;:9;2041:14;2058:23;:20;:23;:::i;:::-;843:32:7;;;;;;;;;;;;;;;;2041:40:1;;-1:-1:-1;2096:24:1;;;;;;;2092:256;;;2136:37;2155:9;2166:6;2136:18;:37::i;:::-;2092:256;;;931:41:7;;;;;;;;;;;;;;;;2194:25:1;;;;;;;2190:158;;;2235:38;2255:9;2266:6;2235:19;:38::i;2190:158::-;2304:33;;;;;;;;;;;2190:158;1908:446;;;:::o;715:230:30:-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;937:1;930:8;;715:230;;;;;;:::o;937:331:22:-;1096:21;1149:82;1170:26;1178:9;1189:6;1170:7;:26::i;:::-;1210:11;1149:7;:82::i;:::-;1133:98;937:331;-1:-1:-1;;;;937:331:22:o;3715:1517:2:-;3886:35;;:::i;:::-;3937:27;4001:26;4056:20;4107:9;4499:37;4678:36;;:::i;:::-;3967:6;3974:1;3967:9;;;;;;;;;;;;;;;;;;;;;:24;;;4030:15;4001:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3967:24;;-1:-1:-1;4001:44:2;4030:15;;4001:44;;;4030:15;4001:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:6;:13;4056:36;;4119:1;4107:13;;4102:1091;4122:17;;;4102:1091;;4354:14;4327:6;4334:1;4327:9;;;;;;;;;;;;;;;;;;;:24;;:41;4382:9;;4409:13;;4382:6;;4389:1;;4382:9;;;;;;;;;;;;;;:24;;:40;;;;4539:64;4547:14;4563:16;:39;;;4539:7;:64::i;:::-;4499:104;;4717:135;4751:6;4758:1;4751:9;;;;;;;;;;;;;;;;;;4778:29;4825:10;4836:1;4825:13;;;;;;;;;4717:135;4678:174;;4937:51;4952:16;4970:17;4937:14;:51::i;:::-;5086:39;;;;:57;-1:-1:-1;5082:101:2;;5163:5;;5082:101;4141:3;;;;;4102:1091;;;3715:1517;;;;;;;;;;;:::o;1433:1837::-;1606:30;;:::i;:::-;1699;1847:16;1732:104;1764:5;1783:20;1817:9;1732:18;:104::i;:::-;1874:8;;2417:24;;1699:137;;-1:-1:-1;1874:8:2;;;-1:-1:-1;2567:3:2;;1699:137;;2321:2;2298:26;;1874:8;;2019:3;1997:647;2664:7;2684:205;;;;2907:1;2902:324;;;;2657:569;;2684:205;2729:1;2716:11;2709:22;2777:1;2772:2;2759:11;2755:20;2748:31;2825:1;2820:2;2807:11;2803:20;2796:31;2873:1;2868:2;2855:11;2851:20;2844:31;2684:205;;2902:324;2953:17;2947:24;2934:11;2927:45;3047:2;3028:17;3024:26;3018:33;3013:2;3000:11;2996:20;2989:63;3127:2;3108:17;3104:26;3098:33;3093:2;3080:11;3076:20;3069:63;3207:2;3188:17;3184:26;3178:33;3173:2;3160:11;3156:20;3149:63;2657:569;-1:-1:-1;;1433:1837:2;;;;;;;:::o;1772:648:21:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:21:o;15559:559:27:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:27;15862:10;15856:17;16012:66;16000:79;;15559:559::o;2572:1273:1:-;2693:13;;2709:25;:9;2731:2;2709:25;:21;:25;:::i;:::-;1011:38;;;;;;;;;;;;;;;;2693:41;;-1:-1:-1;2886:10:1;;;;1011:38;2897:113;;2970:10;;2994:6;;2897:113;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2897:113:1;;;49:4:-1;25:18;;61:17;;2897:113:1;182:15:-1;2897:113:1;;;;179:29:-1;;;;160:49;;2886:125:1;;;2897:113;;2886:125;;;;25:18:-1;2886:125:1;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2886:125:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3021:69:1;;;;;;;;;;;;;;;;;3469:14;3466:2;;;-1:-1:-1;3513:1:1;3537:14;3553:2;3534:22;3531:2;;;3675;3672:1;3669;3654:24;-1:-1:-1;3716:1:1;3710:8;3531:2;3790:7;3769:69;;;;;;;;;;;;;;;;2572:1273;;;;:::o;4064:489::-;4298:13;;4217:1;4207:11;;4186:72;;;;;;;;;;;;;;4314:25;:9;4336:2;4314:25;:21;:25;:::i;:::-;4298:41;-1:-1:-1;4367:25:1;:9;4389:2;4367:25;:21;:25;:::i;:::-;4432:114;;;;;4349:43;;-1:-1:-1;4432:32:1;;;;;;:114;;4486:4;;4505:10;;4349:43;;4432:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4432:114:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;50:288:30;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:30;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:30:o;10259:886:27:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:27;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;14699:195::-;14820:14;14865:21;14877:1;14880:5;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:27;13620:2;13718:13;13712:20;;13281:490::o;836:512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1622:116;;1697:36;1725:6;1719:13;1697:36;;1746:432;;1836:4;1824:17;;1820:27;-1:-1;1810:2;;1861:1;1858;1851:12;1810:2;1898:6;1885:20;1920:60;1935:44;1972:6;1935:44;;1920:60;1911:69;;2000:6;1993:5;1986:21;2036:4;2028:6;2024:17;2069:4;2062:5;2058:16;2104:3;2095:6;2090:3;2086:16;2083:25;2080:2;;;2121:1;2118;2111:12;2080:2;2131:41;2165:6;2160:3;2155;2131:41;;;1803:375;;;;;;;;2663:2205;;2771:5;2759:9;2754:3;2750:19;2746:31;2743:2;;;2790:1;2787;2780:12;2743:2;2808:21;2823:5;2808:21;;;2799:30;-1:-1;2887:1;2918:49;2963:3;2943:9;2918:49;;;2894:74;;-1:-1;3037:2;3070:49;3115:3;3091:22;;;3070:49;;;3063:4;3056:5;3052:16;3045:75;2989:142;3196:2;3229:49;3274:3;3265:6;3254:9;3250:22;3229:49;;;3222:4;3215:5;3211:16;3204:75;3141:149;3349:2;3382:49;3427:3;3418:6;3407:9;3403:22;3382:49;;;3375:4;3368:5;3364:16;3357:75;3300:143;3505:3;3539:49;3584:3;3575:6;3564:9;3560:22;3539:49;;;3532:4;3525:5;3521:16;3514:75;3453:147;3662:3;3696:49;3741:3;3732:6;3721:9;3717:22;3696:49;;;3689:4;3682:5;3678:16;3671:75;3610:147;3811:3;3845:49;3890:3;3881:6;3870:9;3866:22;3845:49;;;3838:4;3831:5;3827:16;3820:75;3767:139;3960:3;3994:49;4039:3;4030:6;4019:9;4015:22;3994:49;;;3987:4;3980:5;3976:16;3969:75;3916:139;4122:3;4157:49;4202:3;4193:6;4182:9;4178:22;4157:49;;;4149:5;4142;4138:17;4131:76;4065:153;4268:3;4303:49;4348:3;4339:6;4328:9;4324:22;4303:49;;;4295:5;4288;4284:17;4277:76;4228:136;4452:3;4441:9;4437:19;4424:33;4477:18;4469:6;4466:30;4463:2;;;4509:1;4506;4499:12;4463:2;4545:54;4595:3;4586:6;4575:9;4571:22;4545:54;;;4537:5;4530;4526:17;4519:81;4374:237;4699:3;4688:9;4684:19;4671:33;4724:18;4716:6;4713:30;4710:2;;;4756:1;4753;4746:12;4710:2;4792:54;4842:3;4833:6;4822:9;4818:22;4792:54;;;4784:5;4777;4773:17;4766:81;4621:237;2737:2131;;;;;7119:118;;7186:46;7224:6;7211:20;7186:46;;7244:241;;7348:2;7336:9;7327:7;7323:23;7319:32;7316:2;;;7364:1;7361;7354:12;7316:2;7399:1;7416:53;7461:7;7441:9;7416:53;;7492:366;;;7613:2;7601:9;7592:7;7588:23;7584:32;7581:2;;;7629:1;7626;7619:12;7581:2;7664:1;7681:53;7726:7;7706:9;7681:53;;;7671:63;;7643:97;7771:2;7789:53;7834:7;7825:6;7814:9;7810:22;7789:53;;;7779:63;;7750:98;7575:283;;;;;;7865:1509;;;;;;;8202:3;8190:9;8181:7;8177:23;8173:33;8170:2;;;8219:1;8216;8209:12;8170:2;8254:31;;8305:18;8294:30;;8291:2;;;8337:1;8334;8327:12;8291:2;8357:97;8446:7;8437:6;8426:9;8422:22;8357:97;;;8347:107;;8233:227;8519:2;8508:9;8504:18;8491:32;8543:18;8535:6;8532:30;8529:2;;;8575:1;8572;8565:12;8529:2;8595:83;8670:7;8661:6;8650:9;8646:22;8595:83;;;8585:93;;8470:214;8743:2;8732:9;8728:18;8715:32;8767:18;8759:6;8756:30;8753:2;;;8799:1;8796;8789:12;8753:2;8819:97;8908:7;8899:6;8888:9;8884:22;8819:97;;;8809:107;;8694:228;8981:2;8970:9;8966:18;8953:32;9005:18;8997:6;8994:30;8991:2;;;9037:1;9034;9027:12;8991:2;9057:83;9132:7;9123:6;9112:9;9108:22;9057:83;;;9047:93;;8932:214;9177:3;9196:53;9241:7;9232:6;9221:9;9217:22;9196:53;;;9186:63;;9156:99;9286:3;9305:53;9350:7;9341:6;9330:9;9326:22;9305:53;;;9295:63;;9265:99;8164:1210;;;;;;;;;9381:1635;;;;;;;;9735:3;9723:9;9714:7;9710:23;9706:33;9703:2;;;9752:1;9749;9742:12;9703:2;9787:31;;9838:18;9827:30;;9824:2;;;9870:1;9867;9860:12;9824:2;9890:97;9979:7;9970:6;9959:9;9955:22;9890:97;;;9880:107;;9766:227;10024:2;10042:53;10087:7;10078:6;10067:9;10063:22;10042:53;;;10032:63;;10003:98;10160:2;10149:9;10145:18;10132:32;10184:18;10176:6;10173:30;10170:2;;;10216:1;10213;10206:12;10170:2;10236:83;10311:7;10302:6;10291:9;10287:22;10236:83;;;10226:93;;10111:214;10384:2;10373:9;10369:18;10356:32;10408:18;10400:6;10397:30;10394:2;;;10440:1;10437;10430:12;10394:2;10460:97;10549:7;10540:6;10529:9;10525:22;10460:97;;;10450:107;;10335:228;10622:3;10611:9;10607:19;10594:33;10647:18;10639:6;10636:30;10633:2;;;10679:1;10676;10669:12;10633:2;10699:83;10774:7;10765:6;10754:9;10750:22;10699:83;;;10689:93;;10573:215;10819:3;10838:53;10883:7;10874:6;10863:9;10859:22;10838:53;;;10828:63;;10798:99;10928:3;10947:53;10992:7;10983:6;10972:9;10968:22;10947:53;;;10937:63;;10907:99;9697:1319;;;;;;;;;;;11023:257;;11135:2;11123:9;11114:7;11110:23;11106:32;11103:2;;;11151:1;11148;11141:12;11103:2;11186:1;11203:61;11256:7;11236:9;11203:61;;11287:727;;;;11457:2;11445:9;11436:7;11432:23;11428:32;11425:2;;;11473:1;11470;11463:12;11425:2;11508:31;;11559:18;11548:30;;11545:2;;;11591:1;11588;11581:12;11545:2;11611:76;11679:7;11670:6;11659:9;11655:22;11611:76;;;11601:86;;11487:206;11724:2;11742:53;11787:7;11778:6;11767:9;11763:22;11742:53;;;11732:63;;11703:98;11860:2;11849:9;11845:18;11832:32;11884:18;11876:6;11873:30;11870:2;;;11916:1;11913;11906:12;11870:2;11936:62;11990:7;11981:6;11970:9;11966:22;11936:62;;;11926:72;;11811:193;11419:595;;;;;;12021:110;12094:31;12119:5;12094:31;;;12089:3;12082:44;12076:55;;;12138:297;;12238:38;12270:5;12238:38;;;12293:6;12288:3;12281:19;12305:63;12361:6;12354:4;12349:3;12345:14;12338:4;12331:5;12327:16;12305:63;;;12400:29;12422:6;12400:29;;;12380:50;;;12393:4;12380:50;;12218:217;-1:-1;;;12218:217;12443:397;12598:2;12586:15;;12635:66;12630:2;12621:12;;12614:88;12736:66;12731:2;12722:12;;12715:88;12831:2;12822:12;;12579:261;12849:296;13004:2;12992:15;;13041:66;13036:2;13027:12;;13020:88;13136:2;13127:12;;12985:160;13154:296;13309:2;13297:15;;13346:66;13341:2;13332:12;;13325:88;13441:2;13432:12;;13290:160;13459:296;13614:2;13602:15;;13651:66;13646:2;13637:12;;13630:88;13746:2;13737:12;;13595:160;13764:397;13919:2;13907:15;;13956:66;13951:2;13942:12;;13935:88;14057:66;14052:2;14043:12;;14036:88;14152:2;14143:12;;13900:261;14170:296;14325:2;14313:15;;14362:66;14357:2;14348:12;;14341:88;14457:2;14448:12;;14306:160;14475:296;14630:2;14618:15;;14667:66;14662:2;14653:12;;14646:88;14762:2;14753:12;;14611:160;14780:296;14935:2;14923:15;;14972:66;14967:2;14958:12;;14951:88;15067:2;15058:12;;14916:160;15085:296;15240:2;15228:15;;15277:66;15272:2;15263:12;;15256:88;15372:2;15363:12;;15221:160;15390:296;15545:2;15533:15;;15582:66;15577:2;15568:12;;15561:88;15677:2;15668:12;;15526:160;15695:296;15850:2;15838:15;;15887:66;15882:2;15873:12;;15866:88;15982:2;15973:12;;15831:160;16000:296;16155:2;16143:15;;16192:66;16187:2;16178:12;;16171:88;16287:2;16278:12;;16136:160;16305:397;16460:2;16448:15;;16497:66;16492:2;16483:12;;16476:88;16598:66;16593:2;16584:12;;16577:88;16693:2;16684:12;;16441:261;16711:296;16866:2;16854:15;;16903:66;16898:2;16889:12;;16882:88;16998:2;16989:12;;16847:160;17016:397;17171:2;17159:15;;17208:66;17203:2;17194:12;;17187:88;17309:66;17304:2;17295:12;;17288:88;17404:2;17395:12;;17152:261;17422:296;17577:2;17565:15;;17614:66;17609:2;17600:12;;17593:88;17709:2;17700:12;;17558:160;17803:888;18031:22;;17944:4;17935:14;;;18065:61;17939:3;18031:22;18065:61;;;17964:174;18232:4;18225:5;18221:16;18215:23;18250:62;18306:4;18301:3;18297:14;18284:11;18250:62;;;18148:176;18408:4;18401:5;18397:16;18391:23;18426:62;18482:4;18477:3;18473:14;18460:11;18426:62;;;18334:166;18584:4;18577:5;18573:16;18567:23;18602:62;18658:4;18653:3;18649:14;18636:11;18698:110;18771:31;18796:5;18771:31;;18815:193;18923:2;18908:18;;18937:61;18912:9;18971:6;18937:61;;19015:395;19179:2;19164:18;;19193:61;19168:9;19227:6;19193:61;;;19265:62;19323:2;19312:9;19308:18;19299:6;19265:62;;;19338;19396:2;19385:9;19381:18;19372:6;19338:62;;19417:294;19553:2;19538:18;;19567:61;19542:9;19601:6;19567:61;;;19639:62;19697:2;19686:9;19682:18;19673:6;19639:62;;19718:277;19844:2;19858:47;;;19829:18;;19919:66;19829:18;19971:6;19919:66;;20002:387;20183:2;20197:47;;;20168:18;;20258:121;20168:18;20258:121;;20396:387;20577:2;20591:47;;;20562:18;;20652:121;20562:18;20652:121;;20790:387;20971:2;20985:47;;;20956:18;;21046:121;20956:18;21046:121;;21184:387;21365:2;21379:47;;;21350:18;;21440:121;21350:18;21440:121;;21578:387;21759:2;21773:47;;;21744:18;;21834:121;21744:18;21834:121;;21972:387;22153:2;22167:47;;;22138:18;;22228:121;22138:18;22228:121;;22366:387;22547:2;22561:47;;;22532:18;;22622:121;22532:18;22622:121;;22760:387;22941:2;22955:47;;;22926:18;;23016:121;22926:18;23016:121;;23154:387;23335:2;23349:47;;;23320:18;;23410:121;23320:18;23410:121;;23548:387;23729:2;23743:47;;;23714:18;;23804:121;23714:18;23804:121;;23942:387;24123:2;24137:47;;;24108:18;;24198:121;24108:18;24198:121;;24336:387;24517:2;24531:47;;;24502:18;;24592:121;24502:18;24592:121;;24730:387;24911:2;24925:47;;;24896:18;;24986:121;24896:18;24986:121;;25124:387;25305:2;25319:47;;;25290:18;;25380:121;25290:18;25380:121;;25518:387;25699:2;25713:47;;;25684:18;;25774:121;25684:18;25774:121;;25912:387;26093:2;26107:47;;;26078:18;;26168:121;26078:18;26168:121;;26306:528;26558:3;26543:19;;26573:119;26547:9;26665:6;26573:119;;;26703:121;26819:3;26808:9;26804:19;26795:6;26703:121;;26841:193;26949:2;26934:18;;26963:61;26938:9;26997:6;26963:61;;27041:256;27103:2;27097:9;27129:17;;;27204:18;27189:34;;27225:22;;;27186:62;27183:2;;;27261:1;27258;27251:12;27183:2;27277;27270:22;27081:216;;-1:-1;27081:216;27304:263;;27468:18;27460:6;27457:30;27454:2;;;27500:1;27497;27490:12;27454:2;-1:-1;27529:4;27517:17;;;27547:15;;27391:176;27858:254;;27997:18;27989:6;27986:30;27983:2;;;28029:1;28026;28019:12;27983:2;-1:-1;28102:4;28073;28050:17;;;;28069:9;28046:33;28092:15;;27920:192;28384:91;28458:12;;28442:33;28482:128;28562:42;28551:54;;28534:76;28617:79;28686:5;28669:27;28838:92;28911:13;28904:21;;28887:43;29024:145;29105:6;29100:3;29095;29082:30;-1:-1;29161:1;29143:16;;29136:27;29075:94;29178:268;29243:1;29250:101;29264:6;29261:1;29258:13;29250:101;;;29331:11;;;29325:18;29312:11;;;29305:39;29286:2;29279:10;29250:101;;;29366:6;29363:1;29360:13;29357:2;;;-1:-1;;29431:1;29413:16;;29406:27;29227:219;29454:97;29542:2;29522:14;29538:7;29518:28;;29502:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/forwarder/Forwarder.sol": {
+ "id": 0
+ },
+ "2.0.0/forwarder/MixinAssets.sol": {
+ "id": 1
+ },
+ "2.0.0/forwarder/MixinExchangeWrapper.sol": {
+ "id": 2
+ },
+ "2.0.0/forwarder/MixinForwarderCore.sol": {
+ "id": 3
+ },
+ "2.0.0/forwarder/MixinWeth.sol": {
+ "id": 4
+ },
+ "2.0.0/forwarder/interfaces/IAssets.sol": {
+ "id": 5
+ },
+ "2.0.0/forwarder/interfaces/IForwarderCore.sol": {
+ "id": 6
+ },
+ "2.0.0/forwarder/libs/LibConstants.sol": {
+ "id": 7
+ },
+ "2.0.0/forwarder/mixins/MAssets.sol": {
+ "id": 8
+ },
+ "2.0.0/forwarder/mixins/MExchangeWrapper.sol": {
+ "id": 9
+ },
+ "2.0.0/forwarder/mixins/MForwarderCore.sol": {
+ "id": 10
+ },
+ "2.0.0/forwarder/mixins/MWeth.sol": {
+ "id": 11
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 12
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchange.sol": {
+ "id": 13
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 14
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 15
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 16
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 17
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": {
+ "id": 18
+ },
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol": {
+ "id": 19
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 20
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 21
+ },
+ "2.0.0/protocol/Exchange/libs/LibMath.sol": {
+ "id": 22
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 23
+ },
+ "2.0.0/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 24
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": {
+ "id": 25
+ },
+ "2.0.0/tokens/EtherToken/IEtherToken.sol": {
+ "id": 26
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 27
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 28
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 29
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 30
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/forwarder/Forwarder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinWeth.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinAssets.sol\";\nimport \"./MixinExchangeWrapper.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Forwarder is\n LibConstants,\n MixinWeth,\n MixinAssets,\n MixinExchangeWrapper,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n LibConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n",
+ "2.0.0/forwarder/MixinAssets.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 solidity 0.4.24;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../utils/Ownable/Ownable.sol\";\nimport \"../tokens/ERC20Token/IERC20Token.sol\";\nimport \"../tokens/ERC721Token/IERC721Token.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MAssets.sol\";\n\n\ncontract MixinAssets is\n Ownable,\n LibConstants,\n MAssets\n{\n\n using LibBytes for bytes;\n\n bytes4 constant internal ERC20_TRANSFER_SELECTOR = bytes4(keccak256(\"transfer(address,uint256)\"));\n\n /// @dev Withdraws ERC20 tokens from this contract. The contract requires a ZRX balance in order to \n /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be\n /// used to withdraw tokens that were accidentally sent to this contract.\n /// @param token Address of ERC20 token to withdraw.\n /// @param amount Amount of ERC20 token to withdraw.\n function withdrawERC20(\n address token,\n uint256 amount\n )\n external\n onlyOwner\n {\n require(\n IERC20Token(token).transfer(msg.sender, amount),\n \"WITHDRAWAL_FAILED\"\n );\n }\n\n /// @dev Transfers given amount of asset to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferPurchasedAssetToSender(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n bytes4 proxyId = assetData.readBytes4(0);\n\n if (proxyId == ERC20_DATA_ID) {\n transferERC20Token(assetData, amount);\n } else if (proxyId == ERC721_DATA_ID) {\n transferERC721Token(assetData, amount);\n } else {\n revert(\"UNSUPPORTED_TOKEN_PROXY\");\n }\n }\n\n /// @dev Decodes ERC20 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC20Token(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n address token = assetData.readAddress(16);\n\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n ERC20_TRANSFER_SELECTOR,\n msg.sender,\n amount\n ));\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n }\n\n /// @dev Decodes ERC721 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC721Token(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n require(\n amount == 1,\n \"INVALID_AMOUNT\"\n );\n // Decode asset data.\n address token = assetData.readAddress(16);\n uint256 tokenId = assetData.readUint256(36);\n\n // Perform transfer.\n IERC721Token(token).transferFrom(\n address(this),\n msg.sender,\n tokenId\n );\n }\n}\n",
+ "2.0.0/forwarder/MixinExchangeWrapper.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MExchangeWrapper.sol\";\nimport \"../protocol/Exchange/libs/LibAbiEncoder.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\n\n\ncontract MixinExchangeWrapper is\n LibAbiEncoder,\n LibFillResults,\n LibMath,\n LibConstants,\n MExchangeWrapper\n{\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (FillResults memory fillResults)\n {\n // ABI encode calldata for `fillOrder`\n bytes memory fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n\n address exchange = address(EXCHANGE);\n\n // Call `fillOrder` and handle any exceptions gracefully\n assembly {\n let success := call(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n exchange, // call address of Exchange contract\n 0, // transfer 0 wei\n add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)\n mload(fillOrderCalldata), // length of input\n fillOrderCalldata, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(fillOrderCalldata))\n mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))\n mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))\n mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param wethSellAmount Desired amount of WETH to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellWeth(\n LibOrder.Order[] memory orders,\n uint256 wethSellAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // We assume that asset being sold by taker is WETH for each order.\n orders[i].makerAssetData = makerAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of WETH to sell\n uint256 remainingTakerAssetFillAmount = safeSub(wethSellAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of WETH\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= wethSellAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// The asset being sold by taker must always be WETH.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyWithWeth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // We assume that asset being sold by taker is WETH for each order.\n orders[i].makerAssetData = makerAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee\n /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX\n /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// The asset being sold by taker must always be WETH. \n /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.\n /// @param zrxBuyAmount Desired amount of ZRX to buy.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function marketBuyZrxWithWeth(\n LibOrder.Order[] memory orders,\n uint256 zrxBuyAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n // Do nothing if zrxBuyAmount == 0\n if (zrxBuyAmount == 0) {\n return totalFillResults;\n }\n\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n uint256 zrxPurchased = 0;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // All of these are ZRX/WETH, so we can drop the respective assetData from calldata.\n orders[i].makerAssetData = zrxAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of ZRX to buy.\n uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, zrxPurchased);\n\n // Convert the remaining amount of ZRX to buy into remaining amount\n // of WETH to sell, assuming entire amount can be sold in the current order.\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxBuyAmount\n );\n\n // Attempt to sell the remaining amount of WETH.\n FillResults memory singleFillResult = fillOrderNoThrow(\n orders[i],\n safeAdd(remainingWethSellAmount, 1), // we add 1 wei to the fill amount to make up for rounding errors\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker.\n addFillResults(totalFillResults, singleFillResult);\n zrxPurchased = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);\n\n // Stop execution if the entire amount of ZRX has been bought.\n if (zrxPurchased >= zrxBuyAmount) {\n break;\n }\n }\n\n return totalFillResults;\n }\n}\n",
+ "2.0.0/forwarder/MixinForwarderCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MWeth.sol\";\nimport \"./mixins/MAssets.sol\";\nimport \"./mixins/MExchangeWrapper.sol\";\nimport \"./mixins/MForwarderCore.sol\";\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\n\n\ncontract MixinForwarderCore is\n LibFillResults,\n LibMath,\n LibConstants,\n MWeth,\n MAssets,\n MExchangeWrapper,\n MForwarderCore\n{\n\n using LibBytes for bytes;\n\n /// @dev Constructor approves ERC20 proxy to transfer ZRX and WETH on this contract's behalf.\n constructor ()\n public\n {\n address proxyAddress = EXCHANGE.getAssetProxy(ERC20_DATA_ID);\n if (proxyAddress != address(0)) {\n ETHER_TOKEN.approve(proxyAddress, MAX_UINT);\n ZRX_TOKEN.approve(proxyAddress, MAX_UINT);\n }\n }\n\n /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketSellOrdersWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n FillResults memory orderFillResults,\n FillResults memory feeOrderFillResults\n )\n {\n // Convert ETH to WETH.\n convertEthToWeth();\n\n uint256 wethSellAmount;\n uint256 zrxBuyAmount;\n uint256 makerAssetAmountPurchased;\n if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {\n // Calculate amount of WETH that won't be spent on ETH fees.\n wethSellAmount = getPartialAmount(\n PERCENTAGE_DENOMINATOR,\n safeAdd(PERCENTAGE_DENOMINATOR, feePercentage),\n msg.value\n );\n // Market sell available WETH.\n // ZRX fees are paid with this contract's balance.\n orderFillResults = marketSellWeth(\n orders,\n wethSellAmount,\n signatures\n );\n // The fee amount must be deducted from the amount transfered back to sender.\n makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);\n } else {\n // 5% of WETH is reserved for filling feeOrders and paying feeRecipient.\n wethSellAmount = getPartialAmount(\n MAX_WETH_FILL_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n msg.value\n );\n // Market sell 95% of WETH.\n // ZRX fees are payed with this contract's balance.\n orderFillResults = marketSellWeth(\n orders,\n wethSellAmount,\n signatures\n );\n // Buy back all ZRX spent on fees.\n zrxBuyAmount = orderFillResults.takerFeePaid;\n feeOrderFillResults = marketBuyZrxWithWeth(\n feeOrders,\n zrxBuyAmount,\n feeSignatures\n );\n makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;\n }\n\n // Ensure that all ZRX fees have been repurchased and no extra WETH owned by this contract has been sold.\n assertValidFillResults(\n orderFillResults,\n feeOrderFillResults,\n zrxBuyAmount\n );\n\n // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.\n // Refund remaining ETH to msg.sender.\n transferEthFeeAndRefund(\n orderFillResults.takerAssetFilledAmount,\n feeOrderFillResults.takerAssetFilledAmount,\n feePercentage,\n feeRecipient\n );\n\n // Transfer purchased assets to msg.sender.\n transferPurchasedAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);\n }\n\n /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.\n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketBuyOrdersWithEth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n FillResults memory orderFillResults,\n FillResults memory feeOrderFillResults\n )\n {\n // Convert ETH to WETH.\n convertEthToWeth();\n\n uint256 zrxBuyAmount;\n uint256 makerAssetAmountPurchased;\n if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {\n // If the makerAsset is ZRX, it is not necessary to pay fees out of this\n // contracts's ZRX balance because fees are factored into the price of the order.\n orderFillResults = marketBuyZrxWithWeth(\n orders,\n makerAssetFillAmount,\n signatures\n );\n // The fee amount must be deducted from the amount transfered back to sender.\n makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);\n } else {\n // Attemp to purchase desired amount of makerAsset.\n // ZRX fees are payed with this contract's balance.\n orderFillResults = marketBuyWithWeth(\n orders,\n makerAssetFillAmount,\n signatures\n );\n // Buy back all ZRX spent on fees.\n zrxBuyAmount = orderFillResults.takerFeePaid;\n feeOrderFillResults = marketBuyZrxWithWeth(\n feeOrders,\n zrxBuyAmount,\n feeSignatures\n );\n makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;\n }\n\n // Ensure that all ZRX fees have been repurchased and no extra WETH owned by this contract has been sold.\n assertValidFillResults(\n orderFillResults,\n feeOrderFillResults,\n zrxBuyAmount\n );\n\n // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.\n // Refund remaining ETH to msg.sender.\n transferEthFeeAndRefund(\n orderFillResults.takerAssetFilledAmount,\n feeOrderFillResults.takerAssetFilledAmount,\n feePercentage,\n feeRecipient\n );\n\n // Transfer purchased assets to msg.sender.\n transferPurchasedAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);\n }\n\n /// @dev Ensures that all ZRX fees have been repurchased and no extra WETH owned by this contract has been sold.\n /// @param orderFillResults Amounts filled and fees paid for primary orders.\n /// @param feeOrderFillResults Amounts filled and fees paid for fee orders.\n /// @param zrxBuyAmount The amount of ZRX that needed to be repurchased after filling primary orders.\n function assertValidFillResults(\n FillResults memory orderFillResults,\n FillResults memory feeOrderFillResults,\n uint256 zrxBuyAmount\n )\n internal\n view\n {\n // Ensure that all ZRX spent while filling primary orders has been repurchased.\n uint256 zrxPurchased = safeSub(feeOrderFillResults.makerAssetFilledAmount, feeOrderFillResults.takerFeePaid);\n require(\n zrxPurchased >= zrxBuyAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n\n // Ensure that no extra WETH owned by this contract has been sold.\n uint256 wethSold = safeAdd(orderFillResults.takerAssetFilledAmount, feeOrderFillResults.takerAssetFilledAmount);\n require(\n wethSold <= msg.value,\n \"OVERSOLD_WETH\"\n );\n }\n}\n",
+ "2.0.0/forwarder/MixinWeth.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 solidity 0.4.24;\n\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MWeth.sol\";\n\n\ncontract MixinWeth is\n LibMath,\n LibConstants,\n MWeth\n{\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Converts message call's ETH value into WETH.\n function convertEthToWeth()\n internal\n {\n require(\n msg.value > 0,\n \"INVALID_MSG_VALUE\"\n );\n ETHER_TOKEN.deposit.value(msg.value)();\n }\n\n /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.\n /// Refunds any excess ETH to msg.sender.\n /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.\n /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n function transferEthFeeAndRefund(\n uint256 wethSoldExcludingFeeOrders,\n uint256 wethSoldForZrx,\n uint256 feePercentage,\n address feeRecipient\n )\n internal\n {\n // Ensure feePercentage is less than 5%.\n require(\n feePercentage <= MAX_FEE_PERCENTAGE,\n \"FEE_PERCENTAGE_TOO_LARGE\"\n );\n\n // Calculate amount of WETH that hasn't been sold.\n uint256 wethRemaining = safeSub(\n msg.value,\n safeAdd(wethSoldExcludingFeeOrders, wethSoldForZrx)\n );\n\n // Calculate ETH fee to pay to feeRecipient.\n uint256 ethFee = getPartialAmount(\n feePercentage,\n PERCENTAGE_DENOMINATOR,\n wethSoldExcludingFeeOrders\n );\n\n // Ensure fee is less than amount of WETH remaining.\n require(\n ethFee <= wethRemaining,\n \"INSUFFICIENT_ETH_REMAINING\"\n );\n \n // Do nothing if no WETH remaining\n if (wethRemaining > 0) {\n // Convert remaining WETH to ETH\n ETHER_TOKEN.withdraw(wethRemaining);\n\n // Pay ETH to feeRecipient\n if (ethFee > 0) {\n feeRecipient.transfer(ethFee);\n }\n\n // Refund remaining ETH to msg.sender.\n uint256 ethRefund = safeSub(wethRemaining, ethFee);\n if (ethRefund > 0) {\n msg.sender.transfer(ethRefund);\n }\n }\n }\n}\n",
+ "2.0.0/forwarder/interfaces/IAssets.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 solidity 0.4.24;\n\n\ncontract IAssets {\n\n /// @dev Withdraws ERC20 tokens from this contract. The contract requires a ZRX balance in order to \n /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be\n /// used to withdraw tokens that were accidentally sent to this contract.\n /// @param token Address of ERC20 token to withdraw.\n /// @param amount Amount of ERC20 token to withdraw.\n function withdrawERC20(\n address token,\n uint256 amount\n )\n external;\n}\n",
+ "2.0.0/forwarder/interfaces/IForwarderCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract IForwarderCore {\n\n /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketSellOrdersWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n LibFillResults.FillResults memory orderFillResults,\n LibFillResults.FillResults memory feeOrderFillResults\n );\n\n /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.\n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketBuyOrdersWithEth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n LibFillResults.FillResults memory orderFillResults,\n LibFillResults.FillResults memory feeOrderFillResults\n );\n}\n",
+ "2.0.0/forwarder/libs/LibConstants.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../tokens/EtherToken/IEtherToken.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\n\ncontract LibConstants {\n\n bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256)\"));\n uint256 constant internal MAX_UINT = 2**256 - 1;\n uint256 constant internal PERCENTAGE_DENOMINATOR = 10**18; \n uint256 constant internal MAX_FEE_PERCENTAGE = 5 * PERCENTAGE_DENOMINATOR / 100; // 5%\n uint256 constant internal MAX_WETH_FILL_PERCENTAGE = 95 * PERCENTAGE_DENOMINATOR / 100; // 95%\n \n // solhint-disable var-name-mixedcase\n IExchange internal EXCHANGE;\n IEtherToken internal ETHER_TOKEN;\n IERC20Token internal ZRX_TOKEN;\n bytes internal ZRX_ASSET_DATA;\n bytes internal WETH_ASSET_DATA;\n // solhint-enable var-name-mixedcase\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = IExchange(_exchange);\n ETHER_TOKEN = IEtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n}\n",
+ "2.0.0/forwarder/mixins/MAssets.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 solidity 0.4.24;\n\nimport \"../interfaces/IAssets.sol\";\n\n\ncontract MAssets is\n IAssets\n{\n\n /// @dev Transfers given amount of asset to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferPurchasedAssetToSender(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n\n /// @dev Decodes ERC20 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC20Token(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n\n /// @dev Decodes ERC721 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC721Token(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n}\n",
+ "2.0.0/forwarder/mixins/MExchangeWrapper.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract MExchangeWrapper {\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param wethSellAmount Desired amount of WETH to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellWeth(\n LibOrder.Order[] memory orders,\n uint256 wethSellAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// The asset being sold by taker must always be WETH.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyWithWeth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee\n /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX\n /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// The asset being sold by taker must always be WETH. \n /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.\n /// @param zrxBuyAmount Desired amount of ZRX to buy.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function marketBuyZrxWithWeth(\n LibOrder.Order[] memory orders,\n uint256 zrxBuyAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
+ "2.0.0/forwarder/mixins/MForwarderCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../interfaces/IForwarderCore.sol\";\n\n\ncontract MForwarderCore is\n IForwarderCore\n{\n\n /// @dev Ensures that all ZRX fees have been repurchased and no extra WETH owned by this contract has been sold.\n /// @param orderFillResults Amounts filled and fees paid for primary orders.\n /// @param feeOrderFillResults Amounts filled and fees paid for fee orders.\n /// @param zrxBuyAmount The amount of ZRX that needed to be repurchased after filling primary orders.\n function assertValidFillResults(\n LibFillResults.FillResults memory orderFillResults,\n LibFillResults.FillResults memory feeOrderFillResults,\n uint256 zrxBuyAmount\n )\n internal\n view;\n}\n",
+ "2.0.0/forwarder/mixins/MWeth.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 solidity 0.4.24;\n\n\ncontract MWeth {\n\n /// @dev Converts message call's ETH value into WETH.\n function convertEthToWeth()\n internal;\n\n /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.\n /// Refunds any excess ETH to msg.sender.\n /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.\n /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n function transferEthFeeAndRefund(\n uint256 wethSoldExcludingFeeOrders,\n uint256 wethSoldForZrx,\n uint256 feePercentage,\n address feeRecipient\n )\n internal;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder` in memory and returns the address range.\n /// This range can be passed into `call` or `delegatecall` to invoke an external\n /// call to `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return calldataBegin Memory address of ABI encoded calldata.\n /// @return calldataLength Lenfgth of ABI encoded calldata.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(\n fillOrderCalldata,\n sub(dataAreaEnd, add(fillOrderCalldata, 0x20))\n )\n }\n\n return fillOrderCalldata;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 public constant EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encode(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n address(this)\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32)\n {\n return keccak256(abi.encodePacked(EIP191_HEADER, EIP712_DOMAIN_HASH, hashStruct));\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibMath.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encode(\n // order.makerAddress,\n // order.takerAddress,\n // order.feeRecipientAddress,\n // order.senderAddress,\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Backup\n // solhint-disable-next-line space-after-comma\n let temp1 := mload(sub(order, 32))\n let temp2 := mload(add(order, 320))\n let temp3 := mload(add(order, 352))\n \n // Hash in place\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), schemaHash)\n mstore(add(order, 320), makerAssetDataHash)\n mstore(add(order, 352), takerAssetDataHash)\n result := keccak256(sub(order, 32), 416)\n \n // Restore\n // solhint-disable-next-line space-after-comma\n mstore(sub(order, 32), temp1)\n mstore(add(order, 320), temp2)\n mstore(add(order, 352), temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/IERC20Token.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 solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
+ "2.0.0/tokens/EtherToken/IEtherToken.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 solidity 0.4.24;\n\nimport \"../ERC20Token/IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xe6ebacb149f23e7b817663ebd2cf6c5de10e49137acb3aa7089615ec02f87390",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0xb69e673309512a9d726f87304c6984054f87a93b",
+ "links": {},
+ "constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/IValidator.json b/packages/migrations/artifacts/2.0.0-beta-testnet/IValidator.json
new file mode 100644
index 000000000..1a8c45a00
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/IValidator.json
@@ -0,0 +1,80 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IValidator",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n"
+ },
+ "sourceTreeHashHex": "0x560b257f8a4e1420a4586d5ba0c40e74042ef5af0f53aad412951444ea710a7e",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/IWallet.json b/packages/migrations/artifacts/2.0.0-beta-testnet/IWallet.json
new file mode 100644
index 000000000..56ac59331
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/IWallet.json
@@ -0,0 +1,76 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IWallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n"
+ },
+ "sourceTreeHashHex": "0x70b7d3c15ab87e6b4b1011d194282163232dfd88486038e4120d6bf245d58e44",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/WETH9.json b/packages/migrations/artifacts/2.0.0-beta-testnet/WETH9.json
new file mode 100644
index 000000000..e786f092f
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/WETH9.json
@@ -0,0 +1,341 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "WETH9",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "guy",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdraw",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [],
+ "name": "deposit",
+ "outputs": [],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawal",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60c0604052600d60808190527f577261707065642045746865720000000000000000000000000000000000000060a090815261003e91600091906100a3565b506040805180820190915260048082527f57455448000000000000000000000000000000000000000000000000000000006020909201918252610083916001916100a3565b506002805460ff1916601217905534801561009d57600080fd5b5061013e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e457805160ff1916838001178555610111565b82800160010185558215610111579182015b828111156101115782518255916020019190600101906100f6565b5061011d929150610121565b5090565b61013b91905b8082111561011d5760008155600101610127565b90565b6107688061014d6000396000f3006080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100b8578063095ea7b31461014257806318160ddd1461018757806323b872dd146101ae5780632e1a7d4d146101e5578063313ce567146101fd57806370a082311461022857806395d89b4114610256578063a9059cbb1461026b578063d0e30db0146100ae578063dd62ed3e1461029c575b6100b66102d0565b005b3480156100c457600080fd5b506100cd61031f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101075781810151838201526020016100ef565b50505050905090810190601f1680156101345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014e57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff600435166024356103cb565b604080519115158252519081900360200190f35b34801561019357600080fd5b5061019c61043e565b60408051918252519081900360200190f35b3480156101ba57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610443565b3480156101f157600080fd5b506100b66004356105e3565b34801561020957600080fd5b50610212610678565b6040805160ff9092168252519081900360200190f35b34801561023457600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff60043516610681565b34801561026257600080fd5b506100cd610693565b34801561027757600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff6004351660243561070b565b3480156102a857600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff6004358116906024351661071f565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b820191906000526020600020905b8154815290600101906020018083116103a657829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b303190565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561047557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104eb575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105655773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561052d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b336000908152600360205260409020548111156105ff57600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f1935050505015801561063e573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b6000610718338484610443565b9392505050565b6004602090815260009283526040808420909152908252902054815600a165627a7a72305820228981f11f47ad9630080069b0a81423fcfba5aa8e0f478a579c4bc080ba7e820029",
+ "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE PUSH1 0xD PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH32 0x5772617070656420457468657200000000000000000000000000000000000000 PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH2 0x3E SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH2 0xA3 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x5745544800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 DUP3 MSTORE PUSH2 0x83 SWAP2 PUSH1 0x1 SWAP2 PUSH2 0xA3 JUMP JUMPDEST POP PUSH1 0x2 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13E JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xE4 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x111 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x111 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x111 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xF6 JUMP JUMPDEST POP PUSH2 0x11D SWAP3 SWAP2 POP PUSH2 0x121 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x13B SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x11D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x127 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x768 DUP1 PUSH2 0x14D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xB8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x29C JUMPI JUMPDEST PUSH2 0xB6 PUSH2 0x2D0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x31F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x107 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x134 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH2 0x43E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH1 0x4 CALLDATALOAD PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x678 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x70B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x71F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD CALLVALUE SWAP1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x4EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ ISZERO JUMPDEST ISZERO PUSH2 0x565 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 GT ISZERO PUSH2 0x5FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 SWAP1 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x63E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 DUP5 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x718 CALLER DUP5 DUP5 PUSH2 0x443 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x22 DUP10 DUP2 CALL 0x1f 0x47 0xad SWAP7 ADDRESS ADDMOD STOP PUSH10 0xB0A81423FCFBA5AA8E0F 0x47 DUP11 JUMPI SWAP13 0x4b 0xc0 DUP1 0xba PUSH31 0x82002900000000000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "753:40:0:-;732:1806;753:40;;732:1806;753:40;;;;;;;;;;-1:-1:-1;;753:40:0;;:::i;:::-;-1:-1:-1;799:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;836:27:0;;;-1:-1:-1;;836:27:0;861:2;836:27;;;732:1806;5:2:-1;;;;30:1;27;20:12;5:2;732:1806:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;732:1806:0;;;-1:-1:-1;732:1806:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100b8578063095ea7b31461014257806318160ddd1461018757806323b872dd146101ae5780632e1a7d4d146101e5578063313ce567146101fd57806370a082311461022857806395d89b4114610256578063a9059cbb1461026b578063d0e30db0146100ae578063dd62ed3e1461029c575b6100b66102d0565b005b3480156100c457600080fd5b506100cd61031f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101075781810151838201526020016100ef565b50505050905090810190601f1680156101345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014e57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff600435166024356103cb565b604080519115158252519081900360200190f35b34801561019357600080fd5b5061019c61043e565b60408051918252519081900360200190f35b3480156101ba57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610443565b3480156101f157600080fd5b506100b66004356105e3565b34801561020957600080fd5b50610212610678565b6040805160ff9092168252519081900360200190f35b34801561023457600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff60043516610681565b34801561026257600080fd5b506100cd610693565b34801561027757600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff6004351660243561070b565b3480156102a857600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff6004358116906024351661071f565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b820191906000526020600020905b8154815290600101906020018083116103a657829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b303190565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561047557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104eb575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105655773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561052d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b336000908152600360205260409020548111156105ff57600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f1935050505015801561063e573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b6000610718338484610443565b9392505050565b6004602090815260009283526040808420909152908252902054815600a165627a7a72305820228981f11f47ad9630080069b0a81423fcfba5aa8e0f478a579c4bc080ba7e820029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xB8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x29C JUMPI JUMPDEST PUSH2 0xB6 PUSH2 0x2D0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x31F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x107 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x134 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH2 0x43E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH1 0x4 CALLDATALOAD PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x678 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x70B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x71F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD CALLVALUE SWAP1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x4EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ ISZERO JUMPDEST ISZERO PUSH2 0x565 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 GT ISZERO PUSH2 0x5FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 SWAP1 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x63E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 DUP5 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x718 CALLER DUP5 DUP5 PUSH2 0x443 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x22 DUP10 DUP2 CALL 0x1f 0x47 0xad SWAP7 ADDRESS ADDMOD STOP PUSH10 0xB0A81423FCFBA5AA8E0F 0x47 DUP11 JUMPI SWAP13 0x4b 0xc0 DUP1 0xba PUSH31 0x82002900000000000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "732:1806:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1329:9;:7;:9::i;:::-;732:1806;753:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;753:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;753:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1776:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1776:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1684:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1684:86:0;;;;;;;;;;;;;;;;;;;;2081:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2081:455:0;;;;;;;;;;;;;;1480:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1480:198:0;;;;;836:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;836:27:0;;;;;;;;;;;;;;;;;;;;;;;1150:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1150:65:0;;;;;;;799:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;799:31:0;;;;1954:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1954:121:0;;;;;;;;;1221:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1221:65:0;;;;;;;;;;;;1350:125;1404:10;1394:21;;;;:9;:21;;;;;;;;;:34;;1419:9;1394:34;;;;;;1438:30;;;;;;;;;;;;;;;;;1350:125::o;753:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1776:172::-;1858:10;1832:4;1848:21;;;:9;:21;;;;;;;;;:26;;;;;;;;;;;:32;;;1890:30;;;;;;;1832:4;;1848:26;;1858:10;;1890:30;;;;;;;;-1:-1:-1;1937:4:0;1776:172;;;;:::o;1684:86::-;1751:4;:12;1684:86;:::o;2081:455::-;2199:14;;;2171:4;2199:14;;;:9;:14;;;;;;:21;-1:-1:-1;2199:21:0;2191:30;;;;;;2236:17;;;2243:10;2236:17;;;;:59;;-1:-1:-1;2257:14:0;;;;;;;:9;:14;;;;;;;;2272:10;2257:26;;;;;;;;2292:2;2257:38;;2236:59;2232:179;;;2319:14;;;;;;;:9;:14;;;;;;;;2334:10;2319:26;;;;;;;;:33;-1:-1:-1;2319:33:0;2311:42;;;;;;2367:14;;;;;;;:9;:14;;;;;;;;2382:10;2367:26;;;;;;;:33;;;;;;;2232:179;2421:14;;;;;;;;:9;:14;;;;;;;;:21;;;;;;;2452:14;;;;;;;;;;:21;;;;;;2484:23;;;;;;;2452:14;;2484:23;;;;;;;;;;;-1:-1:-1;2525:4:0;2081:455;;;;;:::o;1480:198::-;1543:10;1533:21;;;;:9;:21;;;;;;:28;-1:-1:-1;1533:28:0;1525:37;;;;;;1582:10;1572:21;;;;:9;:21;;;;;;:28;;;;;;;1610:24;;;;;;1597:3;;1610:24;;1572:21;1610:24;1597:3;1582:10;1610:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;1644:27:0;;;;;;;;1655:10;;1644:27;;;;;;;;;;1480:198;:::o;836:27::-;;;;;;:::o;1150:65::-;;;;;;;;;;;;;:::o;799:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1954:121;2011:4;2034:34;2047:10;2059:3;2064;2034:12;:34::i;:::-;2027:41;1954:121;-1:-1:-1;;;1954:121:0:o;1221:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/tokens/EtherToken/WETH9.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/tokens/EtherToken/WETH9.sol": "// Copyright (C) 2015, 2016, 2017 Dapphub\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n// solhint-disable\npragma solidity ^0.4.18;\n\n\ncontract WETH9 {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Deposit(address indexed _owner, uint _value);\n event Withdrawal(address indexed _owner, uint _value);\n\n mapping (address => uint) public balanceOf;\n mapping (address => mapping (address => uint)) public allowance;\n\n function() public payable {\n deposit();\n }\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n Deposit(msg.sender, msg.value);\n }\n function withdraw(uint wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n msg.sender.transfer(wad);\n Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint) {\n return this.balance;\n }\n\n function approve(address guy, uint wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint wad)\n public\n returns (bool)\n {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n Transfer(src, dst, wad);\n\n return true;\n }\n}\n\n\n/*\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n Preamble\n\n The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users. We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors. You can apply it to\nyour programs, too.\n\n When we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights. Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received. You must make sure that they, too, receive\nor can get the source code. And you must show them these terms so they\nknow their rights.\n\n Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software. For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so. This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software. The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts. If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary. To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n The precise terms and conditions for copying, distribution and\nmodification follow.\n\n TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n The Corresponding Source for a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n Conveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n 5. Conveying Modified Source Versions.\n\n You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n\n b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n\n c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n\n d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\n A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n\n b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n\n c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n\n d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n\n e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\n A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n 7. Additional Terms.\n\n \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n\n b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n\n d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n\n e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n\n f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors.\n\n All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n You are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n 10. Automatic Licensing of Downstream Recipients.\n\n Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\n An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\n A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n 14. Revised Versions of this License.\n\n The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time. Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n Later license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n END OF TERMS AND CONDITIONS\n\n How to Apply These Terms to Your New Programs\n\n If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n To do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n <one line to give the program's name and a brief idea of what it does.>\n Copyright (C) <year> <name of author>\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n <program> Copyright (C) <year> <name of author>\n This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n This is free software, and you are welcome to redistribute it\n under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License. Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n The GNU General Public License does not permit incorporating your program\ninto proprietary programs. If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library. If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License. But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n*/\n"
+ },
+ "sourceTreeHashHex": "0x08a4125fbc1137215308db8e8f4c0774b2adbec12342172c17216bcaa6e596c6",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0xd0a1e359811322d97991e03f863a0c30c2cf029c",
+ "links": {},
+ "constructorArgs": "[]"
+ },
+ "50": {
+ "address": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0-beta-testnet/ZRXToken.json b/packages/migrations/artifacts/2.0.0-beta-testnet/ZRXToken.json
new file mode 100644
index 000000000..3142e379b
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0-beta-testnet/ZRXToken.json
@@ -0,0 +1,10036 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ZRXToken",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "devdoc": {
+ "methods": {
+ "transferFrom(address,address,uint256)": {
+ "details": "ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.",
+ "params": {
+ "_from": "Address to transfer from.",
+ "_to": "Address to transfer to.",
+ "_value": "Amount to transfer."
+ },
+ "return": "Success of transfer."
+ }
+ }
+ },
+ "evm": {
+ "assembly": " /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":958:964 10**27 */\n 0x33b2e3c9fd0803ce8000000\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n 0x3\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\n jumpi(tag_1, iszero(callvalue))\n invalid\ntag_1:\ntag_2:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1222:1233 totalSupply */\n sload(0x3)\n sub(exp(0x2, 0xa0), 0x1)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1208:1218 msg.sender */\n caller\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n and\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1207 balances */\n 0x0\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1233 balances[msg.sender] = totalSupply */\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\ntag_3:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\ntag_4:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, iszero(calldatasize))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x6fdde03\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0x95ea7b3\n eq\n tag_3\n jumpi\n dup1\n 0x18160ddd\n eq\n tag_4\n jumpi\n dup1\n 0x23b872dd\n eq\n tag_5\n jumpi\n dup1\n 0x313ce567\n eq\n tag_6\n jumpi\n dup1\n 0x70a08231\n eq\n tag_7\n jumpi\n dup1\n 0x95d89b41\n eq\n tag_8\n jumpi\n dup1\n 0xa9059cbb\n eq\n tag_9\n jumpi\n dup1\n 0xdd62ed3e\n eq\n tag_10\n jumpi\n tag_1:\n invalid\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_2:\n jumpi(tag_11, iszero(callvalue))\n invalid\n tag_11:\n tag_12\n jump(tag_13)\n tag_12:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_15:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_14:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_16:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_3:\n jumpi(tag_17, iszero(callvalue))\n invalid\n tag_17:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_19)\n tag_18:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_4:\n jumpi(tag_20, iszero(callvalue))\n invalid\n tag_20:\n tag_21\n jump(tag_22)\n tag_21:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_5:\n jumpi(tag_23, iszero(callvalue))\n invalid\n tag_23:\n tag_18\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n calldataload(0x44)\n jump(tag_25)\n tag_24:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_6:\n jumpi(tag_26, iszero(callvalue))\n invalid\n tag_26:\n tag_27\n jump(tag_28)\n tag_27:\n 0x40\n dup1\n mload\n 0xff\n swap1\n swap3\n and\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_7:\n jumpi(tag_29, iszero(callvalue))\n invalid\n tag_29:\n tag_21\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_31)\n tag_30:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_8:\n jumpi(tag_32, iszero(callvalue))\n invalid\n tag_32:\n tag_12\n jump(tag_34)\n tag_33:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_36:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_35:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_37:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_9:\n jumpi(tag_38, iszero(callvalue))\n invalid\n tag_38:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_40)\n tag_39:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_10:\n jumpi(tag_41, iszero(callvalue))\n invalid\n tag_41:\n tag_21\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n jump(tag_43)\n tag_42:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_13:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x11\n dup2\n mstore\n 0x30782050726f746f636f6c20546f6b656e000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_19:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1168:1178 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1167 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap5\n dup8\n and\n dup1\n dup5\n mstore\n swap5\n dup3\n mstore\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1198 */\n dup7\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n dup1\n mload\n dup7\n dup2\n mstore\n swap1\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n swap3\n swap5\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n swap3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\n swap3\n swap2\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1263:1267 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_44:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_22:\n sload(0x3)\n dup2\n jump\t// out\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_25:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1161:1165 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n dup2\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1205 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1213:1223 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1224 */\n swap1\n swap6\n and\n dup4\n mstore\n swap4\n dup2\n mstore\n dup4\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1253 */\n swap3\n dup3\n mstore\n dup2\n swap1\n mstore\n swap2\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1263 */\n dup4\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1292:1298 */\n dup3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1288 */\n dup2\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1298 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n dup1\n iszero\n tag_47\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1348 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1336 */\n dup4\n dup2\n add\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1353 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n tag_47:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n iszero\n tag_48\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup6\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1386 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup1\n dup3\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1401 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1430 */\n swap2\n dup8\n and\n dup2\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1440 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":768:778 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1458:1478 */\n dup2\n lt\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n iszero\n tag_49\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup7\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1505 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1513:1523 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1524 */\n swap1\n swap5\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1534 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n tag_49:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1578:1581 */\n dup4\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1571:1576 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1583:1589 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n mload(0x40)\n dup1\n dup3\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1611:1615 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1604:1615 */\n swap2\n pop\n jump(tag_50)\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_48:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1653:1658 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1646:1658 */\n swap2\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_50:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_45:\n pop\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_28:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":924:926 18 */\n 0x12\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_31:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1035:1039 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_51:\n swap2\n swap1\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_34:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x3\n dup2\n mstore\n 0x5a52580000000000000000000000000000000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_40:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":276:286 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":178:182 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup2\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:297 */\n dup3\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53\n jumpi\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:335 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:323 */\n dup3\n dup2\n add\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:340 */\n lt\n iszero\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n iszero\n tag_54\n jumpi\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":365:375 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:364 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n dup2\n mstore\n 0x20\n dup2\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:386 */\n dup1\n sload\n dup9\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap4\n dup8\n and\n dup1\n dup4\n mstore\n swap2\n dup5\n swap1\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:423 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n dup4\n mload\n dup7\n dup2\n mstore\n swap4\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap2\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n swap3\n swap1\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":491:495 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":484:495 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_54:\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":521:526 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":514:526 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_55:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_52:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_43:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1351:1355 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n swap1\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1381 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1399 */\n swap4\n dup6\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_56:\n swap3\n swap2\n pop\n pop\n jump\t// out\n}\n",
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60606040526b033b2e3c9fd0803ce8000000600355341561001c57fe5b5b600354600160a060020a0333166000908152602081905260409020555b5b61078d8061004a6000396000f300606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH12 0x33B2E3C9FD0803CE8000000 PUSH1 0x3 SSTORE CALLVALUE ISZERO PUSH2 0x1C JUMPI INVALID JUMPDEST JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SSTORE JUMPDEST JUMPDEST PUSH2 0x78D DUP1 PUSH2 0x4A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;958:6;932:32;;1150:90;;;;;;;1222:11;;-1:-1:-1;;;;;1208:10:3;1199:20;:8;:20;;;;;;;;;;:34;1150:90;795:447;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1087:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;932:32:3;;;;;;;;;;;;;;;;;;;;;;;;;;1066:609:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;891:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;982:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1064:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1280:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49:3;;;;;;;;;;;;;;;;;;;:::o;1087:187:0:-;1160:19;1168:10;1160:19;;1144:4;1160:19;;;:7;:19;;;;;;;;:29;;;;;;;;;;;;:38;;;1208;;;;;;;1144:4;;1160:29;:19;1208:38;;;;;;;;;;;-1:-1:-1;1263:4:0;1087:187;;;;;:::o;932:32:3:-;;;;:::o;1066:609:2:-;1198:14;;;;1161:4;1198:14;;;:7;:14;;;;;;;;1213:10;1198:26;;;;;;;;;;;;1238:15;;;;;;;;;;:25;;;;;;:60;;;1292:6;1279:9;:19;;1238:60;:115;;;;-1:-1:-1;1340:13:2;;;:8;:13;;;;;;;;;;;1314:22;;;:39;;1238:115;1234:435;;;1378:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1415:15;;;;;;:25;;;;;;;768:10;1458:20;;1454:95;;;1498:14;;;;;;;;:7;:14;;;;;;;;1513:10;1498:26;;;;;;;;;:36;;;;;;;1454:95;1578:3;1562:28;;1571:5;1562:28;;;1583:6;1562:28;;;;;;;;;;;;;;;;;;1611:4;1604:11;;;;1234:435;1653:5;1646:12;;1234:435;1066:609;;;;;;;:::o;891:35:3:-;924:2;891:35;:::o;982:99:0:-;1058:16;;;1035:4;1058:16;;;;;;;;;;;982:99;;;;:::o;1064:37:3:-;;;;;;;;;;;;;;;;;;;:::o;125:410:0:-;267:20;276:10;267:20;178:4;267:20;;;;;;;;;;;:30;;;;;;:73;;-1:-1:-1;327:13:0;;;:8;:13;;;;;;;;;;;301:22;;;:39;;267:73;263:266;;;356:20;365:10;356:20;;:8;:20;;;;;;;;;;;:30;;;;;;;400:13;;;;;;;;;;:23;;;;;;437:33;;;;;;;400:13;;437:33;;;;;;;;;;;-1:-1:-1;491:4:0;484:11;;263:266;-1:-1:-1;521:5:0;514:12;;263:266;125:410;;;;;:::o;1280:126::-;1374:15;;;;1351:4;1374:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;1280:126;;;;;:::o"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "386600",
+ "executionCost": "40780",
+ "totalCost": "427380"
+ },
+ "external": {
+ "allowance(address,address)": "737",
+ "approve(address,uint256)": "22218",
+ "balanceOf(address)": "579",
+ "decimals()": "270",
+ "name()": "530",
+ "symbol()": "662",
+ "totalSupply()": "417",
+ "transfer(address,uint256)": "43393",
+ "transferFrom(address,address,uint256)": "64116"
+ }
+ },
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 958,
+ "end": 964,
+ "name": "PUSH",
+ "value": "33B2E3C9FD0803CE8000000"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1218,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "AND"
+ },
+ {
+ "begin": 1199,
+ "end": 1207,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1199,
+ "end": 1233,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "100000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DIV"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "AND"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "6FDDE03"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95EA7B3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "18160DDD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "23B872DD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "313CE567"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "70A08231"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95D89B41"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "A9059CBB"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "DD62ED3E"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "AND"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SUB"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ADD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "RETURN"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "INVALID"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SUB"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ADD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SUB"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ADD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "RETURN"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "INVALID"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "AND"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SUB"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ADD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "RETURN"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "INVALID"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "AND"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP3"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SUB"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ADD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "INVALID"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "AND"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SUB"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ADD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SUB"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ADD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "30782050726F746F636F6C20546F6B656E000000000000000000000000000000"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1168,
+ "end": 1178,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "AND"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1167,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "AND"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "PUSH",
+ "value": "8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "ADD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1263,
+ "end": 1267,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "AND"
+ },
+ {
+ "begin": 1161,
+ "end": 1165,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1205,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1213,
+ "end": 1223,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "AND"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "LT"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "POP"
+ },
+ {
+ "begin": 1292,
+ "end": 1298,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1279,
+ "end": 1288,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "LT"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "AND"
+ },
+ {
+ "begin": 1340,
+ "end": 1348,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "ADD"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "LT"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "AND"
+ },
+ {
+ "begin": 1378,
+ "end": 1386,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "ADD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "AND"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SUB"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 768,
+ "end": 778,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "LT"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "PUSH [tag]",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1505,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1513,
+ "end": 1523,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SUB"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1578,
+ "end": 1581,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1571,
+ "end": 1576,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 1583,
+ "end": 1589,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "ADD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SUB"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1611,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "POP"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1653,
+ "end": 1658,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "POP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 924,
+ "end": 926,
+ "name": "PUSH",
+ "value": "12"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "AND"
+ },
+ {
+ "begin": 1035,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "POP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "5A52580000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 276,
+ "end": 286,
+ "name": "CALLER"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "AND"
+ },
+ {
+ "begin": 178,
+ "end": 182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SHA3"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP3"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "LT"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP4"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "AND"
+ },
+ {
+ "begin": 327,
+ "end": 335,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SHA3"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP3"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "ADD"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "LT"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 365,
+ "end": 375,
+ "name": "CALLER"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "AND"
+ },
+ {
+ "begin": 356,
+ "end": 364,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP4"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "SHA3"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP9"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SUB"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "AND"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP5"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SHA3"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "ADD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP7"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SUB"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "ADD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 491,
+ "end": 495,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 521,
+ "end": 526,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "AND"
+ },
+ {
+ "begin": 1351,
+ "end": 1355,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1381,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "AND"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "methodIdentifiers": {
+ "allowance(address,address)": "dd62ed3e",
+ "approve(address,uint256)": "095ea7b3",
+ "balanceOf(address)": "70a08231",
+ "decimals()": "313ce567",
+ "name()": "06fdde03",
+ "symbol()": "95d89b41",
+ "totalSupply()": "18160ddd",
+ "transfer(address,uint256)": "a9059cbb",
+ "transferFrom(address,address,uint256)": "23b872dd"
+ }
+ },
+ "metadata": "{\"compiler\":{\"version\":\"0.4.11+commit.68ef5810\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"transferFrom(address,address,uint256)\":{\"details\":\"ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\",\"params\":{\"_from\":\"Address to transfer from.\",\"_to\":\"Address to transfer to.\",\"_value\":\"Amount to transfer.\"},\"return\":\"Success of transfer.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":\"ZRXToken\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"1.0.0/ERC20Token/ERC20Token_v1.sol\":{\"keccak256\":\"0x3d710b436c430d6fe49f64b091555405360d76da6454b93faa8e213eea34a96d\",\"urls\":[\"bzzr://d12710a563415ad98ff28ecb3aab0b68467b3d023e7c130c73ed9918ef86158e\"]},\"1.0.0/Token/Token_v1.sol\":{\"keccak256\":\"0x35a82bc7bc0994caa97f8ea44660b9b5e796acfe72705b5ff7ed8f2a3c47ff37\",\"urls\":[\"bzzr://a62ae857a4cf2e8948e36d02470c612ac1a5ac20ebe1c1b553ad1ed8becb634e\"]},\"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":{\"keccak256\":\"0x2e1f4b899081cedd8940a9cd0f0f7413264c883312ed0ba9c53885766fe0a1a5\",\"urls\":[\"bzzr://47c42a58e56ffe81e49c8aabd3c391f5fa807fea299b3a2178501e3669baeb52\"]},\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":{\"keccak256\":\"0x9eeb623d48909b083c77688b13b610811c53e37622b3fcbaa23c01873230f5d6\",\"urls\":[\"bzzr://84f3b5c2653068092771d443281018ff2ee0543817426d0fb6f9037a3570e37f\"]}},\"version\":1}",
+ "userdoc": {
+ "methods": {}
+ }
+ },
+ "sources": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": {
+ "id": 0,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 126,
+ "name": "PragmaDirective",
+ "src": "0:24:0"
+ },
+ {
+ "attributes": {
+ "file": "../Token/Token_v1.sol"
+ },
+ "id": 128,
+ "name": "ImportDirective",
+ "src": "26:58:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 322,
+ 397
+ ],
+ "name": "ERC20Token_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "Token"
+ },
+ "id": 129,
+ "name": "UserDefinedTypeName",
+ "src": "112:5:0"
+ }
+ ],
+ "id": 130,
+ "name": "InheritanceSpecifier",
+ "src": "112:5:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 131,
+ "name": "ElementaryTypeName",
+ "src": "143:7:0"
+ }
+ ],
+ "id": 132,
+ "name": "VariableDeclaration",
+ "src": "143:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 133,
+ "name": "ElementaryTypeName",
+ "src": "156:4:0"
+ }
+ ],
+ "id": 134,
+ "name": "VariableDeclaration",
+ "src": "156:11:0"
+ }
+ ],
+ "id": 135,
+ "name": "ParameterList",
+ "src": "142:26:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 136,
+ "name": "ElementaryTypeName",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 137,
+ "name": "VariableDeclaration",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 138,
+ "name": "ParameterList",
+ "src": "177:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 139,
+ "name": "Identifier",
+ "src": "267:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 140,
+ "name": "Identifier",
+ "src": "276:3:0"
+ }
+ ],
+ "id": 141,
+ "name": "MemberAccess",
+ "src": "276:10:0"
+ }
+ ],
+ "id": 142,
+ "name": "IndexAccess",
+ "src": "267:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 143,
+ "name": "Identifier",
+ "src": "291:6:0"
+ }
+ ],
+ "id": 144,
+ "name": "BinaryOperation",
+ "src": "267:30:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "301:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "310:3:0"
+ }
+ ],
+ "id": 147,
+ "name": "IndexAccess",
+ "src": "301:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 148,
+ "name": "Identifier",
+ "src": "317:6:0"
+ }
+ ],
+ "id": 149,
+ "name": "BinaryOperation",
+ "src": "301:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 150,
+ "name": "Identifier",
+ "src": "327:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 151,
+ "name": "Identifier",
+ "src": "336:3:0"
+ }
+ ],
+ "id": 152,
+ "name": "IndexAccess",
+ "src": "327:13:0"
+ }
+ ],
+ "id": 153,
+ "name": "BinaryOperation",
+ "src": "301:39:0"
+ }
+ ],
+ "id": 154,
+ "name": "BinaryOperation",
+ "src": "267:73:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "356:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "365:3:0"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "365:10:0"
+ }
+ ],
+ "id": 158,
+ "name": "IndexAccess",
+ "src": "356:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "380:6:0"
+ }
+ ],
+ "id": 160,
+ "name": "Assignment",
+ "src": "356:30:0"
+ }
+ ],
+ "id": 161,
+ "name": "ExpressionStatement",
+ "src": "356:30:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 162,
+ "name": "Identifier",
+ "src": "400:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 163,
+ "name": "Identifier",
+ "src": "409:3:0"
+ }
+ ],
+ "id": 164,
+ "name": "IndexAccess",
+ "src": "400:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 165,
+ "name": "Identifier",
+ "src": "417:6:0"
+ }
+ ],
+ "id": 166,
+ "name": "Assignment",
+ "src": "400:23:0"
+ }
+ ],
+ "id": 167,
+ "name": "ExpressionStatement",
+ "src": "400:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 168,
+ "name": "Identifier",
+ "src": "437:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 169,
+ "name": "Identifier",
+ "src": "446:3:0"
+ }
+ ],
+ "id": 170,
+ "name": "MemberAccess",
+ "src": "446:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 171,
+ "name": "Identifier",
+ "src": "458:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 172,
+ "name": "Identifier",
+ "src": "463:6:0"
+ }
+ ],
+ "id": 173,
+ "name": "FunctionCall",
+ "src": "437:33:0"
+ }
+ ],
+ "id": 174,
+ "name": "ExpressionStatement",
+ "src": "437:33:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 175,
+ "name": "Literal",
+ "src": "491:4:0"
+ }
+ ],
+ "id": 176,
+ "name": "Return",
+ "src": "484:11:0"
+ }
+ ],
+ "id": 177,
+ "name": "Block",
+ "src": "342:164:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 178,
+ "name": "Literal",
+ "src": "521:5:0"
+ }
+ ],
+ "id": 179,
+ "name": "Return",
+ "src": "514:12:0"
+ }
+ ],
+ "id": 180,
+ "name": "Block",
+ "src": "512:17:0"
+ }
+ ],
+ "id": 181,
+ "name": "IfStatement",
+ "src": "263:266:0"
+ }
+ ],
+ "id": 182,
+ "name": "Block",
+ "src": "184:351:0"
+ }
+ ],
+ "id": 183,
+ "name": "FunctionDefinition",
+ "src": "125:410:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 184,
+ "name": "ElementaryTypeName",
+ "src": "563:7:0"
+ }
+ ],
+ "id": 185,
+ "name": "VariableDeclaration",
+ "src": "563:13:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 186,
+ "name": "ElementaryTypeName",
+ "src": "578:7:0"
+ }
+ ],
+ "id": 187,
+ "name": "VariableDeclaration",
+ "src": "578:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 188,
+ "name": "ElementaryTypeName",
+ "src": "591:4:0"
+ }
+ ],
+ "id": 189,
+ "name": "VariableDeclaration",
+ "src": "591:11:0"
+ }
+ ],
+ "id": 190,
+ "name": "ParameterList",
+ "src": "562:41:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 191,
+ "name": "ElementaryTypeName",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 192,
+ "name": "VariableDeclaration",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 193,
+ "name": "ParameterList",
+ "src": "612:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 194,
+ "name": "Identifier",
+ "src": "633:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 195,
+ "name": "Identifier",
+ "src": "642:5:0"
+ }
+ ],
+ "id": 196,
+ "name": "IndexAccess",
+ "src": "633:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 197,
+ "name": "Identifier",
+ "src": "652:6:0"
+ }
+ ],
+ "id": 198,
+ "name": "BinaryOperation",
+ "src": "633:25:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 199,
+ "name": "Identifier",
+ "src": "662:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 200,
+ "name": "Identifier",
+ "src": "670:5:0"
+ }
+ ],
+ "id": 201,
+ "name": "IndexAccess",
+ "src": "662:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 202,
+ "name": "Identifier",
+ "src": "677:3:0"
+ }
+ ],
+ "id": 203,
+ "name": "MemberAccess",
+ "src": "677:10:0"
+ }
+ ],
+ "id": 204,
+ "name": "IndexAccess",
+ "src": "662:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 205,
+ "name": "Identifier",
+ "src": "692:6:0"
+ }
+ ],
+ "id": 206,
+ "name": "BinaryOperation",
+ "src": "662:36:0"
+ }
+ ],
+ "id": 207,
+ "name": "BinaryOperation",
+ "src": "633:65:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 208,
+ "name": "Identifier",
+ "src": "702:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "711:3:0"
+ }
+ ],
+ "id": 210,
+ "name": "IndexAccess",
+ "src": "702:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 211,
+ "name": "Identifier",
+ "src": "718:6:0"
+ }
+ ],
+ "id": 212,
+ "name": "BinaryOperation",
+ "src": "702:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 213,
+ "name": "Identifier",
+ "src": "728:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 214,
+ "name": "Identifier",
+ "src": "737:3:0"
+ }
+ ],
+ "id": 215,
+ "name": "IndexAccess",
+ "src": "728:13:0"
+ }
+ ],
+ "id": 216,
+ "name": "BinaryOperation",
+ "src": "702:39:0"
+ }
+ ],
+ "id": 217,
+ "name": "BinaryOperation",
+ "src": "633:108:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 218,
+ "name": "Identifier",
+ "src": "757:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 219,
+ "name": "Identifier",
+ "src": "766:3:0"
+ }
+ ],
+ "id": 220,
+ "name": "IndexAccess",
+ "src": "757:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 221,
+ "name": "Identifier",
+ "src": "774:6:0"
+ }
+ ],
+ "id": 222,
+ "name": "Assignment",
+ "src": "757:23:0"
+ }
+ ],
+ "id": 223,
+ "name": "ExpressionStatement",
+ "src": "757:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 224,
+ "name": "Identifier",
+ "src": "794:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 225,
+ "name": "Identifier",
+ "src": "803:5:0"
+ }
+ ],
+ "id": 226,
+ "name": "IndexAccess",
+ "src": "794:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "813:6:0"
+ }
+ ],
+ "id": 228,
+ "name": "Assignment",
+ "src": "794:25:0"
+ }
+ ],
+ "id": 229,
+ "name": "ExpressionStatement",
+ "src": "794:25:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 230,
+ "name": "Identifier",
+ "src": "833:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 231,
+ "name": "Identifier",
+ "src": "841:5:0"
+ }
+ ],
+ "id": 234,
+ "name": "IndexAccess",
+ "src": "833:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 232,
+ "name": "Identifier",
+ "src": "848:3:0"
+ }
+ ],
+ "id": 233,
+ "name": "MemberAccess",
+ "src": "848:10:0"
+ }
+ ],
+ "id": 235,
+ "name": "IndexAccess",
+ "src": "833:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 236,
+ "name": "Identifier",
+ "src": "863:6:0"
+ }
+ ],
+ "id": 237,
+ "name": "Assignment",
+ "src": "833:36:0"
+ }
+ ],
+ "id": 238,
+ "name": "ExpressionStatement",
+ "src": "833:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 239,
+ "name": "Identifier",
+ "src": "883:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "892:5:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 241,
+ "name": "Identifier",
+ "src": "899:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 242,
+ "name": "Identifier",
+ "src": "904:6:0"
+ }
+ ],
+ "id": 243,
+ "name": "FunctionCall",
+ "src": "883:28:0"
+ }
+ ],
+ "id": 244,
+ "name": "ExpressionStatement",
+ "src": "883:28:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 245,
+ "name": "Literal",
+ "src": "932:4:0"
+ }
+ ],
+ "id": 246,
+ "name": "Return",
+ "src": "925:11:0"
+ }
+ ],
+ "id": 247,
+ "name": "Block",
+ "src": "743:204:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 248,
+ "name": "Literal",
+ "src": "962:5:0"
+ }
+ ],
+ "id": 249,
+ "name": "Return",
+ "src": "955:12:0"
+ }
+ ],
+ "id": 250,
+ "name": "Block",
+ "src": "953:17:0"
+ }
+ ],
+ "id": 251,
+ "name": "IfStatement",
+ "src": "629:341:0"
+ }
+ ],
+ "id": 252,
+ "name": "Block",
+ "src": "619:357:0"
+ }
+ ],
+ "id": 253,
+ "name": "FunctionDefinition",
+ "src": "541:435:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 254,
+ "name": "ElementaryTypeName",
+ "src": "1001:7:0"
+ }
+ ],
+ "id": 255,
+ "name": "VariableDeclaration",
+ "src": "1001:14:0"
+ }
+ ],
+ "id": 256,
+ "name": "ParameterList",
+ "src": "1000:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 257,
+ "name": "ElementaryTypeName",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 258,
+ "name": "VariableDeclaration",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 259,
+ "name": "ParameterList",
+ "src": "1034:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 260,
+ "name": "Identifier",
+ "src": "1058:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 261,
+ "name": "Identifier",
+ "src": "1067:6:0"
+ }
+ ],
+ "id": 262,
+ "name": "IndexAccess",
+ "src": "1058:16:0"
+ }
+ ],
+ "id": 263,
+ "name": "Return",
+ "src": "1051:23:0"
+ }
+ ],
+ "id": 264,
+ "name": "Block",
+ "src": "1041:40:0"
+ }
+ ],
+ "id": 265,
+ "name": "FunctionDefinition",
+ "src": "982:99:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 266,
+ "name": "ElementaryTypeName",
+ "src": "1104:7:0"
+ }
+ ],
+ "id": 267,
+ "name": "VariableDeclaration",
+ "src": "1104:16:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 268,
+ "name": "ElementaryTypeName",
+ "src": "1122:4:0"
+ }
+ ],
+ "id": 269,
+ "name": "VariableDeclaration",
+ "src": "1122:11:0"
+ }
+ ],
+ "id": 270,
+ "name": "ParameterList",
+ "src": "1103:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 271,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 272,
+ "name": "VariableDeclaration",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 273,
+ "name": "ParameterList",
+ "src": "1143:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 274,
+ "name": "Identifier",
+ "src": "1160:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 275,
+ "name": "Identifier",
+ "src": "1168:3:0"
+ }
+ ],
+ "id": 276,
+ "name": "MemberAccess",
+ "src": "1168:10:0"
+ }
+ ],
+ "id": 278,
+ "name": "IndexAccess",
+ "src": "1160:19:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 277,
+ "name": "Identifier",
+ "src": "1180:8:0"
+ }
+ ],
+ "id": 279,
+ "name": "IndexAccess",
+ "src": "1160:29:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 280,
+ "name": "Identifier",
+ "src": "1192:6:0"
+ }
+ ],
+ "id": 281,
+ "name": "Assignment",
+ "src": "1160:38:0"
+ }
+ ],
+ "id": 282,
+ "name": "ExpressionStatement",
+ "src": "1160:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Approval"
+ },
+ "id": 283,
+ "name": "Identifier",
+ "src": "1208:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 284,
+ "name": "Identifier",
+ "src": "1217:3:0"
+ }
+ ],
+ "id": 285,
+ "name": "MemberAccess",
+ "src": "1217:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 286,
+ "name": "Identifier",
+ "src": "1229:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 287,
+ "name": "Identifier",
+ "src": "1239:6:0"
+ }
+ ],
+ "id": 288,
+ "name": "FunctionCall",
+ "src": "1208:38:0"
+ }
+ ],
+ "id": 289,
+ "name": "ExpressionStatement",
+ "src": "1208:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 290,
+ "name": "Literal",
+ "src": "1263:4:0"
+ }
+ ],
+ "id": 291,
+ "name": "Return",
+ "src": "1256:11:0"
+ }
+ ],
+ "id": 292,
+ "name": "Block",
+ "src": "1150:124:0"
+ }
+ ],
+ "id": 293,
+ "name": "FunctionDefinition",
+ "src": "1087:187:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 294,
+ "name": "ElementaryTypeName",
+ "src": "1299:7:0"
+ }
+ ],
+ "id": 295,
+ "name": "VariableDeclaration",
+ "src": "1299:14:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 296,
+ "name": "ElementaryTypeName",
+ "src": "1315:7:0"
+ }
+ ],
+ "id": 297,
+ "name": "VariableDeclaration",
+ "src": "1315:16:0"
+ }
+ ],
+ "id": 298,
+ "name": "ParameterList",
+ "src": "1298:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 299,
+ "name": "ElementaryTypeName",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 300,
+ "name": "VariableDeclaration",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 301,
+ "name": "ParameterList",
+ "src": "1350:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 302,
+ "name": "Identifier",
+ "src": "1374:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 303,
+ "name": "Identifier",
+ "src": "1382:6:0"
+ }
+ ],
+ "id": 304,
+ "name": "IndexAccess",
+ "src": "1374:15:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 305,
+ "name": "Identifier",
+ "src": "1390:8:0"
+ }
+ ],
+ "id": 306,
+ "name": "IndexAccess",
+ "src": "1374:25:0"
+ }
+ ],
+ "id": 307,
+ "name": "Return",
+ "src": "1367:32:0"
+ }
+ ],
+ "id": 308,
+ "name": "Block",
+ "src": "1357:49:0"
+ }
+ ],
+ "id": 309,
+ "name": "FunctionDefinition",
+ "src": "1280:126:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balances",
+ "storageLocation": "default",
+ "type": "mapping(address => uint256)",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 310,
+ "name": "ElementaryTypeName",
+ "src": "1421:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 311,
+ "name": "ElementaryTypeName",
+ "src": "1432:4:0"
+ }
+ ],
+ "id": 312,
+ "name": "Mapping",
+ "src": "1412:25:0"
+ }
+ ],
+ "id": 313,
+ "name": "VariableDeclaration",
+ "src": "1412:34:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowed",
+ "storageLocation": "default",
+ "type": "mapping(address => mapping(address => uint256))",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 314,
+ "name": "ElementaryTypeName",
+ "src": "1461:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 315,
+ "name": "ElementaryTypeName",
+ "src": "1481:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 316,
+ "name": "ElementaryTypeName",
+ "src": "1492:4:0"
+ }
+ ],
+ "id": 317,
+ "name": "Mapping",
+ "src": "1472:25:0"
+ }
+ ],
+ "id": 318,
+ "name": "Mapping",
+ "src": "1452:46:0"
+ }
+ ],
+ "id": 319,
+ "name": "VariableDeclaration",
+ "src": "1452:54:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 320,
+ "name": "ElementaryTypeName",
+ "src": "1512:4:0"
+ }
+ ],
+ "id": 321,
+ "name": "VariableDeclaration",
+ "src": "1512:23:0"
+ }
+ ],
+ "id": 322,
+ "name": "ContractDefinition",
+ "src": "86:1452:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/Token/Token_v1.sol": {
+ "id": 1,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 324,
+ "name": "PragmaDirective",
+ "src": "0:24:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 397
+ ],
+ "name": "Token_v1"
+ },
+ "children": [
+ {
+ "attributes": {
+ "constant": true,
+ "name": "totalSupply",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 325,
+ "name": "ParameterList",
+ "src": "110:2:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "supply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 326,
+ "name": "ElementaryTypeName",
+ "src": "131:4:1"
+ }
+ ],
+ "id": 327,
+ "name": "VariableDeclaration",
+ "src": "131:11:1"
+ }
+ ],
+ "id": 328,
+ "name": "ParameterList",
+ "src": "130:13:1"
+ },
+ {
+ "children": [],
+ "id": 329,
+ "name": "Block",
+ "src": "144:2:1"
+ }
+ ],
+ "id": 330,
+ "name": "FunctionDefinition",
+ "src": "90:56:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 331,
+ "name": "ElementaryTypeName",
+ "src": "274:7:1"
+ }
+ ],
+ "id": 332,
+ "name": "VariableDeclaration",
+ "src": "274:14:1"
+ }
+ ],
+ "id": 333,
+ "name": "ParameterList",
+ "src": "273:16:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 334,
+ "name": "ElementaryTypeName",
+ "src": "308:4:1"
+ }
+ ],
+ "id": 335,
+ "name": "VariableDeclaration",
+ "src": "308:12:1"
+ }
+ ],
+ "id": 336,
+ "name": "ParameterList",
+ "src": "307:14:1"
+ },
+ {
+ "children": [],
+ "id": 337,
+ "name": "Block",
+ "src": "322:2:1"
+ }
+ ],
+ "id": 338,
+ "name": "FunctionDefinition",
+ "src": "255:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 339,
+ "name": "ElementaryTypeName",
+ "src": "578:7:1"
+ }
+ ],
+ "id": 340,
+ "name": "VariableDeclaration",
+ "src": "578:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 341,
+ "name": "ElementaryTypeName",
+ "src": "591:4:1"
+ }
+ ],
+ "id": 342,
+ "name": "VariableDeclaration",
+ "src": "591:11:1"
+ }
+ ],
+ "id": 343,
+ "name": "ParameterList",
+ "src": "577:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 344,
+ "name": "ElementaryTypeName",
+ "src": "613:4:1"
+ }
+ ],
+ "id": 345,
+ "name": "VariableDeclaration",
+ "src": "613:12:1"
+ }
+ ],
+ "id": 346,
+ "name": "ParameterList",
+ "src": "612:14:1"
+ },
+ {
+ "children": [],
+ "id": 347,
+ "name": "Block",
+ "src": "627:2:1"
+ }
+ ],
+ "id": 348,
+ "name": "FunctionDefinition",
+ "src": "560:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 349,
+ "name": "ElementaryTypeName",
+ "src": "972:7:1"
+ }
+ ],
+ "id": 350,
+ "name": "VariableDeclaration",
+ "src": "972:13:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 351,
+ "name": "ElementaryTypeName",
+ "src": "987:7:1"
+ }
+ ],
+ "id": 352,
+ "name": "VariableDeclaration",
+ "src": "987:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 353,
+ "name": "ElementaryTypeName",
+ "src": "1000:4:1"
+ }
+ ],
+ "id": 354,
+ "name": "VariableDeclaration",
+ "src": "1000:11:1"
+ }
+ ],
+ "id": 355,
+ "name": "ParameterList",
+ "src": "971:41:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 356,
+ "name": "ElementaryTypeName",
+ "src": "1022:4:1"
+ }
+ ],
+ "id": 357,
+ "name": "VariableDeclaration",
+ "src": "1022:12:1"
+ }
+ ],
+ "id": 358,
+ "name": "ParameterList",
+ "src": "1021:14:1"
+ },
+ {
+ "children": [],
+ "id": 359,
+ "name": "Block",
+ "src": "1036:2:1"
+ }
+ ],
+ "id": 360,
+ "name": "FunctionDefinition",
+ "src": "950:88:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 361,
+ "name": "ElementaryTypeName",
+ "src": "1338:7:1"
+ }
+ ],
+ "id": 362,
+ "name": "VariableDeclaration",
+ "src": "1338:16:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 363,
+ "name": "ElementaryTypeName",
+ "src": "1356:4:1"
+ }
+ ],
+ "id": 364,
+ "name": "VariableDeclaration",
+ "src": "1356:11:1"
+ }
+ ],
+ "id": 365,
+ "name": "ParameterList",
+ "src": "1337:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 366,
+ "name": "ElementaryTypeName",
+ "src": "1378:4:1"
+ }
+ ],
+ "id": 367,
+ "name": "VariableDeclaration",
+ "src": "1378:12:1"
+ }
+ ],
+ "id": 368,
+ "name": "ParameterList",
+ "src": "1377:14:1"
+ },
+ {
+ "children": [],
+ "id": 369,
+ "name": "Block",
+ "src": "1392:2:1"
+ }
+ ],
+ "id": 370,
+ "name": "FunctionDefinition",
+ "src": "1321:73:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 371,
+ "name": "ElementaryTypeName",
+ "src": "1621:7:1"
+ }
+ ],
+ "id": 372,
+ "name": "VariableDeclaration",
+ "src": "1621:14:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 373,
+ "name": "ElementaryTypeName",
+ "src": "1637:7:1"
+ }
+ ],
+ "id": 374,
+ "name": "VariableDeclaration",
+ "src": "1637:16:1"
+ }
+ ],
+ "id": 375,
+ "name": "ParameterList",
+ "src": "1620:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "remaining",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 376,
+ "name": "ElementaryTypeName",
+ "src": "1673:4:1"
+ }
+ ],
+ "id": 377,
+ "name": "VariableDeclaration",
+ "src": "1673:14:1"
+ }
+ ],
+ "id": 378,
+ "name": "ParameterList",
+ "src": "1672:16:1"
+ },
+ {
+ "children": [],
+ "id": 379,
+ "name": "Block",
+ "src": "1689:2:1"
+ }
+ ],
+ "id": 380,
+ "name": "FunctionDefinition",
+ "src": "1602:89:1"
+ },
+ {
+ "attributes": {
+ "name": "Transfer"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 381,
+ "name": "ElementaryTypeName",
+ "src": "1712:7:1"
+ }
+ ],
+ "id": 382,
+ "name": "VariableDeclaration",
+ "src": "1712:21:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 383,
+ "name": "ElementaryTypeName",
+ "src": "1735:7:1"
+ }
+ ],
+ "id": 384,
+ "name": "VariableDeclaration",
+ "src": "1735:19:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 385,
+ "name": "ElementaryTypeName",
+ "src": "1756:4:1"
+ }
+ ],
+ "id": 386,
+ "name": "VariableDeclaration",
+ "src": "1756:11:1"
+ }
+ ],
+ "id": 387,
+ "name": "ParameterList",
+ "src": "1711:57:1"
+ }
+ ],
+ "id": 388,
+ "name": "EventDefinition",
+ "src": "1697:72:1"
+ },
+ {
+ "attributes": {
+ "name": "Approval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 389,
+ "name": "ElementaryTypeName",
+ "src": "1789:7:1"
+ }
+ ],
+ "id": 390,
+ "name": "VariableDeclaration",
+ "src": "1789:22:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 391,
+ "name": "ElementaryTypeName",
+ "src": "1813:7:1"
+ }
+ ],
+ "id": 392,
+ "name": "VariableDeclaration",
+ "src": "1813:24:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 393,
+ "name": "ElementaryTypeName",
+ "src": "1839:4:1"
+ }
+ ],
+ "id": 394,
+ "name": "VariableDeclaration",
+ "src": "1839:11:1"
+ }
+ ],
+ "id": 395,
+ "name": "ParameterList",
+ "src": "1788:63:1"
+ }
+ ],
+ "id": 396,
+ "name": "EventDefinition",
+ "src": "1774:78:1"
+ }
+ ],
+ "id": 397,
+ "name": "ContractDefinition",
+ "src": "26:1828:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol": {
+ "id": 2,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 33,
+ "name": "PragmaDirective",
+ "src": "580:24:2"
+ },
+ {
+ "attributes": {
+ "file": "../ERC20Token/ERC20Token_v1.sol"
+ },
+ "id": 35,
+ "name": "ImportDirective",
+ "src": "606:78:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 124,
+ 322,
+ 397
+ ],
+ "name": "UnlimitedAllowanceToken_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ERC20Token"
+ },
+ "id": 36,
+ "name": "UserDefinedTypeName",
+ "src": "725:10:2"
+ }
+ ],
+ "id": 37,
+ "name": "InheritanceSpecifier",
+ "src": "725:10:2"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "MAX_UINT",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 38,
+ "name": "ElementaryTypeName",
+ "src": "743:4:2"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "32",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 2",
+ "value": "2"
+ },
+ "id": 39,
+ "name": "Literal",
+ "src": "768:1:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "323536",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 256",
+ "value": "256"
+ },
+ "id": 40,
+ "name": "Literal",
+ "src": "771:3:2"
+ }
+ ],
+ "id": 41,
+ "name": "BinaryOperation",
+ "src": "768:6:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 42,
+ "name": "Literal",
+ "src": "777:1:2"
+ }
+ ],
+ "id": 43,
+ "name": "BinaryOperation",
+ "src": "768:10:2"
+ }
+ ],
+ "id": 44,
+ "name": "VariableDeclaration",
+ "src": "743:35:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 45,
+ "name": "ElementaryTypeName",
+ "src": "1088:7:2"
+ }
+ ],
+ "id": 46,
+ "name": "VariableDeclaration",
+ "src": "1088:13:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 47,
+ "name": "ElementaryTypeName",
+ "src": "1103:7:2"
+ }
+ ],
+ "id": 48,
+ "name": "VariableDeclaration",
+ "src": "1103:11:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 49,
+ "name": "ElementaryTypeName",
+ "src": "1116:4:2"
+ }
+ ],
+ "id": 50,
+ "name": "VariableDeclaration",
+ "src": "1116:11:2"
+ }
+ ],
+ "id": 51,
+ "name": "ParameterList",
+ "src": "1087:41:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 52,
+ "name": "ElementaryTypeName",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 53,
+ "name": "VariableDeclaration",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 54,
+ "name": "ParameterList",
+ "src": "1160:6:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 55,
+ "name": "ElementaryTypeName",
+ "src": "1181:4:2"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "1181:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 57,
+ "name": "Identifier",
+ "src": "1198:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 58,
+ "name": "Identifier",
+ "src": "1206:5:2"
+ }
+ ],
+ "id": 59,
+ "name": "IndexAccess",
+ "src": "1198:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 60,
+ "name": "Identifier",
+ "src": "1213:3:2"
+ }
+ ],
+ "id": 61,
+ "name": "MemberAccess",
+ "src": "1213:10:2"
+ }
+ ],
+ "id": 62,
+ "name": "IndexAccess",
+ "src": "1198:26:2"
+ }
+ ],
+ "id": 63,
+ "name": "VariableDeclarationStatement",
+ "src": "1181:43:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "1238:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 65,
+ "name": "Identifier",
+ "src": "1247:5:2"
+ }
+ ],
+ "id": 66,
+ "name": "IndexAccess",
+ "src": "1238:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 67,
+ "name": "Identifier",
+ "src": "1257:6:2"
+ }
+ ],
+ "id": 68,
+ "name": "BinaryOperation",
+ "src": "1238:25:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 69,
+ "name": "Identifier",
+ "src": "1279:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 70,
+ "name": "Identifier",
+ "src": "1292:6:2"
+ }
+ ],
+ "id": 71,
+ "name": "BinaryOperation",
+ "src": "1279:19:2"
+ }
+ ],
+ "id": 72,
+ "name": "BinaryOperation",
+ "src": "1238:60:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 73,
+ "name": "Identifier",
+ "src": "1314:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 74,
+ "name": "Identifier",
+ "src": "1323:3:2"
+ }
+ ],
+ "id": 75,
+ "name": "IndexAccess",
+ "src": "1314:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "1330:6:2"
+ }
+ ],
+ "id": 77,
+ "name": "BinaryOperation",
+ "src": "1314:22:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 78,
+ "name": "Identifier",
+ "src": "1340:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 79,
+ "name": "Identifier",
+ "src": "1349:3:2"
+ }
+ ],
+ "id": 80,
+ "name": "IndexAccess",
+ "src": "1340:13:2"
+ }
+ ],
+ "id": 81,
+ "name": "BinaryOperation",
+ "src": "1314:39:2"
+ }
+ ],
+ "id": 82,
+ "name": "BinaryOperation",
+ "src": "1238:115:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 83,
+ "name": "Identifier",
+ "src": "1378:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 84,
+ "name": "Identifier",
+ "src": "1387:3:2"
+ }
+ ],
+ "id": 85,
+ "name": "IndexAccess",
+ "src": "1378:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 86,
+ "name": "Identifier",
+ "src": "1395:6:2"
+ }
+ ],
+ "id": 87,
+ "name": "Assignment",
+ "src": "1378:23:2"
+ }
+ ],
+ "id": 88,
+ "name": "ExpressionStatement",
+ "src": "1378:23:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 89,
+ "name": "Identifier",
+ "src": "1415:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1424:5:2"
+ }
+ ],
+ "id": 91,
+ "name": "IndexAccess",
+ "src": "1415:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 92,
+ "name": "Identifier",
+ "src": "1434:6:2"
+ }
+ ],
+ "id": 93,
+ "name": "Assignment",
+ "src": "1415:25:2"
+ }
+ ],
+ "id": 94,
+ "name": "ExpressionStatement",
+ "src": "1415:25:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 95,
+ "name": "Identifier",
+ "src": "1458:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_UINT"
+ },
+ "id": 96,
+ "name": "Identifier",
+ "src": "1470:8:2"
+ }
+ ],
+ "id": 97,
+ "name": "BinaryOperation",
+ "src": "1458:20:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 98,
+ "name": "Identifier",
+ "src": "1498:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 99,
+ "name": "Identifier",
+ "src": "1506:5:2"
+ }
+ ],
+ "id": 102,
+ "name": "IndexAccess",
+ "src": "1498:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1513:3:2"
+ }
+ ],
+ "id": 101,
+ "name": "MemberAccess",
+ "src": "1513:10:2"
+ }
+ ],
+ "id": 103,
+ "name": "IndexAccess",
+ "src": "1498:26:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 104,
+ "name": "Identifier",
+ "src": "1528:6:2"
+ }
+ ],
+ "id": 105,
+ "name": "Assignment",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 106,
+ "name": "ExpressionStatement",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 107,
+ "name": "Block",
+ "src": "1480:69:2"
+ }
+ ],
+ "id": 108,
+ "name": "IfStatement",
+ "src": "1454:95:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 109,
+ "name": "Identifier",
+ "src": "1562:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 110,
+ "name": "Identifier",
+ "src": "1571:5:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "1578:3:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 112,
+ "name": "Identifier",
+ "src": "1583:6:2"
+ }
+ ],
+ "id": 113,
+ "name": "FunctionCall",
+ "src": "1562:28:2"
+ }
+ ],
+ "id": 114,
+ "name": "ExpressionStatement",
+ "src": "1562:28:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 115,
+ "name": "Literal",
+ "src": "1611:4:2"
+ }
+ ],
+ "id": 116,
+ "name": "Return",
+ "src": "1604:11:2"
+ }
+ ],
+ "id": 117,
+ "name": "Block",
+ "src": "1364:262:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 118,
+ "name": "Literal",
+ "src": "1653:5:2"
+ }
+ ],
+ "id": 119,
+ "name": "Return",
+ "src": "1646:12:2"
+ }
+ ],
+ "id": 120,
+ "name": "Block",
+ "src": "1632:37:2"
+ }
+ ],
+ "id": 121,
+ "name": "IfStatement",
+ "src": "1234:435:2"
+ }
+ ],
+ "id": 122,
+ "name": "Block",
+ "src": "1171:504:2"
+ }
+ ],
+ "id": 123,
+ "name": "FunctionDefinition",
+ "src": "1066:609:2"
+ }
+ ],
+ "id": 124,
+ "name": "ContractDefinition",
+ "src": "686:991:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/tokens/ZRXToken/ZRXToken.sol": {
+ "id": 3,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:3"
+ },
+ {
+ "attributes": {
+ "file": "../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol"
+ },
+ "id": 3,
+ "name": "ImportDirective",
+ "src": "650:142:3"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 31,
+ 124,
+ 322,
+ 397
+ ],
+ "name": "ZRXToken"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "UnlimitedAllowanceToken"
+ },
+ "id": 4,
+ "name": "UserDefinedTypeName",
+ "src": "816:23:3"
+ }
+ ],
+ "id": 5,
+ "name": "InheritanceSpecifier",
+ "src": "816:23:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "decimals",
+ "storageLocation": "default",
+ "type": "uint8",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8"
+ },
+ "id": 6,
+ "name": "ElementaryTypeName",
+ "src": "891:5:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3138",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 18",
+ "value": "18"
+ },
+ "id": 7,
+ "name": "Literal",
+ "src": "924:2:3"
+ }
+ ],
+ "id": 8,
+ "name": "VariableDeclaration",
+ "src": "891:35:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 9,
+ "name": "ElementaryTypeName",
+ "src": "932:4:3"
+ },
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 1000000000000000000000000000"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "3130",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 10",
+ "value": "10"
+ },
+ "id": 10,
+ "name": "Literal",
+ "src": "958:2:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3237",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 27",
+ "value": "27"
+ },
+ "id": 11,
+ "name": "Literal",
+ "src": "962:2:3"
+ }
+ ],
+ "id": 12,
+ "name": "BinaryOperation",
+ "src": "958:6:3"
+ }
+ ],
+ "id": 13,
+ "name": "VariableDeclaration",
+ "src": "932:32:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "name",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 14,
+ "name": "ElementaryTypeName",
+ "src": "1009:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30782050726f746f636f6c20546f6b656e",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"0x Protocol Token\"",
+ "value": "0x Protocol Token"
+ },
+ "id": 15,
+ "name": "Literal",
+ "src": "1039:19:3"
+ }
+ ],
+ "id": 16,
+ "name": "VariableDeclaration",
+ "src": "1009:49:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "symbol",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 17,
+ "name": "ElementaryTypeName",
+ "src": "1064:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "5a5258",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"ZRX\"",
+ "value": "ZRX"
+ },
+ "id": 18,
+ "name": "Literal",
+ "src": "1096:5:3"
+ }
+ ],
+ "id": 19,
+ "name": "VariableDeclaration",
+ "src": "1064:37:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "ZRXToken",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 20,
+ "name": "ParameterList",
+ "src": "1167:2:3"
+ },
+ {
+ "children": [],
+ "id": 21,
+ "name": "ParameterList",
+ "src": "1189:0:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 22,
+ "name": "Identifier",
+ "src": "1199:8:3"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 23,
+ "name": "Identifier",
+ "src": "1208:3:3"
+ }
+ ],
+ "id": 24,
+ "name": "MemberAccess",
+ "src": "1208:10:3"
+ }
+ ],
+ "id": 25,
+ "name": "IndexAccess",
+ "src": "1199:20:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "totalSupply"
+ },
+ "id": 26,
+ "name": "Identifier",
+ "src": "1222:11:3"
+ }
+ ],
+ "id": 27,
+ "name": "Assignment",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 28,
+ "name": "ExpressionStatement",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 29,
+ "name": "Block",
+ "src": "1189:51:3"
+ }
+ ],
+ "id": 30,
+ "name": "FunctionDefinition",
+ "src": "1150:90:3"
+ }
+ ],
+ "id": 31,
+ "name": "ContractDefinition",
+ "src": "795:447:3"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": "pragma solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\n\ncontract ERC20Token_v1 is Token {\n\n function transfer(address _to, uint _value) returns (bool) {\n //Default assumes totalSupply can't be over max (2^256 - 1).\n if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n Transfer(msg.sender, _to, _value);\n return true;\n } else { return false; }\n }\n\n function transferFrom(address _from, address _to, uint _value) returns (bool) {\n if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n Transfer(_from, _to, _value);\n return true;\n } else { return false; }\n }\n\n function balanceOf(address _owner) constant returns (uint) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint _value) returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) constant returns (uint) {\n return allowed[_owner][_spender];\n }\n\n mapping (address => uint) balances;\n mapping (address => mapping (address => uint)) allowed;\n uint public totalSupply;\n}\n",
+ "1.0.0/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.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 solidity ^0.4.11;\n\nimport { ERC20Token_v1 as ERC20Token } from \"../ERC20Token/ERC20Token_v1.sol\";\n\ncontract UnlimitedAllowanceToken_v1 is ERC20Token {\n\n uint constant MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint _value)\n public\n returns (bool)\n {\n uint allowance = allowed[_from][msg.sender];\n if (balances[_from] >= _value\n && allowance >= _value\n && balances[_to] + _value >= balances[_to]\n ) {\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n Transfer(_from, _to, _value);\n return true;\n } else {\n return false;\n }\n }\n}\n",
+ "2.0.0/tokens/ZRXToken/ZRXToken.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 solidity 0.4.11;\n\n// solhint-disable-next-line max-line-length\nimport { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from \"../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\";\n\n\ncontract ZRXToken is UnlimitedAllowanceToken {\n\n // solhint-disable const-name-snakecase\n uint8 constant public decimals = 18;\n uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places\n string constant public name = \"0x Protocol Token\";\n string constant public symbol = \"ZRX\";\n // solhint-enableconst-name-snakecase\n\n function ZRXToken()\n public\n {\n balances[msg.sender] = totalSupply;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xbcce67d129fe53ddb9717b4f567b33108c41a4f4324aa47ac609037e41f5b95d",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.11+commit.68ef5810.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "42": {
+ "address": "0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570",
+ "links": {},
+ "constructorArgs": "[]"
+ },
+ "50": {
+ "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/AssetProxyOwner.json b/packages/migrations/artifacts/2.0.0/AssetProxyOwner.json
new file mode 100644
index 000000000..80751855b
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/AssetProxyOwner.json
@@ -0,0 +1,44478 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "AssetProxyOwner",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isAssetProxyRegistered",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_assetProxyContracts",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "AssetProxyRegistration",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.4.10+commit.f0d539ae\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeRemoveAuthorizedAddressAtIndex\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsTimeLocked\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"registerAssetProxy\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"changeTimeLock\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAssetProxyRegistered\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"confirmationTimes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_assetProxyContracts\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"},{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"AssetProxyRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"confirmationTime\",\"type\":\"uint256\"}],\"name\":\"ConfirmationTimeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"TimeLockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"addOwner(address)\":{\"details\":\"Allows to add a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"changeRequirement(uint256)\":{\"details\":\"Allows to change the number of required confirmations. Transaction has to be sent by wallet.\",\"params\":{\"_required\":\"Number of required confirmations.\"}},\"changeTimeLock(uint256)\":{\"details\":\"Changes the duration of the time lock for transactions.\",\"params\":{\"_secondsTimeLocked\":\"Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\"}},\"confirmTransaction(uint256)\":{\"details\":\"Allows an owner to confirm a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeRemoveAuthorizedAddressAtIndex(uint256)\":{\"details\":\"Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeTransaction(uint256)\":{\"details\":\"Allows anyone to execute a confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"getConfirmationCount(uint256)\":{\"details\":\"Returns number of confirmations of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Number of confirmations.\"},\"getConfirmations(uint256)\":{\"details\":\"Returns array with owner addresses, which confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Returns array of owner addresses.\"},\"getOwners()\":{\"details\":\"Returns list of owners.\",\"return\":\"List of owner addresses.\"},\"getTransactionCount(bool,bool)\":{\"details\":\"Returns total number of transactions after filers are applied.\",\"params\":{\"executed\":\"Include executed transactions.\",\"pending\":\"Include pending transactions.\"},\"return\":\"Total number of transactions after filters are applied.\"},\"getTransactionIds(uint256,uint256,bool,bool)\":{\"details\":\"Returns list of transaction IDs in defined range.\",\"params\":{\"executed\":\"Include executed transactions.\",\"from\":\"Index start position of transaction array.\",\"pending\":\"Include pending transactions.\",\"to\":\"Index end position of transaction array.\"},\"return\":\"Returns array of transaction IDs.\"},\"isConfirmed(uint256)\":{\"details\":\"Returns the confirmation status of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Confirmation status.\"},\"registerAssetProxy(address,bool)\":{\"details\":\"Registers or deregisters an AssetProxy to be able to execute `removeAuthorizedAddressAtIndex` without a timelock.\",\"params\":{\"assetProxyContract\":\"Address of AssetProxy contract.\",\"isRegistered\":\"Status of approval for AssetProxy contract.\"}},\"removeOwner(address)\":{\"details\":\"Allows to remove an owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of owner.\"}},\"replaceOwner(address,address)\":{\"details\":\"Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"revokeConfirmation(uint256)\":{\"details\":\"Allows an owner to revoke a confirmation for a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"submitTransaction(address,uint256,bytes)\":{\"details\":\"Allows an owner to submit and confirm a transaction.\",\"params\":{\"data\":\"Transaction data payload.\",\"destination\":\"Transaction target address.\",\"value\":\"Transaction ether value.\"},\"return\":\"Returns transaction ID.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol\":\"AssetProxyOwner\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"2.0.0/multisig/MultiSigWallet.sol\":{\"keccak256\":\"0x5ad0f32801e51d60f02235477477b56ff9ccd727d6d2646d7efb84d1ffbd7bff\",\"urls\":[\"bzzr://0ca2767e1cde91f44a40176939eef3a46da233b552520aec19aeb97f4ef6bb00\"]},\"2.0.0/multisig/MultiSigWalletWithTimeLock.sol\":{\"keccak256\":\"0xd90adae0adda1b23bad71a37af6fc78f645204d519b7f4eeadea858241483611\",\"urls\":[\"bzzr://9761abd10cebccfcc948cc04cd7a5ee0a555d67d4510c82ef84422374beb8c8f\"]},\"2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol\":{\"keccak256\":\"0x6a77cd3a41d2ff7feab497e257cbc378167ae2d96975957116edf73c203d75d2\",\"urls\":[\"bzzr://b987bce902d5f514cf1d258f490007749a70787bb285805bdb8c613238977e46\"]}},\"version\":1}",
+ "evm": {
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CODESIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SUB"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "ADD"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2381,
+ "end": 2390,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2448,
+ "end": 2466,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2322,
+ "end": 2329,
+ "name": "DUP6"
+ },
+ {
+ "begin": 2331,
+ "end": 2340,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2342,
+ "end": 2360,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2018,
+ "end": 2025,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2027,
+ "end": 2036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2979,
+ "end": 2985,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2933,
+ "end": 2940,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2933,
+ "end": 2947,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2949,
+ "end": 2958,
+ "name": "DUP3"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2986,
+ "end": 2987,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "POP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2991,
+ "end": 2998,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2991,
+ "end": 3005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2989,
+ "end": 2990,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2989,
+ "end": 3005,
+ "name": "LT"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3037,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3038,
+ "end": 3045,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3046,
+ "end": 3047,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "LT"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MUL"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "POP"
+ },
+ {
+ "begin": 3053,
+ "end": 3060,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3061,
+ "end": 3062,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "LT"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MUL"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "AND"
+ },
+ {
+ "begin": 3067,
+ "end": 3068,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "EQ"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "REVERT"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3127,
+ "end": 3131,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3105,
+ "end": 3112,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3113,
+ "end": 3120,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3121,
+ "end": 3122,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "LT"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MUL"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "OR"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "ADD"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "ADD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3177,
+ "end": 3185,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2052,
+ "end": 2069,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 2393,
+ "end": 2394,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "POP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2400,
+ "end": 2420,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2400,
+ "end": 2427,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2396,
+ "end": 2397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2396,
+ "end": 2427,
+ "name": "LT"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2489,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2490,
+ "end": 2491,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "LT"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MUL"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "AND"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "AND"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2575,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "AND"
+ },
+ {
+ "begin": 2590,
+ "end": 2594,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "OR"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "ADD"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MUL"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "OR"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "30"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "25E7C27"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "173825D9"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20EA8D86"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "2F54BF6E"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "3411C81C"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "3589B35C"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "37BD78A0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "54741525"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "5A1A66AF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "7065CB48"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "784547A7"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "7AD28C51"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "83250F79"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "8B51D13F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "9ACE38C2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "A0E67E2B"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "A8ABE69A"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "B5DC40C3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "B77BF600"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "BA51A6DF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "C01A8C84"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "C6427474"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "D38F2D82"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "D74F8EDD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "DC8452CD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "E20056E6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "EE22610B"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "EQ"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2539,
+ "end": 2540,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2527,
+ "end": 2536,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2527,
+ "end": 2540,
+ "name": "GT"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2574,
+ "end": 2583,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2562,
+ "end": 2572,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "AND"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "E1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SUB"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "ADD"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "36"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "AND"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "STOP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "39"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "STOP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "42"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "INVALID"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ADD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "RETURN"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "45"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "INVALID"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ADD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "STOP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "51"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SUB"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "56"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SUB"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ADD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "57"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "57"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "AND"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "59"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "58"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "STOP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "60"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "60"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "AND"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "62"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "61"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "STOP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "63"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "63"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "64"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SUB"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ADD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "66"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "66"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "68"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "67"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "STOP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "69"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "INVALID"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "69"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "70"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ADD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "RETURN"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "72"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "72"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "74"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "73"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SUB"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ADD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "RETURN"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "75"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "INVALID"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "75"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "76"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "77"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "76"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP7"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "LT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "79"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "79"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "GT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "78"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "81"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "81"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "83"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "82"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MUL"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "85"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "84"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "86"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "86"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "88"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "87"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MUL"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "90"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "89"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "91"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "91"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "93"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "92"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MUL"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "95"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "94"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "96"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "96"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "98"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "97"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SUB"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ADD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "RETURN"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "99"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "99"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "101"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "100"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "STOP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "102"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "102"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "104"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "103"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "STOP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "105"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "105"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DIV"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MUL"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "AND"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATACOPY"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "107"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "106"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "108"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "108"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "110"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "109"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SUB"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ADD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "RETURN"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "111"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "INVALID"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "111"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "113"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "112"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP3"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SUB"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ADD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "RETURN"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "114"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "INVALID"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "114"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "52"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "116"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "115"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP3"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SUB"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ADD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "RETURN"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "117"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "117"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "119"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "118"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "STOP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "120"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "120"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "122"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "121"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "LT"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "123"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "123"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SHA3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "124"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "POP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "EXP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3879,
+ "end": 3885,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "126"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "126"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "128"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "128"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "AND"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3849,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "AND"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "130"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3891,
+ "end": 3897,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3891,
+ "end": 3904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3891,
+ "end": 3908,
+ "name": "ADD"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "LT"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "131"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3944,
+ "end": 3949,
+ "name": "DUP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3937,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3938,
+ "end": 3939,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "LT"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH [tag]",
+ "value": "133"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "133"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ADD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "134"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "EXP"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "EQ"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "135"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 3987,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "ADD"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "LT"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH [tag]",
+ "value": "136"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "136"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "ADD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "137"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 3975,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3976,
+ "end": 3977,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "LT"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH [tag]",
+ "value": "138"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "138"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ADD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "139"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "NOT"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "OR"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "POP"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "PUSH [tag]",
+ "value": "131"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "tag",
+ "value": "135"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "132"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "ADD"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "130"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "131"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4053,
+ "end": 4059,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "ADD"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "140"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "tag",
+ "value": "140"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4096,
+ "end": 4102,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4096,
+ "end": 4109,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4109,
+ "name": "GT"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4141,
+ "end": 4147,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4141,
+ "end": 4154,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4123,
+ "end": 4140,
+ "name": "PUSH [tag]",
+ "value": "101"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "tag",
+ "value": "143"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "tag",
+ "value": "142"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "AND"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "129"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "127"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "125"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3259,
+ "end": 3269,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "145"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "145"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1727,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1713,
+ "end": 1749,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "PUSH [tag]",
+ "value": "147"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "tag",
+ "value": "147"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1996,
+ "end": 2008,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "149"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "149"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3377,
+ "end": 3390,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "151"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "151"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "152"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "152"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3449,
+ "end": 3454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3419,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3435,
+ "end": 3445,
+ "name": "CALLER"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "PUSH",
+ "value": "F6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "153"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "150"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "tag",
+ "value": "148"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "146"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "144"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SHA3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP5"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3575,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "155"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "155"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3463,
+ "end": 3476,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "157"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "157"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "158"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "158"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1418,
+ "end": 1440,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "AND"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1510,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "AND"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH [tag]",
+ "value": "160"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "tag",
+ "value": "160"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "72656D6F7665417574686F72697A6564416464726573734174496E6465782861"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "6464726573732C75696E74323536290000000000000000000000000000000000"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "2F"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SUB"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "161"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "LT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "163"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "163"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "164"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "GT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "164"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SUB"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "162"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1565,
+ "end": 1566,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1555,
+ "name": "PUSH [tag]",
+ "value": "165"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "161"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "EQ"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "166"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "tag",
+ "value": "166"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3578,
+ "end": 3590,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "ADD"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "AND"
+ },
+ {
+ "begin": 3629,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "OR"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "ADD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP12"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "LT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "169"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "169"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "170"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "170"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "168"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GAS"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "CALL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "171"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "171"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "ADD"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "AND"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "172"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "tag",
+ "value": "167"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "159"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "156"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "154"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "174"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9304,
+ "end": 9305,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9304,
+ "end": 9322,
+ "name": "LT"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "175"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9355,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9360,
+ "end": 9372,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "ADD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "AND"
+ },
+ {
+ "begin": 9359,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "tag",
+ "value": "177"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "179"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "POP"
+ },
+ {
+ "begin": 9404,
+ "end": 9412,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "179"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9416,
+ "end": 9428,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "ADD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "AND"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "tag",
+ "value": "179"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "tag",
+ "value": "178"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "180"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9467,
+ "end": 9468,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "ADD"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "POP"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "tag",
+ "value": "180"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "176"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "ADD"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "175"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "173"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "59"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "182"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "182"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3020,
+ "end": 3038,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "184"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "184"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3076,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "OR"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "PUSH",
+ "value": "DAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SUB"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "185"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "183"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "181"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "62"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "187"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "187"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "189"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "189"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3447,
+ "end": 3452,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "191"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "191"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3479,
+ "end": 3485,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "POP"
+ },
+ {
+ "begin": 3495,
+ "end": 3496,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3479,
+ "end": 3496,
+ "name": "ADD"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "193"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "193"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "194"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "194"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "195"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "195"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "196"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "196"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "AND"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3529,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "AND"
+ },
+ {
+ "begin": 3539,
+ "end": 3543,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "OR"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "198"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "198"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "200"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP11"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "EXP"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "NOT"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "OR"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "197"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "192"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "190"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "188"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "186"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "65"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "202"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7475,
+ "end": 7481,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7475,
+ "end": 7488,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "LT"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "203"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7526,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7548,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "LT"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH [tag]",
+ "value": "205"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "205"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "ADD"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "206"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "EXP"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DIV"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "AND"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "AND"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "PUSH [tag]",
+ "value": "207"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7579,
+ "end": 7580,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "ADD"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "POP"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "tag",
+ "value": "207"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7598,
+ "end": 7603,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7598,
+ "end": 7615,
+ "name": "EQ"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "208"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7640,
+ "end": 7644,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "POP"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "203"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "tag",
+ "value": "208"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "204"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "ADD"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "202"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "203"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "201"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "68"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "210"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "210"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2398,
+ "end": 2415,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "D1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SUB"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "ADD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "LOG1"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "211"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "209"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "POP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "71"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SHA3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "74"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "213"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8784,
+ "end": 8790,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8784,
+ "end": 8797,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "LT"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "214"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8833,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8855,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "LT"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH [tag]",
+ "value": "216"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "216"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "ADD"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "217"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "EXP"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DIV"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "AND"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "AND"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "218"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8886,
+ "end": 8887,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "ADD"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "POP"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "tag",
+ "value": "218"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "215"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "ADD"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "213"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "214"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "212"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "77"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "83"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "219"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "tag",
+ "value": "219"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9661,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "222"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "223"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "AND"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "GT"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "223"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "222"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "221"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "88"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "224"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "tag",
+ "value": "224"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "226"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "tag",
+ "value": "226"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11013,
+ "end": 11023,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11037,
+ "end": 11043,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "LT"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH [tag]",
+ "value": "228"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "228"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MUL"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "229"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 11026,
+ "end": 11027,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "POP"
+ },
+ {
+ "begin": 11060,
+ "end": 11061,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "POP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "230"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11063,
+ "end": 11064,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11063,
+ "end": 11081,
+ "name": "LT"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "231"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11114,
+ "name": "DUP6"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "PUSH [tag]",
+ "value": "233"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11119,
+ "end": 11131,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "ADD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "AND"
+ },
+ {
+ "begin": 11118,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "tag",
+ "value": "233"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "235"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "POP"
+ },
+ {
+ "begin": 11163,
+ "end": 11171,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "235"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11175,
+ "end": 11187,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "ADD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "AND"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "tag",
+ "value": "235"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "tag",
+ "value": "234"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "236"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11259,
+ "end": 11260,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11249,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11250,
+ "end": 11255,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "LT"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH [tag]",
+ "value": "237"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "tag",
+ "value": "237"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MUL"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11260,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11287,
+ "end": 11288,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "ADD"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "tag",
+ "value": "236"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "232"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "ADD"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "230"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "231"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11346,
+ "end": 11350,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11343,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11350,
+ "name": "SUB"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "LT"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH [tag]",
+ "value": "238"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "238"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MUL"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "239"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11368,
+ "end": 11372,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "POP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "240"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11376,
+ "end": 11378,
+ "name": "DUP7"
+ },
+ {
+ "begin": 11374,
+ "end": 11375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11374,
+ "end": 11378,
+ "name": "LT"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "241"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11443,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11444,
+ "end": 11445,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "LT"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "243"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "tag",
+ "value": "243"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MUL"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11412,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11417,
+ "end": 11421,
+ "name": "DUP10"
+ },
+ {
+ "begin": 11413,
+ "end": 11414,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11413,
+ "end": 11421,
+ "name": "SUB"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "LT"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH [tag]",
+ "value": "244"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "tag",
+ "value": "244"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MUL"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "242"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "ADD"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "240"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "241"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "227"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "93"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "245"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "tag",
+ "value": "245"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "246"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "220"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "tag",
+ "value": "246"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10039,
+ "end": 10045,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10039,
+ "end": 10052,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "LT"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH [tag]",
+ "value": "248"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "248"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MUL"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "249"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10076,
+ "end": 10077,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "POP"
+ },
+ {
+ "begin": 10110,
+ "end": 10111,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "POP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "250"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10115,
+ "end": 10121,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10115,
+ "end": 10128,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "LT"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "251"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10164,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10186,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "LT"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH [tag]",
+ "value": "253"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "253"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "ADD"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "254"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "EXP"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DIV"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "AND"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "AND"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "255"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10243,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "LT"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH [tag]",
+ "value": "256"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "256"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "ADD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "257"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "EXP"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10227,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10228,
+ "end": 10233,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "LT"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH [tag]",
+ "value": "258"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "tag",
+ "value": "258"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MUL"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10273,
+ "end": 10274,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "ADD"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "tag",
+ "value": "255"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "252"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "ADD"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "250"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "251"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10329,
+ "end": 10334,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "LT"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH [tag]",
+ "value": "259"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "259"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MUL"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "260"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10352,
+ "end": 10353,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "POP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "261"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10357,
+ "end": 10362,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10356,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10362,
+ "name": "LT"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "262"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10418,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10419,
+ "end": 10420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "LT"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "264"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "tag",
+ "value": "264"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MUL"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10395,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10396,
+ "end": 10397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "LT"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH [tag]",
+ "value": "265"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "tag",
+ "value": "265"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "AND"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MUL"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "263"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "ADD"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "261"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "262"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "247"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "98"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "101"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "267"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "267"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5112,
+ "end": 5118,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 5112,
+ "end": 5125,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 5127,
+ "end": 5136,
+ "name": "DUP2"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "269"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "269"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "270"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "270"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "271"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "271"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "272"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "272"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5152,
+ "end": 5160,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "A3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SUB"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "ADD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "273"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "268"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "266"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "104"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2676,
+ "end": 2686,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "275"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "275"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1558,
+ "end": 1570,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "AND"
+ },
+ {
+ "begin": 1558,
+ "end": 1602,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "PUSH [tag]",
+ "value": "277"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "tag",
+ "value": "277"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1876,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "PUSH [tag]",
+ "value": "279"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "tag",
+ "value": "279"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2803,
+ "end": 2816,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "281"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "281"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "282"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "282"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2875,
+ "end": 2879,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2861,
+ "end": 2871,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "OR"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "DUP9"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "PUSH",
+ "value": "4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "LOG3"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "PUSH [tag]",
+ "value": "284"
+ },
+ {
+ "begin": 2954,
+ "end": 2967,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2942,
+ "end": 2953,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "tag",
+ "value": "284"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 3004,
+ "end": 3017,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3019,
+ "end": 3034,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 2984,
+ "end": 3003,
+ "name": "PUSH [tag]",
+ "value": "287"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "tag",
+ "value": "286"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "tag",
+ "value": "285"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "283"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "tag",
+ "value": "280"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "tag",
+ "value": "278"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "276"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "274"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "107"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5580,
+ "end": 5598,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "PUSH [tag]",
+ "value": "289"
+ },
+ {
+ "begin": 5645,
+ "end": 5656,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5658,
+ "end": 5663,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5665,
+ "end": 5669,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5630,
+ "end": 5644,
+ "name": "PUSH [tag]",
+ "value": "290"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "tag",
+ "value": "289"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "POP"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "PUSH [tag]",
+ "value": "291"
+ },
+ {
+ "begin": 5699,
+ "end": 5712,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5680,
+ "end": 5698,
+ "name": "PUSH [tag]",
+ "value": "104"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "tag",
+ "value": "291"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "288"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "110"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "113"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "116"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "119"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4561,
+ "end": 4567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "293"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "293"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "295"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "295"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "297"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "297"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4568,
+ "end": 4569,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "POP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "299"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4573,
+ "end": 4579,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4573,
+ "end": 4586,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "LT"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "300"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4622,
+ "end": 4627,
+ "name": "DUP5"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4615,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4616,
+ "end": 4617,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "LT"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH [tag]",
+ "value": "302"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "302"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ADD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "303"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "EXP"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "EQ"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "304"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4659,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4647,
+ "end": 4653,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4654,
+ "end": 4655,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "LT"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH [tag]",
+ "value": "305"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "305"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ADD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "306"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "EXP"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "NOT"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "OR"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "POP"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "PUSH [tag]",
+ "value": "300"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "tag",
+ "value": "304"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "301"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "ADD"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "299"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "300"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP7"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "AND"
+ },
+ {
+ "begin": 4731,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4721,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP9"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "AND"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "OR"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "AND"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "298"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "296"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "294"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "292"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "122"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3808,
+ "end": 3830,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "308"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "308"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3743,
+ "end": 3756,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "310"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "310"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "311"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "311"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1445,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1480,
+ "name": "ADD"
+ },
+ {
+ "begin": 1409,
+ "end": 1424,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "LT"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH [tag]",
+ "value": "313"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "tag",
+ "value": "313"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3833,
+ "end": 3845,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "ADD"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "AND"
+ },
+ {
+ "begin": 3884,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "OR"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "ADD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP11"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "LT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "316"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "316"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "317"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "317"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "315"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GAS"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "CALL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "318"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "148"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "318"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "ADD"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "AND"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "319"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "tag",
+ "value": "314"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "312"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "309"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "307"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "165"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4242,
+ "end": 4255,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4291,
+ "end": 4296,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4299,
+ "end": 4300,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4291,
+ "end": 4300,
+ "name": "ADD"
+ },
+ {
+ "begin": 4279,
+ "end": 4280,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4279,
+ "end": 4287,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "LT"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH [tag]",
+ "value": "321"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "REVERT"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "tag",
+ "value": "321"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4357,
+ "end": 4359,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "ADD"
+ },
+ {
+ "begin": 4344,
+ "end": 4349,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4488,
+ "end": 4491,
+ "name": "AND"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "320"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "287"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4324,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "PUSH",
+ "value": "B237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SUB"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "ADD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "322"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "290"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8126,
+ "end": 8144,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8096,
+ "end": 8107,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "324"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "324"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP9"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP7"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP8"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "326"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "327"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "tag",
+ "value": "326"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8382,
+ "end": 8398,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "ADD"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "C0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "325"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "323"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "141"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "329"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "328"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "199"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "332"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "331"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "220"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "225"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "327"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MUL"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SUB"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SHA3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DIV"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "LT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "334"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "NOT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "AND"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP4"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "OR"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "334"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP6"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "335"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "335"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "336"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "333"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "330"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "221"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "339"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP3"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "GT"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "337"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "DUP2"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "ADD"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "PUSH [tag]",
+ "value": "339"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "340"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "POP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "tag",
+ "value": "338"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 663,
+ "end": 4608,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "bytecode": {
+ "object": "0x606060405234156200000d57fe5b60405162001e8338038062001e8383398101604090815281516020830151918301516060840151918401939290920191905b600060008584845b82825b600082518260328211806200005e57508181115b8062000068575080155b8062000072575081155b156200007e5760006000fd5b600092505b84518310156200015357600260008685815181101515620000a057fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000f357508483815181101515620000dc57fe5b90602001906020020151600160a060020a03166000145b15620000ff5760006000fd5b60016002600087868151811015156200011457fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790555b60019092019162000083565b845162000168906003906020880190620001fc565b5060048490555b5b505050600683905550505b505050600091505b8451821015620001ef5784828151811015156200019c57fe5b602090810290910101519050600160a060020a0381161515620001bf5760006000fd5b600160a060020a0381166000908152600860205260409020805460ff191660011790555b60019091019062000183565b5b50505050505062000295565b82805482825590600052602060002090810192821562000254579160200282015b82811115620002545782518254600160a060020a031916600160a060020a039091161782556020909201916001909101906200021d565b5b506200026392915062000267565b5090565b6200029291905b8082111562000263578054600160a060020a03191681556001016200026e565b5090565b90565b611bde80620002a56000396000f300606060405236156101435763ffffffff60e060020a600035041663025e7c278114610195578063173825d9146101c457806320ea8d86146101e25780632f54bf6e146101f75780633411c81c146102275780633589b35c1461025a57806337bd78a01461026f57806354741525146102915780635a1a66af146102bd5780637065cb48146102e0578063784547a7146102fe5780637ad28c511461032557806383250f791461033a5780638b51d13f1461036a5780639ace38c21461038f578063a0e67e2b1461044c578063a8abe69a146104b7578063b5dc40c314610532578063b77bf600146105a0578063ba51a6df146105c2578063c01a8c84146105d7578063c6427474146105ec578063d38f2d8214610661578063d74f8edd14610686578063dc8452cd146106a8578063e20056e6146106ca578063ee22610b146106ee575b6101935b600034111561019057604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b341561019d57fe5b6101a8600435610703565b60408051600160a060020a039092168252519081900360200190f35b34156101cc57fe5b610193600160a060020a0360043516610735565b005b34156101ea57fe5b6101936004356108e6565b005b34156101ff57fe5b610213600160a060020a03600435166109da565b604080519115158252519081900360200190f35b341561022f57fe5b610213600435600160a060020a03602435166109ef565b604080519115158252519081900360200190f35b341561026257fe5b610193600435610a0f565b005b341561027757fe5b61027f610cc9565b60408051918252519081900360200190f35b341561029957fe5b61027f60043515156024351515610ccf565b60408051918252519081900360200190f35b34156102c557fe5b610193600160a060020a03600435166024351515610d3e565b005b34156102e857fe5b610193600160a060020a0360043516610dde565b005b341561030657fe5b610213600435610f15565b604080519115158252519081900360200190f35b341561032d57fe5b610193600435610fa9565b005b341561034257fe5b610213600160a060020a0360043516611007565b604080519115158252519081900360200190f35b341561037257fe5b61027f60043561101c565b60408051918252519081900360200190f35b341561039757fe5b6103a260043561109b565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a08301908590801561043a5780601f1061040f5761010080835404028352916020019161043a565b820191906000526020600020905b81548152906001019060200180831161041d57829003601f168201915b50509550505050505060405180910390f35b341561045457fe5b61045c6110cf565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156104bf57fe5b61045c60043560243560443515156064351515611138565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b341561053a57fe5b61045c60043561126d565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156105a857fe5b61027f6113f5565b60408051918252519081900360200190f35b34156105ca57fe5b6101936004356113fb565b005b34156105df57fe5b61019360043561148b565b005b34156105f457fe5b604080516020600460443581810135601f810184900484028501840190955284845261027f948235600160a060020a03169460248035956064949293919092019181908401838280828437509496506115a095505050505050565b60408051918252519081900360200190f35b341561066957fe5b61027f6004356115c0565b60408051918252519081900360200190f35b341561068e57fe5b61027f6115d2565b60408051918252519081900360200190f35b34156106b057fe5b61027f6115d7565b60408051918252519081900360200190f35b34156106d257fe5b610193600160a060020a03600435811690602435166115dd565b005b34156106f657fe5b610193600435611799565b005b600380548290811061071157fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a03161415156107585760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156107825760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b6003546000190182101561087d5782600160a060020a03166003838154811015156107cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156108715760038054600019810190811061080d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561083c57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a0316021790555061087d565b5b6001909101906107a5565b6003805460001901906108909082611a9a565b5060035460045411156108a9576003546108a9906113fb565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff16151561090f5760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff1615156109455760006000fd5b600084815260208190526040902060030154849060ff16156109675760006000fd5b8461097181610f15565b1561097c5760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610a315760006000fd5b82610a3b81610f15565b1515610a475760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610a7e5760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e646578286181527f6464726573732c75696e743235362900000000000000000000000000000000006020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610b789392830182828015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050600061192e565b600160e060020a03191614610b8d5760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505091505060006040518083038185876185025a03f19250505015610c855760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109ce565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610d3657838015610cfc575060008181526020819052604090206003015460ff16155b80610d205750828015610d20575060008181526020819052604090206003015460ff165b5b15610d2d576001820191505b5b600101610cd3565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610d5f5760006000fd5b81600160a060020a0381161515610d765760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610dff5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610e285760006000fd5b81600160a060020a0381161515610e3f5760006000fd5b6003805490506001016004546032821180610e5957508181115b80610e62575080155b80610e6b575081155b15610e765760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610eae8382611a9a565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b600080805b600354811015610fa15760008481526001602052604081206003805491929184908110610f4357fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610f85576001820191505b600454821415610f985760019250610fa1565b5b600101610f1a565b5b5050919050565b30600160a060020a031633600160a060020a0316141515610fca5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b600354811015611094576000838152600160205260408120600380549192918490811061104957fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561108b576001820191505b5b600101611020565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b6110d7611aee565b600380548060200260200160405190810160405280929190818152602001828054801561112d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161110f575b505050505090505b90565b611140611aee565b611148611aee565b6000600060055460405180591061115c5750595b908082528060200260200182016040525b50925060009150600090505b6005548110156111f6578580156111a2575060008181526020819052604090206003015460ff16155b806111c657508480156111c6575060008181526020819052604090206003015460ff165b5b156111ed578083838151811015156111db57fe5b60209081029091010152600191909101905b5b600101611179565b8787036040518059106112065750595b908082528060200260200182016040525b5093508790505b8681101561126157828181518110151561123457fe5b906020019060200201518489830381518110151561124e57fe5b602090810290910101525b60010161121e565b5b505050949350505050565b611275611aee565b61127d611aee565b60035460405160009182918059106112925750595b908082528060200260200182016040525b50925060009150600090505b60035481101561137757600085815260016020526040812060038054919291849081106112d857fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561136e57600380548290811061132157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110151561134f57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b6001016112af565b816040518059106113855750595b908082528060200260200182016040525b509350600090505b818110156113ec5782818151811015156113b457fe5b9060200190602002015184828151811015156113cc57fe5b600160a060020a039092166020928302909101909101525b60010161139e565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a031614151561141c5760006000fd5b60035481603282118061142e57508181115b80611437575080155b80611440575081155b1561144b5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156114b45760006000fd5b6000828152602081905260409020548290600160a060020a031615156114da5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff161561150f5760006000fd5b8461151981610f15565b156115245760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361158386610f15565b156109ce576109ce864261195b565b5b5b5b505b50505b505b5050565b60006115ad8484846119a7565b90506115b88161148b565b5b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156116005760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16151561162a5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156116535760006000fd5b600092505b6003548310156116fb5784600160a060020a031660038481548110151561167b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156116ef57836003848154811015156116ba57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506116fb565b5b600190920191611658565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff16156117bb5760006000fd5b826117c581610f15565b15156117d15760006000fd5b6006546000858152600760205260409020548591014210156117f35760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a039093169594929391928392859260001991831615610100029190910190911604801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505091505060006040518083038185876185025a03f192505050156118eb5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109d1565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b6000816004018351101515156119445760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a03811615156119c05760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611a40926002850192910190611b12565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b5b50611b8d929150611b91565b5090565b61113591905b80821115611b8d5760008155600101611b97565b5090565b905600a165627a7a72305820de7348a39a18c2139f807a6077c790eed8049dfeaae504bf4a42607bfae3afce0029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH3 0xD JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x1E83 CODESIZE SUB DUP1 PUSH3 0x1E83 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD SWAP2 DUP5 ADD SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 SWAP1 JUMPDEST PUSH1 0x0 PUSH1 0x0 DUP6 DUP5 DUP5 JUMPDEST DUP3 DUP3 JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x5E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x68 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x72 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x7E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x153 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xA0 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xF3 JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xDC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0xFF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x114 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x83 JUMP JUMPDEST DUP5 MLOAD PUSH3 0x168 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x1FC JUMP JUMPDEST POP PUSH1 0x4 DUP5 SWAP1 SSTORE JUMPDEST JUMPDEST POP POP POP PUSH1 0x6 DUP4 SWAP1 SSTORE POP POP JUMPDEST POP POP POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP5 MLOAD DUP3 LT ISZERO PUSH3 0x1EF JUMPI DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x19C JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH3 0x1BF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x183 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP PUSH3 0x295 JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x254 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x254 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x21D JUMP JUMPDEST JUMPDEST POP PUSH3 0x263 SWAP3 SWAP2 POP PUSH3 0x267 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x292 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x263 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x26E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1BDE DUP1 PUSH3 0x2A5 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x143 JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x195 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1C4 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1E2 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x1F7 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x3589B35C EQ PUSH2 0x25A JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x26F JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0x5A1A66AF EQ PUSH2 0x2BD JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x2E0 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2FE JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x325 JUMPI DUP1 PUSH4 0x83250F79 EQ PUSH2 0x33A JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x36A JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x38F JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x44C JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x4B7 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x532 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x5A0 JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x5C2 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x5D7 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x5EC JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x661 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x686 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x6A8 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x6CA JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x6EE JUMPI JUMPDEST PUSH2 0x193 JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x190 JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST JUMPDEST JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x19D JUMPI INVALID JUMPDEST PUSH2 0x1A8 PUSH1 0x4 CALLDATALOAD PUSH2 0x703 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1CC JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x735 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x1EA JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x8E6 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x1FF JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x9DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x22F JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x24 CALLDATALOAD AND PUSH2 0x9EF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x262 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0xA0F JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x277 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0xCC9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x299 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xCCF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2C5 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xD3E JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x2E8 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDE JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x306 JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH2 0xF15 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x32D JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0xFA9 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x342 JUMPI INVALID JUMPDEST PUSH2 0x213 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x1007 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x372 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD PUSH2 0x101C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x397 JUMPI INVALID JUMPDEST PUSH2 0x3A2 PUSH1 0x4 CALLDATALOAD PUSH2 0x109B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE DUP3 ISZERO ISZERO PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP2 DUP2 ADD DUP3 DUP2 MSTORE DUP5 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP3 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 SWAP2 PUSH1 0xA0 DUP4 ADD SWAP1 DUP6 SWAP1 DUP1 ISZERO PUSH2 0x43A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x40F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x43A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x41D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x454 JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH2 0x10CF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x4BF JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0x1138 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x53A JUMPI INVALID JUMPDEST PUSH2 0x45C PUSH1 0x4 CALLDATALOAD PUSH2 0x126D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x4A4 JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x4A4 JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x484 JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x5A8 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x13F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x5CA JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x13FB JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x5DF JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x148B JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x5F4 JUMPI INVALID JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x27F SWAP5 DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 PUSH1 0x64 SWAP5 SWAP3 SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP7 POP PUSH2 0x15A0 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x669 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH1 0x4 CALLDATALOAD PUSH2 0x15C0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x68E JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x15D2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x6B0 JUMPI INVALID JUMPDEST PUSH2 0x27F PUSH2 0x15D7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x6D2 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x15DD JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x6F6 JUMPI INVALID JUMPDEST PUSH2 0x193 PUSH1 0x4 CALLDATALOAD PUSH2 0x1799 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x711 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x758 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x782 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 NOT ADD DUP3 LT ISZERO PUSH2 0x87D JUMPI DUP3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x7CC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x871 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x80D JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x83C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x87D JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x7A5 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x890 SWAP1 DUP3 PUSH2 0x1A9A JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x8A9 JUMPI PUSH1 0x3 SLOAD PUSH2 0x8A9 SWAP1 PUSH2 0x13FB JUMP JUMPDEST JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x90F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x945 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x967 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0x971 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x97C JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xA31 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0xA3B DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xA47 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP6 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA7E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A6564416464726573734174496E6465782861 DUP2 MSTORE PUSH32 0x6464726573732C75696E74323536290000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD PUSH1 0x2F SWAP3 DUP2 SWAP1 SUB SWAP3 SWAP1 SWAP3 ADD DUP3 SHA3 PUSH1 0x2 DUP6 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND SWAP4 PUSH2 0xB78 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xB6C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB41 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB6C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB4F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH1 0x0 PUSH2 0x192E JUMP JUMPDEST PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND EQ PUSH2 0xB8D JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP12 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0xC36 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC0B JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC36 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC19 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0xC85 JUMPI PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x9CE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP6 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xD36 JUMPI DUP4 DUP1 ISZERO PUSH2 0xCFC JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xD20 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xD20 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xD2D JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0xCD3 JUMP JUMPDEST JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xD5F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xD76 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP4 DUP5 MSTORE SWAP1 DUP4 ADD MSTORE DUP1 MLOAD PUSH32 0xDAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xDFF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xE28 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xE3F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xE59 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xE62 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xE6B JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xE76 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP2 DUP2 ADD PUSH2 0xEAE DUP4 DUP3 PUSH2 0x1A9A JUMP JUMPDEST SWAP2 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP11 AND PUSH2 0x100 SWAP4 SWAP1 SWAP4 EXP DUP4 DUP2 MUL SWAP2 MUL NOT SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xFA1 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xF43 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xF85 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xF98 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xFA1 JUMP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0xF1A JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xFCA JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1094 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x1049 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x108B JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x1020 JUMP JUMPDEST JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP2 PUSH1 0x2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH2 0x10D7 PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x112D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x110F JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1140 PUSH2 0x1AEE JUMP JUMPDEST PUSH2 0x1148 PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x115C JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x11F6 JUMPI DUP6 DUP1 ISZERO PUSH2 0x11A2 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x11C6 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x11C6 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x11ED JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11DB JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x1179 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1206 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x1261 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1234 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x124E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x121E JUMP JUMPDEST JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1275 PUSH2 0x1AEE JUMP JUMPDEST PUSH2 0x127D PUSH2 0x1AEE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP1 MSIZE LT PUSH2 0x1292 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1377 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x12D8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x136E JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x1321 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x134F JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x12AF JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1385 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x13EC JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13B4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13CC JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x139E JUMP JUMPDEST JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x141C JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x142E JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1437 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x1440 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x144B JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x14B4 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO ISZERO PUSH2 0x14DA JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x150F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0x1519 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x1524 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1583 DUP7 PUSH2 0xF15 JUMP JUMPDEST ISZERO PUSH2 0x9CE JUMPI PUSH2 0x9CE DUP7 TIMESTAMP PUSH2 0x195B JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x15AD DUP5 DUP5 DUP5 PUSH2 0x19A7 JUMP JUMPDEST SWAP1 POP PUSH2 0x15B8 DUP2 PUSH2 0x148B JUMP JUMPDEST JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x1600 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x162A JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1653 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x16FB JUMPI DUP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x167B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x16EF JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x16BA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x16FB JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1658 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 SHA3 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x17BB JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x17C5 DUP2 PUSH2 0xF15 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x17D1 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x17F3 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x189C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1871 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x189C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x187F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0x18EB JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x9D1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1944 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x19C0 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 SHA3 DUP5 MLOAD DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x1A40 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1B12 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0x8DF JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0x8DF SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1B91 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0x8DF JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0x8DF SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1B91 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1B53 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1B80 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1B80 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1B80 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1B65 JUMP JUMPDEST JUMPDEST POP PUSH2 0x1B8D SWAP3 SWAP2 POP PUSH2 0x1B91 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x1135 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1B8D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1B97 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 0xde PUSH20 0x48A39A18C2139F807A6077C790EED8049DFEAAE5 DIV 0xbf 0x4a TIMESTAMP PUSH1 0x7B 0xfa 0xe3 0xaf 0xce STOP 0x29 ",
+ "sourceMap": "663:3945:2:-;;;2097:514;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2381:9;2448:18;2322:7;2331:9;2342:18;1884:213:1;2018:7;2027:9;2834:370:0;2979:6;2933:7;:14;2949:9;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;2986:1;2979:8;;2974:168;2991:7;:14;2989:1;:16;2974:168;;;3030:7;:19;3038:7;3046:1;3038:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3030:19:0;;;;;;;;;;;-1:-1:-1;3030:19:0;;;;;:38;;;3053:7;3061:1;3053:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3053:15:0;3067:1;3053:15;3030:38;3026:65;;;3086:5;;;3026:65;3127:4;3105:7;:19;3113:7;3121:1;3113:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3105:19:0;;;;;;;;;;;-1:-1:-1;3105:19:0;:26;;-1:-1:-1;;3105:26:0;;;;;;;;;;2974:168;3007:3;;;;;2974:168;;;3151:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;3177:8:0;:20;;;2412:1;2834:370;-1:-1:-1;;;2052:17:1;:38;;;-1:-1:-1;;1884:213:1;;;;2393:1:2;2381:13;;2376:229;2400:20;:27;2396:1;:31;2376:229;;;2469:20;2490:1;2469:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2514:24:2;;;;2506:33;;;;;;-1:-1:-1;;;;;2553:34:2;;;;;;:22;:34;;;;;:41;;-1:-1:-1;;2553:41:2;2590:4;2553:41;;;2376:229;2429:3;;;;;2376:229;;;2097:514;;;;;;;663:3945;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;663:3945:2;-1:-1:-1;;;;;663:3945:2;;;;;;;;;;;-1:-1:-1;663:3945:2;;;;;;;;-1:-1:-1;663:3945:2;;;-1:-1:-1;663:3945:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;663:3945:2;;;;;;;;;;;;;:::o;:::-;;;;;;;",
+ "linkReferences": {}
+ },
+ "deployedBytecode": {
+ "object": "0x606060405236156101435763ffffffff60e060020a600035041663025e7c278114610195578063173825d9146101c457806320ea8d86146101e25780632f54bf6e146101f75780633411c81c146102275780633589b35c1461025a57806337bd78a01461026f57806354741525146102915780635a1a66af146102bd5780637065cb48146102e0578063784547a7146102fe5780637ad28c511461032557806383250f791461033a5780638b51d13f1461036a5780639ace38c21461038f578063a0e67e2b1461044c578063a8abe69a146104b7578063b5dc40c314610532578063b77bf600146105a0578063ba51a6df146105c2578063c01a8c84146105d7578063c6427474146105ec578063d38f2d8214610661578063d74f8edd14610686578063dc8452cd146106a8578063e20056e6146106ca578063ee22610b146106ee575b6101935b600034111561019057604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b341561019d57fe5b6101a8600435610703565b60408051600160a060020a039092168252519081900360200190f35b34156101cc57fe5b610193600160a060020a0360043516610735565b005b34156101ea57fe5b6101936004356108e6565b005b34156101ff57fe5b610213600160a060020a03600435166109da565b604080519115158252519081900360200190f35b341561022f57fe5b610213600435600160a060020a03602435166109ef565b604080519115158252519081900360200190f35b341561026257fe5b610193600435610a0f565b005b341561027757fe5b61027f610cc9565b60408051918252519081900360200190f35b341561029957fe5b61027f60043515156024351515610ccf565b60408051918252519081900360200190f35b34156102c557fe5b610193600160a060020a03600435166024351515610d3e565b005b34156102e857fe5b610193600160a060020a0360043516610dde565b005b341561030657fe5b610213600435610f15565b604080519115158252519081900360200190f35b341561032d57fe5b610193600435610fa9565b005b341561034257fe5b610213600160a060020a0360043516611007565b604080519115158252519081900360200190f35b341561037257fe5b61027f60043561101c565b60408051918252519081900360200190f35b341561039757fe5b6103a260043561109b565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a08301908590801561043a5780601f1061040f5761010080835404028352916020019161043a565b820191906000526020600020905b81548152906001019060200180831161041d57829003601f168201915b50509550505050505060405180910390f35b341561045457fe5b61045c6110cf565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156104bf57fe5b61045c60043560243560443515156064351515611138565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b341561053a57fe5b61045c60043561126d565b60408051602080825283518183015283519192839290830191858101910280838382156104a4575b8051825260208311156104a457601f199092019160209182019101610484565b5050509050019250505060405180910390f35b34156105a857fe5b61027f6113f5565b60408051918252519081900360200190f35b34156105ca57fe5b6101936004356113fb565b005b34156105df57fe5b61019360043561148b565b005b34156105f457fe5b604080516020600460443581810135601f810184900484028501840190955284845261027f948235600160a060020a03169460248035956064949293919092019181908401838280828437509496506115a095505050505050565b60408051918252519081900360200190f35b341561066957fe5b61027f6004356115c0565b60408051918252519081900360200190f35b341561068e57fe5b61027f6115d2565b60408051918252519081900360200190f35b34156106b057fe5b61027f6115d7565b60408051918252519081900360200190f35b34156106d257fe5b610193600160a060020a03600435811690602435166115dd565b005b34156106f657fe5b610193600435611799565b005b600380548290811061071157fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a03161415156107585760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156107825760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b6003546000190182101561087d5782600160a060020a03166003838154811015156107cc57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156108715760038054600019810190811061080d57fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561083c57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a0316021790555061087d565b5b6001909101906107a5565b6003805460001901906108909082611a9a565b5060035460045411156108a9576003546108a9906113fb565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff16151561090f5760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff1615156109455760006000fd5b600084815260208190526040902060030154849060ff16156109675760006000fd5b8461097181610f15565b1561097c5760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610a315760006000fd5b82610a3b81610f15565b1515610a475760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610a7e5760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e646578286181527f6464726573732c75696e743235362900000000000000000000000000000000006020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610b789392830182828015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050600061192e565b600160e060020a03191614610b8d5760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b505091505060006040518083038185876185025a03f19250505015610c855760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109ce565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610d3657838015610cfc575060008181526020819052604090206003015460ff16155b80610d205750828015610d20575060008181526020819052604090206003015460ff165b5b15610d2d576001820191505b5b600101610cd3565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610d5f5760006000fd5b81600160a060020a0381161515610d765760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610dff5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610e285760006000fd5b81600160a060020a0381161515610e3f5760006000fd5b6003805490506001016004546032821180610e5957508181115b80610e62575080155b80610e6b575081155b15610e765760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610eae8382611a9a565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b600080805b600354811015610fa15760008481526001602052604081206003805491929184908110610f4357fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615610f85576001820191505b600454821415610f985760019250610fa1565b5b600101610f1a565b5b5050919050565b30600160a060020a031633600160a060020a0316141515610fca5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b600354811015611094576000838152600160205260408120600380549192918490811061104957fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561108b576001820191505b5b600101611020565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b6110d7611aee565b600380548060200260200160405190810160405280929190818152602001828054801561112d57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161110f575b505050505090505b90565b611140611aee565b611148611aee565b6000600060055460405180591061115c5750595b908082528060200260200182016040525b50925060009150600090505b6005548110156111f6578580156111a2575060008181526020819052604090206003015460ff16155b806111c657508480156111c6575060008181526020819052604090206003015460ff165b5b156111ed578083838151811015156111db57fe5b60209081029091010152600191909101905b5b600101611179565b8787036040518059106112065750595b908082528060200260200182016040525b5093508790505b8681101561126157828181518110151561123457fe5b906020019060200201518489830381518110151561124e57fe5b602090810290910101525b60010161121e565b5b505050949350505050565b611275611aee565b61127d611aee565b60035460405160009182918059106112925750595b908082528060200260200182016040525b50925060009150600090505b60035481101561137757600085815260016020526040812060038054919291849081106112d857fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561136e57600380548290811061132157fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316838381518110151561134f57fe5b600160a060020a03909216602092830290910190910152600191909101905b5b6001016112af565b816040518059106113855750595b908082528060200260200182016040525b509350600090505b818110156113ec5782818151811015156113b457fe5b9060200190602002015184828151811015156113cc57fe5b600160a060020a039092166020928302909101909101525b60010161139e565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a031614151561141c5760006000fd5b60035481603282118061142e57508181115b80611437575080155b80611440575081155b1561144b5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156114b45760006000fd5b6000828152602081905260409020548290600160a060020a031615156114da5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff161561150f5760006000fd5b8461151981610f15565b156115245760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361158386610f15565b156109ce576109ce864261195b565b5b5b5b505b50505b505b5050565b60006115ad8484846119a7565b90506115b88161148b565b5b9392505050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156116005760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16151561162a5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156116535760006000fd5b600092505b6003548310156116fb5784600160a060020a031660038481548110151561167b57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156116ef57836003848154811015156116ba57fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506116fb565b5b600190920191611658565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff16156117bb5760006000fd5b826117c581610f15565b15156117d15760006000fd5b6006546000858152600760205260409020548591014210156117f35760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a039093169594929391928392859260001991831615610100029190910190911604801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b505091505060006040518083038185876185025a03f192505050156118eb5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26109d1565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b6000816004018351101515156119445760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a03811615156119c05760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611a40926002850192910190611b12565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b8154818355818115116108df576000838152602090206108df918101908301611b91565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b5357805160ff1916838001178555611b80565b82800160010185558215611b80579182015b82811115611b80578251825591602001919060010190611b65565b5b50611b8d929150611b91565b5090565b61113591905b80821115611b8d5760008155600101611b97565b5090565b905600a165627a7a72305820de7348a39a18c2139f807a6077c790eed8049dfeaae504bf4a42607bfae3afce0029",
+ "sourceMap": "663:3945:2:-;;;;;;;;-1:-1:-1;;;663:3945:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2482:109:0;2539:1;2527:9;:13;2523:61;;;2554:30;;;2574:9;2554:30;;;;-1:-1:-1;;;;;2562:10:0;2554:30;;;;;;;;;;;;2523:61;2482:109;:::o;663:3945:2:-;;956:23:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;;;;;;;;;;;;;3731:460;;;;;;;;-1:-1:-1;;;;;3731:460:0;;;;;;;3176:332:1;;;;;;;;;;;;;;910:40:0;;;;;;;;-1:-1:-1;;;;;910:40:0;;;;;;;;;;;;;;;;;;;;;;;840:64;;;;;;;;;;-1:-1:-1;;;;;840:64:0;;;;;;;;;;;;;;;;;;;;;;;3320:573:2;;;;;;;;;;;;;;1029:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;9156:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2895:289:2;;;;;;;;-1:-1:-1;;;;;2895:289:2;;;;;;;;;;;3331:277:0;;;;;;;;-1:-1:-1;;;;;3331:277:0;;;;;;;7324:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2301:186:1;;;;;;;;;;;;;;981:55:2;;;;;;;;-1:-1:-1;;;;;981:55:2;;;;;;;;;;;;;;;;;;;;;;;8642:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;785:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;10777:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;9853:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;1011:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;5010:207;;;;;;;;;;;;;;2593:459:1;;;;;;;;;;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5476:244:0;;-1:-1:-1;5476:244:0;;-1:-1:-1;;;;;;5476:244:0;;;;;;;;;;;;;;;;;1065:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;237:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;985:20;;;;;;;;;;;;;;;;;;;;;;;;;;4390:449;;;;;;;;-1:-1:-1;;;;;4390:449:0;;;;;;;;;;;;3622:472:1;;;;;;;;;;;;;;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;:::o;3731:460::-;3879:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;3821:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;3842:14:0;;3859:5;3842:14;;;:7;:14;;;;;:22;;-1:-1:-1;;3842:22:0;;;3859:5;-1:-1:-1;3874:170:0;3891:6;:13;-1:-1:-1;;3891:17:0;3889:19;;3874:170;;;3944:5;-1:-1:-1;;;;;3931:18:0;:6;3938:1;3931:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3931:9:0;-1:-1:-1;;;;;3931:18:0;;3927:117;;;3981:6;3988:13;;-1:-1:-1;;3988:17:0;;;3981:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3981:25:0;3969:6;3976:1;3969:9;;;;;;;;;;;;;;;;;;;;:37;;;;;-1:-1:-1;;;;;3969:37:0;;;;;-1:-1:-1;;;;;3969:37:0;;;;;;4024:5;;3927:117;3874:170;3910:3;;;;;3874:170;;;4053:6;:18;;-1:-1:-1;;4053:18:0;;;;;;:::i;:::-;-1:-1:-1;4096:6:0;:13;4085:8;;:24;4081:74;;;4141:6;:13;4123:32;;:17;:32::i;:::-;4081:74;4165:19;;-1:-1:-1;;;;;4165:19:0;;;;;;;;1483:1;1262;;3731:460;;;:::o;3176:332:1:-;3259:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1714:28;;;;:13;:28;;;;;;;;3304:10:1;-1:-1:-1;;;;;1714:35:0;;;;;;;;;;:28;;3304:10:1;1714:35:0;;1713:36;1709:59;;;1763:5;;;1709:59;1996:12;:27;;;;;;;;;;:36;;;3336:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3377:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;3449:5;3406:28;;;:13;:28;;;;;;;;-1:-1:-1;;;;;3435:10:1;3406:40;;;;;;;;;:48;;-1:-1:-1;;3406:48:1;;;3464:37;3420:13;;3464:37;;;1222:1;2061::0;;1778;;1483;;;3176:332:1;;;:::o;910:40:0:-;;;;;;;;;;;;;;;:::o;840:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3320:573:2:-;3553:22;1996:27:0;;;;;;;;;;:36;;;3425:13:2;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3463:13:2;1298:26:1;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1418:22:2;1443:27;;;;;;;;;;;1511:14;;-1:-1:-1;;;;;1511:14:2;1488:38;;:22;:38;;;;;;;3524:13;;1443:27;1488:38;;1480:47;;;;;;;;1121:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;1556:7;;;;1545:22;;;;;;;;-1:-1:-1;;1545:22:2;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1545:69:2;;;;:22;;1121:60;1545:22;;1556:7;1545:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1565:1;1545:10;:22::i;:::-;-1:-1:-1;;;;;;1545:69:2;;1537:78;;;;;;3578:12;:27;;;;;;;;;;;;3615:11;;;:18;;-1:-1:-1;;3615:18:2;3629:4;3615:18;;;;;;3701:14;;3727:8;;;;3701:44;;3737:7;;;;3701:44;;3578:27;;-1:-1:-1;;;;;;3701:14:2;;;;3727:8;3737:7;;3701:44;;;;3737:7;;-1:-1:-1;;3701:44:2;;;;3615:18;3701:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3697:190;;;3759:24;;3769:13;;3759:24;;;;;3697:190;;;3812:31;;3829:13;;3812:31;;;;;3857:11;;;:19;;-1:-1:-1;;3857:19:2;;;3697:190;1625:1;1335::1;;;2061::0;;3320:573:2;;;;:::o;1029:29:1:-;;;;:::o;9156:319:0:-;9263:10;;9289:179;9306:16;;9304:1;:18;9289:179;;;9348:7;:36;;;;-1:-1:-1;9360:12:0;:15;;;;;;;;;;:24;;;;;9359:25;9348:36;:92;;;;9404:8;:36;;;;-1:-1:-1;9416:12:0;:15;;;;;;;;;;:24;;;;;9404:36;9348:92;9341:127;;;9467:1;9458:10;;;;9341:127;9289:179;9324:3;;9289:179;;;9156:319;;;;;;:::o;2895:289:2:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;3020:18:2;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;-1:-1:-1;;;;;3054:42:2;;;;;;:22;:42;;;;;;;;;:57;;-1:-1:-1;;3054:57:2;;;;;;;;;;3121:56;;;;;;;;;;;;;;;;;;;;;2166:1:0;1262;;2895:289:2;;;:::o;3331:277:0:-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;3424:5;;1332:14;;1328:37;;;1360:5;;;1328:37;3447:5;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;3479:6;:13;;;;3495:1;3479:17;3498:8;;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;-1:-1:-1;;;;;3522:14:0;;;;;;:7;:14;;;;;:21;;-1:-1:-1;;3522:21:0;3539:4;3522:21;;;;;;3553:6;:18;;:6;;:18;;;:6;:18;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;3553:18:0;;;;;;;;;;;;;;;;;;;;;3581:20;;3553:18;;-1:-1:-1;3581:20:0;;-1:-1:-1;;3581:20:0;2412:1;2166;;;1375;;1262;;3331:277;;:::o;7324:337::-;7414:4;;;7458:197;7475:6;:13;7473:15;;7458:197;;;7513:28;;;;:13;:28;;;;;7542:6;:9;;7513:28;;;7549:1;;7542:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7542:9:0;;;;;;;;7513:39;;;;;;;;;;;-1:-1:-1;7513:39:0;;;;7509:71;;;7579:1;7570:10;;;;7509:71;7607:8;;7598:5;:17;7594:50;;;7640:4;7633:11;;;;7594:50;7458:197;7490:3;;7458:197;;;7324:337;;;;;;:::o;2301:186:1:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;2398:17:1;:38;;;2446:34;;;;;;;;;;;;;;;;;1262:1:0;2301:186:1;;:::o;981:55:2:-;;;;;;;;;;;;;;;:::o;8642:252:0:-;8741:10;;8767:120;8784:6;:13;8782:15;;8767:120;;;8820:28;;;;:13;:28;;;;;8849:6;:9;;8820:28;;;8856:1;;8849:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8849:9:0;;;;;;;;8820:39;;;;;;;;;;;-1:-1:-1;8820:39:0;;;;8816:71;;;8886:1;8877:10;;;;8816:71;8767:120;8799:3;;8767:120;;;8642:252;;;;;:::o;785:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;:::o;9559:115::-;9629:9;;:::i;:::-;9661:6;9654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9654:13:0;;;;;;;;;;;;;;;;;;;;;;;9559:115;;:::o;10777:676::-;10902:22;;:::i;:::-;10940:32;;:::i;:::-;11013:10;11037:6;10986:16;;10975:28;;;;;;;;;;;;;;;;;;;;;;;;;10940:63;;11026:1;11013:14;;11060:1;11058:3;;11053:250;11065:16;;11063:1;:18;11053:250;;;11107:7;:36;;;;-1:-1:-1;11119:12:0;:15;;;;;;;;;;:24;;;;;11118:25;11107:36;:92;;;;11163:8;:36;;;;-1:-1:-1;11175:12:0;:15;;;;;;;;;;:24;;;;;11163:36;11107:92;11100:203;;;11259:1;11231:18;11250:5;11231:25;;;;;;;;;;;;;;;;;;:29;11287:1;11278:10;;;;;11100:203;11053:250;11083:3;;11053:250;;;11346:4;11341:2;:9;11330:21;;;;;;;;;;;;;;;;;;;;;;;;;11312:39;;11368:4;11366:6;;11361:85;11376:2;11374:1;:4;11361:85;;;11425:18;11444:1;11425:21;;;;;;;;;;;;;;;;;;11397:15;11417:4;11413:1;:8;11397:25;;;;;;;;;;;;;;;;;;:49;11361:85;11380:3;;11361:85;;;10777:676;;;;;;;;;;:::o;9853:575::-;9948:24;;:::i;:::-;9988:34;;:::i;:::-;10039:6;:13;10025:28;;10063:10;;;;10025:28;;;;;;;;;;;;;;;;;;;;;;;9988:65;;10076:1;10063:14;;10110:1;10108:3;;10103:186;10115:6;:13;10113:15;;10103:186;;;10151:28;;;;:13;:28;;;;;10180:6;:9;;10151:28;;;10187:1;;10180:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10180:9:0;;;;;;;;10151:39;;;;;;;;;;;-1:-1:-1;10151:39:0;;;;10147:142;;;10237:6;:9;;10244:1;;10237:9;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10237:9:0;10210:17;10228:5;10210:24;;;;;;;;;;-1:-1:-1;;;;;10210:36:0;;;:24;;;;;;;;;;:36;10273:1;10264:10;;;;;10147:142;10103:186;10130:3;;10103:186;;;10329:5;10315:20;;;;;;;;;;;;;;;;;;;;;;;;;10298:37;;10352:1;10350:3;;10345:76;10357:5;10355:1;:7;10345:76;;;10401:17;10419:1;10401:20;;;;;;;;;;;;;;;;;;10381:14;10396:1;10381:17;;;;;;;;;;-1:-1:-1;;;;;10381:40:0;;;:17;;;;;;;;;;:40;10345:76;10364:3;;10345:76;;;9853:575;;;;;;;:::o;1011:28::-;;;;:::o;5010:207::-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;5112:6;:13;5127:9;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;5152:8;:20;;;5182:28;;;;;;;;;;;;;;;;;2412:1;1262;;;5010:207;;:::o;2593:459:1:-;2676:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1558:12;:27;;;;;;;;;;:39;2714:13:1;;-1:-1:-1;;;;;1558:39:0;:44;1554:67;;;1616:5;;;1554:67;1863:28;;;;:13;:28;;;;;;;;2765:10:1;-1:-1:-1;;;;;1863:35:0;;;;;;;;;;:28;;2765:10:1;1863:35:0;;1859:58;;;1912:5;;;1859:58;2803:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;2832:28;;;;2875:4;2832:28;;;;;;;;-1:-1:-1;;;;;2861:10:1;2832:40;;;;;;;;;:47;;-1:-1:-1;;2832:47:1;;;;;;;2889:39;;2846:13;;2889:39;;;2942:26;2954:13;2942:11;:26::i;:::-;2938:108;;;2984:51;3004:13;3019:15;2984:19;:51::i;:::-;2938:108;1222:1;1927::0;;1631;;;1483;;2593:459:1;;;:::o;5476:244:0:-;5580:18;5630:40;5645:11;5658:5;5665:4;5630:14;:40::i;:::-;5614:56;;5680:33;5699:13;5680:18;:33::i;:::-;5476:244;;;;;;:::o;1065:47:1:-;;;;;;;;;;;;;:::o;237:41:0:-;276:2;237:41;:::o;985:20::-;;;;:::o;4390:449::-;4561:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;4499:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;4532:8;;1332:14;;1328:37;;;1360:5;;;1328:37;4568:1;4561:8;;4556:149;4573:6;:13;4571:15;;4556:149;;;4622:5;-1:-1:-1;;;;;4609:18:0;:6;4616:1;4609:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4609:9:0;-1:-1:-1;;;;;4609:18:0;;4605:100;;;4659:8;4647:6;4654:1;4647:9;;;;;;;;;;;;;;;;;;;;:20;;;;;-1:-1:-1;;;;;4647:20:0;;;;;-1:-1:-1;;;;;4647:20:0;;;;;;4685:5;;4605:100;4556:149;4588:3;;;;;4556:149;;;-1:-1:-1;;;;;4714:14:0;;;4731:5;4714:14;;;:7;:14;;;;;;:22;;-1:-1:-1;;4714:22:0;;;;;;4746:17;;;;;;;;:24;;;;;4714:22;4746:24;;;;4780:19;;4714:14;;4780:19;;;4809:23;;-1:-1:-1;;;;;4809:23:0;;;;;;;;1375:1;1483;;1262;;4390:449;;;;:::o;3622:472:1:-;3808:22;1996:27:0;;;;;;;;;;:36;;;3705:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3743:13:1;1298:26;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1463:17;;1428:32;;;;:17;:32;;;;;;3779:13;;1428:52;1409:15;:71;;1401:80;;;;;;3833:12;:27;;;;;;;;;;;;3870:11;;;:18;;-1:-1:-1;;3870:18:1;3884:4;3870:18;;;;;;3902:14;;3928:8;;;;3902:44;;3938:7;;;;3902:44;;3833:27;;-1:-1:-1;;;;;;3902:14:1;;;;3928:8;3938:7;;3902:44;;;;3938:7;;-1:-1:-1;;3902:44:1;;;;3870:18;3902:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3898:190;;;3960:24;;3970:13;;3960:24;;;;;3898:190;;;4013:31;;4030:13;;4013:31;;;;;4058:11;;;:19;;-1:-1:-1;;4058:19:1;;;3898:190;1491:1;1335;;2061::0;;3622:472:1;;;;:::o;4135:471:2:-;4242:13;4291:5;4299:1;4291:9;4279:1;:8;:21;;4271:30;;;;;;;;-1:-1:-1;4357:2:2;4350:3;;4344:5;-1:-1:-1;;;;;;4488:3:2;4135:471;;;;;:::o;4204:223:1:-;4307:32;;;;:17;:32;;;;;;;;;:51;;;4368:52;;;;;;;4325:13;;4368:52;;;;;;;;;4204:223;;;:::o;7994:451:0:-;8126:18;8096:11;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;8176:16;;8232:140;;;;;;;;-1:-1:-1;;;;;8232:140:0;;;;;;;;;;;;;;;;;;-1:-1:-1;8232:140:0;;;;;;8202:27;;;;;;;;;;:170;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;-1:-1:-1;8202:170:0;;;;;;;8176:16;;-1:-1:-1;8232:140:0;;8202:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8202:170:0;;;;;;;;;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;8382:16;:21;;-1:-1:-1;8382:21:0;;;8413:25;;8424:13;;8413:25;;-1:-1:-1;;8413:25:0;2166:1;7994:451;;;;;;;:::o;663:3945:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;663:3945:2;;;:::o;:::-;;;;;;;;;;-1:-1:-1;663:3945:2;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;663:3945:2;;;-1:-1:-1;663:3945:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o",
+ "linkReferences": {}
+ },
+ "methodIdentifiers": {
+ "MAX_OWNER_COUNT()": "d74f8edd",
+ "addOwner(address)": "7065cb48",
+ "changeRequirement(uint256)": "ba51a6df",
+ "changeTimeLock(uint256)": "7ad28c51",
+ "confirmTransaction(uint256)": "c01a8c84",
+ "confirmationTimes(uint256)": "d38f2d82",
+ "confirmations(uint256,address)": "3411c81c",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "3589b35c",
+ "executeTransaction(uint256)": "ee22610b",
+ "getConfirmationCount(uint256)": "8b51d13f",
+ "getConfirmations(uint256)": "b5dc40c3",
+ "getOwners()": "a0e67e2b",
+ "getTransactionCount(bool,bool)": "54741525",
+ "getTransactionIds(uint256,uint256,bool,bool)": "a8abe69a",
+ "isAssetProxyRegistered(address)": "83250f79",
+ "isConfirmed(uint256)": "784547a7",
+ "isOwner(address)": "2f54bf6e",
+ "owners(uint256)": "025e7c27",
+ "registerAssetProxy(address,bool)": "5a1a66af",
+ "removeOwner(address)": "173825d9",
+ "replaceOwner(address,address)": "e20056e6",
+ "required()": "dc8452cd",
+ "revokeConfirmation(uint256)": "20ea8d86",
+ "secondsTimeLocked()": "37bd78a0",
+ "submitTransaction(address,uint256,bytes)": "c6427474",
+ "transactionCount()": "b77bf600",
+ "transactions(uint256)": "9ace38c2"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "1426800",
+ "executionCost": "infinite"
+ },
+ "internal": {
+ "readBytes4(bytes memory,uint256)": "infinite"
+ },
+ "external": {
+ "": "2187",
+ "MAX_OWNER_COUNT()": "1550",
+ "addOwner(address)": "infinite",
+ "changeRequirement(uint256)": "21901",
+ "changeTimeLock(uint256)": "21560",
+ "confirmTransaction(uint256)": "infinite",
+ "confirmationTimes(uint256)": "1550",
+ "confirmations(uint256,address)": "1550",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "infinite",
+ "executeTransaction(uint256)": "infinite",
+ "getConfirmationCount(uint256)": "infinite",
+ "getConfirmations(uint256)": "infinite",
+ "getOwners()": "infinite",
+ "getTransactionCount(bool,bool)": "infinite",
+ "getTransactionIds(uint256,uint256,bool,bool)": "infinite",
+ "isAssetProxyRegistered(address)": "1550",
+ "isConfirmed(uint256)": "infinite",
+ "isOwner(address)": "1550",
+ "owners(uint256)": "1550",
+ "registerAssetProxy(address,bool)": "22074",
+ "removeOwner(address)": "infinite",
+ "replaceOwner(address,address)": "infinite",
+ "required()": "1550",
+ "revokeConfirmation(uint256)": "infinite",
+ "secondsTimeLocked()": "1550",
+ "submitTransaction(address,uint256,bytes)": "infinite",
+ "transactionCount()": "1550",
+ "transactions(uint256)": "infinite"
+ }
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/multisig/MultiSigWallet.sol": {
+ "id": "0",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 458,
+ "name": "PragmaDirective",
+ "src": "19:24:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 1419
+ ],
+ "name": "MultiSigWallet"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "MAX_OWNER_COUNT",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 459,
+ "name": "ElementaryTypeName",
+ "src": "237:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3530",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 50",
+ "value": "50"
+ },
+ "id": 460,
+ "name": "Literal",
+ "src": "276:2:0"
+ }
+ ],
+ "id": 461,
+ "name": "VariableDeclaration",
+ "src": "237:41:0"
+ },
+ {
+ "attributes": {
+ "name": "Confirmation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 462,
+ "name": "ElementaryTypeName",
+ "src": "304:7:0"
+ }
+ ],
+ "id": 463,
+ "name": "VariableDeclaration",
+ "src": "304:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 464,
+ "name": "ElementaryTypeName",
+ "src": "328:4:0"
+ }
+ ],
+ "id": 465,
+ "name": "VariableDeclaration",
+ "src": "328:26:0"
+ }
+ ],
+ "id": 466,
+ "name": "ParameterList",
+ "src": "303:52:0"
+ }
+ ],
+ "id": 467,
+ "name": "EventDefinition",
+ "src": "285:71:0"
+ },
+ {
+ "attributes": {
+ "name": "Revocation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 468,
+ "name": "ElementaryTypeName",
+ "src": "378:7:0"
+ }
+ ],
+ "id": 469,
+ "name": "VariableDeclaration",
+ "src": "378:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 470,
+ "name": "ElementaryTypeName",
+ "src": "402:4:0"
+ }
+ ],
+ "id": 471,
+ "name": "VariableDeclaration",
+ "src": "402:26:0"
+ }
+ ],
+ "id": 472,
+ "name": "ParameterList",
+ "src": "377:52:0"
+ }
+ ],
+ "id": 473,
+ "name": "EventDefinition",
+ "src": "361:69:0"
+ },
+ {
+ "attributes": {
+ "name": "Submission"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 474,
+ "name": "ElementaryTypeName",
+ "src": "452:4:0"
+ }
+ ],
+ "id": 475,
+ "name": "VariableDeclaration",
+ "src": "452:26:0"
+ }
+ ],
+ "id": 476,
+ "name": "ParameterList",
+ "src": "451:28:0"
+ }
+ ],
+ "id": 477,
+ "name": "EventDefinition",
+ "src": "435:45:0"
+ },
+ {
+ "attributes": {
+ "name": "Execution"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 478,
+ "name": "ElementaryTypeName",
+ "src": "501:4:0"
+ }
+ ],
+ "id": 479,
+ "name": "VariableDeclaration",
+ "src": "501:26:0"
+ }
+ ],
+ "id": 480,
+ "name": "ParameterList",
+ "src": "500:28:0"
+ }
+ ],
+ "id": 481,
+ "name": "EventDefinition",
+ "src": "485:44:0"
+ },
+ {
+ "attributes": {
+ "name": "ExecutionFailure"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 482,
+ "name": "ElementaryTypeName",
+ "src": "557:4:0"
+ }
+ ],
+ "id": 483,
+ "name": "VariableDeclaration",
+ "src": "557:26:0"
+ }
+ ],
+ "id": 484,
+ "name": "ParameterList",
+ "src": "556:28:0"
+ }
+ ],
+ "id": 485,
+ "name": "EventDefinition",
+ "src": "534:51:0"
+ },
+ {
+ "attributes": {
+ "name": "Deposit"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 486,
+ "name": "ElementaryTypeName",
+ "src": "604:7:0"
+ }
+ ],
+ "id": 487,
+ "name": "VariableDeclaration",
+ "src": "604:22:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 488,
+ "name": "ElementaryTypeName",
+ "src": "628:4:0"
+ }
+ ],
+ "id": 489,
+ "name": "VariableDeclaration",
+ "src": "628:10:0"
+ }
+ ],
+ "id": 490,
+ "name": "ParameterList",
+ "src": "603:36:0"
+ }
+ ],
+ "id": 491,
+ "name": "EventDefinition",
+ "src": "590:50:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerAddition"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 492,
+ "name": "ElementaryTypeName",
+ "src": "665:7:0"
+ }
+ ],
+ "id": 493,
+ "name": "VariableDeclaration",
+ "src": "665:21:0"
+ }
+ ],
+ "id": 494,
+ "name": "ParameterList",
+ "src": "664:23:0"
+ }
+ ],
+ "id": 495,
+ "name": "EventDefinition",
+ "src": "645:43:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerRemoval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 496,
+ "name": "ElementaryTypeName",
+ "src": "712:7:0"
+ }
+ ],
+ "id": 497,
+ "name": "VariableDeclaration",
+ "src": "712:21:0"
+ }
+ ],
+ "id": 498,
+ "name": "ParameterList",
+ "src": "711:23:0"
+ }
+ ],
+ "id": 499,
+ "name": "EventDefinition",
+ "src": "693:42:0"
+ },
+ {
+ "attributes": {
+ "name": "RequirementChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 500,
+ "name": "ElementaryTypeName",
+ "src": "764:4:0"
+ }
+ ],
+ "id": 501,
+ "name": "VariableDeclaration",
+ "src": "764:13:0"
+ }
+ ],
+ "id": 502,
+ "name": "ParameterList",
+ "src": "763:15:0"
+ }
+ ],
+ "id": 503,
+ "name": "EventDefinition",
+ "src": "740:39:0"
+ },
+ {
+ "attributes": {
+ "name": "transactions",
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 504,
+ "name": "ElementaryTypeName",
+ "src": "794:4:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 505,
+ "name": "UserDefinedTypeName",
+ "src": "802:11:0"
+ }
+ ],
+ "id": 506,
+ "name": "Mapping",
+ "src": "785:29:0"
+ }
+ ],
+ "id": 507,
+ "name": "VariableDeclaration",
+ "src": "785:49:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmations",
+ "type": "mapping(uint256 => mapping(address => bool))"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 508,
+ "name": "ElementaryTypeName",
+ "src": "849:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 509,
+ "name": "ElementaryTypeName",
+ "src": "866:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 510,
+ "name": "ElementaryTypeName",
+ "src": "877:4:0"
+ }
+ ],
+ "id": 511,
+ "name": "Mapping",
+ "src": "857:25:0"
+ }
+ ],
+ "id": 512,
+ "name": "Mapping",
+ "src": "840:43:0"
+ }
+ ],
+ "id": 513,
+ "name": "VariableDeclaration",
+ "src": "840:64:0"
+ },
+ {
+ "attributes": {
+ "name": "isOwner",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 514,
+ "name": "ElementaryTypeName",
+ "src": "919:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 515,
+ "name": "ElementaryTypeName",
+ "src": "930:4:0"
+ }
+ ],
+ "id": 516,
+ "name": "Mapping",
+ "src": "910:25:0"
+ }
+ ],
+ "id": 517,
+ "name": "VariableDeclaration",
+ "src": "910:40:0"
+ },
+ {
+ "attributes": {
+ "name": "owners",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 518,
+ "name": "ElementaryTypeName",
+ "src": "956:7:0"
+ }
+ ],
+ "id": 519,
+ "name": "ArrayTypeName",
+ "src": "956:9:0"
+ }
+ ],
+ "id": 520,
+ "name": "VariableDeclaration",
+ "src": "956:23:0"
+ },
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 521,
+ "name": "ElementaryTypeName",
+ "src": "985:4:0"
+ }
+ ],
+ "id": 522,
+ "name": "VariableDeclaration",
+ "src": "985:20:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 523,
+ "name": "ElementaryTypeName",
+ "src": "1011:4:0"
+ }
+ ],
+ "id": 524,
+ "name": "VariableDeclaration",
+ "src": "1011:28:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 525,
+ "name": "ElementaryTypeName",
+ "src": "1075:7:0"
+ }
+ ],
+ "id": 526,
+ "name": "VariableDeclaration",
+ "src": "1075:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 527,
+ "name": "ElementaryTypeName",
+ "src": "1104:4:0"
+ }
+ ],
+ "id": 528,
+ "name": "VariableDeclaration",
+ "src": "1104:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 529,
+ "name": "ElementaryTypeName",
+ "src": "1124:5:0"
+ }
+ ],
+ "id": 530,
+ "name": "VariableDeclaration",
+ "src": "1124:10:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 531,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 532,
+ "name": "VariableDeclaration",
+ "src": "1144:13:0"
+ }
+ ],
+ "id": 533,
+ "name": "StructDefinition",
+ "src": "1046:118:0"
+ },
+ {
+ "attributes": {
+ "name": "onlyWallet"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 534,
+ "name": "ParameterList",
+ "src": "1189:2:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 535,
+ "name": "Identifier",
+ "src": "1206:3:0"
+ }
+ ],
+ "id": 536,
+ "name": "MemberAccess",
+ "src": "1206:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 537,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1220:7:0"
+ },
+ {
+ "attributes": {
+ "type": "contract MultiSigWallet",
+ "value": "this"
+ },
+ "id": 538,
+ "name": "Identifier",
+ "src": "1228:4:0"
+ }
+ ],
+ "id": 539,
+ "name": "FunctionCall",
+ "src": "1220:13:0"
+ }
+ ],
+ "id": 540,
+ "name": "BinaryOperation",
+ "src": "1206:27:0"
+ },
+ {
+ "children": [],
+ "id": 541,
+ "name": "Throw",
+ "src": "1247:5:0"
+ }
+ ],
+ "id": 542,
+ "name": "IfStatement",
+ "src": "1202:50:0"
+ },
+ {
+ "id": 543,
+ "name": "PlaceholderStatement",
+ "src": "1262:1:0"
+ }
+ ],
+ "id": 544,
+ "name": "Block",
+ "src": "1192:78:0"
+ }
+ ],
+ "id": 545,
+ "name": "ModifierDefinition",
+ "src": "1170:100:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerDoesNotExist"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 546,
+ "name": "ElementaryTypeName",
+ "src": "1303:7:0"
+ }
+ ],
+ "id": 547,
+ "name": "VariableDeclaration",
+ "src": "1303:13:0"
+ }
+ ],
+ "id": 548,
+ "name": "ParameterList",
+ "src": "1302:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 549,
+ "name": "Identifier",
+ "src": "1332:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 550,
+ "name": "Identifier",
+ "src": "1340:5:0"
+ }
+ ],
+ "id": 551,
+ "name": "IndexAccess",
+ "src": "1332:14:0"
+ },
+ {
+ "children": [],
+ "id": 552,
+ "name": "Throw",
+ "src": "1360:5:0"
+ }
+ ],
+ "id": 553,
+ "name": "IfStatement",
+ "src": "1328:37:0"
+ },
+ {
+ "id": 554,
+ "name": "PlaceholderStatement",
+ "src": "1375:1:0"
+ }
+ ],
+ "id": 555,
+ "name": "Block",
+ "src": "1318:65:0"
+ }
+ ],
+ "id": 556,
+ "name": "ModifierDefinition",
+ "src": "1276:107:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 557,
+ "name": "ElementaryTypeName",
+ "src": "1410:7:0"
+ }
+ ],
+ "id": 558,
+ "name": "VariableDeclaration",
+ "src": "1410:13:0"
+ }
+ ],
+ "id": 559,
+ "name": "ParameterList",
+ "src": "1409:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 560,
+ "name": "Identifier",
+ "src": "1440:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 561,
+ "name": "Identifier",
+ "src": "1448:5:0"
+ }
+ ],
+ "id": 562,
+ "name": "IndexAccess",
+ "src": "1440:14:0"
+ }
+ ],
+ "id": 563,
+ "name": "UnaryOperation",
+ "src": "1439:15:0"
+ },
+ {
+ "children": [],
+ "id": 564,
+ "name": "Throw",
+ "src": "1468:5:0"
+ }
+ ],
+ "id": 565,
+ "name": "IfStatement",
+ "src": "1435:38:0"
+ },
+ {
+ "id": 566,
+ "name": "PlaceholderStatement",
+ "src": "1483:1:0"
+ }
+ ],
+ "id": 567,
+ "name": "Block",
+ "src": "1425:66:0"
+ }
+ ],
+ "id": 568,
+ "name": "ModifierDefinition",
+ "src": "1389:102:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 569,
+ "name": "ElementaryTypeName",
+ "src": "1524:4:0"
+ }
+ ],
+ "id": 570,
+ "name": "VariableDeclaration",
+ "src": "1524:18:0"
+ }
+ ],
+ "id": 571,
+ "name": "ParameterList",
+ "src": "1523:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 572,
+ "name": "Identifier",
+ "src": "1558:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 573,
+ "name": "Identifier",
+ "src": "1571:13:0"
+ }
+ ],
+ "id": 574,
+ "name": "IndexAccess",
+ "src": "1558:27:0"
+ }
+ ],
+ "id": 575,
+ "name": "MemberAccess",
+ "src": "1558:39:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 576,
+ "name": "Literal",
+ "src": "1601:1:0"
+ }
+ ],
+ "id": 577,
+ "name": "BinaryOperation",
+ "src": "1558:44:0"
+ },
+ {
+ "children": [],
+ "id": 578,
+ "name": "Throw",
+ "src": "1616:5:0"
+ }
+ ],
+ "id": 579,
+ "name": "IfStatement",
+ "src": "1554:67:0"
+ },
+ {
+ "id": 580,
+ "name": "PlaceholderStatement",
+ "src": "1631:1:0"
+ }
+ ],
+ "id": 581,
+ "name": "Block",
+ "src": "1544:95:0"
+ }
+ ],
+ "id": 582,
+ "name": "ModifierDefinition",
+ "src": "1497:142:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 583,
+ "name": "ElementaryTypeName",
+ "src": "1664:4:0"
+ }
+ ],
+ "id": 584,
+ "name": "VariableDeclaration",
+ "src": "1664:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 585,
+ "name": "ElementaryTypeName",
+ "src": "1684:7:0"
+ }
+ ],
+ "id": 586,
+ "name": "VariableDeclaration",
+ "src": "1684:13:0"
+ }
+ ],
+ "id": 587,
+ "name": "ParameterList",
+ "src": "1663:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 588,
+ "name": "Identifier",
+ "src": "1714:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 589,
+ "name": "Identifier",
+ "src": "1728:13:0"
+ }
+ ],
+ "id": 590,
+ "name": "IndexAccess",
+ "src": "1714:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 591,
+ "name": "Identifier",
+ "src": "1743:5:0"
+ }
+ ],
+ "id": 592,
+ "name": "IndexAccess",
+ "src": "1714:35:0"
+ }
+ ],
+ "id": 593,
+ "name": "UnaryOperation",
+ "src": "1713:36:0"
+ },
+ {
+ "children": [],
+ "id": 594,
+ "name": "Throw",
+ "src": "1763:5:0"
+ }
+ ],
+ "id": 595,
+ "name": "IfStatement",
+ "src": "1709:59:0"
+ },
+ {
+ "id": 596,
+ "name": "PlaceholderStatement",
+ "src": "1778:1:0"
+ }
+ ],
+ "id": 597,
+ "name": "Block",
+ "src": "1699:87:0"
+ }
+ ],
+ "id": 598,
+ "name": "ModifierDefinition",
+ "src": "1645:141:0"
+ },
+ {
+ "attributes": {
+ "name": "notConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 599,
+ "name": "ElementaryTypeName",
+ "src": "1814:4:0"
+ }
+ ],
+ "id": 600,
+ "name": "VariableDeclaration",
+ "src": "1814:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 601,
+ "name": "ElementaryTypeName",
+ "src": "1834:7:0"
+ }
+ ],
+ "id": 602,
+ "name": "VariableDeclaration",
+ "src": "1834:13:0"
+ }
+ ],
+ "id": 603,
+ "name": "ParameterList",
+ "src": "1813:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 604,
+ "name": "Identifier",
+ "src": "1863:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 605,
+ "name": "Identifier",
+ "src": "1877:13:0"
+ }
+ ],
+ "id": 606,
+ "name": "IndexAccess",
+ "src": "1863:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 607,
+ "name": "Identifier",
+ "src": "1892:5:0"
+ }
+ ],
+ "id": 608,
+ "name": "IndexAccess",
+ "src": "1863:35:0"
+ },
+ {
+ "children": [],
+ "id": 609,
+ "name": "Throw",
+ "src": "1912:5:0"
+ }
+ ],
+ "id": 610,
+ "name": "IfStatement",
+ "src": "1859:58:0"
+ },
+ {
+ "id": 611,
+ "name": "PlaceholderStatement",
+ "src": "1927:1:0"
+ }
+ ],
+ "id": 612,
+ "name": "Block",
+ "src": "1849:86:0"
+ }
+ ],
+ "id": 613,
+ "name": "ModifierDefinition",
+ "src": "1792:143:0"
+ },
+ {
+ "attributes": {
+ "name": "notExecuted"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 614,
+ "name": "ElementaryTypeName",
+ "src": "1962:4:0"
+ }
+ ],
+ "id": 615,
+ "name": "VariableDeclaration",
+ "src": "1962:18:0"
+ }
+ ],
+ "id": 616,
+ "name": "ParameterList",
+ "src": "1961:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 617,
+ "name": "Identifier",
+ "src": "1996:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 618,
+ "name": "Identifier",
+ "src": "2009:13:0"
+ }
+ ],
+ "id": 619,
+ "name": "IndexAccess",
+ "src": "1996:27:0"
+ }
+ ],
+ "id": 620,
+ "name": "MemberAccess",
+ "src": "1996:36:0"
+ },
+ {
+ "children": [],
+ "id": 621,
+ "name": "Throw",
+ "src": "2046:5:0"
+ }
+ ],
+ "id": 622,
+ "name": "IfStatement",
+ "src": "1992:59:0"
+ },
+ {
+ "id": 623,
+ "name": "PlaceholderStatement",
+ "src": "2061:1:0"
+ }
+ ],
+ "id": 624,
+ "name": "Block",
+ "src": "1982:87:0"
+ }
+ ],
+ "id": 625,
+ "name": "ModifierDefinition",
+ "src": "1941:128:0"
+ },
+ {
+ "attributes": {
+ "name": "notNull"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_address",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 626,
+ "name": "ElementaryTypeName",
+ "src": "2092:7:0"
+ }
+ ],
+ "id": 627,
+ "name": "VariableDeclaration",
+ "src": "2092:16:0"
+ }
+ ],
+ "id": 628,
+ "name": "ParameterList",
+ "src": "2091:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_address"
+ },
+ "id": 629,
+ "name": "Identifier",
+ "src": "2124:8:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 630,
+ "name": "Literal",
+ "src": "2136:1:0"
+ }
+ ],
+ "id": 631,
+ "name": "BinaryOperation",
+ "src": "2124:13:0"
+ },
+ {
+ "children": [],
+ "id": 632,
+ "name": "Throw",
+ "src": "2151:5:0"
+ }
+ ],
+ "id": 633,
+ "name": "IfStatement",
+ "src": "2120:36:0"
+ },
+ {
+ "id": 634,
+ "name": "PlaceholderStatement",
+ "src": "2166:1:0"
+ }
+ ],
+ "id": 635,
+ "name": "Block",
+ "src": "2110:64:0"
+ }
+ ],
+ "id": 636,
+ "name": "ModifierDefinition",
+ "src": "2075:99:0"
+ },
+ {
+ "attributes": {
+ "name": "validRequirement"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ownerCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 637,
+ "name": "ElementaryTypeName",
+ "src": "2206:4:0"
+ }
+ ],
+ "id": 638,
+ "name": "VariableDeclaration",
+ "src": "2206:15:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 639,
+ "name": "ElementaryTypeName",
+ "src": "2223:4:0"
+ }
+ ],
+ "id": 640,
+ "name": "VariableDeclaration",
+ "src": "2223:14:0"
+ }
+ ],
+ "id": 641,
+ "name": "ParameterList",
+ "src": "2205:33:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 642,
+ "name": "Identifier",
+ "src": "2256:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_OWNER_COUNT"
+ },
+ "id": 643,
+ "name": "Identifier",
+ "src": "2269:15:0"
+ }
+ ],
+ "id": 644,
+ "name": "BinaryOperation",
+ "src": "2256:28:0"
+ },
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 645,
+ "name": "Identifier",
+ "src": "2300:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 646,
+ "name": "Identifier",
+ "src": "2312:10:0"
+ }
+ ],
+ "id": 647,
+ "name": "BinaryOperation",
+ "src": "2300:22:0"
+ }
+ ],
+ "id": 648,
+ "name": "BinaryOperation",
+ "src": "2256:66:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 649,
+ "name": "Identifier",
+ "src": "2338:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 650,
+ "name": "Literal",
+ "src": "2351:1:0"
+ }
+ ],
+ "id": 651,
+ "name": "BinaryOperation",
+ "src": "2338:14:0"
+ }
+ ],
+ "id": 652,
+ "name": "BinaryOperation",
+ "src": "2256:96:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 653,
+ "name": "Identifier",
+ "src": "2368:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 654,
+ "name": "Literal",
+ "src": "2382:1:0"
+ }
+ ],
+ "id": 655,
+ "name": "BinaryOperation",
+ "src": "2368:15:0"
+ }
+ ],
+ "id": 656,
+ "name": "BinaryOperation",
+ "src": "2256:127:0"
+ },
+ {
+ "children": [],
+ "id": 657,
+ "name": "Throw",
+ "src": "2397:5:0"
+ }
+ ],
+ "id": 658,
+ "name": "IfStatement",
+ "src": "2249:153:0"
+ },
+ {
+ "id": 659,
+ "name": "PlaceholderStatement",
+ "src": "2412:1:0"
+ }
+ ],
+ "id": 660,
+ "name": "Block",
+ "src": "2239:181:0"
+ }
+ ],
+ "id": 661,
+ "name": "ModifierDefinition",
+ "src": "2180:240:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "payable": true,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 662,
+ "name": "ParameterList",
+ "src": "2490:2:0"
+ },
+ {
+ "children": [],
+ "id": 663,
+ "name": "ParameterList",
+ "src": "2513:0:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 664,
+ "name": "Identifier",
+ "src": "2527:3:0"
+ }
+ ],
+ "id": 665,
+ "name": "MemberAccess",
+ "src": "2527:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 666,
+ "name": "Literal",
+ "src": "2539:1:0"
+ }
+ ],
+ "id": 667,
+ "name": "BinaryOperation",
+ "src": "2527:13:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Deposit"
+ },
+ "id": 668,
+ "name": "Identifier",
+ "src": "2554:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 669,
+ "name": "Identifier",
+ "src": "2562:3:0"
+ }
+ ],
+ "id": 670,
+ "name": "MemberAccess",
+ "src": "2562:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 671,
+ "name": "Identifier",
+ "src": "2574:3:0"
+ }
+ ],
+ "id": 672,
+ "name": "MemberAccess",
+ "src": "2574:9:0"
+ }
+ ],
+ "id": 673,
+ "name": "FunctionCall",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 674,
+ "name": "ExpressionStatement",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 675,
+ "name": "IfStatement",
+ "src": "2523:61:0"
+ }
+ ],
+ "id": 676,
+ "name": "Block",
+ "src": "2513:78:0"
+ }
+ ],
+ "id": 677,
+ "name": "FunctionDefinition",
+ "src": "2482:109:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWallet",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 678,
+ "name": "ElementaryTypeName",
+ "src": "2858:7:0"
+ }
+ ],
+ "id": 679,
+ "name": "ArrayTypeName",
+ "src": "2858:9:0"
+ }
+ ],
+ "id": 680,
+ "name": "VariableDeclaration",
+ "src": "2858:17:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 681,
+ "name": "ElementaryTypeName",
+ "src": "2877:4:0"
+ }
+ ],
+ "id": 682,
+ "name": "VariableDeclaration",
+ "src": "2877:14:0"
+ }
+ ],
+ "id": 683,
+ "name": "ParameterList",
+ "src": "2857:35:0"
+ },
+ {
+ "children": [],
+ "id": 689,
+ "name": "ParameterList",
+ "src": "2964:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 684,
+ "name": "Identifier",
+ "src": "2916:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 685,
+ "name": "Identifier",
+ "src": "2933:7:0"
+ }
+ ],
+ "id": 686,
+ "name": "MemberAccess",
+ "src": "2933:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 687,
+ "name": "Identifier",
+ "src": "2949:9:0"
+ }
+ ],
+ "id": 688,
+ "name": "ModifierInvocation",
+ "src": "2916:43:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 690,
+ "name": "ElementaryTypeName",
+ "src": "2979:4:0"
+ }
+ ],
+ "id": 691,
+ "name": "VariableDeclaration",
+ "src": "2979:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 692,
+ "name": "Literal",
+ "src": "2986:1:0"
+ }
+ ],
+ "id": 693,
+ "name": "VariableDeclarationStatement",
+ "src": "2979:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 694,
+ "name": "Identifier",
+ "src": "2989:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 695,
+ "name": "Identifier",
+ "src": "2991:7:0"
+ }
+ ],
+ "id": 696,
+ "name": "MemberAccess",
+ "src": "2991:14:0"
+ }
+ ],
+ "id": 697,
+ "name": "BinaryOperation",
+ "src": "2989:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 698,
+ "name": "Identifier",
+ "src": "3007:1:0"
+ }
+ ],
+ "id": 699,
+ "name": "UnaryOperation",
+ "src": "3007:3:0"
+ }
+ ],
+ "id": 700,
+ "name": "ExpressionStatement",
+ "src": "3007:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 701,
+ "name": "Identifier",
+ "src": "3030:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 702,
+ "name": "Identifier",
+ "src": "3038:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 703,
+ "name": "Identifier",
+ "src": "3046:1:0"
+ }
+ ],
+ "id": 704,
+ "name": "IndexAccess",
+ "src": "3038:10:0"
+ }
+ ],
+ "id": 705,
+ "name": "IndexAccess",
+ "src": "3030:19:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 706,
+ "name": "Identifier",
+ "src": "3053:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 707,
+ "name": "Identifier",
+ "src": "3061:1:0"
+ }
+ ],
+ "id": 708,
+ "name": "IndexAccess",
+ "src": "3053:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 709,
+ "name": "Literal",
+ "src": "3067:1:0"
+ }
+ ],
+ "id": 710,
+ "name": "BinaryOperation",
+ "src": "3053:15:0"
+ }
+ ],
+ "id": 711,
+ "name": "BinaryOperation",
+ "src": "3030:38:0"
+ },
+ {
+ "children": [],
+ "id": 712,
+ "name": "Throw",
+ "src": "3086:5:0"
+ }
+ ],
+ "id": 713,
+ "name": "IfStatement",
+ "src": "3026:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 714,
+ "name": "Identifier",
+ "src": "3105:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 715,
+ "name": "Identifier",
+ "src": "3113:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 716,
+ "name": "Identifier",
+ "src": "3121:1:0"
+ }
+ ],
+ "id": 717,
+ "name": "IndexAccess",
+ "src": "3113:10:0"
+ }
+ ],
+ "id": 718,
+ "name": "IndexAccess",
+ "src": "3105:19:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 719,
+ "name": "Literal",
+ "src": "3127:4:0"
+ }
+ ],
+ "id": 720,
+ "name": "Assignment",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 721,
+ "name": "ExpressionStatement",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 722,
+ "name": "Block",
+ "src": "3012:130:0"
+ }
+ ],
+ "id": 723,
+ "name": "ForStatement",
+ "src": "2974:168:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 724,
+ "name": "Identifier",
+ "src": "3151:6:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 725,
+ "name": "Identifier",
+ "src": "3160:7:0"
+ }
+ ],
+ "id": 726,
+ "name": "Assignment",
+ "src": "3151:16:0"
+ }
+ ],
+ "id": 727,
+ "name": "ExpressionStatement",
+ "src": "3151:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 728,
+ "name": "Identifier",
+ "src": "3177:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 729,
+ "name": "Identifier",
+ "src": "3188:9:0"
+ }
+ ],
+ "id": 730,
+ "name": "Assignment",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 731,
+ "name": "ExpressionStatement",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 732,
+ "name": "Block",
+ "src": "2964:240:0"
+ }
+ ],
+ "id": 733,
+ "name": "FunctionDefinition",
+ "src": "2834:370:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 734,
+ "name": "ElementaryTypeName",
+ "src": "3349:7:0"
+ }
+ ],
+ "id": 735,
+ "name": "VariableDeclaration",
+ "src": "3349:13:0"
+ }
+ ],
+ "id": 736,
+ "name": "ParameterList",
+ "src": "3348:15:0"
+ },
+ {
+ "children": [],
+ "id": 752,
+ "name": "ParameterList",
+ "src": "3512:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 737,
+ "name": "Identifier",
+ "src": "3387:10:0"
+ }
+ ],
+ "id": 738,
+ "name": "ModifierInvocation",
+ "src": "3387:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 739,
+ "name": "Identifier",
+ "src": "3406:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 740,
+ "name": "Identifier",
+ "src": "3424:5:0"
+ }
+ ],
+ "id": 741,
+ "name": "ModifierInvocation",
+ "src": "3406:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 742,
+ "name": "Identifier",
+ "src": "3439:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 743,
+ "name": "Identifier",
+ "src": "3447:5:0"
+ }
+ ],
+ "id": 744,
+ "name": "ModifierInvocation",
+ "src": "3439:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 745,
+ "name": "Identifier",
+ "src": "3462:16:0"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 746,
+ "name": "Identifier",
+ "src": "3479:6:0"
+ }
+ ],
+ "id": 747,
+ "name": "MemberAccess",
+ "src": "3479:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 748,
+ "name": "Literal",
+ "src": "3495:1:0"
+ }
+ ],
+ "id": 749,
+ "name": "BinaryOperation",
+ "src": "3479:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 750,
+ "name": "Identifier",
+ "src": "3498:8:0"
+ }
+ ],
+ "id": 751,
+ "name": "ModifierInvocation",
+ "src": "3462:45:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 753,
+ "name": "Identifier",
+ "src": "3522:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 754,
+ "name": "Identifier",
+ "src": "3530:5:0"
+ }
+ ],
+ "id": 755,
+ "name": "IndexAccess",
+ "src": "3522:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 756,
+ "name": "Literal",
+ "src": "3539:4:0"
+ }
+ ],
+ "id": 757,
+ "name": "Assignment",
+ "src": "3522:21:0"
+ }
+ ],
+ "id": 758,
+ "name": "ExpressionStatement",
+ "src": "3522:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "push",
+ "type": "function (address) returns (uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 759,
+ "name": "Identifier",
+ "src": "3553:6:0"
+ }
+ ],
+ "id": 761,
+ "name": "MemberAccess",
+ "src": "3553:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 762,
+ "name": "Identifier",
+ "src": "3565:5:0"
+ }
+ ],
+ "id": 763,
+ "name": "FunctionCall",
+ "src": "3553:18:0"
+ }
+ ],
+ "id": 764,
+ "name": "ExpressionStatement",
+ "src": "3553:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 765,
+ "name": "Identifier",
+ "src": "3581:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 766,
+ "name": "Identifier",
+ "src": "3595:5:0"
+ }
+ ],
+ "id": 767,
+ "name": "FunctionCall",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 768,
+ "name": "ExpressionStatement",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 769,
+ "name": "Block",
+ "src": "3512:96:0"
+ }
+ ],
+ "id": 770,
+ "name": "FunctionDefinition",
+ "src": "3331:277:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "removeOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 771,
+ "name": "ElementaryTypeName",
+ "src": "3752:7:0"
+ }
+ ],
+ "id": 772,
+ "name": "VariableDeclaration",
+ "src": "3752:13:0"
+ }
+ ],
+ "id": 773,
+ "name": "ParameterList",
+ "src": "3751:15:0"
+ },
+ {
+ "children": [],
+ "id": 779,
+ "name": "ParameterList",
+ "src": "3832:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 774,
+ "name": "Identifier",
+ "src": "3790:10:0"
+ }
+ ],
+ "id": 775,
+ "name": "ModifierInvocation",
+ "src": "3790:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 776,
+ "name": "Identifier",
+ "src": "3809:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 777,
+ "name": "Identifier",
+ "src": "3821:5:0"
+ }
+ ],
+ "id": 778,
+ "name": "ModifierInvocation",
+ "src": "3809:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 780,
+ "name": "Identifier",
+ "src": "3842:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 781,
+ "name": "Identifier",
+ "src": "3850:5:0"
+ }
+ ],
+ "id": 782,
+ "name": "IndexAccess",
+ "src": "3842:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 783,
+ "name": "Literal",
+ "src": "3859:5:0"
+ }
+ ],
+ "id": 784,
+ "name": "Assignment",
+ "src": "3842:22:0"
+ }
+ ],
+ "id": 785,
+ "name": "ExpressionStatement",
+ "src": "3842:22:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 786,
+ "name": "ElementaryTypeName",
+ "src": "3879:4:0"
+ }
+ ],
+ "id": 787,
+ "name": "VariableDeclaration",
+ "src": "3879:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 788,
+ "name": "Literal",
+ "src": "3886:1:0"
+ }
+ ],
+ "id": 789,
+ "name": "VariableDeclarationStatement",
+ "src": "3879:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 790,
+ "name": "Identifier",
+ "src": "3889:1:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 791,
+ "name": "Identifier",
+ "src": "3891:6:0"
+ }
+ ],
+ "id": 792,
+ "name": "MemberAccess",
+ "src": "3891:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 793,
+ "name": "Literal",
+ "src": "3907:1:0"
+ }
+ ],
+ "id": 794,
+ "name": "BinaryOperation",
+ "src": "3891:17:0"
+ }
+ ],
+ "id": 795,
+ "name": "BinaryOperation",
+ "src": "3889:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 796,
+ "name": "Identifier",
+ "src": "3910:1:0"
+ }
+ ],
+ "id": 797,
+ "name": "UnaryOperation",
+ "src": "3910:3:0"
+ }
+ ],
+ "id": 798,
+ "name": "ExpressionStatement",
+ "src": "3910:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 799,
+ "name": "Identifier",
+ "src": "3931:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 800,
+ "name": "Identifier",
+ "src": "3938:1:0"
+ }
+ ],
+ "id": 801,
+ "name": "IndexAccess",
+ "src": "3931:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 802,
+ "name": "Identifier",
+ "src": "3944:5:0"
+ }
+ ],
+ "id": 803,
+ "name": "BinaryOperation",
+ "src": "3931:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 804,
+ "name": "Identifier",
+ "src": "3969:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 805,
+ "name": "Identifier",
+ "src": "3976:1:0"
+ }
+ ],
+ "id": 806,
+ "name": "IndexAccess",
+ "src": "3969:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 807,
+ "name": "Identifier",
+ "src": "3981:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 808,
+ "name": "Identifier",
+ "src": "3988:6:0"
+ }
+ ],
+ "id": 809,
+ "name": "MemberAccess",
+ "src": "3988:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 810,
+ "name": "Literal",
+ "src": "4004:1:0"
+ }
+ ],
+ "id": 811,
+ "name": "BinaryOperation",
+ "src": "3988:17:0"
+ }
+ ],
+ "id": 812,
+ "name": "IndexAccess",
+ "src": "3981:25:0"
+ }
+ ],
+ "id": 813,
+ "name": "Assignment",
+ "src": "3969:37:0"
+ }
+ ],
+ "id": 814,
+ "name": "ExpressionStatement",
+ "src": "3969:37:0"
+ },
+ {
+ "id": 815,
+ "name": "Break",
+ "src": "4024:5:0"
+ }
+ ],
+ "id": 816,
+ "name": "Block",
+ "src": "3951:93:0"
+ }
+ ],
+ "id": 817,
+ "name": "IfStatement",
+ "src": "3927:117:0"
+ }
+ ],
+ "id": 818,
+ "name": "ForStatement",
+ "src": "3874:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 819,
+ "name": "Identifier",
+ "src": "4053:6:0"
+ }
+ ],
+ "id": 821,
+ "name": "MemberAccess",
+ "src": "4053:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 822,
+ "name": "Literal",
+ "src": "4070:1:0"
+ }
+ ],
+ "id": 823,
+ "name": "Assignment",
+ "src": "4053:18:0"
+ }
+ ],
+ "id": 824,
+ "name": "ExpressionStatement",
+ "src": "4053:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 825,
+ "name": "Identifier",
+ "src": "4085:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 826,
+ "name": "Identifier",
+ "src": "4096:6:0"
+ }
+ ],
+ "id": 827,
+ "name": "MemberAccess",
+ "src": "4096:13:0"
+ }
+ ],
+ "id": 828,
+ "name": "BinaryOperation",
+ "src": "4085:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "changeRequirement"
+ },
+ "id": 829,
+ "name": "Identifier",
+ "src": "4123:17:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 830,
+ "name": "Identifier",
+ "src": "4141:6:0"
+ }
+ ],
+ "id": 831,
+ "name": "MemberAccess",
+ "src": "4141:13:0"
+ }
+ ],
+ "id": 832,
+ "name": "FunctionCall",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 833,
+ "name": "ExpressionStatement",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 834,
+ "name": "IfStatement",
+ "src": "4081:74:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 835,
+ "name": "Identifier",
+ "src": "4165:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 836,
+ "name": "Identifier",
+ "src": "4178:5:0"
+ }
+ ],
+ "id": 837,
+ "name": "FunctionCall",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 838,
+ "name": "ExpressionStatement",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 839,
+ "name": "Block",
+ "src": "3832:359:0"
+ }
+ ],
+ "id": 840,
+ "name": "FunctionDefinition",
+ "src": "3731:460:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "replaceOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 841,
+ "name": "ElementaryTypeName",
+ "src": "4412:7:0"
+ }
+ ],
+ "id": 842,
+ "name": "VariableDeclaration",
+ "src": "4412:13:0"
+ },
+ {
+ "attributes": {
+ "name": "newOwner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 843,
+ "name": "ElementaryTypeName",
+ "src": "4427:7:0"
+ }
+ ],
+ "id": 844,
+ "name": "VariableDeclaration",
+ "src": "4427:16:0"
+ }
+ ],
+ "id": 845,
+ "name": "ParameterList",
+ "src": "4411:33:0"
+ },
+ {
+ "children": [],
+ "id": 854,
+ "name": "ParameterList",
+ "src": "4546:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 846,
+ "name": "Identifier",
+ "src": "4468:10:0"
+ }
+ ],
+ "id": 847,
+ "name": "ModifierInvocation",
+ "src": "4468:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 848,
+ "name": "Identifier",
+ "src": "4487:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 849,
+ "name": "Identifier",
+ "src": "4499:5:0"
+ }
+ ],
+ "id": 850,
+ "name": "ModifierInvocation",
+ "src": "4487:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 851,
+ "name": "Identifier",
+ "src": "4514:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 852,
+ "name": "Identifier",
+ "src": "4532:8:0"
+ }
+ ],
+ "id": 853,
+ "name": "ModifierInvocation",
+ "src": "4514:27:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 855,
+ "name": "ElementaryTypeName",
+ "src": "4561:4:0"
+ }
+ ],
+ "id": 856,
+ "name": "VariableDeclaration",
+ "src": "4561:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 857,
+ "name": "Literal",
+ "src": "4568:1:0"
+ }
+ ],
+ "id": 858,
+ "name": "VariableDeclarationStatement",
+ "src": "4561:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 859,
+ "name": "Identifier",
+ "src": "4571:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 860,
+ "name": "Identifier",
+ "src": "4573:6:0"
+ }
+ ],
+ "id": 861,
+ "name": "MemberAccess",
+ "src": "4573:13:0"
+ }
+ ],
+ "id": 862,
+ "name": "BinaryOperation",
+ "src": "4571:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 863,
+ "name": "Identifier",
+ "src": "4588:1:0"
+ }
+ ],
+ "id": 864,
+ "name": "UnaryOperation",
+ "src": "4588:3:0"
+ }
+ ],
+ "id": 865,
+ "name": "ExpressionStatement",
+ "src": "4588:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 866,
+ "name": "Identifier",
+ "src": "4609:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 867,
+ "name": "Identifier",
+ "src": "4616:1:0"
+ }
+ ],
+ "id": 868,
+ "name": "IndexAccess",
+ "src": "4609:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 869,
+ "name": "Identifier",
+ "src": "4622:5:0"
+ }
+ ],
+ "id": 870,
+ "name": "BinaryOperation",
+ "src": "4609:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 871,
+ "name": "Identifier",
+ "src": "4647:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 872,
+ "name": "Identifier",
+ "src": "4654:1:0"
+ }
+ ],
+ "id": 873,
+ "name": "IndexAccess",
+ "src": "4647:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 874,
+ "name": "Identifier",
+ "src": "4659:8:0"
+ }
+ ],
+ "id": 875,
+ "name": "Assignment",
+ "src": "4647:20:0"
+ }
+ ],
+ "id": 876,
+ "name": "ExpressionStatement",
+ "src": "4647:20:0"
+ },
+ {
+ "id": 877,
+ "name": "Break",
+ "src": "4685:5:0"
+ }
+ ],
+ "id": 878,
+ "name": "Block",
+ "src": "4629:76:0"
+ }
+ ],
+ "id": 879,
+ "name": "IfStatement",
+ "src": "4605:100:0"
+ }
+ ],
+ "id": 880,
+ "name": "ForStatement",
+ "src": "4556:149:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 881,
+ "name": "Identifier",
+ "src": "4714:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 882,
+ "name": "Identifier",
+ "src": "4722:5:0"
+ }
+ ],
+ "id": 883,
+ "name": "IndexAccess",
+ "src": "4714:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 884,
+ "name": "Literal",
+ "src": "4731:5:0"
+ }
+ ],
+ "id": 885,
+ "name": "Assignment",
+ "src": "4714:22:0"
+ }
+ ],
+ "id": 886,
+ "name": "ExpressionStatement",
+ "src": "4714:22:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 887,
+ "name": "Identifier",
+ "src": "4746:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 888,
+ "name": "Identifier",
+ "src": "4754:8:0"
+ }
+ ],
+ "id": 889,
+ "name": "IndexAccess",
+ "src": "4746:17:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 890,
+ "name": "Literal",
+ "src": "4766:4:0"
+ }
+ ],
+ "id": 891,
+ "name": "Assignment",
+ "src": "4746:24:0"
+ }
+ ],
+ "id": 892,
+ "name": "ExpressionStatement",
+ "src": "4746:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 893,
+ "name": "Identifier",
+ "src": "4780:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 894,
+ "name": "Identifier",
+ "src": "4793:5:0"
+ }
+ ],
+ "id": 895,
+ "name": "FunctionCall",
+ "src": "4780:19:0"
+ }
+ ],
+ "id": 896,
+ "name": "ExpressionStatement",
+ "src": "4780:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 897,
+ "name": "Identifier",
+ "src": "4809:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 898,
+ "name": "Identifier",
+ "src": "4823:8:0"
+ }
+ ],
+ "id": 899,
+ "name": "FunctionCall",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 900,
+ "name": "ExpressionStatement",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 901,
+ "name": "Block",
+ "src": "4546:293:0"
+ }
+ ],
+ "id": 902,
+ "name": "FunctionDefinition",
+ "src": "4390:449:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeRequirement",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 903,
+ "name": "ElementaryTypeName",
+ "src": "5037:4:0"
+ }
+ ],
+ "id": 904,
+ "name": "VariableDeclaration",
+ "src": "5037:14:0"
+ }
+ ],
+ "id": 905,
+ "name": "ParameterList",
+ "src": "5036:16:0"
+ },
+ {
+ "children": [],
+ "id": 913,
+ "name": "ParameterList",
+ "src": "5142:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 906,
+ "name": "Identifier",
+ "src": "5076:10:0"
+ }
+ ],
+ "id": 907,
+ "name": "ModifierInvocation",
+ "src": "5076:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 908,
+ "name": "Identifier",
+ "src": "5095:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 909,
+ "name": "Identifier",
+ "src": "5112:6:0"
+ }
+ ],
+ "id": 910,
+ "name": "MemberAccess",
+ "src": "5112:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 911,
+ "name": "Identifier",
+ "src": "5127:9:0"
+ }
+ ],
+ "id": 912,
+ "name": "ModifierInvocation",
+ "src": "5095:42:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 914,
+ "name": "Identifier",
+ "src": "5152:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 915,
+ "name": "Identifier",
+ "src": "5163:9:0"
+ }
+ ],
+ "id": 916,
+ "name": "Assignment",
+ "src": "5152:20:0"
+ }
+ ],
+ "id": 917,
+ "name": "ExpressionStatement",
+ "src": "5152:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "RequirementChange"
+ },
+ "id": 918,
+ "name": "Identifier",
+ "src": "5182:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 919,
+ "name": "Identifier",
+ "src": "5200:9:0"
+ }
+ ],
+ "id": 920,
+ "name": "FunctionCall",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 921,
+ "name": "ExpressionStatement",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 922,
+ "name": "Block",
+ "src": "5142:75:0"
+ }
+ ],
+ "id": 923,
+ "name": "FunctionDefinition",
+ "src": "5010:207:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "submitTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 924,
+ "name": "ElementaryTypeName",
+ "src": "5503:7:0"
+ }
+ ],
+ "id": 925,
+ "name": "VariableDeclaration",
+ "src": "5503:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 926,
+ "name": "ElementaryTypeName",
+ "src": "5524:4:0"
+ }
+ ],
+ "id": 927,
+ "name": "VariableDeclaration",
+ "src": "5524:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 928,
+ "name": "ElementaryTypeName",
+ "src": "5536:5:0"
+ }
+ ],
+ "id": 929,
+ "name": "VariableDeclaration",
+ "src": "5536:10:0"
+ }
+ ],
+ "id": 930,
+ "name": "ParameterList",
+ "src": "5502:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 931,
+ "name": "ElementaryTypeName",
+ "src": "5580:4:0"
+ }
+ ],
+ "id": 932,
+ "name": "VariableDeclaration",
+ "src": "5580:18:0"
+ }
+ ],
+ "id": 933,
+ "name": "ParameterList",
+ "src": "5579:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 934,
+ "name": "Identifier",
+ "src": "5614:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256,bytes memory) returns (uint256)",
+ "value": "addTransaction"
+ },
+ "id": 935,
+ "name": "Identifier",
+ "src": "5630:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 936,
+ "name": "Identifier",
+ "src": "5645:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 937,
+ "name": "Identifier",
+ "src": "5658:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 938,
+ "name": "Identifier",
+ "src": "5665:4:0"
+ }
+ ],
+ "id": 939,
+ "name": "FunctionCall",
+ "src": "5630:40:0"
+ }
+ ],
+ "id": 940,
+ "name": "Assignment",
+ "src": "5614:56:0"
+ }
+ ],
+ "id": 941,
+ "name": "ExpressionStatement",
+ "src": "5614:56:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "confirmTransaction"
+ },
+ "id": 942,
+ "name": "Identifier",
+ "src": "5680:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 943,
+ "name": "Identifier",
+ "src": "5699:13:0"
+ }
+ ],
+ "id": 944,
+ "name": "FunctionCall",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 945,
+ "name": "ExpressionStatement",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 946,
+ "name": "Block",
+ "src": "5604:116:0"
+ }
+ ],
+ "id": 947,
+ "name": "FunctionDefinition",
+ "src": "5476:244:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 948,
+ "name": "ElementaryTypeName",
+ "src": "5854:4:0"
+ }
+ ],
+ "id": 949,
+ "name": "VariableDeclaration",
+ "src": "5854:18:0"
+ }
+ ],
+ "id": 950,
+ "name": "ParameterList",
+ "src": "5853:20:0"
+ },
+ {
+ "children": [],
+ "id": 963,
+ "name": "ParameterList",
+ "src": "6014:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 951,
+ "name": "Identifier",
+ "src": "5897:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 952,
+ "name": "Identifier",
+ "src": "5909:3:0"
+ }
+ ],
+ "id": 953,
+ "name": "MemberAccess",
+ "src": "5909:10:0"
+ }
+ ],
+ "id": 954,
+ "name": "ModifierInvocation",
+ "src": "5897:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 955,
+ "name": "Identifier",
+ "src": "5929:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 956,
+ "name": "Identifier",
+ "src": "5947:13:0"
+ }
+ ],
+ "id": 957,
+ "name": "ModifierInvocation",
+ "src": "5929:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 958,
+ "name": "Identifier",
+ "src": "5970:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 959,
+ "name": "Identifier",
+ "src": "5983:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 960,
+ "name": "Identifier",
+ "src": "5998:3:0"
+ }
+ ],
+ "id": 961,
+ "name": "MemberAccess",
+ "src": "5998:10:0"
+ }
+ ],
+ "id": 962,
+ "name": "ModifierInvocation",
+ "src": "5970:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 964,
+ "name": "Identifier",
+ "src": "6024:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 965,
+ "name": "Identifier",
+ "src": "6038:13:0"
+ }
+ ],
+ "id": 968,
+ "name": "IndexAccess",
+ "src": "6024:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 966,
+ "name": "Identifier",
+ "src": "6053:3:0"
+ }
+ ],
+ "id": 967,
+ "name": "MemberAccess",
+ "src": "6053:10:0"
+ }
+ ],
+ "id": 969,
+ "name": "IndexAccess",
+ "src": "6024:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 970,
+ "name": "Literal",
+ "src": "6067:4:0"
+ }
+ ],
+ "id": 971,
+ "name": "Assignment",
+ "src": "6024:47:0"
+ }
+ ],
+ "id": 972,
+ "name": "ExpressionStatement",
+ "src": "6024:47:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 973,
+ "name": "Identifier",
+ "src": "6081:12:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 974,
+ "name": "Identifier",
+ "src": "6094:3:0"
+ }
+ ],
+ "id": 975,
+ "name": "MemberAccess",
+ "src": "6094:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 976,
+ "name": "Identifier",
+ "src": "6106:13:0"
+ }
+ ],
+ "id": 977,
+ "name": "FunctionCall",
+ "src": "6081:39:0"
+ }
+ ],
+ "id": 978,
+ "name": "ExpressionStatement",
+ "src": "6081:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "executeTransaction"
+ },
+ "id": 979,
+ "name": "Identifier",
+ "src": "6130:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 980,
+ "name": "Identifier",
+ "src": "6149:13:0"
+ }
+ ],
+ "id": 981,
+ "name": "FunctionCall",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 982,
+ "name": "ExpressionStatement",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 983,
+ "name": "Block",
+ "src": "6014:156:0"
+ }
+ ],
+ "id": 984,
+ "name": "FunctionDefinition",
+ "src": "5826:344:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 985,
+ "name": "ElementaryTypeName",
+ "src": "6322:4:0"
+ }
+ ],
+ "id": 986,
+ "name": "VariableDeclaration",
+ "src": "6322:18:0"
+ }
+ ],
+ "id": 987,
+ "name": "ParameterList",
+ "src": "6321:20:0"
+ },
+ {
+ "children": [],
+ "id": 1000,
+ "name": "ParameterList",
+ "src": "6473:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 988,
+ "name": "Identifier",
+ "src": "6365:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 989,
+ "name": "Identifier",
+ "src": "6377:3:0"
+ }
+ ],
+ "id": 990,
+ "name": "MemberAccess",
+ "src": "6377:10:0"
+ }
+ ],
+ "id": 991,
+ "name": "ModifierInvocation",
+ "src": "6365:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 992,
+ "name": "Identifier",
+ "src": "6397:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 993,
+ "name": "Identifier",
+ "src": "6407:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 994,
+ "name": "Identifier",
+ "src": "6422:3:0"
+ }
+ ],
+ "id": 995,
+ "name": "MemberAccess",
+ "src": "6422:10:0"
+ }
+ ],
+ "id": 996,
+ "name": "ModifierInvocation",
+ "src": "6397:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 997,
+ "name": "Identifier",
+ "src": "6442:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 998,
+ "name": "Identifier",
+ "src": "6454:13:0"
+ }
+ ],
+ "id": 999,
+ "name": "ModifierInvocation",
+ "src": "6442:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1001,
+ "name": "Identifier",
+ "src": "6483:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1002,
+ "name": "Identifier",
+ "src": "6497:13:0"
+ }
+ ],
+ "id": 1005,
+ "name": "IndexAccess",
+ "src": "6483:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1003,
+ "name": "Identifier",
+ "src": "6512:3:0"
+ }
+ ],
+ "id": 1004,
+ "name": "MemberAccess",
+ "src": "6512:10:0"
+ }
+ ],
+ "id": 1006,
+ "name": "IndexAccess",
+ "src": "6483:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1007,
+ "name": "Literal",
+ "src": "6526:5:0"
+ }
+ ],
+ "id": 1008,
+ "name": "Assignment",
+ "src": "6483:48:0"
+ }
+ ],
+ "id": 1009,
+ "name": "ExpressionStatement",
+ "src": "6483:48:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 1010,
+ "name": "Identifier",
+ "src": "6541:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1011,
+ "name": "Identifier",
+ "src": "6552:3:0"
+ }
+ ],
+ "id": 1012,
+ "name": "MemberAccess",
+ "src": "6552:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1013,
+ "name": "Identifier",
+ "src": "6564:13:0"
+ }
+ ],
+ "id": 1014,
+ "name": "FunctionCall",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1015,
+ "name": "ExpressionStatement",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1016,
+ "name": "Block",
+ "src": "6473:112:0"
+ }
+ ],
+ "id": 1017,
+ "name": "FunctionDefinition",
+ "src": "6294:291:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1018,
+ "name": "ElementaryTypeName",
+ "src": "6727:4:0"
+ }
+ ],
+ "id": 1019,
+ "name": "VariableDeclaration",
+ "src": "6727:18:0"
+ }
+ ],
+ "id": 1020,
+ "name": "ParameterList",
+ "src": "6726:20:0"
+ },
+ {
+ "children": [],
+ "id": 1024,
+ "name": "ParameterList",
+ "src": "6801:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 1021,
+ "name": "Identifier",
+ "src": "6770:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1022,
+ "name": "Identifier",
+ "src": "6782:13:0"
+ }
+ ],
+ "id": 1023,
+ "name": "ModifierInvocation",
+ "src": "6770:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 1025,
+ "name": "Identifier",
+ "src": "6815:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1026,
+ "name": "Identifier",
+ "src": "6827:13:0"
+ }
+ ],
+ "id": 1027,
+ "name": "FunctionCall",
+ "src": "6815:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 1028,
+ "name": "UserDefinedTypeName",
+ "src": "6857:11:0"
+ }
+ ],
+ "id": 1029,
+ "name": "VariableDeclaration",
+ "src": "6857:14:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1030,
+ "name": "Identifier",
+ "src": "6874:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1031,
+ "name": "Identifier",
+ "src": "6887:13:0"
+ }
+ ],
+ "id": 1032,
+ "name": "IndexAccess",
+ "src": "6874:27:0"
+ }
+ ],
+ "id": 1033,
+ "name": "VariableDeclarationStatement",
+ "src": "6857:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1034,
+ "name": "Identifier",
+ "src": "6915:2:0"
+ }
+ ],
+ "id": 1036,
+ "name": "MemberAccess",
+ "src": "6915:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1037,
+ "name": "Literal",
+ "src": "6929:4:0"
+ }
+ ],
+ "id": 1038,
+ "name": "Assignment",
+ "src": "6915:18:0"
+ }
+ ],
+ "id": 1039,
+ "name": "ExpressionStatement",
+ "src": "6915:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1040,
+ "name": "Identifier",
+ "src": "6951:2:0"
+ }
+ ],
+ "id": 1041,
+ "name": "MemberAccess",
+ "src": "6951:14:0"
+ }
+ ],
+ "id": 1042,
+ "name": "MemberAccess",
+ "src": "6951:19:0"
+ }
+ ],
+ "id": 1043,
+ "name": "MemberAccess",
+ "src": "6951:25:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1044,
+ "name": "Identifier",
+ "src": "6977:2:0"
+ }
+ ],
+ "id": 1045,
+ "name": "MemberAccess",
+ "src": "6977:8:0"
+ }
+ ],
+ "id": 1046,
+ "name": "FunctionCall",
+ "src": "6951:35:0"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1047,
+ "name": "Identifier",
+ "src": "6987:2:0"
+ }
+ ],
+ "id": 1048,
+ "name": "MemberAccess",
+ "src": "6987:7:0"
+ }
+ ],
+ "id": 1049,
+ "name": "FunctionCall",
+ "src": "6951:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 1050,
+ "name": "Identifier",
+ "src": "7013:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1051,
+ "name": "Identifier",
+ "src": "7023:13:0"
+ }
+ ],
+ "id": 1052,
+ "name": "FunctionCall",
+ "src": "7013:24:0"
+ }
+ ],
+ "id": 1053,
+ "name": "ExpressionStatement",
+ "src": "7013:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 1054,
+ "name": "Identifier",
+ "src": "7074:16:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1055,
+ "name": "Identifier",
+ "src": "7091:13:0"
+ }
+ ],
+ "id": 1056,
+ "name": "FunctionCall",
+ "src": "7074:31:0"
+ }
+ ],
+ "id": 1057,
+ "name": "ExpressionStatement",
+ "src": "7074:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1058,
+ "name": "Identifier",
+ "src": "7123:2:0"
+ }
+ ],
+ "id": 1060,
+ "name": "MemberAccess",
+ "src": "7123:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1061,
+ "name": "Literal",
+ "src": "7137:5:0"
+ }
+ ],
+ "id": 1062,
+ "name": "Assignment",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1063,
+ "name": "ExpressionStatement",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1064,
+ "name": "Block",
+ "src": "7056:101:0"
+ }
+ ],
+ "id": 1065,
+ "name": "IfStatement",
+ "src": "6947:210:0"
+ }
+ ],
+ "id": 1066,
+ "name": "Block",
+ "src": "6843:324:0"
+ }
+ ],
+ "id": 1067,
+ "name": "IfStatement",
+ "src": "6811:356:0"
+ }
+ ],
+ "id": 1068,
+ "name": "Block",
+ "src": "6801:372:0"
+ }
+ ],
+ "id": 1069,
+ "name": "FunctionDefinition",
+ "src": "6699:474:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "isConfirmed",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1070,
+ "name": "ElementaryTypeName",
+ "src": "7345:4:0"
+ }
+ ],
+ "id": 1071,
+ "name": "VariableDeclaration",
+ "src": "7345:18:0"
+ }
+ ],
+ "id": 1072,
+ "name": "ParameterList",
+ "src": "7344:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1073,
+ "name": "ElementaryTypeName",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1074,
+ "name": "VariableDeclaration",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1075,
+ "name": "ParameterList",
+ "src": "7413:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1076,
+ "name": "ElementaryTypeName",
+ "src": "7434:4:0"
+ }
+ ],
+ "id": 1077,
+ "name": "VariableDeclaration",
+ "src": "7434:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1078,
+ "name": "Literal",
+ "src": "7447:1:0"
+ }
+ ],
+ "id": 1079,
+ "name": "VariableDeclarationStatement",
+ "src": "7434:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1080,
+ "name": "ElementaryTypeName",
+ "src": "7463:4:0"
+ }
+ ],
+ "id": 1081,
+ "name": "VariableDeclaration",
+ "src": "7463:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1082,
+ "name": "Literal",
+ "src": "7470:1:0"
+ }
+ ],
+ "id": 1083,
+ "name": "VariableDeclarationStatement",
+ "src": "7463:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1084,
+ "name": "Identifier",
+ "src": "7473:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1085,
+ "name": "Identifier",
+ "src": "7475:6:0"
+ }
+ ],
+ "id": 1086,
+ "name": "MemberAccess",
+ "src": "7475:13:0"
+ }
+ ],
+ "id": 1087,
+ "name": "BinaryOperation",
+ "src": "7473:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1088,
+ "name": "Identifier",
+ "src": "7490:1:0"
+ }
+ ],
+ "id": 1089,
+ "name": "UnaryOperation",
+ "src": "7490:3:0"
+ }
+ ],
+ "id": 1090,
+ "name": "ExpressionStatement",
+ "src": "7490:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1091,
+ "name": "Identifier",
+ "src": "7513:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1092,
+ "name": "Identifier",
+ "src": "7527:13:0"
+ }
+ ],
+ "id": 1093,
+ "name": "IndexAccess",
+ "src": "7513:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1094,
+ "name": "Identifier",
+ "src": "7542:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1095,
+ "name": "Identifier",
+ "src": "7549:1:0"
+ }
+ ],
+ "id": 1096,
+ "name": "IndexAccess",
+ "src": "7542:9:0"
+ }
+ ],
+ "id": 1097,
+ "name": "IndexAccess",
+ "src": "7513:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1098,
+ "name": "Identifier",
+ "src": "7570:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1099,
+ "name": "Literal",
+ "src": "7579:1:0"
+ }
+ ],
+ "id": 1100,
+ "name": "Assignment",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1101,
+ "name": "ExpressionStatement",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1102,
+ "name": "IfStatement",
+ "src": "7509:71:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1103,
+ "name": "Identifier",
+ "src": "7598:5:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 1104,
+ "name": "Identifier",
+ "src": "7607:8:0"
+ }
+ ],
+ "id": 1105,
+ "name": "BinaryOperation",
+ "src": "7598:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1106,
+ "name": "Literal",
+ "src": "7640:4:0"
+ }
+ ],
+ "id": 1107,
+ "name": "Return",
+ "src": "7633:11:0"
+ }
+ ],
+ "id": 1108,
+ "name": "IfStatement",
+ "src": "7594:50:0"
+ }
+ ],
+ "id": 1109,
+ "name": "Block",
+ "src": "7495:160:0"
+ }
+ ],
+ "id": 1110,
+ "name": "ForStatement",
+ "src": "7458:197:0"
+ }
+ ],
+ "id": 1111,
+ "name": "Block",
+ "src": "7424:237:0"
+ }
+ ],
+ "id": 1112,
+ "name": "FunctionDefinition",
+ "src": "7324:337:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addTransaction",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1113,
+ "name": "ElementaryTypeName",
+ "src": "8018:7:0"
+ }
+ ],
+ "id": 1114,
+ "name": "VariableDeclaration",
+ "src": "8018:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1115,
+ "name": "ElementaryTypeName",
+ "src": "8039:4:0"
+ }
+ ],
+ "id": 1116,
+ "name": "VariableDeclaration",
+ "src": "8039:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 1117,
+ "name": "ElementaryTypeName",
+ "src": "8051:5:0"
+ }
+ ],
+ "id": 1118,
+ "name": "VariableDeclaration",
+ "src": "8051:10:0"
+ }
+ ],
+ "id": 1119,
+ "name": "ParameterList",
+ "src": "8017:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1123,
+ "name": "ElementaryTypeName",
+ "src": "8126:4:0"
+ }
+ ],
+ "id": 1124,
+ "name": "VariableDeclaration",
+ "src": "8126:18:0"
+ }
+ ],
+ "id": 1125,
+ "name": "ParameterList",
+ "src": "8125:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 1120,
+ "name": "Identifier",
+ "src": "8088:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1121,
+ "name": "Identifier",
+ "src": "8096:11:0"
+ }
+ ],
+ "id": 1122,
+ "name": "ModifierInvocation",
+ "src": "8088:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1126,
+ "name": "Identifier",
+ "src": "8160:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1127,
+ "name": "Identifier",
+ "src": "8176:16:0"
+ }
+ ],
+ "id": 1128,
+ "name": "Assignment",
+ "src": "8160:32:0"
+ }
+ ],
+ "id": 1129,
+ "name": "ExpressionStatement",
+ "src": "8160:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1130,
+ "name": "Identifier",
+ "src": "8202:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1131,
+ "name": "Identifier",
+ "src": "8215:13:0"
+ }
+ ],
+ "id": 1132,
+ "name": "IndexAccess",
+ "src": "8202:27:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(struct MultiSigWallet.Transaction storage pointer)",
+ "value": "Transaction"
+ },
+ "id": 1133,
+ "name": "Identifier",
+ "src": "8232:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1134,
+ "name": "Identifier",
+ "src": "8271:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 1135,
+ "name": "Identifier",
+ "src": "8303:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 1136,
+ "name": "Identifier",
+ "src": "8328:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1137,
+ "name": "Literal",
+ "src": "8356:5:0"
+ }
+ ],
+ "id": 1138,
+ "name": "FunctionCall",
+ "src": "8232:140:0"
+ }
+ ],
+ "id": 1139,
+ "name": "Assignment",
+ "src": "8202:170:0"
+ }
+ ],
+ "id": 1140,
+ "name": "ExpressionStatement",
+ "src": "8202:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1141,
+ "name": "Identifier",
+ "src": "8382:16:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1142,
+ "name": "Literal",
+ "src": "8402:1:0"
+ }
+ ],
+ "id": 1143,
+ "name": "Assignment",
+ "src": "8382:21:0"
+ }
+ ],
+ "id": 1144,
+ "name": "ExpressionStatement",
+ "src": "8382:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Submission"
+ },
+ "id": 1145,
+ "name": "Identifier",
+ "src": "8413:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1146,
+ "name": "Identifier",
+ "src": "8424:13:0"
+ }
+ ],
+ "id": 1147,
+ "name": "FunctionCall",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1148,
+ "name": "ExpressionStatement",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1149,
+ "name": "Block",
+ "src": "8150:295:0"
+ }
+ ],
+ "id": 1150,
+ "name": "FunctionDefinition",
+ "src": "7994:451:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmationCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1151,
+ "name": "ElementaryTypeName",
+ "src": "8672:4:0"
+ }
+ ],
+ "id": 1152,
+ "name": "VariableDeclaration",
+ "src": "8672:18:0"
+ }
+ ],
+ "id": 1153,
+ "name": "ParameterList",
+ "src": "8671:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1154,
+ "name": "ElementaryTypeName",
+ "src": "8741:4:0"
+ }
+ ],
+ "id": 1155,
+ "name": "VariableDeclaration",
+ "src": "8741:10:0"
+ }
+ ],
+ "id": 1156,
+ "name": "ParameterList",
+ "src": "8740:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1157,
+ "name": "ElementaryTypeName",
+ "src": "8772:4:0"
+ }
+ ],
+ "id": 1158,
+ "name": "VariableDeclaration",
+ "src": "8772:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1159,
+ "name": "Literal",
+ "src": "8779:1:0"
+ }
+ ],
+ "id": 1160,
+ "name": "VariableDeclarationStatement",
+ "src": "8772:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1161,
+ "name": "Identifier",
+ "src": "8782:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1162,
+ "name": "Identifier",
+ "src": "8784:6:0"
+ }
+ ],
+ "id": 1163,
+ "name": "MemberAccess",
+ "src": "8784:13:0"
+ }
+ ],
+ "id": 1164,
+ "name": "BinaryOperation",
+ "src": "8782:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1165,
+ "name": "Identifier",
+ "src": "8799:1:0"
+ }
+ ],
+ "id": 1166,
+ "name": "UnaryOperation",
+ "src": "8799:3:0"
+ }
+ ],
+ "id": 1167,
+ "name": "ExpressionStatement",
+ "src": "8799:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1168,
+ "name": "Identifier",
+ "src": "8820:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1169,
+ "name": "Identifier",
+ "src": "8834:13:0"
+ }
+ ],
+ "id": 1170,
+ "name": "IndexAccess",
+ "src": "8820:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1171,
+ "name": "Identifier",
+ "src": "8849:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1172,
+ "name": "Identifier",
+ "src": "8856:1:0"
+ }
+ ],
+ "id": 1173,
+ "name": "IndexAccess",
+ "src": "8849:9:0"
+ }
+ ],
+ "id": 1174,
+ "name": "IndexAccess",
+ "src": "8820:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1175,
+ "name": "Identifier",
+ "src": "8877:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1176,
+ "name": "Literal",
+ "src": "8886:1:0"
+ }
+ ],
+ "id": 1177,
+ "name": "Assignment",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1178,
+ "name": "ExpressionStatement",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1179,
+ "name": "IfStatement",
+ "src": "8816:71:0"
+ }
+ ],
+ "id": 1180,
+ "name": "ForStatement",
+ "src": "8767:120:0"
+ }
+ ],
+ "id": 1181,
+ "name": "Block",
+ "src": "8757:137:0"
+ }
+ ],
+ "id": 1182,
+ "name": "FunctionDefinition",
+ "src": "8642:252:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1183,
+ "name": "ElementaryTypeName",
+ "src": "9185:4:0"
+ }
+ ],
+ "id": 1184,
+ "name": "VariableDeclaration",
+ "src": "9185:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1185,
+ "name": "ElementaryTypeName",
+ "src": "9199:4:0"
+ }
+ ],
+ "id": 1186,
+ "name": "VariableDeclaration",
+ "src": "9199:13:0"
+ }
+ ],
+ "id": 1187,
+ "name": "ParameterList",
+ "src": "9184:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1188,
+ "name": "ElementaryTypeName",
+ "src": "9263:4:0"
+ }
+ ],
+ "id": 1189,
+ "name": "VariableDeclaration",
+ "src": "9263:10:0"
+ }
+ ],
+ "id": 1190,
+ "name": "ParameterList",
+ "src": "9262:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1191,
+ "name": "ElementaryTypeName",
+ "src": "9294:4:0"
+ }
+ ],
+ "id": 1192,
+ "name": "VariableDeclaration",
+ "src": "9294:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1193,
+ "name": "Literal",
+ "src": "9301:1:0"
+ }
+ ],
+ "id": 1194,
+ "name": "VariableDeclarationStatement",
+ "src": "9294:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1195,
+ "name": "Identifier",
+ "src": "9304:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1196,
+ "name": "Identifier",
+ "src": "9306:16:0"
+ }
+ ],
+ "id": 1197,
+ "name": "BinaryOperation",
+ "src": "9304:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1198,
+ "name": "Identifier",
+ "src": "9324:1:0"
+ }
+ ],
+ "id": 1199,
+ "name": "UnaryOperation",
+ "src": "9324:3:0"
+ }
+ ],
+ "id": 1200,
+ "name": "ExpressionStatement",
+ "src": "9324:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1201,
+ "name": "Identifier",
+ "src": "9348:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1202,
+ "name": "Identifier",
+ "src": "9360:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1203,
+ "name": "Identifier",
+ "src": "9373:1:0"
+ }
+ ],
+ "id": 1204,
+ "name": "IndexAccess",
+ "src": "9360:15:0"
+ }
+ ],
+ "id": 1205,
+ "name": "MemberAccess",
+ "src": "9360:24:0"
+ }
+ ],
+ "id": 1206,
+ "name": "UnaryOperation",
+ "src": "9359:25:0"
+ }
+ ],
+ "id": 1207,
+ "name": "BinaryOperation",
+ "src": "9348:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1208,
+ "name": "Identifier",
+ "src": "9404:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1209,
+ "name": "Identifier",
+ "src": "9416:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1210,
+ "name": "Identifier",
+ "src": "9429:1:0"
+ }
+ ],
+ "id": 1211,
+ "name": "IndexAccess",
+ "src": "9416:15:0"
+ }
+ ],
+ "id": 1212,
+ "name": "MemberAccess",
+ "src": "9416:24:0"
+ }
+ ],
+ "id": 1213,
+ "name": "BinaryOperation",
+ "src": "9404:36:0"
+ }
+ ],
+ "id": 1214,
+ "name": "BinaryOperation",
+ "src": "9348:92:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1215,
+ "name": "Identifier",
+ "src": "9458:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1216,
+ "name": "Literal",
+ "src": "9467:1:0"
+ }
+ ],
+ "id": 1217,
+ "name": "Assignment",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1218,
+ "name": "ExpressionStatement",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1219,
+ "name": "IfStatement",
+ "src": "9341:127:0"
+ }
+ ],
+ "id": 1220,
+ "name": "ForStatement",
+ "src": "9289:179:0"
+ }
+ ],
+ "id": 1221,
+ "name": "Block",
+ "src": "9279:196:0"
+ }
+ ],
+ "id": 1222,
+ "name": "FunctionDefinition",
+ "src": "9156:319:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getOwners",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 1223,
+ "name": "ParameterList",
+ "src": "9577:2:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1224,
+ "name": "ElementaryTypeName",
+ "src": "9629:7:0"
+ }
+ ],
+ "id": 1225,
+ "name": "ArrayTypeName",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1226,
+ "name": "VariableDeclaration",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1227,
+ "name": "ParameterList",
+ "src": "9628:11:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1228,
+ "name": "Identifier",
+ "src": "9661:6:0"
+ }
+ ],
+ "id": 1229,
+ "name": "Return",
+ "src": "9654:13:0"
+ }
+ ],
+ "id": 1230,
+ "name": "Block",
+ "src": "9644:30:0"
+ }
+ ],
+ "id": 1231,
+ "name": "FunctionDefinition",
+ "src": "9559:115:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmations",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1232,
+ "name": "ElementaryTypeName",
+ "src": "9879:4:0"
+ }
+ ],
+ "id": 1233,
+ "name": "VariableDeclaration",
+ "src": "9879:18:0"
+ }
+ ],
+ "id": 1234,
+ "name": "ParameterList",
+ "src": "9878:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_confirmations",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1235,
+ "name": "ElementaryTypeName",
+ "src": "9948:7:0"
+ }
+ ],
+ "id": 1236,
+ "name": "ArrayTypeName",
+ "src": "9948:9:0"
+ }
+ ],
+ "id": 1237,
+ "name": "VariableDeclaration",
+ "src": "9948:24:0"
+ }
+ ],
+ "id": 1238,
+ "name": "ParameterList",
+ "src": "9947:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "confirmationsTemp",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1240,
+ "name": "ElementaryTypeName",
+ "src": "9988:7:0"
+ }
+ ],
+ "id": 1241,
+ "name": "ArrayTypeName",
+ "src": "9988:9:0"
+ }
+ ],
+ "id": 1242,
+ "name": "VariableDeclaration",
+ "src": "9988:34:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1243,
+ "name": "ElementaryTypeName",
+ "src": "10029:7:0"
+ }
+ ],
+ "id": 1244,
+ "name": "ArrayTypeName",
+ "src": "10029:9:0"
+ }
+ ],
+ "id": 1245,
+ "name": "NewExpression",
+ "src": "10025:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1246,
+ "name": "Identifier",
+ "src": "10039:6:0"
+ }
+ ],
+ "id": 1247,
+ "name": "MemberAccess",
+ "src": "10039:13:0"
+ }
+ ],
+ "id": 1248,
+ "name": "FunctionCall",
+ "src": "10025:28:0"
+ }
+ ],
+ "id": 1249,
+ "name": "VariableDeclarationStatement",
+ "src": "9988:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1250,
+ "name": "ElementaryTypeName",
+ "src": "10063:4:0"
+ }
+ ],
+ "id": 1251,
+ "name": "VariableDeclaration",
+ "src": "10063:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1252,
+ "name": "Literal",
+ "src": "10076:1:0"
+ }
+ ],
+ "id": 1253,
+ "name": "VariableDeclarationStatement",
+ "src": "10063:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1254,
+ "name": "ElementaryTypeName",
+ "src": "10087:4:0"
+ }
+ ],
+ "id": 1255,
+ "name": "VariableDeclaration",
+ "src": "10087:6:0"
+ }
+ ],
+ "id": 1256,
+ "name": "VariableDeclarationStatement",
+ "src": "10087:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1257,
+ "name": "Identifier",
+ "src": "10108:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1258,
+ "name": "Literal",
+ "src": "10110:1:0"
+ }
+ ],
+ "id": 1259,
+ "name": "Assignment",
+ "src": "10108:3:0"
+ }
+ ],
+ "id": 1260,
+ "name": "ExpressionStatement",
+ "src": "10108:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1261,
+ "name": "Identifier",
+ "src": "10113:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1262,
+ "name": "Identifier",
+ "src": "10115:6:0"
+ }
+ ],
+ "id": 1263,
+ "name": "MemberAccess",
+ "src": "10115:13:0"
+ }
+ ],
+ "id": 1264,
+ "name": "BinaryOperation",
+ "src": "10113:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1265,
+ "name": "Identifier",
+ "src": "10130:1:0"
+ }
+ ],
+ "id": 1266,
+ "name": "UnaryOperation",
+ "src": "10130:3:0"
+ }
+ ],
+ "id": 1267,
+ "name": "ExpressionStatement",
+ "src": "10130:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1268,
+ "name": "Identifier",
+ "src": "10151:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1269,
+ "name": "Identifier",
+ "src": "10165:13:0"
+ }
+ ],
+ "id": 1270,
+ "name": "IndexAccess",
+ "src": "10151:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1271,
+ "name": "Identifier",
+ "src": "10180:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1272,
+ "name": "Identifier",
+ "src": "10187:1:0"
+ }
+ ],
+ "id": 1273,
+ "name": "IndexAccess",
+ "src": "10180:9:0"
+ }
+ ],
+ "id": 1274,
+ "name": "IndexAccess",
+ "src": "10151:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1275,
+ "name": "Identifier",
+ "src": "10210:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1276,
+ "name": "Identifier",
+ "src": "10228:5:0"
+ }
+ ],
+ "id": 1277,
+ "name": "IndexAccess",
+ "src": "10210:24:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1278,
+ "name": "Identifier",
+ "src": "10237:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1279,
+ "name": "Identifier",
+ "src": "10244:1:0"
+ }
+ ],
+ "id": 1280,
+ "name": "IndexAccess",
+ "src": "10237:9:0"
+ }
+ ],
+ "id": 1281,
+ "name": "Assignment",
+ "src": "10210:36:0"
+ }
+ ],
+ "id": 1282,
+ "name": "ExpressionStatement",
+ "src": "10210:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1283,
+ "name": "Identifier",
+ "src": "10264:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1284,
+ "name": "Literal",
+ "src": "10273:1:0"
+ }
+ ],
+ "id": 1285,
+ "name": "Assignment",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1286,
+ "name": "ExpressionStatement",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1287,
+ "name": "Block",
+ "src": "10192:97:0"
+ }
+ ],
+ "id": 1288,
+ "name": "IfStatement",
+ "src": "10147:142:0"
+ }
+ ],
+ "id": 1289,
+ "name": "ForStatement",
+ "src": "10103:186:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1290,
+ "name": "Identifier",
+ "src": "10298:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1291,
+ "name": "ElementaryTypeName",
+ "src": "10319:7:0"
+ }
+ ],
+ "id": 1292,
+ "name": "ArrayTypeName",
+ "src": "10319:9:0"
+ }
+ ],
+ "id": 1293,
+ "name": "NewExpression",
+ "src": "10315:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1294,
+ "name": "Identifier",
+ "src": "10329:5:0"
+ }
+ ],
+ "id": 1295,
+ "name": "FunctionCall",
+ "src": "10315:20:0"
+ }
+ ],
+ "id": 1296,
+ "name": "Assignment",
+ "src": "10298:37:0"
+ }
+ ],
+ "id": 1297,
+ "name": "ExpressionStatement",
+ "src": "10298:37:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1298,
+ "name": "Identifier",
+ "src": "10350:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1299,
+ "name": "Literal",
+ "src": "10352:1:0"
+ }
+ ],
+ "id": 1300,
+ "name": "Assignment",
+ "src": "10350:3:0"
+ }
+ ],
+ "id": 1301,
+ "name": "ExpressionStatement",
+ "src": "10350:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1302,
+ "name": "Identifier",
+ "src": "10355:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1303,
+ "name": "Identifier",
+ "src": "10357:5:0"
+ }
+ ],
+ "id": 1304,
+ "name": "BinaryOperation",
+ "src": "10355:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1305,
+ "name": "Identifier",
+ "src": "10364:1:0"
+ }
+ ],
+ "id": 1306,
+ "name": "UnaryOperation",
+ "src": "10364:3:0"
+ }
+ ],
+ "id": 1307,
+ "name": "ExpressionStatement",
+ "src": "10364:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1308,
+ "name": "Identifier",
+ "src": "10381:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1309,
+ "name": "Identifier",
+ "src": "10396:1:0"
+ }
+ ],
+ "id": 1310,
+ "name": "IndexAccess",
+ "src": "10381:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1311,
+ "name": "Identifier",
+ "src": "10401:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1312,
+ "name": "Identifier",
+ "src": "10419:1:0"
+ }
+ ],
+ "id": 1313,
+ "name": "IndexAccess",
+ "src": "10401:20:0"
+ }
+ ],
+ "id": 1314,
+ "name": "Assignment",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1315,
+ "name": "ExpressionStatement",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1316,
+ "name": "ForStatement",
+ "src": "10345:76:0"
+ }
+ ],
+ "id": 1317,
+ "name": "Block",
+ "src": "9978:450:0"
+ }
+ ],
+ "id": 1318,
+ "name": "FunctionDefinition",
+ "src": "9853:575:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionIds",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "from",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1319,
+ "name": "ElementaryTypeName",
+ "src": "10804:4:0"
+ }
+ ],
+ "id": 1320,
+ "name": "VariableDeclaration",
+ "src": "10804:9:0"
+ },
+ {
+ "attributes": {
+ "name": "to",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1321,
+ "name": "ElementaryTypeName",
+ "src": "10815:4:0"
+ }
+ ],
+ "id": 1322,
+ "name": "VariableDeclaration",
+ "src": "10815:7:0"
+ },
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1323,
+ "name": "ElementaryTypeName",
+ "src": "10824:4:0"
+ }
+ ],
+ "id": 1324,
+ "name": "VariableDeclaration",
+ "src": "10824:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1325,
+ "name": "ElementaryTypeName",
+ "src": "10838:4:0"
+ }
+ ],
+ "id": 1326,
+ "name": "VariableDeclaration",
+ "src": "10838:13:0"
+ }
+ ],
+ "id": 1327,
+ "name": "ParameterList",
+ "src": "10803:49:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_transactionIds",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1328,
+ "name": "ElementaryTypeName",
+ "src": "10902:4:0"
+ }
+ ],
+ "id": 1329,
+ "name": "ArrayTypeName",
+ "src": "10902:6:0"
+ }
+ ],
+ "id": 1330,
+ "name": "VariableDeclaration",
+ "src": "10902:22:0"
+ }
+ ],
+ "id": 1331,
+ "name": "ParameterList",
+ "src": "10901:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionIdsTemp",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1333,
+ "name": "ElementaryTypeName",
+ "src": "10940:4:0"
+ }
+ ],
+ "id": 1334,
+ "name": "ArrayTypeName",
+ "src": "10940:6:0"
+ }
+ ],
+ "id": 1335,
+ "name": "VariableDeclaration",
+ "src": "10940:32:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1336,
+ "name": "ElementaryTypeName",
+ "src": "10979:4:0"
+ }
+ ],
+ "id": 1337,
+ "name": "ArrayTypeName",
+ "src": "10979:6:0"
+ }
+ ],
+ "id": 1338,
+ "name": "NewExpression",
+ "src": "10975:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1339,
+ "name": "Identifier",
+ "src": "10986:16:0"
+ }
+ ],
+ "id": 1340,
+ "name": "FunctionCall",
+ "src": "10975:28:0"
+ }
+ ],
+ "id": 1341,
+ "name": "VariableDeclarationStatement",
+ "src": "10940:63:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1342,
+ "name": "ElementaryTypeName",
+ "src": "11013:4:0"
+ }
+ ],
+ "id": 1343,
+ "name": "VariableDeclaration",
+ "src": "11013:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1344,
+ "name": "Literal",
+ "src": "11026:1:0"
+ }
+ ],
+ "id": 1345,
+ "name": "VariableDeclarationStatement",
+ "src": "11013:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1346,
+ "name": "ElementaryTypeName",
+ "src": "11037:4:0"
+ }
+ ],
+ "id": 1347,
+ "name": "VariableDeclaration",
+ "src": "11037:6:0"
+ }
+ ],
+ "id": 1348,
+ "name": "VariableDeclarationStatement",
+ "src": "11037:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1349,
+ "name": "Identifier",
+ "src": "11058:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1350,
+ "name": "Literal",
+ "src": "11060:1:0"
+ }
+ ],
+ "id": 1351,
+ "name": "Assignment",
+ "src": "11058:3:0"
+ }
+ ],
+ "id": 1352,
+ "name": "ExpressionStatement",
+ "src": "11058:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1353,
+ "name": "Identifier",
+ "src": "11063:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1354,
+ "name": "Identifier",
+ "src": "11065:16:0"
+ }
+ ],
+ "id": 1355,
+ "name": "BinaryOperation",
+ "src": "11063:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1356,
+ "name": "Identifier",
+ "src": "11083:1:0"
+ }
+ ],
+ "id": 1357,
+ "name": "UnaryOperation",
+ "src": "11083:3:0"
+ }
+ ],
+ "id": 1358,
+ "name": "ExpressionStatement",
+ "src": "11083:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1359,
+ "name": "Identifier",
+ "src": "11107:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1360,
+ "name": "Identifier",
+ "src": "11119:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1361,
+ "name": "Identifier",
+ "src": "11132:1:0"
+ }
+ ],
+ "id": 1362,
+ "name": "IndexAccess",
+ "src": "11119:15:0"
+ }
+ ],
+ "id": 1363,
+ "name": "MemberAccess",
+ "src": "11119:24:0"
+ }
+ ],
+ "id": 1364,
+ "name": "UnaryOperation",
+ "src": "11118:25:0"
+ }
+ ],
+ "id": 1365,
+ "name": "BinaryOperation",
+ "src": "11107:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1366,
+ "name": "Identifier",
+ "src": "11163:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1367,
+ "name": "Identifier",
+ "src": "11175:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1368,
+ "name": "Identifier",
+ "src": "11188:1:0"
+ }
+ ],
+ "id": 1369,
+ "name": "IndexAccess",
+ "src": "11175:15:0"
+ }
+ ],
+ "id": 1370,
+ "name": "MemberAccess",
+ "src": "11175:24:0"
+ }
+ ],
+ "id": 1371,
+ "name": "BinaryOperation",
+ "src": "11163:36:0"
+ }
+ ],
+ "id": 1372,
+ "name": "BinaryOperation",
+ "src": "11107:92:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1373,
+ "name": "Identifier",
+ "src": "11231:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1374,
+ "name": "Identifier",
+ "src": "11250:5:0"
+ }
+ ],
+ "id": 1375,
+ "name": "IndexAccess",
+ "src": "11231:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1376,
+ "name": "Identifier",
+ "src": "11259:1:0"
+ }
+ ],
+ "id": 1377,
+ "name": "Assignment",
+ "src": "11231:29:0"
+ }
+ ],
+ "id": 1378,
+ "name": "ExpressionStatement",
+ "src": "11231:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1379,
+ "name": "Identifier",
+ "src": "11278:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1380,
+ "name": "Literal",
+ "src": "11287:1:0"
+ }
+ ],
+ "id": 1381,
+ "name": "Assignment",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1382,
+ "name": "ExpressionStatement",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1383,
+ "name": "Block",
+ "src": "11213:90:0"
+ }
+ ],
+ "id": 1384,
+ "name": "IfStatement",
+ "src": "11100:203:0"
+ }
+ ],
+ "id": 1385,
+ "name": "ForStatement",
+ "src": "11053:250:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1386,
+ "name": "Identifier",
+ "src": "11312:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1387,
+ "name": "ElementaryTypeName",
+ "src": "11334:4:0"
+ }
+ ],
+ "id": 1388,
+ "name": "ArrayTypeName",
+ "src": "11334:6:0"
+ }
+ ],
+ "id": 1389,
+ "name": "NewExpression",
+ "src": "11330:10:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1390,
+ "name": "Identifier",
+ "src": "11341:2:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1391,
+ "name": "Identifier",
+ "src": "11346:4:0"
+ }
+ ],
+ "id": 1392,
+ "name": "BinaryOperation",
+ "src": "11341:9:0"
+ }
+ ],
+ "id": 1393,
+ "name": "FunctionCall",
+ "src": "11330:21:0"
+ }
+ ],
+ "id": 1394,
+ "name": "Assignment",
+ "src": "11312:39:0"
+ }
+ ],
+ "id": 1395,
+ "name": "ExpressionStatement",
+ "src": "11312:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1396,
+ "name": "Identifier",
+ "src": "11366:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1397,
+ "name": "Identifier",
+ "src": "11368:4:0"
+ }
+ ],
+ "id": 1398,
+ "name": "Assignment",
+ "src": "11366:6:0"
+ }
+ ],
+ "id": 1399,
+ "name": "ExpressionStatement",
+ "src": "11366:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1400,
+ "name": "Identifier",
+ "src": "11374:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1401,
+ "name": "Identifier",
+ "src": "11376:2:0"
+ }
+ ],
+ "id": 1402,
+ "name": "BinaryOperation",
+ "src": "11374:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1403,
+ "name": "Identifier",
+ "src": "11380:1:0"
+ }
+ ],
+ "id": 1404,
+ "name": "UnaryOperation",
+ "src": "11380:3:0"
+ }
+ ],
+ "id": 1405,
+ "name": "ExpressionStatement",
+ "src": "11380:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1406,
+ "name": "Identifier",
+ "src": "11397:15:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1407,
+ "name": "Identifier",
+ "src": "11413:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1408,
+ "name": "Identifier",
+ "src": "11417:4:0"
+ }
+ ],
+ "id": 1409,
+ "name": "BinaryOperation",
+ "src": "11413:8:0"
+ }
+ ],
+ "id": 1410,
+ "name": "IndexAccess",
+ "src": "11397:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1411,
+ "name": "Identifier",
+ "src": "11425:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1412,
+ "name": "Identifier",
+ "src": "11444:1:0"
+ }
+ ],
+ "id": 1413,
+ "name": "IndexAccess",
+ "src": "11425:21:0"
+ }
+ ],
+ "id": 1414,
+ "name": "Assignment",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1415,
+ "name": "ExpressionStatement",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1416,
+ "name": "ForStatement",
+ "src": "11361:85:0"
+ }
+ ],
+ "id": 1417,
+ "name": "Block",
+ "src": "10930:523:0"
+ }
+ ],
+ "id": 1418,
+ "name": "FunctionDefinition",
+ "src": "10777:676:0"
+ }
+ ],
+ "id": 1419,
+ "name": "ContractDefinition",
+ "src": "206:11249:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.sol": {
+ "id": "1",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 204,
+ "name": "PragmaDirective",
+ "src": "599:24:1"
+ },
+ {
+ "attributes": {
+ "file": "./MultiSigWallet.sol"
+ },
+ "id": 205,
+ "name": "ImportDirective",
+ "src": "625:30:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 456,
+ 1419
+ ],
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWallet"
+ },
+ "id": 206,
+ "name": "UserDefinedTypeName",
+ "src": "874:14:1"
+ }
+ ],
+ "id": 207,
+ "name": "InheritanceSpecifier",
+ "src": "874:14:1"
+ },
+ {
+ "attributes": {
+ "name": "ConfirmationTimeSet"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 208,
+ "name": "ElementaryTypeName",
+ "src": "922:4:1"
+ }
+ ],
+ "id": 209,
+ "name": "VariableDeclaration",
+ "src": "922:26:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 210,
+ "name": "ElementaryTypeName",
+ "src": "950:4:1"
+ }
+ ],
+ "id": 211,
+ "name": "VariableDeclaration",
+ "src": "950:21:1"
+ }
+ ],
+ "id": 212,
+ "name": "ParameterList",
+ "src": "921:51:1"
+ }
+ ],
+ "id": 213,
+ "name": "EventDefinition",
+ "src": "896:77:1"
+ },
+ {
+ "attributes": {
+ "name": "TimeLockChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 214,
+ "name": "ElementaryTypeName",
+ "src": "999:4:1"
+ }
+ ],
+ "id": 215,
+ "name": "VariableDeclaration",
+ "src": "999:22:1"
+ }
+ ],
+ "id": 216,
+ "name": "ParameterList",
+ "src": "998:24:1"
+ }
+ ],
+ "id": 217,
+ "name": "EventDefinition",
+ "src": "978:45:1"
+ },
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 218,
+ "name": "ElementaryTypeName",
+ "src": "1029:4:1"
+ }
+ ],
+ "id": 219,
+ "name": "VariableDeclaration",
+ "src": "1029:29:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTimes",
+ "type": "mapping(uint256 => uint256)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 220,
+ "name": "ElementaryTypeName",
+ "src": "1074:4:1"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 221,
+ "name": "ElementaryTypeName",
+ "src": "1082:4:1"
+ }
+ ],
+ "id": 222,
+ "name": "Mapping",
+ "src": "1065:22:1"
+ }
+ ],
+ "id": 223,
+ "name": "VariableDeclaration",
+ "src": "1065:47:1"
+ },
+ {
+ "attributes": {
+ "name": "notFullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 224,
+ "name": "ElementaryTypeName",
+ "src": "1146:4:1"
+ }
+ ],
+ "id": 225,
+ "name": "VariableDeclaration",
+ "src": "1146:18:1"
+ }
+ ],
+ "id": 226,
+ "name": "ParameterList",
+ "src": "1145:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "1176:7:1"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 228,
+ "name": "Identifier",
+ "src": "1185:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 229,
+ "name": "Identifier",
+ "src": "1197:13:1"
+ }
+ ],
+ "id": 230,
+ "name": "FunctionCall",
+ "src": "1185:26:1"
+ }
+ ],
+ "id": 231,
+ "name": "UnaryOperation",
+ "src": "1184:27:1"
+ }
+ ],
+ "id": 232,
+ "name": "FunctionCall",
+ "src": "1176:36:1"
+ }
+ ],
+ "id": 233,
+ "name": "ExpressionStatement",
+ "src": "1176:36:1"
+ },
+ {
+ "id": 234,
+ "name": "PlaceholderStatement",
+ "src": "1222:1:1"
+ }
+ ],
+ "id": 235,
+ "name": "Block",
+ "src": "1166:64:1"
+ }
+ ],
+ "id": 236,
+ "name": "ModifierDefinition",
+ "src": "1119:111:1"
+ },
+ {
+ "attributes": {
+ "name": "fullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 237,
+ "name": "ElementaryTypeName",
+ "src": "1260:4:1"
+ }
+ ],
+ "id": 238,
+ "name": "VariableDeclaration",
+ "src": "1260:18:1"
+ }
+ ],
+ "id": 239,
+ "name": "ParameterList",
+ "src": "1259:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "1290:7:1"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 241,
+ "name": "Identifier",
+ "src": "1298:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 242,
+ "name": "Identifier",
+ "src": "1310:13:1"
+ }
+ ],
+ "id": 243,
+ "name": "FunctionCall",
+ "src": "1298:26:1"
+ }
+ ],
+ "id": 244,
+ "name": "FunctionCall",
+ "src": "1290:35:1"
+ }
+ ],
+ "id": 245,
+ "name": "ExpressionStatement",
+ "src": "1290:35:1"
+ },
+ {
+ "id": 246,
+ "name": "PlaceholderStatement",
+ "src": "1335:1:1"
+ }
+ ],
+ "id": 247,
+ "name": "Block",
+ "src": "1280:63:1"
+ }
+ ],
+ "id": 248,
+ "name": "ModifierDefinition",
+ "src": "1236:107:1"
+ },
+ {
+ "attributes": {
+ "name": "pastTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 249,
+ "name": "ElementaryTypeName",
+ "src": "1371:4:1"
+ }
+ ],
+ "id": 250,
+ "name": "VariableDeclaration",
+ "src": "1371:18:1"
+ }
+ ],
+ "id": 251,
+ "name": "ParameterList",
+ "src": "1370:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 252,
+ "name": "Identifier",
+ "src": "1401:7:1"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 253,
+ "name": "Identifier",
+ "src": "1409:5:1"
+ }
+ ],
+ "id": 254,
+ "name": "MemberAccess",
+ "src": "1409:15:1"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 255,
+ "name": "Identifier",
+ "src": "1428:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 256,
+ "name": "Identifier",
+ "src": "1446:13:1"
+ }
+ ],
+ "id": 257,
+ "name": "IndexAccess",
+ "src": "1428:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 258,
+ "name": "Identifier",
+ "src": "1463:17:1"
+ }
+ ],
+ "id": 259,
+ "name": "BinaryOperation",
+ "src": "1428:52:1"
+ }
+ ],
+ "id": 260,
+ "name": "BinaryOperation",
+ "src": "1409:71:1"
+ }
+ ],
+ "id": 261,
+ "name": "FunctionCall",
+ "src": "1401:80:1"
+ }
+ ],
+ "id": 262,
+ "name": "ExpressionStatement",
+ "src": "1401:80:1"
+ },
+ {
+ "id": 263,
+ "name": "PlaceholderStatement",
+ "src": "1491:1:1"
+ }
+ ],
+ "id": 264,
+ "name": "Block",
+ "src": "1391:108:1"
+ }
+ ],
+ "id": 265,
+ "name": "ModifierDefinition",
+ "src": "1349:150:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWalletWithTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 266,
+ "name": "ElementaryTypeName",
+ "src": "1920:7:1"
+ }
+ ],
+ "id": 267,
+ "name": "ArrayTypeName",
+ "src": "1920:9:1"
+ }
+ ],
+ "id": 268,
+ "name": "VariableDeclaration",
+ "src": "1920:17:1"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 269,
+ "name": "ElementaryTypeName",
+ "src": "1939:4:1"
+ }
+ ],
+ "id": 270,
+ "name": "VariableDeclaration",
+ "src": "1939:14:1"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 271,
+ "name": "ElementaryTypeName",
+ "src": "1955:4:1"
+ }
+ ],
+ "id": 272,
+ "name": "VariableDeclaration",
+ "src": "1955:23:1"
+ }
+ ],
+ "id": 273,
+ "name": "ParameterList",
+ "src": "1919:60:1"
+ },
+ {
+ "children": [],
+ "id": 278,
+ "name": "ParameterList",
+ "src": "2042:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWallet)",
+ "value": "MultiSigWallet"
+ },
+ "id": 274,
+ "name": "Identifier",
+ "src": "2003:14:1"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 275,
+ "name": "Identifier",
+ "src": "2018:7:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 276,
+ "name": "Identifier",
+ "src": "2027:9:1"
+ }
+ ],
+ "id": 277,
+ "name": "ModifierInvocation",
+ "src": "2003:34:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 279,
+ "name": "Identifier",
+ "src": "2052:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 280,
+ "name": "Identifier",
+ "src": "2072:18:1"
+ }
+ ],
+ "id": 281,
+ "name": "Assignment",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 282,
+ "name": "ExpressionStatement",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 283,
+ "name": "Block",
+ "src": "2042:55:1"
+ }
+ ],
+ "id": 284,
+ "name": "FunctionDefinition",
+ "src": "1884:213:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 285,
+ "name": "ElementaryTypeName",
+ "src": "2325:4:1"
+ }
+ ],
+ "id": 286,
+ "name": "VariableDeclaration",
+ "src": "2325:23:1"
+ }
+ ],
+ "id": 287,
+ "name": "ParameterList",
+ "src": "2324:25:1"
+ },
+ {
+ "children": [],
+ "id": 290,
+ "name": "ParameterList",
+ "src": "2388:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 288,
+ "name": "Identifier",
+ "src": "2373:10:1"
+ }
+ ],
+ "id": 289,
+ "name": "ModifierInvocation",
+ "src": "2373:10:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 291,
+ "name": "Identifier",
+ "src": "2398:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 292,
+ "name": "Identifier",
+ "src": "2418:18:1"
+ }
+ ],
+ "id": 293,
+ "name": "Assignment",
+ "src": "2398:38:1"
+ }
+ ],
+ "id": 294,
+ "name": "ExpressionStatement",
+ "src": "2398:38:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "TimeLockChange"
+ },
+ "id": 295,
+ "name": "Identifier",
+ "src": "2446:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 296,
+ "name": "Identifier",
+ "src": "2461:18:1"
+ }
+ ],
+ "id": 297,
+ "name": "FunctionCall",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 298,
+ "name": "ExpressionStatement",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 299,
+ "name": "Block",
+ "src": "2388:99:1"
+ }
+ ],
+ "id": 300,
+ "name": "FunctionDefinition",
+ "src": "2301:186:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 301,
+ "name": "ElementaryTypeName",
+ "src": "2621:4:1"
+ }
+ ],
+ "id": 302,
+ "name": "VariableDeclaration",
+ "src": "2621:18:1"
+ }
+ ],
+ "id": 303,
+ "name": "ParameterList",
+ "src": "2620:20:1"
+ },
+ {
+ "children": [],
+ "id": 319,
+ "name": "ParameterList",
+ "src": "2822:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 304,
+ "name": "Identifier",
+ "src": "2664:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 305,
+ "name": "Identifier",
+ "src": "2676:3:1"
+ }
+ ],
+ "id": 306,
+ "name": "MemberAccess",
+ "src": "2676:10:1"
+ }
+ ],
+ "id": 307,
+ "name": "ModifierInvocation",
+ "src": "2664:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 308,
+ "name": "Identifier",
+ "src": "2696:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 309,
+ "name": "Identifier",
+ "src": "2714:13:1"
+ }
+ ],
+ "id": 310,
+ "name": "ModifierInvocation",
+ "src": "2696:32:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 311,
+ "name": "Identifier",
+ "src": "2737:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 312,
+ "name": "Identifier",
+ "src": "2750:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 313,
+ "name": "Identifier",
+ "src": "2765:3:1"
+ }
+ ],
+ "id": 314,
+ "name": "MemberAccess",
+ "src": "2765:10:1"
+ }
+ ],
+ "id": 315,
+ "name": "ModifierInvocation",
+ "src": "2737:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 316,
+ "name": "Identifier",
+ "src": "2785:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 317,
+ "name": "Identifier",
+ "src": "2803:13:1"
+ }
+ ],
+ "id": 318,
+ "name": "ModifierInvocation",
+ "src": "2785:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 320,
+ "name": "Identifier",
+ "src": "2832:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 321,
+ "name": "Identifier",
+ "src": "2846:13:1"
+ }
+ ],
+ "id": 324,
+ "name": "IndexAccess",
+ "src": "2832:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 322,
+ "name": "Identifier",
+ "src": "2861:3:1"
+ }
+ ],
+ "id": 323,
+ "name": "MemberAccess",
+ "src": "2861:10:1"
+ }
+ ],
+ "id": 325,
+ "name": "IndexAccess",
+ "src": "2832:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 326,
+ "name": "Literal",
+ "src": "2875:4:1"
+ }
+ ],
+ "id": 327,
+ "name": "Assignment",
+ "src": "2832:47:1"
+ }
+ ],
+ "id": 328,
+ "name": "ExpressionStatement",
+ "src": "2832:47:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 329,
+ "name": "Identifier",
+ "src": "2889:12:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 330,
+ "name": "Identifier",
+ "src": "2902:3:1"
+ }
+ ],
+ "id": 331,
+ "name": "MemberAccess",
+ "src": "2902:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 332,
+ "name": "Identifier",
+ "src": "2914:13:1"
+ }
+ ],
+ "id": 333,
+ "name": "FunctionCall",
+ "src": "2889:39:1"
+ }
+ ],
+ "id": 334,
+ "name": "ExpressionStatement",
+ "src": "2889:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 335,
+ "name": "Identifier",
+ "src": "2942:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 336,
+ "name": "Identifier",
+ "src": "2954:13:1"
+ }
+ ],
+ "id": 337,
+ "name": "FunctionCall",
+ "src": "2942:26:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256)",
+ "value": "setConfirmationTime"
+ },
+ "id": 338,
+ "name": "Identifier",
+ "src": "2984:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 339,
+ "name": "Identifier",
+ "src": "3004:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 340,
+ "name": "Identifier",
+ "src": "3019:5:1"
+ }
+ ],
+ "id": 341,
+ "name": "MemberAccess",
+ "src": "3019:15:1"
+ }
+ ],
+ "id": 342,
+ "name": "FunctionCall",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 343,
+ "name": "ExpressionStatement",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 344,
+ "name": "Block",
+ "src": "2970:76:1"
+ }
+ ],
+ "id": 345,
+ "name": "IfStatement",
+ "src": "2938:108:1"
+ }
+ ],
+ "id": 346,
+ "name": "Block",
+ "src": "2822:230:1"
+ }
+ ],
+ "id": 347,
+ "name": "FunctionDefinition",
+ "src": "2593:459:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 348,
+ "name": "ElementaryTypeName",
+ "src": "3204:4:1"
+ }
+ ],
+ "id": 349,
+ "name": "VariableDeclaration",
+ "src": "3204:18:1"
+ }
+ ],
+ "id": 350,
+ "name": "ParameterList",
+ "src": "3203:20:1"
+ },
+ {
+ "children": [],
+ "id": 366,
+ "name": "ParameterList",
+ "src": "3396:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 351,
+ "name": "Identifier",
+ "src": "3247:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 352,
+ "name": "Identifier",
+ "src": "3259:3:1"
+ }
+ ],
+ "id": 353,
+ "name": "MemberAccess",
+ "src": "3259:10:1"
+ }
+ ],
+ "id": 354,
+ "name": "ModifierInvocation",
+ "src": "3247:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 355,
+ "name": "Identifier",
+ "src": "3279:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 356,
+ "name": "Identifier",
+ "src": "3289:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 357,
+ "name": "Identifier",
+ "src": "3304:3:1"
+ }
+ ],
+ "id": 358,
+ "name": "MemberAccess",
+ "src": "3304:10:1"
+ }
+ ],
+ "id": 359,
+ "name": "ModifierInvocation",
+ "src": "3279:36:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 360,
+ "name": "Identifier",
+ "src": "3324:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 361,
+ "name": "Identifier",
+ "src": "3336:13:1"
+ }
+ ],
+ "id": 362,
+ "name": "ModifierInvocation",
+ "src": "3324:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 363,
+ "name": "Identifier",
+ "src": "3359:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 364,
+ "name": "Identifier",
+ "src": "3377:13:1"
+ }
+ ],
+ "id": 365,
+ "name": "ModifierInvocation",
+ "src": "3359:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 367,
+ "name": "Identifier",
+ "src": "3406:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 368,
+ "name": "Identifier",
+ "src": "3420:13:1"
+ }
+ ],
+ "id": 371,
+ "name": "IndexAccess",
+ "src": "3406:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 369,
+ "name": "Identifier",
+ "src": "3435:3:1"
+ }
+ ],
+ "id": 370,
+ "name": "MemberAccess",
+ "src": "3435:10:1"
+ }
+ ],
+ "id": 372,
+ "name": "IndexAccess",
+ "src": "3406:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 373,
+ "name": "Literal",
+ "src": "3449:5:1"
+ }
+ ],
+ "id": 374,
+ "name": "Assignment",
+ "src": "3406:48:1"
+ }
+ ],
+ "id": 375,
+ "name": "ExpressionStatement",
+ "src": "3406:48:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 376,
+ "name": "Identifier",
+ "src": "3464:10:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 377,
+ "name": "Identifier",
+ "src": "3475:3:1"
+ }
+ ],
+ "id": 378,
+ "name": "MemberAccess",
+ "src": "3475:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 379,
+ "name": "Identifier",
+ "src": "3487:13:1"
+ }
+ ],
+ "id": 380,
+ "name": "FunctionCall",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 381,
+ "name": "ExpressionStatement",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 382,
+ "name": "Block",
+ "src": "3396:112:1"
+ }
+ ],
+ "id": 383,
+ "name": "FunctionDefinition",
+ "src": "3176:332:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 384,
+ "name": "ElementaryTypeName",
+ "src": "3650:4:1"
+ }
+ ],
+ "id": 385,
+ "name": "VariableDeclaration",
+ "src": "3650:18:1"
+ }
+ ],
+ "id": 386,
+ "name": "ParameterList",
+ "src": "3649:20:1"
+ },
+ {
+ "children": [],
+ "id": 396,
+ "name": "ParameterList",
+ "src": "3798:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 387,
+ "name": "Identifier",
+ "src": "3693:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 388,
+ "name": "Identifier",
+ "src": "3705:13:1"
+ }
+ ],
+ "id": 389,
+ "name": "ModifierInvocation",
+ "src": "3693:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 390,
+ "name": "Identifier",
+ "src": "3728:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 391,
+ "name": "Identifier",
+ "src": "3743:13:1"
+ }
+ ],
+ "id": 392,
+ "name": "ModifierInvocation",
+ "src": "3728:29:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "pastTimeLock"
+ },
+ "id": 393,
+ "name": "Identifier",
+ "src": "3766:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 394,
+ "name": "Identifier",
+ "src": "3779:13:1"
+ }
+ ],
+ "id": 395,
+ "name": "ModifierInvocation",
+ "src": "3766:27:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 397,
+ "name": "UserDefinedTypeName",
+ "src": "3808:11:1"
+ }
+ ],
+ "id": 398,
+ "name": "VariableDeclaration",
+ "src": "3808:22:1"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 399,
+ "name": "Identifier",
+ "src": "3833:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 400,
+ "name": "Identifier",
+ "src": "3846:13:1"
+ }
+ ],
+ "id": 401,
+ "name": "IndexAccess",
+ "src": "3833:27:1"
+ }
+ ],
+ "id": 402,
+ "name": "VariableDeclarationStatement",
+ "src": "3808:52:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 403,
+ "name": "Identifier",
+ "src": "3870:2:1"
+ }
+ ],
+ "id": 405,
+ "name": "MemberAccess",
+ "src": "3870:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 406,
+ "name": "Literal",
+ "src": "3884:4:1"
+ }
+ ],
+ "id": 407,
+ "name": "Assignment",
+ "src": "3870:18:1"
+ }
+ ],
+ "id": 408,
+ "name": "ExpressionStatement",
+ "src": "3870:18:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 409,
+ "name": "Identifier",
+ "src": "3902:2:1"
+ }
+ ],
+ "id": 410,
+ "name": "MemberAccess",
+ "src": "3902:14:1"
+ }
+ ],
+ "id": 411,
+ "name": "MemberAccess",
+ "src": "3902:19:1"
+ }
+ ],
+ "id": 412,
+ "name": "MemberAccess",
+ "src": "3902:25:1"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 413,
+ "name": "Identifier",
+ "src": "3928:2:1"
+ }
+ ],
+ "id": 414,
+ "name": "MemberAccess",
+ "src": "3928:8:1"
+ }
+ ],
+ "id": 415,
+ "name": "FunctionCall",
+ "src": "3902:35:1"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 416,
+ "name": "Identifier",
+ "src": "3938:2:1"
+ }
+ ],
+ "id": 417,
+ "name": "MemberAccess",
+ "src": "3938:7:1"
+ }
+ ],
+ "id": 418,
+ "name": "FunctionCall",
+ "src": "3902:44:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 419,
+ "name": "Identifier",
+ "src": "3960:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 420,
+ "name": "Identifier",
+ "src": "3970:13:1"
+ }
+ ],
+ "id": 421,
+ "name": "FunctionCall",
+ "src": "3960:24:1"
+ }
+ ],
+ "id": 422,
+ "name": "ExpressionStatement",
+ "src": "3960:24:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 423,
+ "name": "Identifier",
+ "src": "4013:16:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 424,
+ "name": "Identifier",
+ "src": "4030:13:1"
+ }
+ ],
+ "id": 425,
+ "name": "FunctionCall",
+ "src": "4013:31:1"
+ }
+ ],
+ "id": 426,
+ "name": "ExpressionStatement",
+ "src": "4013:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 427,
+ "name": "Identifier",
+ "src": "4058:2:1"
+ }
+ ],
+ "id": 429,
+ "name": "MemberAccess",
+ "src": "4058:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 430,
+ "name": "Literal",
+ "src": "4072:5:1"
+ }
+ ],
+ "id": 431,
+ "name": "Assignment",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 432,
+ "name": "ExpressionStatement",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 433,
+ "name": "Block",
+ "src": "3999:89:1"
+ }
+ ],
+ "id": 434,
+ "name": "IfStatement",
+ "src": "3898:190:1"
+ }
+ ],
+ "id": 435,
+ "name": "Block",
+ "src": "3798:296:1"
+ }
+ ],
+ "id": 436,
+ "name": "FunctionDefinition",
+ "src": "3622:472:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "setConfirmationTime",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 437,
+ "name": "ElementaryTypeName",
+ "src": "4233:4:1"
+ }
+ ],
+ "id": 438,
+ "name": "VariableDeclaration",
+ "src": "4233:18:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 439,
+ "name": "ElementaryTypeName",
+ "src": "4253:4:1"
+ }
+ ],
+ "id": 440,
+ "name": "VariableDeclaration",
+ "src": "4253:21:1"
+ }
+ ],
+ "id": 441,
+ "name": "ParameterList",
+ "src": "4232:43:1"
+ },
+ {
+ "children": [],
+ "id": 442,
+ "name": "ParameterList",
+ "src": "4297:0:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 443,
+ "name": "Identifier",
+ "src": "4307:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 444,
+ "name": "Identifier",
+ "src": "4325:13:1"
+ }
+ ],
+ "id": 445,
+ "name": "IndexAccess",
+ "src": "4307:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 446,
+ "name": "Identifier",
+ "src": "4342:16:1"
+ }
+ ],
+ "id": 447,
+ "name": "Assignment",
+ "src": "4307:51:1"
+ }
+ ],
+ "id": 448,
+ "name": "ExpressionStatement",
+ "src": "4307:51:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256) constant",
+ "value": "ConfirmationTimeSet"
+ },
+ "id": 449,
+ "name": "Identifier",
+ "src": "4368:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 450,
+ "name": "Identifier",
+ "src": "4388:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 451,
+ "name": "Identifier",
+ "src": "4403:16:1"
+ }
+ ],
+ "id": 452,
+ "name": "FunctionCall",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 453,
+ "name": "ExpressionStatement",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 454,
+ "name": "Block",
+ "src": "4297:130:1"
+ }
+ ],
+ "id": 455,
+ "name": "FunctionDefinition",
+ "src": "4204:223:1"
+ }
+ ],
+ "id": 456,
+ "name": "ContractDefinition",
+ "src": "835:3594:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol": {
+ "id": "2",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:2"
+ },
+ {
+ "attributes": {
+ "file": "../../multisig/MultiSigWalletWithTimeLock.sol"
+ },
+ "id": 2,
+ "name": "ImportDirective",
+ "src": "605:55:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 202,
+ 456,
+ 1419
+ ],
+ "name": "AssetProxyOwner"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "id": 3,
+ "name": "UserDefinedTypeName",
+ "src": "695:26:2"
+ }
+ ],
+ "id": 4,
+ "name": "InheritanceSpecifier",
+ "src": "695:26:2"
+ },
+ {
+ "attributes": {
+ "name": "AssetProxyRegistration"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 5,
+ "name": "ElementaryTypeName",
+ "src": "758:7:2"
+ }
+ ],
+ "id": 6,
+ "name": "VariableDeclaration",
+ "src": "758:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 7,
+ "name": "ElementaryTypeName",
+ "src": "786:4:2"
+ }
+ ],
+ "id": 8,
+ "name": "VariableDeclaration",
+ "src": "786:17:2"
+ }
+ ],
+ "id": 9,
+ "name": "ParameterList",
+ "src": "757:47:2"
+ }
+ ],
+ "id": 10,
+ "name": "EventDefinition",
+ "src": "729:76:2"
+ },
+ {
+ "attributes": {
+ "name": "isAssetProxyRegistered",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 11,
+ "name": "ElementaryTypeName",
+ "src": "990:7:2"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 12,
+ "name": "ElementaryTypeName",
+ "src": "1001:4:2"
+ }
+ ],
+ "id": 13,
+ "name": "Mapping",
+ "src": "981:25:2"
+ }
+ ],
+ "id": 14,
+ "name": "VariableDeclaration",
+ "src": "981:55:2"
+ },
+ {
+ "attributes": {
+ "name": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 15,
+ "name": "ElementaryTypeName",
+ "src": "1043:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(bytes4)",
+ "value": "bytes4"
+ },
+ "id": 16,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1114:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes32",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () returns (bytes32)",
+ "value": "keccak256"
+ },
+ "id": 17,
+ "name": "Identifier",
+ "src": "1121:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "72656d6f7665417574686f72697a6564416464726573734174496e64657828616464726573732c75696e7432353629",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"removeAuthorizedAddressAtIndex(address,uint256)\"",
+ "value": "removeAuthorizedAddressAtIndex(address,uint256)"
+ },
+ "id": 18,
+ "name": "Literal",
+ "src": "1131:49:2"
+ }
+ ],
+ "id": 19,
+ "name": "FunctionCall",
+ "src": "1121:60:2"
+ }
+ ],
+ "id": 20,
+ "name": "FunctionCall",
+ "src": "1114:68:2"
+ }
+ ],
+ "id": 21,
+ "name": "VariableDeclaration",
+ "src": "1043:139:2"
+ },
+ {
+ "attributes": {
+ "name": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 22,
+ "name": "ElementaryTypeName",
+ "src": "1385:7:2"
+ }
+ ],
+ "id": 23,
+ "name": "VariableDeclaration",
+ "src": "1385:21:2"
+ }
+ ],
+ "id": 24,
+ "name": "ParameterList",
+ "src": "1384:23:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 25,
+ "name": "UserDefinedTypeName",
+ "src": "1418:11:2"
+ }
+ ],
+ "id": 26,
+ "name": "VariableDeclaration",
+ "src": "1418:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 27,
+ "name": "Identifier",
+ "src": "1443:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 28,
+ "name": "Identifier",
+ "src": "1456:13:2"
+ }
+ ],
+ "id": 29,
+ "name": "IndexAccess",
+ "src": "1443:27:2"
+ }
+ ],
+ "id": 30,
+ "name": "VariableDeclarationStatement",
+ "src": "1418:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 31,
+ "name": "Identifier",
+ "src": "1480:7:2"
+ },
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 32,
+ "name": "Identifier",
+ "src": "1488:22:2"
+ },
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 33,
+ "name": "Identifier",
+ "src": "1511:2:2"
+ }
+ ],
+ "id": 34,
+ "name": "MemberAccess",
+ "src": "1511:14:2"
+ }
+ ],
+ "id": 35,
+ "name": "IndexAccess",
+ "src": "1488:38:2"
+ }
+ ],
+ "id": 36,
+ "name": "FunctionCall",
+ "src": "1480:47:2"
+ }
+ ],
+ "id": 37,
+ "name": "ExpressionStatement",
+ "src": "1480:47:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 38,
+ "name": "Identifier",
+ "src": "1537:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bytes memory,uint256) returns (bytes4)",
+ "value": "readBytes4"
+ },
+ "id": 39,
+ "name": "Identifier",
+ "src": "1545:10:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 40,
+ "name": "Identifier",
+ "src": "1556:2:2"
+ }
+ ],
+ "id": 41,
+ "name": "MemberAccess",
+ "src": "1556:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 42,
+ "name": "Literal",
+ "src": "1565:1:2"
+ }
+ ],
+ "id": 43,
+ "name": "FunctionCall",
+ "src": "1545:22:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR"
+ },
+ "id": 44,
+ "name": "Identifier",
+ "src": "1571:43:2"
+ }
+ ],
+ "id": 45,
+ "name": "BinaryOperation",
+ "src": "1545:69:2"
+ }
+ ],
+ "id": 46,
+ "name": "FunctionCall",
+ "src": "1537:78:2"
+ }
+ ],
+ "id": 47,
+ "name": "ExpressionStatement",
+ "src": "1537:78:2"
+ },
+ {
+ "id": 48,
+ "name": "PlaceholderStatement",
+ "src": "1625:1:2"
+ }
+ ],
+ "id": 49,
+ "name": "Block",
+ "src": "1408:225:2"
+ }
+ ],
+ "id": 50,
+ "name": "ModifierDefinition",
+ "src": "1338:295:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "AssetProxyOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 51,
+ "name": "ElementaryTypeName",
+ "src": "2131:7:2"
+ }
+ ],
+ "id": 52,
+ "name": "ArrayTypeName",
+ "src": "2131:9:2"
+ }
+ ],
+ "id": 53,
+ "name": "VariableDeclaration",
+ "src": "2131:24:2"
+ },
+ {
+ "attributes": {
+ "name": "_assetProxyContracts",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 54,
+ "name": "ElementaryTypeName",
+ "src": "2165:7:2"
+ }
+ ],
+ "id": 55,
+ "name": "ArrayTypeName",
+ "src": "2165:9:2"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "2165:37:2"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 57,
+ "name": "ElementaryTypeName",
+ "src": "2212:7:2"
+ }
+ ],
+ "id": 58,
+ "name": "VariableDeclaration",
+ "src": "2212:17:2"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 59,
+ "name": "ElementaryTypeName",
+ "src": "2239:7:2"
+ }
+ ],
+ "id": 60,
+ "name": "VariableDeclaration",
+ "src": "2239:26:2"
+ }
+ ],
+ "id": 61,
+ "name": "ParameterList",
+ "src": "2121:150:2"
+ },
+ {
+ "children": [],
+ "id": 67,
+ "name": "ParameterList",
+ "src": "2366:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWalletWithTimeLock)",
+ "value": "MultiSigWalletWithTimeLock"
+ },
+ "id": 62,
+ "name": "Identifier",
+ "src": "2295:26:2"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 63,
+ "name": "Identifier",
+ "src": "2322:7:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "2331:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 65,
+ "name": "Identifier",
+ "src": "2342:18:2"
+ }
+ ],
+ "id": 66,
+ "name": "ModifierInvocation",
+ "src": "2295:66:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 68,
+ "name": "ElementaryTypeName",
+ "src": "2381:7:2"
+ }
+ ],
+ "id": 69,
+ "name": "VariableDeclaration",
+ "src": "2381:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 70,
+ "name": "Literal",
+ "src": "2393:1:2"
+ }
+ ],
+ "id": 71,
+ "name": "VariableDeclarationStatement",
+ "src": "2381:13:2"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 72,
+ "name": "Identifier",
+ "src": "2396:1:2"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 73,
+ "name": "Identifier",
+ "src": "2400:20:2"
+ }
+ ],
+ "id": 74,
+ "name": "MemberAccess",
+ "src": "2400:27:2"
+ }
+ ],
+ "id": 75,
+ "name": "BinaryOperation",
+ "src": "2396:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "2429:1:2"
+ }
+ ],
+ "id": 77,
+ "name": "UnaryOperation",
+ "src": "2429:3:2"
+ }
+ ],
+ "id": 78,
+ "name": "ExpressionStatement",
+ "src": "2429:3:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxy",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 79,
+ "name": "ElementaryTypeName",
+ "src": "2448:7:2"
+ }
+ ],
+ "id": 80,
+ "name": "VariableDeclaration",
+ "src": "2448:18:2"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 81,
+ "name": "Identifier",
+ "src": "2469:20:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 82,
+ "name": "Identifier",
+ "src": "2490:1:2"
+ }
+ ],
+ "id": 83,
+ "name": "IndexAccess",
+ "src": "2469:23:2"
+ }
+ ],
+ "id": 84,
+ "name": "VariableDeclarationStatement",
+ "src": "2448:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 85,
+ "name": "Identifier",
+ "src": "2506:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 86,
+ "name": "Identifier",
+ "src": "2514:10:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 87,
+ "name": "ElementaryTypeNameExpression",
+ "src": "2528:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 88,
+ "name": "Literal",
+ "src": "2536:1:2"
+ }
+ ],
+ "id": 89,
+ "name": "FunctionCall",
+ "src": "2528:10:2"
+ }
+ ],
+ "id": 90,
+ "name": "BinaryOperation",
+ "src": "2514:24:2"
+ }
+ ],
+ "id": 91,
+ "name": "FunctionCall",
+ "src": "2506:33:2"
+ }
+ ],
+ "id": 92,
+ "name": "ExpressionStatement",
+ "src": "2506:33:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 93,
+ "name": "Identifier",
+ "src": "2553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 94,
+ "name": "Identifier",
+ "src": "2576:10:2"
+ }
+ ],
+ "id": 95,
+ "name": "IndexAccess",
+ "src": "2553:34:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 96,
+ "name": "Literal",
+ "src": "2590:4:2"
+ }
+ ],
+ "id": 97,
+ "name": "Assignment",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 98,
+ "name": "ExpressionStatement",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 99,
+ "name": "Block",
+ "src": "2434:171:2"
+ }
+ ],
+ "id": 100,
+ "name": "ForStatement",
+ "src": "2376:229:2"
+ }
+ ],
+ "id": 101,
+ "name": "Block",
+ "src": "2366:245:2"
+ }
+ ],
+ "id": 102,
+ "name": "FunctionDefinition",
+ "src": "2097:514:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "registerAssetProxy",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 103,
+ "name": "ElementaryTypeName",
+ "src": "2923:7:2"
+ }
+ ],
+ "id": 104,
+ "name": "VariableDeclaration",
+ "src": "2923:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 105,
+ "name": "ElementaryTypeName",
+ "src": "2951:4:2"
+ }
+ ],
+ "id": 106,
+ "name": "VariableDeclaration",
+ "src": "2951:17:2"
+ }
+ ],
+ "id": 107,
+ "name": "ParameterList",
+ "src": "2922:47:2"
+ },
+ {
+ "children": [],
+ "id": 113,
+ "name": "ParameterList",
+ "src": "3044:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 108,
+ "name": "Identifier",
+ "src": "2993:10:2"
+ }
+ ],
+ "id": 109,
+ "name": "ModifierInvocation",
+ "src": "2993:10:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 110,
+ "name": "Identifier",
+ "src": "3012:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "3020:18:2"
+ }
+ ],
+ "id": 112,
+ "name": "ModifierInvocation",
+ "src": "3012:27:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 114,
+ "name": "Identifier",
+ "src": "3054:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 115,
+ "name": "Identifier",
+ "src": "3077:18:2"
+ }
+ ],
+ "id": 116,
+ "name": "IndexAccess",
+ "src": "3054:42:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 117,
+ "name": "Identifier",
+ "src": "3099:12:2"
+ }
+ ],
+ "id": 118,
+ "name": "Assignment",
+ "src": "3054:57:2"
+ }
+ ],
+ "id": 119,
+ "name": "ExpressionStatement",
+ "src": "3054:57:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,bool) constant",
+ "value": "AssetProxyRegistration"
+ },
+ "id": 120,
+ "name": "Identifier",
+ "src": "3121:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 121,
+ "name": "Identifier",
+ "src": "3144:18:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 122,
+ "name": "Identifier",
+ "src": "3164:12:2"
+ }
+ ],
+ "id": 123,
+ "name": "FunctionCall",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 124,
+ "name": "ExpressionStatement",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 125,
+ "name": "Block",
+ "src": "3044:140:2"
+ }
+ ],
+ "id": 126,
+ "name": "FunctionDefinition",
+ "src": "2895:289:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 127,
+ "name": "ElementaryTypeName",
+ "src": "3367:7:2"
+ }
+ ],
+ "id": 128,
+ "name": "VariableDeclaration",
+ "src": "3367:21:2"
+ }
+ ],
+ "id": 129,
+ "name": "ParameterList",
+ "src": "3366:23:2"
+ },
+ {
+ "children": [],
+ "id": 139,
+ "name": "ParameterList",
+ "src": "3543:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 130,
+ "name": "Identifier",
+ "src": "3413:11:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 131,
+ "name": "Identifier",
+ "src": "3425:13:2"
+ }
+ ],
+ "id": 132,
+ "name": "ModifierInvocation",
+ "src": "3413:26:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 133,
+ "name": "Identifier",
+ "src": "3448:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 134,
+ "name": "Identifier",
+ "src": "3463:13:2"
+ }
+ ],
+ "id": 135,
+ "name": "ModifierInvocation",
+ "src": "3448:29:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "id": 136,
+ "name": "Identifier",
+ "src": "3486:37:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 137,
+ "name": "Identifier",
+ "src": "3524:13:2"
+ }
+ ],
+ "id": 138,
+ "name": "ModifierInvocation",
+ "src": "3486:52:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 140,
+ "name": "UserDefinedTypeName",
+ "src": "3553:11:2"
+ }
+ ],
+ "id": 141,
+ "name": "VariableDeclaration",
+ "src": "3553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 142,
+ "name": "Identifier",
+ "src": "3578:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 143,
+ "name": "Identifier",
+ "src": "3591:13:2"
+ }
+ ],
+ "id": 144,
+ "name": "IndexAccess",
+ "src": "3578:27:2"
+ }
+ ],
+ "id": 145,
+ "name": "VariableDeclarationStatement",
+ "src": "3553:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "3615:2:2"
+ }
+ ],
+ "id": 148,
+ "name": "MemberAccess",
+ "src": "3615:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 149,
+ "name": "Literal",
+ "src": "3629:4:2"
+ }
+ ],
+ "id": 150,
+ "name": "Assignment",
+ "src": "3615:18:2"
+ }
+ ],
+ "id": 151,
+ "name": "ExpressionStatement",
+ "src": "3615:18:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 152,
+ "name": "Identifier",
+ "src": "3701:2:2"
+ }
+ ],
+ "id": 153,
+ "name": "MemberAccess",
+ "src": "3701:14:2"
+ }
+ ],
+ "id": 154,
+ "name": "MemberAccess",
+ "src": "3701:19:2"
+ }
+ ],
+ "id": 155,
+ "name": "MemberAccess",
+ "src": "3701:25:2"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "3727:2:2"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "3727:8:2"
+ }
+ ],
+ "id": 158,
+ "name": "FunctionCall",
+ "src": "3701:35:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "3737:2:2"
+ }
+ ],
+ "id": 160,
+ "name": "MemberAccess",
+ "src": "3737:7:2"
+ }
+ ],
+ "id": 161,
+ "name": "FunctionCall",
+ "src": "3701:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 162,
+ "name": "Identifier",
+ "src": "3759:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 163,
+ "name": "Identifier",
+ "src": "3769:13:2"
+ }
+ ],
+ "id": 164,
+ "name": "FunctionCall",
+ "src": "3759:24:2"
+ }
+ ],
+ "id": 165,
+ "name": "ExpressionStatement",
+ "src": "3759:24:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 166,
+ "name": "Identifier",
+ "src": "3812:16:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 167,
+ "name": "Identifier",
+ "src": "3829:13:2"
+ }
+ ],
+ "id": 168,
+ "name": "FunctionCall",
+ "src": "3812:31:2"
+ }
+ ],
+ "id": 169,
+ "name": "ExpressionStatement",
+ "src": "3812:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 170,
+ "name": "Identifier",
+ "src": "3857:2:2"
+ }
+ ],
+ "id": 172,
+ "name": "MemberAccess",
+ "src": "3857:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 173,
+ "name": "Literal",
+ "src": "3871:5:2"
+ }
+ ],
+ "id": 174,
+ "name": "Assignment",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 175,
+ "name": "ExpressionStatement",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 176,
+ "name": "Block",
+ "src": "3798:89:2"
+ }
+ ],
+ "id": 177,
+ "name": "IfStatement",
+ "src": "3697:190:2"
+ }
+ ],
+ "id": 178,
+ "name": "Block",
+ "src": "3543:350:2"
+ }
+ ],
+ "id": 179,
+ "name": "FunctionDefinition",
+ "src": "3320:573:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "readBytes4",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "b",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 180,
+ "name": "ElementaryTypeName",
+ "src": "4164:5:2"
+ }
+ ],
+ "id": 181,
+ "name": "VariableDeclaration",
+ "src": "4164:14:2"
+ },
+ {
+ "attributes": {
+ "name": "index",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 182,
+ "name": "ElementaryTypeName",
+ "src": "4188:7:2"
+ }
+ ],
+ "id": 183,
+ "name": "VariableDeclaration",
+ "src": "4188:13:2"
+ }
+ ],
+ "id": 184,
+ "name": "ParameterList",
+ "src": "4154:53:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "result",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 185,
+ "name": "ElementaryTypeName",
+ "src": "4242:6:2"
+ }
+ ],
+ "id": 186,
+ "name": "VariableDeclaration",
+ "src": "4242:13:2"
+ }
+ ],
+ "id": 187,
+ "name": "ParameterList",
+ "src": "4241:15:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 188,
+ "name": "Identifier",
+ "src": "4271:7:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "b"
+ },
+ "id": 189,
+ "name": "Identifier",
+ "src": "4279:1:2"
+ }
+ ],
+ "id": 190,
+ "name": "MemberAccess",
+ "src": "4279:8:2"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "index"
+ },
+ "id": 191,
+ "name": "Identifier",
+ "src": "4291:5:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "34",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 4",
+ "value": "4"
+ },
+ "id": 192,
+ "name": "Literal",
+ "src": "4299:1:2"
+ }
+ ],
+ "id": 193,
+ "name": "BinaryOperation",
+ "src": "4291:9:2"
+ }
+ ],
+ "id": 194,
+ "name": "BinaryOperation",
+ "src": "4279:21:2"
+ }
+ ],
+ "id": 195,
+ "name": "FunctionCall",
+ "src": "4271:30:2"
+ }
+ ],
+ "id": 196,
+ "name": "ExpressionStatement",
+ "src": "4271:30:2"
+ },
+ {
+ "children": [],
+ "id": 197,
+ "name": "InlineAssembly",
+ "src": "4311:281:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "result"
+ },
+ "id": 198,
+ "name": "Identifier",
+ "src": "4593:6:2"
+ }
+ ],
+ "id": 199,
+ "name": "Return",
+ "src": "4586:13:2"
+ }
+ ],
+ "id": 200,
+ "name": "Block",
+ "src": "4261:345:2"
+ }
+ ],
+ "id": 201,
+ "name": "FunctionDefinition",
+ "src": "4135:471:2"
+ }
+ ],
+ "id": 202,
+ "name": "ContractDefinition",
+ "src": "663:3945:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/multisig/MultiSigWallet.sol": "// solhint-disable\npragma solidity ^0.4.10;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.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\n// solhint-disable\npragma solidity ^0.4.10;\n\nimport \"./MultiSigWallet.sol\";\n\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n",
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.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 solidity 0.4.10;\n\nimport \"../../multisig/MultiSigWalletWithTimeLock.sol\";\n\n\ncontract AssetProxyOwner is\n MultiSigWalletWithTimeLock\n{\n\n event AssetProxyRegistration(address assetProxyContract, bool isRegistered);\n\n // Mapping of AssetProxy contract address =>\n // if this contract is allowed to call the AssetProxy's `removeAuthorizedAddressAtIndex` method without a time lock.\n mapping (address => bool) public isAssetProxyRegistered;\n\n bytes4 constant internal REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR = bytes4(keccak256(\"removeAuthorizedAddressAtIndex(address,uint256)\"));\n\n /// @dev Function will revert if the transaction does not call `removeAuthorizedAddressAtIndex`\n /// on an approved AssetProxy contract.\n modifier validRemoveAuthorizedAddressAtIndexTx(uint256 transactionId) {\n Transaction storage tx = transactions[transactionId];\n require(isAssetProxyRegistered[tx.destination]);\n require(readBytes4(tx.data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR);\n _;\n }\n\n /// @dev Contract constructor sets initial owners, required number of confirmations,\n /// time lock, and list of AssetProxy addresses.\n /// @param _owners List of initial owners.\n /// @param _assetProxyContracts Array of AssetProxy contract addresses.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function AssetProxyOwner(\n address[] memory _owners,\n address[] memory _assetProxyContracts,\n uint256 _required,\n uint256 _secondsTimeLocked\n )\n public\n MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)\n {\n for (uint256 i = 0; i < _assetProxyContracts.length; i++) {\n address assetProxy = _assetProxyContracts[i];\n require(assetProxy != address(0));\n isAssetProxyRegistered[assetProxy] = true;\n }\n }\n\n /// @dev Registers or deregisters an AssetProxy to be able to execute\n /// `removeAuthorizedAddressAtIndex` without a timelock.\n /// @param assetProxyContract Address of AssetProxy contract.\n /// @param isRegistered Status of approval for AssetProxy contract.\n function registerAssetProxy(address assetProxyContract, bool isRegistered)\n public\n onlyWallet\n notNull(assetProxyContract)\n {\n isAssetProxyRegistered[assetProxyContract] = isRegistered;\n AssetProxyRegistration(assetProxyContract, isRegistered);\n }\n\n /// @dev Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\n /// @param transactionId Transaction ID.\n function executeRemoveAuthorizedAddressAtIndex(uint256 transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n validRemoveAuthorizedAddressAtIndexTx(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n // solhint-disable-next-line avoid-call-value\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n returns (bytes4 result)\n {\n require(b.length >= index + 4);\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x8c882ef490c011257c7406ca74aba8787c3f078c7c628553e046883c81244681",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.10+commit.f0d539ae.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x34d402f14d58e001d8efbe6585051bf9706aa064",
+ "links": {},
+ "constructorArgs": "[[\"0x5409ed021d9299bf6814279a6a1411a7e866a631\",\"0x6ecbe1db9ef729cbe972c83fb886247691fb6beb\"],[\"0x1dc4c1cefef38a777b15aa20260a54e584b16c48\",\"0x1d7022f5b17d2f8b695918fb48fa1089c9f85401\"],\"2\",\"0\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/DummyERC20Token.json b/packages/migrations/artifacts/2.0.0/DummyERC20Token.json
new file mode 100644
index 000000000..d27114b1c
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/DummyERC20Token.json
@@ -0,0 +1,379 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "DummyERC20Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "mint",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_target",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "setBalance",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ },
+ {
+ "name": "_decimals",
+ "type": "uint256"
+ },
+ {
+ "name": "_totalSupply",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50604051610ef7380380610ef7833981016040908152815160208084015192840151606085015160038054600160a060020a031916331790559285018051909594909401939092916100679160049187019061009f565b50825161007b90600590602086019061009f565b506006919091556002819055336000908152602081905260409020555061013a9050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e057805160ff191683800117855561010d565b8280016001018555821561010d579182015b8281111561010d5782518255916020019190600101906100f2565b5061011992915061011d565b5090565b61013791905b808211156101195760008155600101610123565b90565b610dae806101496000396000f3006080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100c9578063095ea7b31461015357806318160ddd1461019857806323b872dd146101bf578063313ce567146101f657806370a082311461020b5780638da5cb5b1461023957806395d89b4114610277578063a0712d681461028c578063a9059cbb146102a6578063dd62ed3e146102d7578063e30443bc1461030b578063f2fde38b1461033c575b600080fd5b3480156100d557600080fd5b506100de61036a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610118578181015183820152602001610100565b50505050905090810190601f1680156101455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015f57600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff60043516602435610416565b604080519115158252519081900360200190f35b3480156101a457600080fd5b506101ad610489565b60408051918252519081900360200190f35b3480156101cb57600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561048f565b34801561020257600080fd5b506101ad61074a565b34801561021757600080fd5b506101ad73ffffffffffffffffffffffffffffffffffffffff60043516610750565b34801561024557600080fd5b5061024e610778565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561028357600080fd5b506100de610794565b34801561029857600080fd5b506102a460043561080d565b005b3480156102b257600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff600435166024356108e9565b3480156102e357600080fd5b506101ad73ffffffffffffffffffffffffffffffffffffffff60043581169060243516610a76565b34801561031757600080fd5b506102a473ffffffffffffffffffffffffffffffffffffffff60043516602435610aae565b34801561034857600080fd5b506102a473ffffffffffffffffffffffffffffffffffffffff60043516610baa565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561040e5780601f106103e35761010080835404028352916020019161040e565b820191906000526020600020905b8154815290600101906020018083116103f157829003601f168201915b505050505081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083203384528252808320549383529082905281205490919083111561053b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b828110156105aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260208190526040902054838101101561064057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106da5773ffffffffffffffffffffffffffffffffffffffff851660009081526001602090815260408083203384529091529020805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3506001949350505050565b60065481565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561040e5780601f106103e35761010080835404028352916020019161040e565b68056bc75e2d631000008111156108ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4d696e74696e67206d6f7265207468616e20313030303030303030303030303060448201527f30303030303030206973206e6f7420616c6c6f7765642e000000000000000000606482015290519081900360840190fd5b336000908152602081905260409020546108c6908290610c90565b336000908152602081905260409020556002546108e39082610c90565b60025550565b3360009081526020819052604081205482111561096757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156109fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610b3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610b4083610750565b905080821015610b6757610b5f600254610b5a8385610d0b565b610d0b565b600255610b80565b610b7c600254610b778484610d0b565b610c90565b6002555b5073ffffffffffffffffffffffffffffffffffffffff909116600090815260208190526040902055565b60035473ffffffffffffffffffffffffffffffffffffffff163314610c3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610c8d57600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600082820183811015610d0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600082821115610d7c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509003905600a165627a7a7230582088e59d1d214477155f0db5d51475c0f68858ea8da4571327527d4e1ffa2d3a8e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xEF7 CODESIZE SUB DUP1 PUSH2 0xEF7 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP1 DUP5 ADD MLOAD SWAP3 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE SWAP3 DUP6 ADD DUP1 MLOAD SWAP1 SWAP6 SWAP5 SWAP1 SWAP5 ADD SWAP4 SWAP1 SWAP3 SWAP2 PUSH2 0x67 SWAP2 PUSH1 0x4 SWAP2 DUP8 ADD SWAP1 PUSH2 0x9F JUMP JUMPDEST POP DUP3 MLOAD PUSH2 0x7B SWAP1 PUSH1 0x5 SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x9F JUMP JUMPDEST POP PUSH1 0x6 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE POP PUSH2 0x13A SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xE0 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x10D JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x10D JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x10D JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xF2 JUMP JUMPDEST POP PUSH2 0x119 SWAP3 SWAP2 POP PUSH2 0x11D JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x137 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x119 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x123 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0xDAE DUP1 PUSH2 0x149 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x20B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x239 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x28C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0x30B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x33C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x36A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x118 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x100 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x145 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x416 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH2 0x489 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x48F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH2 0x74A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x750 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x24E PUSH2 0x778 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x794 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x298 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH1 0x4 CALLDATALOAD PUSH2 0x80D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xA76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xAAE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBAA JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3E3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x40E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3F1 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 DUP4 MSTORE SWAP1 DUP3 SWAP1 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 GT ISZERO PUSH2 0x53B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 DUP2 ADD LT ISZERO PUSH2 0x640 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x6DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3E3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x40E JUMP JUMPDEST PUSH9 0x56BC75E2D63100000 DUP2 GT ISZERO PUSH2 0x8AB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x37 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D696E74696E67206D6F7265207468616E203130303030303030303030303030 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x30303030303030206973206E6F7420616C6C6F7765642E000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x8C6 SWAP1 DUP3 SWAP1 PUSH2 0xC90 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 SLOAD PUSH2 0x8E3 SWAP1 DUP3 PUSH2 0xC90 JUMP JUMPDEST PUSH1 0x2 SSTORE POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x967 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x9FD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xB37 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB40 DUP4 PUSH2 0x750 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 LT ISZERO PUSH2 0xB67 JUMPI PUSH2 0xB5F PUSH1 0x2 SLOAD PUSH2 0xB5A DUP4 DUP6 PUSH2 0xD0B JUMP JUMPDEST PUSH2 0xD0B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0xB80 JUMP JUMPDEST PUSH2 0xB7C PUSH1 0x2 SLOAD PUSH2 0xB77 DUP5 DUP5 PUSH2 0xD0B JUMP JUMPDEST PUSH2 0xC90 JUMP JUMPDEST PUSH1 0x2 SSTORE JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC30 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC8D JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xD04 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xD7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 0xe5 SWAP14 SAR 0x21 DIFFICULTY PUSH24 0x155F0DB5D51475C0F68858EA8DA4571327527D4E1FFA2D3A DUP15 STOP 0x29 ",
+ "sourceMap": "684:858:0:-;;;825:307;8:9:-1;5:2;;;30:1;27;20:12;5:2;825:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;329:5:6;:18;;-1:-1:-1;;;;;;329:18:6;337:10;329:18;;;825:307:0;;;976:12;;825:307;;;;;;;;;;976:12;;:4;;:12;;;;:::i;:::-;-1:-1:-1;998:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;1024:8:0;:20;;;;1054:11;:26;;;1099:10;-1:-1:-1;1090:20:0;;;;;;;;;;:35;-1:-1:-1;684:858:0;;-1:-1:-1;684:858:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;684:858:0;;;-1:-1:-1;684:858:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100c9578063095ea7b31461015357806318160ddd1461019857806323b872dd146101bf578063313ce567146101f657806370a082311461020b5780638da5cb5b1461023957806395d89b4114610277578063a0712d681461028c578063a9059cbb146102a6578063dd62ed3e146102d7578063e30443bc1461030b578063f2fde38b1461033c575b600080fd5b3480156100d557600080fd5b506100de61036a565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610118578181015183820152602001610100565b50505050905090810190601f1680156101455780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561015f57600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff60043516602435610416565b604080519115158252519081900360200190f35b3480156101a457600080fd5b506101ad610489565b60408051918252519081900360200190f35b3480156101cb57600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561048f565b34801561020257600080fd5b506101ad61074a565b34801561021757600080fd5b506101ad73ffffffffffffffffffffffffffffffffffffffff60043516610750565b34801561024557600080fd5b5061024e610778565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561028357600080fd5b506100de610794565b34801561029857600080fd5b506102a460043561080d565b005b3480156102b257600080fd5b5061018473ffffffffffffffffffffffffffffffffffffffff600435166024356108e9565b3480156102e357600080fd5b506101ad73ffffffffffffffffffffffffffffffffffffffff60043581169060243516610a76565b34801561031757600080fd5b506102a473ffffffffffffffffffffffffffffffffffffffff60043516602435610aae565b34801561034857600080fd5b506102a473ffffffffffffffffffffffffffffffffffffffff60043516610baa565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561040e5780601f106103e35761010080835404028352916020019161040e565b820191906000526020600020905b8154815290600101906020018083116103f157829003601f168201915b505050505081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083203384528252808320549383529082905281205490919083111561053b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b828110156105aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260208190526040902054838101101561064057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106da5773ffffffffffffffffffffffffffffffffffffffff851660009081526001602090815260408083203384529091529020805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3506001949350505050565b60065481565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6005805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561040e5780601f106103e35761010080835404028352916020019161040e565b68056bc75e2d631000008111156108ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4d696e74696e67206d6f7265207468616e20313030303030303030303030303060448201527f30303030303030206973206e6f7420616c6c6f7765642e000000000000000000606482015290519081900360840190fd5b336000908152602081905260409020546108c6908290610c90565b336000908152602081905260409020556002546108e39082610c90565b60025550565b3360009081526020819052604081205482111561096757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156109fd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60035460009073ffffffffffffffffffffffffffffffffffffffff163314610b3757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610b4083610750565b905080821015610b6757610b5f600254610b5a8385610d0b565b610d0b565b600255610b80565b610b7c600254610b778484610d0b565b610c90565b6002555b5073ffffffffffffffffffffffffffffffffffffffff909116600090815260208190526040902055565b60035473ffffffffffffffffffffffffffffffffffffffff163314610c3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610c8d57600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600082820183811015610d0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b600082821115610d7c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b509003905600a165627a7a7230582088e59d1d214477155f0db5d51475c0f68858ea8da4571327527d4e1ffa2d3a8e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC4 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xC9 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x153 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x198 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1BF JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1F6 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x20B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x239 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x277 JUMPI DUP1 PUSH4 0xA0712D68 EQ PUSH2 0x28C JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2D7 JUMPI DUP1 PUSH4 0xE30443BC EQ PUSH2 0x30B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x33C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x36A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x118 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x100 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x145 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x15F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x416 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH2 0x489 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x48F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x202 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH2 0x74A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x217 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x750 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x245 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x24E PUSH2 0x778 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x283 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDE PUSH2 0x794 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x298 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH1 0x4 CALLDATALOAD PUSH2 0x80D JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x184 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8E9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1AD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xA76 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xAAE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2A4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBAA JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3E3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x40E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3F1 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE DUP1 DUP4 KECCAK256 SLOAD SWAP4 DUP4 MSTORE SWAP1 DUP3 SWAP1 MSTORE DUP2 KECCAK256 SLOAD SWAP1 SWAP2 SWAP1 DUP4 GT ISZERO PUSH2 0x53B JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 DUP2 ADD LT ISZERO PUSH2 0x640 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE KECCAK256 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x6DA JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3E3 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x40E JUMP JUMPDEST PUSH9 0x56BC75E2D63100000 DUP2 GT ISZERO PUSH2 0x8AB JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x37 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4D696E74696E67206D6F7265207468616E203130303030303030303030303030 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x30303030303030206973206E6F7420616C6C6F7765642E000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x8C6 SWAP1 DUP3 SWAP1 PUSH2 0xC90 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE PUSH1 0x2 SLOAD PUSH2 0x8E3 SWAP1 DUP3 PUSH2 0xC90 JUMP JUMPDEST PUSH1 0x2 SSTORE POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x967 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x9FD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xB37 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xB40 DUP4 PUSH2 0x750 JUMP JUMPDEST SWAP1 POP DUP1 DUP3 LT ISZERO PUSH2 0xB67 JUMPI PUSH2 0xB5F PUSH1 0x2 SLOAD PUSH2 0xB5A DUP4 DUP6 PUSH2 0xD0B JUMP JUMPDEST PUSH2 0xD0B JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH2 0xB80 JUMP JUMPDEST PUSH2 0xB7C PUSH1 0x2 SLOAD PUSH2 0xB77 DUP5 DUP5 PUSH2 0xD0B JUMP JUMPDEST PUSH2 0xC90 JUMP JUMPDEST PUSH1 0x2 SSTORE JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SSTORE JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC30 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC8D JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0xD04 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xD7C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 0xe5 SWAP14 SAR 0x21 DIFFICULTY PUSH24 0x155F0DB5D51475C0F68858EA8DA4571327527D4E1FFA2D3A DUP15 STOP 0x29 ",
+ "sourceMap": "684:858:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;745:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;745:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;745:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1928:222:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1928:222:2;;;;;;;;;;;;;;;;;;;;;;;;;;;802:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;802:26:2;;;;;;;;;;;;;;;;;;;;1083:715:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1083:715:4;;;;;;;;;;;;;;795:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;795:23:0;;;;2156:133:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2156:133:2;;;;;;;258:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:6;;;;;;;;;;;;;;;;;;;;;;;769::0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;769:20:0;;;;880:321:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;880:321:1;;;;;;;835:455:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;835:455:2;;;;;;;;;2295:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2295:160:2;;;;;;;;;;;;1138:402:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1138:402:0;;;;;;;;;500:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:6;;;;;;;745:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1928:222:2:-;2039:10;2011:4;2031:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;:38;;;2084;;;;;;;2011:4;;2031:29;;2039:10;;2084:38;;;;;;;;-1:-1:-1;2139:4:2;1928:222;;;;:::o;802:26::-;;;;:::o;1083:715:4:-;1221:14;;;1181:4;1221:14;;;:7;:14;;;;;;;;1236:10;1221:26;;;;;;;;1278:15;;;;;;;;;;1181:4;;1221:26;1278:25;-1:-1:-1;1278:25:4;1257:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1386:19;;;;1365:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1516:13;;;:8;:13;;;;;;;;;;;1490:22;;;:39;;1469:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1573:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1606:15;;;;;;:25;;;;;;;737:10;1645:20;;1641:87;;;1681:14;;;;;;;:7;:14;;;;;;;;1696:10;1681:26;;;;;;;:36;;;;;;;1641:87;1758:3;1742:28;;1751:5;1742:28;;;1763:6;1742:28;;;;;;;;;;;;;;;;;;-1:-1:-1;1787:4:4;;1083:715;-1:-1:-1;;;;1083:715:4:o;795:23:0:-;;;;:::o;2156:133:2:-;2266:16;;2236:7;2266:16;;;;;;;;;;;;2156:133::o;258:20:6:-;;;;;;:::o;769::0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:321:1;970:21;960:31;;;939:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1130:10;1121:8;:20;;;;;;;;;;;1105:37;;1113:6;;1105:7;:37::i;:::-;1091:10;1082:8;:20;;;;;;;;;;:60;1174:11;;1166:28;;1187:6;1166:7;:28::i;:::-;1152:11;:42;-1:-1:-1;880:321:1:o;835:455:2:-;964:10;914:4;955:20;;;;;;;;;;;:30;-1:-1:-1;955:30:2;934:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1094:13;;;:8;:13;;;;;;;;;;;1068:22;;;:39;;1047:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1160:10;1151:8;:20;;;;;;;;;;;:30;;;;;;;:20;1191:13;;;;;;;;;:23;;;;;;1229:33;;;;;;;1191:13;;1160:10;1229:33;;;;;;;;;;;-1:-1:-1;1279:4:2;835:455;;;;:::o;2295:160::-;2423:15;;;;2393:7;2423:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;2295:160::o;1138:402:0:-;426:5:6;;1238:19:0;;426:5:6;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1260:18:0;1270:7;1260:9;:18::i;:::-;1238:40;;1301:11;1292:6;:20;1288:210;;;1342:50;1350:11;;1363:28;1371:11;1384:6;1363:7;:28::i;:::-;1342:7;:50::i;:::-;1328:11;:64;1288:210;;;1437:50;1445:11;;1458:28;1466:6;1474:11;1458:7;:28::i;:::-;1437:7;:50::i;:::-;1423:11;:64;1288:210;-1:-1:-1;1507:17:0;;;;:8;:17;;;;;;;;;;:26;1138:402::o;500:167:6:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;715:230:7:-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:1;715:230;-1:-1:-1;;;715:230:7:o;501:208::-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;697:5:7;;;501:208::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/test/DummyERC20Token/DummyERC20Token.sol": {
+ "id": 0
+ },
+ "2.0.0/test/Mintable/Mintable.sol": {
+ "id": 1
+ },
+ "2.0.0/tokens/ERC20Token/ERC20Token.sol": {
+ "id": 2
+ },
+ "2.0.0/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 3
+ },
+ "2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 6
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 7
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/test/DummyERC20Token/DummyERC20Token.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 solidity 0.4.24;\n\nimport \"../Mintable/Mintable.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\n\n\ncontract DummyERC20Token is \n Mintable,\n Ownable\n{\n string public name;\n string public symbol;\n uint256 public decimals;\n\n constructor (\n string _name,\n string _symbol,\n uint256 _decimals,\n uint256 _totalSupply\n )\n public\n {\n name = _name;\n symbol = _symbol;\n decimals = _decimals;\n totalSupply = _totalSupply;\n balances[msg.sender] = _totalSupply;\n }\n\n function setBalance(address _target, uint256 _value)\n public\n onlyOwner\n {\n uint256 currBalance = balanceOf(_target);\n if (_value < currBalance) {\n totalSupply = safeSub(totalSupply, safeSub(currBalance, _value));\n } else {\n totalSupply = safeAdd(totalSupply, safeSub(_value, currBalance));\n }\n balances[_target] = _value;\n }\n}\n",
+ "2.0.0/test/Mintable/Mintable.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 solidity 0.4.24;\n\nimport \"../../tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n\n/*\n * Mintable\n * Base contract that creates a mintable UnlimitedAllowanceToken\n */\ncontract Mintable is \n UnlimitedAllowanceToken,\n SafeMath\n{\n function mint(uint256 _value)\n public\n {\n require(\n _value <= 100000000000000000000,\n \"Minting more than 100000000000000000000 is not allowed.\"\n );\n balances[msg.sender] = safeAdd(_value, balances[msg.sender]);\n totalSupply = safeAdd(totalSupply, _value);\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/ERC20Token.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 solidity 0.4.24;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract ERC20Token is IERC20Token {\n\n mapping (address => uint256) internal balances;\n mapping (address => mapping (address => uint256)) internal allowed;\n\n uint256 public totalSupply;\n\n function transfer(address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[_from] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n allowed[_from][msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_ALLOWANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function approve(address _spender, uint256 _value)\n public\n returns (bool)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n return balances[_owner];\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n returns (uint256)\n {\n return allowed[_owner][_spender];\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/IERC20Token.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 solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "2.0.0/tokens/UnlimitedAllowanceToken/UnlimitedAllowanceToken.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 solidity 0.4.24;\n\nimport \"../ERC20Token/ERC20Token.sol\";\n\n\ncontract UnlimitedAllowanceToken is ERC20Token {\n\n uint256 constant internal MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance. See https://github.com/ethereum/EIPs/issues/717\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n uint256 allowance = allowed[_from][msg.sender];\n require(\n balances[_from] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n allowance >= _value,\n \"ERC20_INSUFFICIENT_ALLOWANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n emit Transfer(_from, _to, _value);\n return true;\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xf04cf95da2c77b71eaf2d7d8cc13bf69850916ffd6567b436c7a03d4ea2ea4a5",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/DummyERC721Receiver.json b/packages/migrations/artifacts/2.0.0/DummyERC721Receiver.json
new file mode 100644
index 000000000..c4b1c5996
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/DummyERC721Receiver.json
@@ -0,0 +1,106 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "DummyERC721Receiver",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ },
+ {
+ "name": "_data",
+ "type": "bytes"
+ }
+ ],
+ "name": "onERC721Received",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "TokenReceived",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b5061021c806100206000396000f3006080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663f0b9e5ba8114610045575b600080fd5b34801561005157600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100bb94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506100f09650505050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b60007fefe605af9663e0f15f1dd40dad79f119df71e8d2affb3f6857cb9707c6c4b3ea848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018b578181015183820152602001610173565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1507ff0b9e5ba0000000000000000000000000000000000000000000000000000000093925050505600a165627a7a72305820b21a4617d1f81829262138f613de82764dda60f47f5027b3b68c016997529b8b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x21C DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xF0B9E5BA DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xBB SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xF0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH32 0xEFE605AF9663E0F15F1DD40DAD79F119DF71E8D2AFFB3F6857CB9707C6C4B3EA DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x173 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb2 BYTE 0x46 OR 0xd1 0xf8 XOR 0x29 0x26 0x21 CODESIZE 0xf6 SGT 0xde DUP3 PUSH23 0x4DDA60F47F5027B3B68C016997529B8B00290000000000 ",
+ "sourceMap": "1186:1067:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1186:1067:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100405763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663f0b9e5ba8114610045575b600080fd5b34801561005157600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526100bb94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506100f09650505050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b60007fefe605af9663e0f15f1dd40dad79f119df71e8d2affb3f6857cb9707c6c4b3ea848484604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561018b578181015183820152602001610173565b50505050905090810190601f1680156101b85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1507ff0b9e5ba0000000000000000000000000000000000000000000000000000000093925050505600a165627a7a72305820b21a4617d1f81829262138f613de82764dda60f47f5027b3b68c016997529b8b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xF0B9E5BA DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xBB SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xF0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH32 0xEFE605AF9663E0F15F1DD40DAD79F119DF71E8D2AFFB3F6857CB9707C6C4B3EA DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x18B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x173 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 SWAP4 SWAP3 POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xb2 BYTE 0x46 OR 0xd1 0xf8 XOR 0x29 0x26 0x21 CODESIZE 0xf6 SGT 0xde DUP3 PUSH23 0x4DDA60F47F5027B3B68C016997529B8B00290000000000 ",
+ "sourceMap": "1186:1067:0:-;;;;;;;;;;;;;;;;;;;;;;;2014:237;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2014:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2014:237:0;;-1:-1:-1;2014:237:0;;-1:-1:-1;;;;;;;2014:237:0;;;;;;;;;;;;;;;;;;;;;2148:6;2175:37;2189:5;2196:8;2206:5;2175:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2175:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2229:15:0;2014:237;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol": {
+ "id": 0
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/test/DummyERC721Receiver/DummyERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\nimport \"../../tokens/ERC721Token/IERC721Receiver.sol\";\n\n\ncontract DummyERC721Receiver is\n IERC721Receiver\n{\n\n event TokenReceived(\n address from,\n uint256 tokenId,\n bytes data\n );\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data\n )\n public\n returns (bytes4)\n {\n emit TokenReceived(_from, _tokenId, _data);\n return ERC721_RECEIVED;\n }\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n"
+ },
+ "sourceTreeHashHex": "0x8eb51bd09ddeb7decac329c3c85f31301af7822aa808b193752eaa94725657bd",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/DummyERC721Token.json b/packages/migrations/artifacts/2.0.0/DummyERC721Token.json
new file mode 100644
index 000000000..175ec2361
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/DummyERC721Token.json
@@ -0,0 +1,455 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "DummyERC721Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getApproved",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "mint",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "exists",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ownerOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "burn",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setApprovalForAll",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_tokenId",
+ "type": "uint256"
+ },
+ {
+ "name": "_data",
+ "type": "bytes"
+ }
+ ],
+ "name": "safeTransferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_operator",
+ "type": "address"
+ }
+ ],
+ "name": "isApprovedForAll",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "symbol",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_approved",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_operator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_approved",
+ "type": "bool"
+ }
+ ],
+ "name": "ApprovalForAll",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b50604051620015633803806200156383398101604052805160208083015160008054600160a060020a031916331790559183018051909392909201918391839162000063916001919085019062000084565b5080516200007990600290602084019062000084565b505050505062000129565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000c757805160ff1916838001178555620000f7565b82800160010185558215620000f7579182015b82811115620000f7578251825591602001919060010190620000da565b506200010592915062000109565b5090565b6200012691905b8082111562000105576000815560010162000110565b90565b61142a80620001396000396000f3006080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063081812fc14610174578063095ea7b3146101b557806323b872dd146101e857806340c10f191461021f57806342842e0e146102505780634f558e79146102875780636352211e146102b357806370a08231146102cb5780638da5cb5b1461030b57806395d89b41146103205780639dc29fac14610335578063a22cb46514610366578063b88d4fde14610399578063e985e9c514610415578063f2fde38b14610449575b600080fd5b3480156100f657600080fd5b506100ff610477565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610139578181015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018057600080fd5b5061018c60043561052a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c157600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610552565b005b3480156101f457600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610690565b34801561022b57600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610773565b34801561025c57600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356108a2565b34801561029357600080fd5b5061029f6004356108da565b604080519115158252519081900360200190f35b3480156102bf57600080fd5b5061018c600435610904565b3480156102d757600080fd5b506102f973ffffffffffffffffffffffffffffffffffffffff6004351661093b565b60408051918252519081900360200190f35b34801561031757600080fd5b5061018c610988565b34801561032c57600080fd5b506100ff6109a4565b34801561034157600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610a20565b34801561037257600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff600435166024351515610b4c565b3480156103a557600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101e69473ffffffffffffffffffffffffffffffffffffffff8135811695602480359092169560443595369560849401918190840183828082843750949750610c089650505050505050565b34801561042157600080fd5b5061029f73ffffffffffffffffffffffffffffffffffffffff60043581169060243516610c47565b34801561045557600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516610c82565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156105205780601f106104f557610100808354040283529160200191610520565b820191906000526020600020905b81548152906001019060200180831161050357829003601f168201915b5050505050905090565b60009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061055d82610904565b905073ffffffffffffffffffffffffffffffffffffffff838116908216141561058557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806105ae57506105ae8133610c47565b15156105b957600080fd5b60006105c48361052a565b73ffffffffffffffffffffffffffffffffffffffff161415806105fc575073ffffffffffffffffffffffffffffffffffffffff831615155b1561068b5760008281526004602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b8061069b3382610d68565b15156106a657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156106c857600080fd5b73ffffffffffffffffffffffffffffffffffffffff831615156106ea57600080fd5b6106f48483610dfb565b6106fe8483610ee7565b6107088383610fb6565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610802816108da565b1561089457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f546f6b656e207769746820746f6b656e496420616c726561647920657869737460448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61089e8282611079565b5050565b806108ad3382610d68565b15156108b857600080fd5b6108d48484846020604051908101604052806000815250610c08565b50505050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561093557600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561095f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156105205780601f106104f557610100808354040283529160200191610520565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aa657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610aaf816108da565b1515610b4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f546f6b656e207769746820746f6b656e496420646f6573206e6f74206578697360448201527f742e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61089e82826110f7565b73ffffffffffffffffffffffffffffffffffffffff8216331415610b6f57600080fd5b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b81610c133382610d68565b1515610c1e57600080fd5b610c29858585610690565b610c358585858561115d565b1515610c4057600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610d6557600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080610d7483610904565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610de357508373ffffffffffffffffffffffffffffffffffffffff16610dcb8461052a565b73ffffffffffffffffffffffffffffffffffffffff16145b80610df35750610df38185610c47565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff16610e1b82610904565b73ffffffffffffffffffffffffffffffffffffffff1614610e3b57600080fd5b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff161561089e57600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b8173ffffffffffffffffffffffffffffffffffffffff16610f0782610904565b73ffffffffffffffffffffffffffffffffffffffff1614610f2757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f58906001611304565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526005602090815260408083209490945591815260039091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610fe557600080fd5b600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081179091558352600590915290205461104c90600161137b565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526005602052604090209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216151561109b57600080fd5b6110a58282610fb6565b60408051828152905173ffffffffffffffffffffffffffffffffffffffff8416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6111018282610dfb565b61110b8282610ee7565b60408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600080611169856113f6565b151561117857600191506112fb565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561128557600080fd5b505af1158015611299573d6000803e3d6000fd5b505050506040513d60208110156112af57600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60008282111561137557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000828201838110156113ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a72305820d7a0eccfd466ec2b4b530597e495142a9d8e8b167fd388dfdab2ed3a9f9182b40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1563 CODESIZE SUB DUP1 PUSH3 0x1563 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 DUP1 DUP4 ADD MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE SWAP2 DUP4 ADD DUP1 MLOAD SWAP1 SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 DUP4 SWAP2 DUP4 SWAP2 PUSH3 0x63 SWAP2 PUSH1 0x1 SWAP2 SWAP1 DUP6 ADD SWAP1 PUSH3 0x84 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0x79 SWAP1 PUSH1 0x2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x84 JUMP JUMPDEST POP POP POP POP POP PUSH3 0x129 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0xC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0xF7 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0xF7 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0xF7 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0xDA JUMP JUMPDEST POP PUSH3 0x105 SWAP3 SWAP2 POP PUSH3 0x109 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x126 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x105 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x110 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x142A DUP1 PUSH3 0x139 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x30B JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0x9DC29FAC EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x399 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x415 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x139 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x121 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x166 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x180 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH1 0x4 CALLDATALOAD PUSH2 0x52A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x552 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x690 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x773 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x8A2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH1 0x4 CALLDATALOAD PUSH2 0x8DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH1 0x4 CALLDATALOAD PUSH2 0x904 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x93B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH2 0x988 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x9A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xB4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1E6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xC08 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xC47 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xC82 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x520 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x520 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x503 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55D DUP3 PUSH2 0x904 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x5AE JUMPI POP PUSH2 0x5AE DUP2 CALLER PUSH2 0xC47 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x5C4 DUP4 PUSH2 0x52A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x5FC JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x68B JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x69B CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x6EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F4 DUP5 DUP4 PUSH2 0xDFB JUMP JUMPDEST PUSH2 0x6FE DUP5 DUP4 PUSH2 0xEE7 JUMP JUMPDEST PUSH2 0x708 DUP4 DUP4 PUSH2 0xFB6 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7F9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x802 DUP2 PUSH2 0x8DA JUMP JUMPDEST ISZERO PUSH2 0x894 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E207769746820746F6B656E496420616C7265616479206578697374 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x732E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x89E DUP3 DUP3 PUSH2 0x1079 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 PUSH2 0x8AD CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8D4 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xC08 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x935 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x95F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND DUP6 SWAP1 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x520 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x520 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xAA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAAF DUP2 PUSH2 0x8DA JUMP JUMPDEST ISZERO ISZERO PUSH2 0xB42 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E207769746820746F6B656E496420646F6573206E6F742065786973 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x742E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x89E DUP3 DUP3 PUSH2 0x10F7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0xB6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0xC13 CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC29 DUP6 DUP6 DUP6 PUSH2 0x690 JUMP JUMPDEST PUSH2 0xC35 DUP6 DUP6 DUP6 DUP6 PUSH2 0x115D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xD08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xD65 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xD74 DUP4 PUSH2 0x904 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0xDE3 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xDCB DUP5 PUSH2 0x52A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0xDF3 JUMPI POP PUSH2 0xDF3 DUP2 DUP6 PUSH2 0xC47 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xE1B DUP3 PUSH2 0x904 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xF07 DUP3 PUSH2 0x904 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xF58 SWAP1 PUSH1 0x1 PUSH2 0x1304 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x3 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xFE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0x104C SWAP1 PUSH1 0x1 PUSH2 0x137B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x109B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10A5 DUP3 DUP3 PUSH2 0xFB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x1101 DUP3 DUP3 PUSH2 0xDFB JUMP JUMPDEST PUSH2 0x110B DUP3 DUP3 PUSH2 0xEE7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1169 DUP6 PUSH2 0x13F6 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1178 JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0x12FB JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1237 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x121F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1264 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1299 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1375 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x13EF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd7 LOG0 0xec 0xcf 0xd4 PUSH7 0xEC2B4B530597E4 SWAP6 EQ 0x2a SWAP14 DUP15 DUP12 AND PUSH32 0xD388DFDAB2ED3A9F9182B4002900000000000000000000000000000000000000 ",
+ "sourceMap": "735:1237:0:-;;;951:118;8:9:-1;5:2;;;30:1;27;20:12;5:2;951:118:0;;;;;;;;;;;;;;;;;;;;;329:5:5;:18;;-1:-1:-1;;;;;;329:18:5;337:10;329:18;;;951:118:0;;;2886:13:1;;951:118:0;;;;;;;;;;;2886:13:1;;329:18:5;;2886:13:1;;;;;:::i;:::-;-1:-1:-1;2909:17:1;;;;:7;;:17;;;;;:::i;:::-;;2797:136;;951:118:0;;735:1237;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;735:1237:0;;;-1:-1:-1;735:1237:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100ea578063081812fc14610174578063095ea7b3146101b557806323b872dd146101e857806340c10f191461021f57806342842e0e146102505780634f558e79146102875780636352211e146102b357806370a08231146102cb5780638da5cb5b1461030b57806395d89b41146103205780639dc29fac14610335578063a22cb46514610366578063b88d4fde14610399578063e985e9c514610415578063f2fde38b14610449575b600080fd5b3480156100f657600080fd5b506100ff610477565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610139578181015183820152602001610121565b50505050905090810190601f1680156101665780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018057600080fd5b5061018c60043561052a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101c157600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610552565b005b3480156101f457600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610690565b34801561022b57600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610773565b34801561025c57600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff600435811690602435166044356108a2565b34801561029357600080fd5b5061029f6004356108da565b604080519115158252519081900360200190f35b3480156102bf57600080fd5b5061018c600435610904565b3480156102d757600080fd5b506102f973ffffffffffffffffffffffffffffffffffffffff6004351661093b565b60408051918252519081900360200190f35b34801561031757600080fd5b5061018c610988565b34801561032c57600080fd5b506100ff6109a4565b34801561034157600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516602435610a20565b34801561037257600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff600435166024351515610b4c565b3480156103a557600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101e69473ffffffffffffffffffffffffffffffffffffffff8135811695602480359092169560443595369560849401918190840183828082843750949750610c089650505050505050565b34801561042157600080fd5b5061029f73ffffffffffffffffffffffffffffffffffffffff60043581169060243516610c47565b34801561045557600080fd5b506101e673ffffffffffffffffffffffffffffffffffffffff60043516610c82565b60018054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156105205780601f106104f557610100808354040283529160200191610520565b820191906000526020600020905b81548152906001019060200180831161050357829003601f168201915b5050505050905090565b60009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061055d82610904565b905073ffffffffffffffffffffffffffffffffffffffff838116908216141561058557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806105ae57506105ae8133610c47565b15156105b957600080fd5b60006105c48361052a565b73ffffffffffffffffffffffffffffffffffffffff161415806105fc575073ffffffffffffffffffffffffffffffffffffffff831615155b1561068b5760008281526004602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b8061069b3382610d68565b15156106a657600080fd5b73ffffffffffffffffffffffffffffffffffffffff841615156106c857600080fd5b73ffffffffffffffffffffffffffffffffffffffff831615156106ea57600080fd5b6106f48483610dfb565b6106fe8483610ee7565b6107088383610fb6565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610802816108da565b1561089457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f546f6b656e207769746820746f6b656e496420616c726561647920657869737460448201527f732e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61089e8282611079565b5050565b806108ad3382610d68565b15156108b857600080fd5b6108d48484846020604051908101604052806000815250610c08565b50505050565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680151561093557600080fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8216151561095f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60028054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156105205780601f106104f557610100808354040283529160200191610520565b60005473ffffffffffffffffffffffffffffffffffffffff163314610aa657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b610aaf816108da565b1515610b4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f546f6b656e207769746820746f6b656e496420646f6573206e6f74206578697360448201527f742e000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61089e82826110f7565b73ffffffffffffffffffffffffffffffffffffffff8216331415610b6f57600080fd5b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b81610c133382610d68565b1515610c1e57600080fd5b610c29858585610690565b610c358585858561115d565b1515610c4057600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610d6557600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080610d7483610904565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610de357508373ffffffffffffffffffffffffffffffffffffffff16610dcb8461052a565b73ffffffffffffffffffffffffffffffffffffffff16145b80610df35750610df38185610c47565b949350505050565b8173ffffffffffffffffffffffffffffffffffffffff16610e1b82610904565b73ffffffffffffffffffffffffffffffffffffffff1614610e3b57600080fd5b60008181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff161561089e57600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690558051848152905173ffffffffffffffffffffffffffffffffffffffff8616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b8173ffffffffffffffffffffffffffffffffffffffff16610f0782610904565b73ffffffffffffffffffffffffffffffffffffffff1614610f2757600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610f58906001611304565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526005602090815260408083209490945591815260039091522080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610fe557600080fd5b600081815260036020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081179091558352600590915290205461104c90600161137b565b73ffffffffffffffffffffffffffffffffffffffff90921660009081526005602052604090209190915550565b73ffffffffffffffffffffffffffffffffffffffff8216151561109b57600080fd5b6110a58282610fb6565b60408051828152905173ffffffffffffffffffffffffffffffffffffffff8416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6111018282610dfb565b61110b8282610ee7565b60408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600080611169856113f6565b151561117857600191506112fb565b8473ffffffffffffffffffffffffffffffffffffffff1663f0b9e5ba8786866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561123757818101518382015260200161121f565b50505050905090810190601f1680156112645780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561128557600080fd5b505af1158015611299573d6000803e3d6000fd5b505050506040513d60208110156112af57600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b60008282111561137557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f55494e543235365f554e444552464c4f57000000000000000000000000000000604482015290519081900360640190fd5b50900390565b6000828201838110156113ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f55494e543235365f4f564552464c4f5700000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b6000903b11905600a165627a7a72305820d7a0eccfd466ec2b4b530597e495142a9d8e8b167fd388dfdab2ed3a9f9182b40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x81812FC EQ PUSH2 0x174 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x1B5 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1E8 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x21F JUMPI DUP1 PUSH4 0x42842E0E EQ PUSH2 0x250 JUMPI DUP1 PUSH4 0x4F558E79 EQ PUSH2 0x287 JUMPI DUP1 PUSH4 0x6352211E EQ PUSH2 0x2B3 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x30B JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x320 JUMPI DUP1 PUSH4 0x9DC29FAC EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0xA22CB465 EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xB88D4FDE EQ PUSH2 0x399 JUMPI DUP1 PUSH4 0xE985E9C5 EQ PUSH2 0x415 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x449 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x477 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x139 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x121 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x166 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x180 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH1 0x4 CALLDATALOAD PUSH2 0x52A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x552 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x690 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x773 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x8A2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x293 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH1 0x4 CALLDATALOAD PUSH2 0x8DA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH1 0x4 CALLDATALOAD PUSH2 0x904 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x93B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x317 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x18C PUSH2 0x988 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x32C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFF PUSH2 0x9A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0xA20 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xB4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x64 CALLDATALOAD PUSH1 0x4 DUP2 DUP2 ADD CALLDATALOAD SWAP3 DUP4 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP2 DUP5 MSTORE PUSH2 0x1E6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 CALLDATALOAD DUP2 AND SWAP6 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 SWAP3 AND SWAP6 PUSH1 0x44 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 PUSH1 0x84 SWAP5 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xC08 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x421 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29F PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0xC47 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x455 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1E6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xC82 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 DUP8 DUP10 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x520 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x520 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x503 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x55D DUP3 PUSH2 0x904 JUMP JUMPDEST SWAP1 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 AND SWAP1 DUP3 AND EQ ISZERO PUSH2 0x585 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND EQ DUP1 PUSH2 0x5AE JUMPI POP PUSH2 0x5AE DUP2 CALLER PUSH2 0xC47 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x5B9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x5C4 DUP4 PUSH2 0x52A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO DUP1 PUSH2 0x5FC JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO JUMPDEST ISZERO PUSH2 0x68B JUMPI PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 DUP2 AND SWAP2 DUP3 OR SWAP1 SWAP3 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP1 SWAP4 SWAP2 DUP6 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 JUMPDEST POP POP POP JUMP JUMPDEST DUP1 PUSH2 0x69B CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x6A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND ISZERO ISZERO PUSH2 0x6C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ISZERO ISZERO PUSH2 0x6EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x6F4 DUP5 DUP4 PUSH2 0xDFB JUMP JUMPDEST PUSH2 0x6FE DUP5 DUP4 PUSH2 0xEE7 JUMP JUMPDEST PUSH2 0x708 DUP4 DUP4 PUSH2 0xFB6 JUMP JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x7F9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x802 DUP2 PUSH2 0x8DA JUMP JUMPDEST ISZERO PUSH2 0x894 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E207769746820746F6B656E496420616C7265616479206578697374 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x732E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x89E DUP3 DUP3 PUSH2 0x1079 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 PUSH2 0x8AD CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x8B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8D4 DUP5 DUP5 DUP5 PUSH1 0x20 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE POP PUSH2 0xC08 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x935 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x95F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND DUP6 SWAP1 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x520 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x4F5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x520 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xAA6 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0xAAF DUP2 PUSH2 0x8DA JUMP JUMPDEST ISZERO ISZERO PUSH2 0xB42 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x22 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x546F6B656E207769746820746F6B656E496420646F6573206E6F742065786973 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x742E000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x89E DUP3 DUP3 PUSH2 0x10F7 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND CALLER EQ ISZERO PUSH2 0xB6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 MLOAD SWAP1 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0x17307EAB39AB6107E8899845AD3D59BD9653F200F220920489CA2B5937696C31 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH2 0xC13 CALLER DUP3 PUSH2 0xD68 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC1E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xC29 DUP6 DUP6 DUP6 PUSH2 0x690 JUMP JUMPDEST PUSH2 0xC35 DUP6 DUP6 DUP6 DUP6 PUSH2 0x115D JUMP JUMPDEST ISZERO ISZERO PUSH2 0xC40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xD08 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xD65 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xD74 DUP4 PUSH2 0x904 JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ DUP1 PUSH2 0xDE3 JUMPI POP DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xDCB DUP5 PUSH2 0x52A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ JUMPDEST DUP1 PUSH2 0xDF3 JUMPI POP PUSH2 0xDF3 DUP2 DUP6 PUSH2 0xC47 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xE1B DUP3 PUSH2 0x904 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xE3B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x89E JUMPI PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP JUMP JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0xF07 DUP3 PUSH2 0x904 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xF27 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0xF58 SWAP1 PUSH1 0x1 PUSH2 0x1304 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 SWAP1 SWAP5 SSTORE SWAP2 DUP2 MSTORE PUSH1 0x3 SWAP1 SWAP2 MSTORE KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0xFE5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP4 MSTORE PUSH1 0x5 SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0x104C SWAP1 PUSH1 0x1 PUSH2 0x137B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND ISZERO ISZERO PUSH2 0x109B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10A5 DUP3 DUP3 PUSH2 0xFB6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 PUSH1 0x0 SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x1101 DUP3 DUP3 PUSH2 0xDFB JUMP JUMPDEST PUSH2 0x110B DUP3 DUP3 PUSH2 0xEE7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH1 0x0 SWAP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP2 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x1169 DUP6 PUSH2 0x13F6 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1178 JUMPI PUSH1 0x1 SWAP2 POP PUSH2 0x12FB JUMP JUMPDEST DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF0B9E5BA DUP8 DUP7 DUP7 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1237 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x121F JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1264 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1299 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x12AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH32 0xF0B9E5BA00000000000000000000000000000000000000000000000000000000 EQ SWAP3 POP SWAP1 POP JUMPDEST POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1375 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x13EF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SWAP1 EXTCODESIZE GT SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd7 LOG0 0xec 0xcf 0xd4 PUSH7 0xEC2B4B530597E4 SWAP6 EQ 0x2a SWAP14 DUP15 DUP12 AND PUSH32 0xD388DFDAB2ED3A9F9182B4002900000000000000000000000000000000000000 ",
+ "sourceMap": "735:1237:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3034:102:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3034:102:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5587:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5587:145:1;;;;;;;;;;;;;;;;;;;;;;;;4949:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4949:401:1;;;;;;;;;;;7191:362;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7191:362:1;;;;;;;;;;;;;;1333:222:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1333:222:0;;;;;;;;;8184:254:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8184:254:1;;;;;;;;;;;;;;4340:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4340:178:1;;;;;;;;;;;;;;;;;;;;;;;3948:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3948:206:1;;;;;3547:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3547:180:1;;;;;;;;;;;;;;;;;;;;;;;258:20:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:5;;;;3241:106:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3241:106:1;;;;1743:227:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1743:227:0;;;;;;;;;6026:231:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6026:231:1;;;;;;;;;;;9140:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9140:339:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9140:339:1;;-1:-1:-1;9140:339:1;;-1:-1:-1;;;;;;;9140:339:1;6575:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6575:176:1;;;;;;;;;;;;500:167:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:5;;;;;;;3034:102:1;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3095:6;;3117:12;;3124:5;;3117:12;;3124:5;3117:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3034:102;:::o;5587:145::-;5671:7;5701:24;;;:14;:24;;;;;;;;;5587:145::o;4949:401::-;5026:13;5042:17;5050:8;5042:7;:17::i;:::-;5026:33;-1:-1:-1;5077:12:1;;;;;;;;;5069:21;;;;;;5108:10;:19;;;;;:58;;;5131:35;5148:5;5155:10;5131:16;:35::i;:::-;5100:67;;;;;;;;5215:1;5182:21;5194:8;5182:11;:21::i;:::-;:35;;;;:56;;;-1:-1:-1;5221:17:1;;;;;5182:56;5178:166;;;5254:24;;;;:14;:24;;;;;;;;;:30;;;;;;;;;;;;;;5303;;;;;;;5254;;5303;;;;;;;;;;;;5178:166;4949:401;;;:::o;7191:362::-;7294:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;7326:19;;;;;7318:28;;;;;;7364:17;;;;;7356:26;;;;;;7393:30;7407:5;7414:8;7393:13;:30::i;:::-;7433:32;7449:5;7456:8;7433:15;:32::i;:::-;7475:25;7486:3;7491:8;7475:10;:25::i;:::-;7532:3;7516:30;;7525:5;7516:30;;;7537:8;7516:30;;;;;;;;;;;;;;;;;;7191:362;;;;:::o;1333:222:0:-;426:5:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1445:15:0;1452:7;1445:6;:15::i;:::-;1444:16;1423:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1530:18;1536:2;1540:7;1530:5;:18::i;:::-;1333:222;;:::o;8184:254:1:-;8316:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;8389:42;8406:5;8413:3;8418:8;8389:42;;;;;;;;;;;;;:16;:42::i;:::-;8184:254;;;;:::o;4340:178::-;4419:4;4455:20;;;:10;:20;;;;;;;;4492:19;;;4340:178::o;3948:206::-;4028:7;4067:20;;;:10;:20;;;;;;;;4105:19;;;4097:28;;;;;;4142:5;3948:206;-1:-1:-1;;3948:206:1:o;3547:180::-;3627:7;3658:20;;;;;3650:29;;;;;;-1:-1:-1;3696:24:1;;;;;;:16;:24;;;;;;;3547:180::o;258:20:5:-;;;;;;:::o;3241:106:1:-;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3304:6;;3326:14;;3333:7;;3326:14;;3333:7;3326:14;;;;;;;;;;;;;;;;;;;;;;;;1743:227:0;426:5:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1857:15:0;1864:7;1857:6;:15::i;:::-;1836:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1942:21;1948:5;1955:7;1942:5;:21::i;6026:231:1:-;6119:17;;;6126:10;6119:17;;6111:26;;;;;;6165:10;6147:29;;;;:17;:29;;;;;;;;;:34;;;;;;;;;;;;:46;;;;;;;;;;;;;6208:42;;;;;;;6147:34;;6165:10;6208:42;;;;;;;;;;;6026:231;;:::o;9140:339::-;9293:8;2733:39;2751:10;2763:8;2733:17;:39::i;:::-;2725:48;;;;;;;;9317:34;9330:5;9337:3;9342:8;9317:12;:34::i;:::-;9418:53;9443:5;9450:3;9455:8;9465:5;9418:24;:53::i;:::-;9410:62;;;;;;;;9140:339;;;;;:::o;6575:176::-;6708:25;;;;6681:4;6708:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;6575:176::o;500:167:5:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;9836:278:1:-;9946:4;9966:13;9982:17;9990:8;9982:7;:17::i;:::-;9966:33;;10028:5;10016:17;;:8;:17;;;:54;;;;10062:8;10037:33;;:21;10049:8;10037:11;:21::i;:::-;:33;;;10016:54;:91;;;;10074:33;10091:5;10098:8;10074:16;:33::i;:::-;10009:98;9836:278;-1:-1:-1;;;;9836:278:1:o;11261:303::-;11378:6;11357:27;;:17;11365:8;11357:7;:17::i;:::-;:27;;;11349:36;;;;;;11435:1;11399:24;;;:14;:24;;;;;;:38;:24;:38;11395:163;;11488:1;11453:24;;;:14;:24;;;;;;;;:37;;;;;;11509:38;;;;;;;11453:37;11509:38;;;;;;;;;;;11261:303;;:::o;12357:245::-;12475:5;12454:26;;:17;12462:8;12454:7;:17::i;:::-;:26;;;12446:35;;;;;;12525:23;;;;;;;:16;:23;;;;;;12517:35;;12550:1;12517:7;:35::i;:::-;12491:23;;;;;;;;:16;:23;;;;;;;;:61;;;;12562:20;;;:10;:20;;;;:33;;;;;;12357:245::o;11835:235::-;11957:1;11925:20;;;:10;:20;;;;;;:34;:20;:34;11917:43;;;;;;11970:20;;;;:10;:20;;;;;;;;:26;;;;;;;;;;;;;12038:21;;:16;:21;;;;;;12030:33;;-1:-1:-1;12030:7:1;:33::i;:::-;12006:21;;;;;;;;:16;:21;;;;;:57;;;;-1:-1:-1;11835:235:1:o;10377:195::-;10462:17;;;;;10454:26;;;;;;10490:25;10501:3;10506:8;10490:10;:25::i;:::-;10530:35;;;;;;;;;;;;10547:1;;10530:35;;;;;;;;;10377:195;;:::o;10771:214::-;10851:31;10865:6;10873:8;10851:13;:31::i;:::-;10892:33;10908:6;10916:8;10892:15;:33::i;:::-;10940:38;;;;;;;;10965:1;;10940:38;;;;;;;;;;;;;10771:214;;:::o;13125:375::-;13285:4;13372:13;13310:15;13321:3;13310:10;:15::i;:::-;13309:16;13305:58;;;13348:4;13341:11;;;;13305:58;13404:3;13388:37;;;13426:5;13433:8;13443:5;13388:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13388:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13388:61:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13388:61:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13388:61:1;13467:25;;;13477:15;13467:25;;-1:-1:-1;13388:61:1;-1:-1:-1;13125:375:1;;;;;;;;:::o;501:208:6:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;697:5:6;;;501:208::o;715:230::-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:1;715:230;-1:-1:-1;;;715:230:6:o;13506:634:1:-;13587:4;14038:17;;14125:8;;13506:634::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/test/DummyERC721Token/DummyERC721Token.sol": {
+ "id": 0
+ },
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": {
+ "id": 1
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": {
+ "id": 2
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/test/DummyERC721Token/DummyERC721Token.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 solidity 0.4.24;\n\nimport \"../../tokens/ERC721Token/ERC721Token.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract DummyERC721Token is\n Ownable,\n ERC721Token\n{\n\n /**\n * @dev Constructor passes its arguments to the base ERC721Token constructor\n * @param name of token\n * @param symbol of token\n */\n constructor (\n string name,\n string symbol\n )\n public\n ERC721Token(name, symbol)\n {}\n\n /**\n * @dev Function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param to address the beneficiary that will own the minted token\n * @param tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function mint(address to, uint256 tokenId)\n public\n onlyOwner\n {\n require(\n !exists(tokenId),\n \"Token with tokenId already exists.\"\n );\n _mint(to, tokenId);\n }\n\n /**\n * @dev Function to burn a token\n * @dev Reverts if the given token ID doesn't exist\n * @param tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function burn(address owner, uint256 tokenId)\n public\n onlyOwner\n {\n require(\n exists(tokenId),\n \"Token with tokenId does not exist.\"\n );\n _burn(owner, tokenId);\n }\n}\n",
+ "2.0.0/tokens/ERC721Token/ERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\nimport \"./IERC721Token.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"../../utils/SafeMath/SafeMath.sol\";\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic implementation\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721BasicToken.sol\n */\ncontract ERC721Token is\n IERC721Token,\n SafeMath\n{\n // Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n // Mapping from token ID to owner\n mapping (uint256 => address) internal tokenOwner;\n\n // Mapping from token ID to approved address\n mapping (uint256 => address) internal tokenApprovals;\n\n // Mapping from owner to number of owned token\n mapping (address => uint256) internal ownedTokensCount;\n\n // Mapping from owner to operator approvals\n mapping (address => mapping (address => bool)) internal operatorApprovals;\n\n /**\n * @dev Guarantees msg.sender is owner of the given token\n * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender\n */\n modifier onlyOwnerOf(uint256 _tokenId) {\n require(ownerOf(_tokenId) == msg.sender);\n _;\n }\n\n /**\n * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator\n * @param _tokenId uint256 ID of the token to validate\n */\n modifier canTransfer(uint256 _tokenId) {\n require(isApprovedOrOwner(msg.sender, _tokenId));\n _;\n }\n\n constructor (\n string _name,\n string _symbol)\n public\n {\n name_ = _name;\n symbol_ = _symbol;\n }\n\n /**\n * @dev Gets the token name\n * @return string representing the token name\n */\n function name()\n public\n view\n returns (string)\n {\n return name_;\n }\n\n /**\n * @dev Gets the token symbol\n * @return string representing the token symbol\n */\n function symbol()\n public\n view\n returns (string)\n {\n return symbol_;\n }\n\n /**\n * @dev Gets the balance of the specified address\n * @param _owner address to query the balance of\n * @return uint256 representing the amount owned by the passed address\n */\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n require(_owner != address(0));\n return ownedTokensCount[_owner];\n }\n\n /**\n * @dev Gets the owner of the specified token ID\n * @param _tokenId uint256 ID of the token to query the owner of\n * @return owner address currently marked as the owner of the given token ID\n */\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address)\n {\n address owner = tokenOwner[_tokenId];\n require(owner != address(0));\n return owner;\n }\n\n /**\n * @dev Returns whether the specified token exists\n * @param _tokenId uint256 ID of the token to query the existance of\n * @return whether the token exists\n */\n function exists(uint256 _tokenId)\n public\n view\n returns (bool)\n {\n address owner = tokenOwner[_tokenId];\n return owner != address(0);\n }\n\n /**\n * @dev Approves another address to transfer the given token ID\n * @dev The zero address indicates there is no approved address.\n * @dev There can only be one approved address per token at a given time.\n * @dev Can only be called by the token owner or an approved operator.\n * @param _to address to be approved for the given token ID\n * @param _tokenId uint256 ID of the token to be approved\n */\n function approve(address _to, uint256 _tokenId)\n public\n {\n address owner = ownerOf(_tokenId);\n require(_to != owner);\n require(msg.sender == owner || isApprovedForAll(owner, msg.sender));\n\n if (getApproved(_tokenId) != address(0) || _to != address(0)) {\n tokenApprovals[_tokenId] = _to;\n emit Approval(owner, _to, _tokenId);\n }\n }\n\n /**\n * @dev Gets the approved address for a token ID, or zero if no address set\n * @param _tokenId uint256 ID of the token to query the approval of\n * @return address currently approved for a the given token ID\n */\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address)\n {\n return tokenApprovals[_tokenId];\n }\n\n /**\n * @dev Sets or unsets the approval of a given operator\n * @dev An operator is allowed to transfer all tokens of the sender on their behalf\n * @param _to operator address to set the approval\n * @param _approved representing the status of the approval to be set\n */\n function setApprovalForAll(address _to, bool _approved)\n public\n {\n require(_to != msg.sender);\n operatorApprovals[msg.sender][_to] = _approved;\n emit ApprovalForAll(msg.sender, _to, _approved);\n }\n\n /**\n * @dev Tells whether an operator is approved by a given owner\n * @param _owner owner address which you want to query the approval of\n * @param _operator operator address which you want to query the approval of\n * @return bool whether the given operator is approved by the given owner\n */\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool)\n {\n return operatorApprovals[_owner][_operator];\n }\n\n /**\n * @dev Transfers the ownership of a given token ID to another address\n * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function transferFrom(address _from, address _to, uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n require(_from != address(0));\n require(_to != address(0));\n\n clearApproval(_from, _tokenId);\n removeTokenFrom(_from, _tokenId);\n addTokenTo(_to, _tokenId);\n\n emit Transfer(_from, _to, _tokenId);\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId)\n public\n canTransfer(_tokenId)\n {\n // solium-disable-next-line arg-overflow\n safeTransferFrom(_from, _to, _tokenId, \"\");\n }\n\n /**\n * @dev Safely transfers the ownership of a given token ID to another address\n * @dev If the target address is a contract, it must implement `onERC721Received`,\n * which is called upon a safe transfer, and return the magic value\n * `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`; otherwise,\n * the transfer is reverted.\n * @dev Requires the msg sender to be the owner, approved, or operator\n * @param _from current owner of the token\n * @param _to address to receive the ownership of the given token ID\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes data to send along with a safe transfer check\n */\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n public\n canTransfer(_tokenId)\n {\n transferFrom(_from, _to, _tokenId);\n // solium-disable-next-line arg-overflow\n require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data));\n }\n\n /**\n * @dev Returns whether the given spender can transfer a given token ID\n * @param _spender address of the spender to query\n * @param _tokenId uint256 ID of the token to be transferred\n * @return bool whether the msg.sender is approved for the given token ID,\n * is an operator of the owner, or is the owner of the token\n */\n function isApprovedOrOwner(address _spender, uint256 _tokenId)\n internal\n view\n returns (bool)\n {\n address owner = ownerOf(_tokenId);\n return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);\n }\n\n /**\n * @dev Internal function to mint a new token\n * @dev Reverts if the given token ID already exists\n * @param _to The address that will own the minted token\n * @param _tokenId uint256 ID of the token to be minted by the msg.sender\n */\n function _mint(address _to, uint256 _tokenId)\n internal\n {\n require(_to != address(0));\n addTokenTo(_to, _tokenId);\n emit Transfer(address(0), _to, _tokenId);\n }\n\n /**\n * @dev Internal function to burn a specific token\n * @dev Reverts if the token does not exist\n * @param _tokenId uint256 ID of the token being burned by the msg.sender\n */\n function _burn(address _owner, uint256 _tokenId)\n internal\n {\n clearApproval(_owner, _tokenId);\n removeTokenFrom(_owner, _tokenId);\n emit Transfer(_owner, address(0), _tokenId);\n }\n\n /**\n * @dev Internal function to clear current approval of a given token ID\n * @dev Reverts if the given address is not indeed the owner of the token\n * @param _owner owner of the token\n * @param _tokenId uint256 ID of the token to be transferred\n */\n function clearApproval(address _owner, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _owner);\n if (tokenApprovals[_tokenId] != address(0)) {\n tokenApprovals[_tokenId] = address(0);\n emit Approval(_owner, address(0), _tokenId);\n }\n }\n\n /**\n * @dev Internal function to add a token ID to the list of a given address\n * @param _to address representing the new owner of the given token ID\n * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address\n */\n function addTokenTo(address _to, uint256 _tokenId)\n internal\n {\n require(tokenOwner[_tokenId] == address(0));\n tokenOwner[_tokenId] = _to;\n ownedTokensCount[_to] = safeAdd(ownedTokensCount[_to], 1);\n }\n\n /**\n * @dev Internal function to remove a token ID from the list of a given address\n * @param _from address representing the previous owner of the given token ID\n * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address\n */\n function removeTokenFrom(address _from, uint256 _tokenId)\n internal\n {\n require(ownerOf(_tokenId) == _from);\n ownedTokensCount[_from] = safeSub(ownedTokensCount[_from], 1);\n tokenOwner[_tokenId] = address(0);\n }\n\n /**\n * @dev Internal function to invoke `onERC721Received` on a target address\n * @dev The call is not executed if the target address is not a contract\n * @param _from address representing the previous owner of the given token ID\n * @param _to target address that will receive the tokens\n * @param _tokenId uint256 ID of the token to be transferred\n * @param _data bytes optional data to send along with the call\n * @return whether the call correctly returned the expected magic value\n */\n function checkAndCallSafeTransfer(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data)\n internal\n returns (bool)\n {\n if (!isContract(_to)) {\n return true;\n }\n bytes4 retval = IERC721Receiver(_to).onERC721Received(_from, _tokenId, _data);\n return (retval == ERC721_RECEIVED);\n }\n\n function isContract(address addr)\n internal\n view\n returns (bool)\n {\n uint256 size;\n // XXX Currently there is no better way to check if there is a contract in an address\n // than to check the size of the code at that address.\n // See https://ethereum.stackexchange.com/a/14016/36603\n // for more details about how this works.\n // TODO Check this again before the Serenity release, because all addresses will be\n // contracts then.\n assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly\n return size > 0;\n }\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Receiver.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * rom ERC721 asset contracts.\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Receiver.sol\n */\ncontract IERC721Receiver {\n /**\n * @dev Magic value to be returned upon successful reception of an NFT\n * Equals to `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`,\n * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`\n */\n bytes4 constant internal ERC721_RECEIVED = 0xf0b9e5ba;\n\n /**\n * @notice Handle the receipt of an NFT\n * @dev The ERC721 smart contract calls this function on the recipient\n * after a `safetransfer`. This function MAY throw to revert and reject the\n * transfer. This function MUST use 50,000 gas or less. Return of other\n * than the magic value MUST result in the transaction being reverted.\n * Note: the contract address is always the message sender.\n * @param _from The sending address\n * @param _tokenId The NFT identifier which is being transfered\n * @param _data Additional data with no specified format\n * @return `bytes4(keccak256(\"onERC721Received(address,uint256,bytes)\"))`\n */\n function onERC721Received(\n address _from,\n uint256 _tokenId,\n bytes _data)\n public\n returns (bytes4);\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xb5380fe9e0ca1b0bb9b1fdcbf56bb3088f83e05196ed7e7d3fc022b128bf4910",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/ERC20Proxy.json b/packages/migrations/artifacts/2.0.0/ERC20Proxy.json
new file mode 100644
index 000000000..ed755fbed
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/ERC20Proxy.json
@@ -0,0 +1,262 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC20Proxy",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getProxyId",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610f48806100256000396000f3006080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610246578063494503d41461027657806370712939146102b75780638da5cb5b146102e55780639ad26744146102fa578063ae25532e1461032b578063b918161114610375578063d39de6e9146103b7578063f2fde38b1461041c575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e40000000000000000000000000000000000000000000000000000000081141561024357604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b602860043501357f23b872dd0000000000000000000000000000000000000000000000000000000060005260606024600437602060006064600080855af1600080511160203d14163d15178116905080156101d257005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b34801561025257600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661044a565b005b34801561028257600080fd5b5061028e600435610636565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102c357600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661066b565b3480156102f157600080fd5b5061028e610964565b34801561030657600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516602435610980565b34801561033757600080fd5b50610340610d35565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561038157600080fd5b506103a373ffffffffffffffffffffffffffffffffffffffff60043516610d6b565b604080519115158252519081900360200190f35b3480156103c357600080fd5b506103cc610d80565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104085781810151838201526020016103f0565b505050509050019250505060405180910390f35b34801561042857600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516610def565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561056557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061064457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146106f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561078857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561091d578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561080557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561091557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061085d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061089057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061090f9082610ed5565b5061091d565b6001016107d5565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a0657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610a9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610b3257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610bc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610c3b57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610c6e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ced9082610ed5565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610de557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dba575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610ed257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610ef957600083815260209020610ef9918101908301610efe565b505050565b610d6891905b80821115610f185760008155600101610f04565b50905600a165627a7a723058201466e5e24b5bc03ee391f9e0fc49b2c9d54685fe6a0f7742a10783f481e82a7b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0xF48 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x2FA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x3B7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x41C JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x243 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x28 PUSH1 0x4 CALLDATALOAD ADD CALLDATALOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x60 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x20 PUSH1 0x0 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL PUSH1 0x0 DUP1 MLOAD GT PUSH1 0x20 RETURNDATASIZE EQ AND RETURNDATASIZE ISZERO OR DUP2 AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x44A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x66B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x964 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x980 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x340 PUSH2 0xD35 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CC PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x408 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F0 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDEF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x565 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x788 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x91D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x805 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x915 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x85D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x890 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x90F SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH2 0x91D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA06 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xC3B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xCED SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDBA JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xE75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xED2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEF9 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEFE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD68 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF18 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF04 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EQ PUSH7 0xE5E24B5BC03EE3 SWAP2 0xf9 0xe0 0xfc 0x49 0xb2 0xc9 0xd5 0x46 DUP6 INVALID PUSH11 0xF7742A10783F481E82A7B STOP 0x29 ",
+ "sourceMap": "685:5140:0:-;;;329:5:6;:18;;-1:-1:-1;;;;;;329:18:6;337:10;329:18;;;685:5140:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610246578063494503d41461027657806370712939146102b75780638da5cb5b146102e55780639ad26744146102fa578063ae25532e1461032b578063b918161114610375578063d39de6e9146103b7578063f2fde38b1461041c575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e40000000000000000000000000000000000000000000000000000000081141561024357604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b602860043501357f23b872dd0000000000000000000000000000000000000000000000000000000060005260606024600437602060006064600080855af1600080511160203d14163d15178116905080156101d257005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b34801561025257600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661044a565b005b34801561028257600080fd5b5061028e600435610636565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102c357600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff6004351661066b565b3480156102f157600080fd5b5061028e610964565b34801561030657600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516602435610980565b34801561033757600080fd5b50610340610d35565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561038157600080fd5b506103a373ffffffffffffffffffffffffffffffffffffffff60043516610d6b565b604080519115158252519081900360200190f35b3480156103c357600080fd5b506103cc610d80565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104085781810151838201526020016103f0565b505050509050019250505060405180910390f35b34801561042857600080fd5b5061027473ffffffffffffffffffffffffffffffffffffffff60043516610def565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561056557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061064457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146106f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561078857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561091d578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561080557fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561091557600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061085d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061089057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061090f9082610ed5565b5061091d565b6001016107d5565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a0657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610a9c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610b3257fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610bc057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610c3b57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610c6e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610ced9082610ed5565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610de557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610dba575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e7557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610ed257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610ef957600083815260209020610ef9918101908301610efe565b505050565b610d6891905b80821115610f185760008155600101610f04565b50905600a165627a7a723058201466e5e24b5bc03ee391f9e0fc49b2c9d54685fe6a0f7742a10783f481e82a7b0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x276 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2E5 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x2FA JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x375 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x3B7 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x41C JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x243 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x28 PUSH1 0x4 CALLDATALOAD ADD CALLDATALOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x60 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x20 PUSH1 0x0 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL PUSH1 0x0 DUP1 MLOAD GT PUSH1 0x20 RETURNDATASIZE EQ AND RETURNDATASIZE ISZERO OR DUP2 AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D2 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x44A JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x282 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x636 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x66B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x964 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x980 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x340 PUSH2 0xD35 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x381 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3A3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xD6B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3CC PUSH2 0xD80 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x408 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F0 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x428 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDEF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4D0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x565 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x644 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x6F2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x788 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x91D JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x805 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x915 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x85D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x890 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x90F SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH2 0x91D JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA06 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA9C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB0C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB32 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xBC0 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xC3B JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xC6E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xCED SWAP1 DUP3 PUSH2 0xED5 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xDE5 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDBA JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xE75 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xED2 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xEF9 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xEF9 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xEFE JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD68 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF18 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF04 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 EQ PUSH7 0xE5E24B5BC03EE3 SWAP2 0xf9 0xe0 0xfc 0x49 0xb2 0xc9 0xd5 0x46 DUP6 INVALID PUSH11 0xF7742A10783F481E82A7B STOP 0x29 ",
+ "sourceMap": "685:5140:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;685:5140:0;1075:66;1071:1;1058:15;1054:88;1537:66;1527:8;1524:80;1521:2;;;1833;1827:9;;1871:6;1853:70;;1963:15;1958:2;1947:14;;1940:39;2074:20;;;2068:27;2061:35;2058:2;;;2197:66;2194:1;2187:77;2296:66;2292:2;2285:78;2395:66;2391:2;2384:78;2494:1;2490:2;2483:13;2527:3;2524:1;2517:14;2058:2;3123;3119:1;3106:15;3102:24;3089:38;3419:66;3416:1;3409:77;3724:2;3720;3717:1;3704:23;4229:2;4166:1;4111:3;4046:1;3988;3918:5;3863:3;3837:459;5039:1;5035;5029:8;5026:15;4997:2;4981:14;4978:22;4949:114;4912:14;4905:22;4881:200;4872:7;4868:214;4857:225;;5102:7;5099:2;;;5132:12;5099:2;5264:66;5261:1;5254:77;5359:66;5355:2;5348:78;5454:66;5450:2;5443:78;5549:1;5545:2;5538:13;5578:3;5575:1;5568:14;1521:2;951:4655;685:5140;1146:320:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1146:320:1;;;;;;;;;1031:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1031:28:1;;;;;;;;;;;;;;;;;;;;;;;;1580:547;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1580:547:1;;;;;;;258:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:6;;;;2300:643:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2300:643:1;;;;;;;;;5710:113:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5710:113:0;;;;;;;;;;;;;;;;;;;;;;;982:43:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;982:43:1;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3040:138:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3040:138:1;;;;;;;;;;;;;;;;;500:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:6;;;;;;;1146:320:1;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1263:18:1;;;;;;;:10;:18;;;;;;;;1262:19;1241:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:18;;;;;;;1364:4;1343:18;;;;;;;;:25;;;;;;;;1378:11;27:10:-1;;23:18;;;45:23;;1378:24:1;;;;;;;;;;;;;;1417:42;1448:10;;1343:18;1417:42;;;1146:320;:::o;1031:28::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1031:28:1;:::o;1580:547::-;1815:9;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1699:18:1;;;;;;;:10;:18;;;;;;;;1678:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:18:1;;;;;;;:10;:18;;;;;1775:25;;;;;;1810:252;1834:11;:18;1830:22;;1810:252;;;1895:6;1877:24;;:11;1889:1;1877:14;;;;;;;;;;;;;;;;;;;;;;:24;1873:179;;;1938:11;1950:18;;:22;;;;1938:35;;;;;;;;;;;;;;;;1921:11;:14;;1938:35;;;;;1933:1;;1921:14;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;1991:11;:23;;;;;;;;;:::i;:::-;;2032:5;;1873:179;1854:3;;1810:252;;;2076:44;;2109:10;;2076:44;;;;;;;;;1580:547;;:::o;258:20:6:-;;;;;;:::o;2300:643:1:-;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:18:1;;;;;;;:10;:18;;;;;;;;2442:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:11;:18;2559:26;;2538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2683:6;2661:28;;:11;2673:5;2661:18;;;;;;;;;;;;;;;;;;;;;;:28;2640:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:18;;;;;;;:10;:18;;;;;2753:25;;;;;;2809:11;2821:18;;:22;;;;2809:35;;;;;;;;;;;;;;;;2788:11;:18;;2809:35;;;;;2800:5;;2788:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;2854:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;2892:44:1;;2925:10;;2892:44;;;;;;;;;2300:643;;:::o;5710:113:0:-;804:32;;;;;;;;;;;;;;;;5710:113;;:::o;982:43:1:-;;;;;;;;;;;;;;;:::o;3040:138::-;3121:9;3160:11;3153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;:::o;500:167:6:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;685:5140:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/ERC20Proxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/ERC20Proxy.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAuthorizable.sol\";\n\n\ncontract ERC20Proxy is\n MixinAuthorizable\n{\n // Id of this proxy.\n bytes4 constant internal PROXY_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n \n // solhint-disable-next-line payable-fallback\n function () \n external\n {\n assembly {\n // The first 4 bytes of calldata holds the function selector\n let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)\n\n // `transferFrom` will be called with the following parameters:\n // assetData Encoded byte array.\n // from Address to transfer asset from.\n // to Address to transfer asset to.\n // amount Amount of asset to transfer.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {\n\n // To lookup a value in a mapping, we load from the storage location keccak256(k, p),\n // where k is the key left padded to 32 bytes and p is the storage slot\n let start := mload(64)\n mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(start, 32), authorized_slot)\n\n // Revert if authorized[msg.sender] == false\n if iszero(sload(keccak256(start, 64))) {\n // Revert with `Error(\"SENDER_NOT_AUTHORIZED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n \n /////// Token contract address ///////\n // The token address is found as follows:\n // * It is stored at offset 4 in `assetData` contents.\n // * This is stored at offset 32 from `assetData`.\n // * The offset to `assetData` from Params is stored at offset\n // 4 in calldata.\n // * The offset of Params in calldata is 4.\n // So we read location 4 and add 32 + 4 + 4 to it.\n let token := calldataload(add(calldataload(4), 40))\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFrom` selector.\n // Any trailing data in transferFromSelector will be\n // overwritten in the next `mstore` call.\n mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // We copy the fields `from`, `to` and `amount` in bulk\n // from our own calldata to the new calldata.\n calldatacopy(4, 36, 96)\n\n /////// Call `token.transferFrom` using the calldata ///////\n let success := call(\n gas, // forward all gas\n token, // call address of token contract\n 0, // don't send any ETH\n 0, // pointer to start of input\n 100, // length of input\n 0, // write output over input\n 32 // output size should be 32 bytes\n )\n\n /////// Check return data. ///////\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // nonzero 32 bytes value.\n // So the transfer succeeded if the call succeeded and either\n // returned nothing, or returned a non-zero 32 byte value. \n success := and(success, or(\n iszero(returndatasize),\n and(\n eq(returndatasize, 32),\n gt(mload(0), 0)\n )\n ))\n if success {\n return(0, 0)\n }\n \n // Revert with `Error(\"TRANSFER_FAILED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4)\n {\n return PROXY_ID;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\n\ncontract MixinAuthorizable is\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n \"SENDER_NOT_AUTHORIZED\"\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n \"TARGET_ALREADY_AUTHORIZED\"\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n\n delete authorized[target];\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n require(\n index < authorities.length,\n \"INDEX_OUT_OF_BOUNDS\"\n );\n require(\n authorities[index] == target,\n \"AUTHORIZED_ADDRESS_MISMATCH\"\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.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 solidity 0.4.24;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xde9de8664ed39125c63cc0d58d264a030799b57b5ca904c5c69d1ddd8352ad77",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x1dc4c1cefef38a777b15aa20260a54e584b16c48",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/ERC20Token.json b/packages/migrations/artifacts/2.0.0/ERC20Token.json
new file mode 100644
index 000000000..837780e45
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/ERC20Token.json
@@ -0,0 +1,230 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC20Token",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b506106a0806100206000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100c157806323b872dd146100e857806370a082311461011f578063a9059cbb1461014d578063dd62ed3e1461017e575b600080fd5b34801561008857600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356101b2565b604080519115158252519081900360200190f35b3480156100cd57600080fd5b506100d6610225565b60408051918252519081900360200190f35b3480156100f457600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561022b565b34801561012b57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff60043516610487565b34801561015957600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356104af565b34801561018a57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff6004358116906024351661063c565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120548211156102bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915290205482111561035e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156103f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526020818152604080832080548801905593881680835284832080548890039055600182528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3360009081526020819052604081205482111561052d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156105c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600160209081526040808320939094168252919091522054905600a165627a7a7230582049a166026f124a2c987796c84fbdc971bb7b3d917c525a7aeca272ff944e84c60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6A0 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x17E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x1B2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x22B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x487 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x4AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x63C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x35E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP4 DUP9 AND DUP1 DUP4 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE PUSH1 0x1 DUP3 MSTORE DUP5 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x49 LOG1 PUSH7 0x26F124A2C9877 SWAP7 0xc8 0x4f 0xbd 0xc9 PUSH18 0xBB7B3D917C525A7AECA272FF944E84C60029 ",
+ "sourceMap": "635:1822:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;635:1822:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663095ea7b3811461007c57806318160ddd146100c157806323b872dd146100e857806370a082311461011f578063a9059cbb1461014d578063dd62ed3e1461017e575b600080fd5b34801561008857600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356101b2565b604080519115158252519081900360200190f35b3480156100cd57600080fd5b506100d6610225565b60408051918252519081900360200190f35b3480156100f457600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff6004358116906024351660443561022b565b34801561012b57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff60043516610487565b34801561015957600080fd5b506100ad73ffffffffffffffffffffffffffffffffffffffff600435166024356104af565b34801561018a57600080fd5b506100d673ffffffffffffffffffffffffffffffffffffffff6004358116906024351661063c565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b60025481565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260408120548211156102bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8416600090815260016020908152604080832033845290915290205482111561035e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f45524332305f494e53554646494349454e545f414c4c4f57414e434500000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156103f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff80841660008181526020818152604080832080548801905593881680835284832080548890039055600182528483203384528252918490208054879003905583518681529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35060019392505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3360009081526020819052604081205482111561052d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f45524332305f494e53554646494349454e545f42414c414e4345000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110156105c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4f564552464c4f57000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000818152602081815260408083208054879003905573ffffffffffffffffffffffffffffffffffffffff871680845292819020805487019055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a350600192915050565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600160209081526040808320939094168252919091522054905600a165627a7a7230582049a166026f124a2c987796c84fbdc971bb7b3d917c525a7aeca272ff944e84c60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x95EA7B3 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0xC1 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x14D JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x17E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x1B2 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH2 0x225 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x22B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x487 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x159 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x4AF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xD6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x63C JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x2BF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x35E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F414C4C4F57414E434500000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x3F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 ADD SWAP1 SSTORE SWAP4 DUP9 AND DUP1 DUP4 MSTORE DUP5 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE PUSH1 0x1 DUP3 MSTORE DUP5 DUP4 KECCAK256 CALLER DUP5 MSTORE DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45524332305F494E53554646494349454E545F42414C414E4345000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 DUP2 ADD LT ISZERO PUSH2 0x5C3 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x8 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F564552464C4F57000000000000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP8 SWAP1 SUB SWAP1 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP5 MSTORE SWAP3 DUP2 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP4 SWAP3 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x49 LOG1 PUSH7 0x26F124A2C9877 SWAP7 0xc8 0x4f 0xbd 0xc9 PUSH18 0xBB7B3D917C525A7AECA272FF944E84C60029 ",
+ "sourceMap": "635:1822:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1928:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1928:222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;802:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;802:26:0;;;;;;;;;;;;;;;;;;;;1296:626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1296:626:0;;;;;;;;;;;;;;2156:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2156:133:0;;;;;;;835:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;835:455:0;;;;;;;;;2295:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2295:160:0;;;;;;;;;;;;1928:222;2039:10;2011:4;2031:19;;;:7;:19;;;;;;;;;:29;;;;;;;;;;;:38;;;2084;;;;;;;2011:4;;2031:29;;2039:10;;2084:38;;;;;;;;-1:-1:-1;2139:4:0;1928:222;;;;:::o;802:26::-;;;;:::o;1296:626::-;1435:15;;;1394:4;1435:15;;;;;;;;;;;:25;-1:-1:-1;1435:25:0;1414:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1543:14;;;;;;;:7;:14;;;;;;;;1558:10;1543:26;;;;;;;;:36;-1:-1:-1;1543:36:0;1522:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1690:13;;;:8;:13;;;;;;;;;;;1664:22;;;:39;;1643:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1747:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1780:15;;;;;;;;;:25;;;;;;;-1:-1:-1;1815:14:0;;;;;1830:10;1815:26;;;;;;;;:36;;;;;;;1866:28;;;;;;;1747:13;;1780:15;;1866:28;;;;;;;;;;-1:-1:-1;1911:4:0;1296:626;;;;;:::o;2156:133::-;2266:16;;2236:7;2266:16;;;;;;;;;;;;2156:133::o;835:455::-;964:10;914:4;955:20;;;;;;;;;;;:30;-1:-1:-1;955:30:0;934:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1094:13;;;:8;:13;;;;;;;;;;;1068:22;;;:39;;1047:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1160:10;1151:8;:20;;;;;;;;;;;:30;;;;;;;:20;1191:13;;;;;;;;;:23;;;;;;1229:33;;;;;;;1191:13;;1160:10;1229:33;;;;;;;;;;;-1:-1:-1;1279:4:0;835:455;;;;:::o;2295:160::-;2423:15;;;;2393:7;2423:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;2295:160::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/tokens/ERC20Token/ERC20Token.sol": {
+ "id": 0
+ },
+ "2.0.0/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/tokens/ERC20Token/ERC20Token.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 solidity 0.4.24;\n\nimport \"./IERC20Token.sol\";\n\n\ncontract ERC20Token is IERC20Token {\n\n mapping (address => uint256) internal balances;\n mapping (address => mapping (address => uint256)) internal allowed;\n\n uint256 public totalSupply;\n\n function transfer(address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n emit Transfer(msg.sender, _to, _value);\n return true;\n }\n\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool)\n {\n require(\n balances[_from] >= _value,\n \"ERC20_INSUFFICIENT_BALANCE\"\n );\n require(\n allowed[_from][msg.sender] >= _value,\n \"ERC20_INSUFFICIENT_ALLOWANCE\"\n );\n require(\n balances[_to] + _value >= balances[_to],\n \"OVERFLOW\"\n );\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n emit Transfer(_from, _to, _value);\n return true;\n }\n\n function approve(address _spender, uint256 _value)\n public\n returns (bool)\n {\n allowed[msg.sender][_spender] = _value;\n emit Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256)\n {\n return balances[_owner];\n }\n\n function allowance(address _owner, address _spender)\n public\n view\n returns (uint256)\n {\n return allowed[_owner][_spender];\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/IERC20Token.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 solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n"
+ },
+ "sourceTreeHashHex": "0x83f5c6eaadc10f6b60d2712425bd0f2d431ea54ee3d85bc82bed38f3d559d4f8",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/ERC721Proxy.json b/packages/migrations/artifacts/2.0.0/ERC721Proxy.json
new file mode 100644
index 000000000..8421a6499
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/ERC721Proxy.json
@@ -0,0 +1,262 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ERC721Proxy",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getProxyId",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610fbc806100256000396000f3006080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146102ba578063494503d4146102ea578063707129391461032b5780638da5cb5b146103595780639ad267441461036e578063ae25532e1461039f578063b9181611146103e9578063d39de6e91461042b578063f2fde38b14610490575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e4000000000000000000000000000000000000000000000000000000008114156102b757604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b600160643503156101f7577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0e494e56414c49445f414d4f554e540000000000000000000000000000604052600060605260646000fd5b7f23b872dd000000000000000000000000000000000000000000000000000000006000526040602460043760043560206048820160443760288101356000806064600080855af1801561024657005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b3480156102c657600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166104be565b005b3480156102f657600080fd5b506103026004356106aa565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561033757600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166106df565b34801561036557600080fd5b506103026109d8565b34801561037a57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166024356109f4565b3480156103ab57600080fd5b506103b4610da9565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b3480156103f557600080fd5b5061041773ffffffffffffffffffffffffffffffffffffffff60043516610ddf565b604080519115158252519081900360200190f35b34801561043757600080fd5b50610440610df4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047c578181015183820152602001610464565b505050509050019250505060405180910390f35b34801561049c57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff60043516610e63565b60005473ffffffffffffffffffffffffffffffffffffffff16331461054457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156105d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106106b857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461076657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1615156107fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610991578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561087957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561098957600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108d157fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061090457fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906109839082610f49565b50610991565b600101610849565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610ba657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610c3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610caf57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610ce257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610d619082610f49565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610e5957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610f4657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610f6d57600083815260209020610f6d918101908301610f72565b505050565b610ddc91905b80821115610f8c5760008155600101610f78565b50905600a165627a7a723058206ee4875fb64ae5fa7cc19d60ec6f97889c210374b015734d3f22447404752fd70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0xFBC DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x2EA JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x359 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x490 JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x64 CALLDATALOAD SUB ISZERO PUSH2 0x1F7 JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xE494E56414C49445F414D4F554E540000000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x4 CALLDATALOAD PUSH1 0x20 PUSH1 0x48 DUP3 ADD PUSH1 0x44 CALLDATACOPY PUSH1 0x28 DUP2 ADD CALLDATALOAD PUSH1 0x0 DUP1 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL DUP1 ISZERO PUSH2 0x246 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x4BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH1 0x4 CALLDATALOAD PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x9D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x9F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B4 PUSH2 0xDA9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x417 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x437 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440 PUSH2 0xDF4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x464 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x544 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x766 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x991 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x989 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x904 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x983 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH2 0x991 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x849 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB10 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB80 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC34 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xCAF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xCE2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xD61 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE59 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE2E JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xF6D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xF72 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDDC SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF8C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF78 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH15 0xE4875FB64AE5FA7CC19D60EC6F9788 SWAP13 0x21 SUB PUSH21 0xB015734D3F22447404752FD7002900000000000000 ",
+ "sourceMap": "685:7681:0:-;;;329:5:6;:18;;-1:-1:-1;;;;;;329:18:6;337:10;329:18;;;685:7681:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100985763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e81146102ba578063494503d4146102ea578063707129391461032b5780638da5cb5b146103595780639ad267441461036e578063ae25532e1461039f578063b9181611146103e9578063d39de6e91461042b578063f2fde38b14610490575b3480156100a457600080fd5b507fffffffff00000000000000000000000000000000000000000000000000000000600035167fa85e59e4000000000000000000000000000000000000000000000000000000008114156102b757604080513381526001602082015290812054151561017b577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c1553454e4445525f4e4f545f415554484f52495a454400000000000000604052600060605260646000fd5b600160643503156101f7577f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0e494e56414c49445f414d4f554e540000000000000000000000000000604052600060605260646000fd5b7f23b872dd000000000000000000000000000000000000000000000000000000006000526040602460043760043560206048820160443760288101356000806064600080855af1801561024657005b7f08c379a0000000000000000000000000000000000000000000000000000000006000527c20000000000000000000000000000000000000000000000000000000006020527c0f5452414e534645525f4641494c454400000000000000000000000000604052600060605260646000fd5b50005b3480156102c657600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166104be565b005b3480156102f657600080fd5b506103026004356106aa565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561033757600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166106df565b34801561036557600080fd5b506103026109d8565b34801561037a57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff600435166024356109f4565b3480156103ab57600080fd5b506103b4610da9565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b3480156103f557600080fd5b5061041773ffffffffffffffffffffffffffffffffffffffff60043516610ddf565b604080519115158252519081900360200190f35b34801561043757600080fd5b50610440610df4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047c578181015183820152602001610464565b505050509050019250505060405180910390f35b34801561049c57600080fd5b506102e873ffffffffffffffffffffffffffffffffffffffff60043516610e63565b60005473ffffffffffffffffffffffffffffffffffffffff16331461054457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff16156105d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b60028054829081106106b857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461076657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff1615156107fc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600254811015610991578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561087957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561098957600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106108d157fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061090457fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906109839082610f49565b50610991565b600101610849565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff161515610b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b6002548110610b8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff16600282815481101515610ba657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610c3457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610caf57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610ce257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610d619082610f49565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190205b90565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610e5957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e2e575b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ee957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610f4657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610f6d57600083815260209020610f6d918101908301610f72565b505050565b610ddc91905b80821115610f8c5760008155600101610f78565b50905600a165627a7a723058206ee4875fb64ae5fa7cc19d60ec6f97889c210374b015734d3f22447404752fd70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x98 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0x2EA JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x32B JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x359 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x36E JUMPI DUP1 PUSH4 0xAE25532E EQ PUSH2 0x39F JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x3E9 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x42B JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x490 JUMPI JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD AND PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP2 EQ ISZERO PUSH2 0x2B7 JUMPI PUSH1 0x40 DUP1 MLOAD CALLER DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 DUP2 KECCAK256 SLOAD ISZERO ISZERO PUSH2 0x17B JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0x1553454E4445525F4E4F545F415554484F52495A454400000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x64 CALLDATALOAD SUB ISZERO PUSH2 0x1F7 JUMPI PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xE494E56414C49445F414D4F554E540000000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x24 PUSH1 0x4 CALLDATACOPY PUSH1 0x4 CALLDATALOAD PUSH1 0x20 PUSH1 0x48 DUP3 ADD PUSH1 0x44 CALLDATACOPY PUSH1 0x28 DUP2 ADD CALLDATALOAD PUSH1 0x0 DUP1 PUSH1 0x64 PUSH1 0x0 DUP1 DUP6 GAS CALL DUP1 ISZERO PUSH2 0x246 JUMPI STOP JUMPDEST PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH29 0x2000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 MSTORE PUSH29 0xF5452414E534645525F4641494C454400000000000000000000000000 PUSH1 0x40 MSTORE PUSH1 0x0 PUSH1 0x60 MSTORE PUSH1 0x64 PUSH1 0x0 REVERT JUMPDEST POP STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x4BE JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH1 0x4 CALLDATALOAD PUSH2 0x6AA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x337 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x6DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x365 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x302 PUSH2 0x9D8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x37A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x9F4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B4 PUSH2 0xDA9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x417 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xDDF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x437 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x440 PUSH2 0xDF4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x47C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x464 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x49C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xE63 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x544 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x5D9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x766 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x7FC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x991 JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x879 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x989 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x8D1 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x904 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x983 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH2 0x991 JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x849 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xA7A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xB10 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0xB80 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0xC34 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xCAF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xCE2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xD61 SWAP1 DUP3 PUSH2 0xF49 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE59 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE2E JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xEE9 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xF46 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xF6D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xF6D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xF72 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDDC SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xF8C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xF78 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH15 0xE4875FB64AE5FA7CC19D60EC6F9788 SWAP13 0x21 SUB PUSH21 0xB015734D3F22447404752FD7002900000000000000 ",
+ "sourceMap": "685:7681:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;685:7681:0;1081:66;1077:1;1064:15;1060:88;1543:66;1533:8;1530:80;1527:2;;;1839;1833:9;;1877:6;1859:70;;1969:15;1964:2;1953:14;;1946:39;2080:20;;;2074:27;2067:35;2064:2;;;2203:66;2200:1;2193:77;2302:66;2298:2;2291:78;2401:66;2397:2;2390:78;2500:1;2496:2;2489:13;2533:3;2530:1;2523:14;2064:2;5773:1;5767:3;5754:17;5750:25;5747:2;;;5869:66;5866:1;5859:77;5968:66;5964:2;5957:78;6067:66;6063:2;6056:78;6166:1;6162:2;6155:13;6199:3;6196:1;6189:14;5747:2;6497:66;6494:1;6487:77;6792:2;6788;6785:1;6772:23;6932:1;6919:15;6994:2;6989;6972:15;6968:24;6964:2;6951:46;7139:2;7122:15;7118:24;7105:38;7564:1;7504;7449:3;7384:1;7326;7256:5;7201:3;7175:448;7643:7;7640:2;;;7673:12;7640:2;7805:66;7802:1;7795:77;7900:66;7896:2;7889:78;7995:66;7991:2;7984:78;8090:1;8086:2;8079:13;8119:3;8116:1;8109:14;1527:2;957:7190;685:7681;1146:320:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1146:320:1;;;;;;;;;1031:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1031:28:1;;;;;;;;;;;;;;;;;;;;;;;;1580:547;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1580:547:1;;;;;;;258:20:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:6;;;;2300:643:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2300:643:1;;;;;;;;;8251:113:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8251:113:0;;;;;;;;;;;;;;;;;;;;;;;982:43:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;982:43:1;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3040:138:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3040:138:1;;;;;;;;;;;;;;;;;500:167:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:6;;;;;;;1146:320:1;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1263:18:1;;;;;;;:10;:18;;;;;;;;1262:19;1241:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:18;;;;;;;1364:4;1343:18;;;;;;;;:25;;;;;;;;1378:11;27:10:-1;;23:18;;;45:23;;1378:24:1;;;;;;;;;;;;;;1417:42;1448:10;;1343:18;1417:42;;;1146:320;:::o;1031:28::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1031:28:1;:::o;1580:547::-;1815:9;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1699:18:1;;;;;;;:10;:18;;;;;;;;1678:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:18:1;;;;;;;:10;:18;;;;;1775:25;;;;;;1810:252;1834:11;:18;1830:22;;1810:252;;;1895:6;1877:24;;:11;1889:1;1877:14;;;;;;;;;;;;;;;;;;;;;;:24;1873:179;;;1938:11;1950:18;;:22;;;;1938:35;;;;;;;;;;;;;;;;1921:11;:14;;1938:35;;;;;1933:1;;1921:14;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;1991:11;:23;;;;;;;;;:::i;:::-;;2032:5;;1873:179;1854:3;;1810:252;;;2076:44;;2109:10;;2076:44;;;;;;;;;1580:547;;:::o;258:20:6:-;;;;;;:::o;2300:643:1:-;426:5:6;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:18:1;;;;;;;:10;:18;;;;;;;;2442:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:11;:18;2559:26;;2538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2683:6;2661:28;;:11;2673:5;2661:18;;;;;;;;;;;;;;;;;;;;;;:28;2640:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:18;;;;;;;:10;:18;;;;;2753:25;;;;;;2809:11;2821:18;;:22;;;;2809:35;;;;;;;;;;;;;;;;2788:11;:18;;2809:35;;;;;2800:5;;2788:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;2854:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;2892:44:1;;2925:10;;2892:44;;;;;;;;;2300:643;;:::o;8251:113:0:-;805:41;;;;;;;;;;;;;;;;8251:113;;:::o;982:43:1:-;;;;;;;;;;;;;;;:::o;3040:138::-;3121:9;3160:11;3153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;:::o;500:167:6:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;685:7681:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/ERC721Proxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 4
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/ERC721Proxy.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./MixinAuthorizable.sol\";\n\n\ncontract ERC721Proxy is\n MixinAuthorizable\n{\n // Id of this proxy.\n bytes4 constant internal PROXY_ID = bytes4(keccak256(\"ERC721Token(address,uint256)\"));\n\n // solhint-disable-next-line payable-fallback\n function () \n external\n {\n assembly {\n // The first 4 bytes of calldata holds the function selector\n let selector := and(calldataload(0), 0xffffffff00000000000000000000000000000000000000000000000000000000)\n\n // `transferFrom` will be called with the following parameters:\n // assetData Encoded byte array.\n // from Address to transfer asset from.\n // to Address to transfer asset to.\n // amount Amount of asset to transfer.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n if eq(selector, 0xa85e59e400000000000000000000000000000000000000000000000000000000) {\n\n // To lookup a value in a mapping, we load from the storage location keccak256(k, p),\n // where k is the key left padded to 32 bytes and p is the storage slot\n let start := mload(64)\n mstore(start, and(caller, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(start, 32), authorized_slot)\n\n // Revert if authorized[msg.sender] == false\n if iszero(sload(keccak256(start, 64))) {\n // Revert with `Error(\"SENDER_NOT_AUTHORIZED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000001553454e4445525f4e4f545f415554484f52495a454400000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n\n // `transferFrom`.\n // The function is marked `external`, so no abi decodeding is done for\n // us. Instead, we expect the `calldata` memory to contain the\n // following:\n //\n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n //\n // (*): offset is computed from start of function parameters, so offset\n // by an additional 4 bytes in the calldata.\n //\n // WARNING: The ABIv2 specification allows additional padding between\n // the Params and Data section. This will result in a larger\n // offset to assetData.\n\n // Asset data itself is encoded as follows:\n //\n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 2 * 32 | function parameters: |\n // | | 4 | 12 + 20 | 1. token address |\n // | | 36 | | 2. tokenId |\n \n // We construct calldata for the `token.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // |----------|--------|---------|-------------------------------------|\n // | Header | 0 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 4 | | 1. from |\n // | | 36 | | 2. to |\n // | | 68 | | 3. tokenId |\n\n // There exists only 1 of each token.\n // require(amount == 1, \"INVALID_AMOUNT\")\n if sub(calldataload(100), 1) {\n // Revert with `Error(\"INVALID_AMOUNT\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000e494e56414c49445f414d4f554e540000000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n\n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFrom` selector.\n // Any trailing data in transferFromSelector will be\n // overwritten in the next `mstore` call.\n mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // We copy the fields `from` and `to` in bulk\n // from our own calldata to the new calldata.\n calldatacopy(4, 36, 64)\n\n // Copy `tokenId` field from our own calldata to the new calldata.\n let assetDataOffset := calldataload(4)\n calldatacopy(68, add(assetDataOffset, 72), 32)\n\n /////// Call `token.transferFrom` using the calldata ///////\n let token := calldataload(add(assetDataOffset, 40))\n let success := call(\n gas, // forward all gas\n token, // call address of token contract\n 0, // don't send any ETH\n 0, // pointer to start of input\n 100, // length of input\n 0, // write output to null\n 0 // output size is 0 bytes\n )\n if success {\n return(0, 0)\n }\n \n // Revert with `Error(\"TRANSFER_FAILED\")`\n mstore(0, 0x08c379a000000000000000000000000000000000000000000000000000000000)\n mstore(32, 0x0000002000000000000000000000000000000000000000000000000000000000)\n mstore(64, 0x0000000f5452414e534645525f4641494c454400000000000000000000000000)\n mstore(96, 0)\n revert(0, 100)\n }\n }\n }\n\n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4)\n {\n return PROXY_ID;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\n\ncontract MixinAuthorizable is\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n \"SENDER_NOT_AUTHORIZED\"\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n \"TARGET_ALREADY_AUTHORIZED\"\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n\n delete authorized[target];\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n require(\n index < authorities.length,\n \"INDEX_OUT_OF_BOUNDS\"\n );\n require(\n authorities[index] == target,\n \"AUTHORIZED_ADDRESS_MISMATCH\"\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.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 solidity 0.4.24;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xd9839b45ce637bedd02bd42cea1eac40261f2294e1b3566bf59a434ea31b2542",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x1d7022f5b17d2f8b695918fb48fa1089c9f85401",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/Exchange.json b/packages/migrations/artifacts/2.0.0/Exchange.json
new file mode 100644
index 000000000..f8b5b3cfc
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/Exchange.json
@@ -0,0 +1,2148 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Exchange",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "filled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "cancelled",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "preSign",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "leftOrder",
+ "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": "rightOrder",
+ "type": "tuple"
+ },
+ {
+ "name": "leftSignature",
+ "type": "bytes"
+ },
+ {
+ "name": "rightSignature",
+ "type": "bytes"
+ }
+ ],
+ "name": "matchOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "left",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "right",
+ "type": "tuple"
+ },
+ {
+ "name": "leftMakerAssetSpreadAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "matchedFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrderNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "name": "assetProxies",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "batchCancelOrders",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrKillOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "targetOrderEpoch",
+ "type": "uint256"
+ }
+ ],
+ "name": "cancelOrdersUpTo",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "batchFillOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "assetProxyId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "getAssetProxy",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrKillOrder",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "name": "approval",
+ "type": "bool"
+ }
+ ],
+ "name": "setSignatureValidatorApproval",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowedValidators",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketSellOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "getOrdersInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "orderStatus",
+ "type": "uint8"
+ },
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "name": "orderTakerAssetFilledAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "",
+ "type": "tuple[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "preSigned",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketBuyOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrder",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "fillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "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": "getOrderInfo",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "orderStatus",
+ "type": "uint8"
+ },
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "name": "orderTakerAssetFilledAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderInfo",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "cancelOrder",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "orderEpoch",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "ZRX_ASSET_DATA",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketSellOrdersNoThrow",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EIP712_DOMAIN_HASH",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ }
+ ],
+ "name": "marketBuyOrders",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "currentContextAddress",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "VERSION",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_zrxAssetData",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "SignatureValidatorApproval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipientAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "takerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "takerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "Fill",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "feeRecipientAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "orderHash",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "name": "makerAssetData",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "takerAssetData",
+ "type": "bytes"
+ }
+ ],
+ "name": "Cancel",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "makerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "senderAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "orderEpoch",
+ "type": "uint256"
+ }
+ ],
+ "name": "CancelUpTo",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "id",
+ "type": "bytes4"
+ },
+ {
+ "indexed": false,
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "AssetProxyRegistered",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b506040516200541438038062005414833981018060405262000037919081019062000443565b805181906200004e90600090602084019062000342565b5050604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f2900000000000000000000000000000000000000000000000000000000000000606183015282516042818403018152606290920192839052815191929182918401908083835b60208310620001585780518252601f19909201916020918201910162000137565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b60208310620001e25780518252601f199092019160209182019101620001c1565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106200026c5780518252601f1990920191602091820191016200024b565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208282019890985281840196909652606081019690965250306080808701919091528151808703909101815260a09095019081905284519093849350850191508083835b60208310620002f75780518252601f199092019160209182019101620002d6565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600155505060028054600160a060020a0319163317905550620005059050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200038557805160ff1916838001178555620003b5565b82800160010185558215620003b5579182015b82811115620003b557825182559160200191906001019062000398565b50620003c3929150620003c7565b5090565b620003e491905b80821115620003c35760008155600101620003ce565b90565b6000601f82018313620003f957600080fd5b8151620004106200040a82620004aa565b62000483565b915080825260208301602083018583830111156200042d57600080fd5b6200043a838284620004d2565b50505092915050565b6000602082840312156200045657600080fd5b81516001604060020a038111156200046d57600080fd5b6200047b84828501620003e7565b949350505050565b6040518181016001604060020a0381118282101715620004a257600080fd5b604052919050565b60006001604060020a03821115620004c157600080fd5b506020601f91909101601f19160190565b60005b83811015620004ef578181015183820152602001620004d5565b83811115620004ff576000848401525b50505050565b614eff80620005156000396000f3006080604052600436106101b65763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc9181146101bb578063297bb70b146101f15780632ac126221461021e5780633683ef8e1461024b5780633c28d8611461026d5780633e228bae1461029a5780633fd3c997146102ba5780634ac14782146102e75780634d0ae546146103075780634f9559b11461032757806350dde190146103475780636070410814610367578063642f2eaf1461039457806364a3bc15146103b457806377fcce68146103d45780637b8e3514146103f45780637e1d9808146104145780637e9d74dc1461043457806382c174d0146104615780638da5cb5b146104815780639363470214610496578063a3e20380146104b6578063b4be83d5146104d6578063bfc8bfce146104f6578063c585bb9314610516578063c75e0a8114610536578063d46b02c314610563578063d9bfa73e14610583578063db123b1a146105a3578063dd1c7d18146105c5578063e306f779146105e5578063e5fa431b146105fa578063eea086ba1461061a578063f2fde38b1461062f578063ffa1ad741461064f575b600080fd5b3480156101c757600080fd5b506101db6101d6366004613f4c565b610664565b6040516101e89190614ab1565b60405180910390f35b3480156101fd57600080fd5b5061021161020c366004613e51565b610676565b6040516101e89190614d4b565b34801561022a57600080fd5b5061023e610239366004613f4c565b61070a565b6040516101e89190614aa3565b34801561025757600080fd5b5061026b610266366004613f89565b61071f565b005b34801561027957600080fd5b5061028d6102883660046140bd565b6107f8565b6040516101e89190614d59565b3480156102a657600080fd5b506102116102b536600461417d565b6108e4565b3480156102c657600080fd5b506102da6102d536600461404c565b610965565b6040516101e89190614b6d565b3480156102f357600080fd5b5061026b610302366004613e1c565b61098d565b34801561031357600080fd5b50610211610322366004613e51565b6109c6565b34801561033357600080fd5b5061026b610342366004613f4c565b610a50565b34801561035357600080fd5b50610211610362366004613e51565b610b74565b34801561037357600080fd5b5061038761038236600461404c565b610bfe565b6040516101e891906149c3565b3480156103a057600080fd5b5061023e6103af366004613f4c565b610c4c565b3480156103c057600080fd5b506102116103cf36600461417d565b610c61565b3480156103e057600080fd5b5061026b6103ef366004613dec565b610cbb565b34801561040057600080fd5b5061023e61040f366004613db2565b610d66565b34801561042057600080fd5b5061021161042f366004613ee5565b610d86565b34801561044057600080fd5b5061045461044f366004613e1c565b610e5b565b6040516101e89190614a92565b34801561046d57600080fd5b5061023e61047c366004613f6a565b610ef8565b34801561048d57600080fd5b50610387610f18565b3480156104a257600080fd5b5061023e6104b1366004613ff1565b610f34565b3480156104c257600080fd5b506102116104d1366004613ee5565b61175a565b3480156104e257600080fd5b506102116104f136600461417d565b61186d565b34801561050257600080fd5b5061026b6105113660046141c6565b6118fc565b34801561052257600080fd5b5061026b610531366004613d94565b611b95565b34801561054257600080fd5b50610556610551366004614088565b611dc0565b6040516101e89190614d68565b34801561056f57600080fd5b5061026b61057e366004614088565b611eba565b34801561058f57600080fd5b506101db61059e366004613db2565b611ee9565b3480156105af57600080fd5b506105b8611f06565b6040516101e89190614b5c565b3480156105d157600080fd5b506102116105e0366004613ee5565b611fb2565b3480156105f157600080fd5b506101db61207b565b34801561060657600080fd5b50610211610615366004613ee5565b612081565b34801561062657600080fd5b50610387612157565b34801561063b57600080fd5b5061026b61064a366004613d94565b612173565b34801561065b57600080fd5b506105b8612224565b60036020526000908152604090205481565b61067e6139ba565b6000806106896139ba565b86519250600091505b818314610700576106e987838151811015156106aa57fe5b9060200190602002015187848151811015156106c257fe5b9060200190602002015187858151811015156106da57fe5b9060200190602002015161186d565b90506106f5848261225b565b600190910190610692565b5050509392505050565b60046020526000908152604090205460ff1681565b61075a848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610f34945050505050565b151561079b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c1b565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6108006139e3565b610808613a12565b610810613a12565b610160808801516101408089019190915288015190870152600061083388611dc0565b925061083e87611dc0565b91506108486122bd565b90506108548888612306565b610868888885604001518560400151612362565b80516020015190945061088290899085908490808b612426565b602080850151015161089b90889084908490808a612426565b6108b48882856020015186604001518860000151612643565b6108cd8782846020015185604001518860200151612643565b6108d9888883876126ef565b505050949350505050565b6108ec6139ba565b60606108f98585856128cf565b9050608081825160208401305af480801561091b576001811461093957610700565b60008452600060208501526000604085015260006060850152610700565b825184526020830151602085015260408301516040850152606083015160608501525050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b805160005b8082146109c1576109b983828151811015156109aa57fe5b90602001906020020151611eba565b600101610992565b505050565b6109ce6139ba565b6000806109d96139ba565b86519250600091505b81831461070057610a3987838151811015156109fa57fe5b906020019060200201518784815181101515610a1257fe5b906020019060200201518785815181101515610a2a57fe5b90602001906020020151610c61565b9050610a45848261225b565b6001909101906109e2565b600080600080610a5e6122bd565b935073ffffffffffffffffffffffffffffffffffffffff84163314610a835733610a86565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c9b565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610b65908690614ab1565b60405180910390a35050505050565b610b7c6139ba565b600080610b876139ba565b86519250600091505b81831461070057610be78783815181101515610ba857fe5b906020019060200201518784815181101515610bc057fe5b906020019060200201518785815181101515610bd857fe5b906020019060200201516108e4565b9050610bf3848261225b565b600190910190610b90565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610c696139ba565b610c7484848461186d565b60208101519091508314610cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cbb565b9392505050565b6000610cc56122bd565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610d59908690614aa3565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b610d8e6139ba565b60606000806000610d9d6139ba565b886000815181101515610dac57fe5b906020019060200201516101600151945088519350600092505b828414610e4f57848984815181101515610ddc57fe5b906020019060200201516101600181905250610dfc888760200151612aa1565b9150610e288984815181101515610e0f57fe5b906020019060200201518389868151811015156106da57fe5b9050610e34868261225b565b60208601518811610e4457610e4f565b600190920191610dc6565b50505050509392505050565b60606000606060008451925082604051908082528060200260200182016040528015610ea157816020015b610e8e613a12565b815260200190600190039081610e865790505b509150600090505b808314610ef057610ed08582815181101515610ec157fe5b90602001906020020151611dc0565b8282815181101515610ede57fe5b60209081029091010152600101610ea9565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008951111515610f7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c8b565b610f8689612ae3565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bcb565b8660ff166009811115610ff757fe5b9550600086600981111561100757fe5b141561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c7b565b600186600981111561104d57fe5b14156110955788511561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d3b565b6000975061174c565b60028660098111156110a357fe5b14156111de5788516041146110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b8860008151811015156110f357fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061113389600163ffffffff612ba716565b935061114689602163ffffffff612ba716565b925060018b8686866040516000815260200160405260405161116b9493929190614b0c565b60206040516020810390808403906000865af115801561118f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c8116908216149950925061174c9050565b60038660098111156111ec57fe5b141561139257885160411461122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b88600081518110151561123c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061127c89600163ffffffff612ba716565b935061128f89602163ffffffff612ba716565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061133057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112f3565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261116b9450925089918991508890614b0c565b60048660098111156113a057fe5b14156113ff578851156113df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d3b565b73ffffffffffffffffffffffffffffffffffffffff8a163314975061174c565b600586600981111561140d57fe5b14156114c0576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611467908e908d90600401614aec565b602060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114b99190810190613f2e565b975061174c565b60068660098111156114ce57fe5b141561157b576114dd89612bf2565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff161515611525576000975061174c565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611467908e908e908e90600401614abf565b600786600981111561158957fe5b14156115c95760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff16975061174c565b60088660098111156115d757fe5b141561171a578851604114611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b88600081518110151561162757fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061166789600163ffffffff612ba716565b935061167a89602163ffffffff612ba716565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061133057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112f3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bcb565b505050505050509392505050565b6117626139ba565b60606000806000806117726139ba565b89600081518110151561178157fe5b906020019060200201516101400151955089519450600093505b83851461186057858a858151811015156117b157fe5b60209081029091010151610140015286516117cd908a90612aa1565b92506118108a858151811015156117e057fe5b9060200190602002015160a001518b868151811015156117fc57fe5b906020019060200201516080015185612c6b565b915061183c8a8581518110151561182357fe5b90602001906020020151838a87815181101515610bd857fe5b9050611848878261225b565b8651891161185557611860565b60019093019261179b565b5050505050509392505050565b6118756139ba565b61187d613a12565b600080600061188b88611dc0565b93506118956122bd565b92506118a98860a001518560400151612aa1565b91506118b58783612c88565b90506118c58885858a858b612426565b6118cf8882612c9e565b94506118e688848660200151876040015189612643565b6118f1888487612cfe565b505050509392505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff161561194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ccb565b61199261198d888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612e13945050505050565b61305b565b60008181526008602052604090205490915060ff16156119de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c0b565b73ffffffffffffffffffffffffffffffffffffffff86163314611aaf57611a36818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610f34945050505050565b1515611a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d2b565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c3b565b73ffffffffffffffffffffffffffffffffffffffff86163314611b8c57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cdb565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c8c919081019061406a565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bab565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611db29084908790614b41565b60405180910390a150505050565b611dc8613a12565b611dd18261309b565b6020808301829052600091825260039052604090819020549082015260808201511515611e055760015b60ff168152610c47565b60a08201511515611e17576002611dfb565b60a0820151604082015110611e2d576005611dfb565b6101008201514210611e40576004611dfb565b60208082015160009081526004909152604090205460ff1615611e64576006611dfb565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115611eb1576006611dfb565b60038152919050565b611ec2613a12565b611ecb82611dc0565b9050611ed782826130a9565b611ee58282602001516131bb565b5050565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611faa5780601f10611f7f57610100808354040283529160200191611faa565b820191906000526020600020905b815481529060010190602001808311611f8d57829003601f168201915b505050505081565b611fba6139ba565b60606000806000611fc96139ba565b886000815181101515611fd857fe5b906020019060200201516101600151945088519350600092505b828414610e4f5784898481518110151561200857fe5b906020019060200201516101600181905250612028888760200151612aa1565b9150612054898481518110151561203b57fe5b90602001906020020151838986815181101515610bd857fe5b9050612060868261225b565b6020860151881161207057610e4f565b600190920191611ff2565b60015481565b6120896139ba565b60606000806000806120996139ba565b8960008151811015156120a857fe5b906020019060200201516101400151955089519450600093505b83851461186057858a858151811015156120d857fe5b60209081029091010151610140015286516120f4908a90612aa1565b92506121078a858151811015156117e057fe5b91506121338a8581518110151561211a57fe5b90602001906020020151838a878151811015156106da57fe5b905061213f878261225b565b8651891161214c57611860565b6001909301926120c2565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cdb565b73ffffffffffffffffffffffffffffffffffffffff81161561222157600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b815181516122699190613262565b82526020808301519082015161227f9190613262565b6020830152604080830151908201516122989190613262565b6040830152606080830151908201516122b19190613262565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156122fe5760095473ffffffffffffffffffffffffffffffffffffffff16612300565b335b92915050565b6123188260a001518260a001516132ac565b61232a836080015183608001516132ac565b1015611ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d1b565b61236a6139e3565b60008060008061237e8960a0015188612aa1565b935061238e8860a0015187612aa1565b925061239e8389608001516132ac565b6123ac858a60a001516132ac565b116123ce578391506123c78860a00151896080015184612c6b565b90506123e7565b8290506123e488608001518960a0015183612c6b565b91505b6123f18983612c9e565b85526123fd8882612c9e565b60208087018290528651519101516124159190612aa1565b604086015250505050949350505050565b845160ff16600314612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cfb565b82151561249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c4b565b606086015173ffffffffffffffffffffffffffffffffffffffff161561251057606086015173ffffffffffffffffffffffffffffffffffffffff163314612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d0b565b602086015173ffffffffffffffffffffffffffffffffffffffff161561259b578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff1614151561259b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b8b565b604085015115156125f1576125b98560200151876000015183610f34565b15156125f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bdb565b612604828760a001518860800151613307565b1561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c2b565b505050505050565b612651828260200151613262565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966126e0968f963396929591949093906149d1565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156127995780601f1061276e57610100808354040283529160200191612799565b820191906000526020600020905b81548152906001019060200180831161277c57829003601f168201915b505050505090506127c185610140015186600001518660000151856020015160200151613358565b610140840151845186518451602001516127dd93929190613358565b6127f68561014001518660000151858560400151613358565b6128128186600001518760400151856000015160400151613358565b61282e8185600001518660400151856020015160400151613358565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612898576128938184876040015161288e866000015160600151876020015160600151613262565b613358565b6128c8565b6128b081848760400151856000015160600151613358565b6128c881848660400151856020015160600151613358565b5050505050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156129d65783518552602094850194909301926001016129b8565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b81811015612a1f578351855260209485019490930192600101612a01565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015612a67578351855260209485019490930192600101612a49565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b600082821115612add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b9b565b50900390565b6000808251111515612b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c6b565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612b5157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bbb565b50016020015190565b60006014825110151515612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ceb565b612c408260148451036134e9565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612c80612c7a85846132ac565b8461354a565b949350505050565b6000818310612c975781610cb4565b5090919050565b612ca66139ba565b6020810182905260a08301516080840151612cc2918491612c6b565b815260a083015160c0840151612cd9918491612c6b565b604082015260a083015160e0840151612cf3918491612c6b565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612da85780601f10612d7d57610100808354040283529160200191612da8565b820191906000526020600020905b815481529060010190602001808311612d8b57829003601f168201915b50505050509050612dc88461014001518560000151858560000151613358565b612de18461016001518486600001518560200151613358565b612df981856000015186604001518560400151613358565b612e0d818486604001518560600151613358565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b60208310612f3c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612eff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b60208310612fd257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f95565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208883529082018c905273ffffffffffffffffffffffffffffffffffffffff8b1693820193909352606081018390526080902096509093505050505b50509392505050565b6001546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b600061230061198d83613561565b805160009060ff166003146130ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cfb565b606083015173ffffffffffffffffffffffffffffffffffffffff161561315d57606083015173ffffffffffffffffffffffffffffffffffffffff16331461315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d0b565b6131656122bd565b835190915073ffffffffffffffffffffffffffffffffffffffff8083169116146109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614beb565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf79261325692339290614a55565b60405180910390a45050565b6000828201838110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bfb565b8091505b5092915050565b6000808315156132bf57600091506132a5565b508282028284828115156132cf57fe5b04146132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bfb565b60008060008480151561331657fe5b868509915081151561332b5760009250613052565b61334a61333b83620f42406132ac565b61334588876132ac565b61354a565b6103e8109695505050505050565b600080600083111561263b57855160031061339f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cab565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff16801515613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c5b565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b818110156134c457895181526020998a0199016134ac565b61020084858403866000895af18015156134dc573d85fd5b5050505050505050505050565b60008160140183511015151561352b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ceb565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600080828481151561355857fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b602083106137e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016137ac565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b6020831061388457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613847565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b6020831061391f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016138e2565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610120604051908101604052806139f86139ba565b8152602001613a056139ba565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610cb48235614e0e565b6000601f82018313613a4f57600080fd5b8135613a62613a5d82614d9d565b614d76565b81815260209384019390925082018360005b83811015613aa05781358601613a8a8882613bfc565b8452506020928301929190910190600101613a74565b5050505092915050565b6000601f82018313613abb57600080fd5b8135613ac9613a5d82614d9d565b81815260209384019390925082018360005b83811015613aa05781358601613af18882613c4b565b8452506020928301929190910190600101613adb565b6000601f82018313613b1857600080fd5b8135613b26613a5d82614d9d565b91508181835260208401935060208101905083856020840282011115613b4b57600080fd5b60005b83811015613aa05781613b618882613b8f565b8452506020928301929190910190600101613b4e565b6000610cb48235614e27565b6000610cb48251614e27565b6000610cb48235614e2c565b6000610cb48235614e2f565b6000610cb48251614e2f565b600080601f83018413613bc557600080fd5b50813567ffffffffffffffff811115613bdd57600080fd5b602083019150836001820283011115613bf557600080fd5b9250929050565b6000601f82018313613c0d57600080fd5b8135613c1b613a5d82614dbe565b91508082526020830160208301858383011115613c3757600080fd5b613c42838284614e65565b50505092915050565b60006101808284031215613c5e57600080fd5b613c69610180614d76565b90506000613c778484613a32565b8252506020613c8884848301613a32565b6020830152506040613c9c84828501613a32565b6040830152506060613cb084828501613a32565b6060830152506080613cc484828501613b8f565b60808301525060a0613cd884828501613b8f565b60a08301525060c0613cec84828501613b8f565b60c08301525060e0613d0084828501613b8f565b60e083015250610100613d1584828501613b8f565b61010083015250610120613d2b84828501613b8f565b6101208301525061014082013567ffffffffffffffff811115613d4d57600080fd5b613d5984828501613bfc565b6101408301525061016082013567ffffffffffffffff811115613d7b57600080fd5b613d8784828501613bfc565b6101608301525092915050565b600060208284031215613da657600080fd5b6000612c808484613a32565b60008060408385031215613dc557600080fd5b6000613dd18585613a32565b9250506020613de285828601613a32565b9150509250929050565b60008060408385031215613dff57600080fd5b6000613e0b8585613a32565b9250506020613de285828601613b77565b600060208284031215613e2e57600080fd5b813567ffffffffffffffff811115613e4557600080fd5b612c8084828501613aaa565b600080600060608486031215613e6657600080fd5b833567ffffffffffffffff811115613e7d57600080fd5b613e8986828701613aaa565b935050602084013567ffffffffffffffff811115613ea657600080fd5b613eb286828701613b07565b925050604084013567ffffffffffffffff811115613ecf57600080fd5b613edb86828701613a3e565b9150509250925092565b600080600060608486031215613efa57600080fd5b833567ffffffffffffffff811115613f1157600080fd5b613f1d86828701613aaa565b9350506020613eb286828701613b8f565b600060208284031215613f4057600080fd5b6000612c808484613b83565b600060208284031215613f5e57600080fd5b6000612c808484613b8f565b60008060408385031215613f7d57600080fd5b6000613dd18585613b8f565b60008060008060608587031215613f9f57600080fd5b6000613fab8787613b8f565b9450506020613fbc87828801613a32565b935050604085013567ffffffffffffffff811115613fd957600080fd5b613fe587828801613bb3565b95989497509550505050565b60008060006060848603121561400657600080fd5b60006140128686613b8f565b935050602061402386828701613a32565b925050604084013567ffffffffffffffff81111561404057600080fd5b613edb86828701613bfc565b60006020828403121561405e57600080fd5b6000612c808484613b9b565b60006020828403121561407c57600080fd5b6000612c808484613ba7565b60006020828403121561409a57600080fd5b813567ffffffffffffffff8111156140b157600080fd5b612c8084828501613c4b565b600080600080608085870312156140d357600080fd5b843567ffffffffffffffff8111156140ea57600080fd5b6140f687828801613c4b565b945050602085013567ffffffffffffffff81111561411357600080fd5b61411f87828801613c4b565b935050604085013567ffffffffffffffff81111561413c57600080fd5b61414887828801613bfc565b925050606085013567ffffffffffffffff81111561416557600080fd5b61417187828801613bfc565b91505092959194509250565b60008060006060848603121561419257600080fd5b833567ffffffffffffffff8111156141a957600080fd5b6141b586828701613c4b565b935050602061402386828701613b8f565b600080600080600080608087890312156141df57600080fd5b60006141eb8989613b8f565b96505060206141fc89828a01613a32565b955050604087013567ffffffffffffffff81111561421957600080fd5b61422589828a01613bb3565b9450945050606087013567ffffffffffffffff81111561424457600080fd5b61425089828a01613bb3565b92509250509295509295509295565b61426881614e0e565b82525050565b600061427982614e0a565b80845260208401935061428b83614e04565b60005b828110156142bb576142a1868351614983565b6142aa82614e04565b60609690960195915060010161428e565b5093949350505050565b61426881614e27565b61426881614e2c565b61426881614e2f565b60006142eb82614e0a565b8084526142ff816020860160208601614e71565b61430881614e9d565b9093016020019392505050565b61426881614e5a565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b8051608083019061491184826142ce565b50602082015161492460208501826142ce565b50604082015161493760408501826142ce565b506060820151612e0d60608501826142ce565b805161012083019061495c8482614900565b50602082015161496f6080850182614900565b506040820151612e0d6101008501826142ce565b8051606083019061499484826149ba565b5060208201516149a760208501826142ce565b506040820151612e0d60408501826142ce565b61426881614e54565b60208101612300828461425f565b61010081016149e0828b61425f565b6149ed602083018a61425f565b6149fa60408301896142ce565b614a0760608301886142ce565b614a1460808301876142ce565b614a2160a08301866142ce565b81810360c0830152614a3381856142e0565b905081810360e0830152614a4781846142e0565b9a9950505050505050505050565b60608101614a63828661425f565b8181036020830152614a7581856142e0565b90508181036040830152614a8981846142e0565b95945050505050565b60208082528101610cb4818461426e565b6020810161230082846142c5565b6020810161230082846142ce565b60608101614acd82866142ce565b614ada602083018561425f565b8181036040830152614a8981846142e0565b60408101614afa82856142ce565b8181036020830152612c8081846142e0565b60808101614b1a82876142ce565b614b2760208301866149ba565b614b3460408301856142ce565b614a8960608301846142ce565b60408101614b4f82856142d7565b610cb4602083018461425f565b60208082528101610cb481846142e0565b602081016123008284614315565b602080825281016123008161431e565b602080825281016123008161434e565b602080825281016123008161437e565b60208082528101612300816143ae565b60208082528101612300816143de565b6020808252810161230081614434565b6020808252810161230081614464565b6020808252810161230081614494565b60208082528101612300816144c4565b60208082528101612300816144f4565b6020808252810161230081614524565b6020808252810161230081614554565b6020808252810161230081614584565b60208082528101612300816145b4565b60208082528101612300816145e4565b6020808252810161230081614614565b602080825281016123008161466a565b602080825281016123008161469a565b60208082528101612300816146ca565b60208082528101612300816146fa565b602080825281016123008161472a565b602080825281016123008161475a565b602080825281016123008161478a565b60208082528101612300816147ba565b6020808252810161230081614810565b6020808252810161230081614840565b6020808252810161230081614870565b60208082528101612300816148a0565b60208082528101612300816148d0565b608081016123008284614900565b6101208101612300828461494a565b606081016123008284614983565b60405181810167ffffffffffffffff81118282101715614d9557600080fd5b604052919050565b600067ffffffffffffffff821115614db457600080fd5b5060209081020190565b600067ffffffffffffffff821115614dd557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b600061230082614e0e565b82818337506000910152565b60005b83811015614e8c578181015183820152602001614e74565b83811115612e0d5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820260b80113dffd6eb1bf3a32c4186fd411d22a15ec82aa874c05369cfebcd0d3f6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x5414 CODESIZE SUB DUP1 PUSH3 0x5414 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x443 JUMP JUMPDEST DUP1 MLOAD DUP2 SWAP1 PUSH3 0x4E SWAP1 PUSH1 0x0 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x342 JUMP JUMPDEST POP POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x158 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x137 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x1E2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x1C1 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x26C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x24B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP3 ADD SWAP9 SWAP1 SWAP9 MSTORE DUP2 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE POP ADDRESS PUSH1 0x80 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP8 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP6 ADD SWAP1 DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 SWAP4 DUP5 SWAP4 POP DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH3 0x2F7 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH3 0x2D6 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x1 SSTORE POP POP PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE POP PUSH3 0x505 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x385 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3B5 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3B5 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3B5 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x398 JUMP JUMPDEST POP PUSH3 0x3C3 SWAP3 SWAP2 POP PUSH3 0x3C7 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x3E4 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3C3 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3CE JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x410 PUSH3 0x40A DUP3 PUSH3 0x4AA JUMP JUMPDEST PUSH3 0x483 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x43A DUP4 DUP3 DUP5 PUSH3 0x4D2 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x456 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x47B DUP5 DUP3 DUP6 ADD PUSH3 0x3E7 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x4A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x4C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x4EF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x4D5 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x4FF JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x4EFF DUP1 PUSH3 0x515 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1B6 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x26D JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x347 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3D4 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x461 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x481 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4B6 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x563 JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5C5 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x5FA JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x62F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x64F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x664 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D4B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x70A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4AA3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F89 JUMP JUMPDEST PUSH2 0x71F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x279 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x288 CALLDATASIZE PUSH1 0x4 PUSH2 0x40BD JUMP JUMPDEST PUSH2 0x7F8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D59 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x2B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x2D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x404C JUMP JUMPDEST PUSH2 0x965 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4B6D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x302 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E1C JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x9C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0xA50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x362 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x404C JUMP JUMPDEST PUSH2 0xBFE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x49C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x3AF CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0xC61 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x3DEC JUMP JUMPDEST PUSH2 0xCBB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x3DB2 JUMP JUMPDEST PUSH2 0xD66 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x42F CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0xD86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x454 PUSH2 0x44F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E1C JUMP JUMPDEST PUSH2 0xE5B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4A92 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x47C CALLDATASIZE PUSH1 0x4 PUSH2 0x3F6A JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0xF18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x4B1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FF1 JUMP JUMPDEST PUSH2 0xF34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x4D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x175A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0x186D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x41C6 JUMP JUMPDEST PUSH2 0x18FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x531 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D94 JUMP JUMPDEST PUSH2 0x1B95 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x542 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x556 PUSH2 0x551 CALLDATASIZE PUSH1 0x4 PUSH2 0x4088 JUMP JUMPDEST PUSH2 0x1DC0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x57E CALLDATASIZE PUSH1 0x4 PUSH2 0x4088 JUMP JUMPDEST PUSH2 0x1EBA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x59E CALLDATASIZE PUSH1 0x4 PUSH2 0x3DB2 JUMP JUMPDEST PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B8 PUSH2 0x1F06 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4B5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x5E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x1FB2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x207B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x606 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x615 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x2081 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0x2157 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x64A CALLDATASIZE PUSH1 0x4 PUSH2 0x3D94 JUMP JUMPDEST PUSH2 0x2173 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B8 PUSH2 0x2224 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x67E PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x689 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0x6E9 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x186D JUMP JUMPDEST SWAP1 POP PUSH2 0x6F5 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x692 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x75A DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0xF34 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x79B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C1B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x800 PUSH2 0x39E3 JUMP JUMPDEST PUSH2 0x808 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x810 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x833 DUP9 PUSH2 0x1DC0 JUMP JUMPDEST SWAP3 POP PUSH2 0x83E DUP8 PUSH2 0x1DC0 JUMP JUMPDEST SWAP2 POP PUSH2 0x848 PUSH2 0x22BD JUMP JUMPDEST SWAP1 POP PUSH2 0x854 DUP9 DUP9 PUSH2 0x2306 JUMP JUMPDEST PUSH2 0x868 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2362 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x882 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2426 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x89B SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x8B4 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x8CD DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x8D9 DUP9 DUP9 DUP4 DUP8 PUSH2 0x26EF JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x8EC PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8F9 DUP6 DUP6 DUP6 PUSH2 0x28CF JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP2 DUP3 MLOAD PUSH1 0x20 DUP5 ADD ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0x91B JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x939 JUMPI PUSH2 0x700 JUMP JUMPDEST PUSH1 0x0 DUP5 MSTORE PUSH1 0x0 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x700 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP1 DUP3 EQ PUSH2 0x9C1 JUMPI PUSH2 0x9B9 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x992 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x9CE PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D9 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0xA39 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9FA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA12 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA2A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xC61 JUMP JUMPDEST SWAP1 POP PUSH2 0xA45 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9E2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xA5E PUSH2 0x22BD JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xA83 JUMPI CALLER PUSH2 0xA86 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xAFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xB65 SWAP1 DUP7 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB7C PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xB87 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0xBE7 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBC0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x8E4 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF3 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xB90 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xC69 PUSH2 0x39BA JUMP JUMPDEST PUSH2 0xC74 DUP5 DUP5 DUP5 PUSH2 0x186D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xCB4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CBB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCC5 PUSH2 0x22BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xD59 SWAP1 DUP7 SWAP1 PUSH2 0x4AA3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xD8E PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD9D PUSH2 0x39BA JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDAC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xE4F JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDDC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xDFC DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0xE28 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE0F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xE34 DUP7 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0xE44 JUMPI PUSH2 0xE4F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xDC6 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xEA1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE8E PUSH2 0x3A12 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE86 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0xEF0 JUMPI PUSH2 0xED0 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEC1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DC0 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEDE JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xEA9 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0xF7D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C8B JUMP JUMPDEST PUSH2 0xF86 DUP10 PUSH2 0x2AE3 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0xFE8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BCB JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xFF7 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1007 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x103F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C7B JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x104D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1095 JUMPI DUP9 MLOAD ISZERO PUSH2 0x108C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D3B JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x10A3 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11DE JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x10E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10F3 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1133 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1146 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x116B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B0C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x118F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x174C SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11EC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1392 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x122D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x123C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x127C DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x128F DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1330 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12F3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x116B SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4B0C JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x13A0 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x13FF JUMPI DUP9 MLOAD ISZERO PUSH2 0x13DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D3B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x140D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14C0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1467 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AEC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1481 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1495 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x14B9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3F2E JUMP JUMPDEST SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x14CE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x157B JUMPI PUSH2 0x14DD DUP10 PUSH2 0x2BF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1525 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1467 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4ABF JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1589 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x15C9 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15D7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x171A JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1618 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1627 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1667 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x167A DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x1330 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12F3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BCB JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1762 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1772 PUSH2 0x39BA JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1781 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x1860 JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17B1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x17CD SWAP1 DUP11 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x1810 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17E0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17FC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2C6B JUMP JUMPDEST SWAP2 POP PUSH2 0x183C DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1823 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1848 DUP8 DUP3 PUSH2 0x225B JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x1855 JUMPI PUSH2 0x1860 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x179B JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1875 PUSH2 0x39BA JUMP JUMPDEST PUSH2 0x187D PUSH2 0x3A12 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x188B DUP9 PUSH2 0x1DC0 JUMP JUMPDEST SWAP4 POP PUSH2 0x1895 PUSH2 0x22BD JUMP JUMPDEST SWAP3 POP PUSH2 0x18A9 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0x18B5 DUP8 DUP4 PUSH2 0x2C88 JUMP JUMPDEST SWAP1 POP PUSH2 0x18C5 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x18CF DUP9 DUP3 PUSH2 0x2C9E JUMP JUMPDEST SWAP5 POP PUSH2 0x18E6 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x18F1 DUP9 DUP5 DUP8 PUSH2 0x2CFE JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x194F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH2 0x1992 PUSH2 0x198D DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2E13 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x305B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x19DE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C0B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1AAF JUMPI PUSH2 0x1A36 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0xF34 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D2B JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1B46 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C3B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1B8C JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1BED JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CDB JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C68 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1C8C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x406A JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D11 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BAB JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1DB2 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4B41 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1DC8 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x1DD1 DUP3 PUSH2 0x309B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1E05 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xC47 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1E17 JUMPI PUSH1 0x2 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x1E2D JUMPI PUSH1 0x5 PUSH2 0x1DFB JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1E40 JUMPI PUSH1 0x4 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1E64 JUMPI PUSH1 0x6 PUSH2 0x1DFB JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x1EB1 JUMPI PUSH1 0x6 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1EC2 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x1ECB DUP3 PUSH2 0x1DC0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1ED7 DUP3 DUP3 PUSH2 0x30A9 JUMP JUMPDEST PUSH2 0x1EE5 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x31BB JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1FAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1FAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x1FBA PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1FC9 PUSH2 0x39BA JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1FD8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xE4F JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2008 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2028 DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0x2054 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x203B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2060 DUP7 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0x2070 JUMPI PUSH2 0xE4F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1FF2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2089 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2099 PUSH2 0x39BA JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20A8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x1860 JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20D8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x20F4 SWAP1 DUP11 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x2107 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17E0 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2133 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x211A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x213F DUP8 DUP3 PUSH2 0x225B JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x214C JUMPI PUSH2 0x1860 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x20C2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x21C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2221 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2269 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x227F SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2298 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x22B1 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x22FE JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2300 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2318 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x232A DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST LT ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D1B JUMP JUMPDEST PUSH2 0x236A PUSH2 0x39E3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x237E DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2AA1 JUMP JUMPDEST SWAP4 POP PUSH2 0x238E DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x239E DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x23AC DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST GT PUSH2 0x23CE JUMPI DUP4 SWAP2 POP PUSH2 0x23C7 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2C6B JUMP JUMPDEST SWAP1 POP PUSH2 0x23E7 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x23E4 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2C6B JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x23F1 DUP10 DUP4 PUSH2 0x2C9E JUMP JUMPDEST DUP6 MSTORE PUSH2 0x23FD DUP9 DUP3 PUSH2 0x2C9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2415 SWAP2 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2464 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CFB JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x249D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C4B JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2510 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2510 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D0B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x259B JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x259B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B8B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x25F1 JUMPI PUSH2 0x25B9 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0xF34 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x25F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BDB JUMP JUMPDEST PUSH2 0x2604 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x3307 JUMP JUMPDEST ISZERO PUSH2 0x263B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C2B JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2651 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x26E0 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x49D1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2799 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x276E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2799 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x277C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x27C1 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x27DD SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x27F6 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2812 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x282E DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2898 JUMPI PUSH2 0x2893 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x288E DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3262 JUMP JUMPDEST PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x28C8 JUMP JUMPDEST PUSH2 0x28B0 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x28C8 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x29D6 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x29B8 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A1F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2A01 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A67 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2A49 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2ADD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B9B JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2B21 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C6B JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2B51 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2BE9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BBB JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CEB JUMP JUMPDEST PUSH2 0x2C40 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x34E9 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C80 PUSH2 0x2C7A DUP6 DUP5 PUSH2 0x32AC JUMP JUMPDEST DUP5 PUSH2 0x354A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2C97 JUMPI DUP2 PUSH2 0xCB4 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CA6 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2CC2 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2CD9 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2CF3 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2DA8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2D7D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2DA8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2D8B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2DC8 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2DE1 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2DF9 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2E0D DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2EFF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FD2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F95 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP9 DUP4 MSTORE SWAP1 DUP3 ADD DUP13 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP7 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2300 PUSH2 0x198D DUP4 PUSH2 0x3561 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x30EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CFB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x315D JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x315D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D0B JUMP JUMPDEST PUSH2 0x3165 PUSH2 0x22BD JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x9C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BEB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x3256 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4A55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x32A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BFB JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x32BF JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x32A5 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x32CF JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x32A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BFB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x3316 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x332B JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x3052 JUMP JUMPDEST PUSH2 0x334A PUSH2 0x333B DUP4 PUSH3 0xF4240 PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x3345 DUP9 DUP8 PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x354A JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x263B JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x339F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CAB JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x3428 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C5B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x34C4 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x34AC JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x34DC JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x352B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CEB JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x3558 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x37E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x37AC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3884 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3847 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x391F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x38E2 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x39F8 PUSH2 0x39BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3A05 PUSH2 0x39BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3A62 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST PUSH2 0x4D76 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3A8A DUP9 DUP3 PUSH2 0x3BFC JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3A74 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3ABB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3AC9 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3AF1 DUP9 DUP3 PUSH2 0x3C4B JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3ADB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3B18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B26 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3B4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 PUSH2 0x3B61 DUP9 DUP3 PUSH2 0x3B8F JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3B4E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 MLOAD PUSH2 0x4E27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E2C JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 MLOAD PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3BC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3BF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C1B PUSH2 0x3A5D DUP3 PUSH2 0x4DBE JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3C37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C42 DUP4 DUP3 DUP5 PUSH2 0x4E65 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C69 PUSH2 0x180 PUSH2 0x4D76 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3C77 DUP5 DUP5 PUSH2 0x3A32 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3C88 DUP5 DUP5 DUP4 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3C9C DUP5 DUP3 DUP6 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3CB0 DUP5 DUP3 DUP6 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3CC4 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3CD8 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3CEC DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3D00 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3D15 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3D2B DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D59 DUP5 DUP3 DUP6 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D87 DUP5 DUP3 DUP6 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3DA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3DC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3DD1 DUP6 DUP6 PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3DE2 DUP6 DUP3 DUP7 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3DFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E0B DUP6 DUP6 PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3DE2 DUP6 DUP3 DUP7 ADD PUSH2 0x3B77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3E2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C80 DUP5 DUP3 DUP6 ADD PUSH2 0x3AAA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3E66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E89 DUP7 DUP3 DUP8 ADD PUSH2 0x3AAA JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB2 DUP7 DUP3 DUP8 ADD PUSH2 0x3B07 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3ECF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EDB DUP7 DUP3 DUP8 ADD PUSH2 0x3A3E JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3EFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3F11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F1D DUP7 DUP3 DUP8 ADD PUSH2 0x3AAA JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3EB2 DUP7 DUP3 DUP8 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3DD1 DUP6 DUP6 PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3FAB DUP8 DUP8 PUSH2 0x3B8F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3FBC DUP8 DUP3 DUP9 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FE5 DUP8 DUP3 DUP9 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4006 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4012 DUP7 DUP7 PUSH2 0x3B8F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4023 DUP7 DUP3 DUP8 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4040 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EDB DUP7 DUP3 DUP8 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x405E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B9B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x407C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x409A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C80 DUP5 DUP3 DUP6 ADD PUSH2 0x3C4B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x40D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40F6 DUP8 DUP3 DUP9 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x411F DUP8 DUP3 DUP9 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x413C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4148 DUP8 DUP3 DUP9 ADD PUSH2 0x3BFC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4165 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4171 DUP8 DUP3 DUP9 ADD PUSH2 0x3BFC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41B5 DUP7 DUP3 DUP8 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4023 DUP7 DUP3 DUP8 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x41DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x41EB DUP10 DUP10 PUSH2 0x3B8F JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x41FC DUP10 DUP3 DUP11 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4225 DUP10 DUP3 DUP11 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4250 DUP10 DUP3 DUP11 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E0E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4279 DUP3 PUSH2 0x4E0A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x428B DUP4 PUSH2 0x4E04 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x42BB JUMPI PUSH2 0x42A1 DUP7 DUP4 MLOAD PUSH2 0x4983 JUMP JUMPDEST PUSH2 0x42AA DUP3 PUSH2 0x4E04 JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x428E JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E27 JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E2C JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x42EB DUP3 PUSH2 0x4E0A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x42FF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4E71 JUMP JUMPDEST PUSH2 0x4308 DUP2 PUSH2 0x4E9D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E5A JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4911 DUP5 DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4924 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4937 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x495C DUP5 DUP3 PUSH2 0x4900 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x496F PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4900 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4994 DUP5 DUP3 PUSH2 0x49BA JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x49A7 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E54 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x49E0 DUP3 DUP12 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x49ED PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x49FA PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A07 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A14 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A21 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x42CE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4A33 DUP2 DUP6 PUSH2 0x42E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4A47 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4A63 DUP3 DUP7 PUSH2 0x425F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4A75 DUP2 DUP6 PUSH2 0x42E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4A89 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB4 DUP2 DUP5 PUSH2 0x426E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x42C5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x42CE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4ACD DUP3 DUP7 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4ADA PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x425F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4A89 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4AFA DUP3 DUP6 PUSH2 0x42CE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2C80 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4B1A DUP3 DUP8 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4B27 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x49BA JUMP JUMPDEST PUSH2 0x4B34 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A89 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x42CE JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4B4F DUP3 DUP6 PUSH2 0x42D7 JUMP JUMPDEST PUSH2 0xCB4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x425F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB4 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4315 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x431E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x434E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x437E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x43AE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x43DE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4434 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4464 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4494 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x44C4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x44F4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4554 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4584 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x45B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x45E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4614 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x466A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x469A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x46CA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x46FA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x472A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x475A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x478A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x47BA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4810 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4840 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4870 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x48A0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x48D0 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4900 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x494A JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4983 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4DB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4DD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2300 DUP3 PUSH2 0x4E0E JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4E8C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4E74 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2E0D JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x26 SIGNEXTEND DUP1 GT RETURNDATASIZE SELFDESTRUCT 0xd6 0xeb SHL RETURN LOG3 0x2c COINBASE DUP7 REVERT COINBASE SAR 0x22 LOG1 0x5e 0xc8 0x2a 0xa8 PUSH21 0xC05369CFEBCD0D3F6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ",
+ "sourceMap": "931:616:2:-;;;1229:316;8:9:-1;5:2;;;30:1;27;20:12;5:2;1229:316:2;;;;;;;;;;;;;;;;;;;;;;;;1919:29:17;;1306:13:2;;1919:29:17;;:14;;:29;;;;;:::i;:::-;-1:-1:-1;;1044:148:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1044:148:18;;;;;;;;1034:159;;1044:148;;;;;1034:159;;;;1044:148;1034:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1034:159:18;;;;;;;;;;;;1510:18;;;;;;;;;;;;;;;;1494:36;;1034:159;;-1:-1:-1;1034:159:18;;-1:-1:-1;1494:36:18;;;;-1:-1:-1;1510:18:18;1494:36;1510:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1494:36:18;;;;;;;;;;;;1560:21;;;;;274:1:-1;1560:21:18;;;;;;;;;;1544:39;;1494:36;;-1:-1:-1;1494:36:18;;-1:-1:-1;1544:39:18;;;;-1:-1:-1;274:1;1544:39:18;1560:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1544:39:18;;;;;;;;;;;;1415:214;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1613:4:18;1415:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1415:214:18;;;;;;;;1405:225;;1415:214;;;;-1:-1:-1;1405:225:18;;;-1:-1:-1;1405:225:18;1415:214;1405:225;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1405:225:18;;;;;;;;;;274:1:-1;1384:246:18;-1:-1:-1;;329:5:30;:18;;-1:-1:-1;;;;;;329:18:30;337:10;329:18;;;-1:-1:-1;931:616:2;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;931:616:2;;;-1:-1:-1;931:616:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;6:442:-1:-;;111:4;99:17;;95:27;-1:-1;85:2;;136:1;133;126:12;85:2;166:6;160:13;188:64;203:48;244:6;203:48;;;188:64;;;179:73;;272:6;265:5;258:21;308:4;300:6;296:17;341:4;334:5;330:16;376:3;367:6;362:3;358:16;355:25;352:2;;;393:1;390;383:12;352:2;403:39;435:6;430:3;425;403:39;;;78:370;;;;;;;;456:360;;580:2;568:9;559:7;555:23;551:32;548:2;;;596:1;593;586:12;548:2;631:24;;-1:-1;;;;;664:30;;661:2;;;707:1;704;697:12;661:2;727:73;792:7;783:6;772:9;768:22;727:73;;;717:83;542:274;-1:-1;;;;542:274;823:256;885:2;879:9;911:17;;;-1:-1;;;;;971:34;;1007:22;;;968:62;965:2;;;1043:1;1040;1033:12;965:2;1059;1052:22;863:216;;-1:-1;863:216;1086:258;;-1:-1;;;;;1221:6;1218:30;1215:2;;;1261:1;1258;1251:12;1215:2;-1:-1;1334:4;1305;1282:17;;;;-1:-1;;1278:33;1324:15;;1152:192;1352:268;1417:1;1424:101;1438:6;1435:1;1432:13;1424:101;;;1505:11;;;1499:18;1486:11;;;1479:39;1460:2;1453:10;1424:101;;;1540:6;1537:1;1534:13;1531:2;;;1605:1;1596:6;1591:3;1587:16;1580:27;1531:2;1401:219;;;;;;931:616:2;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106101b65763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663288cdc9181146101bb578063297bb70b146101f15780632ac126221461021e5780633683ef8e1461024b5780633c28d8611461026d5780633e228bae1461029a5780633fd3c997146102ba5780634ac14782146102e75780634d0ae546146103075780634f9559b11461032757806350dde190146103475780636070410814610367578063642f2eaf1461039457806364a3bc15146103b457806377fcce68146103d45780637b8e3514146103f45780637e1d9808146104145780637e9d74dc1461043457806382c174d0146104615780638da5cb5b146104815780639363470214610496578063a3e20380146104b6578063b4be83d5146104d6578063bfc8bfce146104f6578063c585bb9314610516578063c75e0a8114610536578063d46b02c314610563578063d9bfa73e14610583578063db123b1a146105a3578063dd1c7d18146105c5578063e306f779146105e5578063e5fa431b146105fa578063eea086ba1461061a578063f2fde38b1461062f578063ffa1ad741461064f575b600080fd5b3480156101c757600080fd5b506101db6101d6366004613f4c565b610664565b6040516101e89190614ab1565b60405180910390f35b3480156101fd57600080fd5b5061021161020c366004613e51565b610676565b6040516101e89190614d4b565b34801561022a57600080fd5b5061023e610239366004613f4c565b61070a565b6040516101e89190614aa3565b34801561025757600080fd5b5061026b610266366004613f89565b61071f565b005b34801561027957600080fd5b5061028d6102883660046140bd565b6107f8565b6040516101e89190614d59565b3480156102a657600080fd5b506102116102b536600461417d565b6108e4565b3480156102c657600080fd5b506102da6102d536600461404c565b610965565b6040516101e89190614b6d565b3480156102f357600080fd5b5061026b610302366004613e1c565b61098d565b34801561031357600080fd5b50610211610322366004613e51565b6109c6565b34801561033357600080fd5b5061026b610342366004613f4c565b610a50565b34801561035357600080fd5b50610211610362366004613e51565b610b74565b34801561037357600080fd5b5061038761038236600461404c565b610bfe565b6040516101e891906149c3565b3480156103a057600080fd5b5061023e6103af366004613f4c565b610c4c565b3480156103c057600080fd5b506102116103cf36600461417d565b610c61565b3480156103e057600080fd5b5061026b6103ef366004613dec565b610cbb565b34801561040057600080fd5b5061023e61040f366004613db2565b610d66565b34801561042057600080fd5b5061021161042f366004613ee5565b610d86565b34801561044057600080fd5b5061045461044f366004613e1c565b610e5b565b6040516101e89190614a92565b34801561046d57600080fd5b5061023e61047c366004613f6a565b610ef8565b34801561048d57600080fd5b50610387610f18565b3480156104a257600080fd5b5061023e6104b1366004613ff1565b610f34565b3480156104c257600080fd5b506102116104d1366004613ee5565b61175a565b3480156104e257600080fd5b506102116104f136600461417d565b61186d565b34801561050257600080fd5b5061026b6105113660046141c6565b6118fc565b34801561052257600080fd5b5061026b610531366004613d94565b611b95565b34801561054257600080fd5b50610556610551366004614088565b611dc0565b6040516101e89190614d68565b34801561056f57600080fd5b5061026b61057e366004614088565b611eba565b34801561058f57600080fd5b506101db61059e366004613db2565b611ee9565b3480156105af57600080fd5b506105b8611f06565b6040516101e89190614b5c565b3480156105d157600080fd5b506102116105e0366004613ee5565b611fb2565b3480156105f157600080fd5b506101db61207b565b34801561060657600080fd5b50610211610615366004613ee5565b612081565b34801561062657600080fd5b50610387612157565b34801561063b57600080fd5b5061026b61064a366004613d94565b612173565b34801561065b57600080fd5b506105b8612224565b60036020526000908152604090205481565b61067e6139ba565b6000806106896139ba565b86519250600091505b818314610700576106e987838151811015156106aa57fe5b9060200190602002015187848151811015156106c257fe5b9060200190602002015187858151811015156106da57fe5b9060200190602002015161186d565b90506106f5848261225b565b600190910190610692565b5050509392505050565b60046020526000908152604090205460ff1681565b61075a848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750610f34945050505050565b151561079b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c1b565b60405180910390fd5b5050600091825260066020908152604080842073ffffffffffffffffffffffffffffffffffffffff9093168452919052902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6108006139e3565b610808613a12565b610810613a12565b610160808801516101408089019190915288015190870152600061083388611dc0565b925061083e87611dc0565b91506108486122bd565b90506108548888612306565b610868888885604001518560400151612362565b80516020015190945061088290899085908490808b612426565b602080850151015161089b90889084908490808a612426565b6108b48882856020015186604001518860000151612643565b6108cd8782846020015185604001518860200151612643565b6108d9888883876126ef565b505050949350505050565b6108ec6139ba565b60606108f98585856128cf565b9050608081825160208401305af480801561091b576001811461093957610700565b60008452600060208501526000604085015260006060850152610700565b825184526020830151602085015260408301516040850152606083015160608501525050509392505050565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b805160005b8082146109c1576109b983828151811015156109aa57fe5b90602001906020020151611eba565b600101610992565b505050565b6109ce6139ba565b6000806109d96139ba565b86519250600091505b81831461070057610a3987838151811015156109fa57fe5b906020019060200201518784815181101515610a1257fe5b906020019060200201518785815181101515610a2a57fe5b90602001906020020151610c61565b9050610a45848261225b565b6001909101906109e2565b600080600080610a5e6122bd565b935073ffffffffffffffffffffffffffffffffffffffff84163314610a835733610a86565b60005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152600560209081526040808320938516835292905220549093506001860192509050808211610afd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c9b565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526005602090815260408083209488168084529490915290819020859055517f82af639571738f4ebd4268fb0363d8957ebe1bbb9e78dba5ebd69eed39b154f090610b65908690614ab1565b60405180910390a35050505050565b610b7c6139ba565b600080610b876139ba565b86519250600091505b81831461070057610be78783815181101515610ba857fe5b906020019060200201518784815181101515610bc057fe5b906020019060200201518785815181101515610bd857fe5b906020019060200201516108e4565b9050610bf3848261225b565b600190910190610b90565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205473ffffffffffffffffffffffffffffffffffffffff165b919050565b60086020526000908152604090205460ff1681565b610c696139ba565b610c7484848461186d565b60208101519091508314610cb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cbb565b9392505050565b6000610cc56122bd565b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600760209081526040808320948916808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555192935090917fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89190610d59908690614aa3565b60405180910390a3505050565b600760209081526000928352604080842090915290825290205460ff1681565b610d8e6139ba565b60606000806000610d9d6139ba565b886000815181101515610dac57fe5b906020019060200201516101600151945088519350600092505b828414610e4f57848984815181101515610ddc57fe5b906020019060200201516101600181905250610dfc888760200151612aa1565b9150610e288984815181101515610e0f57fe5b906020019060200201518389868151811015156106da57fe5b9050610e34868261225b565b60208601518811610e4457610e4f565b600190920191610dc6565b50505050509392505050565b60606000606060008451925082604051908082528060200260200182016040528015610ea157816020015b610e8e613a12565b815260200190600190039081610e865790505b509150600090505b808314610ef057610ed08582815181101515610ec157fe5b90602001906020020151611dc0565b8282815181101515610ede57fe5b60209081029091010152600101610ea9565b509392505050565b600660209081526000928352604080842090915290825290205460ff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008060008060008951111515610f7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c8b565b610f8689612ae3565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff881610610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bcb565b8660ff166009811115610ff757fe5b9550600086600981111561100757fe5b141561103f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c7b565b600186600981111561104d57fe5b14156110955788511561108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d3b565b6000975061174c565b60028660098111156110a357fe5b14156111de5788516041146110e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b8860008151811015156110f357fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061113389600163ffffffff612ba716565b935061114689602163ffffffff612ba716565b925060018b8686866040516000815260200160405260405161116b9493929190614b0c565b60206040516020810390808403906000865af115801561118f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c8116908216149950925061174c9050565b60038660098111156111ec57fe5b141561139257885160411461122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b88600081518110151561123c57fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061127c89600163ffffffff612ba716565b935061128f89602163ffffffff612ba716565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061133057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112f3565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382206000835291019283905261116b9450925089918991508890614b0c565b60048660098111156113a057fe5b14156113ff578851156113df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d3b565b73ffffffffffffffffffffffffffffffffffffffff8a163314975061174c565b600586600981111561140d57fe5b14156114c0576040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b1690631626ba7e90611467908e908d90600401614aec565b602060405180830381600087803b15801561148157600080fd5b505af1158015611495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506114b99190810190613f2e565b975061174c565b60068660098111156114ce57fe5b141561157b576114dd89612bf2565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526007602090815260408083209385168352929052205490915060ff161515611525576000975061174c565b6040517f9363470200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690639363470290611467908e908e908e90600401614abf565b600786600981111561158957fe5b14156115c95760008b815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff16975061174c565b60088660098111156115d757fe5b141561171a578851604114611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b7b565b88600081518110151561162757fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061166789600163ffffffff612ba716565b935061167a89602163ffffffff612ba716565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083836020831061133057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112f3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bcb565b505050505050509392505050565b6117626139ba565b60606000806000806117726139ba565b89600081518110151561178157fe5b906020019060200201516101400151955089519450600093505b83851461186057858a858151811015156117b157fe5b60209081029091010151610140015286516117cd908a90612aa1565b92506118108a858151811015156117e057fe5b9060200190602002015160a001518b868151811015156117fc57fe5b906020019060200201516080015185612c6b565b915061183c8a8581518110151561182357fe5b90602001906020020151838a87815181101515610bd857fe5b9050611848878261225b565b8651891161185557611860565b60019093019261179b565b5050505050509392505050565b6118756139ba565b61187d613a12565b600080600061188b88611dc0565b93506118956122bd565b92506118a98860a001518560400151612aa1565b91506118b58783612c88565b90506118c58885858a858b612426565b6118cf8882612c9e565b94506118e688848660200151876040015189612643565b6118f1888487612cfe565b505050509392505050565b60095460009073ffffffffffffffffffffffffffffffffffffffff161561194f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ccb565b61199261198d888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843750612e13945050505050565b61305b565b60008181526008602052604090205490915060ff16156119de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c0b565b73ffffffffffffffffffffffffffffffffffffffff86163314611aaf57611a36818785858080601f01602080910402602001604051908101604052809392919081815260200183838082843750610f34945050505050565b1515611a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d2b565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600860205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af49150501515611b46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c3b565b73ffffffffffffffffffffffffffffffffffffffff86163314611b8c57600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b6002546000908190819073ffffffffffffffffffffffffffffffffffffffff163314611bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cdb565b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611c5457600080fd5b505af1158015611c68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c8c919081019061406a565b7fffffffff0000000000000000000000000000000000000000000000000000000081166000908152600a602052604090205490925073ffffffffffffffffffffffffffffffffffffffff1690508015611d11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bab565b7fffffffff0000000000000000000000000000000000000000000000000000000082166000908152600a60205260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c0319490611db29084908790614b41565b60405180910390a150505050565b611dc8613a12565b611dd18261309b565b6020808301829052600091825260039052604090819020549082015260808201511515611e055760015b60ff168152610c47565b60a08201511515611e17576002611dfb565b60a0820151604082015110611e2d576005611dfb565b6101008201514210611e40576004611dfb565b60208082015160009081526004909152604090205460ff1615611e64576006611dfb565b610120820151825173ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083206060880151909416835292905220541115611eb1576006611dfb565b60038152919050565b611ec2613a12565b611ecb82611dc0565b9050611ed782826130a9565b611ee58282602001516131bb565b5050565b600560209081526000928352604080842090915290825290205481565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529291830182828015611faa5780601f10611f7f57610100808354040283529160200191611faa565b820191906000526020600020905b815481529060010190602001808311611f8d57829003601f168201915b505050505081565b611fba6139ba565b60606000806000611fc96139ba565b886000815181101515611fd857fe5b906020019060200201516101600151945088519350600092505b828414610e4f5784898481518110151561200857fe5b906020019060200201516101600181905250612028888760200151612aa1565b9150612054898481518110151561203b57fe5b90602001906020020151838986815181101515610bd857fe5b9050612060868261225b565b6020860151881161207057610e4f565b600190920191611ff2565b60015481565b6120896139ba565b60606000806000806120996139ba565b8960008151811015156120a857fe5b906020019060200201516101400151955089519450600093505b83851461186057858a858151811015156120d857fe5b60209081029091010151610140015286516120f4908a90612aa1565b92506121078a858151811015156117e057fe5b91506121338a8581518110151561211a57fe5b90602001906020020151838a878151811015156106da57fe5b905061213f878261225b565b8651891161214c57611860565b6001909301926120c2565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60025473ffffffffffffffffffffffffffffffffffffffff1633146121c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cdb565b73ffffffffffffffffffffffffffffffffffffffff81161561222157600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60408051808201909152600b81527f322e302e312d616c706861000000000000000000000000000000000000000000602082015281565b815181516122699190613262565b82526020808301519082015161227f9190613262565b6020830152604080830151908201516122989190613262565b6040830152606080830151908201516122b19190613262565b60609092019190915250565b600954600090819073ffffffffffffffffffffffffffffffffffffffff16156122fe5760095473ffffffffffffffffffffffffffffffffffffffff16612300565b335b92915050565b6123188260a001518260a001516132ac565b61232a836080015183608001516132ac565b1015611ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d1b565b61236a6139e3565b60008060008061237e8960a0015188612aa1565b935061238e8860a0015187612aa1565b925061239e8389608001516132ac565b6123ac858a60a001516132ac565b116123ce578391506123c78860a00151896080015184612c6b565b90506123e7565b8290506123e488608001518960a0015183612c6b565b91505b6123f18983612c9e565b85526123fd8882612c9e565b60208087018290528651519101516124159190612aa1565b604086015250505050949350505050565b845160ff16600314612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cfb565b82151561249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c4b565b606086015173ffffffffffffffffffffffffffffffffffffffff161561251057606086015173ffffffffffffffffffffffffffffffffffffffff163314612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d0b565b602086015173ffffffffffffffffffffffffffffffffffffffff161561259b578373ffffffffffffffffffffffffffffffffffffffff16866020015173ffffffffffffffffffffffffffffffffffffffff1614151561259b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b8b565b604085015115156125f1576125b98560200151876000015183610f34565b15156125f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bdb565b612604828760a001518860800151613307565b1561263b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c2b565b505050505050565b612651828260200151613262565b600084815260036020908152604091829020929092558681015187518451938501518584015160608701516101408c01516101608d015196518b9873ffffffffffffffffffffffffffffffffffffffff9788169897909616967f0bcc4c97732e47d9946f229edb95f5b6323f601300e4690de719993f3c371129966126e0968f963396929591949093906149d1565b60405180910390a45050505050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156127995780601f1061276e57610100808354040283529160200191612799565b820191906000526020600020905b81548152906001019060200180831161277c57829003601f168201915b505050505090506127c185610140015186600001518660000151856020015160200151613358565b610140840151845186518451602001516127dd93929190613358565b6127f68561014001518660000151858560400151613358565b6128128186600001518760400151856000015160400151613358565b61282e8185600001518660400151856020015160400151613358565b836040015173ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff161415612898576128938184876040015161288e866000015160600151876020015160600151613262565b613358565b6128c8565b6128b081848760400151856000015160600151613358565b6128c881848660400151856020015160600151613358565b5050505050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156129d65783518552602094850194909301926001016129b8565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b81811015612a1f578351855260209485019490930192600101612a01565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b81811015612a67578351855260209485019490930192600101612a49565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b600082821115612add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614b9b565b50900390565b6000808251111515612b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c6b565b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612b5157fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b600081602001835110151515612be9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bbb565b50016020015190565b60006014825110151515612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ceb565b612c408260148451036134e9565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000612c80612c7a85846132ac565b8461354a565b949350505050565b6000818310612c975781610cb4565b5090919050565b612ca66139ba565b6020810182905260a08301516080840151612cc2918491612c6b565b815260a083015160c0840151612cd9918491612c6b565b604082015260a083015160e0840151612cf3918491612c6b565b606082015292915050565b60008054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015612da85780601f10612d7d57610100808354040283529160200191612da8565b820191906000526020600020905b815481529060010190602001808311612d8b57829003601f168201915b50505050509050612dc88461014001518560000151858560000151613358565b612de18461016001518486600001518560200151613358565b612df981856000015186604001518560400151613358565b612e0d818486604001518560600151613358565b50505050565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b60208310612f3c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612eff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b60208310612fd257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612f95565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604080519290940182900382208883529082018c905273ffffffffffffffffffffffffffffffffffffffff8b1693820193909352606081018390526080902096509093505050505b50509392505050565b6001546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b600061230061198d83613561565b805160009060ff166003146130ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cfb565b606083015173ffffffffffffffffffffffffffffffffffffffff161561315d57606083015173ffffffffffffffffffffffffffffffffffffffff16331461315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614d0b565b6131656122bd565b835190915073ffffffffffffffffffffffffffffffffffffffff8083169116146109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614beb565b6000818152600460205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558281015183516101408501516101608601519351859473ffffffffffffffffffffffffffffffffffffffff9485169493909316927fdc47b3613d9fe400085f6dbdc99453462279057e6207385042827ed6b1a62cf79261325692339290614a55565b60405180910390a45050565b6000828201838110156132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bfb565b8091505b5092915050565b6000808315156132bf57600091506132a5565b508282028284828115156132cf57fe5b04146132a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614bfb565b60008060008480151561331657fe5b868509915081151561332b5760009250613052565b61334a61333b83620f42406132ac565b61334588876132ac565b61354a565b6103e8109695505050505050565b600080600083111561263b57855160031061339f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614cab565b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600a90925260409091205473ffffffffffffffffffffffffffffffffffffffff16801515613428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614c5b565b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b818110156134c457895181526020998a0199016134ac565b61020084858403866000895af18015156134dc573d85fd5b5050505050505050505050565b60008160140183511015151561352b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079290614ceb565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b600080828481151561355857fe5b04949350505050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b602083106137e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016137ac565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b6020831061388457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613847565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b6020831061391f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016138e2565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b610120604051908101604052806139f86139ba565b8152602001613a056139ba565b8152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b6000610cb48235614e0e565b6000601f82018313613a4f57600080fd5b8135613a62613a5d82614d9d565b614d76565b81815260209384019390925082018360005b83811015613aa05781358601613a8a8882613bfc565b8452506020928301929190910190600101613a74565b5050505092915050565b6000601f82018313613abb57600080fd5b8135613ac9613a5d82614d9d565b81815260209384019390925082018360005b83811015613aa05781358601613af18882613c4b565b8452506020928301929190910190600101613adb565b6000601f82018313613b1857600080fd5b8135613b26613a5d82614d9d565b91508181835260208401935060208101905083856020840282011115613b4b57600080fd5b60005b83811015613aa05781613b618882613b8f565b8452506020928301929190910190600101613b4e565b6000610cb48235614e27565b6000610cb48251614e27565b6000610cb48235614e2c565b6000610cb48235614e2f565b6000610cb48251614e2f565b600080601f83018413613bc557600080fd5b50813567ffffffffffffffff811115613bdd57600080fd5b602083019150836001820283011115613bf557600080fd5b9250929050565b6000601f82018313613c0d57600080fd5b8135613c1b613a5d82614dbe565b91508082526020830160208301858383011115613c3757600080fd5b613c42838284614e65565b50505092915050565b60006101808284031215613c5e57600080fd5b613c69610180614d76565b90506000613c778484613a32565b8252506020613c8884848301613a32565b6020830152506040613c9c84828501613a32565b6040830152506060613cb084828501613a32565b6060830152506080613cc484828501613b8f565b60808301525060a0613cd884828501613b8f565b60a08301525060c0613cec84828501613b8f565b60c08301525060e0613d0084828501613b8f565b60e083015250610100613d1584828501613b8f565b61010083015250610120613d2b84828501613b8f565b6101208301525061014082013567ffffffffffffffff811115613d4d57600080fd5b613d5984828501613bfc565b6101408301525061016082013567ffffffffffffffff811115613d7b57600080fd5b613d8784828501613bfc565b6101608301525092915050565b600060208284031215613da657600080fd5b6000612c808484613a32565b60008060408385031215613dc557600080fd5b6000613dd18585613a32565b9250506020613de285828601613a32565b9150509250929050565b60008060408385031215613dff57600080fd5b6000613e0b8585613a32565b9250506020613de285828601613b77565b600060208284031215613e2e57600080fd5b813567ffffffffffffffff811115613e4557600080fd5b612c8084828501613aaa565b600080600060608486031215613e6657600080fd5b833567ffffffffffffffff811115613e7d57600080fd5b613e8986828701613aaa565b935050602084013567ffffffffffffffff811115613ea657600080fd5b613eb286828701613b07565b925050604084013567ffffffffffffffff811115613ecf57600080fd5b613edb86828701613a3e565b9150509250925092565b600080600060608486031215613efa57600080fd5b833567ffffffffffffffff811115613f1157600080fd5b613f1d86828701613aaa565b9350506020613eb286828701613b8f565b600060208284031215613f4057600080fd5b6000612c808484613b83565b600060208284031215613f5e57600080fd5b6000612c808484613b8f565b60008060408385031215613f7d57600080fd5b6000613dd18585613b8f565b60008060008060608587031215613f9f57600080fd5b6000613fab8787613b8f565b9450506020613fbc87828801613a32565b935050604085013567ffffffffffffffff811115613fd957600080fd5b613fe587828801613bb3565b95989497509550505050565b60008060006060848603121561400657600080fd5b60006140128686613b8f565b935050602061402386828701613a32565b925050604084013567ffffffffffffffff81111561404057600080fd5b613edb86828701613bfc565b60006020828403121561405e57600080fd5b6000612c808484613b9b565b60006020828403121561407c57600080fd5b6000612c808484613ba7565b60006020828403121561409a57600080fd5b813567ffffffffffffffff8111156140b157600080fd5b612c8084828501613c4b565b600080600080608085870312156140d357600080fd5b843567ffffffffffffffff8111156140ea57600080fd5b6140f687828801613c4b565b945050602085013567ffffffffffffffff81111561411357600080fd5b61411f87828801613c4b565b935050604085013567ffffffffffffffff81111561413c57600080fd5b61414887828801613bfc565b925050606085013567ffffffffffffffff81111561416557600080fd5b61417187828801613bfc565b91505092959194509250565b60008060006060848603121561419257600080fd5b833567ffffffffffffffff8111156141a957600080fd5b6141b586828701613c4b565b935050602061402386828701613b8f565b600080600080600080608087890312156141df57600080fd5b60006141eb8989613b8f565b96505060206141fc89828a01613a32565b955050604087013567ffffffffffffffff81111561421957600080fd5b61422589828a01613bb3565b9450945050606087013567ffffffffffffffff81111561424457600080fd5b61425089828a01613bb3565b92509250509295509295509295565b61426881614e0e565b82525050565b600061427982614e0a565b80845260208401935061428b83614e04565b60005b828110156142bb576142a1868351614983565b6142aa82614e04565b60609690960195915060010161428e565b5093949350505050565b61426881614e27565b61426881614e2c565b61426881614e2f565b60006142eb82614e0a565b8084526142ff816020860160208601614e71565b61430881614e9d565b9093016020019392505050565b61426881614e5a565b601281527f4c454e4754485f36355f52455155495245440000000000000000000000000000602082015260400190565b600d81527f494e56414c49445f54414b455200000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f414c52454144595f455849535453000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601581527f5349474e41545552455f554e535550504f525445440000000000000000000000602082015260400190565b601781527f494e56414c49445f4f524445525f5349474e4154555245000000000000000000602082015260400190565b600d81527f494e56414c49445f4d414b455200000000000000000000000000000000000000602082015260400190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f494e56414c49445f54585f484153480000000000000000000000000000000000602082015260400190565b601181527f494e56414c49445f5349474e4154555245000000000000000000000000000000602082015260400190565b600e81527f524f554e44494e475f4552524f52000000000000000000000000000000000000602082015260400190565b601081527f4641494c45445f455845435554494f4e00000000000000000000000000000000602082015260400190565b601481527f494e56414c49445f54414b45525f414d4f554e54000000000000000000000000602082015260400190565b601a81527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000602082015260400190565b602181527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560208201527f4400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f5349474e41545552455f494c4c4547414c000000000000000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000602082015260400190565b601781527f494e56414c49445f4e45575f4f524445525f45504f4348000000000000000000602082015260400190565b601e81527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601281527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f4f524445525f554e46494c4c41424c4500000000000000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b601881527f4e454741544956455f5350524541445f52455155495245440000000000000000602082015260400190565b601481527f494e56414c49445f54585f5349474e4154555245000000000000000000000000602082015260400190565b601181527f4c454e4754485f305f5245515549524544000000000000000000000000000000602082015260400190565b8051608083019061491184826142ce565b50602082015161492460208501826142ce565b50604082015161493760408501826142ce565b506060820151612e0d60608501826142ce565b805161012083019061495c8482614900565b50602082015161496f6080850182614900565b506040820151612e0d6101008501826142ce565b8051606083019061499484826149ba565b5060208201516149a760208501826142ce565b506040820151612e0d60408501826142ce565b61426881614e54565b60208101612300828461425f565b61010081016149e0828b61425f565b6149ed602083018a61425f565b6149fa60408301896142ce565b614a0760608301886142ce565b614a1460808301876142ce565b614a2160a08301866142ce565b81810360c0830152614a3381856142e0565b905081810360e0830152614a4781846142e0565b9a9950505050505050505050565b60608101614a63828661425f565b8181036020830152614a7581856142e0565b90508181036040830152614a8981846142e0565b95945050505050565b60208082528101610cb4818461426e565b6020810161230082846142c5565b6020810161230082846142ce565b60608101614acd82866142ce565b614ada602083018561425f565b8181036040830152614a8981846142e0565b60408101614afa82856142ce565b8181036020830152612c8081846142e0565b60808101614b1a82876142ce565b614b2760208301866149ba565b614b3460408301856142ce565b614a8960608301846142ce565b60408101614b4f82856142d7565b610cb4602083018461425f565b60208082528101610cb481846142e0565b602081016123008284614315565b602080825281016123008161431e565b602080825281016123008161434e565b602080825281016123008161437e565b60208082528101612300816143ae565b60208082528101612300816143de565b6020808252810161230081614434565b6020808252810161230081614464565b6020808252810161230081614494565b60208082528101612300816144c4565b60208082528101612300816144f4565b6020808252810161230081614524565b6020808252810161230081614554565b6020808252810161230081614584565b60208082528101612300816145b4565b60208082528101612300816145e4565b6020808252810161230081614614565b602080825281016123008161466a565b602080825281016123008161469a565b60208082528101612300816146ca565b60208082528101612300816146fa565b602080825281016123008161472a565b602080825281016123008161475a565b602080825281016123008161478a565b60208082528101612300816147ba565b6020808252810161230081614810565b6020808252810161230081614840565b6020808252810161230081614870565b60208082528101612300816148a0565b60208082528101612300816148d0565b608081016123008284614900565b6101208101612300828461494a565b606081016123008284614983565b60405181810167ffffffffffffffff81118282101715614d9557600080fd5b604052919050565b600067ffffffffffffffff821115614db457600080fd5b5060209081020190565b600067ffffffffffffffff821115614dd557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60200190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b60ff1690565b600061230082614e0e565b82818337506000910152565b60005b83811015614e8c578181015183820152602001614e74565b83811115612e0d5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820260b80113dffd6eb1bf3a32c4186fd411d22a15ec82aa874c05369cfebcd0d3f6c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x1B6 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x288CDC91 DUP2 EQ PUSH2 0x1BB JUMPI DUP1 PUSH4 0x297BB70B EQ PUSH2 0x1F1 JUMPI DUP1 PUSH4 0x2AC12622 EQ PUSH2 0x21E JUMPI DUP1 PUSH4 0x3683EF8E EQ PUSH2 0x24B JUMPI DUP1 PUSH4 0x3C28D861 EQ PUSH2 0x26D JUMPI DUP1 PUSH4 0x3E228BAE EQ PUSH2 0x29A JUMPI DUP1 PUSH4 0x3FD3C997 EQ PUSH2 0x2BA JUMPI DUP1 PUSH4 0x4AC14782 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0x4D0AE546 EQ PUSH2 0x307 JUMPI DUP1 PUSH4 0x4F9559B1 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0x50DDE190 EQ PUSH2 0x347 JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0x367 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0x394 JUMPI DUP1 PUSH4 0x64A3BC15 EQ PUSH2 0x3B4 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x3D4 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x3F4 JUMPI DUP1 PUSH4 0x7E1D9808 EQ PUSH2 0x414 JUMPI DUP1 PUSH4 0x7E9D74DC EQ PUSH2 0x434 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x461 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x481 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x496 JUMPI DUP1 PUSH4 0xA3E20380 EQ PUSH2 0x4B6 JUMPI DUP1 PUSH4 0xB4BE83D5 EQ PUSH2 0x4D6 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x4F6 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x516 JUMPI DUP1 PUSH4 0xC75E0A81 EQ PUSH2 0x536 JUMPI DUP1 PUSH4 0xD46B02C3 EQ PUSH2 0x563 JUMPI DUP1 PUSH4 0xD9BFA73E EQ PUSH2 0x583 JUMPI DUP1 PUSH4 0xDB123B1A EQ PUSH2 0x5A3 JUMPI DUP1 PUSH4 0xDD1C7D18 EQ PUSH2 0x5C5 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x5E5 JUMPI DUP1 PUSH4 0xE5FA431B EQ PUSH2 0x5FA JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x61A JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x62F JUMPI DUP1 PUSH4 0xFFA1AD74 EQ PUSH2 0x64F JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x664 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x20C CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x676 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D4B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0x70A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4AA3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x257 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x266 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F89 JUMP JUMPDEST PUSH2 0x71F JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x279 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28D PUSH2 0x288 CALLDATASIZE PUSH1 0x4 PUSH2 0x40BD JUMP JUMPDEST PUSH2 0x7F8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D59 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x2B5 CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0x8E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2DA PUSH2 0x2D5 CALLDATASIZE PUSH1 0x4 PUSH2 0x404C JUMP JUMPDEST PUSH2 0x965 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4B6D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x302 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E1C JUMP JUMPDEST PUSH2 0x98D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x322 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0x9C6 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x342 CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0xA50 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x353 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x362 CALLDATASIZE PUSH1 0x4 PUSH2 0x3E51 JUMP JUMPDEST PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x373 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0x382 CALLDATASIZE PUSH1 0x4 PUSH2 0x404C JUMP JUMPDEST PUSH2 0xBFE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x49C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x3AF CALLDATASIZE PUSH1 0x4 PUSH2 0x3F4C JUMP JUMPDEST PUSH2 0xC4C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x3CF CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0xC61 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x3EF CALLDATASIZE PUSH1 0x4 PUSH2 0x3DEC JUMP JUMPDEST PUSH2 0xCBB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x40F CALLDATASIZE PUSH1 0x4 PUSH2 0x3DB2 JUMP JUMPDEST PUSH2 0xD66 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x420 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x42F CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0xD86 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x440 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x454 PUSH2 0x44F CALLDATASIZE PUSH1 0x4 PUSH2 0x3E1C JUMP JUMPDEST PUSH2 0xE5B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4A92 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x47C CALLDATASIZE PUSH1 0x4 PUSH2 0x3F6A JUMP JUMPDEST PUSH2 0xEF8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x48D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0xF18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x23E PUSH2 0x4B1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3FF1 JUMP JUMPDEST PUSH2 0xF34 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x4D1 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x175A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x4F1 CALLDATASIZE PUSH1 0x4 PUSH2 0x417D JUMP JUMPDEST PUSH2 0x186D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x511 CALLDATASIZE PUSH1 0x4 PUSH2 0x41C6 JUMP JUMPDEST PUSH2 0x18FC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x531 CALLDATASIZE PUSH1 0x4 PUSH2 0x3D94 JUMP JUMPDEST PUSH2 0x1B95 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x542 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x556 PUSH2 0x551 CALLDATASIZE PUSH1 0x4 PUSH2 0x4088 JUMP JUMPDEST PUSH2 0x1DC0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4D68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x57E CALLDATASIZE PUSH1 0x4 PUSH2 0x4088 JUMP JUMPDEST PUSH2 0x1EBA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x59E CALLDATASIZE PUSH1 0x4 PUSH2 0x3DB2 JUMP JUMPDEST PUSH2 0x1EE9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B8 PUSH2 0x1F06 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x1E8 SWAP2 SWAP1 PUSH2 0x4B5C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x5E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x1FB2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1DB PUSH2 0x207B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x606 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x211 PUSH2 0x615 CALLDATASIZE PUSH1 0x4 PUSH2 0x3EE5 JUMP JUMPDEST PUSH2 0x2081 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x626 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x387 PUSH2 0x2157 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x63B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x26B PUSH2 0x64A CALLDATASIZE PUSH1 0x4 PUSH2 0x3D94 JUMP JUMPDEST PUSH2 0x2173 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x65B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B8 PUSH2 0x2224 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x67E PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x689 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0x6E9 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6C2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x186D JUMP JUMPDEST SWAP1 POP PUSH2 0x6F5 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x692 JUMP JUMPDEST POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x75A DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0xF34 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x79B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C1B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND DUP5 MSTORE SWAP2 SWAP1 MSTORE SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x800 PUSH2 0x39E3 JUMP JUMPDEST PUSH2 0x808 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x810 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x160 DUP1 DUP9 ADD MLOAD PUSH2 0x140 DUP1 DUP10 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP9 ADD MLOAD SWAP1 DUP8 ADD MSTORE PUSH1 0x0 PUSH2 0x833 DUP9 PUSH2 0x1DC0 JUMP JUMPDEST SWAP3 POP PUSH2 0x83E DUP8 PUSH2 0x1DC0 JUMP JUMPDEST SWAP2 POP PUSH2 0x848 PUSH2 0x22BD JUMP JUMPDEST SWAP1 POP PUSH2 0x854 DUP9 DUP9 PUSH2 0x2306 JUMP JUMPDEST PUSH2 0x868 DUP9 DUP9 DUP6 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2362 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 ADD MLOAD SWAP1 SWAP5 POP PUSH2 0x882 SWAP1 DUP10 SWAP1 DUP6 SWAP1 DUP5 SWAP1 DUP1 DUP12 PUSH2 0x2426 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP6 ADD MLOAD ADD MLOAD PUSH2 0x89B SWAP1 DUP9 SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP1 DUP11 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x8B4 DUP9 DUP3 DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x0 ADD MLOAD PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x8CD DUP8 DUP3 DUP5 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x8D9 DUP9 DUP9 DUP4 DUP8 PUSH2 0x26EF JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x8EC PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH2 0x8F9 DUP6 DUP6 DUP6 PUSH2 0x28CF JUMP JUMPDEST SWAP1 POP PUSH1 0x80 DUP2 DUP3 MLOAD PUSH1 0x20 DUP5 ADD ADDRESS GAS DELEGATECALL DUP1 DUP1 ISZERO PUSH2 0x91B JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x939 JUMPI PUSH2 0x700 JUMP JUMPDEST PUSH1 0x0 DUP5 MSTORE PUSH1 0x0 PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP6 ADD MSTORE PUSH2 0x700 JUMP JUMPDEST DUP3 MLOAD DUP5 MSTORE PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x20 DUP6 ADD MSTORE PUSH1 0x40 DUP4 ADD MLOAD PUSH1 0x40 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD MLOAD PUSH1 0x60 DUP6 ADD MSTORE POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 JUMPDEST DUP1 DUP3 EQ PUSH2 0x9C1 JUMPI PUSH2 0x9B9 DUP4 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9AA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1EBA JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x992 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x9CE PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x9D9 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0xA39 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9FA JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA12 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA2A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xC61 JUMP JUMPDEST SWAP1 POP PUSH2 0xA45 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x9E2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xA5E PUSH2 0x22BD JUMP JUMPDEST SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ PUSH2 0xA83 JUMPI CALLER PUSH2 0xA86 JUMP JUMPDEST PUSH1 0x0 JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP4 POP PUSH1 0x1 DUP7 ADD SWAP3 POP SWAP1 POP DUP1 DUP3 GT PUSH2 0xAFD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C9B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP9 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP6 SWAP1 SSTORE MLOAD PUSH32 0x82AF639571738F4EBD4268FB0363D8957EBE1BBB9E78DBA5EBD69EED39B154F0 SWAP1 PUSH2 0xB65 SWAP1 DUP7 SWAP1 PUSH2 0x4AB1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH2 0xB7C PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0xB87 PUSH2 0x39BA JUMP JUMPDEST DUP7 MLOAD SWAP3 POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP2 DUP4 EQ PUSH2 0x700 JUMPI PUSH2 0xBE7 DUP8 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBA8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBC0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP8 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x8E4 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF3 DUP5 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xB90 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xC69 PUSH2 0x39BA JUMP JUMPDEST PUSH2 0xC74 DUP5 DUP5 DUP5 PUSH2 0x186D JUMP JUMPDEST PUSH1 0x20 DUP2 ADD MLOAD SWAP1 SWAP2 POP DUP4 EQ PUSH2 0xCB4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CBB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCC5 PUSH2 0x22BD JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP8 ISZERO ISZERO OR SWAP1 SSTORE MLOAD SWAP3 SWAP4 POP SWAP1 SWAP2 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP1 PUSH2 0xD59 SWAP1 DUP7 SWAP1 PUSH2 0x4AA3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0xD8E PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0xD9D PUSH2 0x39BA JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDAC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xE4F JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xDDC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0xDFC DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0xE28 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE0F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0xE34 DUP7 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0xE44 JUMPI PUSH2 0xE4F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0xDC6 JUMP JUMPDEST POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP5 MLOAD SWAP3 POP DUP3 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xEA1 JUMPI DUP2 PUSH1 0x20 ADD JUMPDEST PUSH2 0xE8E PUSH2 0x3A12 JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 SWAP1 SUB SWAP1 DUP2 PUSH2 0xE86 JUMPI SWAP1 POP JUMPDEST POP SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP1 DUP4 EQ PUSH2 0xEF0 JUMPI PUSH2 0xED0 DUP6 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEC1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x1DC0 JUMP JUMPDEST DUP3 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xEDE JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xEA9 JUMP JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0xF7D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C8B JUMP JUMPDEST PUSH2 0xF86 DUP10 PUSH2 0x2AE3 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0xFE8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BCB JUMP JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xFF7 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1007 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x103F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C7B JUMP JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x104D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1095 JUMPI DUP9 MLOAD ISZERO PUSH2 0x108C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D3B JUMP JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x10A3 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x11DE JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x10E4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10F3 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1133 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x1146 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x116B SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x4B0C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x118F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x174C SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x11EC JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1392 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x122D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x123C JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x127C DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x128F DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1330 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12F3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP4 MSTORE SWAP2 ADD SWAP3 DUP4 SWAP1 MSTORE PUSH2 0x116B SWAP5 POP SWAP3 POP DUP10 SWAP2 DUP10 SWAP2 POP DUP9 SWAP1 PUSH2 0x4B0C JUMP JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x13A0 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x13FF JUMPI DUP9 MLOAD ISZERO PUSH2 0x13DF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D3B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x140D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x14C0 JUMPI PUSH1 0x40 MLOAD PUSH32 0x1626BA7E00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP1 PUSH4 0x1626BA7E SWAP1 PUSH2 0x1467 SWAP1 DUP15 SWAP1 DUP14 SWAP1 PUSH1 0x4 ADD PUSH2 0x4AEC JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1481 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1495 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x14B9 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x3F2E JUMP JUMPDEST SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x14CE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x157B JUMPI PUSH2 0x14DD DUP10 PUSH2 0x2BF2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1525 JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x9363470200000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 PUSH4 0x93634702 SWAP1 PUSH2 0x1467 SWAP1 DUP15 SWAP1 DUP15 SWAP1 DUP15 SWAP1 PUSH1 0x4 ADD PUSH2 0x4ABF JUMP JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x1589 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x15C9 JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x6 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x174C JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x15D7 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x171A JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x1618 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B7B JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1627 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x1667 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x167A DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x2BA7 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x1330 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12F3 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BCB JUMP JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1762 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x1772 PUSH2 0x39BA JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1781 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x1860 JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17B1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x17CD SWAP1 DUP11 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x1810 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17E0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP12 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17FC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP6 PUSH2 0x2C6B JUMP JUMPDEST SWAP2 POP PUSH2 0x183C DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1823 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1848 DUP8 DUP3 PUSH2 0x225B JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x1855 JUMPI PUSH2 0x1860 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x179B JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1875 PUSH2 0x39BA JUMP JUMPDEST PUSH2 0x187D PUSH2 0x3A12 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x188B DUP9 PUSH2 0x1DC0 JUMP JUMPDEST SWAP4 POP PUSH2 0x1895 PUSH2 0x22BD JUMP JUMPDEST SWAP3 POP PUSH2 0x18A9 DUP9 PUSH1 0xA0 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0x18B5 DUP8 DUP4 PUSH2 0x2C88 JUMP JUMPDEST SWAP1 POP PUSH2 0x18C5 DUP9 DUP6 DUP6 DUP11 DUP6 DUP12 PUSH2 0x2426 JUMP JUMPDEST PUSH2 0x18CF DUP9 DUP3 PUSH2 0x2C9E JUMP JUMPDEST SWAP5 POP PUSH2 0x18E6 DUP9 DUP5 DUP7 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP10 PUSH2 0x2643 JUMP JUMPDEST PUSH2 0x18F1 DUP9 DUP5 DUP8 PUSH2 0x2CFE JUMP JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x194F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CCB JUMP JUMPDEST PUSH2 0x1992 PUSH2 0x198D DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x2E13 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x305B JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x19DE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C0B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1AAF JUMPI PUSH2 0x1A36 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0xF34 SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1A6E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D2B JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x1B46 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C3B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1B8C JUMPI PUSH1 0x9 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1BED JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CDB JUMP JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C54 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1C68 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1C8C SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x406A JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x1D11 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BAB JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0xA PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND OR SWAP1 SSTORE MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP1 PUSH2 0x1DB2 SWAP1 DUP5 SWAP1 DUP8 SWAP1 PUSH2 0x4B41 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH2 0x1DC8 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x1DD1 DUP3 PUSH2 0x309B JUMP JUMPDEST PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x3 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 SLOAD SWAP1 DUP3 ADD MSTORE PUSH1 0x80 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1E05 JUMPI PUSH1 0x1 JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH2 0xC47 JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD ISZERO ISZERO PUSH2 0x1E17 JUMPI PUSH1 0x2 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0xA0 DUP3 ADD MLOAD PUSH1 0x40 DUP3 ADD MLOAD LT PUSH2 0x1E2D JUMPI PUSH1 0x5 PUSH2 0x1DFB JUMP JUMPDEST PUSH2 0x100 DUP3 ADD MLOAD TIMESTAMP LT PUSH2 0x1E40 JUMPI PUSH1 0x4 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 ADD MLOAD PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1E64 JUMPI PUSH1 0x6 PUSH2 0x1DFB JUMP JUMPDEST PUSH2 0x120 DUP3 ADD MLOAD DUP3 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH1 0x60 DUP9 ADD MLOAD SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD GT ISZERO PUSH2 0x1EB1 JUMPI PUSH1 0x6 PUSH2 0x1DFB JUMP JUMPDEST PUSH1 0x3 DUP2 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x1EC2 PUSH2 0x3A12 JUMP JUMPDEST PUSH2 0x1ECB DUP3 PUSH2 0x1DC0 JUMP JUMPDEST SWAP1 POP PUSH2 0x1ED7 DUP3 DUP3 PUSH2 0x30A9 JUMP JUMPDEST PUSH2 0x1EE5 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x31BB JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1FAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1FAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST PUSH2 0x1FBA PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x1FC9 PUSH2 0x39BA JUMP JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1FD8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD MLOAD SWAP5 POP DUP9 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0xE4F JUMPI DUP5 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2008 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x2028 DUP9 DUP8 PUSH1 0x20 ADD MLOAD PUSH2 0x2AA1 JUMP JUMPDEST SWAP2 POP PUSH2 0x2054 DUP10 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x203B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP10 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xBD8 JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x2060 DUP7 DUP3 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD DUP9 GT PUSH2 0x2070 JUMPI PUSH2 0xE4F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1FF2 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2089 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x2099 PUSH2 0x39BA JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20A8 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP6 POP DUP10 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0x1860 JUMPI DUP6 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x20D8 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP7 MLOAD PUSH2 0x20F4 SWAP1 DUP11 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x2107 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x17E0 JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0x2133 DUP11 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x211A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6DA JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x213F DUP8 DUP3 PUSH2 0x225B JUMP JUMPDEST DUP7 MLOAD DUP10 GT PUSH2 0x214C JUMPI PUSH2 0x1860 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x20C2 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x21C4 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CDB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2221 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0xB DUP2 MSTORE PUSH32 0x322E302E312D616C706861000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x2269 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x227F SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x2298 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x22B1 SWAP2 SWAP1 PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x22FE JUMPI PUSH1 0x9 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x2300 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x2318 DUP3 PUSH1 0xA0 ADD MLOAD DUP3 PUSH1 0xA0 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x232A DUP4 PUSH1 0x80 ADD MLOAD DUP4 PUSH1 0x80 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST LT ISZERO PUSH2 0x1EE5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D1B JUMP JUMPDEST PUSH2 0x236A PUSH2 0x39E3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0x237E DUP10 PUSH1 0xA0 ADD MLOAD DUP9 PUSH2 0x2AA1 JUMP JUMPDEST SWAP4 POP PUSH2 0x238E DUP9 PUSH1 0xA0 ADD MLOAD DUP8 PUSH2 0x2AA1 JUMP JUMPDEST SWAP3 POP PUSH2 0x239E DUP4 DUP10 PUSH1 0x80 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x23AC DUP6 DUP11 PUSH1 0xA0 ADD MLOAD PUSH2 0x32AC JUMP JUMPDEST GT PUSH2 0x23CE JUMPI DUP4 SWAP2 POP PUSH2 0x23C7 DUP9 PUSH1 0xA0 ADD MLOAD DUP10 PUSH1 0x80 ADD MLOAD DUP5 PUSH2 0x2C6B JUMP JUMPDEST SWAP1 POP PUSH2 0x23E7 JUMP JUMPDEST DUP3 SWAP1 POP PUSH2 0x23E4 DUP9 PUSH1 0x80 ADD MLOAD DUP10 PUSH1 0xA0 ADD MLOAD DUP4 PUSH2 0x2C6B JUMP JUMPDEST SWAP2 POP JUMPDEST PUSH2 0x23F1 DUP10 DUP4 PUSH2 0x2C9E JUMP JUMPDEST DUP6 MSTORE PUSH2 0x23FD DUP9 DUP3 PUSH2 0x2C9E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP8 ADD DUP3 SWAP1 MSTORE DUP7 MLOAD MLOAD SWAP2 ADD MLOAD PUSH2 0x2415 SWAP2 SWAP1 PUSH2 0x2AA1 JUMP JUMPDEST PUSH1 0x40 DUP7 ADD MSTORE POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST DUP5 MLOAD PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x2464 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CFB JUMP JUMPDEST DUP3 ISZERO ISZERO PUSH2 0x249D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C4B JUMP JUMPDEST PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x2510 JUMPI PUSH1 0x60 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2510 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D0B JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x259B JUMPI DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP7 PUSH1 0x20 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO ISZERO PUSH2 0x259B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B8B JUMP JUMPDEST PUSH1 0x40 DUP6 ADD MLOAD ISZERO ISZERO PUSH2 0x25F1 JUMPI PUSH2 0x25B9 DUP6 PUSH1 0x20 ADD MLOAD DUP8 PUSH1 0x0 ADD MLOAD DUP4 PUSH2 0xF34 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x25F1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BDB JUMP JUMPDEST PUSH2 0x2604 DUP3 DUP8 PUSH1 0xA0 ADD MLOAD DUP9 PUSH1 0x80 ADD MLOAD PUSH2 0x3307 JUMP JUMPDEST ISZERO PUSH2 0x263B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C2B JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x2651 DUP3 DUP3 PUSH1 0x20 ADD MLOAD PUSH2 0x3262 JUMP JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 SWAP3 SWAP1 SWAP3 SSTORE DUP7 DUP2 ADD MLOAD DUP8 MLOAD DUP5 MLOAD SWAP4 DUP6 ADD MLOAD DUP6 DUP5 ADD MLOAD PUSH1 0x60 DUP8 ADD MLOAD PUSH2 0x140 DUP13 ADD MLOAD PUSH2 0x160 DUP14 ADD MLOAD SWAP7 MLOAD DUP12 SWAP9 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND SWAP9 SWAP8 SWAP1 SWAP7 AND SWAP7 PUSH32 0xBCC4C97732E47D9946F229EDB95F5B6323F601300E4690DE719993F3C371129 SWAP7 PUSH2 0x26E0 SWAP7 DUP16 SWAP7 CALLER SWAP7 SWAP3 SWAP6 SWAP2 SWAP5 SWAP1 SWAP4 SWAP1 PUSH2 0x49D1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2799 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x276E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2799 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x277C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x27C1 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x140 DUP5 ADD MLOAD DUP5 MLOAD DUP7 MLOAD DUP5 MLOAD PUSH1 0x20 ADD MLOAD PUSH2 0x27DD SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x27F6 DUP6 PUSH2 0x140 ADD MLOAD DUP7 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2812 DUP2 DUP7 PUSH1 0x0 ADD MLOAD DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x282E DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST DUP4 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH1 0x40 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x2898 JUMPI PUSH2 0x2893 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD PUSH2 0x288E DUP7 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD DUP8 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3262 JUMP JUMPDEST PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x28C8 JUMP JUMPDEST PUSH2 0x28B0 DUP2 DUP5 DUP8 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x28C8 DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x29D6 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x29B8 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A1F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2A01 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x2A67 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x2A49 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x2ADD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4B9B JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x2B21 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C6B JUMP JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x2B51 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2BE9 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BBB JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x2C32 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CEB JUMP JUMPDEST PUSH2 0x2C40 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x34E9 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2C80 PUSH2 0x2C7A DUP6 DUP5 PUSH2 0x32AC JUMP JUMPDEST DUP5 PUSH2 0x354A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 LT PUSH2 0x2C97 JUMPI DUP2 PUSH2 0xCB4 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2CA6 PUSH2 0x39BA JUMP JUMPDEST PUSH1 0x20 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0x80 DUP5 ADD MLOAD PUSH2 0x2CC2 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST DUP2 MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xC0 DUP5 ADD MLOAD PUSH2 0x2CD9 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0xA0 DUP4 ADD MLOAD PUSH1 0xE0 DUP5 ADD MLOAD PUSH2 0x2CF3 SWAP2 DUP5 SWAP2 PUSH2 0x2C6B JUMP JUMPDEST PUSH1 0x60 DUP3 ADD MSTORE SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2DA8 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2D7D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2DA8 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2D8B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP PUSH2 0x2DC8 DUP5 PUSH2 0x140 ADD MLOAD DUP6 PUSH1 0x0 ADD MLOAD DUP6 DUP6 PUSH1 0x0 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2DE1 DUP5 PUSH2 0x160 ADD MLOAD DUP5 DUP7 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2DF9 DUP2 DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x40 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST PUSH2 0x2E0D DUP2 DUP5 DUP7 PUSH1 0x40 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0x3358 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2F3C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2EFF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2FD2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2F95 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP9 DUP4 MSTORE SWAP1 DUP3 ADD DUP13 SWAP1 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP12 AND SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x60 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x80 SWAP1 KECCAK256 SWAP7 POP SWAP1 SWAP4 POP POP POP POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2300 PUSH2 0x198D DUP4 PUSH2 0x3561 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND PUSH1 0x3 EQ PUSH2 0x30EA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CFB JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x315D JUMPI PUSH1 0x60 DUP4 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x315D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4D0B JUMP JUMPDEST PUSH2 0x3165 PUSH2 0x22BD JUMP JUMPDEST DUP4 MLOAD SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND SWAP2 AND EQ PUSH2 0x9C1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BEB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 DUP2 ADD MLOAD DUP4 MLOAD PUSH2 0x140 DUP6 ADD MLOAD PUSH2 0x160 DUP7 ADD MLOAD SWAP4 MLOAD DUP6 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP5 DUP6 AND SWAP5 SWAP4 SWAP1 SWAP4 AND SWAP3 PUSH32 0xDC47B3613D9FE400085F6DBDC99453462279057E6207385042827ED6B1A62CF7 SWAP3 PUSH2 0x3256 SWAP3 CALLER SWAP3 SWAP1 PUSH2 0x4A55 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x32A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BFB JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x32BF JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x32A5 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x32CF JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x32A1 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4BFB JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x3316 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x332B JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x3052 JUMP JUMPDEST PUSH2 0x334A PUSH2 0x333B DUP4 PUSH3 0xF4240 PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x3345 DUP9 DUP8 PUSH2 0x32AC JUMP JUMPDEST PUSH2 0x354A JUMP JUMPDEST PUSH2 0x3E8 LT SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x263B JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x339F JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CAB JUMP JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0xA SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x3428 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4C5B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x34C4 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x34AC JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x34DC JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x352B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x792 SWAP1 PUSH2 0x4CEB JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x3558 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x37E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x37AC JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x3884 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x3847 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x391F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x38E2 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x120 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH2 0x39F8 PUSH2 0x39BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x3A05 PUSH2 0x39BA JUMP JUMPDEST DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E0E JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3A62 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST PUSH2 0x4D76 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3A8A DUP9 DUP3 PUSH2 0x3BFC JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3A74 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3ABB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3AC9 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x3AF1 DUP9 DUP3 PUSH2 0x3C4B JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3ADB JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3B18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B26 PUSH2 0x3A5D DUP3 PUSH2 0x4D9D JUMP JUMPDEST SWAP2 POP DUP2 DUP2 DUP4 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH1 0x20 DUP2 ADD SWAP1 POP DUP4 DUP6 PUSH1 0x20 DUP5 MUL DUP3 ADD GT ISZERO PUSH2 0x3B4B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3AA0 JUMPI DUP2 PUSH2 0x3B61 DUP9 DUP3 PUSH2 0x3B8F JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x3B4E JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 MLOAD PUSH2 0x4E27 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E2C JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 CALLDATALOAD PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0xCB4 DUP3 MLOAD PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x3BC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3BDD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x3BF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3C0D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3C1B PUSH2 0x3A5D DUP3 PUSH2 0x4DBE JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3C37 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C42 DUP4 DUP3 DUP5 PUSH2 0x4E65 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3C5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3C69 PUSH2 0x180 PUSH2 0x4D76 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x3C77 DUP5 DUP5 PUSH2 0x3A32 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x3C88 DUP5 DUP5 DUP4 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x3C9C DUP5 DUP3 DUP6 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x3CB0 DUP5 DUP3 DUP6 ADD PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x3CC4 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x3CD8 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x3CEC DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x3D00 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x3D15 DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x3D2B DUP5 DUP3 DUP6 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D4D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D59 DUP5 DUP3 DUP6 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3D7B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3D87 DUP5 DUP3 DUP6 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3DA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3A32 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3DC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3DD1 DUP6 DUP6 PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3DE2 DUP6 DUP3 DUP7 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3DFF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3E0B DUP6 DUP6 PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x3DE2 DUP6 DUP3 DUP7 ADD PUSH2 0x3B77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3E2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E45 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C80 DUP5 DUP3 DUP6 ADD PUSH2 0x3AAA JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3E66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3E7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3E89 DUP7 DUP3 DUP8 ADD PUSH2 0x3AAA JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3EA6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EB2 DUP7 DUP3 DUP8 ADD PUSH2 0x3B07 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3ECF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EDB DUP7 DUP3 DUP8 ADD PUSH2 0x3A3E JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x3EFA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3F11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3F1D DUP7 DUP3 DUP8 ADD PUSH2 0x3AAA JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x3EB2 DUP7 DUP3 DUP8 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F40 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B83 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F5E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x3F7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3DD1 DUP6 DUP6 PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x3F9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x3FAB DUP8 DUP8 PUSH2 0x3B8F JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x3FBC DUP8 DUP3 DUP9 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x3FD9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3FE5 DUP8 DUP3 DUP9 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4006 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x4012 DUP7 DUP7 PUSH2 0x3B8F JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4023 DUP7 DUP3 DUP8 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4040 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3EDB DUP7 DUP3 DUP8 ADD PUSH2 0x3BFC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x405E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3B9B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x407C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x2C80 DUP5 DUP5 PUSH2 0x3BA7 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x409A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x2C80 DUP5 DUP3 DUP6 ADD PUSH2 0x3C4B JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x40D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x40EA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x40F6 DUP8 DUP3 DUP9 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4113 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x411F DUP8 DUP3 DUP9 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x413C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4148 DUP8 DUP3 DUP9 ADD PUSH2 0x3BFC JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4165 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4171 DUP8 DUP3 DUP9 ADD PUSH2 0x3BFC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x4192 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x41A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x41B5 DUP7 DUP3 DUP8 ADD PUSH2 0x3C4B JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x4023 DUP7 DUP3 DUP8 ADD PUSH2 0x3B8F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x41DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x41EB DUP10 DUP10 PUSH2 0x3B8F JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 PUSH2 0x41FC DUP10 DUP3 DUP11 ADD PUSH2 0x3A32 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4219 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4225 DUP10 DUP3 DUP11 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP5 POP SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4244 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4250 DUP10 DUP3 DUP11 ADD PUSH2 0x3BB3 JUMP JUMPDEST SWAP3 POP SWAP3 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E0E JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x4279 DUP3 PUSH2 0x4E0A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x428B DUP4 PUSH2 0x4E04 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x42BB JUMPI PUSH2 0x42A1 DUP7 DUP4 MLOAD PUSH2 0x4983 JUMP JUMPDEST PUSH2 0x42AA DUP3 PUSH2 0x4E04 JUMP JUMPDEST PUSH1 0x60 SWAP7 SWAP1 SWAP7 ADD SWAP6 SWAP2 POP PUSH1 0x1 ADD PUSH2 0x428E JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E27 JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E2C JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E2F JUMP JUMPDEST PUSH1 0x0 PUSH2 0x42EB DUP3 PUSH2 0x4E0A JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x42FF DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x4E71 JUMP JUMPDEST PUSH2 0x4308 DUP2 PUSH2 0x4E9D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E5A JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F54414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4F524445525F5349474E4154555245000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x494E56414C49445F4D414B455200000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x524F554E44494E475F4552524F52000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54414B45525F414D4F554E54000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x494E56414C49445F4E45575F4F524445525F45504F4348000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1E DUP2 MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x4F524445525F554E46494C4C41424C4500000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4E454741544956455F5350524541445F52455155495245440000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x4911 DUP5 DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x4924 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x4937 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST DUP1 MLOAD PUSH2 0x120 DUP4 ADD SWAP1 PUSH2 0x495C DUP5 DUP3 PUSH2 0x4900 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x496F PUSH1 0x80 DUP6 ADD DUP3 PUSH2 0x4900 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH2 0x100 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST DUP1 MLOAD PUSH1 0x60 DUP4 ADD SWAP1 PUSH2 0x4994 DUP5 DUP3 PUSH2 0x49BA JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x49A7 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2E0D PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4268 DUP2 PUSH2 0x4E54 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x49E0 DUP3 DUP12 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x49ED PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x425F JUMP JUMPDEST PUSH2 0x49FA PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A07 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A14 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A21 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x42CE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xC0 DUP4 ADD MSTORE PUSH2 0x4A33 DUP2 DUP6 PUSH2 0x42E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x4A47 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4A63 DUP3 DUP7 PUSH2 0x425F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x4A75 DUP2 DUP6 PUSH2 0x42E0 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4A89 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB4 DUP2 DUP5 PUSH2 0x426E JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x42C5 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x42CE JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x4ACD DUP3 DUP7 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4ADA PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x425F JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x4A89 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4AFA DUP3 DUP6 PUSH2 0x42CE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x20 DUP4 ADD MSTORE PUSH2 0x2C80 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x4B1A DUP3 DUP8 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4B27 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x49BA JUMP JUMPDEST PUSH2 0x4B34 PUSH1 0x40 DUP4 ADD DUP6 PUSH2 0x42CE JUMP JUMPDEST PUSH2 0x4A89 PUSH1 0x60 DUP4 ADD DUP5 PUSH2 0x42CE JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x4B4F DUP3 DUP6 PUSH2 0x42D7 JUMP JUMPDEST PUSH2 0xCB4 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x425F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xCB4 DUP2 DUP5 PUSH2 0x42E0 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4315 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x431E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x434E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x437E JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x43AE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x43DE JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4434 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4464 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4494 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x44C4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x44F4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4524 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4554 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4584 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x45B4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x45E4 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4614 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x466A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x469A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x46CA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x46FA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x472A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x475A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x478A JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x47BA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4810 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4840 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x4870 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x48A0 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x2300 DUP2 PUSH2 0x48D0 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4900 JUMP JUMPDEST PUSH2 0x120 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x494A JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2300 DUP3 DUP5 PUSH2 0x4983 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x4D95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4DB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x4DD5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x2300 DUP3 PUSH2 0x4E0E JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x4E8C JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x4E74 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x2E0D JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0x26 SIGNEXTEND DUP1 GT RETURNDATASIZE SELFDESTRUCT 0xd6 0xeb SHL RETURN LOG3 0x2c COINBASE DUP7 REVERT COINBASE SAR 0x22 LOG1 0x5e 0xc8 0x2a 0xa8 PUSH21 0xC05369CFEBCD0D3F6C6578706572696D656E74616C 0xf5 STOP CALLDATACOPY ",
+ "sourceMap": "931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1198:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1198:42:4;;;;;;;;;;;;;;;;;;;;;;;;;4305:618:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4305:618:8;;;;;;;;;;;;;;;;;1288:42:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1288:42:4;;;;;;;;;;;;;;;;;1493:360:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1493:360:6;;;;;;;;;;;1791:2557:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1791:2557:5;;;;;;;;;;;;;;;;;2097:1729:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2097:1729:8;;;;;;;;;976:51:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:51:3;;;;;;;;;;;;;;;;;15793:231:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15793:231:8;;;;;;;;;5403:630;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5403:630:8;;;;;;;;;1939:1012:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1939:1012:4;;;;;;;;;6592:632:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6592:632:8;;;;;;;;;2092:154:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2092:154:3;;;;;;;;;;;;;;;;;968:45:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;968:45:7;;;;;;;;;1215:495:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1215:495:8;;;;;;;;;2090:391:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2090:391:6;;;;;;;;;1087:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1087:71:6;;;;;;;;;7612:1478:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7612:1478:8;;;;;;;;;16218:419;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16218:419:8;;;;;;;;;;;;;;;;;967:63:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;967:63:6;;;;;;;;;258:20:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:30;;;;2853:6730:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2853:6730:6;;;;;;;;;13764:1894:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13764:1894:8;;;;;;;;;3268:1327:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3268:1327:4;;;;;;;;;1710:1456:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:1456:7;;;;;;;;;1236:666:3;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1236:666:3;;;;;;;;;5422:2261:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5422:2261:4;;;;;;;;;;;;;;;;;4826:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4826:322:4;;;;;;;;;1548:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1548:67:4;;;;;;;;;1779:27:17;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1779:27:17;;;;;;;;;;;;9547:1488:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9547:1488:8;;;;;;;;;1300:33:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1300:33:18;;;;11423:1880:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11423:1880:8;;;;;;;;;1065:36:7;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1065:36:7;;;;500:167:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:30;;;;;;;;;1113:46:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1113:46:2;;;;1198:42:4;;;;;;;;;;;;;:::o;4305:618:8:-;4491:35;;:::i;:::-;4542:20;4593:9;4646:36;;:::i;:::-;4565:6;:13;4542:36;;4605:1;4593:13;;4588:296;4608:17;;;4588:296;;4685:123;4712:6;4719:1;4712:9;;;;;;;;;;;;;;;;;;4739:21;4761:1;4739:24;;;;;;;;;;;;;;;;;;4781:10;4792:1;4781:13;;;;;;;;;;;;;;;;;;4685:9;:123::i;:::-;4646:162;;4822:51;4837:16;4855:17;4822:14;:51::i;:::-;4627:3;;;;;4588:296;;;4305:618;;;;;;;;:::o;1288:42:4:-;;;;;;;;;;;;;;;:::o;1493:360:6:-;1646:110;1680:4;1702:13;1733:9;;1646:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1646:16:6;;-1:-1:-1;;;;;1646:110:6:i;:::-;1625:174;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1809:15:6;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;:37;;;;1842:4;1809:37;;;1493:360::o;1791:2557:5:-;2006:59;;:::i;:::-;2471:39;;:::i;:::-;2546:40;;:::i;:::-;2335:24;;;;;2307:25;;;;:52;;;;2397:24;;;2369:25;;;:52;2655:20;2513:23;2335:9;2513:12;:23::i;:::-;2471:65;;2589:24;2602:10;2589:12;:24::i;:::-;2546:67;;2678:26;:24;:26::i;:::-;2655:49;;2767:39;2784:9;2795:10;2767:16;:39::i;:::-;2883:195;2924:9;2947:10;2971:13;:41;;;3026:14;:42;;;2883:27;:195::i;:::-;3228:23;;:46;;;2862:216;;-1:-1:-1;3123:248:5;;3152:9;;3175:13;;3202:12;;3228:46;3348:13;3123:15;:248::i;:::-;3488:24;;;;;:47;;3381:253;;3410:10;;3434:14;;3462:12;;3488:47;3610:14;3381:15;:253::i;:::-;3678:205;3709:9;3732:12;3758:13;:23;;;3795:13;:41;;;3850:18;:23;;;3678:17;:205::i;:::-;3893:209;3924:10;3948:12;3974:14;:24;;;4012:14;:42;;;4068:18;:24;;;3893:17;:209::i;:::-;4171:134;4204:9;4227:10;4251:12;4277:18;4171:19;:134::i;:::-;1791:2557;;;;;;;;;:::o;2097:1729:8:-;2268:30;;:::i;:::-;2361;2394:104;2426:5;2445:20;2479:9;2394:18;:104::i;:::-;2361:137;;3123:3;3044:17;2979;2973:24;2877:2;2858:17;2854:26;2769:7;2649:3;2619:581;3220:7;3240:205;;;;3463:1;3458:324;;;;3213:569;;3240:205;3285:1;3272:11;3265:22;3333:1;3328:2;3315:11;3311:20;3304:31;3381:1;3376:2;3363:11;3359:20;3352:31;3429:1;3424:2;3411:11;3407:20;3400:31;3240:205;;3458:324;3509:17;3503:24;3490:11;3483:45;3603:2;3584:17;3580:26;3574:33;3569:2;3556:11;3552:20;3545:63;3683:2;3664:17;3660:26;3654:33;3649:2;3636:11;3632:20;3625:63;3763:2;3744:17;3740:26;3734:33;3729:2;3716:11;3712:20;3705:63;-1:-1:-1;;2097:1729:8;;;;;;:::o;976:51:3:-;;;;;;;;;;;;;;;:::o;15793:231:8:-;15904:13;;15881:20;15927:91;15947:17;;;15927:91;;15985:22;15997:6;16004:1;15997:9;;;;;;;;;;;;;;;;;;15985:11;:22::i;:::-;15966:3;;15927:91;;;15793:231;;;:::o;5403:630::-;5595:35;;:::i;:::-;5646:20;5697:9;5750:36;;:::i;:::-;5669:6;:13;5646:36;;5709:1;5697:13;;5692:302;5712:17;;;5692:302;;5789:129;5822:6;5829:1;5822:9;;;;;;;;;;;;;;;;;;5849:21;5871:1;5849:24;;;;;;;;;;;;;;;;;;5891:10;5902:1;5891:13;;;;;;;;;;;;;;;;;;5789:15;:129::i;:::-;5750:168;;5932:51;5947:16;5965:17;5932:14;:51::i;:::-;5731:3;;;;;5692:302;;1939:1012:4;2022:20;2329:21;2493;2549;2045:26;:24;:26::i;:::-;2022:49;-1:-1:-1;2353:26:4;;;2369:10;2353:26;:52;;2395:10;2353:52;;;2390:1;2353:52;2573:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;2329:76;;-1:-1:-1;2536:1:4;2517:20;;;-1:-1:-1;2573:39:4;-1:-1:-1;2701:29:4;;;2680:100;;;;;;;;;;;;;;2820:24;;;;;;;;:10;:24;;;;;;;;:39;;;;;;;;;;;;;;:55;;;2890:54;;;;;2862:13;;2890:54;;;;;;;;;;1939:1012;;;;;:::o;6592:632:8:-;6785:35;;:::i;:::-;6836:20;6887:9;6940:36;;:::i;:::-;6859:6;:13;6836:36;;6899:1;6887:13;;6882:303;6902:17;;;6882:303;;6979:130;7013:6;7020:1;7013:9;;;;;;;;;;;;;;;;;;7040:21;7062:1;7040:24;;;;;;;;;;;;;;;;;;7082:10;7093:1;7082:13;;;;;;;;;;;;;;;;;;6979:16;:130::i;:::-;6940:169;;7123:51;7138:16;7156:17;7123:14;:51::i;:::-;6921:3;;;;;6882:303;;2092:154:3;2213:26;;;2183:7;2213:26;;;:12;:26;;;;;;;;2092:154;;;;:::o;968:45:7:-;;;;;;;;;;;;;;;:::o;1215:495:8:-;1385:30;;:::i;:::-;1445:95;1468:5;1487:20;1521:9;1445;:95::i;:::-;1571:34;;;;1431:109;;-1:-1:-1;1571:58:8;;1550:125;;;;;;;;;;;;;;1215:495;;;;;:::o;2090:391:6:-;2223:21;2247:26;:24;:26::i;:::-;2283:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;;:61;;;;;;;;;;2359:115;2283:32;;-1:-1:-1;2283:50:6;;2359:115;;;;2283:61;;2359:115;;;;;;;;;;2090:391;;;:::o;1087:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7612:1478:8:-;7789:35;;:::i;:::-;7840:27;7909:20;7960:9;8346:37;8537:36;;:::i;:::-;7870:6;7877:1;7870:9;;;;;;;;;;;;;;;;;;:24;;;7840:54;;7932:6;:13;7909:36;;7972:1;7960:13;;7955:1096;7975:17;;;7955:1096;;8249:14;8222:6;8229:1;8222:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;8386:70;8394:20;8416:16;:39;;;8386:7;:70::i;:::-;8346:110;;8576:128;8603:6;8610:1;8603:9;;;;;;;;;;;;;;;;;;8630:29;8677:10;8688:1;8677:13;;;;;;;;;8576:128;8537:167;;8789:51;8804:16;8822:17;8789:14;:51::i;:::-;8938:39;;;;:63;-1:-1:-1;8934:107:8;;9021:5;;8934:107;7994:3;;;;;7955:1096;;;7612:1478;;;;;;;;;;:::o;16218:419::-;16318:20;16361;16407:38;16501:9;16384:6;:13;16361:36;;16473:12;16448:38;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;16407:79;;16513:1;16501:13;;16496:108;16516:17;;;16496:108;;16570:23;16583:6;16590:1;16583:9;;;;;;;;;;;;;;;;;;16570:12;:23::i;:::-;16554:10;16565:1;16554:13;;;;;;;;;;;;;;;;;;:39;16535:3;;16496:108;;;-1:-1:-1;16620:10:8;16218:419;-1:-1:-1;;;16218:419:8:o;967:63:6:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;258:20:30:-;;;;;;:::o;2853:6730:6:-;3015:12;3205:22;3446:27;3567:7;3584:9;3603;3622:17;7428:24;3083:1;3064:9;:16;:20;3043:97;;;;;;;;;;;;;;;;3236:23;:9;:21;:23::i;:::-;3230:30;;;;-1:-1:-1;3358:29:6;3333:55;;;;3312:123;;;;;;;;;;;;;;3490:16;3476:31;;;;;;;;;;3446:61;-1:-1:-1;3989:21:6;3972:13;:38;;;;;;;;;3968:5265;;;4026:27;;;;;;;;;;;3968:5265;4335:21;4318:13;:38;;;;;;;;;4314:4919;;;4397:16;;:21;4372:97;;;;;;;;;;;;;;4493:5;;-1:-1:-1;4512:14:6;;4314:4919;4599:20;4582:13;:37;;;;;;;;;4578:4655;;;4660:16;;4680:2;4660:22;4635:99;;;;;;;;;;;;;;4758:9;4768:1;4758:12;;;;;;;;;;;;;;;;;;;;;4752:19;;-1:-1:-1;4789:24:6;:9;4811:1;4789:24;:21;:24;:::i;:::-;4785:28;-1:-1:-1;4831:25:6;:9;4853:2;4831:25;:21;:25;:::i;:::-;4827:29;;4882:102;4909:4;4931:1;4950;4969;4882:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4882:102:6;;;;;5008:26;;;;;;;;;-1:-1:-1;4882:102:6;-1:-1:-1;5048:14:6;;-1:-1:-1;5048:14:6;4578:4655;5139:21;5122:13;:38;;;;;;;;;5118:4115;;;5201:16;;5221:2;5201:22;5176:99;;;;;;;;;;;;;;5299:9;5309:1;5299:12;;;;;;;;;;;;;;;;;;;;;5293:19;;-1:-1:-1;5330:24:6;:9;5352:1;5330:24;:21;:24;:::i;:::-;5326:28;-1:-1:-1;5372:25:6;:9;5394:2;5372:25;:21;:25;:::i;:::-;5368:29;;5423:225;5554:4;5460:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5460:116:6;;;5450:127;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5450:127:6;;;;;;;;;;;;-1:-1:-1;5423:225:6;;;;;;;;;;-1:-1:-1;5450:127:6;-1:-1:-1;5595:1:6;;5614;;-1:-1:-1;5633:1:6;;5423:225;;5118:4115;6316:20;6299:13;:37;;;;;;;;;6295:2938;;;6377:16;;:21;6352:97;;;;;;;;;;;;;;6473:27;;;6490:10;6473:27;;-1:-1:-1;6514:14:6;;6295:2938;6698:20;6681:13;:37;;;;;;;;;6677:2556;;;6744:56;;;;;:39;;;;;;:56;;6784:4;;6790:9;;6744:56;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6744:56:6;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6744:56:6;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6744:56:6;;;;;;;;;6734:66;-1:-1:-1;6814:14:6;;6677:2556;7327:23;7310:13;:40;;;;;;;;;7306:1927;;;7455:26;:9;:24;:26::i;:::-;7566:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;7428:53;;-1:-1:-1;7566:50:6;;7565:51;7561:102;;;7643:5;7636:12;;;;7561:102;7686:139;;;;;:45;;;;;;:139;;7749:4;;7771:13;;7802:9;;7686:139;;;;7306:1927;7961:23;7944:13;:40;;;;;;;;;7940:1293;;;8010:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;8054:14:6;;7940:1293;8634:20;8617:13;:37;;;;;;;;;8613:620;;;8695:16;;8715:2;8695:22;8670:99;;;;;;;;;;;;;;8793:9;8803:1;8793:12;;;;;;;;;;;;;;;;;;;;;8787:19;;-1:-1:-1;8824:24:6;:9;8846:1;8824:24;:21;:24;:::i;:::-;8820:28;-1:-1:-1;8866:25:6;:9;8888:2;8866:25;:21;:25;:::i;:::-;8862:29;;8917:227;9050:4;8954:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8954:118:6;;;8944:129;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;8613:620:6;9545:31;;;;;;;;;;;2853:6730;;;;;;;;;;;;;:::o;13764:1894:8:-;13947:35;;:::i;:::-;13998:27;14063:20;14114:9;14504:37;14810;15096:36;;:::i;:::-;14028:6;14035:1;14028:9;;;;;;;;;;;;;;;;;;:24;;;13998:54;;14086:6;:13;14063:36;;14126:1;14114:13;;14109:1510;14129:17;;;14109:1510;;14408:14;14381:6;14388:1;14381:9;;;;;;;;;;;;;;;;;;;:24;;:41;14574:39;;14544:70;;14552:20;;14544:7;:70::i;:::-;14504:110;;14850:165;14884:6;14891:1;14884:9;;;;;;;;;;;;;;;;;;:26;;;14928:6;14935:1;14928:9;;;;;;;;;;;;;;;;;;:26;;;14972:29;14850:16;:165::i;:::-;14810:205;;15135:135;15169:6;15176:1;15169:9;;;;;;;;;;;;;;;;;;15196:29;15243:10;15254:1;15243:13;;;;;;;;;15135:135;15096:174;;15355:51;15370:16;15388:17;15355:14;:51::i;:::-;15506:39;;:63;-1:-1:-1;15502:107:8;;15589:5;;15502:107;14148:3;;;;;14109:1510;;;13764:1894;;;;;;;;;;;:::o;3268:1327:4:-;3423:30;;:::i;:::-;3497:26;;:::i;:::-;3587:20;3691:33;3807:30;3526:19;3539:5;3526:12;:19::i;:::-;3497:48;;3610:26;:24;:26::i;:::-;3587:49;;3727:70;3735:5;:22;;;3759:9;:37;;;3727:7;:70::i;:::-;3691:106;;3840:55;3847:20;3869:25;3840:6;:55::i;:::-;3807:88;;3934:186;3963:5;3982:9;4005:12;4031:20;4065:22;4101:9;3934:15;:186::i;:::-;4190:51;4211:5;4218:22;4190:20;:51::i;:::-;4176:65;;4294:181;4325:5;4344:12;4370:9;:19;;;4403:9;:37;;;4454:11;4294:17;:181::i;:::-;4514:45;4526:5;4533:12;4547:11;4514;:45::i;:::-;3268:1327;;;;;;;;;:::o;1710:1456:7:-;1924:21;;2014:23;;1924:35;:21;:35;1903:100;;;;;;;;;;;;;;2040:113;2058:94;2093:4;2111:13;2138:4;;2058:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:21:7;;-1:-1:-1;;;;;2058:94:7:i;:::-;2040:17;:113::i;:::-;2240:29;;;;:12;:29;;;;;;2014:139;;-1:-1:-1;2240:29:7;;2239:30;2218:92;;;;;;;;;;;;;;2396:27;;;2413:10;2396:27;2392:410;;2498:137;2536:15;2573:13;2608:9;;2498:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2498:16:7;;-1:-1:-1;;;;;2498:137:7:i;:::-;2473:216;;;;;;;;;;;;;;;;2754:21;:37;;;;;;;;;;2392:410;2843:29;;;;:12;:29;;;;;;;:36;;;;2875:4;2843:36;;;2910:32;2918:4;;2937;;;;2910:32;2937:4;;;;2910:32;;;;;;;;;;;;;;;;;;;;;;;;2889:95;;;;;;;;;;;;;;;;3072:27;;;3089:10;3072:27;3068:92;;3115:21;:34;;;;;;3068:92;1710:1456;;;;;;;:::o;1236:666:3:-;426:5:30;;1333:30:3;;;;;;426:5:30;;412:10;:19;391:85;;;;;;;;;;;;;;1378:10:3;1333:56;;1484:18;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1484:31:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1484:31:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1484:31:3;;;;;;;;;1553:26;;;;;;;:12;:26;;;;;;1462:53;;-1:-1:-1;1553:26:3;;;-1:-1:-1;1610:31:3;;1589:104;;;;;;;;;;;;;;1753:26;;;;;;;:12;:26;;;;;;;:47;;;;;;;;;;1815:80;;;;;1753:26;;1875:10;;1815:80;;;;;;;;;;1236:666;;;;:::o;5422:2261:4:-;5509:26;;:::i;:::-;5607:19;5620:5;5607:12;:19::i;:::-;5585;;;;:41;;;;5708:27;;;:6;:27;;;;;;;;5668:37;;;:67;6037:22;;;;:27;6033:157;;;6110:38;6104:45;6080:69;;;;6163:16;;6033:157;6503:22;;;;:27;6499:157;;;6576:38;6570:45;;6499:157;6750:22;;;;6709:37;;;;:63;6705:179;;6818:24;6812:31;;6705:179;7008:27;;;;6989:15;:46;6985:157;;7081:19;7075:26;;6985:157;7211:19;;;;;7201:30;;;;:9;:30;;;;;;;;;7197:143;;;7277:21;7271:28;;7197:143;7407:10;;;;7364:18;;7353:30;;;;;;;;:10;:30;;;;;;;;7384:19;;;;7353:51;;;;;;;;;;:64;7349:177;;;7463:21;7457:28;;7349:177;7629:20;7599:51;;;5422:2261;-1:-1:-1;5422:2261:4:o;4826:322::-;4934:26;;:::i;:::-;4963:19;4976:5;4963:12;:19::i;:::-;4934:48;;5021:35;5039:5;5046:9;5021:17;:35::i;:::-;5093:48;5114:5;5121:9;:19;;;5093:20;:48::i;:::-;4826:322;;:::o;1548:67::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;1779:27:17:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9547:1488:8:-;9731:35;;:::i;:::-;9782:27;9847:20;9898:9;10284:37;10475:36;;:::i;:::-;9812:6;9819:1;9812:9;;;;;;;;;;;;;;;;;;:24;;;9782:54;;9870:6;:13;9847:36;;9910:1;9898:13;;9893:1103;9913:17;;;9893:1103;;10187:14;10160:6;10167:1;10160:9;;;;;;;;;;;;;;;;;;:24;;:41;;;;10324:70;10332:20;10354:16;:39;;;10324:7;:70::i;:::-;10284:110;;10514:135;10548:6;10555:1;10548:9;;;;;;;;;;;;;;;;;;10575:29;10622:10;10633:1;10622:13;;;;;;;;;10514:135;10475:174;;10734:51;10749:16;10767:17;10734:14;:51::i;:::-;10883:39;;;;:63;-1:-1:-1;10879:107:8;;10966:5;;10879:107;9932:3;;;;;9893:1103;;1300:33:18;;;;:::o;11423:1880:8:-;11599:35;;:::i;:::-;11650:27;11715:20;11766:9;12156:37;12462;12748:36;;:::i;:::-;11680:6;11687:1;11680:9;;;;;;;;;;;;;;;;;;:24;;;11650:54;;11738:6;:13;11715:36;;11778:1;11766:13;;11761:1503;11781:17;;;11761:1503;;12060:14;12033:6;12040:1;12033:9;;;;;;;;;;;;;;;;;;;:24;;:41;12226:39;;12196:70;;12204:20;;12196:7;:70::i;:::-;12156:110;;12502:165;12536:6;12543:1;12536:9;;;;;;;;;12502:165;12462:205;;12787:128;12814:6;12821:1;12814:9;;;;;;;;;;;;;;;;;;12841:29;12888:10;12899:1;12888:13;;;;;;;;;12787:128;12748:167;;13000:51;13015:16;13033:17;13000:14;:51::i;:::-;13151:39;;:63;-1:-1:-1;13147:107:8;;13234:5;;13147:107;11800:3;;;;;11761:1503;;1065:36:7;;;;;;:::o;500:167:30:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1113:46:2:-;;;;;;;;;;;;;;;;;;;:::o;1772:648:20:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:20:o;5125:241:7:-;5256:21;;5208:7;;;;5256:35;:21;:35;:72;;5307:21;;;;5256:72;;;5294:10;5256:72;5231:97;5125:241;-1:-1:-1;;5125:241:7:o;4518:1075:5:-;5472:64;5480:9;:26;;;5508:10;:27;;;5472:7;:64::i;:::-;5392;5400:9;:26;;;5428:10;:27;;;5392:7;:64::i;:::-;:144;;5371:215;;;;;;;;;;;;;6329:3311;6601:59;;:::i;:::-;7557:37;7675:38;7796:34;7840:35;7597:68;7605:9;:26;;;7633:31;7597:7;:68::i;:::-;7557:108;;7716:70;7724:10;:27;;;7753:32;7716:7;:70::i;:::-;7675:111;;7985:68;7993:30;8025:10;:27;;;7985:7;:68::i;:::-;7902:67;7910:29;7941:10;:27;;;7902:7;:67::i;:::-;:151;7885:1080;;8175:29;8146:58;;8335:164;8369:10;:27;;;8414:10;:27;;;8459:26;8335:16;:164::i;:::-;8305:194;;7885:1080;;;8630:30;8600:60;;8789:165;8823:10;:27;;;8868:10;:27;;;8913;8789:16;:165::i;:::-;8760:194;;7885:1080;9050:93;9084:9;9107:26;9050:20;:93::i;:::-;9024:119;;9231:95;9265:10;9289:27;9231:20;:95::i;:::-;9204:24;;;;:122;;;9449:23;;:46;9509:47;;;9428:138;;9449:46;9428:7;:138::i;:::-;9380:45;;;:186;6329:3311;;;;;;;;;;:::o;9917:1727:4:-;10283:21;;:52;;10314:20;10283:52;10262:115;;;;;;;;;;;;;;10453:25;;;10432:92;;;;;;;;;;;;;;10596:19;;;;:33;;;10592:170;;10670:19;;;;:33;;10693:10;10670:33;10645:106;;;;;;;;;;;;;;10832:18;;;;:32;;;10828:169;;10927:12;10905:34;;:5;:18;;;:34;;;10880:106;;;;;;;;;;;;;;;;11079:37;;;;:42;11075:301;;;11162:146;11200:9;:19;;;11241:5;:18;;;11281:9;11162:16;:146::i;:::-;11137:228;;;;;;;;;;;;;;;;11448:149;11481:22;11521:5;:22;;;11561:5;:22;;;11448:15;:149::i;:::-;11447:150;11426:211;;;;;;;;;;;;;;9917:1727;;;;;;:::o;7926:792::-;8204:72;8212:27;8241:11;:34;;;8204:7;:72::i;:::-;8184:17;;;;:6;:17;;;;;;;;;:92;;;;8363:25;;;;8331:18;;8452:34;;8500;;;;8548:24;;;;8586;;;;8647:20;;;;8681;;;;8313:398;;8184:17;;8313:398;;;;;;;;;;;;;;8402:12;;8428:10;;8452:34;;8500;;8548:24;;8681:20;8313:398;;;;;;;;;;7926:792;;;;;:::o;10086:2233:5:-;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;10361:14;;10333:42;;10361:14;10333:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10419:202;10453:9;:24;;;10491:9;:22;;;10527:10;:23;;;10564:18;:24;;;:47;;;10419:20;:202::i;:::-;10665:25;;;;10704:23;;10741:22;;10777:23;;:46;;;10631:202;;10665:25;10704:23;10741:22;10631:20;:202::i;:::-;10843:189;10877:9;:24;;;10915:9;:22;;;10951:12;10977:18;:45;;;10843:20;:189::i;:::-;11065:185;11099:12;11125:9;:22;;;11161:9;:29;;;11204:18;:23;;;:36;;;11065:20;:185::i;:::-;11260:188;11294:12;11320:10;:23;;;11357:10;:30;;;11401:18;:24;;;:37;;;11260:20;:188::i;:::-;11518:10;:30;;;11485:63;;:9;:29;;;:63;;;11481:832;;;11564:301;11602:12;11632;11662:9;:29;;;11709:142;11738:18;:23;;;:36;;;11796:18;:24;;;:37;;;11709:7;:142::i;:::-;11564:20;:301::i;:::-;11481:832;;;11896:195;11934:12;11964;11994:9;:29;;;12041:18;:23;;;:36;;;11896:20;:195::i;:::-;12105:197;12143:12;12173;12203:10;:30;;;12251:18;:24;;;:37;;;12105:20;:197::i;:::-;10086:2233;;;;;:::o;1011:10099:16:-;5031:4;5025:11;;5321:66;5314:4;5291:28;;;5284:104;;;;1199:30;5445:4;5422:28;;6444:59;;;6770:19;;5736:26;;;6750:40;;;6883:23;;;6877:30;6853:22;;;6846:62;6979:23;;;6973:30;6949:22;;;6942:62;7082:23;;;7076:30;7052:22;;;7045:62;7197:4;7179:23;;7173:30;7149:22;;;7142:62;7297:4;7279:23;;7273:30;7249:22;;;7242:62;7397:4;7379:23;;7373:30;7349:22;;;7342:62;7495:4;7477:23;;7471:30;7447:22;;;7440:62;7594:5;7576:24;;7570:31;7545:23;;;7538:64;7699:5;7681:24;;7675:31;7650:23;;;7643:64;7787:5;7769:24;;7763:31;;7738:23;;;7731:64;;;7895:5;7877:24;;7871:31;7846:23;;;7839:64;7979:5;8106:74;;8268:24;8340:19;;7962:23;;;8544:34;;;5025:11;;5422:28;;;;6536:27;;;;5736:26;;8606:22;;;;8388:23;;;;8464:4;8445:24;;8441:35;6190:1;8698:237;8721:13;8718:1;8715:20;8698:237;;;8791:19;;8771:40;;8860:4;8843:22;;;;8898:23;;;;8749:1;8742:9;8698:237;;;-1:-1:-1;;;;9045:31:16;;;9029:13;9010:33;;;9003:74;;;;9171:17;;9165:24;9237:19;;9441:34;;;9037:4;9503:22;;;;9285:23;;;;9361:4;9342:24;;9338:35;9610:1;9596:237;9619:13;9616:1;9613:20;9596:237;;;9689:19;;9669:40;;9758:4;9741:22;;;;9796:23;;;;9647:1;9640:9;9596:237;;;-1:-1:-1;;;9902:46:16;;;-1:-1:-1;10133:33:16;;;10003:4;9981:27;;;10108:59;;;10281:19;;10472:34;;;9981:27;;10534:22;;;;10329:23;;;;10281:19;10405:4;10386:24;;10382:35;-1:-1:-1;10613:237:16;10636:13;10633:1;10630:20;10613:237;;;10706:19;;10686:40;;10775:4;10758:22;;;;10813:23;;;;10664:1;10657:9;10613:237;;;-1:-1:-1;;;10928:46:16;;;;;10902:73;;-1:-1:-1;11041:4:16;11034:25;-1:-1:-1;;;;;1011:10099:16;;;;;:::o;501:208:31:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;-1:-1:-1;697:5:31;;;501:208::o;8304:448:28:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:28;;;;;;;8304:448::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:28;13620:2;13718:13;13712:20;;13281:490::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:28;8947:482::o;937:331:21:-;1096:21;1149:82;1170:26;1178:9;1189:6;1170:7;:26::i;:::-;1210:11;1149:7;:82::i;:::-;1133:98;937:331;-1:-1:-1;;;;937:331:21:o;1370:135:31:-;1455:7;1489:1;1485;:5;:13;;1497:1;1485:13;;;-1:-1:-1;1493:1:31;;1478:20;-1:-1:-1;1370:135:31:o;12928:848:4:-;13079:30;;:::i;:::-;13174:34;;;:59;;;13346:22;;;;13382;;;;13280:134;;13211:22;;13280:16;:134::i;:::-;13243:171;;13517:22;;;;13553:14;;;;13451:126;;13481:22;;13451:16;:126::i;:::-;13424:24;;;:153;13680:22;;;;13716:14;;;;13614:126;;13644:22;;13614:16;:126::i;:::-;13587:24;;;:153;12928:848;;;;:::o;14086:932::-;14293:14;14265:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;:42;;14293:14;;14265:42;;14293:14;14265:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14317:170;14351:5;:20;;;14385:5;:18;;;14417:12;14443:11;:34;;;14317:20;:170::i;:::-;14497;14531:5;:20;;;14565:12;14591:5;:18;;;14623:11;:34;;;14497:20;:170::i;:::-;14677:165;14711:12;14737:5;:18;;;14769:5;:25;;;14808:11;:24;;;14677:20;:165::i;:::-;14852:159;14886:12;14912;14938:5;:25;;;14977:11;:24;;;14852:20;:159::i;:::-;14086:932;;;;:::o;3459:1222:7:-;1237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1237:146:7;;;;;;;;1227:157;;3623:14;;;;;;1237:146;;;;1227:157;;;;1237:146;1227:157;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1227:157:7;;;;;;;;;;;3740:15;;1227:157;;-1:-1:-1;3740:15:7;;-1:-1:-1;1227:157:7;;-1:-1:-1;1227:157:7;;3740:15;;;-1:-1:-1;3740:15:7;1227:157;3740:15;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3740:15:7;;;;;;;;;;;;4118:26;;;4244:15;;;4237:29;;;4389:42;4370:62;;4353:15;;;4346:87;;;;4483:2;4471:15;;4464:33;;;4638:3;4620:22;;;-1:-1:-1;3740:15:7;;-1:-1:-1;;;;3459:1222:7;;;;;;;;:::o;1833:924:18:-;1984:18;;2296:2;2290:9;2328:66;2313:82;;2445:1;2433:14;;2426:40;;;;2563:2;2551:15;;2544:35;;;;2715:2;2697:21;;;1833:924::o;4212:202:22:-;4301:17;4346:35;4364:16;4374:5;4364:9;:16::i;11841:816:4:-;12105:21;;12497:20;;12105:52;;12136:20;12105:52;12084:115;;;;;;;;;;;;;;12273:19;;;;:33;;;12269:170;;12347:19;;;;:33;;12370:10;12347:33;12322:106;;;;;;;;;;;;;;12520:26;:24;:26::i;:::-;12577:18;;12497:49;;-1:-1:-1;12577:34:4;;;;;;;12556:94;;;;;;;;;;;;;9020:422;9168:20;;;;:9;:20;;;;;;;:27;;;;9191:4;9168:27;;;9285:25;;;;9253:18;;9371:20;;;;9405;;;;9233:202;;9178:9;;9233:202;;;;;;;;;;;;;;9324:10;;9405:20;9233:202;;;;;;;;;;9020:422;;:::o;715:230:31:-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;937:1;930:8;;715:230;;;;;;:::o;50:288::-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:31;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;1507:560:21;1665:12;1693:17;1850:33;1739:11;1713:38;;;;;;;1728:9;1720:6;1713:38;1693:58;-1:-1:-1;1765:14:21;;1761:79;;;1802:5;1795:12;;;;1761:79;1886:98;1907:27;1915:9;1926:7;1907;:27::i;:::-;1948:26;1956:9;1967:6;1948:7;:26::i;:::-;1886:7;:98::i;:::-;2032:4;-1:-1:-1;2004:32:21;1507:560;-1:-1:-1;;;;;;1507:560:21:o;2561:5068:3:-;3031:19;3290:18;2797:1;2788:6;:10;2784:4839;;;2887:16;;2906:1;-1:-1:-1;2862:109:3;;;;;;;;;;;;;;-1:-1:-1;;3153:2:3;3138:18;;;3111:46;3179:66;3107:156;3311:26;;;;:12;:26;;;;;;;;;;3422:24;;;3397:109;;;;;;;;;;;;;;4923:2;4917:9;5239:15;5234:2;5222:9;5216:16;5212:25;5208:47;5392:14;5387:3;5383:24;5374:7;5370:38;5676:66;5667:7;5660:83;6160:3;6156:1;6147:7;6143:15;6136:28;6216:42;6210:4;6206:53;6201:2;6192:7;6188:16;6181:79;6310:42;6306:2;6302:51;6297:2;6288:7;6284:16;6277:77;6397:6;6391:3;6382:7;6378:17;6371:33;6563:3;6554:7;6550:17;6645:206;6665:5;6655:8;6652:19;6645:206;;;6714:16;;6697:34;;6778:2;6815:18;;;;6764:17;6645:206;;;7417:3;7346:7;7292;7285:5;7281:19;7208:7;7142:1;7067:10;7004:3;6978:512;7517:7;7510:15;7507:2;;;7564:16;7555:7;7548:33;7507:2;4724:2889;;;;;2561:5068;;;;;;:::o;10259:886:28:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:28;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;344:151:31:-;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:31:o;4554:1678:22:-;778:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:22;;;;;;;;768:468;;4640:14;;;;;;;;778:457;;;;;768:468;;;;778:457;768:468;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;768:468:22;;;;;;;;;;;4764:20;;;;4754:31;;768:468;;-1:-1:-1;4764:20:22;-1:-1:-1;768:468:22;;-1:-1:-1;768:468:22;;4754:31;;;-1:-1:-1;4754:31:22;768:468;4754:31;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;4754:31:22;;;;;;;;;;;4834:20;;;;4824:31;;4754;;-1:-1:-1;4834:20:22;-1:-1:-1;4754:31:22;;-1:-1:-1;4754:31:22;;4824;;;-1:-1:-1;4824:31:22;4754;4824;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;4824:31:22;;;;;;;;;;5621:14;;;5764:11;;5671:3;5660:15;;5801:11;;5711:3;5700:15;;;5838:11;;5904:24;;;5941:32;;;5986;;;6057:3;6041:20;;6110:19;;6142;;;-1:-1:-1;;;6174:19:22;;;-1:-1:-1;6041:20:22;;4554:1678;-1:-1:-1;4554:1678:22:o;931:616:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;931:616:2;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1640:707;;1750:4;1738:17;;1734:27;-1:-1;1724:2;;1775:1;1772;1765:12;1724:2;1812:6;1799:20;1834:80;1849:64;1906:6;1849:64;;1834:80;1825:89;;1931:5;1956:6;1949:5;1942:21;1986:4;1978:6;1974:17;1964:27;;2008:4;2003:3;1999:14;1992:21;;2061:6;2108:3;2100:4;2092:6;2088:17;2083:3;2079:27;2076:36;2073:2;;;2125:1;2122;2115:12;2073:2;2150:1;2135:206;2160:6;2157:1;2154:13;2135:206;;;2218:3;2240:37;2273:3;2261:10;2240:37;;;2228:50;;-1:-1;2301:4;2292:14;;;;2320;;;;;2182:1;2175:9;2135:206;;2355:112;;2419:43;2454:6;2441:20;2419:43;;2474:116;;2549:36;2577:6;2571:13;2549:36;;2597:118;;2664:46;2702:6;2689:20;2664:46;;2722:116;;2788:45;2825:6;2812:20;2788:45;;2845:120;;2922:38;2952:6;2946:13;2922:38;;2986:335;;;3093:4;3081:17;;3077:27;-1:-1;3067:2;;3118:1;3115;3108:12;3067:2;-1:-1;3138:20;;3178:18;3167:30;;3164:2;;;3210:1;3207;3200:12;3164:2;3244:4;3236:6;3232:17;3220:29;;3294:3;3287;3279:6;3275:16;3265:8;3261:31;3258:40;3255:2;;;3311:1;3308;3301:12;3255:2;3060:261;;;;;;3330:432;;3420:4;3408:17;;3404:27;-1:-1;3394:2;;3445:1;3442;3435:12;3394:2;3482:6;3469:20;3504:60;3519:44;3556:6;3519:44;;3504:60;3495:69;;3584:6;3577:5;3570:21;3620:4;3612:6;3608:17;3653:4;3646:5;3642:16;3688:3;3679:6;3674:3;3670:16;3667:25;3664:2;;;3705:1;3702;3695:12;3664:2;3715:41;3749:6;3744:3;3739;3715:41;;;3387:375;;;;;;;;4247:2205;;4355:5;4343:9;4338:3;4334:19;4330:31;4327:2;;;4374:1;4371;4364:12;4327:2;4392:21;4407:5;4392:21;;;4383:30;-1:-1;4471:1;4502:49;4547:3;4527:9;4502:49;;;4478:74;;-1:-1;4621:2;4654:49;4699:3;4675:22;;;4654:49;;;4647:4;4640:5;4636:16;4629:75;4573:142;4780:2;4813:49;4858:3;4849:6;4838:9;4834:22;4813:49;;;4806:4;4799:5;4795:16;4788:75;4725:149;4933:2;4966:49;5011:3;5002:6;4991:9;4987:22;4966:49;;;4959:4;4952:5;4948:16;4941:75;4884:143;5089:3;5123:49;5168:3;5159:6;5148:9;5144:22;5123:49;;;5116:4;5109:5;5105:16;5098:75;5037:147;5246:3;5280:49;5325:3;5316:6;5305:9;5301:22;5280:49;;;5273:4;5266:5;5262:16;5255:75;5194:147;5395:3;5429:49;5474:3;5465:6;5454:9;5450:22;5429:49;;;5422:4;5415:5;5411:16;5404:75;5351:139;5544:3;5578:49;5623:3;5614:6;5603:9;5599:22;5578:49;;;5571:4;5564:5;5560:16;5553:75;5500:139;5706:3;5741:49;5786:3;5777:6;5766:9;5762:22;5741:49;;;5733:5;5726;5722:17;5715:76;5649:153;5852:3;5887:49;5932:3;5923:6;5912:9;5908:22;5887:49;;;5879:5;5872;5868:17;5861:76;5812:136;6036:3;6025:9;6021:19;6008:33;6061:18;6053:6;6050:30;6047:2;;;6093:1;6090;6083:12;6047:2;6129:54;6179:3;6170:6;6159:9;6155:22;6129:54;;;6121:5;6114;6110:17;6103:81;5958:237;6283:3;6272:9;6268:19;6255:33;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:54;6426:3;6417:6;6406:9;6402:22;6376:54;;;6368:5;6361;6357:17;6350:81;6205:237;4321:2131;;;;;8828:241;;8932:2;8920:9;8911:7;8907:23;8903:32;8900:2;;;8948:1;8945;8938:12;8900:2;8983:1;9000:53;9045:7;9025:9;9000:53;;9076:366;;;9197:2;9185:9;9176:7;9172:23;9168:32;9165:2;;;9213:1;9210;9203:12;9165:2;9248:1;9265:53;9310:7;9290:9;9265:53;;;9255:63;;9227:97;9355:2;9373:53;9418:7;9409:6;9398:9;9394:22;9373:53;;;9363:63;;9334:98;9159:283;;;;;;9449:360;;;9567:2;9555:9;9546:7;9542:23;9538:32;9535:2;;;9583:1;9580;9573:12;9535:2;9618:1;9635:53;9680:7;9660:9;9635:53;;;9625:63;;9597:97;9725:2;9743:50;9785:7;9776:6;9765:9;9761:22;9743:50;;9816:415;;9964:2;9952:9;9943:7;9939:23;9935:32;9932:2;;;9980:1;9977;9970:12;9932:2;10015:31;;10066:18;10055:30;;10052:2;;;10098:1;10095;10088:12;10052:2;10118:97;10207:7;10198:6;10187:9;10183:22;10118:97;;10238:947;;;;10475:2;10463:9;10454:7;10450:23;10446:32;10443:2;;;10491:1;10488;10481:12;10443:2;10526:31;;10577:18;10566:30;;10563:2;;;10609:1;10606;10599:12;10563:2;10629:97;10718:7;10709:6;10698:9;10694:22;10629:97;;;10619:107;;10505:227;10791:2;10780:9;10776:18;10763:32;10815:18;10807:6;10804:30;10801:2;;;10847:1;10844;10837:12;10801:2;10867:78;10937:7;10928:6;10917:9;10913:22;10867:78;;;10857:88;;10742:209;11010:2;10999:9;10995:18;10982:32;11034:18;11026:6;11023:30;11020:2;;;11066:1;11063;11056:12;11020:2;11086:83;11161:7;11152:6;11141:9;11137:22;11086:83;;;11076:93;;10961:214;10437:748;;;;;;11192:811;;;;11404:2;11392:9;11383:7;11379:23;11375:32;11372:2;;;11420:1;11417;11410:12;11372:2;11455:31;;11506:18;11495:30;;11492:2;;;11538:1;11535;11528:12;11492:2;11558:97;11647:7;11638:6;11627:9;11623:22;11558:97;;;11548:107;;11434:227;11692:2;11710:53;11755:7;11746:6;11735:9;11731:22;11710:53;;12010:257;;12122:2;12110:9;12101:7;12097:23;12093:32;12090:2;;;12138:1;12135;12128:12;12090:2;12173:1;12190:61;12243:7;12223:9;12190:61;;12274:241;;12378:2;12366:9;12357:7;12353:23;12349:32;12346:2;;;12394:1;12391;12384:12;12346:2;12429:1;12446:53;12491:7;12471:9;12446:53;;12522:366;;;12643:2;12631:9;12622:7;12618:23;12614:32;12611:2;;;12659:1;12656;12649:12;12611:2;12694:1;12711:53;12756:7;12736:9;12711:53;;12895:615;;;;;13052:2;13040:9;13031:7;13027:23;13023:32;13020:2;;;13068:1;13065;13058:12;13020:2;13103:1;13120:53;13165:7;13145:9;13120:53;;;13110:63;;13082:97;13210:2;13228:53;13273:7;13264:6;13253:9;13249:22;13228:53;;;13218:63;;13189:98;13346:2;13335:9;13331:18;13318:32;13370:18;13362:6;13359:30;13356:2;;;13402:1;13399;13392:12;13356:2;13430:64;13486:7;13477:6;13466:9;13462:22;13430:64;;;13014:496;;;;-1:-1;13412:82;-1:-1;;;;13014:496;13517:595;;;;13664:2;13652:9;13643:7;13639:23;13635:32;13632:2;;;13680:1;13677;13670:12;13632:2;13715:1;13732:53;13777:7;13757:9;13732:53;;;13722:63;;13694:97;13822:2;13840:53;13885:7;13876:6;13865:9;13861:22;13840:53;;;13830:63;;13801:98;13958:2;13947:9;13943:18;13930:32;13982:18;13974:6;13971:30;13968:2;;;14014:1;14011;14004:12;13968:2;14034:62;14088:7;14079:6;14068:9;14064:22;14034:62;;14119:239;;14222:2;14210:9;14201:7;14197:23;14193:32;14190:2;;;14238:1;14235;14228:12;14190:2;14273:1;14290:52;14334:7;14314:9;14290:52;;14365:261;;14479:2;14467:9;14458:7;14454:23;14450:32;14447:2;;;14495:1;14492;14485:12;14447:2;14530:1;14547:63;14602:7;14582:9;14547:63;;14633:373;;14760:2;14748:9;14739:7;14735:23;14731:32;14728:2;;;14776:1;14773;14766:12;14728:2;14811:31;;14862:18;14851:30;;14848:2;;;14894:1;14891;14884:12;14848:2;14914:76;14982:7;14973:6;14962:9;14958:22;14914:76;;15013:1089;;;;;15232:3;15220:9;15211:7;15207:23;15203:33;15200:2;;;15249:1;15246;15239:12;15200:2;15284:31;;15335:18;15324:30;;15321:2;;;15367:1;15364;15357:12;15321:2;15387:76;15455:7;15446:6;15435:9;15431:22;15387:76;;;15377:86;;15263:206;15528:2;15517:9;15513:18;15500:32;15552:18;15544:6;15541:30;15538:2;;;15584:1;15581;15574:12;15538:2;15604:76;15672:7;15663:6;15652:9;15648:22;15604:76;;;15594:86;;15479:207;15745:2;15734:9;15730:18;15717:32;15769:18;15761:6;15758:30;15755:2;;;15801:1;15798;15791:12;15755:2;15821:62;15875:7;15866:6;15855:9;15851:22;15821:62;;;15811:72;;15696:193;15948:2;15937:9;15933:18;15920:32;15972:18;15964:6;15961:30;15958:2;;;16004:1;16001;15994:12;15958:2;16024:62;16078:7;16069:6;16058:9;16054:22;16024:62;;;16014:72;;15899:193;15194:908;;;;;;;;16109:727;;;;16279:2;16267:9;16258:7;16254:23;16250:32;16247:2;;;16295:1;16292;16285:12;16247:2;16330:31;;16381:18;16370:30;;16367:2;;;16413:1;16410;16403:12;16367:2;16433:76;16501:7;16492:6;16481:9;16477:22;16433:76;;;16423:86;;16309:206;16546:2;16564:53;16609:7;16600:6;16589:9;16585:22;16564:53;;17091:865;;;;;;;17284:3;17272:9;17263:7;17259:23;17255:33;17252:2;;;17301:1;17298;17291:12;17252:2;17336:1;17353:53;17398:7;17378:9;17353:53;;;17343:63;;17315:97;17443:2;17461:53;17506:7;17497:6;17486:9;17482:22;17461:53;;;17451:63;;17422:98;17579:2;17568:9;17564:18;17551:32;17603:18;17595:6;17592:30;17589:2;;;17635:1;17632;17625:12;17589:2;17663:64;17719:7;17710:6;17699:9;17695:22;17663:64;;;17645:82;;;;17530:203;17792:2;17781:9;17777:18;17764:32;17816:18;17808:6;17805:30;17802:2;;;17848:1;17845;17838:12;17802:2;17876:64;17932:7;17923:6;17912:9;17908:22;17876:64;;;17858:82;;;;17743:203;17246:710;;;;;;;;;17963:110;18036:31;18061:5;18036:31;;;18031:3;18024:44;18018:55;;;18147:755;;18328:77;18399:5;18328:77;;;18423:6;18418:3;18411:19;18447:4;18442:3;18438:14;18431:21;;18492:79;18565:5;18492:79;;;18592:1;18577:303;18602:6;18599:1;18596:13;18577:303;;;18642:103;18741:3;18732:6;18726:13;18642:103;;;18762:83;18838:6;18762:83;;;18868:4;18859:14;;;;;18752:93;-1:-1;18624:1;18617:9;18577:303;;;-1:-1;18893:3;;18307:595;-1:-1;;;;18307:595;18910:101;18977:28;18999:5;18977:28;;19018:110;19091:31;19116:5;19091:31;;19135:107;19206:30;19230:5;19206:30;;19249:297;;19349:38;19381:5;19349:38;;;19404:6;19399:3;19392:19;19416:63;19472:6;19465:4;19460:3;19456:14;19449:4;19442:5;19438:16;19416:63;;;19511:29;19533:6;19511:29;;;19491:50;;;19504:4;19491:50;;19329:217;-1:-1;;;19329:217;19849:156;19942:57;19993:5;19942:57;;20312:296;20467:2;20455:15;;20504:66;20499:2;20490:12;;20483:88;20599:2;20590:12;;20448:160;20617:296;20772:2;20760:15;;20809:66;20804:2;20795:12;;20788:88;20904:2;20895:12;;20753:160;20922:296;21077:2;21065:15;;21114:66;21109:2;21100:12;;21093:88;21209:2;21200:12;;21058:160;21227:296;21382:2;21370:15;;21419:66;21414:2;21405:12;;21398:88;21514:2;21505:12;;21363:160;21532:397;21687:2;21675:15;;21724:66;21719:2;21710:12;;21703:88;21825:66;21820:2;21811:12;;21804:88;21920:2;21911:12;;21668:261;21938:296;22093:2;22081:15;;22130:66;22125:2;22116:12;;22109:88;22225:2;22216:12;;22074:160;22243:296;22398:2;22386:15;;22435:66;22430:2;22421:12;;22414:88;22530:2;22521:12;;22379:160;22548:296;22703:2;22691:15;;22740:66;22735:2;22726:12;;22719:88;22835:2;22826:12;;22684:160;22853:296;23008:2;22996:15;;23045:66;23040:2;23031:12;;23024:88;23140:2;23131:12;;22989:160;23158:296;23313:2;23301:15;;23350:66;23345:2;23336:12;;23329:88;23445:2;23436:12;;23294:160;23463:296;23618:2;23606:15;;23655:66;23650:2;23641:12;;23634:88;23750:2;23741:12;;23599:160;23768:296;23923:2;23911:15;;23960:66;23955:2;23946:12;;23939:88;24055:2;24046:12;;23904:160;24073:296;24228:2;24216:15;;24265:66;24260:2;24251:12;;24244:88;24360:2;24351:12;;24209:160;24378:296;24533:2;24521:15;;24570:66;24565:2;24556:12;;24549:88;24665:2;24656:12;;24514:160;24683:296;24838:2;24826:15;;24875:66;24870:2;24861:12;;24854:88;24970:2;24961:12;;24819:160;24988:397;25143:2;25131:15;;25180:66;25175:2;25166:12;;25159:88;25281:66;25276:2;25267:12;;25260:88;25376:2;25367:12;;25124:261;25394:296;25549:2;25537:15;;25586:66;25581:2;25572:12;;25565:88;25681:2;25672:12;;25530:160;25699:296;25854:2;25842:15;;25891:66;25886:2;25877:12;;25870:88;25986:2;25977:12;;25835:160;26004:296;26159:2;26147:15;;26196:66;26191:2;26182:12;;26175:88;26291:2;26282:12;;26140:160;26309:296;26464:2;26452:15;;26501:66;26496:2;26487:12;;26480:88;26596:2;26587:12;;26445:160;26614:296;26769:2;26757:15;;26806:66;26801:2;26792:12;;26785:88;26901:2;26892:12;;26750:160;26919:296;27074:2;27062:15;;27111:66;27106:2;27097:12;;27090:88;27206:2;27197:12;;27055:160;27224:296;27379:2;27367:15;;27416:66;27411:2;27402:12;;27395:88;27511:2;27502:12;;27360:160;27529:397;27684:2;27672:15;;27721:66;27716:2;27707:12;;27700:88;27822:66;27817:2;27808:12;;27801:88;27917:2;27908:12;;27665:261;27935:296;28090:2;28078:15;;28127:66;28122:2;28113:12;;28106:88;28222:2;28213:12;;28071:160;28240:296;28395:2;28383:15;;28432:66;28427:2;28418:12;;28411:88;28527:2;28518:12;;28376:160;28545:296;28700:2;28688:15;;28737:66;28732:2;28723:12;;28716:88;28832:2;28823:12;;28681:160;28850:296;29005:2;28993:15;;29042:66;29037:2;29028:12;;29021:88;29137:2;29128:12;;28986:160;29155:296;29310:2;29298:15;;29347:66;29342:2;29333:12;;29326:88;29442:2;29433:12;;29291:160;29536:888;29764:22;;29677:4;29668:14;;;29798:61;29672:3;29764:22;29798:61;;;29697:174;29965:4;29958:5;29954:16;29948:23;29983:62;30039:4;30034:3;30030:14;30017:11;29983:62;;;29881:176;30141:4;30134:5;30130:16;30124:23;30159:62;30215:4;30210:3;30206:14;30193:11;30159:62;;;30067:166;30317:4;30310:5;30306:16;30300:23;30335:62;30391:4;30386:3;30382:14;30369:11;30335:62;;31490:815;31715:22;;31645:5;31636:15;;;31749:115;31640:3;31715:22;31749:115;;;31666:210;31953:4;31946:5;31942:16;31936:23;31971:116;32081:4;32076:3;32072:14;32059:11;31971:116;;;31886:213;32197:4;32190:5;32186:16;32180:23;32215:63;32271:5;32266:3;32262:15;32249:11;32215:63;;32373:695;32586:22;;32510:4;32501:14;;;32620:57;32505:3;32586:22;32620:57;;;32530:159;32770:4;32763:5;32759:16;32753:23;32788:62;32844:4;32839:3;32835:14;32822:11;32788:62;;;32699:163;32961:4;32954:5;32950:16;32944:23;32979:62;33035:4;33030:3;33026:14;33013:11;32979:62;;33951:104;34020:29;34043:5;34020:29;;34062:193;34170:2;34155:18;;34184:61;34159:9;34218:6;34184:61;;34262:1057;34594:3;34579:19;;34609:61;34583:9;34643:6;34609:61;;;34681:62;34739:2;34728:9;34724:18;34715:6;34681:62;;;34754;34812:2;34801:9;34797:18;34788:6;34754:62;;;34827;34885:2;34874:9;34870:18;34861:6;34827:62;;;34900:63;34958:3;34947:9;34943:19;34934:6;34900:63;;;34974;35032:3;35021:9;35017:19;35008:6;34974:63;;;35086:9;35080:4;35076:20;35070:3;35059:9;35055:19;35048:49;35111:62;35168:4;35159:6;35111:62;;;35103:70;;35222:9;35216:4;35212:20;35206:3;35195:9;35191:19;35184:49;35247:62;35304:4;35295:6;35247:62;;;35239:70;34565:754;-1:-1;;;;;;;;;;34565:754;35326:547;35518:2;35503:18;;35532:61;35507:9;35566:6;35532:61;;;35641:9;35635:4;35631:20;35626:2;35615:9;35611:18;35604:48;35666:62;35723:4;35714:6;35666:62;;;35658:70;;35776:9;35770:4;35766:20;35761:2;35750:9;35746:18;35739:48;35801:62;35858:4;35849:6;35801:62;;;35793:70;35489:384;-1:-1;;;;;35489:384;35880:433;36084:2;36098:47;;;36069:18;;36159:144;36069:18;36289:6;36159:144;;36320:181;36422:2;36407:18;;36436:55;36411:9;36464:6;36436:55;;36508:193;36616:2;36601:18;;36630:61;36605:9;36664:6;36630:61;;36708:479;36890:2;36875:18;;36904:61;36879:9;36938:6;36904:61;;;36976:62;37034:2;37023:9;37019:18;37010:6;36976:62;;;37086:9;37080:4;37076:20;37071:2;37060:9;37056:18;37049:48;37111:66;37172:4;37163:6;37111:66;;37194:378;37348:2;37333:18;;37362:61;37337:9;37396:6;37362:61;;;37471:9;37465:4;37461:20;37456:2;37445:9;37441:18;37434:48;37496:66;37557:4;37548:6;37496:66;;37579:489;37767:3;37752:19;;37782:61;37756:9;37816:6;37782:61;;;37854:58;37908:2;37897:9;37893:18;37884:6;37854:58;;;37923:62;37981:2;37970:9;37966:18;37957:6;37923:62;;;37996;38054:2;38043:9;38039:18;38030:6;37996:62;;38075:290;38209:2;38194:18;;38223:59;38198:9;38255:6;38223:59;;;38293:62;38351:2;38340:9;38336:18;38327:6;38293:62;;38372:269;38494:2;38508:47;;;38479:18;;38569:62;38479:18;38617:6;38569:62;;38648:233;38776:2;38761:18;;38790:81;38765:9;38844:6;38790:81;;39168:387;39349:2;39363:47;;;39334:18;;39424:121;39334:18;39424:121;;39562:387;39743:2;39757:47;;;39728:18;;39818:121;39728:18;39818:121;;39956:387;40137:2;40151:47;;;40122:18;;40212:121;40122:18;40212:121;;40350:387;40531:2;40545:47;;;40516:18;;40606:121;40516:18;40606:121;;40744:387;40925:2;40939:47;;;40910:18;;41000:121;40910:18;41000:121;;41138:387;41319:2;41333:47;;;41304:18;;41394:121;41304:18;41394:121;;41532:387;41713:2;41727:47;;;41698:18;;41788:121;41698:18;41788:121;;41926:387;42107:2;42121:47;;;42092:18;;42182:121;42092:18;42182:121;;42320:387;42501:2;42515:47;;;42486:18;;42576:121;42486:18;42576:121;;42714:387;42895:2;42909:47;;;42880:18;;42970:121;42880:18;42970:121;;43108:387;43289:2;43303:47;;;43274:18;;43364:121;43274:18;43364:121;;43502:387;43683:2;43697:47;;;43668:18;;43758:121;43668:18;43758:121;;43896:387;44077:2;44091:47;;;44062:18;;44152:121;44062:18;44152:121;;44290:387;44471:2;44485:47;;;44456:18;;44546:121;44456:18;44546:121;;44684:387;44865:2;44879:47;;;44850:18;;44940:121;44850:18;44940:121;;45078:387;45259:2;45273:47;;;45244:18;;45334:121;45244:18;45334:121;;45472:387;45653:2;45667:47;;;45638:18;;45728:121;45638:18;45728:121;;45866:387;46047:2;46061:47;;;46032:18;;46122:121;46032:18;46122:121;;46260:387;46441:2;46455:47;;;46426:18;;46516:121;46426:18;46516:121;;46654:387;46835:2;46849:47;;;46820:18;;46910:121;46820:18;46910:121;;47048:387;47229:2;47243:47;;;47214:18;;47304:121;47214:18;47304:121;;47442:387;47623:2;47637:47;;;47608:18;;47698:121;47608:18;47698:121;;47836:387;48017:2;48031:47;;;48002:18;;48092:121;48002:18;48092:121;;48230:387;48411:2;48425:47;;;48396:18;;48486:121;48396:18;48486:121;;48624:387;48805:2;48819:47;;;48790:18;;48880:121;48790:18;48880:121;;49018:387;49199:2;49213:47;;;49184:18;;49274:121;49184:18;49274:121;;49412:387;49593:2;49607:47;;;49578:18;;49668:121;49578:18;49668:121;;49806:387;49987:2;50001:47;;;49972:18;;50062:121;49972:18;50062:121;;50200:387;50381:2;50395:47;;;50366:18;;50456:121;50366:18;50456:121;;50594:310;50760:3;50745:19;;50775:119;50749:9;50867:6;50775:119;;50911:338;51091:3;51076:19;;51106:133;51080:9;51212:6;51106:133;;51256:301;51418:2;51403:18;;51432:115;51407:9;51520:6;51432:115;;51764:256;51826:2;51820:9;51852:17;;;51927:18;51912:34;;51948:22;;;51909:62;51906:2;;;51984:1;51981;51974:12;51906:2;52000;51993:22;51804:216;;-1:-1;51804:216;52027:263;;52191:18;52183:6;52180:30;52177:2;;;52223:1;52220;52213:12;52177:2;-1:-1;52252:4;52240:17;;;52270:15;;52114:176;52846:254;;52985:18;52977:6;52974:30;52971:2;;;53017:1;53014;53007:12;52971:2;-1:-1;53090:4;53061;53038:17;;;;53057:9;53034:33;53080:15;;52908:192;53374:144;53506:4;53494:17;;53475:43;53527:130;53640:12;;53624:33;54105:128;54185:42;54174:54;;54157:76;54240:92;54313:13;54306:21;;54289:43;54339:79;54408:5;54391:27;54425:151;54504:66;54493:78;;54476:100;54669:88;54747:4;54736:16;;54719:38;55328:135;;55427:31;55452:5;55427:31;;55471:145;55552:6;55547:3;55542;55529:30;-1:-1;55608:1;55590:16;;55583:27;55522:94;55625:268;55690:1;55697:101;55711:6;55708:1;55705:13;55697:101;;;55778:11;;;55772:18;55759:11;;;55752:39;55733:2;55726:10;55697:101;;;55813:6;55810:1;55807:13;55804:2;;;-1:-1;;55878:1;55860:16;;55853:27;55674:219;55901:97;55989:2;55969:14;55985:7;55965:28;;55949:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/Exchange.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/MixinExchangeCore.sol": {
+ "id": 4
+ },
+ "2.0.0/protocol/Exchange/MixinMatchOrders.sol": {
+ "id": 5
+ },
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.sol": {
+ "id": 6
+ },
+ "2.0.0/protocol/Exchange/MixinTransactions.sol": {
+ "id": 7
+ },
+ "2.0.0/protocol/Exchange/MixinWrapperFunctions.sol": {
+ "id": 8
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 9
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 10
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 11
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 12
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 13
+ },
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 14
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 15
+ },
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol": {
+ "id": 16
+ },
+ "2.0.0/protocol/Exchange/libs/LibConstants.sol": {
+ "id": 17
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 18
+ },
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol": {
+ "id": 19
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 20
+ },
+ "2.0.0/protocol/Exchange/libs/LibMath.sol": {
+ "id": 21
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 22
+ },
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol": {
+ "id": 23
+ },
+ "2.0.0/protocol/Exchange/mixins/MExchangeCore.sol": {
+ "id": 24
+ },
+ "2.0.0/protocol/Exchange/mixins/MMatchOrders.sol": {
+ "id": 25
+ },
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol": {
+ "id": 26
+ },
+ "2.0.0/protocol/Exchange/mixins/MTransactions.sol": {
+ "id": 27
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 28
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 29
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 30
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 31
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.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 solidity 0.4.24;\n\nimport \"./IAuthorizable.sol\";\n\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/Exchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinExchangeCore.sol\";\nimport \"./MixinSignatureValidator.sol\";\nimport \"./MixinWrapperFunctions.sol\";\nimport \"./MixinAssetProxyDispatcher.sol\";\nimport \"./MixinTransactions.sol\";\nimport \"./MixinMatchOrders.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Exchange is\n MixinExchangeCore,\n MixinMatchOrders,\n MixinSignatureValidator,\n MixinTransactions,\n MixinAssetProxyDispatcher,\n MixinWrapperFunctions\n{\n\n string constant public VERSION = \"2.0.1-alpha\";\n\n // Mixins are instantiated in the order they are inherited\n constructor (bytes memory _zrxAssetData)\n public\n LibConstants(_zrxAssetData) // @TODO: Remove when we deploy.\n MixinExchangeCore()\n MixinMatchOrders()\n MixinSignatureValidator()\n MixinTransactions()\n MixinAssetProxyDispatcher()\n MixinWrapperFunctions()\n {}\n}\n",
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\nimport \"../AssetProxy/interfaces/IAssetProxy.sol\";\n\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n MAssetProxyDispatcher\n{\n using LibBytes for bytes;\n \n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => IAssetProxy) public assetProxies;\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external\n onlyOwner\n {\n IAssetProxy assetProxyContract = IAssetProxy(assetProxy);\n\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = assetProxyContract.getProxyId();\n address currentAssetProxy = assetProxies[assetProxyId];\n require(\n currentAssetProxy == address(0),\n \"ASSET_PROXY_ALREADY_EXISTS\"\n );\n\n // Add asset proxy and log registration.\n assetProxies[assetProxyId] = assetProxyContract;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address)\n {\n return assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n // Ensure assetData length is valid\n require(\n assetData.length > 3,\n \"LENGTH_GREATER_THAN_3_REQUIRED\"\n );\n \n // Lookup assetProxy\n bytes4 assetProxyId;\n assembly {\n assetProxyId := and(mload(\n add(assetData, 32)),\n 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000\n )\n }\n address assetProxy = assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n require(\n assetProxy != address(0),\n \"ASSET_PROXY_DOES_NOT_EXIST\"\n );\n \n // We construct calldata for the `assetProxy.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n\n assembly {\n /////// Setup State ///////\n // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).\n let cdStart := mload(64)\n // `dataAreaLength` is the total number of words needed to store `assetData`\n // As-per the ABI spec, this value is padded up to the nearest multiple of 32,\n // and includes 32-bytes for length.\n let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)\n // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.\n let cdEnd := add(cdStart, add(132, dataAreaLength))\n\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFromSelector`.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.\n // Notes:\n // 1. The offset to `assetData` is the length of the Params Area (128 bytes).\n // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.\n mstore(add(cdStart, 4), 128)\n mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 100), amount)\n \n /////// Setup Data Area ///////\n // This area holds `assetData`.\n let dataArea := add(cdStart, 132)\n // solhint-disable-next-line no-empty-blocks\n for {} lt(dataArea, cdEnd) {} {\n mstore(dataArea, mload(assetData))\n dataArea := add(dataArea, 32)\n assetData := add(assetData, 32)\n }\n\n /////// Call `assetProxy.transferFrom` using the constructed calldata ///////\n let success := call(\n gas, // forward all gas\n assetProxy, // call address of asset proxy\n 0, // don't send any ETH\n cdStart, // pointer to start of input\n sub(cdEnd, cdStart), // length of input \n cdStart, // write output over input\n 512 // reserve 512 bytes for output\n )\n if iszero(success) {\n revert(cdStart, returndatasize())\n }\n }\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinExchangeCore is\n LibConstants,\n LibMath,\n LibOrder,\n LibFillResults,\n MAssetProxyDispatcher,\n MExchangeCore,\n MSignatureValidator,\n MTransactions\n{\n // Mapping of orderHash => amount of takerAsset already bought by maker\n mapping (bytes32 => uint256) public filled;\n\n // Mapping of orderHash => cancelled\n mapping (bytes32 => bool) public cancelled;\n\n // Mapping of makerAddress => senderAddress => lowest salt an order can have in order to be fillable\n // Orders with specified senderAddress and with a salt less than their epoch are considered cancelled\n mapping (address => mapping (address => uint256)) public orderEpoch;\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external\n {\n address makerAddress = getCurrentContextAddress();\n // If this function is called via `executeTransaction`, we only update the orderEpoch for the makerAddress/msg.sender combination.\n // This allows external filter contracts to add rules to how orders are cancelled via this function.\n address senderAddress = makerAddress == msg.sender ? address(0) : msg.sender;\n\n // orderEpoch is initialized to 0, so to cancelUpTo we need salt + 1\n uint256 newOrderEpoch = targetOrderEpoch + 1; \n uint256 oldOrderEpoch = orderEpoch[makerAddress][senderAddress];\n\n // Ensure orderEpoch is monotonically increasing\n require(\n newOrderEpoch > oldOrderEpoch, \n \"INVALID_NEW_ORDER_EPOCH\"\n );\n\n // Update orderEpoch\n orderEpoch[makerAddress][senderAddress] = newOrderEpoch;\n emit CancelUpTo(makerAddress, senderAddress, newOrderEpoch);\n }\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // Fetch order info\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Get amount of takerAsset to fill\n uint256 remainingTakerAssetAmount = safeSub(order.takerAssetAmount, orderInfo.orderTakerAssetFilledAmount);\n uint256 takerAssetFilledAmount = min256(takerAssetFillAmount, remainingTakerAssetAmount);\n\n // Validate context\n assertValidFill(\n order,\n orderInfo,\n takerAddress,\n takerAssetFillAmount,\n takerAssetFilledAmount,\n signature\n );\n\n // Compute proportional fill amounts\n fillResults = calculateFillResults(order, takerAssetFilledAmount);\n\n // Update exchange internal state\n updateFilledState(\n order,\n takerAddress,\n orderInfo.orderHash,\n orderInfo.orderTakerAssetFilledAmount,\n fillResults\n );\n \n // Settle order\n settleOrder(order, takerAddress, fillResults);\n\n return fillResults;\n }\n\n /// @dev After calling, the order can not be filled anymore.\n /// Throws if order is invalid or sender does not have permission to cancel.\n /// @param order Order to cancel. Order must be OrderStatus.FILLABLE.\n function cancelOrder(Order memory order)\n public\n {\n // Fetch current order status\n OrderInfo memory orderInfo = getOrderInfo(order);\n\n // Validate context\n assertValidCancel(order, orderInfo);\n\n // Perform cancel\n updateCancelledState(order, orderInfo.orderHash);\n }\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(Order memory order)\n public\n view\n returns (OrderInfo memory orderInfo)\n {\n // Compute the order hash\n orderInfo.orderHash = getOrderHash(order);\n\n // Fetch filled amount\n orderInfo.orderTakerAssetFilledAmount = filled[orderInfo.orderHash];\n\n // If order.makerAssetAmount is zero, we also reject the order.\n // While the Exchange contract handles them correctly, they create\n // edge cases in the supporting infrastructure because they have\n // an 'infinite' price when computed by a simple division.\n if (order.makerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_MAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // If order.takerAssetAmount is zero, then the order will always\n // be considered filled because 0 == takerAssetAmount == orderTakerAssetFilledAmount\n // Instead of distinguishing between unfilled and filled zero taker\n // amount orders, we choose not to support them.\n if (order.takerAssetAmount == 0) {\n orderInfo.orderStatus = uint8(OrderStatus.INVALID_TAKER_ASSET_AMOUNT);\n return orderInfo;\n }\n\n // Validate order availability\n if (orderInfo.orderTakerAssetFilledAmount >= order.takerAssetAmount) {\n orderInfo.orderStatus = uint8(OrderStatus.FULLY_FILLED);\n return orderInfo;\n }\n\n // Validate order expiration\n // solhint-disable-next-line not-rely-on-time\n if (block.timestamp >= order.expirationTimeSeconds) {\n orderInfo.orderStatus = uint8(OrderStatus.EXPIRED);\n return orderInfo;\n }\n\n // Check if order has been cancelled\n if (cancelled[orderInfo.orderHash]) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n if (orderEpoch[order.makerAddress][order.senderAddress] > order.salt) {\n orderInfo.orderStatus = uint8(OrderStatus.CANCELLED);\n return orderInfo;\n }\n\n // All other statuses are ruled out: order is Fillable\n orderInfo.orderStatus = uint8(OrderStatus.FILLABLE);\n return orderInfo;\n }\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n function updateFilledState(\n Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n FillResults memory fillResults\n )\n internal\n {\n // Update state\n filled[orderHash] = safeAdd(orderTakerAssetFilledAmount, fillResults.takerAssetFilledAmount);\n\n // Log order\n emit Fill(\n order.makerAddress,\n order.feeRecipientAddress,\n takerAddress,\n msg.sender,\n fillResults.makerAssetFilledAmount,\n fillResults.takerAssetFilledAmount,\n fillResults.makerFeePaid,\n fillResults.takerFeePaid,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n Order memory order,\n bytes32 orderHash\n )\n internal\n {\n // Perform cancel\n cancelled[orderHash] = true;\n\n // Log cancel\n emit Cancel(\n order.makerAddress,\n order.feeRecipientAddress,\n msg.sender,\n orderHash,\n order.makerAssetData,\n order.takerAssetData\n );\n }\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n Order memory order,\n OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view\n {\n // An order can only be filled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Revert if fill amount is invalid\n require(\n takerAssetFillAmount != 0,\n \"INVALID_TAKER_AMOUNT\"\n );\n\n // Validate sender is allowed to fill this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate taker is allowed to fill this order\n if (order.takerAddress != address(0)) {\n require(\n order.takerAddress == takerAddress,\n \"INVALID_TAKER\"\n );\n }\n\n // Validate Maker signature (check only if first time seen)\n if (orderInfo.orderTakerAssetFilledAmount == 0) {\n require(\n isValidSignature(\n orderInfo.orderHash,\n order.makerAddress,\n signature\n ),\n \"INVALID_ORDER_SIGNATURE\"\n );\n }\n\n // Validate fill order rounding\n require(\n !isRoundingError(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n ),\n \"ROUNDING_ERROR\"\n );\n }\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n Order memory order,\n OrderInfo memory orderInfo\n )\n internal\n view\n {\n // Ensure order is valid\n // An order can only be cancelled if its status is FILLABLE.\n require(\n orderInfo.orderStatus == uint8(OrderStatus.FILLABLE),\n \"ORDER_UNFILLABLE\"\n );\n\n // Validate sender is allowed to cancel this order\n if (order.senderAddress != address(0)) {\n require(\n order.senderAddress == msg.sender,\n \"INVALID_SENDER\"\n );\n }\n\n // Validate transaction signed by maker\n address makerAddress = getCurrentContextAddress();\n require(\n order.makerAddress == makerAddress,\n \"INVALID_MAKER\"\n );\n }\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (FillResults memory fillResults)\n {\n // Compute proportional transfer amounts\n fillResults.takerAssetFilledAmount = takerAssetFilledAmount;\n fillResults.makerAssetFilledAmount = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerAssetAmount\n );\n fillResults.makerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.makerFee\n );\n fillResults.takerFeePaid = getPartialAmount(\n takerAssetFilledAmount,\n order.takerAssetAmount,\n order.takerFee\n );\n\n return fillResults;\n }\n\n /// @dev Settles an order by transferring assets between counterparties.\n /// @param order Order struct containing order specifications.\n /// @param takerAddress Address selling takerAsset and buying makerAsset.\n /// @param fillResults Amounts to be filled and fees paid by maker and taker.\n function settleOrder(\n LibOrder.Order memory order,\n address takerAddress,\n LibFillResults.FillResults memory fillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n dispatchTransferFrom(\n order.makerAssetData,\n order.makerAddress,\n takerAddress,\n fillResults.makerAssetFilledAmount\n );\n dispatchTransferFrom(\n order.takerAssetData,\n takerAddress,\n order.makerAddress,\n fillResults.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n zrxAssetData,\n order.makerAddress,\n order.feeRecipientAddress,\n fillResults.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n order.feeRecipientAddress,\n fillResults.takerFeePaid\n );\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinMatchOrders.sol": "/*\n Copyright 2018 ZeroEx Intl.\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 http://www.apache.org/licenses/LICENSE-2.0\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\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./mixins/MExchangeCore.sol\";\nimport \"./mixins/MMatchOrders.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\n\n\ncontract MixinMatchOrders is\n LibConstants,\n LibMath,\n MAssetProxyDispatcher,\n MExchangeCore,\n MMatchOrders,\n MTransactions\n{\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We assume that rightOrder.takerAssetData == leftOrder.makerAssetData and rightOrder.makerAssetData == leftOrder.takerAssetData.\n // If this assumption isn't true, the match will fail at signature validation.\n rightOrder.makerAssetData = leftOrder.takerAssetData;\n rightOrder.takerAssetData = leftOrder.makerAssetData;\n\n // Get left & right order info\n LibOrder.OrderInfo memory leftOrderInfo = getOrderInfo(leftOrder);\n LibOrder.OrderInfo memory rightOrderInfo = getOrderInfo(rightOrder);\n\n // Fetch taker address\n address takerAddress = getCurrentContextAddress();\n\n // Either our context is valid or we revert\n assertValidMatch(leftOrder, rightOrder);\n\n // Compute proportional fill amounts\n matchedFillResults = calculateMatchedFillResults(\n leftOrder,\n rightOrder,\n leftOrderInfo.orderTakerAssetFilledAmount,\n rightOrderInfo.orderTakerAssetFilledAmount\n );\n\n // Validate fill contexts\n assertValidFill(\n leftOrder,\n leftOrderInfo,\n takerAddress,\n matchedFillResults.left.takerAssetFilledAmount,\n matchedFillResults.left.takerAssetFilledAmount,\n leftSignature\n );\n assertValidFill(\n rightOrder,\n rightOrderInfo,\n takerAddress,\n matchedFillResults.right.takerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount,\n rightSignature\n );\n\n // Update exchange state\n updateFilledState(\n leftOrder,\n takerAddress,\n leftOrderInfo.orderHash,\n leftOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.left\n );\n updateFilledState(\n rightOrder,\n takerAddress,\n rightOrderInfo.orderHash,\n rightOrderInfo.orderTakerAssetFilledAmount,\n matchedFillResults.right\n );\n \n // Settle matched orders. Succeeds or throws.\n settleMatchedOrders(\n leftOrder,\n rightOrder,\n takerAddress,\n matchedFillResults\n );\n\n return matchedFillResults;\n }\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure\n {\n // Make sure there is a profitable spread.\n // There is a profitable spread iff the cost per unit bought (OrderA.MakerAmount/OrderA.TakerAmount) for each order is greater\n // than the profit per unit sold of the matched order (OrderB.TakerAmount/OrderB.MakerAmount).\n // This is satisfied by the equations below:\n // <leftOrder.makerAssetAmount> / <leftOrder.takerAssetAmount> >= <rightOrder.takerAssetAmount> / <rightOrder.makerAssetAmount>\n // AND\n // <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount> >= <leftOrder.takerAssetAmount> / <leftOrder.makerAssetAmount>\n // These equations can be combined to get the following:\n require(\n safeMul(leftOrder.makerAssetAmount, rightOrder.makerAssetAmount) >=\n safeMul(leftOrder.takerAssetAmount, rightOrder.takerAssetAmount),\n \"NEGATIVE_SPREAD_REQUIRED\"\n );\n }\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults)\n {\n // We settle orders at the exchange rate of the right order.\n // The amount saved by the left maker goes to the taker.\n // Either the left or right order will be fully filled; possibly both.\n // The left order is fully filled iff the right order can sell more than left can buy.\n // That is: the amount required to fill the left order is less than or equal to\n // the amount we can spend from the right order:\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightMakerToTakerRatio>\n // <leftTakerAssetAmountRemaining> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount> / <rightOrder.takerAssetAmount>\n // <leftTakerAssetAmountRemaining> * <rightOrder.takerAssetAmount> <= <rightTakerAssetAmountRemaining> * <rightOrder.makerAssetAmount>\n uint256 leftTakerAssetAmountRemaining = safeSub(leftOrder.takerAssetAmount, leftOrderTakerAssetFilledAmount);\n uint256 rightTakerAssetAmountRemaining = safeSub(rightOrder.takerAssetAmount, rightOrderTakerAssetFilledAmount);\n uint256 leftTakerAssetFilledAmount;\n uint256 rightTakerAssetFilledAmount;\n if (\n safeMul(leftTakerAssetAmountRemaining, rightOrder.takerAssetAmount) <=\n safeMul(rightTakerAssetAmountRemaining, rightOrder.makerAssetAmount)\n ) {\n // Left order will be fully filled: maximally fill left\n leftTakerAssetFilledAmount = leftTakerAssetAmountRemaining;\n\n // The right order receives an amount proportional to how much was spent.\n rightTakerAssetFilledAmount = getPartialAmount(\n rightOrder.takerAssetAmount,\n rightOrder.makerAssetAmount,\n leftTakerAssetFilledAmount\n );\n } else {\n // Right order will be fully filled: maximally fill right\n rightTakerAssetFilledAmount = rightTakerAssetAmountRemaining;\n\n // The left order receives an amount proportional to how much was spent.\n leftTakerAssetFilledAmount = getPartialAmount(\n rightOrder.makerAssetAmount,\n rightOrder.takerAssetAmount,\n rightTakerAssetFilledAmount\n );\n }\n\n // Calculate fill results for left order\n matchedFillResults.left = calculateFillResults(\n leftOrder,\n leftTakerAssetFilledAmount\n );\n\n // Calculate fill results for right order\n matchedFillResults.right = calculateFillResults(\n rightOrder,\n rightTakerAssetFilledAmount\n );\n\n // Calculate amount given to taker\n matchedFillResults.leftMakerAssetSpreadAmount = safeSub(\n matchedFillResults.left.makerAssetFilledAmount,\n matchedFillResults.right.takerAssetFilledAmount\n );\n\n // Return fill results\n return matchedFillResults;\n }\n\n /// @dev Settles matched order by transferring appropriate funds between order makers, taker, and fee recipient.\n /// @param leftOrder First matched order.\n /// @param rightOrder Second matched order.\n /// @param takerAddress Address that matched the orders. The taker receives the spread between orders as profit.\n /// @param matchedFillResults Struct holding amounts to transfer between makers, taker, and fee recipients.\n function settleMatchedOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n address takerAddress,\n LibFillResults.MatchedFillResults memory matchedFillResults\n )\n private\n {\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n // Order makers and taker\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n rightOrder.makerAddress,\n matchedFillResults.right.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n rightOrder.makerAssetData,\n rightOrder.makerAddress,\n leftOrder.makerAddress,\n matchedFillResults.left.takerAssetFilledAmount\n );\n dispatchTransferFrom(\n leftOrder.makerAssetData,\n leftOrder.makerAddress,\n takerAddress,\n matchedFillResults.leftMakerAssetSpreadAmount\n );\n\n // Maker fees\n dispatchTransferFrom(\n zrxAssetData,\n leftOrder.makerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.makerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n rightOrder.makerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.makerFeePaid\n );\n\n // Taker fees\n if (leftOrder.feeRecipientAddress == rightOrder.feeRecipientAddress) {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n safeAdd(\n matchedFillResults.left.takerFeePaid,\n matchedFillResults.right.takerFeePaid\n )\n );\n } else {\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n leftOrder.feeRecipientAddress,\n matchedFillResults.left.takerFeePaid\n );\n dispatchTransferFrom(\n zrxAssetData,\n takerAddress,\n rightOrder.feeRecipientAddress,\n matchedFillResults.right.takerFeePaid\n );\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator,\n MTransactions\n{\n using LibBytes for bytes;\n \n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(\n hash,\n signerAddress,\n signature\n ),\n \"INVALID_SIGNATURE\"\n );\n preSigned[hash][signerAddress] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n {\n address signerAddress = getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Pop last byte off of signature byte array.\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n\n // Ensure signature is supported\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n hash,\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = signerAddress == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signerAddress).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validatorAddress = signature.popLast20Bytes();\n \n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n return false;\n }\n isValid = IValidator(validatorAddress).isValidSignature(\n hash,\n signerAddress,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signerAddress];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n\\x20\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./libs/LibEIP712.sol\";\n\n\ncontract MixinTransactions is\n LibEIP712,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n // Hash for the EIP712 ZeroEx Transaction Schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n \"REENTRANCY_ILLEGAL\"\n );\n\n bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(\n salt,\n signerAddress,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n \"INVALID_TX_HASH\"\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signerAddress != msg.sender) {\n // Validate signature\n require(\n isValidSignature(\n transactionHash,\n signerAddress,\n signature\n ),\n \"INVALID_TX_SIGNATURE\"\n );\n\n // Set the current transaction signer\n currentContextAddress = signerAddress;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n \"FAILED_EXECUTION\"\n );\n\n // Reset current transaction signer if it was previously updated\n if (signerAddress != msg.sender) {\n currentContextAddress = address(0);\n }\n }\n\n /// @dev Calculates EIP712 hash of the Transaction.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @return EIP712 hash of the Transaction.\n function hashZeroExTransaction(\n uint256 salt,\n address signerAddress,\n bytes memory data\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(data);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // salt,\n // bytes32(signerAddress),\n // keccak256(data)\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 96), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibMath.sol\";\nimport \"./libs/LibOrder.sol\";\nimport \"./libs/LibFillResults.sol\";\nimport \"./libs/LibAbiEncoder.sol\";\nimport \"./mixins/MExchangeCore.sol\";\n\n\ncontract MixinWrapperFunctions is\n LibMath,\n LibFillResults,\n LibAbiEncoder,\n MExchangeCore\n{\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n fillResults = fillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n require(\n fillResults.takerAssetFilledAmount == takerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return fillResults;\n }\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (FillResults memory fillResults)\n {\n // ABI encode calldata for `fillOrder`\n bytes memory fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n\n // Delegate to `fillOrder` and handle any exceptions gracefully\n assembly {\n let success := delegatecall(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n address, // call address of this contract\n add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)\n mload(fillOrderCalldata), // length of input\n fillOrderCalldata, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(fillOrderCalldata))\n mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))\n mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))\n mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrKillOrder(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n /// NOTE: makerAssetFilledAmount and takerAssetFilledAmount may include amounts filled of different assets.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n takerAssetFillAmounts[i],\n signatures[i]\n );\n addFillResults(totalFillResults, singleFillResults);\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n \n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory takerAssetData = orders[0].takerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being sold by taker is the same for each order.\n // Rather than passing this in as calldata, we use the takerAssetData from the first order in all later orders.\n orders[i].takerAssetData = takerAssetData;\n\n // Calculate the remaining amount of takerAsset to sell\n uint256 remainingTakerAssetFillAmount = safeSub(takerAssetFillAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= takerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrder(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // Rather than passing this in as calldata, we copy the makerAssetData from the first order onto all later orders.\n orders[i].makerAssetData = makerAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n if (totalFillResults.makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public\n {\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n cancelOrder(orders[i]);\n }\n }\n\n /// @dev Fetches information for all passed in orders.\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory)\n {\n uint256 ordersLength = orders.length;\n LibOrder.OrderInfo[] memory ordersInfo = new LibOrder.OrderInfo[](ordersLength);\n for (uint256 i = 0; i != ordersLength; i++) {\n ordersInfo[i] = getOrderInfo(orders[i]);\n }\n return ordersInfo;\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return ABI encoded calldata for `fillOrder`.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))\n\n // Increment free memory pointer\n mstore(0x40, dataAreaEnd)\n }\n\n return fillOrderCalldata;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibConstants.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 solidity 0.4.24;\n\n\n// solhint-disable max-line-length\ncontract LibConstants {\n \n // Asset data for ZRX token. Used for fee transfers.\n // @TODO: Hardcode constant when we deploy. Currently \n // not constant to make testing easier.\n\n // The proxyId for ZRX_ASSET_DATA is bytes4(keccak256(\"ERC20Token(address)\")) = 0xf47261b0\n \n // Kovan ZRX address is 0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570.\n // The ABI encoded proxyId and address is 0xf47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac68346570\n // bytes constant public ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x6f\\xf6\\xc0\\xff\\x1d\\x68\\xb9\\x64\\x90\\x1f\\x98\\x6d\\x4c\\x9f\\xa3\\xac\\x68\\x34\\x65\\x70\";\n \n // Mainnet ZRX address is 0xe41d2489571d322189246dafa5ebde1f4699f498.\n // The ABI encoded proxyId and address is 0xf47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f498\n // bytes constant public ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xe4\\x1d\\x24\\x89\\x57\\x1d\\x32\\x21\\x89\\x24\\x6d\\xaf\\xa5\\xeb\\xde\\x1f\\x46\\x99\\xf4\\x98\";\n \n // solhint-disable-next-line var-name-mixedcase\n bytes public ZRX_ASSET_DATA;\n\n // @TODO: Remove when we deploy.\n constructor (bytes memory zrxAssetData)\n public\n {\n ZRX_ASSET_DATA = zrxAssetData;\n }\n}\n// solhint-enable max-line-length\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.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\n// solhint-disable\npragma solidity 0.4.24;\n\n\n/// @dev This contract documents the revert reasons used in the Exchange contract.\n/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.\ncontract LibExchangeErrors {\n\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_ORDER_EPOCH = \"INVALID_NEW_ORDER_EPOCH\"; // Specified salt must be greater than or equal to existing orderEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_ALREADY_EXISTS = \"ASSET_PROXY_ALREADY_EXISTS\"; // AssetProxy with same id already exists.\n\n /// dispatchTransferFrom errors ///\n string constant ASSET_PROXY_DOES_NOT_EXIST = \"ASSET_PROXY_DOES_NOT_EXIST\"; // No assetProxy registered at given id.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Asset transfer unsuccesful.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_GREATER_THAN_3_REQUIRED = \"LENGTH_GREATER_THAN_3_REQUIRED\"; // Byte array must have a length greater than 3.\n string constant LENGTH_0_REQUIRED = \"LENGTH_0_REQUIRED\"; // Byte array must have a length of 0.\n string constant LENGTH_65_REQUIRED = \"LENGTH_65_REQUIRED\"; // Byte array must have a length of 65.\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibMath.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../interfaces/IAssetProxyDispatcher.sol\";\n\n\ncontract MAssetProxyDispatcher is\n IAssetProxyDispatcher\n{\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IExchangeCore.sol\";\n\n\ncontract MExchangeCore is\n IExchangeCore\n{\n // Fill event is emitted whenever an order is filled.\n event Fill(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that received fees.\n address takerAddress, // Address that filled the order.\n address senderAddress, // Address that called the Exchange contract (msg.sender).\n uint256 makerAssetFilledAmount, // Amount of makerAsset sold by maker and bought by taker. \n uint256 takerAssetFilledAmount, // Amount of takerAsset sold by taker and bought by maker.\n uint256 makerFeePaid, // Amount of ZRX paid to feeRecipient by maker.\n uint256 takerFeePaid, // Amount of ZRX paid to feeRecipient by taker.\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // Cancel event is emitted whenever an individual order is cancelled.\n event Cancel(\n address indexed makerAddress, // Address that created the order. \n address indexed feeRecipientAddress, // Address that would have recieved fees if order was filled. \n address senderAddress, // Address that called the Exchange contract (msg.sender).\n bytes32 indexed orderHash, // EIP712 hash of order (see LibOrder.getOrderHash).\n bytes makerAssetData, // Encoded data specific to makerAsset. \n bytes takerAssetData // Encoded data specific to takerAsset.\n );\n\n // CancelUpTo event is emitted whenever `cancelOrdersUpTo` is executed succesfully.\n event CancelUpTo(\n address indexed makerAddress, // Orders cancelled must have been created by this address.\n address indexed senderAddress, // Orders cancelled must have a `senderAddress` equal to this address.\n uint256 orderEpoch // Orders with specified makerAddress and senderAddress with a salt less than this value are considered cancelled.\n );\n\n /// @dev Updates state with results of a fill order.\n /// @param order that was filled.\n /// @param takerAddress Address of taker who filled the order.\n /// @param orderTakerAssetFilledAmount Amount of order already filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function updateFilledState(\n LibOrder.Order memory order,\n address takerAddress,\n bytes32 orderHash,\n uint256 orderTakerAssetFilledAmount,\n LibFillResults.FillResults memory fillResults\n )\n internal;\n\n /// @dev Updates state with results of cancelling an order.\n /// State is only updated if the order is currently fillable.\n /// Otherwise, updating state would have no effect.\n /// @param order that was cancelled.\n /// @param orderHash Hash of order that was cancelled.\n function updateCancelledState(\n LibOrder.Order memory order,\n bytes32 orderHash\n )\n internal;\n\n /// @dev Validates context for fillOrder. Succeeds or throws.\n /// @param order to be filled.\n /// @param orderInfo Status, orderHash, and amount already filled of order.\n /// @param takerAddress Address of order taker.\n /// @param takerAssetFillAmount Desired amount of order to fill by taker.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @param signature Proof that the orders was created by its maker.\n function assertValidFill(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo,\n address takerAddress,\n uint256 takerAssetFillAmount,\n uint256 takerAssetFilledAmount,\n bytes memory signature\n )\n internal\n view;\n\n /// @dev Validates context for cancelOrder. Succeeds or throws.\n /// @param order to be cancelled.\n /// @param orderInfo OrderStatus, orderHash, and amount already filled of order.\n function assertValidCancel(\n LibOrder.Order memory order,\n LibOrder.OrderInfo memory orderInfo\n )\n internal\n view;\n\n /// @dev Calculates amounts filled and fees paid by maker and taker.\n /// @param order to be filled.\n /// @param takerAssetFilledAmount Amount of takerAsset that will be filled.\n /// @return fillResults Amounts filled and fees paid by maker and taker.\n function calculateFillResults(\n LibOrder.Order memory order,\n uint256 takerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.FillResults memory fillResults);\n\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\nimport \"../interfaces/IMatchOrders.sol\";\n\n\ncontract MMatchOrders is\n IMatchOrders\n{\n\n /// @dev Validates context for matchOrders. Succeeds or throws.\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n function assertValidMatch(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder\n )\n internal\n pure;\n\n /// @dev Calculates fill amounts for the matched orders.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the leftOrder order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftOrderTakerAssetFilledAmount Amount of left order already filled.\n /// @param rightOrderTakerAssetFilledAmount Amount of right order already filled.\n /// @param matchedFillResults Amounts to fill and fees to pay by maker and taker of matched orders.\n function calculateMatchedFillResults(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n uint256 leftOrderTakerAssetFilledAmount,\n uint256 rightOrderTakerAssetFilledAmount\n )\n internal\n pure\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.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 solidity 0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool approved // Approval or disapproval of validator contract.\n );\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor, // 0x08\n NSignatureTypes // 0x09, number of signature types. Always leave at end.\n }\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x95300815feec04527ba652386f1ad5e6787cbf49fff8e7bce7116f30deb4541b",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x48bacb9266a570d521063ef5dd96e61686dbe788",
+ "links": {},
+ "constructorArgs": "[\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json b/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json
new file mode 100644
index 000000000..cfb9301a8
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/ExchangeWrapper.json
@@ -0,0 +1,210 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ExchangeWrapper",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "orderSignature",
+ "type": "bytes"
+ },
+ {
+ "name": "takerSignature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrder",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "targetOrderEpoch",
+ "type": "uint256"
+ },
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "makerSignature",
+ "type": "bytes"
+ }
+ ],
+ "name": "cancelOrdersUpTo",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_exchange",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50604051602080610a86833981018060405261002f9190810190610067565b60008054600160a060020a031916600160a060020a0392909216919091179055610099565b6000610060825161008d565b9392505050565b60006020828403121561007957600080fd5b60006100858484610054565b949350505050565b600160a060020a031690565b6109de806100a86000396000f30060806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207b5a1277725c899b2a43d23d31ef496f27153475da7d86be54450a97d1652b436c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0xA86 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH2 0x2F SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x67 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x99 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x60 DUP3 MLOAD PUSH2 0x8D JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x85 DUP5 DUP5 PUSH2 0x54 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0x9DE DUP1 PUSH2 0xA8 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH28 0x5A1277725C899B2A43D23D31EF496F27153475DA7D86BE54450A97D1 PUSH6 0x2B436C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
+ "sourceMap": "752:2418:0:-;;;896:99;8:9:-1;5:2;;;30:1;27;20:12;5:2;896:99:0;;;;;;;;;;;;;;;;;;;;;;957:8;:31;;-1:-1:-1;;;;;;957:31:0;-1:-1:-1;;;;;957:31:0;;;;;;;;;;752:2418;;5:122:-1;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;752:2418:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061004b5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663a2dbfe658114610050578063f7de1c8b14610072575b600080fd5b34801561005c57600080fd5b5061007061006b366004610538565b610092565b005b34801561007e57600080fd5b5061007061008d3660046105f4565b6101e4565b60405133906060907fb4be83d500000000000000000000000000000000000000000000000000000000906100ce908990899088906024016107d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906101a9908890869086908990600401610868565b600060405180830381600087803b1580156101c357600080fd5b505af11580156101d7573d6000803e3d6000fd5b5050505050505050505050565b60405133906060907f4f9559b1000000000000000000000000000000000000000000000000000000009061021c908890602401610807565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260005491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce906102f9908890869086908a908a9060040161081b565b600060405180830381600087803b15801561031357600080fd5b505af1158015610327573d6000803e3d6000fd5b50505050505050505050565b600061033f8235610924565b9392505050565b600080601f8301841361035857600080fd5b50813567ffffffffffffffff81111561037057600080fd5b60208301915083600182028301111561038857600080fd5b9250929050565b6000601f820183136103a057600080fd5b81356103b36103ae826108da565b6108b3565b915080825260208301602083018583830111156103cf57600080fd5b6103da838284610940565b50505092915050565b600061018082840312156103f657600080fd5b6104016101806108b3565b9050600061040f8484610333565b825250602061042084848301610333565b602083015250604061043484828501610333565b604083015250606061044884828501610333565b606083015250608061045c8482850161052c565b60808301525060a06104708482850161052c565b60a08301525060c06104848482850161052c565b60c08301525060e06104988482850161052c565b60e0830152506101006104ad8482850161052c565b610100830152506101206104c38482850161052c565b6101208301525061014082013567ffffffffffffffff8111156104e557600080fd5b6104f18482850161038f565b6101408301525061016082013567ffffffffffffffff81111561051357600080fd5b61051f8482850161038f565b6101608301525092915050565b600061033f823561093d565b600080600080600060a0868803121561055057600080fd5b853567ffffffffffffffff81111561056757600080fd5b610573888289016103e3565b95505060206105848882890161052c565b94505060406105958882890161052c565b935050606086013567ffffffffffffffff8111156105b257600080fd5b6105be8882890161038f565b925050608086013567ffffffffffffffff8111156105db57600080fd5b6105e78882890161038f565b9150509295509295909350565b6000806000806060858703121561060a57600080fd5b6000610616878761052c565b94505060206106278782880161052c565b935050604085013567ffffffffffffffff81111561064457600080fd5b61065087828801610346565b95989497509550505050565b61066581610924565b82525050565b6000828452602084019350610681838584610940565b61068a8361097c565b9093019392505050565b600061069f82610920565b8084526106b381602086016020860161094c565b6106bc8161097c565b9093016020019392505050565b80516000906101808401906106de858261065c565b5060208301516106f1602086018261065c565b506040830151610704604086018261065c565b506060830151610717606086018261065c565b50608083015161072a60808601826107cc565b5060a083015161073d60a08601826107cc565b5060c083015161075060c08601826107cc565b5060e083015161076360e08601826107cc565b506101008301516107786101008601826107cc565b5061012083015161078d6101208601826107cc565b506101408301518482036101408601526107a78282610694565b9150506101608301518482036101608601526107c38282610694565b95945050505050565b6106658161093d565b606080825281016107e681866106c9565b90506107f560208301856107cc565b81810360408301526107c38184610694565b6020810161081582846107cc565b92915050565b6080810161082982886107cc565b610836602083018761065c565b81810360408301526108488186610694565b9050818103606083015261085d81848661066b565b979650505050505050565b6080810161087682876107cc565b610883602083018661065c565b81810360408301526108958185610694565b905081810360608301526108a98184610694565b9695505050505050565b60405181810167ffffffffffffffff811182821017156108d257600080fd5b604052919050565b600067ffffffffffffffff8211156108f157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b82818337506000910152565b60005b8381101561096757818101518382015260200161094f565b83811115610976576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a723058207b5a1277725c899b2a43d23d31ef496f27153475da7d86be54450a97d1652b436c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xA2DBFE65 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xF7DE1C8B EQ PUSH2 0x72 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x6B CALLDATASIZE PUSH1 0x4 PUSH2 0x538 JUMP JUMPDEST PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x70 PUSH2 0x8D CALLDATASIZE PUSH1 0x4 PUSH2 0x5F4 JUMP JUMPDEST PUSH2 0x1E4 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0xCE SWAP1 DUP10 SWAP1 DUP10 SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x7D5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x1A9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP10 SWAP1 PUSH1 0x4 ADD PUSH2 0x868 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1D7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH1 0x60 SWAP1 PUSH32 0x4F9559B100000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x21C SWAP1 DUP9 SWAP1 PUSH1 0x24 ADD PUSH2 0x807 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x0 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x2F9 SWAP1 DUP9 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP11 SWAP1 DUP11 SWAP1 PUSH1 0x4 ADD PUSH2 0x81B JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x313 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x327 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x924 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x358 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x370 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x388 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x3A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x3B3 PUSH2 0x3AE DUP3 PUSH2 0x8DA JUMP JUMPDEST PUSH2 0x8B3 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x3CF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x3DA DUP4 DUP3 DUP5 PUSH2 0x940 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x3F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x401 PUSH2 0x180 PUSH2 0x8B3 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x40F DUP5 DUP5 PUSH2 0x333 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x420 DUP5 DUP5 DUP4 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x434 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x448 DUP5 DUP3 DUP6 ADD PUSH2 0x333 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x45C DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x470 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x484 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x498 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x4AD DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x4C3 DUP5 DUP3 DUP6 ADD PUSH2 0x52C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4F1 DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x513 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x51F DUP5 DUP3 DUP6 ADD PUSH2 0x38F JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x33F DUP3 CALLDATALOAD PUSH2 0x93D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x550 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x567 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x573 DUP9 DUP3 DUP10 ADD PUSH2 0x3E3 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x584 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x595 DUP9 DUP3 DUP10 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5BE DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x5E7 DUP9 DUP3 DUP10 ADD PUSH2 0x38F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x60A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x616 DUP8 DUP8 PUSH2 0x52C JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x627 DUP8 DUP3 DUP9 ADD PUSH2 0x52C JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x644 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x650 DUP8 DUP3 DUP9 ADD PUSH2 0x346 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x924 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP5 MSTORE PUSH1 0x20 DUP5 ADD SWAP4 POP PUSH2 0x681 DUP4 DUP6 DUP5 PUSH2 0x940 JUMP JUMPDEST PUSH2 0x68A DUP4 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x69F DUP3 PUSH2 0x920 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x6B3 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x94C JUMP JUMPDEST PUSH2 0x6BC DUP2 PUSH2 0x97C JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0x6DE DUP6 DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0x6F1 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0x704 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0x717 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x65C JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x72A PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0x73D PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0x750 PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0x763 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0x778 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0x78D PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0x7CC JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0x7A7 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0x7C3 DUP3 DUP3 PUSH2 0x694 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x665 DUP2 PUSH2 0x93D JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7E6 DUP2 DUP7 PUSH2 0x6C9 JUMP JUMPDEST SWAP1 POP PUSH2 0x7F5 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x7CC JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x7C3 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x815 DUP3 DUP5 PUSH2 0x7CC JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x829 DUP3 DUP9 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x836 PUSH1 0x20 DUP4 ADD DUP8 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x848 DUP2 DUP7 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x85D DUP2 DUP5 DUP7 PUSH2 0x66B JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x876 DUP3 DUP8 PUSH2 0x7CC JUMP JUMPDEST PUSH2 0x883 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x65C JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x895 DUP2 DUP6 PUSH2 0x694 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0x8A9 DUP2 DUP5 PUSH2 0x694 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x8D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x8F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x967 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x94F JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x976 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH28 0x5A1277725C899B2A43D23D31EF496F27153475DA7D86BE54450A97D1 PUSH6 0x2B436C657870 PUSH6 0x72696D656E74 PUSH2 0x6CF5 STOP CALLDATACOPY ",
+ "sourceMap": "752:2418:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;2481:687;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2481:687:0;;;;;;;;;;;1446:574;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1446:574:0;;;;;;;;;2481:687;2815:154;;2729:10;;2795:17;;2851:27;;2815:154;;2892:5;;2911:20;;2945:14;;2815:154;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2815:154:0;;;49:4:-1;25:18;;61:17;;2815:154:0;182:15:-1;2815:154:0;;;;179:29:-1;;;;160:49;;;-1:-1;3034:8:0;:127;;;;;2815:154;;-1:-1:-1;3034:8:0;;;;;:27;;:127;;3075:4;;3093:12;;2815:154;;3137:14;;3034:127;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3034:127:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3034:127:0;;;;2481:687;;;;;;;:::o;1446:574::-;1704:110;;1618:10;;1684:17;;1740:34;;1704:110;;1788:16;;1704:110;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1704:110:0;;;49:4:-1;25:18;;61:17;;1704:110:0;182:15:-1;1704:110:0;;;;179:29:-1;;;;160:49;;;-1:-1;1886:8:0;:127;;;;;1704:110;;-1:-1:-1;1886:8:0;;;;;:27;;:127;;1927:4;;1945:12;;1704:110;;1989:14;;;;1886:127;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1886:127:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1886:127:0;;;;1446:574;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;144:335;;;251:4;239:17;;235:27;-1:-1;225:2;;276:1;273;266:12;225:2;-1:-1;296:20;;336:18;325:30;;322:2;;;368:1;365;358:12;322:2;402:4;394:6;390:17;378:29;;452:3;445;437:6;433:16;423:8;419:31;416:40;413:2;;;469:1;466;459:12;413:2;218:261;;;;;;488:432;;578:4;566:17;;562:27;-1:-1;552:2;;603:1;600;593:12;552:2;640:6;627:20;662:60;677:44;714:6;677:44;;;662:60;;;653:69;;742:6;735:5;728:21;778:4;770:6;766:17;811:4;804:5;800:16;846:3;837:6;832:3;828:16;825:25;822:2;;;863:1;860;853:12;822:2;873:41;907:6;902:3;897;873:41;;;545:375;;;;;;;;1405:2208;;1516:5;1504:9;1499:3;1495:19;1491:31;1488:2;;;1535:1;1532;1525:12;1488:2;1553:21;1568:5;1553:21;;;1544:30;-1:-1;1632:1;1663:49;1708:3;1688:9;1663:49;;;1639:74;;-1:-1;1782:2;1815:49;1860:3;1836:22;;;1815:49;;;1808:4;1801:5;1797:16;1790:75;1734:142;1941:2;1974:49;2019:3;2010:6;1999:9;1995:22;1974:49;;;1967:4;1960:5;1956:16;1949:75;1886:149;2094:2;2127:49;2172:3;2163:6;2152:9;2148:22;2127:49;;;2120:4;2113:5;2109:16;2102:75;2045:143;2250:3;2284:49;2329:3;2320:6;2309:9;2305:22;2284:49;;;2277:4;2270:5;2266:16;2259:75;2198:147;2407:3;2441:49;2486:3;2477:6;2466:9;2462:22;2441:49;;;2434:4;2427:5;2423:16;2416:75;2355:147;2556:3;2590:49;2635:3;2626:6;2615:9;2611:22;2590:49;;;2583:4;2576:5;2572:16;2565:75;2512:139;2705:3;2739:49;2784:3;2775:6;2764:9;2760:22;2739:49;;;2732:4;2725:5;2721:16;2714:75;2661:139;2867:3;2902:49;2947:3;2938:6;2927:9;2923:22;2902:49;;;2894:5;2887;2883:17;2876:76;2810:153;3013:3;3048:49;3093:3;3084:6;3073:9;3069:22;3048:49;;;3040:5;3033;3029:17;3022:76;2973:136;3197:3;3186:9;3182:19;3169:33;3222:18;3214:6;3211:30;3208:2;;;3254:1;3251;3244:12;3208:2;3290:54;3340:3;3331:6;3320:9;3316:22;3290:54;;;3282:5;3275;3271:17;3264:81;3119:237;3444:3;3433:9;3429:19;3416:33;3469:18;3461:6;3458:30;3455:2;;;3501:1;3498;3491:12;3455:2;3537:54;3587:3;3578:6;3567:9;3563:22;3537:54;;;3529:5;3522;3518:17;3511:81;3366:237;1482:2131;;;;;3620:118;;3687:46;3725:6;3712:20;3687:46;;3745:1081;;;;;;3957:3;3945:9;3936:7;3932:23;3928:33;3925:2;;;3974:1;3971;3964:12;3925:2;4009:31;;4060:18;4049:30;;4046:2;;;4092:1;4089;4082:12;4046:2;4112:75;4179:7;4170:6;4159:9;4155:22;4112:75;;;4102:85;;3988:205;4224:2;4242:53;4287:7;4278:6;4267:9;4263:22;4242:53;;;4232:63;;4203:98;4332:2;4350:53;4395:7;4386:6;4375:9;4371:22;4350:53;;;4340:63;;4311:98;4468:2;4457:9;4453:18;4440:32;4492:18;4484:6;4481:30;4478:2;;;4524:1;4521;4514:12;4478:2;4544:62;4598:7;4589:6;4578:9;4574:22;4544:62;;;4534:72;;4419:193;4671:3;4660:9;4656:19;4643:33;4696:18;4688:6;4685:30;4682:2;;;4728:1;4725;4718:12;4682:2;4748:62;4802:7;4793:6;4782:9;4778:22;4748:62;;;4738:72;;4622:194;3919:907;;;;;;;;;4833:615;;;;;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5041:1;5058:53;5103:7;5083:9;5058:53;;;5048:63;;5020:97;5148:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;;;5156:63;;5127:98;5284:2;5273:9;5269:18;5256:32;5308:18;5300:6;5297:30;5294:2;;;5340:1;5337;5330:12;5294:2;5368:64;5424:7;5415:6;5404:9;5400:22;5368:64;;;4952:496;;;;-1:-1;5350:82;-1:-1;;;;4952:496;5455:110;5528:31;5553:5;5528:31;;;5523:3;5516:44;5510:55;;;5593:261;;5701:6;5696:3;5689:19;5725:4;5720:3;5716:14;5709:21;;5755:43;5791:6;5786:3;5779:5;5755:43;;;5819:29;5841:6;5819:29;;;5810:39;;;;5683:171;-1:-1;;;5683:171;5861:297;;5961:38;5993:5;5961:38;;;6016:6;6011:3;6004:19;6028:63;6084:6;6077:4;6072:3;6068:14;6061:4;6054:5;6050:16;6028:63;;;6123:29;6145:6;6123:29;;;6103:50;;;6116:4;6103:50;;5941:217;-1:-1;;;5941:217;6514:2417;6727:22;;6514:2417;;6649:5;6640:15;;;6761:61;6644:3;6727:22;6761:61;;;6670:164;6918:4;6911:5;6907:16;6901:23;6936:62;6992:4;6987:3;6983:14;6970:11;6936:62;;;6844:166;7101:4;7094:5;7090:16;7084:23;7119:62;7175:4;7170:3;7166:14;7153:11;7119:62;;;7020:173;7278:4;7271:5;7267:16;7261:23;7296:62;7352:4;7347:3;7343:14;7330:11;7296:62;;;7203:167;7458:4;7451:5;7447:16;7441:23;7476:62;7532:4;7527:3;7523:14;7510:11;7476:62;;;7380:170;7638:4;7631:5;7627:16;7621:23;7656:62;7712:4;7707:3;7703:14;7690:11;7656:62;;;7560:170;7810:4;7803:5;7799:16;7793:23;7828:62;7884:4;7879:3;7875:14;7862:11;7828:62;;;7740:162;7982:4;7975:5;7971:16;7965:23;8000:62;8056:4;8051:3;8047:14;8034:11;8000:62;;;7912:162;8167:5;8160;8156:17;8150:24;8186:63;8242:5;8237:3;8233:15;8220:11;8186:63;;;8084:177;8337:5;8330;8326:17;8320:24;8356:63;8412:5;8407:3;8403:15;8390:11;8356:63;;;8271:160;8517:5;8510;8506:17;8500:24;8570:3;8564:4;8560:14;8552:5;8547:3;8543:15;8536:39;8590:66;8651:4;8638:11;8590:66;;;8582:74;;8441:227;8754:5;8747;8743:17;8737:24;8807:3;8801:4;8797:14;8789:5;8784:3;8780:15;8773:39;8827:66;8888:4;8875:11;8827:66;;;8819:74;6622:2309;-1:-1;;;;;6622:2309;8938:110;9011:31;9036:5;9011:31;;9055:615;9281:2;9295:47;;;9266:18;;9356:92;9266:18;9434:6;9356:92;;;9348:100;;9459:62;9517:2;9506:9;9502:18;9493:6;9459:62;;;9569:9;9563:4;9559:20;9554:2;9543:9;9539:18;9532:48;9594:66;9655:4;9646:6;9594:66;;9677:193;9785:2;9770:18;;9799:61;9774:9;9833:6;9799:61;;;9756:114;;;;;9877:685;10115:3;10100:19;;10130:61;10104:9;10164:6;10130:61;;;10202:62;10260:2;10249:9;10245:18;10236:6;10202:62;;;10312:9;10306:4;10302:20;10297:2;10286:9;10282:18;10275:48;10337:66;10398:4;10389:6;10337:66;;;10329:74;;10451:9;10445:4;10441:20;10436:2;10425:9;10421:18;10414:48;10476:76;10547:4;10538:6;10530;10476:76;;;10468:84;10086:476;-1:-1;;;;;;;10086:476;10569:665;10797:3;10782:19;;10812:61;10786:9;10846:6;10812:61;;;10884:62;10942:2;10931:9;10927:18;10918:6;10884:62;;;10994:9;10988:4;10984:20;10979:2;10968:9;10964:18;10957:48;11019:66;11080:4;11071:6;11019:66;;;11011:74;;11133:9;11127:4;11123:20;11118:2;11107:9;11103:18;11096:48;11158:66;11219:4;11210:6;11158:66;;;11150:74;10768:466;-1:-1;;;;;;10768:466;11241:256;11303:2;11297:9;11329:17;;;11404:18;11389:34;;11425:22;;;11386:62;11383:2;;;11461:1;11458;11451:12;11383:2;11477;11470:22;11281:216;;-1:-1;11281:216;11504:254;;11643:18;11635:6;11632:30;11629:2;;;11675:1;11672;11665:12;11629:2;-1:-1;11748:4;11719;11696:17;;;;11715:9;11692:33;11738:15;;11566:192;12030:87;12100:12;;12084:33;12222:128;12302:42;12291:54;;12274:76;12357:79;12426:5;12409:27;12665:145;12746:6;12741:3;12736;12723:30;-1:-1;12802:1;12784:16;;12777:27;12716:94;12819:268;12884:1;12891:101;12905:6;12902:1;12899:13;12891:101;;;12972:11;;;12966:18;12953:11;;;12946:39;12927:2;12920:10;12891:101;;;13007:6;13004:1;13001:13;12998:2;;;13072:1;13063:6;13058:3;13054:16;13047:27;12998:2;12868:219;;;;;13095:97;13183:2;13163:14;13179:7;13159:28;;13143:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/examples/ExchangeWrapper/ExchangeWrapper.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchange.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 4
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 5
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 6
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": {
+ "id": 7
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 8
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 9
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 10
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 11
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/examples/ExchangeWrapper/ExchangeWrapper.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\n\n\ncontract ExchangeWrapper {\n\n // Exchange contract.\n // solhint-disable-next-line var-name-mixedcase\n IExchange internal EXCHANGE;\n\n constructor (address _exchange)\n public\n {\n EXCHANGE = IExchange(_exchange);\n }\n\n /// @dev Cancels all orders created by sender with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to this contract.\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.\n /// @param makerSignature Proof that maker wishes to call this function with given params.\n function cancelOrdersUpTo(\n uint256 targetOrderEpoch,\n uint256 salt,\n bytes makerSignature\n )\n external\n {\n address makerAddress = msg.sender;\n\n // Encode arguments into byte array.\n bytes memory data = abi.encodeWithSelector(\n EXCHANGE.cancelOrdersUpTo.selector,\n targetOrderEpoch\n );\n\n // Call `cancelOrdersUpTo` via `executeTransaction`.\n EXCHANGE.executeTransaction(\n salt,\n makerAddress,\n data,\n makerSignature\n );\n }\n\n /// @dev Fills an order using `msg.sender` as the taker.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.\n /// @param orderSignature Proof that order has been created by maker.\n /// @param takerSignature Proof that taker wishes to call this function with given params.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n uint256 salt,\n bytes memory orderSignature,\n bytes memory takerSignature\n )\n public\n {\n address takerAddress = msg.sender;\n\n // Encode arguments into byte array.\n bytes memory data = abi.encodeWithSelector(\n EXCHANGE.fillOrder.selector,\n order,\n takerAssetFillAmount,\n orderSignature\n );\n\n // Call `fillOrder` via `executeTransaction`.\n EXCHANGE.executeTransaction(\n salt,\n takerAddress,\n data,\n takerSignature\n );\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xc8083d3508a9014b57d4c652ac4e5400bd8ef6f6e6a7b4362dd0b15789fec526",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/Forwarder.json b/packages/migrations/artifacts/2.0.0/Forwarder.json
new file mode 100644
index 000000000..f7e19dca4
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/Forwarder.json
@@ -0,0 +1,615 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Forwarder",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "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": "makerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signatures",
+ "type": "bytes[]"
+ },
+ {
+ "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": "feeOrders",
+ "type": "tuple[]"
+ },
+ {
+ "name": "feeSignatures",
+ "type": "bytes[]"
+ },
+ {
+ "name": "feePercentage",
+ "type": "uint256"
+ },
+ {
+ "name": "feeRecipient",
+ "type": "address"
+ }
+ ],
+ "name": "marketBuyOrdersWithEth",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderFillResults",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "feeOrderFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetData",
+ "type": "bytes"
+ },
+ {
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdrawAsset",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "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[]"
+ },
+ {
+ "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": "feeOrders",
+ "type": "tuple[]"
+ },
+ {
+ "name": "feeSignatures",
+ "type": "bytes[]"
+ },
+ {
+ "name": "feePercentage",
+ "type": "uint256"
+ },
+ {
+ "name": "feeRecipient",
+ "type": "address"
+ }
+ ],
+ "name": "marketSellOrdersWithEth",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "orderFillResults",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "feeOrderFillResults",
+ "type": "tuple"
+ }
+ ],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_exchange",
+ "type": "address"
+ },
+ {
+ "name": "_etherToken",
+ "type": "address"
+ },
+ {
+ "name": "_zrxToken",
+ "type": "address"
+ },
+ {
+ "name": "_zrxAssetData",
+ "type": "bytes"
+ },
+ {
+ "name": "_wethAssetData",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405162002b3938038062002b3983398101806040526200003791908101906200043f565b6000805433600160a060020a0319918216178255600180548216600160a060020a0389811691909117909155600280548316888316179055600380549092169086161790558251869086908690869086906200009b906004906020850190620002f2565b508051620000b1906005906020840190620002f2565b5050600154604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130181207f60704108000000000000000000000000000000000000000000000000000000008252600160a060020a0390921695506360704108945062000131935090915060040162000556565b602060405180830381600087803b1580156200014c57600080fd5b505af115801562000161573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000187919081019062000416565b9050600160a060020a03811615620002e6576002546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b390620001e89084906000199060040162000537565b602060405180830381600087803b1580156200020357600080fd5b505af115801562000218573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200023e9190810190620004ef565b506003546040517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a039091169063095ea7b3906200028e9084906000199060040162000537565b602060405180830381600087803b158015620002a957600080fd5b505af1158015620002be573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620002e49190810190620004ef565b505b50505050505062000624565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200033557805160ff191683800117855562000365565b8280016001018555821562000365579182015b828111156200036557825182559160200191906001019062000348565b506200037392915062000377565b5090565b6200039491905b808211156200037357600081556001016200037e565b90565b6000620003a58251620005bb565b9392505050565b6000620003a58251620005ec565b6000601f82018313620003cc57600080fd5b8151620003e3620003dd8262000593565b6200056c565b915080825260208301602083018583830111156200040057600080fd5b6200040d838284620005f1565b50505092915050565b6000602082840312156200042957600080fd5b600062000437848462000397565b949350505050565b600080600080600060a086880312156200045857600080fd5b600062000466888862000397565b9550506020620004798882890162000397565b94505060406200048c8882890162000397565b93505060608601516001604060020a03811115620004a957600080fd5b620004b788828901620003ba565b92505060808601516001604060020a03811115620004d457600080fd5b620004e288828901620003ba565b9150509295509295909350565b6000602082840312156200050257600080fd5b6000620004378484620003ac565b6200051b81620005bb565b82525050565b6200051b81620005c7565b6200051b8162000394565b6040810162000547828562000510565b620003a560208301846200052c565b6020810162000566828462000521565b92915050565b6040518181016001604060020a03811182821017156200058b57600080fd5b604052919050565b60006001604060020a03821115620005aa57600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b151590565b60005b838110156200060e578181015183820152602001620005f4565b838111156200061e576000848401525b50505050565b61250580620006346000396000f30060806040526004361061006c5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318978e8281146100c8578063630f1e6c146100f25780638da5cb5b146101125780639395525c14610134578063f2fde38b14610147575b60025473ffffffffffffffffffffffffffffffffffffffff1633146100c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906122fb565b60405180910390fd5b005b6100db6100d6366004611d94565b610167565b6040516100e99291906123eb565b60405180910390f35b3480156100fe57600080fd5b506100c661010d366004611e8f565b6102f7565b34801561011e57600080fd5b50610127610388565b6040516100e991906122aa565b6100db610142366004611cae565b6103a4565b34801561015357600080fd5b506100c6610162366004611c88565b61050a565b61016f61199d565b61017761199d565b6000806101826105bb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815261025c939092909183018282801561022d5780601f106102025761010080835404028352916020019161022d565b820191906000526020600020905b81548152906001019060200180831161021057829003601f168201915b50505050508c600081518110151561024157fe5b6020908102909101015161014001519063ffffffff61069616565b156102875761026c8b8b8b6107c3565b935061028084600001518560600151610acb565b90506102ae565b6102928b8b8b610b0d565b9350836060015191506102a68883896107c3565b845190935090505b6102c2846020015184602001518888610d1f565b6102e98b60008151811015156102d457fe5b90602001906020020151610140015182610f33565b505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610348576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061238b565b61038383838080601f01602080910402602001604051908101604052809392919081815260200183838082843750879450610f339350505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6103ac61199d565b6103b461199d565b60008060006103c16105bb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152610441939092909183018282801561022d5780601f106102025761010080835404028352916020019161022d565b156104925761046a670de0b6b3a7640000610464670de0b6b3a76400008a61104f565b34611099565b92506104778b848c6110b8565b945061048b85600001518660600151610acb565b90506104d6565b6104ad670d2f13f7789f0000670de0b6b3a764000034611099565b92506104ba8b848c6110b8565b9450846060015191506104ce89838a6107c3565b855190945090505b6104ea856020015185602001518989610d1f565b6104fc8b60008151811015156102d457fe5b505050965096945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461055b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061238b565b73ffffffffffffffffffffffffffffffffffffffff8116156105b857600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600034116105f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061230b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b5050505050565b6000815183511480156107ba5750816040518082805190602001908083835b602083106106f257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016106b5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061078757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161074a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b90505b92915050565b6107cb61199d565b60608060008060008060006107de61199d565b8a15156107ea57610abc565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b505060058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152969e509194509250840190508282801561093d5780601f106109125761010080835404028352916020019161093d565b820191906000526020600020905b81548152906001019060200180831161092057829003601f168201915b50505050509650600095508b519450600093505b838514610a8257878c8581518110151561096757fe5b6020908102909101015161014001528b5187908d908690811061098657fe5b60209081029091010151610160015261099f8b87610acb565b9250610a068c858151811015156109b257fe5b9060200190602002015160a00151610a008e878151811015156109d157fe5b90602001906020020151608001518f888151811015156109ed57fe5b9060200190602002015160e00151610acb565b85611099565b9150610a4b8c85815181101515610a1957fe5b90602001906020020151610a2e84600161104f565b8c87815181101515610a3c57fe5b9060200190602002015161125c565b9050610a578982611301565b610a6989600001518a60600151610acb565b95508a8610610a7757610a82565b600190930192610951565b8a861015610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061236b565b50505050505050509392505050565b600082821115610b07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061232b565b50900390565b610b1561199d565b606080600080600080610b2661199d565b60008b6000815181101515610b3757fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929b5092909190830182828015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b505050505096508b519550600094505b848614610ce557878c86815181101515610c1557fe5b6020908102909101015161014001528b5187908d9087908110610c3457fe5b6020908102909101015161016001528851610c50908c90610acb565b9350610c938c86815181101515610c6357fe5b9060200190602002015160a001518d87815181101515610c7f57fe5b906020019060200201516080015186611099565b9250610cbf8c86815181101515610ca657fe5b90602001906020020151848c88815181101515610a3c57fe5b9150610ccb8983611301565b5087518a8110610cda57610ce5565b600190940193610bff565b8a811015610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061236b565b600080808066b1a2bc2ec50000861115610d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061239b565b610d6f888861104f565b935034841115610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061231b565b610db53485610acb565b9250610dca86670de0b6b3a76400008a611099565b915082821115610e06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061237b565b6000831115610f29576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610e65908690600401612407565b600060405180830381600087803b158015610e7f57600080fd5b505af1158015610e93573d6000803e3d6000fd5b505050506000821115610ee55760405173ffffffffffffffffffffffffffffffffffffffff86169083156108fc029084906000818181858888f19350505050158015610ee3573d6000803e3d6000fd5b505b610eef8383610acb565b90506000811115610f2957604051339082156108fc029083906000818181858888f19350505050158015610f27573d6000803e3d6000fd5b505b5050505050505050565b6000610f45838263ffffffff61136316565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff0000000000000000000000000000000000000000000000000000000080831691161415610fb557610fb083836113d0565b610383565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff000000000000000000000000000000000000000000000000000000008281169116141561101d57610fb083836115be565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123bb565b60008282018381101561108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061234b565b8091505b5092915050565b60006110ae6110a885846116a6565b84611701565b90505b9392505050565b6110c061199d565b60608060008060006110d061199d565b8960008151811015156110df57fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929950929091908301828280156111975780601f1061116c57610100808354040283529160200191611197565b820191906000526020600020905b81548152906001019060200180831161117a57829003601f168201915b5050505050945089519350600092505b82841461124f57858a848151811015156111bd57fe5b602090810290910101516101400152895185908b90859081106111dc57fe5b9060200190602002015161016001819052506111fc898860200151610acb565b91506112288a8481518110151561120f57fe5b90602001906020020151838a86815181101515610a3c57fe5b90506112348782611301565b602087015189116112445761124f565b6001909201916111a7565b5050505050509392505050565b61126461199d565b60606000611273868686611718565b600154815191935073ffffffffffffffffffffffffffffffffffffffff1691506080908390602082016000855af18080156112b557600181146112d3576112f6565b600085526000602086015260006040860152600060608601526112f6565b835185526020840151602086015260408401516040860152606084015160608601525b505050509392505050565b8151815161130f919061104f565b825260208083015190820151611325919061104f565b60208301526040808301519082015161133e919061104f565b604083015260608083015190820151611357919061104f565b60609092019190915250565b6000816004018351101515156113a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123cb565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6000806113e484601063ffffffff6118ea16565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812091935073ffffffffffffffffffffffffffffffffffffffff8416919061144290339087906024016122e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156114e65781810151838201526020016114ce565b50505050905090810190601f1680156115135780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061235b565b3d1561157f575060003d6020141561157f5760206000803e506000515b8015156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061235b565b50505050565b600080600183146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123db565b61160c84601063ffffffff6118ea16565b915061161f84602463ffffffff61194b16565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611678903090339086906004016122b8565b600060405180830381600087803b15801561169257600080fd5b505af1158015610f29573d6000803e3d6000fd5b6000808315156116b95760009150611092565b508282028284828115156116c957fe5b041461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061234b565b600080828481151561170f57fe5b04949350505050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b8181101561181f578351855260209485019490930192600101611801565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561186857835185526020948501949093019260010161184a565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b818110156118b0578351855260209485019490930192600101611892565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b60008160140183511015151561192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123ab565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006107ba8383600081602001835110151515611994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061233b565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006107ba82356124a3565b6000601f820183136119e357600080fd5b81356119f66119f18261243c565b612415565b81815260209384019390925082018360005b83811015611a345781358601611a1e8882611ae4565b8452506020928301929190910190600101611a08565b5050505092915050565b6000601f82018313611a4f57600080fd5b8135611a5d6119f18261243c565b81815260209384019390925082018360005b83811015611a345781358601611a858882611b33565b8452506020928301929190910190600101611a6f565b600080601f83018413611aad57600080fd5b50813567ffffffffffffffff811115611ac557600080fd5b602083019150836001820283011115611add57600080fd5b9250929050565b6000601f82018313611af557600080fd5b8135611b036119f18261245d565b91508082526020830160208301858383011115611b1f57600080fd5b611b2a8382846124bf565b50505092915050565b60006101808284031215611b4657600080fd5b611b51610180612415565b90506000611b5f84846119c6565b8252506020611b70848483016119c6565b6020830152506040611b84848285016119c6565b6040830152506060611b98848285016119c6565b6060830152506080611bac84828501611c7c565b60808301525060a0611bc084828501611c7c565b60a08301525060c0611bd484828501611c7c565b60c08301525060e0611be884828501611c7c565b60e083015250610100611bfd84828501611c7c565b61010083015250610120611c1384828501611c7c565b6101208301525061014082013567ffffffffffffffff811115611c3557600080fd5b611c4184828501611ae4565b6101408301525061016082013567ffffffffffffffff811115611c6357600080fd5b611c6f84828501611ae4565b6101608301525092915050565b60006107ba82356124bc565b600060208284031215611c9a57600080fd5b6000611ca684846119c6565b949350505050565b60008060008060008060c08789031215611cc757600080fd5b863567ffffffffffffffff811115611cde57600080fd5b611cea89828a01611a3e565b965050602087013567ffffffffffffffff811115611d0757600080fd5b611d1389828a016119d2565b955050604087013567ffffffffffffffff811115611d3057600080fd5b611d3c89828a01611a3e565b945050606087013567ffffffffffffffff811115611d5957600080fd5b611d6589828a016119d2565b9350506080611d7689828a01611c7c565b92505060a0611d8789828a016119c6565b9150509295509295509295565b600080600080600080600060e0888a031215611daf57600080fd5b873567ffffffffffffffff811115611dc657600080fd5b611dd28a828b01611a3e565b9750506020611de38a828b01611c7c565b965050604088013567ffffffffffffffff811115611e0057600080fd5b611e0c8a828b016119d2565b955050606088013567ffffffffffffffff811115611e2957600080fd5b611e358a828b01611a3e565b945050608088013567ffffffffffffffff811115611e5257600080fd5b611e5e8a828b016119d2565b93505060a0611e6f8a828b01611c7c565b92505060c0611e808a828b016119c6565b91505092959891949750929550565b600080600060408486031215611ea457600080fd5b833567ffffffffffffffff811115611ebb57600080fd5b611ec786828701611a9b565b93509350506020611eda86828701611c7c565b9150509250925092565b611eed816124a3565b82525050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b600d81527f4f564552534f4c445f5745544800000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601a81527f494e53554646494349454e545f4554485f52454d41494e494e47000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601881527f4645455f50455243454e544147455f544f4f5f4c415247450000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260400190565b8051608083019061226c84826122a1565b50602082015161227f60208501826122a1565b50604082015161229260408501826122a1565b5060608201516115b860608501825b611eed816124bc565b602081016107bd8284611ee4565b606081016122c68286611ee4565b6122d36020830185611ee4565b611ca660408301846122a1565b604081016122ee8285611ee4565b6110b160208301846122a1565b602080825281016107bd81611ef3565b602080825281016107bd81611f49565b602080825281016107bd81611f79565b602080825281016107bd81611fa9565b602080825281016107bd81611fd9565b602080825281016107bd8161202f565b602080825281016107bd8161205f565b602080825281016107bd8161208f565b602080825281016107bd816120bf565b602080825281016107bd816120ef565b602080825281016107bd8161211f565b602080825281016107bd8161214f565b602080825281016107bd816121a5565b602080825281016107bd816121d5565b602080825281016107bd8161222b565b61010081016123fa828561225b565b6110b1608083018461225b565b602081016107bd82846122a1565b60405181810167ffffffffffffffff8111828210171561243457600080fd5b604052919050565b600067ffffffffffffffff82111561245357600080fd5b5060209081020190565b600067ffffffffffffffff82111561247457600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b828183375060009101525600a265627a7a7230582058af9ab94f5439d0f3cfb36b96aa465540855ce710a4b18a92f3da562a53d5796c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x2B39 CODESIZE SUB DUP1 PUSH3 0x2B39 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x37 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x43F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR DUP3 SSTORE PUSH1 0x1 DUP1 SLOAD DUP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD DUP4 AND DUP9 DUP4 AND OR SWAP1 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP3 AND SWAP1 DUP7 AND OR SWAP1 SSTORE DUP3 MLOAD DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH3 0x9B SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP6 ADD SWAP1 PUSH3 0x2F2 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0xB1 SWAP1 PUSH1 0x5 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x2F2 JUMP JUMPDEST POP POP PUSH1 0x1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH32 0x6070410800000000000000000000000000000000000000000000000000000000 DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP6 POP PUSH4 0x60704108 SWAP5 POP PUSH3 0x131 SWAP4 POP SWAP1 SWAP2 POP PUSH1 0x4 ADD PUSH3 0x556 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x161 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x187 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x416 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO PUSH3 0x2E6 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x1E8 SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x537 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x203 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x218 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x23E SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4EF JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH32 0x95EA7B300000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH4 0x95EA7B3 SWAP1 PUSH3 0x28E SWAP1 DUP5 SWAP1 PUSH1 0x0 NOT SWAP1 PUSH1 0x4 ADD PUSH3 0x537 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2BE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x2E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4EF JUMP JUMPDEST POP JUMPDEST POP POP POP POP POP POP PUSH3 0x624 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x335 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x365 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x365 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x365 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x348 JUMP JUMPDEST POP PUSH3 0x373 SWAP3 SWAP2 POP PUSH3 0x377 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x394 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x373 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x37E JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3A5 DUP3 MLOAD PUSH3 0x5BB JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x3A5 DUP3 MLOAD PUSH3 0x5EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x3CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x3E3 PUSH3 0x3DD DUP3 PUSH3 0x593 JUMP JUMPDEST PUSH3 0x56C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x400 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x40D DUP4 DUP3 DUP5 PUSH3 0x5F1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x429 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x437 DUP5 DUP5 PUSH3 0x397 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x458 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x466 DUP9 DUP9 PUSH3 0x397 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x479 DUP9 DUP3 DUP10 ADD PUSH3 0x397 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x48C DUP9 DUP3 DUP10 ADD PUSH3 0x397 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4B7 DUP9 DUP3 DUP10 ADD PUSH3 0x3BA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x4D4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x4E2 DUP9 DUP3 DUP10 ADD PUSH3 0x3BA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x502 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x437 DUP5 DUP5 PUSH3 0x3AC JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x5BB JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x5C7 JUMP JUMPDEST PUSH3 0x51B DUP2 PUSH3 0x394 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0x547 DUP3 DUP6 PUSH3 0x510 JUMP JUMPDEST PUSH3 0x3A5 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0x52C JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x566 DUP3 DUP5 PUSH3 0x521 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x60E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x5F4 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x61E JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2505 DUP1 PUSH3 0x634 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18978E82 DUP2 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x630F1E6C EQ PUSH2 0xF2 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x112 JUMPI DUP1 PUSH4 0x9395525C EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x147 JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x22FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST PUSH2 0xDB PUSH2 0xD6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D94 JUMP JUMPDEST PUSH2 0x167 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE9 SWAP3 SWAP2 SWAP1 PUSH2 0x23EB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC6 PUSH2 0x10D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E8F JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x11E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x127 PUSH2 0x388 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE9 SWAP2 SWAP1 PUSH2 0x22AA JUMP JUMPDEST PUSH2 0xDB PUSH2 0x142 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CAE JUMP JUMPDEST PUSH2 0x3A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC6 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C88 JUMP JUMPDEST PUSH2 0x50A JUMP JUMPDEST PUSH2 0x16F PUSH2 0x199D JUMP JUMPDEST PUSH2 0x177 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x182 PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x25C SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x22D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x202 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x22D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x210 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP13 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x241 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x696 AND JUMP JUMPDEST ISZERO PUSH2 0x287 JUMPI PUSH2 0x26C DUP12 DUP12 DUP12 PUSH2 0x7C3 JUMP JUMPDEST SWAP4 POP PUSH2 0x280 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH2 0x2AE JUMP JUMPDEST PUSH2 0x292 DUP12 DUP12 DUP12 PUSH2 0xB0D JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x2A6 DUP9 DUP4 DUP10 PUSH2 0x7C3 JUMP JUMPDEST DUP5 MLOAD SWAP1 SWAP4 POP SWAP1 POP JUMPDEST PUSH2 0x2C2 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0xD1F JUMP JUMPDEST PUSH2 0x2E9 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2D4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD DUP3 PUSH2 0xF33 JUMP JUMPDEST POP POP SWAP8 POP SWAP8 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x348 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x238B JUMP JUMPDEST PUSH2 0x383 DUP4 DUP4 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP DUP8 SWAP5 POP PUSH2 0xF33 SWAP4 POP POP POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x3AC PUSH2 0x199D JUMP JUMPDEST PUSH2 0x3B4 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3C1 PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x441 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x22D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x202 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x22D JUMP JUMPDEST ISZERO PUSH2 0x492 JUMPI PUSH2 0x46A PUSH8 0xDE0B6B3A7640000 PUSH2 0x464 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x104F JUMP JUMPDEST CALLVALUE PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0x477 DUP12 DUP5 DUP13 PUSH2 0x10B8 JUMP JUMPDEST SWAP5 POP PUSH2 0x48B DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH2 0x4D6 JUMP JUMPDEST PUSH2 0x4AD PUSH8 0xD2F13F7789F0000 PUSH8 0xDE0B6B3A7640000 CALLVALUE PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0x4BA DUP12 DUP5 DUP13 PUSH2 0x10B8 JUMP JUMPDEST SWAP5 POP DUP5 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x4CE DUP10 DUP4 DUP11 PUSH2 0x7C3 JUMP JUMPDEST DUP6 MLOAD SWAP1 SWAP5 POP SWAP1 POP JUMPDEST PUSH2 0x4EA DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP10 DUP10 PUSH2 0xD1F JUMP JUMPDEST PUSH2 0x4FC DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2D4 JUMPI INVALID JUMPDEST POP POP POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x55B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x238B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x5B8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLVALUE GT PUSH2 0x5F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x230B JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 CALLVALUE PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x68F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x7BA JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x6B5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x787 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7CB PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7DE PUSH2 0x199D JUMP JUMPDEST DUP11 ISZERO ISZERO PUSH2 0x7EA JUMPI PUSH2 0xABC JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x88E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x863 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x88E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x871 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP7 SWAP15 POP SWAP2 SWAP5 POP SWAP3 POP DUP5 ADD SWAP1 POP DUP3 DUP3 DUP1 ISZERO PUSH2 0x93D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x912 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x93D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x920 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP PUSH1 0x0 SWAP6 POP DUP12 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xA82 JUMPI DUP8 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x967 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0x986 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH2 0x99F DUP12 DUP8 PUSH2 0xACB JUMP JUMPDEST SWAP3 POP PUSH2 0xA06 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xA00 DUP15 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP16 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9ED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST DUP6 PUSH2 0x1099 JUMP JUMPDEST SWAP2 POP PUSH2 0xA4B DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA19 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA2E DUP5 PUSH1 0x1 PUSH2 0x104F JUMP JUMPDEST DUP13 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x125C JUMP JUMPDEST SWAP1 POP PUSH2 0xA57 DUP10 DUP3 PUSH2 0x1301 JUMP JUMPDEST PUSH2 0xA69 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP6 POP DUP11 DUP7 LT PUSH2 0xA77 JUMPI PUSH2 0xA82 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x951 JUMP JUMPDEST DUP11 DUP7 LT ISZERO PUSH2 0xABC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x236B JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xB07 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x232B JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0xB15 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xB26 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB37 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP12 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xBEF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBC4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBEF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBD2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP DUP12 MLOAD SWAP6 POP PUSH1 0x0 SWAP5 POP JUMPDEST DUP5 DUP7 EQ PUSH2 0xCE5 JUMPI DUP8 DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC15 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xC34 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP9 MLOAD PUSH2 0xC50 SWAP1 DUP13 SWAP1 PUSH2 0xACB JUMP JUMPDEST SWAP4 POP PUSH2 0xC93 DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP14 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP7 PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0xCBF DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCA6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP13 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0xCCB DUP10 DUP4 PUSH2 0x1301 JUMP JUMPDEST POP DUP8 MLOAD DUP11 DUP2 LT PUSH2 0xCDA JUMPI PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xBFF JUMP JUMPDEST DUP11 DUP2 LT ISZERO PUSH2 0xABC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x236B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH7 0xB1A2BC2EC50000 DUP7 GT ISZERO PUSH2 0xD65 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x239B JUMP JUMPDEST PUSH2 0xD6F DUP9 DUP9 PUSH2 0x104F JUMP JUMPDEST SWAP4 POP CALLVALUE DUP5 GT ISZERO PUSH2 0xDAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x231B JUMP JUMPDEST PUSH2 0xDB5 CALLVALUE DUP6 PUSH2 0xACB JUMP JUMPDEST SWAP3 POP PUSH2 0xDCA DUP7 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x1099 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 GT ISZERO PUSH2 0xE06 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x237B JUMP JUMPDEST PUSH1 0x0 DUP4 GT ISZERO PUSH2 0xF29 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0xE65 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2407 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE93 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP3 GT ISZERO PUSH2 0xEE5 JUMPI PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xEE3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xEEF DUP4 DUP4 PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0xF29 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF45 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1363 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0xFB5 JUMPI PUSH2 0xFB0 DUP4 DUP4 PUSH2 0x13D0 JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x101D JUMPI PUSH2 0xFB0 DUP4 DUP4 PUSH2 0x15BE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23BB JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x234B JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10AE PUSH2 0x10A8 DUP6 DUP5 PUSH2 0x16A6 JUMP JUMPDEST DUP5 PUSH2 0x1701 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x10C0 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x10D0 PUSH2 0x199D JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10DF JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP10 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1197 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x116C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1197 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x117A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP5 POP DUP10 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0x124F JUMPI DUP6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11BD JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP10 MLOAD DUP6 SWAP1 DUP12 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x11DC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x11FC DUP10 DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP2 POP PUSH2 0x1228 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x120F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1234 DUP8 DUP3 PUSH2 0x1301 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD DUP10 GT PUSH2 0x1244 JUMPI PUSH2 0x124F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x11A7 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1264 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x1273 DUP7 DUP7 DUP7 PUSH2 0x1718 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 POP PUSH1 0x80 SWAP1 DUP4 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x0 DUP6 GAS CALL DUP1 DUP1 ISZERO PUSH2 0x12B5 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x12D3 JUMPI PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH1 0x0 PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x12F6 JUMP JUMPDEST DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x130F SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1325 SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x133E SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1357 SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13A5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23CB JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13E4 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x18EA AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 SWAP1 PUSH2 0x1442 SWAP1 CALLER SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x22E0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14E6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14CE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1513 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x235B JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x157F JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x157F JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x15B8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x235B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 DUP4 EQ PUSH2 0x15FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23DB JUMP JUMPDEST PUSH2 0x160C DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x18EA AND JUMP JUMPDEST SWAP2 POP PUSH2 0x161F DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x194B AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x1678 SWAP1 ADDRESS SWAP1 CALLER SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x22B8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1692 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF29 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x16B9 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1092 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x16C9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x108E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x234B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x170F JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x181F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x1801 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1868 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x184A JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x18B0 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x1892 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x192C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23AB JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1994 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x233B JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP3 CALLDATALOAD PUSH2 0x24A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x19E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x19F6 PUSH2 0x19F1 DUP3 PUSH2 0x243C JUMP JUMPDEST PUSH2 0x2415 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A34 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1A1E DUP9 DUP3 PUSH2 0x1AE4 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A08 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1A4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1A5D PUSH2 0x19F1 DUP3 PUSH2 0x243C JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A34 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1A85 DUP9 DUP3 PUSH2 0x1B33 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A6F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1AAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1ADD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B03 PUSH2 0x19F1 DUP3 PUSH2 0x245D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B2A DUP4 DUP3 DUP5 PUSH2 0x24BF JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B51 PUSH2 0x180 PUSH2 0x2415 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1B5F DUP5 DUP5 PUSH2 0x19C6 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1B70 DUP5 DUP5 DUP4 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x1B84 DUP5 DUP3 DUP6 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1B98 DUP5 DUP3 DUP6 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1BAC DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1BC0 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1BD4 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1BE8 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1BFD DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1C13 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C41 DUP5 DUP3 DUP6 ADD PUSH2 0x1AE4 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C6F DUP5 DUP3 DUP6 ADD PUSH2 0x1AE4 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP3 CALLDATALOAD PUSH2 0x24BC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1CA6 DUP5 DUP5 PUSH2 0x19C6 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1CC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CEA DUP10 DUP3 DUP11 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D13 DUP10 DUP3 DUP11 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D3C DUP10 DUP3 DUP11 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D65 DUP10 DUP3 DUP11 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x1D76 DUP10 DUP3 DUP11 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x1D87 DUP10 DUP3 DUP11 ADD PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1DAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DD2 DUP11 DUP3 DUP12 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH2 0x1DE3 DUP11 DUP3 DUP12 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E0C DUP11 DUP3 DUP12 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E35 DUP11 DUP3 DUP12 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E5E DUP11 DUP3 DUP12 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x1E6F DUP11 DUP3 DUP12 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x1E80 DUP11 DUP3 DUP12 ADD PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1EA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EC7 DUP7 DUP3 DUP8 ADD PUSH2 0x1A9B JUMP JUMPDEST SWAP4 POP SWAP4 POP POP PUSH1 0x20 PUSH2 0x1EDA DUP7 DUP3 DUP8 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x1EED DUP2 PUSH2 0x24A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x4F564552534F4C445F5745544800000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E53554646494349454E545F4554485F52454D41494E494E47000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50455243454E544147455F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x226C DUP5 DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x227F PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2292 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x15B8 PUSH1 0x60 DUP6 ADD DUP3 JUMPDEST PUSH2 0x1EED DUP2 PUSH2 0x24BC JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7BD DUP3 DUP5 PUSH2 0x1EE4 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x22C6 DUP3 DUP7 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x22D3 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x1CA6 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x22EE DUP3 DUP6 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x10B1 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1EF3 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1F49 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1F79 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1FA9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1FD9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x202F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x205F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x208F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x20BF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x20EF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x211F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x214F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x21A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x222B JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x23FA DUP3 DUP6 PUSH2 0x225B JUMP JUMPDEST PUSH2 0x10B1 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7BD DUP3 DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2434 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2474 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PC 0xaf SWAP11 0xb9 0x4f SLOAD CODECOPY 0xd0 RETURN 0xcf 0xb3 PUSH12 0x96AA465540855CE710A4B18A SWAP3 RETURN 0xda JUMP 0x2a MSTORE8 0xd5 PUSH26 0x6C6578706572696D656E74616CF5003700000000000000000000 ",
+ "sourceMap": "836:512:0:-;;;964:382;8:9:-1;5:2;;;30:1;27;20:12;5:2;964:382:0;;;;;;;;;;;;;;;;;;;;;;;;1337:20:3;329:18:28;;337:10;-1:-1:-1;;;;;;329:18:28;;;;;;-1:-1:-1;1764:31:7;;;;-1:-1:-1;;;;;1764:31:7;;;;;;;;;;1805:11;:38;;;;;;;;;;1853:9;:34;;;;;;;;;;;1897:30;;1764:31;;1805:38;;1853:34;;1897:30;;1286:14:0;;1897:30:7;;:14;;:30;;;;;:::i;:::-;-1:-1:-1;1937:32:7;;;;:15;;:32;;;;;:::i;:::-;-1:-1:-1;;1360:8:3;;843:32:7;;;;;;;;;;;;;;;;1360:37:3;;;-1:-1:-1;;;;;1360:8:3;;;;-1:-1:-1;1360:22:3;;-1:-1:-1;1360:37:3;;-1:-1:-1;843:32:7;;-1:-1:-1;1360:37:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1360:37:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1360:37:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1360:37:3;;;;;;;;;1337:60;-1:-1:-1;;;;;;1411:26:3;;;1407:155;;1453:11;;:43;;;;;-1:-1:-1;;;;;1453:11:3;;;;:19;;:43;;1473:12;;-1:-1:-1;;1016:10:7;1453:43:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1453:43:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1453:43:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1453:43:3;;;;;;;;;-1:-1:-1;1510:9:3;;:41;;;;;-1:-1:-1;;;;;1510:9:3;;;;:17;;:41;;1528:12;;-1:-1:-1;;1016:10:7;1510:41:3;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1510:41:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1510:41:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1510:41:3;;;;;;;;;;1407:155;1293:275;964:382:0;;;;;836:512;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;836:512:0;;;-1:-1:-1;836:512:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:116;;209:36;237:6;231:13;209:36;;258:442;;363:4;351:17;;347:27;-1:-1;337:2;;388:1;385;378:12;337:2;418:6;412:13;440:64;455:48;496:6;455:48;;;440:64;;;431:73;;524:6;517:5;510:21;560:4;552:6;548:17;593:4;586:5;582:16;628:3;619:6;614:3;610:16;607:25;604:2;;;645:1;642;635:12;604:2;655:39;687:6;682:3;677;655:39;;;330:370;;;;;;;;708:263;;823:2;811:9;802:7;798:23;794:32;791:2;;;839:1;836;829:12;791:2;874:1;891:64;947:7;927:9;891:64;;;881:74;785:186;-1:-1;;;;785:186;978:1003;;;;;;1179:3;1167:9;1158:7;1154:23;1150:33;1147:2;;;1196:1;1193;1186:12;1147:2;1231:1;1248:64;1304:7;1284:9;1248:64;;;1238:74;;1210:108;1349:2;1367:64;1423:7;1414:6;1403:9;1399:22;1367:64;;;1357:74;;1328:109;1468:2;1486:64;1542:7;1533:6;1522:9;1518:22;1486:64;;;1476:74;;1447:109;1608:2;1597:9;1593:18;1587:25;-1:-1;;;;;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1684:73;1749:7;1740:6;1729:9;1725:22;1684:73;;;1674:83;;1566:197;1815:3;1804:9;1800:19;1794:26;-1:-1;;;;;1832:6;1829:30;1826:2;;;1872:1;1869;1862:12;1826:2;1892:73;1957:7;1948:6;1937:9;1933:22;1892:73;;;1882:83;;1773:198;1141:840;;;;;;;;;1988:257;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2151:1;2168:61;2221:7;2201:9;2168:61;;2252:110;2325:31;2350:5;2325:31;;;2320:3;2313:44;2307:55;;;2369:107;2440:30;2464:5;2440:30;;2483:110;2556:31;2581:5;2556:31;;2600:294;2736:2;2721:18;;2750:61;2725:9;2784:6;2750:61;;;2822:62;2880:2;2869:9;2865:18;2856:6;2822:62;;2901:189;3007:2;2992:18;;3021:59;2996:9;3053:6;3021:59;;;2978:112;;;;;3097:256;3159:2;3153:9;3185:17;;;-1:-1;;;;;3245:34;;3281:22;;;3242:62;3239:2;;;3317:1;3314;3307:12;3239:2;3333;3326:22;3137:216;;-1:-1;3137:216;3360:258;;-1:-1;;;;;3495:6;3492:30;3489:2;;;3535:1;3532;3525:12;3489:2;-1:-1;3608:4;3579;3556:17;;;;-1:-1;;3552:33;3598:15;;3426:192;3625:128;-1:-1;;;;;3694:54;;3677:76;3760:151;3839:66;3828:78;;3811:100;4139:92;4212:13;4205:21;;4188:43;4239:268;4304:1;4311:101;4325:6;4322:1;4319:13;4311:101;;;4392:11;;;4386:18;4373:11;;;4366:39;4347:2;4340:10;4311:101;;;4427:6;4424:1;4421:13;4418:2;;;4492:1;4483:6;4478:3;4474:16;4467:27;4418:2;4288:219;;;;;;836:512:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061006c5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166318978e8281146100c8578063630f1e6c146100f25780638da5cb5b146101125780639395525c14610134578063f2fde38b14610147575b60025473ffffffffffffffffffffffffffffffffffffffff1633146100c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906122fb565b60405180910390fd5b005b6100db6100d6366004611d94565b610167565b6040516100e99291906123eb565b60405180910390f35b3480156100fe57600080fd5b506100c661010d366004611e8f565b6102f7565b34801561011e57600080fd5b50610127610388565b6040516100e991906122aa565b6100db610142366004611cae565b6103a4565b34801561015357600080fd5b506100c6610162366004611c88565b61050a565b61016f61199d565b61017761199d565b6000806101826105bb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600188161502019095169490940493840181900481028201810190925282815261025c939092909183018282801561022d5780601f106102025761010080835404028352916020019161022d565b820191906000526020600020905b81548152906001019060200180831161021057829003601f168201915b50505050508c600081518110151561024157fe5b6020908102909101015161014001519063ffffffff61069616565b156102875761026c8b8b8b6107c3565b935061028084600001518560600151610acb565b90506102ae565b6102928b8b8b610b0d565b9350836060015191506102a68883896107c3565b845190935090505b6102c2846020015184602001518888610d1f565b6102e98b60008151811015156102d457fe5b90602001906020020151610140015182610f33565b505097509795505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610348576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061238b565b61038383838080601f01602080910402602001604051908101604052809392919081815260200183838082843750879450610f339350505050565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6103ac61199d565b6103b461199d565b60008060006103c16105bb565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152610441939092909183018282801561022d5780601f106102025761010080835404028352916020019161022d565b156104925761046a670de0b6b3a7640000610464670de0b6b3a76400008a61104f565b34611099565b92506104778b848c6110b8565b945061048b85600001518660600151610acb565b90506104d6565b6104ad670d2f13f7789f0000670de0b6b3a764000034611099565b92506104ba8b848c6110b8565b9450846060015191506104ce89838a6107c3565b855190945090505b6104ea856020015185602001518989610d1f565b6104fc8b60008151811015156102d457fe5b505050965096945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461055b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061238b565b73ffffffffffffffffffffffffffffffffffffffff8116156105b857600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600034116105f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061230b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016000604051808303818588803b15801561067b57600080fd5b505af115801561068f573d6000803e3d6000fd5b5050505050565b6000815183511480156107ba5750816040518082805190602001908083835b602083106106f257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016106b5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061078757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161074a565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b90505b92915050565b6107cb61199d565b60608060008060008060006107de61199d565b8a15156107ea57610abc565b6004805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152929183018282801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b505060058054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152969e509194509250840190508282801561093d5780601f106109125761010080835404028352916020019161093d565b820191906000526020600020905b81548152906001019060200180831161092057829003601f168201915b50505050509650600095508b519450600093505b838514610a8257878c8581518110151561096757fe5b6020908102909101015161014001528b5187908d908690811061098657fe5b60209081029091010151610160015261099f8b87610acb565b9250610a068c858151811015156109b257fe5b9060200190602002015160a00151610a008e878151811015156109d157fe5b90602001906020020151608001518f888151811015156109ed57fe5b9060200190602002015160e00151610acb565b85611099565b9150610a4b8c85815181101515610a1957fe5b90602001906020020151610a2e84600161104f565b8c87815181101515610a3c57fe5b9060200190602002015161125c565b9050610a578982611301565b610a6989600001518a60600151610acb565b95508a8610610a7757610a82565b600190930192610951565b8a861015610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061236b565b50505050505050509392505050565b600082821115610b07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061232b565b50900390565b610b1561199d565b606080600080600080610b2661199d565b60008b6000815181101515610b3757fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929b5092909190830182828015610bef5780601f10610bc457610100808354040283529160200191610bef565b820191906000526020600020905b815481529060010190602001808311610bd257829003601f168201915b505050505096508b519550600094505b848614610ce557878c86815181101515610c1557fe5b6020908102909101015161014001528b5187908d9087908110610c3457fe5b6020908102909101015161016001528851610c50908c90610acb565b9350610c938c86815181101515610c6357fe5b9060200190602002015160a001518d87815181101515610c7f57fe5b906020019060200201516080015186611099565b9250610cbf8c86815181101515610ca657fe5b90602001906020020151848c88815181101515610a3c57fe5b9150610ccb8983611301565b5087518a8110610cda57610ce5565b600190940193610bff565b8a811015610abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061236b565b600080808066b1a2bc2ec50000861115610d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061239b565b610d6f888861104f565b935034841115610dab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061231b565b610db53485610acb565b9250610dca86670de0b6b3a76400008a611099565b915082821115610e06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061237b565b6000831115610f29576002546040517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90610e65908690600401612407565b600060405180830381600087803b158015610e7f57600080fd5b505af1158015610e93573d6000803e3d6000fd5b505050506000821115610ee55760405173ffffffffffffffffffffffffffffffffffffffff86169083156108fc029084906000818181858888f19350505050158015610ee3573d6000803e3d6000fd5b505b610eef8383610acb565b90506000811115610f2957604051339082156108fc029083906000818181858888f19350505050158015610f27573d6000803e3d6000fd5b505b5050505050505050565b6000610f45838263ffffffff61136316565b604080517f4552433230546f6b656e28616464726573732900000000000000000000000000815290519081900360130190209091507fffffffff0000000000000000000000000000000000000000000000000000000080831691161415610fb557610fb083836113d0565b610383565b604080517f455243373231546f6b656e28616464726573732c75696e7432353629000000008152905190819003601c0190207fffffffff000000000000000000000000000000000000000000000000000000008281169116141561101d57610fb083836115be565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123bb565b60008282018381101561108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061234b565b8091505b5092915050565b60006110ae6110a885846116a6565b84611701565b90505b9392505050565b6110c061199d565b60608060008060006110d061199d565b8960008151811015156110df57fe5b6020908102919091018101516101400151600580546040805160026001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931692909204601f8101869004860283018601909152808252929950929091908301828280156111975780601f1061116c57610100808354040283529160200191611197565b820191906000526020600020905b81548152906001019060200180831161117a57829003601f168201915b5050505050945089519350600092505b82841461124f57858a848151811015156111bd57fe5b602090810290910101516101400152895185908b90859081106111dc57fe5b9060200190602002015161016001819052506111fc898860200151610acb565b91506112288a8481518110151561120f57fe5b90602001906020020151838a86815181101515610a3c57fe5b90506112348782611301565b602087015189116112445761124f565b6001909201916111a7565b5050505050509392505050565b61126461199d565b60606000611273868686611718565b600154815191935073ffffffffffffffffffffffffffffffffffffffff1691506080908390602082016000855af18080156112b557600181146112d3576112f6565b600085526000602086015260006040860152600060608601526112f6565b835185526020840151602086015260408401516040860152606084015160608601525b505050509392505050565b8151815161130f919061104f565b825260208083015190820151611325919061104f565b60208301526040808301519082015161133e919061104f565b604083015260608083015190820151611357919061104f565b60609092019190915250565b6000816004018351101515156113a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123cb565b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b6000806113e484601063ffffffff6118ea16565b604080517f7472616e7366657228616464726573732c75696e7432353629000000000000008152905190819003601901812091935073ffffffffffffffffffffffffffffffffffffffff8416919061144290339087906024016122e0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931783525181519192909182919080838360005b838110156114e65781810151838201526020016114ce565b50505050905090810190601f1680156115135780820380516001836020036101000a031916815260200191505b509150506000604051808303816000865af192505050801515611562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061235b565b3d1561157f575060003d6020141561157f5760206000803e506000515b8015156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061235b565b50505050565b600080600183146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123db565b61160c84601063ffffffff6118ea16565b915061161f84602463ffffffff61194b16565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8316906323b872dd90611678903090339086906004016122b8565b600060405180830381600087803b15801561169257600080fd5b505af1158015610f29573d6000803e3d6000fd5b6000808315156116b95760009150611092565b508282028284828115156116c957fe5b041461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061234b565b600080828481151561170f57fe5b04949350505050565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b8181101561181f578351855260209485019490930192600101611801565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b8181101561186857835185526020948501949093019260010161184a565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b818110156118b0578351855260209485019490930192600101611892565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b60008160140183511015151561192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd906123ab565b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b60006107ba8383600081602001835110151515611994576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100bd9061233b565b50016020015190565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b60006107ba82356124a3565b6000601f820183136119e357600080fd5b81356119f66119f18261243c565b612415565b81815260209384019390925082018360005b83811015611a345781358601611a1e8882611ae4565b8452506020928301929190910190600101611a08565b5050505092915050565b6000601f82018313611a4f57600080fd5b8135611a5d6119f18261243c565b81815260209384019390925082018360005b83811015611a345781358601611a858882611b33565b8452506020928301929190910190600101611a6f565b600080601f83018413611aad57600080fd5b50813567ffffffffffffffff811115611ac557600080fd5b602083019150836001820283011115611add57600080fd5b9250929050565b6000601f82018313611af557600080fd5b8135611b036119f18261245d565b91508082526020830160208301858383011115611b1f57600080fd5b611b2a8382846124bf565b50505092915050565b60006101808284031215611b4657600080fd5b611b51610180612415565b90506000611b5f84846119c6565b8252506020611b70848483016119c6565b6020830152506040611b84848285016119c6565b6040830152506060611b98848285016119c6565b6060830152506080611bac84828501611c7c565b60808301525060a0611bc084828501611c7c565b60a08301525060c0611bd484828501611c7c565b60c08301525060e0611be884828501611c7c565b60e083015250610100611bfd84828501611c7c565b61010083015250610120611c1384828501611c7c565b6101208301525061014082013567ffffffffffffffff811115611c3557600080fd5b611c4184828501611ae4565b6101408301525061016082013567ffffffffffffffff811115611c6357600080fd5b611c6f84828501611ae4565b6101608301525092915050565b60006107ba82356124bc565b600060208284031215611c9a57600080fd5b6000611ca684846119c6565b949350505050565b60008060008060008060c08789031215611cc757600080fd5b863567ffffffffffffffff811115611cde57600080fd5b611cea89828a01611a3e565b965050602087013567ffffffffffffffff811115611d0757600080fd5b611d1389828a016119d2565b955050604087013567ffffffffffffffff811115611d3057600080fd5b611d3c89828a01611a3e565b945050606087013567ffffffffffffffff811115611d5957600080fd5b611d6589828a016119d2565b9350506080611d7689828a01611c7c565b92505060a0611d8789828a016119c6565b9150509295509295509295565b600080600080600080600060e0888a031215611daf57600080fd5b873567ffffffffffffffff811115611dc657600080fd5b611dd28a828b01611a3e565b9750506020611de38a828b01611c7c565b965050604088013567ffffffffffffffff811115611e0057600080fd5b611e0c8a828b016119d2565b955050606088013567ffffffffffffffff811115611e2957600080fd5b611e358a828b01611a3e565b945050608088013567ffffffffffffffff811115611e5257600080fd5b611e5e8a828b016119d2565b93505060a0611e6f8a828b01611c7c565b92505060c0611e808a828b016119c6565b91505092959891949750929550565b600080600060408486031215611ea457600080fd5b833567ffffffffffffffff811115611ebb57600080fd5b611ec786828701611a9b565b93509350506020611eda86828701611c7c565b9150509250925092565b611eed816124a3565b82525050565b602381527f44454641554c545f46554e4354494f4e5f574554485f434f4e54524143545f4f60208201527f4e4c590000000000000000000000000000000000000000000000000000000000604082015260600190565b601181527f494e56414c49445f4d53475f56414c5545000000000000000000000000000000602082015260400190565b600d81527f4f564552534f4c445f5745544800000000000000000000000000000000000000602082015260400190565b601181527f55494e543235365f554e444552464c4f57000000000000000000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b600f81527f5452414e534645525f4641494c45440000000000000000000000000000000000602082015260400190565b601481527f434f4d504c4554455f46494c4c5f4641494c4544000000000000000000000000602082015260400190565b601a81527f494e53554646494349454e545f4554485f52454d41494e494e47000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601881527f4645455f50455243454e544147455f544f4f5f4c415247450000000000000000602082015260400190565b602681527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560208201527f5155495245440000000000000000000000000000000000000000000000000000604082015260600190565b601781527f554e535550504f525445445f544f4b454e5f50524f5859000000000000000000602082015260400190565b602581527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160208201527f5549524544000000000000000000000000000000000000000000000000000000604082015260600190565b600e81527f494e56414c49445f414d4f554e54000000000000000000000000000000000000602082015260400190565b8051608083019061226c84826122a1565b50602082015161227f60208501826122a1565b50604082015161229260408501826122a1565b5060608201516115b860608501825b611eed816124bc565b602081016107bd8284611ee4565b606081016122c68286611ee4565b6122d36020830185611ee4565b611ca660408301846122a1565b604081016122ee8285611ee4565b6110b160208301846122a1565b602080825281016107bd81611ef3565b602080825281016107bd81611f49565b602080825281016107bd81611f79565b602080825281016107bd81611fa9565b602080825281016107bd81611fd9565b602080825281016107bd8161202f565b602080825281016107bd8161205f565b602080825281016107bd8161208f565b602080825281016107bd816120bf565b602080825281016107bd816120ef565b602080825281016107bd8161211f565b602080825281016107bd8161214f565b602080825281016107bd816121a5565b602080825281016107bd816121d5565b602080825281016107bd8161222b565b61010081016123fa828561225b565b6110b1608083018461225b565b602081016107bd82846122a1565b60405181810167ffffffffffffffff8111828210171561243457600080fd5b604052919050565b600067ffffffffffffffff82111561245357600080fd5b5060209081020190565b600067ffffffffffffffff82111561247457600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b73ffffffffffffffffffffffffffffffffffffffff1690565b90565b828183375060009101525600a265627a7a7230582058af9ab94f5439d0f3cfb36b96aa465540855ce710a4b18a92f3da562a53d5796c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x6C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x18978E82 DUP2 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x630F1E6C EQ PUSH2 0xF2 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x112 JUMPI DUP1 PUSH4 0x9395525C EQ PUSH2 0x134 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x147 JUMPI JUMPDEST PUSH1 0x2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x22FB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST STOP JUMPDEST PUSH2 0xDB PUSH2 0xD6 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D94 JUMP JUMPDEST PUSH2 0x167 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE9 SWAP3 SWAP2 SWAP1 PUSH2 0x23EB JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC6 PUSH2 0x10D CALLDATASIZE PUSH1 0x4 PUSH2 0x1E8F JUMP JUMPDEST PUSH2 0x2F7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x11E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x127 PUSH2 0x388 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xE9 SWAP2 SWAP1 PUSH2 0x22AA JUMP JUMPDEST PUSH2 0xDB PUSH2 0x142 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CAE JUMP JUMPDEST PUSH2 0x3A4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC6 PUSH2 0x162 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C88 JUMP JUMPDEST PUSH2 0x50A JUMP JUMPDEST PUSH2 0x16F PUSH2 0x199D JUMP JUMPDEST PUSH2 0x177 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x182 PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x25C SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x22D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x202 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x22D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x210 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP13 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x241 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x696 AND JUMP JUMPDEST ISZERO PUSH2 0x287 JUMPI PUSH2 0x26C DUP12 DUP12 DUP12 PUSH2 0x7C3 JUMP JUMPDEST SWAP4 POP PUSH2 0x280 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH2 0x2AE JUMP JUMPDEST PUSH2 0x292 DUP12 DUP12 DUP12 PUSH2 0xB0D JUMP JUMPDEST SWAP4 POP DUP4 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x2A6 DUP9 DUP4 DUP10 PUSH2 0x7C3 JUMP JUMPDEST DUP5 MLOAD SWAP1 SWAP4 POP SWAP1 POP JUMPDEST PUSH2 0x2C2 DUP5 PUSH1 0x20 ADD MLOAD DUP5 PUSH1 0x20 ADD MLOAD DUP9 DUP9 PUSH2 0xD1F JUMP JUMPDEST PUSH2 0x2E9 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2D4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x140 ADD MLOAD DUP3 PUSH2 0xF33 JUMP JUMPDEST POP POP SWAP8 POP SWAP8 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x348 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x238B JUMP JUMPDEST PUSH2 0x383 DUP4 DUP4 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP DUP8 SWAP5 POP PUSH2 0xF33 SWAP4 POP POP POP POP JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x3AC PUSH2 0x199D JUMP JUMPDEST PUSH2 0x3B4 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x3C1 PUSH2 0x5BB JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH2 0x441 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x22D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x202 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x22D JUMP JUMPDEST ISZERO PUSH2 0x492 JUMPI PUSH2 0x46A PUSH8 0xDE0B6B3A7640000 PUSH2 0x464 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x104F JUMP JUMPDEST CALLVALUE PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0x477 DUP12 DUP5 DUP13 PUSH2 0x10B8 JUMP JUMPDEST SWAP5 POP PUSH2 0x48B DUP6 PUSH1 0x0 ADD MLOAD DUP7 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH2 0x4D6 JUMP JUMPDEST PUSH2 0x4AD PUSH8 0xD2F13F7789F0000 PUSH8 0xDE0B6B3A7640000 CALLVALUE PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0x4BA DUP12 DUP5 DUP13 PUSH2 0x10B8 JUMP JUMPDEST SWAP5 POP DUP5 PUSH1 0x60 ADD MLOAD SWAP2 POP PUSH2 0x4CE DUP10 DUP4 DUP11 PUSH2 0x7C3 JUMP JUMPDEST DUP6 MLOAD SWAP1 SWAP5 POP SWAP1 POP JUMPDEST PUSH2 0x4EA DUP6 PUSH1 0x20 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP10 DUP10 PUSH2 0xD1F JUMP JUMPDEST PUSH2 0x4FC DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x2D4 JUMPI INVALID JUMPDEST POP POP POP SWAP7 POP SWAP7 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x55B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x238B JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x5B8 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLVALUE GT PUSH2 0x5F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x230B JUMP JUMPDEST PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xD0E30DB0 CALLVALUE PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x67B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x68F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x7BA JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6F2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x6B5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x787 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x74A JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x7CB PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x7DE PUSH2 0x199D JUMP JUMPDEST DUP11 ISZERO ISZERO PUSH2 0x7EA JUMPI PUSH2 0xABC JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x88E JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x863 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x88E JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x871 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE SWAP7 SWAP15 POP SWAP2 SWAP5 POP SWAP3 POP DUP5 ADD SWAP1 POP DUP3 DUP3 DUP1 ISZERO PUSH2 0x93D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x912 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x93D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x920 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP PUSH1 0x0 SWAP6 POP DUP12 MLOAD SWAP5 POP PUSH1 0x0 SWAP4 POP JUMPDEST DUP4 DUP6 EQ PUSH2 0xA82 JUMPI DUP8 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x967 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP7 SWAP1 DUP2 LT PUSH2 0x986 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE PUSH2 0x99F DUP12 DUP8 PUSH2 0xACB JUMP JUMPDEST SWAP3 POP PUSH2 0xA06 DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9B2 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD PUSH2 0xA00 DUP15 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9D1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP16 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9ED JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xE0 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST DUP6 PUSH2 0x1099 JUMP JUMPDEST SWAP2 POP PUSH2 0xA4B DUP13 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA19 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0xA2E DUP5 PUSH1 0x1 PUSH2 0x104F JUMP JUMPDEST DUP13 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x125C JUMP JUMPDEST SWAP1 POP PUSH2 0xA57 DUP10 DUP3 PUSH2 0x1301 JUMP JUMPDEST PUSH2 0xA69 DUP10 PUSH1 0x0 ADD MLOAD DUP11 PUSH1 0x60 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP6 POP DUP11 DUP7 LT PUSH2 0xA77 JUMPI PUSH2 0xA82 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP4 ADD SWAP3 PUSH2 0x951 JUMP JUMPDEST DUP11 DUP7 LT ISZERO PUSH2 0xABC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x236B JUMP JUMPDEST POP POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0xB07 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x232B JUMP JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST PUSH2 0xB15 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH2 0xB26 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x0 DUP12 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xB37 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP12 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xBEF JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBC4 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBEF JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBD2 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP7 POP DUP12 MLOAD SWAP6 POP PUSH1 0x0 SWAP5 POP JUMPDEST DUP5 DUP7 EQ PUSH2 0xCE5 JUMPI DUP8 DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC15 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP12 MLOAD DUP8 SWAP1 DUP14 SWAP1 DUP8 SWAP1 DUP2 LT PUSH2 0xC34 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x160 ADD MSTORE DUP9 MLOAD PUSH2 0xC50 SWAP1 DUP13 SWAP1 PUSH2 0xACB JUMP JUMPDEST SWAP4 POP PUSH2 0xC93 DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC63 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0xA0 ADD MLOAD DUP14 DUP8 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xC7F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x80 ADD MLOAD DUP7 PUSH2 0x1099 JUMP JUMPDEST SWAP3 POP PUSH2 0xCBF DUP13 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xCA6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP13 DUP9 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP2 POP PUSH2 0xCCB DUP10 DUP4 PUSH2 0x1301 JUMP JUMPDEST POP DUP8 MLOAD DUP11 DUP2 LT PUSH2 0xCDA JUMPI PUSH2 0xCE5 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xBFF JUMP JUMPDEST DUP11 DUP2 LT ISZERO PUSH2 0xABC JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x236B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 PUSH7 0xB1A2BC2EC50000 DUP7 GT ISZERO PUSH2 0xD65 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x239B JUMP JUMPDEST PUSH2 0xD6F DUP9 DUP9 PUSH2 0x104F JUMP JUMPDEST SWAP4 POP CALLVALUE DUP5 GT ISZERO PUSH2 0xDAB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x231B JUMP JUMPDEST PUSH2 0xDB5 CALLVALUE DUP6 PUSH2 0xACB JUMP JUMPDEST SWAP3 POP PUSH2 0xDCA DUP7 PUSH8 0xDE0B6B3A7640000 DUP11 PUSH2 0x1099 JUMP JUMPDEST SWAP2 POP DUP3 DUP3 GT ISZERO PUSH2 0xE06 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x237B JUMP JUMPDEST PUSH1 0x0 DUP4 GT ISZERO PUSH2 0xF29 JUMPI PUSH1 0x2 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E1A7D4D00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0x2E1A7D4D SWAP1 PUSH2 0xE65 SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x2407 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xE7F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xE93 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x0 DUP3 GT ISZERO PUSH2 0xEE5 JUMPI PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND SWAP1 DUP4 ISZERO PUSH2 0x8FC MUL SWAP1 DUP5 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xEE3 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xEEF DUP4 DUP4 PUSH2 0xACB JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP2 GT ISZERO PUSH2 0xF29 JUMPI PUSH1 0x40 MLOAD CALLER SWAP1 DUP3 ISZERO PUSH2 0x8FC MUL SWAP1 DUP4 SWAP1 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF27 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xF45 DUP4 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1363 AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD SWAP1 KECCAK256 SWAP1 SWAP2 POP PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP1 DUP4 AND SWAP2 AND EQ ISZERO PUSH2 0xFB5 JUMPI PUSH2 0xFB0 DUP4 DUP4 PUSH2 0x13D0 JUMP JUMPDEST PUSH2 0x383 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x455243373231546F6B656E28616464726573732C75696E743235362900000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x1C ADD SWAP1 KECCAK256 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 DUP2 AND SWAP2 AND EQ ISZERO PUSH2 0x101D JUMPI PUSH2 0xFB0 DUP4 DUP4 PUSH2 0x15BE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23BB JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x108E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x234B JUMP JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10AE PUSH2 0x10A8 DUP6 DUP5 PUSH2 0x16A6 JUMP JUMPDEST DUP5 PUSH2 0x1701 JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x10C0 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x10D0 PUSH2 0x199D JUMP JUMPDEST DUP10 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10DF JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH2 0x140 ADD MLOAD PUSH1 0x5 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x2 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 DIV PUSH1 0x1F DUP2 ADD DUP7 SWAP1 DIV DUP7 MUL DUP4 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP1 DUP3 MSTORE SWAP3 SWAP10 POP SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x1197 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x116C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1197 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x117A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP5 POP DUP10 MLOAD SWAP4 POP PUSH1 0x0 SWAP3 POP JUMPDEST DUP3 DUP5 EQ PUSH2 0x124F JUMPI DUP6 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x11BD JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD PUSH2 0x140 ADD MSTORE DUP10 MLOAD DUP6 SWAP1 DUP12 SWAP1 DUP6 SWAP1 DUP2 LT PUSH2 0x11DC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH2 0x160 ADD DUP2 SWAP1 MSTORE POP PUSH2 0x11FC DUP10 DUP9 PUSH1 0x20 ADD MLOAD PUSH2 0xACB JUMP JUMPDEST SWAP2 POP PUSH2 0x1228 DUP11 DUP5 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x120F JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP4 DUP11 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xA3C JUMPI INVALID JUMPDEST SWAP1 POP PUSH2 0x1234 DUP8 DUP3 PUSH2 0x1301 JUMP JUMPDEST PUSH1 0x20 DUP8 ADD MLOAD DUP10 GT PUSH2 0x1244 JUMPI PUSH2 0x124F JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x11A7 JUMP JUMPDEST POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1264 PUSH2 0x199D JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x1273 DUP7 DUP7 DUP7 PUSH2 0x1718 JUMP JUMPDEST PUSH1 0x1 SLOAD DUP2 MLOAD SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 POP PUSH1 0x80 SWAP1 DUP4 SWAP1 PUSH1 0x20 DUP3 ADD PUSH1 0x0 DUP6 GAS CALL DUP1 DUP1 ISZERO PUSH2 0x12B5 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x12D3 JUMPI PUSH2 0x12F6 JUMP JUMPDEST PUSH1 0x0 DUP6 MSTORE PUSH1 0x0 PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD MSTORE PUSH2 0x12F6 JUMP JUMPDEST DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 DUP5 ADD MLOAD PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x40 DUP7 ADD MSTORE PUSH1 0x60 DUP5 ADD MLOAD PUSH1 0x60 DUP7 ADD MSTORE JUMPDEST POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x130F SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1325 SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x133E SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x1357 SWAP2 SWAP1 PUSH2 0x104F JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13A5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23CB JUMP JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x13E4 DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x18EA AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x7472616E7366657228616464726573732C75696E743235362900000000000000 DUP2 MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x19 ADD DUP2 KECCAK256 SWAP2 SWAP4 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP2 SWAP1 PUSH2 0x1442 SWAP1 CALLER SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0x22E0 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 MSTORE MLOAD DUP2 MLOAD SWAP2 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x14E6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x14CE JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1513 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP7 GAS CALL SWAP3 POP POP POP DUP1 ISZERO ISZERO PUSH2 0x1562 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x235B JUMP JUMPDEST RETURNDATASIZE ISZERO PUSH2 0x157F JUMPI POP PUSH1 0x0 RETURNDATASIZE PUSH1 0x20 EQ ISZERO PUSH2 0x157F JUMPI PUSH1 0x20 PUSH1 0x0 DUP1 RETURNDATACOPY POP PUSH1 0x0 MLOAD JUMPDEST DUP1 ISZERO ISZERO PUSH2 0x15B8 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x235B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 DUP4 EQ PUSH2 0x15FB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23DB JUMP JUMPDEST PUSH2 0x160C DUP5 PUSH1 0x10 PUSH4 0xFFFFFFFF PUSH2 0x18EA AND JUMP JUMPDEST SWAP2 POP PUSH2 0x161F DUP5 PUSH1 0x24 PUSH4 0xFFFFFFFF PUSH2 0x194B AND JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0x23B872DD00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP2 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND SWAP1 PUSH4 0x23B872DD SWAP1 PUSH2 0x1678 SWAP1 ADDRESS SWAP1 CALLER SWAP1 DUP7 SWAP1 PUSH1 0x4 ADD PUSH2 0x22B8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1692 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF29 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x16B9 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x1092 JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x16C9 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x108E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x234B JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x170F JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x181F JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x1801 JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1868 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x184A JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x18B0 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x1892 JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x192C JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x23AB JUMP JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP4 DUP4 PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1994 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xBD SWAP1 PUSH2 0x233B JUMP JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP3 CALLDATALOAD PUSH2 0x24A3 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x19E3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x19F6 PUSH2 0x19F1 DUP3 PUSH2 0x243C JUMP JUMPDEST PUSH2 0x2415 JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A34 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1A1E DUP9 DUP3 PUSH2 0x1AE4 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A08 JUMP JUMPDEST POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1A4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1A5D PUSH2 0x19F1 DUP3 PUSH2 0x243C JUMP JUMPDEST DUP2 DUP2 MSTORE PUSH1 0x20 SWAP4 DUP5 ADD SWAP4 SWAP1 SWAP3 POP DUP3 ADD DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1A34 JUMPI DUP2 CALLDATALOAD DUP7 ADD PUSH2 0x1A85 DUP9 DUP3 PUSH2 0x1B33 JUMP JUMPDEST DUP5 MSTORE POP PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x1 ADD PUSH2 0x1A6F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x1AAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1AC5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x1ADD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x1AF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x1B03 PUSH2 0x19F1 DUP3 PUSH2 0x245D JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x1B1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B2A DUP4 DUP3 DUP5 PUSH2 0x24BF JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1B46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1B51 PUSH2 0x180 PUSH2 0x2415 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x1B5F DUP5 DUP5 PUSH2 0x19C6 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x1B70 DUP5 DUP5 DUP4 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x1B84 DUP5 DUP3 DUP6 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x1B98 DUP5 DUP3 DUP6 ADD PUSH2 0x19C6 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x1BAC DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x1BC0 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x1BD4 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x1BE8 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x1BFD DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x1C13 DUP5 DUP3 DUP6 ADD PUSH2 0x1C7C JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C41 DUP5 DUP3 DUP6 ADD PUSH2 0x1AE4 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1C63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1C6F DUP5 DUP3 DUP6 ADD PUSH2 0x1AE4 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x7BA DUP3 CALLDATALOAD PUSH2 0x24BC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C9A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1CA6 DUP5 DUP5 PUSH2 0x19C6 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0xC0 DUP8 DUP10 SUB SLT ISZERO PUSH2 0x1CC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1CDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1CEA DUP10 DUP3 DUP11 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP7 POP POP PUSH1 0x20 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D13 DUP10 DUP3 DUP11 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x40 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D30 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D3C DUP10 DUP3 DUP11 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x60 DUP8 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1D59 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1D65 DUP10 DUP3 DUP11 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x80 PUSH2 0x1D76 DUP10 DUP3 DUP11 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0xA0 PUSH2 0x1D87 DUP10 DUP3 DUP11 ADD PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 POP SWAP3 SWAP6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH2 0x1DAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1DC6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1DD2 DUP11 DUP3 DUP12 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH2 0x1DE3 DUP11 DUP3 DUP12 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E00 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E0C DUP11 DUP3 DUP12 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E29 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E35 DUP11 DUP3 DUP12 ADD PUSH2 0x1A3E JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1E52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1E5E DUP11 DUP3 DUP12 ADD PUSH2 0x19D2 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH2 0x1E6F DUP11 DUP3 DUP12 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH2 0x1E80 DUP11 DUP3 DUP12 ADD PUSH2 0x19C6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x40 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1EA4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1EBB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1EC7 DUP7 DUP3 DUP8 ADD PUSH2 0x1A9B JUMP JUMPDEST SWAP4 POP SWAP4 POP POP PUSH1 0x20 PUSH2 0x1EDA DUP7 DUP3 DUP8 ADD PUSH2 0x1C7C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH2 0x1EED DUP2 PUSH2 0x24A3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x44454641554C545F46554E4354494F4E5F574554485F434F4E54524143545F4F PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4E4C590000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x494E56414C49445F4D53475F56414C5545000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xD DUP2 MSTORE PUSH32 0x4F564552534F4C445F5745544800000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x11 DUP2 MSTORE PUSH32 0x55494E543235365F554E444552464C4F57000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP2 MSTORE PUSH32 0x5452414E534645525F4641494C45440000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 MSTORE PUSH32 0x434F4D504C4554455F46494C4C5F4641494C4544000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x1A DUP2 MSTORE PUSH32 0x494E53554646494349454E545F4554485F52454D41494E494E47000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x18 DUP2 MSTORE PUSH32 0x4645455F50455243454E544147455F544F4F5F4C415247450000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x26 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 MSTORE PUSH32 0x554E535550504F525445445F544F4B454E5F50524F5859000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x25 DUP2 MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F414D4F554E54000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x226C DUP5 DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x227F PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x2292 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x22A1 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x15B8 PUSH1 0x60 DUP6 ADD DUP3 JUMPDEST PUSH2 0x1EED DUP2 PUSH2 0x24BC JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7BD DUP3 DUP5 PUSH2 0x1EE4 JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x22C6 DUP3 DUP7 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x22D3 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x1CA6 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x22EE DUP3 DUP6 PUSH2 0x1EE4 JUMP JUMPDEST PUSH2 0x10B1 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1EF3 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1F49 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1F79 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1FA9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x1FD9 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x202F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x205F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x208F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x20BF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x20EF JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x211F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x214F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x21A5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x21D5 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x7BD DUP2 PUSH2 0x222B JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x23FA DUP3 DUP6 PUSH2 0x225B JUMP JUMPDEST PUSH2 0x10B1 PUSH1 0x80 DUP4 ADD DUP5 PUSH2 0x225B JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x7BD DUP3 DUP5 PUSH2 0x22A1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x2434 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 SWAP1 DUP2 MUL ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x2474 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 PC 0xaf SWAP11 0xb9 0x4f SLOAD CODECOPY 0xd0 RETURN 0xcf 0xb3 PUSH12 0x96AA465540855CE710A4B18A SWAP3 RETURN 0xda JUMP 0x2a MSTORE8 0xd5 PUSH26 0x6C6578706572696D656E74616CF5003700000000000000000000 ",
+ "sourceMap": "836:512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;960:11:4;;;;938:10;:34;917:116;;;;;;;;;;;;;;;;;;;;;;836:512:0;6506:2360:3;;;;;;;;;;;;;;;;;;;;;;;;;;;1479:174:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1479:174:1;;;;;;;;;258:20:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:28;;;;;;;;;;;;2698:2741:3;;;;;;;;;;500:167:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:28;;;;;;;;;6506:2360:3;6861:35;;:::i;:::-;6910:38;;:::i;:::-;7034:20;7064:33;7005:18;:16;:18::i;:::-;7143:14;7111:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7143:14;;7111:47;;7143:14;7111:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;7118:1;7111:9;;;;;;;;;;;;;;;;;;;:24;;;;:47;:31;:47;:::i;:::-;7107:1275;;;7372:129;7415:6;7439:20;7477:10;7372:25;:129::i;:::-;7353:148;;7633:79;7641:16;:39;;;7682:16;:29;;;7633:7;:79::i;:::-;7605:107;;7107:1275;;;7890:132;7936:6;7960:20;7998:10;7890:28;:132::i;:::-;7871:151;;8098:16;:29;;;8083:44;;8163:127;8206:9;8233:12;8263:13;8163:25;:127::i;:::-;8332:39;;8141:149;;-1:-1:-1;8332:39:3;-1:-1:-1;7107:1275:3;8527:195;8564:16;:39;;;8617:19;:42;;;8673:13;8700:12;8527:23;:195::i;:::-;8785:74;8807:6;8814:1;8807:9;;;;;;;;;;;;;;;;;;:24;;;8833:25;8785:21;:74::i;:::-;6506:2360;;;;;;;;;;;;:::o;1479:174:1:-;426:5:28;;;;412:10;:19;391:85;;;;;;;;;;;;;;1606:40:1;1628:9;;1606:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1639:6:1;;-1:-1:-1;1606:21:1;;-1:-1:-1;;;;1606:40:1:i;:::-;1479:174;;;:::o;258:20:28:-;;;;;;:::o;2698:2741:3:-;3016:35;;:::i;:::-;3065:38;;:::i;:::-;3189:22;3221:20;3251:33;3160:18;:16;:18::i;:::-;3330:14;3298:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3330:14;;3298:47;;3330:14;3298:47;;;;;;;;;;;;;;;;;;;;;;;;;3294:1661;;;3451:161;1083:6:7;3525:46:3;1083:6:7;3557:13:3;3525:7;:46::i;:::-;3589:9;3451:16;:161::i;:::-;3434:178;;3751:112;3783:6;3807:14;3839:10;3751:14;:112::i;:::-;3732:131;;3995:79;4003:16;:39;;;4044:16;:29;;;3995:7;:79::i;:::-;3967:107;;3294:1661;;;4207:139;1248:33:7;1083:6;4323:9:3;4207:16;:139::i;:::-;4190:156;;4483:112;4515:6;4539:14;4571:10;4483:14;:112::i;:::-;4464:131;;4671:16;:29;;;4656:44;;4736:127;4779:9;4806:12;4836:13;4736:25;:127::i;:::-;4905:39;;4714:149;;-1:-1:-1;4905:39:3;-1:-1:-1;3294:1661:3;5100:195;5137:16;:39;;;5190:19;:42;;;5246:13;5273:12;5100:23;:195::i;:::-;5358:74;5380:6;5387:1;5380:9;;;;;;;;;5358:74;2698:2741;;;;;;;;;;;;:::o;500:167:28:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;1104:191:4:-;1196:1;1184:9;:13;1163:77;;;;;;;;;;;;;;1250:11;;;;;;;;;;;:19;;;1276:9;1250:38;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1250:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1250:38:4;;;;;1104:191::o;9642:403:26:-;9763:10;9992:3;:10;9978:3;:10;:24;:60;;;;;10034:3;10024:14;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;10024:14:26;;;;;;;;;;;10006;;10024;;-1:-1:-1;10006:14:26;;-1:-1:-1;10024:14:26;;;;-1:-1:-1;10006:14:26;;;;10024;10006;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10006:14:26;;;;;;;;;;;;;;;;:32;;;;9978:60;9971:67;;9642:403;;;;;:::o;8743:2255:2:-;8923:35;;:::i;:::-;9098:25;9150:26;9204:20;9239;9290:9;9610:29;9861:31;10191:35;;:::i;:::-;9021:17;;9017:71;;;9054:23;;9017:71;9126:14;9098:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9126:14;9098:42;;9126:14;9098:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9179:15:2;9150:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9098:42;;-1:-1:-1;9179:15:2;;-1:-1:-1;9150:44:2;-1:-1:-1;9150:44:2;;;-1:-1:-1;9179:15:2;9150:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9227:1;9204:24;;9262:6;:13;9239:36;;9302:1;9290:13;;9285:1568;9305:17;;;9285:1568;;9468:12;9441:6;9448:1;9441:9;;;;;;;;;;;;;;;;;;;:24;;:39;9494:9;;9521:13;;9494:6;;9501:1;;9494:9;;;;;;;;;;;;;;;:24;;:40;9642:35;9650:12;9664;9642:7;:35::i;:::-;9610:67;;9895:220;9929:6;9936:1;9929:9;;;;;;;;;;;;;;;;;;:26;;;9973:55;9981:6;9988:1;9981:9;;;;;;;;;;;;;;;;;;:26;;;10009:6;10016:1;10009:9;;;;;;;;;;;;;;;;;;:18;;;9973:7;:55::i;:::-;10080:21;9895:16;:220::i;:::-;9861:254;;10229:208;10263:6;10270:1;10263:9;;;;;;;;;;;;;;;;;;10290:35;10298:23;10323:1;10290:7;:35::i;:::-;10410:10;10421:1;10410:13;;;;;;;;;;;;;;;;;;10229:16;:208::i;:::-;10191:246;;10523:50;10538:16;10556;10523:14;:50::i;:::-;10602:79;10610:16;:39;;;10651:16;:29;;;10602:7;:79::i;:::-;10587:94;-1:-1:-1;10775:28:2;;;10771:72;;10823:5;;10771:72;9324:3;;;;;9285:1568;;;10884:28;;;;10863:95;;;;;;;;;;;;;;8743:2255;;;;;;;;;;;;;:::o;501:208:29:-;587:7;631:6;;;;610:70;;;;;;;;;;;;;;-1:-1:-1;697:5:29;;;501:208::o;5757:2156:2:-;5948:35;;:::i;:::-;5999:27;6063:26;6118:20;6169:9;6566:37;6872;7158:36;;:::i;:::-;7564:30;6029:6;6036:1;6029:9;;;;;;;;;;;;;;;;;;;;;:24;;;6092:15;6063:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6029:24;;-1:-1:-1;6063:44:2;6092:15;;6063:44;;;6092:15;6063:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6141:6;:13;6118:36;;6181:1;6169:13;;6164:1586;6184:17;;;6164:1586;;6416:14;6389:6;6396:1;6389:9;;;;;;;;;;;;;;;;;;;:24;;:41;6444:9;;6471:13;;6444:6;;6451:1;;6444:9;;;;;;;;;;;;;;;:24;;:40;6636:39;;6606:70;;6614:20;;6606:7;:70::i;:::-;6566:110;;6912:165;6946:6;6953:1;6946:9;;;;;;;;;;;;;;;;;;:26;;;6990:6;6997:1;6990:9;;;;;;;;;;;;;;;;;;:26;;;7034:29;6912:16;:165::i;:::-;6872:205;;7197:135;7231:6;7238:1;7231:9;;;;;;;;;;;;;;;;;;7258:29;7305:10;7316:1;7305:13;;;;;;;;;7197:135;7158:174;;7417:51;7432:16;7450:17;7417:14;:51::i;:::-;-1:-1:-1;7597:39:2;;7654:46;;;7650:90;;7720:5;;7650:90;6203:3;;;;;6164:1586;;;7781:46;;;;7760:113;;;;;;;;;;;;;1827:1643:4;2275:16;;;;1143:32:7;2104:35:4;;;2083:106;;;;;;;;;;;;;;2294:51;2302:26;2330:14;2294:7;:51::i;:::-;2275:70;-1:-1:-1;2388:9:4;2376:21;;;2355:81;;;;;;;;;;;;;;2530:28;2538:9;2549:8;2530:7;:28::i;:::-;2506:52;;2639:129;2669:13;1083:6:7;2732:26:4;2639:16;:129::i;:::-;2622:146;-1:-1:-1;2861:23:4;;;;2840:96;;;;;;;;;;;;;;3014:1;2998:13;:17;2994:470;;;3076:11;;:35;;;;;:11;;;;;:20;;:35;;3097:13;;3076:35;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3076:35:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3076:35:4;;;;3178:1;3169:6;:10;3165:78;;;3199:29;;:21;;;;:29;;;;;3221:6;;3199:29;;;;3221:6;3199:21;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3199:29:4;3165:78;3328:30;3336:13;3351:6;3328:7;:30::i;:::-;3308:50;;3388:1;3376:9;:13;3372:82;;;3409:30;;:10;;:30;;;;;3429:9;;3409:30;;;;3429:9;3409:10;:30;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3409:30:4;3372:82;1827:1643;;;;;;;;:::o;1852:437:1:-;1976:14;1993:23;:9;1976:14;1993:23;:20;:23;:::i;:::-;843:32:7;;;;;;;;;;;;;;;;1976:40:1;;-1:-1:-1;2031:24:1;;;;;;;2027:256;;;2071:37;2090:9;2101:6;2071:18;:37::i;:::-;2027:256;;;931:41:7;;;;;;;;;;;;;;;;2129:25:1;;;;;;;2125:158;;;2170:38;2190:9;2201:6;2170:19;:38::i;2125:158::-;2239:33;;;;;;;;;;;715:230:29;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;;937:1;930:8;;715:230;;;;;;:::o;937:331:21:-;1096:21;1149:82;1170:26;1178:9;1189:6;1170:7;:26::i;:::-;1210:11;1149:7;:82::i;:::-;1133:98;-1:-1:-1;937:331:21;;;;;;:::o;3715:1517:2:-;3886:35;;:::i;:::-;3937:27;4001:26;4056:20;4107:9;4499:37;4678:36;;:::i;:::-;3967:6;3974:1;3967:9;;;;;;;;;;;;;;;;;;;;;:24;;;4030:15;4001:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3967:24;;-1:-1:-1;4001:44:2;4030:15;;4001:44;;;4030:15;4001:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:6;:13;4056:36;;4119:1;4107:13;;4102:1091;4122:17;;;4102:1091;;4354:14;4327:6;4334:1;4327:9;;;;;;;;;;;;;;;;;;;:24;;:41;4382:9;;4409:13;;4382:6;;4389:1;;4382:9;;;;;;;;;;;;;;:24;;:40;;;;4539:64;4547:14;4563:16;:39;;;4539:7;:64::i;:::-;4499:104;;4717:135;4751:6;4758:1;4751:9;;;;;;;;;;;;;;;;;;4778:29;4825:10;4836:1;4825:13;;;;;;;;;4717:135;4678:174;;4937:51;4952:16;4970:17;4937:14;:51::i;:::-;5086:39;;;;:57;-1:-1:-1;5082:101:2;;5163:5;;5082:101;4141:3;;;;;4102:1091;;;3715:1517;;;;;;;;;;;:::o;1433:1837::-;1606:30;;:::i;:::-;1699;1847:16;1732:104;1764:5;1783:20;1817:9;1732:18;:104::i;:::-;1874:8;;2417:24;;1699:137;;-1:-1:-1;1874:8:2;;;-1:-1:-1;2567:3:2;;1699:137;;2321:2;2298:26;;1874:8;;2019:3;1997:647;2664:7;2684:205;;;;2907:1;2902:324;;;;2657:569;;2684:205;2729:1;2716:11;2709:22;2777:1;2772:2;2759:11;2755:20;2748:31;2825:1;2820:2;2807:11;2803:20;2796:31;2873:1;2868:2;2855:11;2851:20;2844:31;2684:205;;2902:324;2953:17;2947:24;2934:11;2927:45;3047:2;3028:17;3024:26;3018:33;3013:2;3000:11;2996:20;2989:63;3127:2;3108:17;3104:26;3098:33;3093:2;3080:11;3076:20;3069:63;3207:2;3188:17;3184:26;3178:33;3173:2;3160:11;3156:20;3149:63;2657:569;-1:-1:-1;;1433:1837:2;;;;;;;:::o;1772:648:20:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:20:o;15559:559:26:-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:26;15862:10;15856:17;16012:66;16000:79;;15559:559::o;2507:1273:1:-;2628:13;;2644:25;:9;2666:2;2644:25;:21;:25;:::i;:::-;1011:38;;;;;;;;;;;;;;;;2628:41;;-1:-1:-1;2821:10:1;;;;1011:38;2832:113;;2905:10;;2929:6;;2832:113;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;2832:113:1;;;49:4:-1;25:18;;61:17;;2832:113:1;182:15:-1;2832:113:1;;;;179:29:-1;;;;160:49;;2821:125:1;;;2832:113;;2821:125;;;;25:18:-1;2821:125:1;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2821:125:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2956:69:1;;;;;;;;;;;;;;;;;3404:14;3401:2;;;-1:-1:-1;3448:1:1;3472:14;3488:2;3469:22;3466:2;;;3610;3607:1;3604;3589:24;-1:-1:-1;3651:1:1;3645:8;3466:2;3725:7;3704:69;;;;;;;;;;;;;;;;2507:1273;;;;:::o;3999:489::-;4233:13;;4152:1;4142:11;;4121:72;;;;;;;;;;;;;;4249:25;:9;4271:2;4249:25;:21;:25;:::i;:::-;4233:41;-1:-1:-1;4302:25:1;:9;4324:2;4302:25;:21;:25;:::i;:::-;4367:114;;;;;4284:43;;-1:-1:-1;4367:32:1;;;;;;:114;;4421:4;;4440:10;;4284:43;;4367:114;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4367:114:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;50:288:29;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:29;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;344:151;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:29:o;1011:10099:18:-;5031:4;5025:11;;5321:66;5314:4;5291:28;;;5284:104;;;;1199:30;5445:4;5422:28;;6444:59;;;6770:19;;5736:26;;;6750:40;;;6883:23;;;6877:30;6853:22;;;6846:62;6979:23;;;6973:30;6949:22;;;6942:62;7082:23;;;7076:30;7052:22;;;7045:62;7197:4;7179:23;;7173:30;7149:22;;;7142:62;7297:4;7279:23;;7273:30;7249:22;;;7242:62;7397:4;7379:23;;7373:30;7349:22;;;7342:62;7495:4;7477:23;;7471:30;7447:22;;;7440:62;7594:5;7576:24;;7570:31;7545:23;;;7538:64;7699:5;7681:24;;7675:31;7650:23;;;7643:64;7787:5;7769:24;;7763:31;;7738:23;;;7731:64;;;7895:5;7877:24;;7871:31;7846:23;;;7839:64;7979:5;8106:74;;8268:24;8340:19;;7962:23;;;8544:34;;;5025:11;;5422:28;;;;6536:27;;;;5736:26;;8606:22;;;;8388:23;;;;8464:4;8445:24;;8441:35;6190:1;8698:237;8721:13;8718:1;8715:20;8698:237;;;8791:19;;8771:40;;8860:4;8843:22;;;;8898:23;;;;8749:1;8742:9;8698:237;;;-1:-1:-1;;;;9045:31:18;;;9029:13;9010:33;;;9003:74;;;;9171:17;;9165:24;9237:19;;9441:34;;;9037:4;9503:22;;;;9285:23;;;;9361:4;9342:24;;9338:35;9610:1;9596:237;9619:13;9616:1;9613:20;9596:237;;;9689:19;;9669:40;;9758:4;9741:22;;;;9796:23;;;;9647:1;9640:9;9596:237;;;-1:-1:-1;;;9902:46:18;;;-1:-1:-1;10133:33:18;;;10003:4;9981:27;;;10108:59;;;10281:19;;10472:34;;;9981:27;;10534:22;;;;10329:23;;;;10281:19;10405:4;10386:24;;10382:35;-1:-1:-1;10613:237:18;10636:13;10633:1;10630:20;10613:237;;;10706:19;;10686:40;;10775:4;10758:22;;;;10813:23;;;;10664:1;10657:9;10613:237;;;-1:-1:-1;;;10928:46:18;;;;;10902:73;;-1:-1:-1;11041:4:18;11034:25;-1:-1:-1;;;;;1011:10099:18;;;;;:::o;10259:886:26:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:26;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;14699:195::-;14820:14;14865:21;14877:1;14880:5;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:26;13620:2;13718:13;13712:20;;13281:490::o;836:512:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;146:693;;261:4;249:17;;245:27;-1:-1;235:2;;286:1;283;276:12;235:2;323:6;310:20;345:85;360:69;422:6;360:69;;;345:85;;;458:21;;;502:4;490:17;;;;336:94;;-1:-1;515:14;;490:17;610:1;595:238;620:6;617:1;614:13;595:238;;;703:3;690:17;682:6;678:30;727:42;765:3;753:10;727:42;;;715:55;;-1:-1;793:4;784:14;;;;812;;;;;642:1;635:9;595:238;;;599:14;228:611;;;;;;;;879:735;;1008:4;996:17;;992:27;-1:-1;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:99;1107:83;1183:6;1107:83;;1092:99;1219:21;;;1263:4;1251:17;;;;1083:108;;-1:-1;1276:14;;1251:17;1371:1;1356:252;1381:6;1378:1;1375:13;1356:252;;;1464:3;1451:17;1443:6;1439:30;1488:56;1540:3;1528:10;1488:56;;;1476:69;;-1:-1;1568:4;1559:14;;;;1587;;;;;1403:1;1396:9;1356:252;;1636:335;;;1743:4;1731:17;;1727:27;-1:-1;1717:2;;1768:1;1765;1758:12;1717:2;-1:-1;1788:20;;1828:18;1817:30;;1814:2;;;1860:1;1857;1850:12;1814:2;1894:4;1886:6;1882:17;1870:29;;1944:3;1937;1929:6;1925:16;1915:8;1911:31;1908:40;1905:2;;;1961:1;1958;1951:12;1905:2;1710:261;;;;;;1980:432;;2070:4;2058:17;;2054:27;-1:-1;2044:2;;2095:1;2092;2085:12;2044:2;2132:6;2119:20;2154:60;2169:44;2206:6;2169:44;;2154:60;2145:69;;2234:6;2227:5;2220:21;2270:4;2262:6;2258:17;2303:4;2296:5;2292:16;2338:3;2329:6;2324:3;2320:16;2317:25;2314:2;;;2355:1;2352;2345:12;2314:2;2365:41;2399:6;2394:3;2389;2365:41;;;2037:375;;;;;;;;2448:2205;;2556:5;2544:9;2539:3;2535:19;2531:31;2528:2;;;2575:1;2572;2565:12;2528:2;2593:21;2608:5;2593:21;;;2584:30;-1:-1;2672:1;2703:49;2748:3;2728:9;2703:49;;;2679:74;;-1:-1;2822:2;2855:49;2900:3;2876:22;;;2855:49;;;2848:4;2841:5;2837:16;2830:75;2774:142;2981:2;3014:49;3059:3;3050:6;3039:9;3035:22;3014:49;;;3007:4;3000:5;2996:16;2989:75;2926:149;3134:2;3167:49;3212:3;3203:6;3192:9;3188:22;3167:49;;;3160:4;3153:5;3149:16;3142:75;3085:143;3290:3;3324:49;3369:3;3360:6;3349:9;3345:22;3324:49;;;3317:4;3310:5;3306:16;3299:75;3238:147;3447:3;3481:49;3526:3;3517:6;3506:9;3502:22;3481:49;;;3474:4;3467:5;3463:16;3456:75;3395:147;3596:3;3630:49;3675:3;3666:6;3655:9;3651:22;3630:49;;;3623:4;3616:5;3612:16;3605:75;3552:139;3745:3;3779:49;3824:3;3815:6;3804:9;3800:22;3779:49;;;3772:4;3765:5;3761:16;3754:75;3701:139;3907:3;3942:49;3987:3;3978:6;3967:9;3963:22;3942:49;;;3934:5;3927;3923:17;3916:76;3850:153;4053:3;4088:49;4133:3;4124:6;4113:9;4109:22;4088:49;;;4080:5;4073;4069:17;4062:76;4013:136;4237:3;4226:9;4222:19;4209:33;4262:18;4254:6;4251:30;4248:2;;;4294:1;4291;4284:12;4248:2;4330:54;4380:3;4371:6;4360:9;4356:22;4330:54;;;4322:5;4315;4311:17;4304:81;4159:237;4484:3;4473:9;4469:19;4456:33;4509:18;4501:6;4498:30;4495:2;;;4541:1;4538;4531:12;4495:2;4577:54;4627:3;4618:6;4607:9;4603:22;4577:54;;;4569:5;4562;4558:17;4551:81;4406:237;2522:2131;;;;;4660:118;;4727:46;4765:6;4752:20;4727:46;;4785:241;;4889:2;4877:9;4868:7;4864:23;4860:32;4857:2;;;4905:1;4902;4895:12;4857:2;4940:1;4957:53;5002:7;4982:9;4957:53;;;4947:63;4851:175;-1:-1;;;;4851:175;5033:1509;;;;;;;5370:3;5358:9;5349:7;5345:23;5341:33;5338:2;;;5387:1;5384;5377:12;5338:2;5422:31;;5473:18;5462:30;;5459:2;;;5505:1;5502;5495:12;5459:2;5525:97;5614:7;5605:6;5594:9;5590:22;5525:97;;;5515:107;;5401:227;5687:2;5676:9;5672:18;5659:32;5711:18;5703:6;5700:30;5697:2;;;5743:1;5740;5733:12;5697:2;5763:83;5838:7;5829:6;5818:9;5814:22;5763:83;;;5753:93;;5638:214;5911:2;5900:9;5896:18;5883:32;5935:18;5927:6;5924:30;5921:2;;;5967:1;5964;5957:12;5921:2;5987:97;6076:7;6067:6;6056:9;6052:22;5987:97;;;5977:107;;5862:228;6149:2;6138:9;6134:18;6121:32;6173:18;6165:6;6162:30;6159:2;;;6205:1;6202;6195:12;6159:2;6225:83;6300:7;6291:6;6280:9;6276:22;6225:83;;;6215:93;;6100:214;6345:3;6364:53;6409:7;6400:6;6389:9;6385:22;6364:53;;;6354:63;;6324:99;6454:3;6473:53;6518:7;6509:6;6498:9;6494:22;6473:53;;;6463:63;;6433:99;5332:1210;;;;;;;;;6549:1635;;;;;;;;6903:3;6891:9;6882:7;6878:23;6874:33;6871:2;;;6920:1;6917;6910:12;6871:2;6955:31;;7006:18;6995:30;;6992:2;;;7038:1;7035;7028:12;6992:2;7058:97;7147:7;7138:6;7127:9;7123:22;7058:97;;;7048:107;;6934:227;7192:2;7210:53;7255:7;7246:6;7235:9;7231:22;7210:53;;;7200:63;;7171:98;7328:2;7317:9;7313:18;7300:32;7352:18;7344:6;7341:30;7338:2;;;7384:1;7381;7374:12;7338:2;7404:83;7479:7;7470:6;7459:9;7455:22;7404:83;;;7394:93;;7279:214;7552:2;7541:9;7537:18;7524:32;7576:18;7568:6;7565:30;7562:2;;;7608:1;7605;7598:12;7562:2;7628:97;7717:7;7708:6;7697:9;7693:22;7628:97;;;7618:107;;7503:228;7790:3;7779:9;7775:19;7762:33;7815:18;7807:6;7804:30;7801:2;;;7847:1;7844;7837:12;7801:2;7867:83;7942:7;7933:6;7922:9;7918:22;7867:83;;;7857:93;;7741:215;7987:3;8006:53;8051:7;8042:6;8031:9;8027:22;8006:53;;;7996:63;;7966:99;8096:3;8115:53;8160:7;8151:6;8140:9;8136:22;8115:53;;;8105:63;;8075:99;6865:1319;;;;;;;;;;;8191:490;;;;8331:2;8319:9;8310:7;8306:23;8302:32;8299:2;;;8347:1;8344;8337:12;8299:2;8382:31;;8433:18;8422:30;;8419:2;;;8465:1;8462;8455:12;8419:2;8493:64;8549:7;8540:6;8529:9;8525:22;8493:64;;;8475:82;;;;8361:202;8594:2;8612:53;8657:7;8648:6;8637:9;8633:22;8612:53;;;8602:63;;8573:98;8293:388;;;;;;8688:110;8761:31;8786:5;8761:31;;;8756:3;8749:44;8743:55;;;8806:397;8961:2;8949:15;;8998:66;8993:2;8984:12;;8977:88;9099:66;9094:2;9085:12;;9078:88;9194:2;9185:12;;8942:261;9212:296;9367:2;9355:15;;9404:66;9399:2;9390:12;;9383:88;9499:2;9490:12;;9348:160;9517:296;9672:2;9660:15;;9709:66;9704:2;9695:12;;9688:88;9804:2;9795:12;;9653:160;9822:296;9977:2;9965:15;;10014:66;10009:2;10000:12;;9993:88;10109:2;10100:12;;9958:160;10127:397;10282:2;10270:15;;10319:66;10314:2;10305:12;;10298:88;10420:66;10415:2;10406:12;;10399:88;10515:2;10506:12;;10263:261;10533:296;10688:2;10676:15;;10725:66;10720:2;10711:12;;10704:88;10820:2;10811:12;;10669:160;10838:296;10993:2;10981:15;;11030:66;11025:2;11016:12;;11009:88;11125:2;11116:12;;10974:160;11143:296;11298:2;11286:15;;11335:66;11330:2;11321:12;;11314:88;11430:2;11421:12;;11279:160;11448:296;11603:2;11591:15;;11640:66;11635:2;11626:12;;11619:88;11735:2;11726:12;;11584:160;11753:296;11908:2;11896:15;;11945:66;11940:2;11931:12;;11924:88;12040:2;12031:12;;11889:160;12058:296;12213:2;12201:15;;12250:66;12245:2;12236:12;;12229:88;12345:2;12336:12;;12194:160;12363:397;12518:2;12506:15;;12555:66;12550:2;12541:12;;12534:88;12656:66;12651:2;12642:12;;12635:88;12751:2;12742:12;;12499:261;12769:296;12924:2;12912:15;;12961:66;12956:2;12947:12;;12940:88;13056:2;13047:12;;12905:160;13074:397;13229:2;13217:15;;13266:66;13261:2;13252:12;;13245:88;13367:66;13362:2;13353:12;;13346:88;13462:2;13453:12;;13210:261;13480:296;13635:2;13623:15;;13672:66;13667:2;13658:12;;13651:88;13767:2;13758:12;;13616:160;13861:888;14089:22;;14002:4;13993:14;;;14123:61;13997:3;14089:22;14123:61;;;14022:174;14290:4;14283:5;14279:16;14273:23;14308:62;14364:4;14359:3;14355:14;14342:11;14308:62;;;14206:176;14466:4;14459:5;14455:16;14449:23;14484:62;14540:4;14535:3;14531:14;14518:11;14484:62;;;14392:166;14642:4;14635:5;14631:16;14625:23;14660:62;14716:4;14711:3;14707:14;14694:11;14756:110;14829:31;14854:5;14829:31;;14873:193;14981:2;14966:18;;14995:61;14970:9;15029:6;14995:61;;15073:395;15237:2;15222:18;;15251:61;15226:9;15285:6;15251:61;;;15323:62;15381:2;15370:9;15366:18;15357:6;15323:62;;;15396;15454:2;15443:9;15439:18;15430:6;15396:62;;15475:294;15611:2;15596:18;;15625:61;15600:9;15659:6;15625:61;;;15697:62;15755:2;15744:9;15740:18;15731:6;15697:62;;15776:387;15957:2;15971:47;;;15942:18;;16032:121;15942:18;16032:121;;16170:387;16351:2;16365:47;;;16336:18;;16426:121;16336:18;16426:121;;16564:387;16745:2;16759:47;;;16730:18;;16820:121;16730:18;16820:121;;16958:387;17139:2;17153:47;;;17124:18;;17214:121;17124:18;17214:121;;17352:387;17533:2;17547:47;;;17518:18;;17608:121;17518:18;17608:121;;17746:387;17927:2;17941:47;;;17912:18;;18002:121;17912:18;18002:121;;18140:387;18321:2;18335:47;;;18306:18;;18396:121;18306:18;18396:121;;18534:387;18715:2;18729:47;;;18700:18;;18790:121;18700:18;18790:121;;18928:387;19109:2;19123:47;;;19094:18;;19184:121;19094:18;19184:121;;19322:387;19503:2;19517:47;;;19488:18;;19578:121;19488:18;19578:121;;19716:387;19897:2;19911:47;;;19882:18;;19972:121;19882:18;19972:121;;20110:387;20291:2;20305:47;;;20276:18;;20366:121;20276:18;20366:121;;20504:387;20685:2;20699:47;;;20670:18;;20760:121;20670:18;20760:121;;20898:387;21079:2;21093:47;;;21064:18;;21154:121;21064:18;21154:121;;21292:387;21473:2;21487:47;;;21458:18;;21548:121;21458:18;21548:121;;21686:528;21938:3;21923:19;;21953:119;21927:9;22045:6;21953:119;;;22083:121;22199:3;22188:9;22184:19;22175:6;22083:121;;22221:193;22329:2;22314:18;;22343:61;22318:9;22377:6;22343:61;;22421:256;22483:2;22477:9;22509:17;;;22584:18;22569:34;;22605:22;;;22566:62;22563:2;;;22641:1;22638;22631:12;22563:2;22657;22650:22;22461:216;;-1:-1;22461:216;22684:263;;22848:18;22840:6;22837:30;22834:2;;;22880:1;22877;22870:12;22834:2;-1:-1;22909:4;22897:17;;;22927:15;;22771:176;23238:254;;23377:18;23369:6;23366:30;23363:2;;;23409:1;23406;23399:12;23363:2;-1:-1;23482:4;23453;23430:17;;;;23449:9;23426:33;23472:15;;23300:192;23499:128;23579:42;23568:54;;23551:76;23634:79;23703:5;23686:27;23942:145;24023:6;24018:3;24013;24000:30;-1:-1;24079:1;24061:16;;24054:27;23993:94"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/forwarder/Forwarder.sol": {
+ "id": 0
+ },
+ "2.0.0/forwarder/MixinAssets.sol": {
+ "id": 1
+ },
+ "2.0.0/forwarder/MixinExchangeWrapper.sol": {
+ "id": 2
+ },
+ "2.0.0/forwarder/MixinForwarderCore.sol": {
+ "id": 3
+ },
+ "2.0.0/forwarder/MixinWeth.sol": {
+ "id": 4
+ },
+ "2.0.0/forwarder/interfaces/IAssets.sol": {
+ "id": 5
+ },
+ "2.0.0/forwarder/interfaces/IForwarderCore.sol": {
+ "id": 6
+ },
+ "2.0.0/forwarder/libs/LibConstants.sol": {
+ "id": 7
+ },
+ "2.0.0/forwarder/mixins/MAssets.sol": {
+ "id": 8
+ },
+ "2.0.0/forwarder/mixins/MExchangeWrapper.sol": {
+ "id": 9
+ },
+ "2.0.0/forwarder/mixins/MWeth.sol": {
+ "id": 10
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 11
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchange.sol": {
+ "id": 12
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 13
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 14
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 15
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 16
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": {
+ "id": 17
+ },
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol": {
+ "id": 18
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 19
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 20
+ },
+ "2.0.0/protocol/Exchange/libs/LibMath.sol": {
+ "id": 21
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 22
+ },
+ "2.0.0/tokens/ERC20Token/IERC20Token.sol": {
+ "id": 23
+ },
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": {
+ "id": 24
+ },
+ "2.0.0/tokens/EtherToken/IEtherToken.sol": {
+ "id": 25
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 26
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 27
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 28
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 29
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/forwarder/Forwarder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./MixinWeth.sol\";\nimport \"./MixinForwarderCore.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./MixinAssets.sol\";\nimport \"./MixinExchangeWrapper.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract Forwarder is\n LibConstants,\n MixinWeth,\n MixinAssets,\n MixinExchangeWrapper,\n MixinForwarderCore\n{\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n LibConstants(\n _exchange,\n _etherToken,\n _zrxToken,\n _zrxAssetData,\n _wethAssetData\n )\n MixinForwarderCore()\n {}\n}\n",
+ "2.0.0/forwarder/MixinAssets.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 solidity 0.4.24;\n\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../utils/Ownable/Ownable.sol\";\nimport \"../tokens/ERC20Token/IERC20Token.sol\";\nimport \"../tokens/ERC721Token/IERC721Token.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MAssets.sol\";\n\n\ncontract MixinAssets is\n Ownable,\n LibConstants,\n MAssets\n{\n\n using LibBytes for bytes;\n\n bytes4 constant internal ERC20_TRANSFER_SELECTOR = bytes4(keccak256(\"transfer(address,uint256)\"));\n\n /// @dev Withdraws assets from this contract. The contract requires a ZRX balance in order to \n /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be\n /// used to withdraw assets that were accidentally sent to this contract.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of ERC20 token to withdraw.\n function withdrawAsset(\n bytes assetData,\n uint256 amount\n )\n external\n onlyOwner\n {\n transferAssetToSender(assetData, amount);\n }\n\n /// @dev Transfers given amount of asset to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferAssetToSender(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n bytes4 proxyId = assetData.readBytes4(0);\n\n if (proxyId == ERC20_DATA_ID) {\n transferERC20Token(assetData, amount);\n } else if (proxyId == ERC721_DATA_ID) {\n transferERC721Token(assetData, amount);\n } else {\n revert(\"UNSUPPORTED_TOKEN_PROXY\");\n }\n }\n\n /// @dev Decodes ERC20 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC20Token(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n address token = assetData.readAddress(16);\n\n // Transfer tokens.\n // We do a raw call so we can check the success separate\n // from the return data.\n bool success = token.call(abi.encodeWithSelector(\n ERC20_TRANSFER_SELECTOR,\n msg.sender,\n amount\n ));\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n \n // Check return data.\n // If there is no return data, we assume the token incorrectly\n // does not return a bool. In this case we expect it to revert\n // on failure, which was handled above.\n // If the token does return data, we require that it is a single\n // value that evaluates to true.\n assembly {\n if returndatasize {\n success := 0\n if eq(returndatasize, 32) {\n // First 64 bytes of memory are reserved scratch space\n returndatacopy(0, 0, 32)\n success := mload(0)\n }\n }\n }\n require(\n success,\n \"TRANSFER_FAILED\"\n );\n }\n\n /// @dev Decodes ERC721 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC721Token(\n bytes memory assetData,\n uint256 amount\n )\n internal\n {\n require(\n amount == 1,\n \"INVALID_AMOUNT\"\n );\n // Decode asset data.\n address token = assetData.readAddress(16);\n uint256 tokenId = assetData.readUint256(36);\n\n // Perform transfer.\n IERC721Token(token).transferFrom(\n address(this),\n msg.sender,\n tokenId\n );\n }\n}\n",
+ "2.0.0/forwarder/MixinExchangeWrapper.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MExchangeWrapper.sol\";\nimport \"../protocol/Exchange/libs/LibAbiEncoder.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\n\n\ncontract MixinExchangeWrapper is\n LibAbiEncoder,\n LibFillResults,\n LibMath,\n LibConstants,\n MExchangeWrapper\n{\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (FillResults memory fillResults)\n {\n // ABI encode calldata for `fillOrder`\n bytes memory fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n\n address exchange = address(EXCHANGE);\n\n // Call `fillOrder` and handle any exceptions gracefully\n assembly {\n let success := call(\n gas, // forward all gas, TODO: look into gas consumption of assert/throw\n exchange, // call address of Exchange contract\n 0, // transfer 0 wei\n add(fillOrderCalldata, 32), // pointer to start of input (skip array length in first 32 bytes)\n mload(fillOrderCalldata), // length of input\n fillOrderCalldata, // write output over input\n 128 // output size is 128 bytes\n )\n switch success\n case 0 {\n mstore(fillResults, 0)\n mstore(add(fillResults, 32), 0)\n mstore(add(fillResults, 64), 0)\n mstore(add(fillResults, 96), 0)\n }\n case 1 {\n mstore(fillResults, mload(fillOrderCalldata))\n mstore(add(fillResults, 32), mload(add(fillOrderCalldata, 32)))\n mstore(add(fillResults, 64), mload(add(fillOrderCalldata, 64)))\n mstore(add(fillResults, 96), mload(add(fillOrderCalldata, 96)))\n }\n }\n return fillResults;\n }\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param wethSellAmount Desired amount of WETH to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellWeth(\n LibOrder.Order[] memory orders,\n uint256 wethSellAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // We assume that asset being sold by taker is WETH for each order.\n orders[i].makerAssetData = makerAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of WETH to sell\n uint256 remainingTakerAssetFillAmount = safeSub(wethSellAmount, totalFillResults.takerAssetFilledAmount);\n\n // Attempt to sell the remaining amount of WETH\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of takerAsset has been sold\n if (totalFillResults.takerAssetFilledAmount >= wethSellAmount) {\n break;\n }\n }\n return totalFillResults;\n }\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// The asset being sold by taker must always be WETH.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyExactAmountWithWeth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n bytes memory makerAssetData = orders[0].makerAssetData;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // We assume that asset being bought by taker is the same for each order.\n // We assume that asset being sold by taker is WETH for each order.\n orders[i].makerAssetData = makerAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of makerAsset to buy\n uint256 remainingMakerAssetFillAmount = safeSub(makerAssetFillAmount, totalFillResults.makerAssetFilledAmount);\n\n // Convert the remaining amount of makerAsset to buy into remaining amount\n // of takerAsset to sell, assuming entire amount can be sold in the current order\n uint256 remainingTakerAssetFillAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n orders[i].makerAssetAmount,\n remainingMakerAssetFillAmount\n );\n\n // Attempt to sell the remaining amount of takerAsset\n FillResults memory singleFillResults = fillOrderNoThrow(\n orders[i],\n remainingTakerAssetFillAmount,\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker\n addFillResults(totalFillResults, singleFillResults);\n\n // Stop execution if the entire amount of makerAsset has been bought\n uint256 makerAssetFilledAmount = totalFillResults.makerAssetFilledAmount;\n if (makerAssetFilledAmount >= makerAssetFillAmount) {\n break;\n }\n }\n\n require(\n makerAssetFilledAmount >= makerAssetFillAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return totalFillResults;\n }\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee\n /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX\n /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// The asset being sold by taker must always be WETH. \n /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.\n /// @param zrxBuyAmount Desired amount of ZRX to buy.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function marketBuyExactZrxWithWeth(\n LibOrder.Order[] memory orders,\n uint256 zrxBuyAmount,\n bytes[] memory signatures\n )\n internal\n returns (FillResults memory totalFillResults)\n {\n // Do nothing if zrxBuyAmount == 0\n if (zrxBuyAmount == 0) {\n return totalFillResults;\n }\n\n bytes memory zrxAssetData = ZRX_ASSET_DATA;\n bytes memory wethAssetData = WETH_ASSET_DATA;\n uint256 zrxPurchased = 0;\n\n uint256 ordersLength = orders.length;\n for (uint256 i = 0; i != ordersLength; i++) {\n\n // All of these are ZRX/WETH, so we can drop the respective assetData from calldata.\n orders[i].makerAssetData = zrxAssetData;\n orders[i].takerAssetData = wethAssetData;\n\n // Calculate the remaining amount of ZRX to buy.\n uint256 remainingZrxBuyAmount = safeSub(zrxBuyAmount, zrxPurchased);\n\n // Convert the remaining amount of ZRX to buy into remaining amount\n // of WETH to sell, assuming entire amount can be sold in the current order.\n uint256 remainingWethSellAmount = getPartialAmount(\n orders[i].takerAssetAmount,\n safeSub(orders[i].makerAssetAmount, orders[i].takerFee), // our exchange rate after fees \n remainingZrxBuyAmount\n );\n\n // Attempt to sell the remaining amount of WETH.\n FillResults memory singleFillResult = fillOrderNoThrow(\n orders[i],\n safeAdd(remainingWethSellAmount, 1), // we add 1 wei to the fill amount to make up for rounding errors\n signatures[i]\n );\n\n // Update amounts filled and fees paid by maker and taker.\n addFillResults(totalFillResults, singleFillResult);\n zrxPurchased = safeSub(totalFillResults.makerAssetFilledAmount, totalFillResults.takerFeePaid);\n\n // Stop execution if the entire amount of ZRX has been bought.\n if (zrxPurchased >= zrxBuyAmount) {\n break;\n }\n }\n\n require(\n zrxPurchased >= zrxBuyAmount,\n \"COMPLETE_FILL_FAILED\"\n );\n return totalFillResults;\n }\n}\n",
+ "2.0.0/forwarder/MixinForwarderCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MWeth.sol\";\nimport \"./mixins/MAssets.sol\";\nimport \"./mixins/MExchangeWrapper.sol\";\nimport \"./interfaces/IForwarderCore.sol\";\nimport \"../utils/LibBytes/LibBytes.sol\";\nimport \"../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../protocol/Exchange/libs/LibMath.sol\";\n\n\ncontract MixinForwarderCore is\n LibFillResults,\n LibMath,\n LibConstants,\n MWeth,\n MAssets,\n MExchangeWrapper,\n IForwarderCore\n{\n\n using LibBytes for bytes;\n\n /// @dev Constructor approves ERC20 proxy to transfer ZRX and WETH on this contract's behalf.\n constructor ()\n public\n {\n address proxyAddress = EXCHANGE.getAssetProxy(ERC20_DATA_ID);\n if (proxyAddress != address(0)) {\n ETHER_TOKEN.approve(proxyAddress, MAX_UINT);\n ZRX_TOKEN.approve(proxyAddress, MAX_UINT);\n }\n }\n\n /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketSellOrdersWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n FillResults memory orderFillResults,\n FillResults memory feeOrderFillResults\n )\n {\n // Convert ETH to WETH.\n convertEthToWeth();\n\n uint256 wethSellAmount;\n uint256 zrxBuyAmount;\n uint256 makerAssetAmountPurchased;\n if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {\n // Calculate amount of WETH that won't be spent on ETH fees.\n wethSellAmount = getPartialAmount(\n PERCENTAGE_DENOMINATOR,\n safeAdd(PERCENTAGE_DENOMINATOR, feePercentage),\n msg.value\n );\n // Market sell available WETH.\n // ZRX fees are paid with this contract's balance.\n orderFillResults = marketSellWeth(\n orders,\n wethSellAmount,\n signatures\n );\n // The fee amount must be deducted from the amount transfered back to sender.\n makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);\n } else {\n // 5% of WETH is reserved for filling feeOrders and paying feeRecipient.\n wethSellAmount = getPartialAmount(\n MAX_WETH_FILL_PERCENTAGE,\n PERCENTAGE_DENOMINATOR,\n msg.value\n );\n // Market sell 95% of WETH.\n // ZRX fees are payed with this contract's balance.\n orderFillResults = marketSellWeth(\n orders,\n wethSellAmount,\n signatures\n );\n // Buy back all ZRX spent on fees.\n zrxBuyAmount = orderFillResults.takerFeePaid;\n feeOrderFillResults = marketBuyExactZrxWithWeth(\n feeOrders,\n zrxBuyAmount,\n feeSignatures\n );\n makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;\n }\n\n // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.\n // Refund remaining ETH to msg.sender.\n transferEthFeeAndRefund(\n orderFillResults.takerAssetFilledAmount,\n feeOrderFillResults.takerAssetFilledAmount,\n feePercentage,\n feeRecipient\n );\n\n // Transfer purchased assets to msg.sender.\n transferAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);\n }\n\n /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.\n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketBuyOrdersWithEth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n FillResults memory orderFillResults,\n FillResults memory feeOrderFillResults\n )\n {\n // Convert ETH to WETH.\n convertEthToWeth();\n\n uint256 zrxBuyAmount;\n uint256 makerAssetAmountPurchased;\n if (orders[0].makerAssetData.equals(ZRX_ASSET_DATA)) {\n // If the makerAsset is ZRX, it is not necessary to pay fees out of this\n // contracts's ZRX balance because fees are factored into the price of the order.\n orderFillResults = marketBuyExactZrxWithWeth(\n orders,\n makerAssetFillAmount,\n signatures\n );\n // The fee amount must be deducted from the amount transfered back to sender.\n makerAssetAmountPurchased = safeSub(orderFillResults.makerAssetFilledAmount, orderFillResults.takerFeePaid);\n } else {\n // Attemp to purchase desired amount of makerAsset.\n // ZRX fees are payed with this contract's balance.\n orderFillResults = marketBuyExactAmountWithWeth(\n orders,\n makerAssetFillAmount,\n signatures\n );\n // Buy back all ZRX spent on fees.\n zrxBuyAmount = orderFillResults.takerFeePaid;\n feeOrderFillResults = marketBuyExactZrxWithWeth(\n feeOrders,\n zrxBuyAmount,\n feeSignatures\n );\n makerAssetAmountPurchased = orderFillResults.makerAssetFilledAmount;\n }\n\n // Transfer feePercentage of total ETH spent on primary orders to feeRecipient.\n // Refund remaining ETH to msg.sender.\n transferEthFeeAndRefund(\n orderFillResults.takerAssetFilledAmount,\n feeOrderFillResults.takerAssetFilledAmount,\n feePercentage,\n feeRecipient\n );\n\n // Transfer purchased assets to msg.sender.\n transferAssetToSender(orders[0].makerAssetData, makerAssetAmountPurchased);\n }\n}\n",
+ "2.0.0/forwarder/MixinWeth.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 solidity 0.4.24;\n\nimport \"../protocol/Exchange/libs/LibMath.sol\";\nimport \"./libs/LibConstants.sol\";\nimport \"./mixins/MWeth.sol\";\n\n\ncontract MixinWeth is\n LibMath,\n LibConstants,\n MWeth\n{\n\n /// @dev Default payabale function, this allows us to withdraw WETH\n function ()\n public\n payable\n {\n require(\n msg.sender == address(ETHER_TOKEN),\n \"DEFAULT_FUNCTION_WETH_CONTRACT_ONLY\"\n );\n }\n\n /// @dev Converts message call's ETH value into WETH.\n function convertEthToWeth()\n internal\n {\n require(\n msg.value > 0,\n \"INVALID_MSG_VALUE\"\n );\n ETHER_TOKEN.deposit.value(msg.value)();\n }\n\n /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.\n /// Refunds any excess ETH to msg.sender.\n /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.\n /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n function transferEthFeeAndRefund(\n uint256 wethSoldExcludingFeeOrders,\n uint256 wethSoldForZrx,\n uint256 feePercentage,\n address feeRecipient\n )\n internal\n {\n // Ensure feePercentage is less than 5%.\n require(\n feePercentage <= MAX_FEE_PERCENTAGE,\n \"FEE_PERCENTAGE_TOO_LARGE\"\n );\n\n // Ensure that no extra WETH owned by this contract has been sold.\n uint256 wethSold = safeAdd(wethSoldExcludingFeeOrders, wethSoldForZrx);\n require(\n wethSold <= msg.value,\n \"OVERSOLD_WETH\"\n );\n\n // Calculate amount of WETH that hasn't been sold.\n uint256 wethRemaining = safeSub(msg.value, wethSold);\n\n // Calculate ETH fee to pay to feeRecipient.\n uint256 ethFee = getPartialAmount(\n feePercentage,\n PERCENTAGE_DENOMINATOR,\n wethSoldExcludingFeeOrders\n );\n\n // Ensure fee is less than amount of WETH remaining.\n require(\n ethFee <= wethRemaining,\n \"INSUFFICIENT_ETH_REMAINING\"\n );\n \n // Do nothing if no WETH remaining\n if (wethRemaining > 0) {\n // Convert remaining WETH to ETH\n ETHER_TOKEN.withdraw(wethRemaining);\n\n // Pay ETH to feeRecipient\n if (ethFee > 0) {\n feeRecipient.transfer(ethFee);\n }\n\n // Refund remaining ETH to msg.sender.\n uint256 ethRefund = safeSub(wethRemaining, ethFee);\n if (ethRefund > 0) {\n msg.sender.transfer(ethRefund);\n }\n }\n }\n}\n",
+ "2.0.0/forwarder/interfaces/IAssets.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 solidity 0.4.24;\n\n\ncontract IAssets {\n\n /// @dev Withdraws assets from this contract. The contract requires a ZRX balance in order to \n /// function optimally, and this function allows the ZRX to be withdrawn by owner. It may also be\n /// used to withdraw assets that were accidentally sent to this contract.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of ERC20 token to withdraw.\n function withdrawAsset(\n bytes assetData,\n uint256 amount\n )\n external;\n}\n",
+ "2.0.0/forwarder/interfaces/IForwarderCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract IForwarderCore {\n\n /// @dev Purchases as much of orders' makerAssets as possible by selling up to 95% of transaction's ETH value.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// 5% of ETH value is reserved for paying fees to order feeRecipients (in ZRX) and forwarding contract feeRecipient (in ETH).\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketSellOrdersWithEth(\n LibOrder.Order[] memory orders,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n LibFillResults.FillResults memory orderFillResults,\n LibFillResults.FillResults memory feeOrderFillResults\n );\n\n /// @dev Attempt to purchase makerAssetFillAmount of makerAsset by selling ETH provided with transaction.\n /// Any ZRX required to pay fees for primary orders will automatically be purchased by this contract.\n /// Any ETH not spent will be refunded to sender.\n /// @param orders Array of order specifications used containing desired makerAsset and WETH as takerAsset. \n /// @param makerAssetFillAmount Desired amount of makerAsset to purchase.\n /// @param signatures Proofs that orders have been created by makers.\n /// @param feeOrders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset. Used to purchase ZRX for primary order fees.\n /// @param feeSignatures Proofs that feeOrders have been created by makers.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n /// @return Amounts filled and fees paid by maker and taker for both sets of orders.\n function marketBuyOrdersWithEth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures,\n LibOrder.Order[] memory feeOrders,\n bytes[] memory feeSignatures,\n uint256 feePercentage,\n address feeRecipient\n )\n public\n payable\n returns (\n LibFillResults.FillResults memory orderFillResults,\n LibFillResults.FillResults memory feeOrderFillResults\n );\n}\n",
+ "2.0.0/forwarder/libs/LibConstants.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../tokens/EtherToken/IEtherToken.sol\";\nimport \"../../tokens/ERC20Token/IERC20Token.sol\";\n\n\ncontract LibConstants {\n\n bytes4 constant internal ERC20_DATA_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n bytes4 constant internal ERC721_DATA_ID = bytes4(keccak256(\"ERC721Token(address,uint256)\"));\n uint256 constant internal MAX_UINT = 2**256 - 1;\n uint256 constant internal PERCENTAGE_DENOMINATOR = 10**18; \n uint256 constant internal MAX_FEE_PERCENTAGE = 5 * PERCENTAGE_DENOMINATOR / 100; // 5%\n uint256 constant internal MAX_WETH_FILL_PERCENTAGE = 95 * PERCENTAGE_DENOMINATOR / 100; // 95%\n \n // solhint-disable var-name-mixedcase\n IExchange internal EXCHANGE;\n IEtherToken internal ETHER_TOKEN;\n IERC20Token internal ZRX_TOKEN;\n bytes internal ZRX_ASSET_DATA;\n bytes internal WETH_ASSET_DATA;\n // solhint-enable var-name-mixedcase\n\n constructor (\n address _exchange,\n address _etherToken,\n address _zrxToken,\n bytes memory _zrxAssetData,\n bytes memory _wethAssetData\n )\n public\n {\n EXCHANGE = IExchange(_exchange);\n ETHER_TOKEN = IEtherToken(_etherToken);\n ZRX_TOKEN = IERC20Token(_zrxToken);\n ZRX_ASSET_DATA = _zrxAssetData;\n WETH_ASSET_DATA = _wethAssetData;\n }\n}\n",
+ "2.0.0/forwarder/mixins/MAssets.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 solidity 0.4.24;\n\nimport \"../interfaces/IAssets.sol\";\n\n\ncontract MAssets is\n IAssets\n{\n\n /// @dev Transfers given amount of asset to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferAssetToSender(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n\n /// @dev Decodes ERC20 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC20Token(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n\n /// @dev Decodes ERC721 assetData and transfers given amount to sender.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param amount Amount of asset to transfer to sender.\n function transferERC721Token(\n bytes memory assetData,\n uint256 amount\n )\n internal;\n}\n",
+ "2.0.0/forwarder/mixins/MExchangeWrapper.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\n\n\ncontract MExchangeWrapper {\n\n /// @dev Fills the input order.\n /// Returns false if the transaction would otherwise revert.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of WETH has been sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param wethSellAmount Desired amount of WETH to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellWeth(\n LibOrder.Order[] memory orders,\n uint256 wethSellAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// The asset being sold by taker must always be WETH.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyExactAmountWithWeth(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Buys zrxBuyAmount of ZRX fee tokens, taking into account ZRX fees for each order. This will guarantee\n /// that at least zrxBuyAmount of ZRX is purchased (sometimes slightly over due to rounding issues).\n /// It is possible that a request to buy 200 ZRX will require purchasing 202 ZRX\n /// as 2 ZRX is required to purchase the 200 ZRX fee tokens. This guarantees at least 200 ZRX for future purchases.\n /// The asset being sold by taker must always be WETH. \n /// @param orders Array of order specifications containing ZRX as makerAsset and WETH as takerAsset.\n /// @param zrxBuyAmount Desired amount of ZRX to buy.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return totalFillResults Amounts filled and fees paid by maker and taker.\n function marketBuyExactZrxWithWeth(\n LibOrder.Order[] memory orders,\n uint256 zrxBuyAmount,\n bytes[] memory signatures\n )\n internal\n returns (LibFillResults.FillResults memory totalFillResults);\n}\n",
+ "2.0.0/forwarder/mixins/MWeth.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 solidity 0.4.24;\n\n\ncontract MWeth {\n\n /// @dev Converts message call's ETH value into WETH.\n function convertEthToWeth()\n internal;\n\n /// @dev Transfers feePercentage of WETH spent on primary orders to feeRecipient.\n /// Refunds any excess ETH to msg.sender.\n /// @param wethSoldExcludingFeeOrders Amount of WETH sold when filling primary orders.\n /// @param wethSoldForZrx Amount of WETH sold when purchasing ZRX required for primary order fees.\n /// @param feePercentage Percentage of WETH sold that will payed as fee to forwarding contract feeRecipient.\n /// @param feeRecipient Address that will receive ETH when orders are filled.\n function transferEthFeeAndRefund(\n uint256 wethSoldExcludingFeeOrders,\n uint256 wethSoldForZrx,\n uint256 feePercentage,\n address feeRecipient\n )\n internal;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return ABI encoded calldata for `fillOrder`.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))\n\n // Increment free memory pointer\n mstore(0x40, dataAreaEnd)\n }\n\n return fillOrderCalldata;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibMath.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/tokens/ERC20Token/IERC20Token.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 solidity 0.4.24;\n\n\ncontract IERC20Token {\n\n /// @notice send `value` token to `to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint256 _value)\n public\n returns (bool);\n\n /// @notice send `value` token to `to` from `from` on the condition it is approved by `from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint256 _value)\n public\n returns (bool);\n \n /// @notice `msg.sender` approves `_spender` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint256 _value)\n public\n returns (bool);\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner)\n public view\n returns (uint256);\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender)\n public view\n returns (uint256);\n\n // solhint-disable-next-line no-simple-event-func-name\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _value\n );\n \n event Approval(\n address indexed _owner,\n address indexed _spender,\n uint256 _value\n );\n}\n",
+ "2.0.0/tokens/ERC721Token/IERC721Token.sol": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2016 Smart Contract Solutions, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\npragma solidity 0.4.24;\n\n\n/**\n * @title ERC721 Non-Fungible Token Standard basic interface\n * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md\n * Modified from https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Basic.sol\n */\ncontract IERC721Token {\n string internal name_;\n string internal symbol_;\n\n event Transfer(\n address indexed _from,\n address indexed _to,\n uint256 _tokenId\n );\n\n event Approval(\n address indexed _owner,\n address indexed _approved,\n uint256 _tokenId\n );\n\n event ApprovalForAll(\n address indexed _owner,\n address indexed _operator,\n bool _approved\n );\n\n function name()\n public\n view\n returns (string);\n\n function symbol()\n public\n view\n returns (string);\n\n function balanceOf(address _owner)\n public\n view\n returns (uint256 _balance);\n\n function ownerOf(uint256 _tokenId)\n public\n view\n returns (address _owner);\n\n function exists(uint256 _tokenId)\n public\n view\n returns (bool _exists);\n\n function approve(address _to, uint256 _tokenId)\n public;\n\n function getApproved(uint256 _tokenId)\n public\n view\n returns (address _operator);\n\n function setApprovalForAll(address _operator, bool _approved)\n public;\n\n function isApprovedForAll(address _owner, address _operator)\n public\n view\n returns (bool);\n\n function transferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId\n )\n public;\n\n function safeTransferFrom(\n address _from,\n address _to,\n uint256 _tokenId,\n bytes _data\n )\n public;\n}\n",
+ "2.0.0/tokens/EtherToken/IEtherToken.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 solidity 0.4.24;\n\nimport \"../ERC20Token/IERC20Token.sol\";\n\n\ncontract IEtherToken is\n IERC20Token\n{\n function deposit()\n public\n payable;\n \n function withdraw(uint256 amount)\n public;\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x76bd9041e54a4f018634880017c4b2db041b50807a6ba6b3b516d8ce9271ec43",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0xb69e673309512a9d726f87304c6984054f87a93b",
+ "links": {},
+ "constructorArgs": "[\"0x48bacb9266a570d521063ef5dd96e61686dbe788\",\"0x0b1ba0af832d7c05fd64161e0db78e85978e8082\",\"0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b0000000000000000000000000871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c\",\"0xf47261b00000000000000000000000000b1ba0af832d7c05fd64161e0db78e85978e8082\"]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/IAssetData.json b/packages/migrations/artifacts/2.0.0/IAssetData.json
new file mode 100644
index 000000000..f4352ca96
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/IAssetData.json
@@ -0,0 +1,89 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IAssetData",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "tokenContract",
+ "type": "address"
+ },
+ {
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "name": "receiverData",
+ "type": "bytes"
+ }
+ ],
+ "name": "ERC721Token",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "tokenContract",
+ "type": "address"
+ }
+ ],
+ "name": "ERC20Token",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetData.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetData.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\n// solhint-disable\npragma solidity 0.4.24;\n\n\n// @dev Interface of the asset proxy's assetData.\n// The asset proxies take an ABI encoded `bytes assetData` as argument.\n// This argument is ABI encoded as one of the methods of this interface.\ninterface IAssetData {\n\n function ERC20Token(address tokenContract)\n external\n pure;\n \n function ERC721Token(\n address tokenContract,\n uint256 tokenId,\n bytes receiverData\n )\n external\n pure;\n \n}\n"
+ },
+ "sourceTreeHashHex": "0x10f0df50f72cf7bac6d3719d59a2653e09ef05b38f349efd7d9417e844e165ca",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/IAssetProxy.json b/packages/migrations/artifacts/2.0.0/IAssetProxy.json
new file mode 100644
index 000000000..2959c35b8
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/IAssetProxy.json
@@ -0,0 +1,175 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IAssetProxy",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetData",
+ "type": "bytes"
+ },
+ {
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getProxyId",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 2
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.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 solidity 0.4.24;\n\nimport \"./IAuthorizable.sol\";\n\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n"
+ },
+ "sourceTreeHashHex": "0x436aae2314863ac0046cc1462a09e9aca7bf9a8b8eb9ac172bd86e74c38ce802",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/IValidator.json b/packages/migrations/artifacts/2.0.0/IValidator.json
new file mode 100644
index 000000000..1a8c45a00
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/IValidator.json
@@ -0,0 +1,80 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IValidator",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n"
+ },
+ "sourceTreeHashHex": "0x560b257f8a4e1420a4586d5ba0c40e74042ef5af0f53aad412951444ea710a7e",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/IWallet.json b/packages/migrations/artifacts/2.0.0/IWallet.json
new file mode 100644
index 000000000..56ac59331
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/IWallet.json
@@ -0,0 +1,76 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "IWallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x",
+ "opcodes": "",
+ "sourceMap": ""
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n"
+ },
+ "sourceTreeHashHex": "0x70b7d3c15ab87e6b4b1011d194282163232dfd88486038e4120d6bf245d58e44",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/MixinAuthorizable.json b/packages/migrations/artifacts/2.0.0/MixinAuthorizable.json
new file mode 100644
index 000000000..a65e3829c
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/MixinAuthorizable.json
@@ -0,0 +1,229 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MixinAuthorizable",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "addAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "authorities",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ }
+ ],
+ "name": "removeAuthorizedAddress",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "authorized",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getAuthorizedAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressAdded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "caller",
+ "type": "address"
+ }
+ ],
+ "name": "AuthorizedAddressRemoved",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610d15806100256000396000f30060806040526004361061008d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610092578063494503d4146100c257806370712939146101035780638da5cb5b146101315780639ad2674414610146578063b918161114610177578063d39de6e9146101b9578063f2fde38b1461021e575b600080fd5b34801561009e57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351661024c565b005b3480156100ce57600080fd5b506100da600435610438565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561010f57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351661046d565b34801561013d57600080fd5b506100da610766565b34801561015257600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff60043516602435610782565b34801561018357600080fd5b506101a573ffffffffffffffffffffffffffffffffffffffff60043516610b37565b604080519115158252519081900360200190f35b3480156101c557600080fd5b506101ce610b4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561020a5781810151838201526020016101f2565b505050509050019250505060405180910390f35b34801561022a57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff60043516610bbc565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561036757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061044657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146104f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561058a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561071f578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561060757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561071757600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061065f57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061069257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107119082610ca2565b5061071f565b6001016105d7565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561089e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b600254811061090e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561093457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16146109c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610a3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610aef9082610ca2565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610bb157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610b86575b505050505090505b90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610c9f57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610cc657600083815260209020610cc6918101908301610ccb565b505050565b610bb991905b80821115610ce55760008155600101610cd1565b50905600a165627a7a7230582078a6c5c2f156cb91e8d2ce89507c3ff742d2b051d7da72f7f48e985d643986c70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0xD15 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x103 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x177 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x24C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA PUSH1 0x4 CALLDATALOAD PUSH2 0x438 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x46D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA PUSH2 0x766 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x782 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xB37 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CE PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x20A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBBC JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x367 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x446 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x58A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x71F JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x607 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x717 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x65F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x692 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x711 SWAP1 DUP3 PUSH2 0xCA2 JUMP JUMPDEST POP PUSH2 0x71F JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5D7 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x808 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x90E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x934 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9C2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xA3D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xA70 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xAEF SWAP1 DUP3 PUSH2 0xCA2 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xBB1 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB86 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC42 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC9F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xCC6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xCCB JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xBB9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xCE5 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xCD1 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH25 0xA6C5C2F156CB91E8D2CE89507C3FF742D2B051D7DA72F7F48E SWAP9 0x5d PUSH5 0x3986C70029 ",
+ "sourceMap": "686:2494:0:-;;;329:5:4;:18;;-1:-1:-1;;;;;;329:18:4;337:10;329:18;;;686:2494:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061008d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166342f1181e8114610092578063494503d4146100c257806370712939146101035780638da5cb5b146101315780639ad2674414610146578063b918161114610177578063d39de6e9146101b9578063f2fde38b1461021e575b600080fd5b34801561009e57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351661024c565b005b3480156100ce57600080fd5b506100da600435610438565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561010f57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff6004351661046d565b34801561013d57600080fd5b506100da610766565b34801561015257600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff60043516602435610782565b34801561018357600080fd5b506101a573ffffffffffffffffffffffffffffffffffffffff60043516610b37565b604080519115158252519081900360200190f35b3480156101c557600080fd5b506101ce610b4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561020a5781810151838201526020016101f2565b505050509050019250505060405180910390f35b34801561022a57600080fd5b506100c073ffffffffffffffffffffffffffffffffffffffff60043516610bbc565b60005473ffffffffffffffffffffffffffffffffffffffff1633146102d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604090205460ff161561036757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5441524745545f414c52454144595f415554484f52495a454400000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020819052604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168317905560028054928301815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055513392917f3147867c59d17e8fa9d522465651d44aae0a9e38f902f3475b97e58072f0ed4c91a350565b600280548290811061044657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146104f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561058a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b60025481101561071f578173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561060757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561071757600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061065f57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff909216918390811061069257fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107119082610ca2565b5061071f565b6001016105d7565b604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461080857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561089e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5441524745545f4e4f545f415554484f52495a45440000000000000000000000604482015290519081900360640190fd5b600254811061090e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f494e4445585f4f55545f4f465f424f554e445300000000000000000000000000604482015290519081900360640190fd5b8173ffffffffffffffffffffffffffffffffffffffff1660028281548110151561093457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16146109c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f415554484f52495a45445f414444524553535f4d49534d415443480000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610a3d57fe5b6000918252602090912001546002805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a7057fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610aef9082610ca2565b50604051339073ffffffffffffffffffffffffffffffffffffffff8416907f1f32c1b084e2de0713b8fb16bd46bb9df710a3dbeae2f3ca93af46e016dcc6b090600090a35050565b60016020526000908152604090205460ff1681565b60606002805480602002602001604051908101604052809291908181526020018280548015610bb157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610b86575b505050505090505b90565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c4257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811615610c9f57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115610cc657600083815260209020610cc6918101908301610ccb565b505050565b610bb991905b80821115610ce55760008155600101610cd1565b50905600a165627a7a7230582078a6c5c2f156cb91e8d2ce89507c3ff742d2b051d7da72f7f48e985d643986c70029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x42F1181E DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x494503D4 EQ PUSH2 0xC2 JUMPI DUP1 PUSH4 0x70712939 EQ PUSH2 0x103 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x131 JUMPI DUP1 PUSH4 0x9AD26744 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0xB9181611 EQ PUSH2 0x177 JUMPI DUP1 PUSH4 0xD39DE6E9 EQ PUSH2 0x1B9 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x21E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x24C JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA PUSH1 0x4 CALLDATALOAD PUSH2 0x438 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x10F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x46D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x13D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDA PUSH2 0x766 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x152 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x782 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xB37 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1C5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CE PUSH2 0xB4C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x20A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1F2 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xBBC JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2D2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x367 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F414C52454144595F415554484F52495A454400000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP4 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP3 DUP4 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0x405787FA12A823E0F2B7631CC41B3BA8828B3321CA811111FA75CD3AA3BB5ACE SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD CALLER SWAP3 SWAP2 PUSH32 0x3147867C59D17E8FA9D522465651D44AAE0A9E38F902F3475B97E58072F0ED4C SWAP2 LOG3 POP JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x446 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x58A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST PUSH1 0x2 SLOAD DUP2 LT ISZERO PUSH2 0x71F JUMPI DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x607 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x717 JUMPI PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x65F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0x692 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x711 SWAP1 DUP3 PUSH2 0xCA2 JUMP JUMPDEST POP PUSH2 0x71F JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0x5D7 JUMP JUMPDEST PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x808 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5441524745545F4E4F545F415554484F52495A45440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x2 SLOAD DUP2 LT PUSH2 0x90E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E4445585F4F55545F4F465F424F554E445300000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x934 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9C2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x415554484F52495A45445F414444524553535F4D49534D415443480000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xA3D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x2 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP4 SWAP1 DUP2 LT PUSH2 0xA70 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x2 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xAEF SWAP1 DUP3 PUSH2 0xCA2 JUMP JUMPDEST POP PUSH1 0x40 MLOAD CALLER SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x1F32C1B084E2DE0713B8FB16BD46BB9DF710A3DBEAE2F3CA93AF46E016DCC6B0 SWAP1 PUSH1 0x0 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x2 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xBB1 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB86 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0xC42 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0xC9F JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0xCC6 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0xCC6 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0xCCB JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xBB9 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xCE5 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0xCD1 JUMP JUMPDEST POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH25 0xA6C5C2F156CB91E8D2CE89507C3FF742D2B051D7DA72F7F48E SWAP9 0x5d PUSH5 0x3986C70029 ",
+ "sourceMap": "686:2494:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1146:320;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1146:320:0;;;;;;;;;1031:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1031:28:0;;;;;;;;;;;;;;;;;;;;;;;;1580:547;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1580:547:0;;;;;;;258:20:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:4;;;;2300:643:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2300:643:0;;;;;;;;;982:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;982:43:0;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3040:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3040:138:0;;;;;;;;;;;;;;;;;500:167:4;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:4;;;;;;;1146:320:0;426:5:4;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1263:18:0;;;;;;;:10;:18;;;;;;;;1262:19;1241:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1343:18;;;;;;;1364:4;1343:18;;;;;;;;:25;;;;;;;;1378:11;27:10:-1;;23:18;;;45:23;;1378:24:0;;;;;;;;;;;;;;1417:42;1448:10;;1343:18;1417:42;;;1146:320;:::o;1031:28::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1031:28:0;:::o;1580:547::-;1815:9;426:5:4;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1699:18:0;;;;;;;:10;:18;;;;;;;;1678:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1782:18:0;;;;;;;:10;:18;;;;;1775:25;;;;;;1810:252;1834:11;:18;1830:22;;1810:252;;;1895:6;1877:24;;:11;1889:1;1877:14;;;;;;;;;;;;;;;;;;;;;;:24;1873:179;;;1938:11;1950:18;;:22;;;;1938:35;;;;;;;;;;;;;;;;1921:11;:14;;1938:35;;;;;1933:1;;1921:14;;;;;;;;;;;;;;;:52;;;;;;;;;;;;;;;1991:11;:23;;;;;;;;;:::i;:::-;;2032:5;;1873:179;1854:3;;1810:252;;;2076:44;;2109:10;;2076:44;;;;;;;;;1580:547;;:::o;258:20:4:-;;;;;;:::o;2300:643:0:-;426:5:4;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:18:0;;;;;;;:10;:18;;;;;;;;2442:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:11;:18;2559:26;;2538:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2683:6;2661:28;;:11;2673:5;2661:18;;;;;;;;;;;;;;;;;;;;;;:28;2640:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2760:18;;;;;;;:10;:18;;;;;2753:25;;;;;;2809:11;2821:18;;:22;;;;2809:35;;;;;;;;;;;;;;;;2788:11;:18;;2809:35;;;;;2800:5;;2788:18;;;;;;;;;;;;;;;:56;;;;;;;;;;;;;;;2854:11;:23;;;;;;;;;:::i;:::-;-1:-1:-1;2892:44:0;;2925:10;;2892:44;;;;;;;;;2300:643;;:::o;982:43::-;;;;;;;;;;;;;;;:::o;3040:138::-;3121:9;3160:11;3153:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3040:138;;:::o;500:167:4:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;686:2494:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.sol": {
+ "id": 2
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 3
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 4
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/MixinAuthorizable.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"./mixins/MAuthorizable.sol\";\n\n\ncontract MixinAuthorizable is\n Ownable,\n MAuthorizable\n{\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized {\n require(\n authorized[msg.sender],\n \"SENDER_NOT_AUTHORIZED\"\n );\n _;\n }\n\n mapping (address => bool) public authorized;\n address[] public authorities;\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n !authorized[target],\n \"TARGET_ALREADY_AUTHORIZED\"\n );\n\n authorized[target] = true;\n authorities.push(target);\n emit AuthorizedAddressAdded(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n\n delete authorized[target];\n for (uint256 i = 0; i < authorities.length; i++) {\n if (authorities[i] == target) {\n authorities[i] = authorities[authorities.length - 1];\n authorities.length -= 1;\n break;\n }\n }\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external\n onlyOwner\n {\n require(\n authorized[target],\n \"TARGET_NOT_AUTHORIZED\"\n );\n require(\n index < authorities.length,\n \"INDEX_OUT_OF_BOUNDS\"\n );\n require(\n authorities[index] == target,\n \"AUTHORIZED_ADDRESS_MISMATCH\"\n );\n\n delete authorized[target];\n authorities[index] = authorities[authorities.length - 1];\n authorities.length -= 1;\n emit AuthorizedAddressRemoved(target, msg.sender);\n }\n\n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory)\n {\n return authorities;\n }\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/AssetProxy/mixins/MAuthorizable.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 solidity 0.4.24;\n\nimport \"../interfaces/IAuthorizable.sol\";\n\n\ncontract MAuthorizable is\n IAuthorizable\n{\n\n // Event logged when a new address is authorized.\n event AuthorizedAddressAdded(\n address indexed target,\n address indexed caller\n );\n\n // Event logged when a currently authorized address is unauthorized.\n event AuthorizedAddressRemoved(\n address indexed target,\n address indexed caller\n );\n\n /// @dev Only authorized addresses can invoke functions with this modifier.\n modifier onlyAuthorized { revert(); _; }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x72b8e85e9acb373c8213b2247c5e8811ac500e4a23abc5fa67b7a9d018d7e356",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/MultiSigWallet.json b/packages/migrations/artifacts/2.0.0/MultiSigWallet.json
new file mode 100644
index 000000000..22657f3f6
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/MultiSigWallet.json
@@ -0,0 +1,584 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MultiSigWallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b50604051620019e2380380620019e28339810160405280516020820151910180519091906000908260328211806200004857508181115b8062000052575080155b806200005c575081155b156200006757600080fd5b600092505b84518310156200013b576002600086858151811015156200008957fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000dc57508483815181101515620000c557fe5b90602001906020020151600160a060020a03166000145b15620000e757600080fd5b6001600260008786815181101515620000fc57fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff1916911515919091179055600192909201916200006c565b84516200015090600390602088019062000162565b50505060049190915550620001f69050565b828054828255906000526020600020908101928215620001ba579160200282015b82811115620001ba5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000183565b50620001c8929150620001cc565b5090565b620001f391905b80821115620001c8578054600160a060020a0319168155600101620001d3565b90565b6117dc80620002066000396000f30060806040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461015e578063173825d91461019f57806320ea8d86146101cd5780632f54bf6e146101e55780633411c81c1461022757806354741525146102585780637065cb4814610289578063784547a7146102b75780638b51d13f146102cf5780639ace38c2146102e7578063a0e67e2b146103bc578063a8abe69a14610421578063b5dc40c314610446578063b77bf6001461045e578063ba51a6df14610473578063c01a8c841461048b578063c6427474146104a3578063d74f8edd14610519578063dc8452cd1461052e578063e20056e614610543578063ee22610b14610577575b600034111561015c5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b34801561016a57600080fd5b5061017660043561058f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff600435166105c4565b3480156101d957600080fd5b5061015c60043561081b565b3480156101f157600080fd5b5061021373ffffffffffffffffffffffffffffffffffffffff600435166108f3565b604080519115158252519081900360200190f35b34801561023357600080fd5b5061021360043573ffffffffffffffffffffffffffffffffffffffff60243516610908565b34801561026457600080fd5b5061027760043515156024351515610928565b60408051918252519081900360200190f35b34801561029557600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff60043516610994565b3480156102c357600080fd5b50610213600435610b01565b3480156102db57600080fd5b50610277600435610b92565b3480156102f357600080fd5b506102ff600435610c0e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b8381101561037e578181015183820152602001610366565b50505050905090810190601f1680156103ab5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156103c857600080fd5b506103d1610cf7565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040d5781810151838201526020016103f5565b505050509050019250505060405180910390f35b34801561042d57600080fd5b506103d160043560243560443515156064351515610d67565b34801561045257600080fd5b506103d1600435610ea0565b34801561046a57600080fd5b5061027761104d565b34801561047f57600080fd5b5061015c600435611053565b34801561049757600080fd5b5061015c6004356110ca565b3480156104af57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261027794823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506111c09650505050505050565b34801561052557600080fd5b506102776111df565b34801561053a57600080fd5b506102776111e4565b34801561054f57600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff600435811690602435166111ea565b34801561058357600080fd5b5061015c6004356113fa565b600380548290811061059d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60003330146105d257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561060857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182101561078b578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156106a857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561078057600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061070057fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061073357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061078b565b600190910190610656565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107bc90826116f4565b5060035460045411156107d5576003546107d590611053565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561083957600080fd5b60008281526001602090815260408083203380855292529091205483919060ff16151561086557600080fd5b600084815260208190526040902060030154849060ff161561088657600080fd5b600085815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b60055481101561098d57838015610955575060008181526020819052604090206003015460ff16155b806109795750828015610979575060008181526020819052604090206003015460ff165b15610985576001820191505b60010161092c565b5092915050565b3330146109a057600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16156109d557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff811615156109f857600080fd5b6003805490506001016004546032821180610a1257508181115b80610a1b575080155b80610a24575081155b15610a2e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610b8b5760008481526001602052604081206003805491929184908110610b2f57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610b70576001820191505b600454821415610b835760019250610b8b565b600101610b06565b5050919050565b6000805b600354811015610c085760008381526001602052604081206003805491929184908110610bbf57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610c00576001820191505b600101610b96565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610d5c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d31575b505050505090505b90565b606080600080600554604051908082528060200260200182016040528015610d99578160200160208202803883390190505b50925060009150600090505b600554811015610e2057858015610dce575060008181526020819052604090206003015460ff16155b80610df25750848015610df2575060008181526020819052604090206003015460ff165b15610e1857808383815181101515610e0657fe5b60209081029091010152600191909101905b600101610da5565b878703604051908082528060200260200182016040528015610e4c578160200160208202803883390190505b5093508790505b86811015610e95578281815181101515610e6957fe5b9060200190602002015184898303815181101515610e8357fe5b60209081029091010152600101610e53565b505050949350505050565b606080600080600380549050604051908082528060200260200182016040528015610ed5578160200160208202803883390190505b50925060009150600090505b600354811015610fb95760008581526001602052604081206003805491929184908110610f0a57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610fb1576003805482908110610f5257fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff90911690849084908110610f8557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101610ee1565b81604051908082528060200260200182016040528015610fe3578160200160208202803883390190505b509350600090505b8181101561104557828181518110151561100157fe5b90602001906020020151848281518110151561101957fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600101610feb565b505050919050565b60055481565b33301461105f57600080fd5b60035481603282118061107157508181115b8061107a575080155b80611083575081155b1561108d57600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff1615156110e857600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16151561111a57600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561114557600080fd5b600085815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a36111b9856113fa565b5050505050565b60006111cd8484846115c1565b90506111d8816110ca565b9392505050565b603281565b60045481565b60003330146111f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16151561122e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff161561126357600080fd5b600092505b600354831015611328578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561129857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561131d57836003848154811015156112d057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611328565b600190920191611268565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff161561141b57600080fd5b61142483610b01565b156115bc57600083815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915581548183015493516002808501805495985073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91831615610100029190910190911604801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b505091505060006040518083038185875af192505050156115665760405183907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26115bc565b60405183907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b505050565b60008373ffffffffffffffffffffffffffffffffffffffff811615156115e657600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff0000000000000000000000000000000000000000169416939093178355516001830155925180519496509193909261167e926002850192910190611718565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b8154818355818111156115bc576000838152602090206115bc918101908301611796565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061175957805160ff1916838001178555611786565b82800160010185558215611786579182015b8281111561178657825182559160200191906001019061176b565b50611792929150611796565b5090565b610d6491905b80821115611792576000815560010161179c5600a165627a7a723058203dd9c866dd08e918bf5ffe8aa4a81cf2983a2a3ea0aff84e121fc918035e54be0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x19E2 CODESIZE SUB DUP1 PUSH3 0x19E2 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD SWAP2 ADD DUP1 MLOAD SWAP1 SWAP2 SWAP1 PUSH1 0x0 SWAP1 DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x48 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x52 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x5C JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x13B JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x89 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xDC JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xC5 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0xE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xFC JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x6C JUMP JUMPDEST DUP5 MLOAD PUSH3 0x150 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x162 JUMP JUMPDEST POP POP POP PUSH1 0x4 SWAP2 SWAP1 SWAP2 SSTORE POP PUSH3 0x1F6 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x1BA JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x1BA JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x183 JUMP JUMPDEST POP PUSH3 0x1C8 SWAP3 SWAP2 POP PUSH3 0x1CC JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x1F3 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x1C8 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x1D3 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x17DC DUP1 PUSH3 0x206 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x15E JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1CD JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x3BC JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x421 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x446 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x473 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x48B JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x519 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x543 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x577 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x15C JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x58F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x81B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x8F3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x908 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x928 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x994 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH2 0xB01 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH1 0x4 CALLDATALOAD PUSH2 0xB92 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FF PUSH1 0x4 CALLDATALOAD PUSH2 0xC0E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x37E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x366 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH2 0xCF7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x40D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F5 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0xD67 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 CALLDATALOAD PUSH2 0xEA0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x104D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x1053 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x10CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x277 SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x11C0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x11DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x11E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x11EA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x583 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x13FA JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x59D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x5D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x78B JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6A8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x780 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x700 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x733 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x78B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x656 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x7BC SWAP1 DUP3 PUSH2 0x16F4 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x7D5 JUMPI PUSH1 0x3 SLOAD PUSH2 0x7D5 SWAP1 PUSH2 0x1053 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x839 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x886 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP8 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x98D JUMPI DUP4 DUP1 ISZERO PUSH2 0x955 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x979 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0x979 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0x985 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x92C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x9A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x9D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x9F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xA12 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xA1B JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xA24 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xA2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xB2F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB70 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xB83 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xB8B JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB06 JUMP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xC08 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xBBF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xC00 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB96 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xCE4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCB9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xCE4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCC7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD99 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xE20 JUMPI DUP6 DUP1 ISZERO PUSH2 0xDCE JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xDF2 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0xDF2 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xE18 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE06 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xDA5 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE4C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xE95 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE69 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE83 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xE53 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xED5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xFB9 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xF0A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0xF52 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0xF85 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xEE1 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFE3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1045 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1001 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1019 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0xFEB JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x105F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1071 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x107A JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x1083 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x108D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x10E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x111A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP8 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x11B9 DUP6 PUSH2 0x13FA JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11CD DUP5 DUP5 DUP5 PUSH2 0x15C1 JUMP JUMPDEST SWAP1 POP PUSH2 0x11D8 DUP2 PUSH2 0x10CA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x11F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x122E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x1328 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1298 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x131D JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x12D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1328 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1268 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x141B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1424 DUP4 PUSH2 0xB01 JUMP JUMPDEST ISZERO PUSH2 0x15BC JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP9 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x151B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14F0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x151B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14FE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD DUP4 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x15BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x167E SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1718 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x15BC JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x15BC SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1796 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1759 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1786 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1786 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1786 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x176B JUMP JUMPDEST POP PUSH2 0x1792 SWAP3 SWAP2 POP PUSH2 0x1796 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xD64 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1792 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x179C JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0xd9 0xc8 PUSH7 0xDD08E918BF5FFE DUP11 LOG4 0xa8 SHR CALLCODE SWAP9 GASPRICE 0x2a RETURNDATACOPY LOG0 0xaf 0xf8 0x4e SLT 0x1f 0xc9 XOR SUB 0x5e SLOAD 0xbe STOP 0x29 ",
+ "sourceMap": "206:11249:0:-;;;2834:370;8:9:-1;5:2;;;30:1;27;20:12;5:2;2834:370:0;;;;;;;;;;;;;;;;;;;;;;2933:14;;2834:370;;;2979:6;;2834:370;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;2986:1;2979:8;;2974:168;2991:7;:14;2989:1;:16;2974:168;;;3030:7;:19;3038:7;3046:1;3038:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3030:19:0;;;;;;;;;;;-1:-1:-1;3030:19:0;;;;;:38;;;3053:7;3061:1;3053:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3053:15:0;3067:1;3053:15;3030:38;3026:65;;;3086:5;;;3026:65;3127:4;3105:7;:19;3113:7;3121:1;3113:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3105:19:0;;;;;;;;;;;-1:-1:-1;3105:19:0;:26;;-1:-1:-1;;3105:26:0;;;;;;;;;;-1:-1:-1;3007:3:0;;;;;2974:168;;;3151:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;;3177:8:0;:20;;;;-1:-1:-1;206:11249:0;;-1:-1:-1;206:11249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;206:11249:0;-1:-1:-1;;;;;206:11249:0;;;;;;;;;;;-1:-1:-1;206:11249:0;;;;;;;-1:-1:-1;206:11249:0;;;-1:-1:-1;206:11249:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;206:11249:0;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061011c5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461015e578063173825d91461019f57806320ea8d86146101cd5780632f54bf6e146101e55780633411c81c1461022757806354741525146102585780637065cb4814610289578063784547a7146102b75780638b51d13f146102cf5780639ace38c2146102e7578063a0e67e2b146103bc578063a8abe69a14610421578063b5dc40c314610446578063b77bf6001461045e578063ba51a6df14610473578063c01a8c841461048b578063c6427474146104a3578063d74f8edd14610519578063dc8452cd1461052e578063e20056e614610543578063ee22610b14610577575b600034111561015c5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b34801561016a57600080fd5b5061017660043561058f565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff600435166105c4565b3480156101d957600080fd5b5061015c60043561081b565b3480156101f157600080fd5b5061021373ffffffffffffffffffffffffffffffffffffffff600435166108f3565b604080519115158252519081900360200190f35b34801561023357600080fd5b5061021360043573ffffffffffffffffffffffffffffffffffffffff60243516610908565b34801561026457600080fd5b5061027760043515156024351515610928565b60408051918252519081900360200190f35b34801561029557600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff60043516610994565b3480156102c357600080fd5b50610213600435610b01565b3480156102db57600080fd5b50610277600435610b92565b3480156102f357600080fd5b506102ff600435610c0e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b8381101561037e578181015183820152602001610366565b50505050905090810190601f1680156103ab5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b3480156103c857600080fd5b506103d1610cf7565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561040d5781810151838201526020016103f5565b505050509050019250505060405180910390f35b34801561042d57600080fd5b506103d160043560243560443515156064351515610d67565b34801561045257600080fd5b506103d1600435610ea0565b34801561046a57600080fd5b5061027761104d565b34801561047f57600080fd5b5061015c600435611053565b34801561049757600080fd5b5061015c6004356110ca565b3480156104af57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261027794823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506111c09650505050505050565b34801561052557600080fd5b506102776111df565b34801561053a57600080fd5b506102776111e4565b34801561054f57600080fd5b5061015c73ffffffffffffffffffffffffffffffffffffffff600435811690602435166111ea565b34801561058357600080fd5b5061015c6004356113fa565b600380548290811061059d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60003330146105d257600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561060857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0182101561078b578273ffffffffffffffffffffffffffffffffffffffff166003838154811015156106a857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561078057600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061070057fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061073357fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061078b565b600190910190610656565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107bc90826116f4565b5060035460045411156107d5576003546107d590611053565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561083957600080fd5b60008281526001602090815260408083203380855292529091205483919060ff16151561086557600080fd5b600084815260208190526040902060030154849060ff161561088657600080fd5b600085815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b6000805b60055481101561098d57838015610955575060008181526020819052604090206003015460ff16155b806109795750828015610979575060008181526020819052604090206003015460ff165b15610985576001820191505b60010161092c565b5092915050565b3330146109a057600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16156109d557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff811615156109f857600080fd5b6003805490506001016004546032821180610a1257508181115b80610a1b575080155b80610a24575081155b15610a2e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610b8b5760008481526001602052604081206003805491929184908110610b2f57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610b70576001820191505b600454821415610b835760019250610b8b565b600101610b06565b5050919050565b6000805b600354811015610c085760008381526001602052604081206003805491929184908110610bbf57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610c00576001820191505b600101610b96565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610ce45780601f10610cb957610100808354040283529160200191610ce4565b820191906000526020600020905b815481529060010190602001808311610cc757829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610d5c57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d31575b505050505090505b90565b606080600080600554604051908082528060200260200182016040528015610d99578160200160208202803883390190505b50925060009150600090505b600554811015610e2057858015610dce575060008181526020819052604090206003015460ff16155b80610df25750848015610df2575060008181526020819052604090206003015460ff165b15610e1857808383815181101515610e0657fe5b60209081029091010152600191909101905b600101610da5565b878703604051908082528060200260200182016040528015610e4c578160200160208202803883390190505b5093508790505b86811015610e95578281815181101515610e6957fe5b9060200190602002015184898303815181101515610e8357fe5b60209081029091010152600101610e53565b505050949350505050565b606080600080600380549050604051908082528060200260200182016040528015610ed5578160200160208202803883390190505b50925060009150600090505b600354811015610fb95760008581526001602052604081206003805491929184908110610f0a57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610fb1576003805482908110610f5257fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff90911690849084908110610f8557fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101610ee1565b81604051908082528060200260200182016040528015610fe3578160200160208202803883390190505b509350600090505b8181101561104557828181518110151561100157fe5b90602001906020020151848281518110151561101957fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600101610feb565b505050919050565b60055481565b33301461105f57600080fd5b60035481603282118061107157508181115b8061107a575080155b80611083575081155b1561108d57600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff1615156110e857600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16151561111a57600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561114557600080fd5b600085815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905187927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a36111b9856113fa565b5050505050565b60006111cd8484846115c1565b90506111d8816110ca565b9392505050565b603281565b60045481565b60003330146111f857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16151561122e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff161561126357600080fd5b600092505b600354831015611328578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561129857fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561131d57836003848154811015156112d057fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611328565b600190920191611268565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff161561141b57600080fd5b61142483610b01565b156115bc57600083815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915581548183015493516002808501805495985073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff91831615610100029190910190911604801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b505091505060006040518083038185875af192505050156115665760405183907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26115bc565b60405183907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b505050565b60008373ffffffffffffffffffffffffffffffffffffffff811615156115e657600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff0000000000000000000000000000000000000000169416939093178355516001830155925180519496509193909261167e926002850192910190611718565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b8154818355818111156115bc576000838152602090206115bc918101908301611796565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061175957805160ff1916838001178555611786565b82800160010185558215611786579182015b8281111561178657825182559160200191906001019061176b565b50611792929150611796565b5090565b610d6491905b80821115611792576000815560010161179c5600a165627a7a723058203dd9c866dd08e918bf5ffe8aa4a81cf2983a2a3ea0aff84e121fc918035e54be0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x11C JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x15E JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1CD JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x227 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x258 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x289 JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2B7 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x2CF JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x2E7 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x3BC JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x421 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x446 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x45E JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x473 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x48B JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x4A3 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x519 JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x52E JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x543 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x577 JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x15C JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x16A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x58F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5C4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1D9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x81B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x8F3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x908 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x264 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x928 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x295 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x994 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x213 PUSH1 0x4 CALLDATALOAD PUSH2 0xB01 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH1 0x4 CALLDATALOAD PUSH2 0xB92 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2FF PUSH1 0x4 CALLDATALOAD PUSH2 0xC0E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x37E JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x366 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AB JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH2 0xCF7 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x40D JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3F5 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x42D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0xD67 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x452 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3D1 PUSH1 0x4 CALLDATALOAD PUSH2 0xEA0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x46A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x104D JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x1053 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x10CA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x277 SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x11C0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x525 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x11DF JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x53A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x277 PUSH2 0x11E4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x54F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x11EA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x583 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x15C PUSH1 0x4 CALLDATALOAD PUSH2 0x13FA JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x59D JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x5D2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x608 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x78B JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x6A8 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x780 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x700 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x733 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x78B JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x656 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x7BC SWAP1 DUP3 PUSH2 0x16F4 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x7D5 JUMPI PUSH1 0x3 SLOAD PUSH2 0x7D5 SWAP1 PUSH2 0x1053 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x839 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x865 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x886 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP8 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x98D JUMPI DUP4 DUP1 ISZERO PUSH2 0x955 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x979 JUMPI POP DUP3 DUP1 ISZERO PUSH2 0x979 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0x985 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x92C JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x9A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x9D5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x9F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xA12 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xA1B JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xA24 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xA2E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xB8B JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xB2F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xB70 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xB83 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xB8B JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB06 JUMP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xC08 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xBBF JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xC00 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB96 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xCE4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCB9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xCE4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCC7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xD5C JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD31 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xD99 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xE20 JUMPI DUP6 DUP1 ISZERO PUSH2 0xDCE JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xDF2 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0xDF2 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xE18 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE06 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xDA5 JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE4C JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xE95 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE69 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xE83 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xE53 JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xED5 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xFB9 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xF0A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xFB1 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0xF52 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0xF85 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xEE1 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xFE3 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1045 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1001 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1019 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0xFEB JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x105F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1071 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x107A JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x1083 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x108D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x10E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x111A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1145 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP8 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x11B9 DUP6 PUSH2 0x13FA JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x11CD DUP5 DUP5 DUP5 PUSH2 0x15C1 JUMP JUMPDEST SWAP1 POP PUSH2 0x11D8 DUP2 PUSH2 0x10CA JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x11F8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x122E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1263 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x1328 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1298 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x131D JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x12D0 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1328 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1268 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x141B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1424 DUP4 PUSH2 0xB01 JUMP JUMPDEST ISZERO PUSH2 0x15BC JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP9 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x151B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14F0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x151B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14FE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x1566 JUMPI PUSH1 0x40 MLOAD DUP4 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x15BC JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15E6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x167E SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1718 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x15BC JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x15BC SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1796 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1759 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1786 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1786 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1786 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x176B JUMP JUMPDEST POP PUSH2 0x1792 SWAP3 SWAP2 POP PUSH2 0x1796 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xD64 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1792 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x179C JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 RETURNDATASIZE 0xd9 0xc8 PUSH7 0xDD08E918BF5FFE DUP11 LOG4 0xa8 SHR CALLCODE SWAP9 GASPRICE 0x2a RETURNDATACOPY LOG0 0xaf 0xf8 0x4e SLT 0x1f 0xc9 XOR SUB 0x5e SLOAD 0xbe STOP 0x29 ",
+ "sourceMap": "206:11249:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2539:1;2527:9;:13;2523:61;;;2554:30;;;2574:9;2554:30;;;;2562:10;;2554:30;;;;;;;;;;2523:61;206:11249;956:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;3731:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3731:460:0;;;;;;;6294:291;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6294:291:0;;;;;910:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;910:40:0;;;;;;;;;;;;;;;;;;;;;;;;;840:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;840:64:0;;;;;;;;;9156:319;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9156:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3331:277:0;;;;;;;7324:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7324:337:0;;;;;8642:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8642:252:0;;;;;785:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9559:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9559:115:0;;;;;;;;;;;;;;;;;10777:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10777:676:0;;;;;;;;;;;;;;;9853:575;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9853:575:0;;;;;1011:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1011:28:0;;;;5010:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5010:207:0;;;;;5826:344;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5826:344:0;;;;;5476:244;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5476:244:0;;-1:-1:-1;5476:244:0;;-1:-1:-1;;;;;;;5476:244:0;237:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;237:41:0;;;;985:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;985:20:0;;;;4390:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4390:449:0;;;;;;;;;;;;6699:474;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6699:474:0;;;;;956:23;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;956:23:0;:::o;3731:460::-;3879:6;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1440:14;;;;;;;:7;:14;;;;;;3821:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;3842:14;;;3859:5;3842:14;;;:7;:14;;;;;:22;;;;;;3859:5;-1:-1:-1;3874:170:0;3891:6;:13;:17;;3889:19;;3874:170;;;3944:5;3931:18;;:6;3938:1;3931:9;;;;;;;;;;;;;;;;;;;;;;:18;3927:117;;;3981:6;3988:13;;:17;;;;3981:25;;;;;;;;;;;;;;;;3969:6;:9;;3981:25;;;;;3976:1;;3969:9;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4024:5;;3927:117;3910:3;;;;;3874:170;;;4053:6;:18;;;;;;;;;:::i;:::-;-1:-1:-1;4096:6:0;:13;4085:8;;:24;4081:74;;;4141:6;:13;4123:32;;:17;:32::i;:::-;4165:19;;;;;;;;;;;1262:1;3731:460;;:::o;6294:291::-;6377:10;1440:14;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1714:28;;;;:13;:28;;;;;;;;6422:10;1714:35;;;;;;;;;6407:13;;6422:10;1714:35;;1713:36;1709:59;;;1763:5;;;1709:59;1996:12;:27;;;;;;;;;;:36;;;6454:13;;1996:36;;1992:59;;;2046:5;;;1992:59;6526:5;6483:28;;;:13;:28;;;;;;;;6512:10;6483:40;;;;;;;;:48;;;;;;6541:37;6497:13;;6541:37;;;1778:1;1483;;6294:291;;:::o;910:40::-;;;;;;;;;;;;;;;:::o;840:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9156:319::-;9263:10;;9289:179;9306:16;;9304:1;:18;9289:179;;;9348:7;:36;;;;-1:-1:-1;9360:12:0;:15;;;;;;;;;;:24;;;;;9359:25;9348:36;:92;;;;9404:8;:36;;;;-1:-1:-1;9416:12:0;:15;;;;;;;;;;:24;;;;;9404:36;9341:127;;;9467:1;9458:10;;;;9341:127;9324:3;;9289:179;;;9156:319;;;;;:::o;3331:277::-;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1332:14;;;;;;;:7;:14;;;;;;3424:5;;1332:14;;1328:37;;;1360:5;;;1328:37;3447:5;2124:13;;;;2120:36;;;2151:5;;;2120:36;3479:6;:13;;;;3495:1;3479:17;3498:8;;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;3522:14;;;;;;;:7;:14;;;;;;:21;;;;3539:4;3522:21;;;;;;3553:6;27:10:-1;;23:18;;;45:23;;3553:18:0;;;;;;;;;;;;3581:20;;;3522:14;3581:20;2166:1;;1375;1262;3331:277;:::o;7324:337::-;7414:4;;;7458:197;7475:6;:13;7473:15;;7458:197;;;7513:28;;;;:13;:28;;;;;7542:6;:9;;7513:28;;;7549:1;;7542:9;;;;;;;;;;;;;;;;;;;;7513:39;;;;;;;;;;;;;;;7509:71;;;7579:1;7570:10;;;;7509:71;7607:8;;7598:5;:17;7594:50;;;7640:4;7633:11;;;;7594:50;7490:3;;7458:197;;;7324:337;;;;;:::o;8642:252::-;8741:10;;8767:120;8784:6;:13;8782:15;;8767:120;;;8820:28;;;;:13;:28;;;;;8849:6;:9;;8820:28;;;8856:1;;8849:9;;;;;;;;;;;;;;;;;;;;8820:39;;;;;;;;;;;;;;;8816:71;;;8886:1;8877:10;;;;8816:71;8799:3;;8767:120;;;8642:252;;;;:::o;785:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;785:49:0;;;;;;;-1:-1:-1;;785:49:0;;;:::o;9559:115::-;9629:9;9661:6;9654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;:::o;10777:676::-;10902:22;10940:32;11013:10;11037:6;10986:16;;10975:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10975:28:0;;10940:63;;11026:1;11013:14;;11060:1;11058:3;;11053:250;11065:16;;11063:1;:18;11053:250;;;11107:7;:36;;;;-1:-1:-1;11119:12:0;:15;;;;;;;;;;:24;;;;;11118:25;11107:36;:92;;;;11163:8;:36;;;;-1:-1:-1;11175:12:0;:15;;;;;;;;;;:24;;;;;11163:36;11100:203;;;11259:1;11231:18;11250:5;11231:25;;;;;;;;;;;;;;;;;;:29;11287:1;11278:10;;;;;11100:203;11083:3;;11053:250;;;11346:4;11341:2;:9;11330:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;11330:21:0;;11312:39;;11368:4;11366:6;;11361:85;11376:2;11374:1;:4;11361:85;;;11425:18;11444:1;11425:21;;;;;;;;;;;;;;;;;;11397:15;11417:4;11413:1;:8;11397:25;;;;;;;;;;;;;;;;;;:49;11380:3;;11361:85;;;10777:676;;;;;;;;;:::o;9853:575::-;9948:24;9988:34;10063:10;10087:6;10039;:13;;;;10025:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10025:28:0;;9988:65;;10076:1;10063:14;;10110:1;10108:3;;10103:186;10115:6;:13;10113:15;;10103:186;;;10151:28;;;;:13;:28;;;;;10180:6;:9;;10151:28;;;10187:1;;10180:9;;;;;;;;;;;;;;;;;;;;10151:39;;;;;;;;;;;;;;;10147:142;;;10237:6;:9;;10244:1;;10237:9;;;;;;;;;;;;;;;;10210:24;;10237:9;;;;;10210:17;;10228:5;;10210:24;;;;;;:36;;;;:24;;;;;;;;;;:36;10273:1;10264:10;;;;;10147:142;10130:3;;10103:186;;;10329:5;10315:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10315:20:0;;10298:37;;10352:1;10350:3;;10345:76;10357:5;10355:1;:7;10345:76;;;10401:17;10419:1;10401:20;;;;;;;;;;;;;;;;;;10381:14;10396:1;10381:17;;;;;;;;;;:40;;;;:17;;;;;;;;;;:40;10364:3;;10345:76;;;9853:575;;;;;;:::o;1011:28::-;;;;:::o;5010:207::-;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;5112:6;:13;5127:9;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;5152:8;:20;;;5182:28;;;;;;;;;;;;;;;;;1262:1;;5010:207;:::o;5826:344::-;5909:10;1440:14;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1558:12;:27;;;;;;;;;;:39;5947:13;;1558:39;;:44;1554:67;;;1616:5;;;1554:67;1863:28;;;;:13;:28;;;;;;;;5998:10;1863:35;;;;;;;;;5983:13;;5998:10;1863:35;;1859:58;;;1912:5;;;1859:58;6024:28;;;;6067:4;6024:28;;;;;;;;6053:10;6024:40;;;;;;;;:47;;;;;;;;;;6081:39;;6038:13;;6081:39;;;6130:33;6149:13;6130:18;:33::i;:::-;1631:1;;1483;5826:344;;:::o;5476:244::-;5580:18;5630:40;5645:11;5658:5;5665:4;5630:14;:40::i;:::-;5614:56;;5680:33;5699:13;5680:18;:33::i;:::-;5476:244;;;;;:::o;237:41::-;276:2;237:41;:::o;985:20::-;;;;:::o;4390:449::-;4561:6;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1440:14;;;;;;;:7;:14;;;;;;4499:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;1332:14;;;;;;;:7;:14;;;;;;4532:8;;1332:14;;1328:37;;;1360:5;;;1328:37;4568:1;4561:8;;4556:149;4573:6;:13;4571:15;;4556:149;;;4622:5;4609:18;;:6;4616:1;4609:9;;;;;;;;;;;;;;;;;;;;;;:18;4605:100;;;4659:8;4647:6;4654:1;4647:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4685:5;;4605:100;4588:3;;;;;4556:149;;;4714:14;;;;4731:5;4714:14;;;:7;:14;;;;;;:22;;;;;;;;;4746:17;;;;;;;;:24;;;;;4714:22;4746:24;;;;4780:19;;4714:14;;4780:19;;;4809:23;;;;;;;;;;;1483:1;1262;4390:449;;;:::o;6699:474::-;6857:14;1996:27;;;;;;;;;;:36;;;6782:13;;1996:36;;1992:59;;;2046:5;;;1992:59;6815:26;6827:13;6815:11;:26::i;:::-;6811:356;;;6874:12;:27;;;;;;;;;;;;6915:11;;;:18;;;;6929:4;6915:18;;;;;;6951:14;;6977:8;;;;6951:44;;6987:7;;;;6951:44;;6874:27;;-1:-1:-1;6951:14:0;;;;;6977:8;6987:7;;6951:44;;;;6987:7;;6951:44;;;;;6915:18;6951:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6947:210;;;7013:24;;7023:13;;7013:24;;;;;6947:210;;;7074:31;;7091:13;;7074:31;;;;;7123:11;;;:19;;;;;;6947:210;6699:474;;;:::o;7994:451::-;8126:18;8096:11;2124:13;;;;2120:36;;;2151:5;;;2120:36;8176:16;;8232:140;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8232:140:0;;;;;;8202:27;;;;;;;;;;:170;;;;;;;;;;;;;;;-1:-1:-1;8202:170:0;;;;;;;8176:16;;-1:-1:-1;8232:140:0;;8202:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8202:170:0;;;;;;;;;;;;;;;;;;;;;;;8382:16;:21;;-1:-1:-1;8382:21:0;;;8413:25;;8424:13;;8413:25;;-1:-1:-1;;8413:25:0;7994:451;;;;;;:::o;206:11249::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;206:11249:0;;;-1:-1:-1;206:11249:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/multisig/MultiSigWallet.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/multisig/MultiSigWallet.sol": "// solhint-disable\npragma solidity ^0.4.10;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x5ad0f32801e51d60f02235477477b56ff9ccd727d6d2646d7efb84d1ffbd7bff",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLock.json b/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLock.json
new file mode 100644
index 000000000..86a4b44b0
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/MultiSigWalletWithTimeLock.json
@@ -0,0 +1,668 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "MultiSigWalletWithTimeLock",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405162001b6938038062001b69833981016040908152815160208301519183015192018051909290839083906000908260328211806200005257508181115b806200005c575080155b8062000066575081155b156200007157600080fd5b600092505b845183101562000145576002600086858151811015156200009357fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000e657508483815181101515620000cf57fe5b90602001906020020151600160a060020a03166000145b15620000f157600080fd5b60016002600087868151811015156200010657fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790556001929092019162000076565b84516200015a90600390602088019062000171565b505050600491909155505060065550620002059050565b828054828255906000526020600020908101928215620001c9579160200282015b82811115620001c95782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000192565b50620001d7929150620001db565b5090565b6200020291905b80821115620001d7578054600160a060020a0319168155600101620001e2565b90565b61195480620002156000396000f30060806040526004361061013d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461017f578063173825d9146101c057806320ea8d86146101ee5780632f54bf6e146102065780633411c81c1461024857806337bd78a01461027957806354741525146102a05780637065cb48146102bf578063784547a7146102ed5780637ad28c51146103055780638b51d13f1461031d5780639ace38c214610335578063a0e67e2b1461040a578063a8abe69a1461046f578063b5dc40c314610494578063b77bf600146104ac578063ba51a6df146104c1578063c01a8c84146104d9578063c6427474146104f1578063d38f2d8214610567578063d74f8edd1461057f578063dc8452cd14610594578063e20056e6146105a9578063ee22610b146105dd575b600034111561017d5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b34801561018b57600080fd5b506101976004356105f5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101cc57600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff6004351661062a565b3480156101fa57600080fd5b5061017d600435610881565b34801561021257600080fd5b5061023473ffffffffffffffffffffffffffffffffffffffff6004351661096e565b604080519115158252519081900360200190f35b34801561025457600080fd5b5061023460043573ffffffffffffffffffffffffffffffffffffffff60243516610983565b34801561028557600080fd5b5061028e6109a3565b60408051918252519081900360200190f35b3480156102ac57600080fd5b5061028e600435151560243515156109a9565b3480156102cb57600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff60043516610a15565b3480156102f957600080fd5b50610234600435610b82565b34801561031157600080fd5b5061017d600435610c13565b34801561032957600080fd5b5061028e600435610c5a565b34801561034157600080fd5b5061034d600435610cd6565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156103cc5781810151838201526020016103b4565b50505050905090810190601f1680156103f95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561041657600080fd5b5061041f610dbf565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045b578181015183820152602001610443565b505050509050019250505060405180910390f35b34801561047b57600080fd5b5061041f60043560243560443515156064351515610e2f565b3480156104a057600080fd5b5061041f600435610f68565b3480156104b857600080fd5b5061028e611115565b3480156104cd57600080fd5b5061017d60043561111b565b3480156104e557600080fd5b5061017d600435611192565b3480156104fd57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261028e94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506112ac9650505050505050565b34801561057357600080fd5b5061028e6004356112cb565b34801561058b57600080fd5b5061028e6112dd565b3480156105a057600080fd5b5061028e6112e2565b3480156105b557600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff600435811690602435166112e8565b3480156105e957600080fd5b5061017d6004356114f8565b600380548290811061060357fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600033301461063857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561066e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018210156107f1578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561070e57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156107e657600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076657fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061079957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107f1565b6001909101906106bc565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108229082611867565b50600354600454111561083b5760035461083b9061111b565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561089f57600080fd5b60008281526001602090815260408083203380855292529091205483919060ff1615156108cb57600080fd5b600084815260208190526040902060030154849060ff16156108ec57600080fd5b846108f681610b82565b1561090057600080fd5b600086815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a3505050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610a0e578380156109d6575060008181526020819052604090206003015460ff16155b806109fa57508280156109fa575060008181526020819052604090206003015460ff165b15610a06576001820191505b6001016109ad565b5092915050565b333014610a2157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610a5657600080fd5b8173ffffffffffffffffffffffffffffffffffffffff81161515610a7957600080fd5b6003805490506001016004546032821180610a9357508181115b80610a9c575080155b80610aa5575081155b15610aaf57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610c0c5760008481526001602052604081206003805491929184908110610bb057fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610bf1576001820191505b600454821415610c045760019250610c0c565b600101610b87565b5050919050565b333014610c1f57600080fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a150565b6000805b600354811015610cd05760008381526001602052604081206003805491929184908110610c8757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610cc8576001820191505b600101610c5e565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610dac5780601f10610d8157610100808354040283529160200191610dac565b820191906000526020600020905b815481529060010190602001808311610d8f57829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610e2457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df9575b505050505090505b90565b606080600080600554604051908082528060200260200182016040528015610e61578160200160208202803883390190505b50925060009150600090505b600554811015610ee857858015610e96575060008181526020819052604090206003015460ff16155b80610eba5750848015610eba575060008181526020819052604090206003015460ff165b15610ee057808383815181101515610ece57fe5b60209081029091010152600191909101905b600101610e6d565b878703604051908082528060200260200182016040528015610f14578160200160208202803883390190505b5093508790505b86811015610f5d578281815181101515610f3157fe5b9060200190602002015184898303815181101515610f4b57fe5b60209081029091010152600101610f1b565b505050949350505050565b606080600080600380549050604051908082528060200260200182016040528015610f9d578160200160208202803883390190505b50925060009150600090505b6003548110156110815760008581526001602052604081206003805491929184908110610fd257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561107957600380548290811061101a57fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff9091169084908490811061104d57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101610fa9565b816040519080825280602002602001820160405280156110ab578160200160208202803883390190505b509350600090505b8181101561110d5782818151811015156110c957fe5b9060200190602002015184828151811015156110e157fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016110b3565b505050919050565b60055481565b33301461112757600080fd5b60035481603282118061113957508181115b80611142575080155b8061114b575081155b1561115557600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff1615156111b057600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1615156111e257600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561120d57600080fd5b8461121781610b82565b1561122157600080fd5b600086815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361129586610b82565b156112a4576112a486426116e9565b505050505050565b60006112b9848484611734565b90506112c481611192565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b60003330146112f657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16151561132c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff161561136157600080fd5b600092505b600354831015611426578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561139657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561141b57836003848154811015156113ce57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611426565b600190920191611366565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff161561151957600080fd5b8261152381610b82565b151561152e57600080fd5b60065460008581526007602052604090205485910142101561154f57600080fd5b600085815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959a5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9183161561010002919091019091160480156116415780601f1061161657610100808354040283529160200191611641565b820191906000526020600020905b81548152906001019060200180831161162457829003601f168201915b505091505060006040518083038185875af1925050501561168c5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26116e2565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5050505050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25050565b60008373ffffffffffffffffffffffffffffffffffffffff8116151561175957600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff000000000000000000000000000000000000000016941693909317835551600183015592518051949650919390926117f1926002850192910190611890565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b81548183558181111561188b5760008381526020902061188b91810190830161190e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118d157805160ff19168380011785556118fe565b828001600101855582156118fe579182015b828111156118fe5782518255916020019190600101906118e3565b5061190a92915061190e565b5090565b610e2c91905b8082111561190a57600081556001016119145600a165627a7a72305820c3cbdcf5873ca37a59e5bce3ab44fcb6c9e7906844f91bde08e3829c3403baa40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x1B69 CODESIZE SUB DUP1 PUSH3 0x1B69 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD SWAP3 ADD DUP1 MLOAD SWAP1 SWAP3 SWAP1 DUP4 SWAP1 DUP4 SWAP1 PUSH1 0x0 SWAP1 DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x52 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x5C JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x66 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x71 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x145 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x93 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xE6 JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xCF JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0xF1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x106 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x1 SWAP3 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x76 JUMP JUMPDEST DUP5 MLOAD PUSH3 0x15A SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x171 JUMP JUMPDEST POP POP POP PUSH1 0x4 SWAP2 SWAP1 SWAP2 SSTORE POP POP PUSH1 0x6 SSTORE POP PUSH3 0x205 SWAP1 POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x1C9 JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x1C9 JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x192 JUMP JUMPDEST POP PUSH3 0x1D7 SWAP3 SWAP2 POP PUSH3 0x1DB JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x202 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x1D7 JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x1E2 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1954 DUP1 PUSH3 0x215 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x2BF JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2ED JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x40A JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x46F JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x494 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x4AC JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x567 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x57F JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x5A9 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x5DD JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x17D JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH1 0x4 CALLDATALOAD PUSH2 0x5F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x62A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x881 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x96E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x983 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x9A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x9A9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xA15 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH2 0xB82 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x311 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0xC13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0xC5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34D PUSH1 0x4 CALLDATALOAD PUSH2 0xCD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x443 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0xE2F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH1 0x4 CALLDATALOAD PUSH2 0xF68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x1115 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x111B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x1192 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x28E SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x12AC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x12CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x12DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x12E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x12E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x14F8 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x603 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x66E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x7F1 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x70E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x766 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x799 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x822 SWAP1 DUP3 PUSH2 0x1867 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x83B JUMPI PUSH1 0x3 SLOAD PUSH2 0x83B SWAP1 PUSH2 0x111B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x8EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x8F6 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xA0E JUMPI DUP4 DUP1 ISZERO PUSH2 0x9D6 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x9FA JUMPI POP DUP3 DUP1 ISZERO PUSH2 0x9FA JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xA06 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x9AD JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xA21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xA56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0xA79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xA93 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xA9C JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xAA5 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xAAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xC0C JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xBB0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xBF1 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xC04 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xC0C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB87 JUMP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xC1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xCD0 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xC87 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xCC8 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC5E JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD81 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE24 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDF9 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE61 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xEE8 JUMPI DUP6 DUP1 ISZERO PUSH2 0xE96 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xEBA JUMPI POP DUP5 DUP1 ISZERO PUSH2 0xEBA JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xEE0 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xECE JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xE6D JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF14 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF5D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF31 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF4B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xF1B JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF9D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1081 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xFD2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1079 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x101A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x104D JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xFA9 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x110D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10C9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10E1 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x10B3 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x1127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1139 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1142 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x114B JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x1155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x11B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x11E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x120D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1217 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x1221 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1295 DUP7 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x12A4 JUMPI PUSH2 0x12A4 DUP7 TIMESTAMP PUSH2 0x16E9 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B9 DUP5 DUP5 DUP5 PUSH2 0x1734 JUMP JUMPDEST SWAP1 POP PUSH2 0x12C4 DUP2 PUSH2 0x1192 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x12F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x132C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1361 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x1426 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1396 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x141B JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13CE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1426 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1366 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1519 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x1523 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x152E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x154F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x1641 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1616 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1641 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1624 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x168C JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x16E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x1759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x17F1 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1890 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x188B JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x188B SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x190E JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x18D1 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x18FE JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x18FE JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x18FE JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x18E3 JUMP JUMPDEST POP PUSH2 0x190A SWAP3 SWAP2 POP PUSH2 0x190E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xE2C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x190A JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1914 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc3 0xcb 0xdc 0xf5 DUP8 EXTCODECOPY LOG3 PUSH27 0x59E5BCE3AB44FCB6C9E7906844F91BDE08E3829C3403BAA4002900 ",
+ "sourceMap": "835:3594:1:-;;;1884:213;8:9:-1;5:2;;;30:1;27;20:12;5:2;1884:213:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;2933:14:0;;1884:213:1;;;;;;;2979:6:0;;1884:213:1;276:2:0;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;2986:1;2979:8;;2974:168;2991:7;:14;2989:1;:16;2974:168;;;3030:7;:19;3038:7;3046:1;3038:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3030:19:0;;;;;;;;;;;-1:-1:-1;3030:19:0;;;;;:38;;;3053:7;3061:1;3053:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3053:15:0;3067:1;3053:15;3030:38;3026:65;;;3086:5;;;3026:65;3127:4;3105:7;:19;3113:7;3121:1;3113:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3105:19:0;;;;;;;;;;;-1:-1:-1;3105:19:0;:26;;-1:-1:-1;;3105:26:0;;;;;;;;;;-1:-1:-1;3007:3:0;;;;;2974:168;;;3151:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;;;3177:8:0;:20;;;;-1:-1:-1;;2052:17:1;:38;-1:-1:-1;835:3594:1;;-1:-1:-1;835:3594:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;835:3594:1;-1:-1:-1;;;;;835:3594:1;;;;;;;;;;;-1:-1:-1;835:3594:1;;;;;;;-1:-1:-1;835:3594:1;;;-1:-1:-1;835:3594:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;835:3594:1;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061013d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663025e7c27811461017f578063173825d9146101c057806320ea8d86146101ee5780632f54bf6e146102065780633411c81c1461024857806337bd78a01461027957806354741525146102a05780637065cb48146102bf578063784547a7146102ed5780637ad28c51146103055780638b51d13f1461031d5780639ace38c214610335578063a0e67e2b1461040a578063a8abe69a1461046f578063b5dc40c314610494578063b77bf600146104ac578063ba51a6df146104c1578063c01a8c84146104d9578063c6427474146104f1578063d38f2d8214610567578063d74f8edd1461057f578063dc8452cd14610594578063e20056e6146105a9578063ee22610b146105dd575b600034111561017d5760408051348152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b005b34801561018b57600080fd5b506101976004356105f5565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101cc57600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff6004351661062a565b3480156101fa57600080fd5b5061017d600435610881565b34801561021257600080fd5b5061023473ffffffffffffffffffffffffffffffffffffffff6004351661096e565b604080519115158252519081900360200190f35b34801561025457600080fd5b5061023460043573ffffffffffffffffffffffffffffffffffffffff60243516610983565b34801561028557600080fd5b5061028e6109a3565b60408051918252519081900360200190f35b3480156102ac57600080fd5b5061028e600435151560243515156109a9565b3480156102cb57600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff60043516610a15565b3480156102f957600080fd5b50610234600435610b82565b34801561031157600080fd5b5061017d600435610c13565b34801561032957600080fd5b5061028e600435610c5a565b34801561034157600080fd5b5061034d600435610cd6565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018060200183151515158152602001828103825284818151815260200191508051906020019080838360005b838110156103cc5781810151838201526020016103b4565b50505050905090810190601f1680156103f95780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561041657600080fd5b5061041f610dbf565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561045b578181015183820152602001610443565b505050509050019250505060405180910390f35b34801561047b57600080fd5b5061041f60043560243560443515156064351515610e2f565b3480156104a057600080fd5b5061041f600435610f68565b3480156104b857600080fd5b5061028e611115565b3480156104cd57600080fd5b5061017d60043561111b565b3480156104e557600080fd5b5061017d600435611192565b3480156104fd57600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261028e94823573ffffffffffffffffffffffffffffffffffffffff169460248035953695946064949201919081908401838280828437509497506112ac9650505050505050565b34801561057357600080fd5b5061028e6004356112cb565b34801561058b57600080fd5b5061028e6112dd565b3480156105a057600080fd5b5061028e6112e2565b3480156105b557600080fd5b5061017d73ffffffffffffffffffffffffffffffffffffffff600435811690602435166112e8565b3480156105e957600080fd5b5061017d6004356114f8565b600380548290811061060357fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600033301461063857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16151561066e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591505b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018210156107f1578273ffffffffffffffffffffffffffffffffffffffff1660038381548110151561070e57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156107e657600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061076657fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918490811061079957fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107f1565b6001909101906106bc565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906108229082611867565b50600354600454111561083b5760035461083b9061111b565b60405173ffffffffffffffffffffffffffffffffffffffff8416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a2505050565b3360008181526002602052604090205460ff16151561089f57600080fd5b60008281526001602090815260408083203380855292529091205483919060ff1615156108cb57600080fd5b600084815260208190526040902060030154849060ff16156108ec57600080fd5b846108f681610b82565b1561090057600080fd5b600086815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a3505050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610a0e578380156109d6575060008181526020819052604090206003015460ff16155b806109fa57508280156109fa575060008181526020819052604090206003015460ff165b15610a06576001820191505b6001016109ad565b5092915050565b333014610a2157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610a5657600080fd5b8173ffffffffffffffffffffffffffffffffffffffff81161515610a7957600080fd5b6003805490506001016004546032821180610a9357508181115b80610a9c575080155b80610aa5575081155b15610aaf57600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b600080805b600354811015610c0c5760008481526001602052604081206003805491929184908110610bb057fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610bf1576001820191505b600454821415610c045760019250610c0c565b600101610b87565b5050919050565b333014610c1f57600080fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a150565b6000805b600354811015610cd05760008381526001602052604081206003805491929184908110610c8757fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610cc8576001820191505b600101610c5e565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610dac5780601f10610d8157610100808354040283529160200191610dac565b820191906000526020600020905b815481529060010190602001808311610d8f57829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610e2457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610df9575b505050505090505b90565b606080600080600554604051908082528060200260200182016040528015610e61578160200160208202803883390190505b50925060009150600090505b600554811015610ee857858015610e96575060008181526020819052604090206003015460ff16155b80610eba5750848015610eba575060008181526020819052604090206003015460ff165b15610ee057808383815181101515610ece57fe5b60209081029091010152600191909101905b600101610e6d565b878703604051908082528060200260200182016040528015610f14578160200160208202803883390190505b5093508790505b86811015610f5d578281815181101515610f3157fe5b9060200190602002015184898303815181101515610f4b57fe5b60209081029091010152600101610f1b565b505050949350505050565b606080600080600380549050604051908082528060200260200182016040528015610f9d578160200160208202803883390190505b50925060009150600090505b6003548110156110815760008581526001602052604081206003805491929184908110610fd257fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561107957600380548290811061101a57fe5b600091825260209091200154835173ffffffffffffffffffffffffffffffffffffffff9091169084908490811061104d57fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830290910190910152600191909101905b600101610fa9565b816040519080825280602002602001820160405280156110ab578160200160208202803883390190505b509350600090505b8181101561110d5782818151811015156110c957fe5b9060200190602002015184828151811015156110e157fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302909101909101526001016110b3565b505050919050565b60055481565b33301461112757600080fd5b60035481603282118061113957508181115b80611142575080155b8061114b575081155b1561115557600080fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a1505050565b3360008181526002602052604090205460ff1615156111b057600080fd5b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1615156111e257600080fd5b60008381526001602090815260408083203380855292529091205484919060ff161561120d57600080fd5b8461121781610b82565b1561122157600080fd5b600086815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a361129586610b82565b156112a4576112a486426116e9565b505050505050565b60006112b9848484611734565b90506112c481611192565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b60003330146112f657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff16151561132c57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040902054839060ff161561136157600080fd5b600092505b600354831015611426578473ffffffffffffffffffffffffffffffffffffffff1660038481548110151561139657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561141b57836003848154811015156113ce57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611426565b600190920191611366565b73ffffffffffffffffffffffffffffffffffffffff80861660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25050505050565b600081815260208190526040812060030154829060ff161561151957600080fd5b8261152381610b82565b151561152e57600080fd5b60065460008581526007602052604090205485910142101561154f57600080fd5b600085815260208190526040908190206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155815481830154935160028085018054959a5073ffffffffffffffffffffffffffffffffffffffff909316959492939192839285927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9183161561010002919091019091160480156116415780601f1061161657610100808354040283529160200191611641565b820191906000526020600020905b81548152906001019060200180831161162457829003601f168201915b505091505060006040518083038185875af1925050501561168c5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a26116e2565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a26003840180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5050505050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25050565b60008373ffffffffffffffffffffffffffffffffffffffff8116151561175957600080fd5b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff000000000000000000000000000000000000000016941693909317835551600183015592518051949650919390926117f1926002850192910190611890565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b81548183558181111561188b5760008381526020902061188b91810190830161190e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118d157805160ff19168380011785556118fe565b828001600101855582156118fe579182015b828111156118fe5782518255916020019190600101906118e3565b5061190a92915061190e565b5090565b610e2c91905b8082111561190a57600081556001016119145600a165627a7a72305820c3cbdcf5873ca37a59e5bce3ab44fcb6c9e7906844f91bde08e3829c3403baa40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x17F JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1C0 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x206 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x279 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x2A0 JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x2BF JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x2ED JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x305 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x31D JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x335 JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x40A JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x46F JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x494 JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x4AC JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x4C1 JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x4D9 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x4F1 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x567 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x57F JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x594 JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x5A9 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x5DD JUMPI JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x17D JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH1 0x4 CALLDATALOAD PUSH2 0x5F5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x62A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x881 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x212 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x96E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x254 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x983 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x285 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x9A3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x9A9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0xA15 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH2 0xB82 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x311 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0xC13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x329 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0xC5A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x341 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x34D PUSH1 0x4 CALLDATALOAD PUSH2 0xCD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3CC JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3B4 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3F9 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x416 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH2 0xDBF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x45B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x443 JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x47B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0xE2F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x41F PUSH1 0x4 CALLDATALOAD PUSH2 0xF68 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x1115 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x111B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x1192 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x28E SWAP5 DUP3 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x12AC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x573 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH1 0x4 CALLDATALOAD PUSH2 0x12CB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x58B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x12DD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5A0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x28E PUSH2 0x12E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x12E8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17D PUSH1 0x4 CALLDATALOAD PUSH2 0x14F8 JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x603 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x638 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x66E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP3 LT ISZERO PUSH2 0x7F1 JUMPI DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x70E JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x7E6 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x766 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x3 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x799 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x7F1 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x6BC JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0x822 SWAP1 DUP3 PUSH2 0x1867 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x83B JUMPI PUSH1 0x3 SLOAD PUSH2 0x83B SWAP1 PUSH2 0x111B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x89F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x8EC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x8F6 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x900 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xA0E JUMPI DUP4 DUP1 ISZERO PUSH2 0x9D6 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x9FA JUMPI POP DUP3 DUP1 ISZERO PUSH2 0x9FA JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xA06 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0x9AD JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xA21 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xA56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0xA79 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xA93 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xA9C JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xAA5 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xAAF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP2 DUP3 ADD DUP2 SSTORE DUP4 MSTORE PUSH32 0xC2575A0E9E593C00F959F8C92F12DB2869C3395A3B0502D05E2516446F71F85B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND DUP5 OR SWAP1 SSTORE MLOAD PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP2 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xC0C JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xBB0 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xBF1 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0xC04 JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0xC0C JUMP JUMPDEST PUSH1 0x1 ADD PUSH2 0xB87 JUMP JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0xC1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0xCD0 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xC87 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xCC8 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x1 ADD PUSH2 0xC5E JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x1 DUP1 DUP4 ADD SLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD DUP8 MLOAD PUSH2 0x100 SWAP6 DUP3 AND ISZERO SWAP6 SWAP1 SWAP6 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP9 SWAP1 DIV DUP9 MUL DUP5 ADD DUP9 ADD SWAP1 SWAP7 MSTORE DUP6 DUP4 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP1 SWAP5 SWAP2 SWAP3 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD81 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x3 SWAP1 SWAP4 ADD SLOAD SWAP2 SWAP3 POP POP PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0xE24 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xDF9 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xE61 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xEE8 JUMPI DUP6 DUP1 ISZERO PUSH2 0xE96 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xEBA JUMPI POP DUP5 DUP1 ISZERO PUSH2 0xEBA JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST ISZERO PUSH2 0xEE0 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xECE JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xE6D JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF14 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0xF5D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF31 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF4B JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 ADD PUSH2 0xF1B JUMP JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP1 PUSH1 0x0 DUP1 PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0xF9D JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1081 JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0xFD2 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP1 SWAP2 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 MSTORE DUP3 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH1 0x40 ADD SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1079 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x101A JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD DUP4 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 DUP5 SWAP1 DUP5 SWAP1 DUP2 LT PUSH2 0x104D JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST PUSH1 0x1 ADD PUSH2 0xFA9 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x10AB JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CODESIZE DUP4 CODECOPY ADD SWAP1 POP JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x110D JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10C9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x10E1 JUMPI INVALID JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 ADD PUSH2 0x10B3 JUMP JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST CALLER ADDRESS EQ PUSH2 0x1127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x1139 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x1142 JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x114B JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x1155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x11B0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO ISZERO PUSH2 0x11E2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP1 DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 KECCAK256 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x120D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH2 0x1217 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x1221 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 CALLER DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1295 DUP7 PUSH2 0xB82 JUMP JUMPDEST ISZERO PUSH2 0x12A4 JUMPI PUSH2 0x12A4 DUP7 TIMESTAMP PUSH2 0x16E9 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x12B9 DUP5 DUP5 DUP5 PUSH2 0x1734 JUMP JUMPDEST SWAP1 POP PUSH2 0x12C4 DUP2 PUSH2 0x1192 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 CALLER ADDRESS EQ PUSH2 0x12F6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x132C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1361 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x1426 JUMPI DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1396 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x141B JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13CE JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x1426 JUMP JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1366 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1519 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH2 0x1523 DUP2 PUSH2 0xB82 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x152E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x154F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x1641 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1616 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1641 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1624 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 GAS CALL SWAP3 POP POP POP ISZERO PUSH2 0x168C JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0x16E2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x1759 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x17F1 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1890 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x188B JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x188B SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x190E JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x18D1 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x18FE JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x18FE JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x18FE JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x18E3 JUMP JUMPDEST POP PUSH2 0x190A SWAP3 SWAP2 POP PUSH2 0x190E JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xE2C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x190A JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1914 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc3 0xcb 0xdc 0xf5 DUP8 EXTCODECOPY LOG3 PUSH27 0x59E5BCE3AB44FCB6C9E7906844F91BDE08E3829C3403BAA4002900 ",
+ "sourceMap": "835:3594:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2539:1:0;2527:9;:13;2523:61;;;2554:30;;;2574:9;2554:30;;;;2562:10;;2554:30;;;;;;;;;;2523:61;835:3594:1;956:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;3731:460;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3731:460:0;;;;;;;3176:332:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3176:332:1;;;;;910:40:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;910:40:0;;;;;;;;;;;;;;;;;;;;;;;;;840:64;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;840:64:0;;;;;;;;;1029:29:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1029:29:1;;;;;;;;;;;;;;;;;;;;9156:319:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9156:319:0;;;;;;;;;;;3331:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3331:277:0;;;;;;;7324:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7324:337:0;;;;;2301:186:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2301:186:1;;;;;8642:252:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8642:252:0;;;;;785:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9559:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9559:115:0;;;;;;;;;;;;;;;;;10777:676;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10777:676:0;;;;;;;;;;;;;;;9853:575;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9853:575:0;;;;;1011:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1011:28:0;;;;5010:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5010:207:0;;;;;2593:459:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2593:459:1;;;;;5476:244:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5476:244:0;;-1:-1:-1;5476:244:0;;-1:-1:-1;;;;;;;5476:244:0;1065:47:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1065:47:1;;;;;237:41:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;237:41:0;;;;985:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;985:20:0;;;;4390:449;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4390:449:0;;;;;;;;;;;;3622:472:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3622:472:1;;;;;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;956:23:0;:::o;3731:460::-;3879:6;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1440:14;;;;;;;:7;:14;;;;;;3821:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;3842:14;;;3859:5;3842:14;;;:7;:14;;;;;:22;;;;;;3859:5;-1:-1:-1;3874:170:0;3891:6;:13;:17;;3889:19;;3874:170;;;3944:5;3931:18;;:6;3938:1;3931:9;;;;;;;;;;;;;;;;;;;;;;:18;3927:117;;;3981:6;3988:13;;:17;;;;3981:25;;;;;;;;;;;;;;;;3969:6;:9;;3981:25;;;;;3976:1;;3969:9;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4024:5;;3927:117;3910:3;;;;;3874:170;;;4053:6;:18;;;;;;;;;:::i;:::-;-1:-1:-1;4096:6:0;:13;4085:8;;:24;4081:74;;;4141:6;:13;4123:32;;:17;:32::i;:::-;4165:19;;;;;;;;;;;1262:1;3731:460;;:::o;3176:332:1:-;3259:10;1440:14:0;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1714:28;;;;:13;:28;;;;;;;;3304:10:1;1714:35:0;;;;;;;;;3289:13:1;;3304:10;1714:35:0;;1713:36;1709:59;;;1763:5;;;1709:59;1996:12;:27;;;;;;;;;;:36;;;3336:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3377:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;3449:5;3406:28;;;:13;:28;;;;;;;;3435:10;3406:40;;;;;;;;:48;;;;;;3464:37;3420:13;;3464:37;;;2061:1:0;1778;1483;;3176:332:1;;:::o;910:40:0:-;;;;;;;;;;;;;;;:::o;840:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1029:29:1:-;;;;:::o;9156:319:0:-;9263:10;;9289:179;9306:16;;9304:1;:18;9289:179;;;9348:7;:36;;;;-1:-1:-1;9360:12:0;:15;;;;;;;;;;:24;;;;;9359:25;9348:36;:92;;;;9404:8;:36;;;;-1:-1:-1;9416:12:0;:15;;;;;;;;;;:24;;;;;9404:36;9341:127;;;9467:1;9458:10;;;;9341:127;9324:3;;9289:179;;;9156:319;;;;;:::o;3331:277::-;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1332:14;;;;;;;:7;:14;;;;;;3424:5;;1332:14;;1328:37;;;1360:5;;;1328:37;3447:5;2124:13;;;;2120:36;;;2151:5;;;2120:36;3479:6;:13;;;;3495:1;3479:17;3498:8;;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;3522:14;;;;;;;:7;:14;;;;;;:21;;;;3539:4;3522:21;;;;;;3553:6;27:10:-1;;23:18;;;45:23;;3553:18:0;;;;;;;;;;;;3581:20;;;3522:14;3581:20;2166:1;;1375;1262;3331:277;:::o;7324:337::-;7414:4;;;7458:197;7475:6;:13;7473:15;;7458:197;;;7513:28;;;;:13;:28;;;;;7542:6;:9;;7513:28;;;7549:1;;7542:9;;;;;;;;;;;;;;;;;;;;7513:39;;;;;;;;;;;;;;;7509:71;;;7579:1;7570:10;;;;7509:71;7607:8;;7598:5;:17;7594:50;;;7640:4;7633:11;;;;7594:50;7490:3;;7458:197;;;7324:337;;;;;:::o;2301:186:1:-;1206:10:0;1228:4;1206:27;1202:50;;1247:5;;;1202:50;2398:17:1;:38;;;2446:34;;;;;;;;;;;;;;;;;2301:186;:::o;8642:252:0:-;8741:10;;8767:120;8784:6;:13;8782:15;;8767:120;;;8820:28;;;;:13;:28;;;;;8849:6;:9;;8820:28;;;8856:1;;8849:9;;;;;;;;;;;;;;;;;;;;8820:39;;;;;;;;;;;;;;;8816:71;;;8886:1;8877:10;;;;8816:71;8799:3;;8767:120;;;8642:252;;;;:::o;785:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;785:49:0;;;;;;;-1:-1:-1;;785:49:0;;;:::o;9559:115::-;9629:9;9661:6;9654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;:::o;10777:676::-;10902:22;10940:32;11013:10;11037:6;10986:16;;10975:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10975:28:0;;10940:63;;11026:1;11013:14;;11060:1;11058:3;;11053:250;11065:16;;11063:1;:18;11053:250;;;11107:7;:36;;;;-1:-1:-1;11119:12:0;:15;;;;;;;;;;:24;;;;;11118:25;11107:36;:92;;;;11163:8;:36;;;;-1:-1:-1;11175:12:0;:15;;;;;;;;;;:24;;;;;11163:36;11100:203;;;11259:1;11231:18;11250:5;11231:25;;;;;;;;;;;;;;;;;;:29;11287:1;11278:10;;;;;11100:203;11083:3;;11053:250;;;11346:4;11341:2;:9;11330:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;11330:21:0;;11312:39;;11368:4;11366:6;;11361:85;11376:2;11374:1;:4;11361:85;;;11425:18;11444:1;11425:21;;;;;;;;;;;;;;;;;;11397:15;11417:4;11413:1;:8;11397:25;;;;;;;;;;;;;;;;;;:49;11380:3;;11361:85;;;10777:676;;;;;;;;;:::o;9853:575::-;9948:24;9988:34;10063:10;10087:6;10039;:13;;;;10025:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10025:28:0;;9988:65;;10076:1;10063:14;;10110:1;10108:3;;10103:186;10115:6;:13;10113:15;;10103:186;;;10151:28;;;;:13;:28;;;;;10180:6;:9;;10151:28;;;10187:1;;10180:9;;;;;;;;;;;;;;;;;;;;10151:39;;;;;;;;;;;;;;;10147:142;;;10237:6;:9;;10244:1;;10237:9;;;;;;;;;;;;;;;;10210:24;;10237:9;;;;;10210:17;;10228:5;;10210:24;;;;;;:36;;;;:24;;;;;;;;;;:36;10273:1;10264:10;;;;;10147:142;10130:3;;10103:186;;;10329:5;10315:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;10315:20:0;;10298:37;;10352:1;10350:3;;10345:76;10357:5;10355:1;:7;10345:76;;;10401:17;10419:1;10401:20;;;;;;;;;;;;;;;;;;10381:14;10396:1;10381:17;;;;;;;;;;:40;;;;:17;;;;;;;;;;:40;10364:3;;10345:76;;;9853:575;;;;;;:::o;1011:28::-;;;;:::o;5010:207::-;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;5112:6;:13;5127:9;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;5152:8;:20;;;5182:28;;;;;;;;;;;;;;;;;1262:1;;5010:207;:::o;2593:459:1:-;2676:10;1440:14:0;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1558:12;:27;;;;;;;;;;:39;2714:13:1;;1558:39:0;;:44;1554:67;;;1616:5;;;1554:67;1863:28;;;;:13;:28;;;;;;;;2765:10:1;1863:35:0;;;;;;;;;2750:13:1;;2765:10;1863:35:0;;1859:58;;;1912:5;;;1859:58;2803:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;2832:28;;;;2875:4;2832:28;;;;;;;;2861:10;2832:40;;;;;;;;:47;;;;;;;;;;2889:39;;2846:13;;2889:39;;;2942:26;2954:13;2942:11;:26::i;:::-;2938:108;;;2984:51;3004:13;3019:15;2984:19;:51::i;:::-;1927:1:0;1631;;1483;2593:459:1;;:::o;5476:244:0:-;5580:18;5630:40;5645:11;5658:5;5665:4;5630:14;:40::i;:::-;5614:56;;5680:33;5699:13;5680:18;:33::i;:::-;5476:244;;;;;:::o;1065:47:1:-;;;;;;;;;;;;;:::o;237:41:0:-;276:2;237:41;:::o;985:20::-;;;;:::o;4390:449::-;4561:6;1206:10;1228:4;1206:27;1202:50;;1247:5;;;1202:50;1440:14;;;;;;;:7;:14;;;;;;4499:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;1332:14;;;;;;;:7;:14;;;;;;4532:8;;1332:14;;1328:37;;;1360:5;;;1328:37;4568:1;4561:8;;4556:149;4573:6;:13;4571:15;;4556:149;;;4622:5;4609:18;;:6;4616:1;4609:9;;;;;;;;;;;;;;;;;;;;;;:18;4605:100;;;4659:8;4647:6;4654:1;4647:9;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;4685:5;;4605:100;4588:3;;;;;4556:149;;;4714:14;;;;4731:5;4714:14;;;:7;:14;;;;;;:22;;;;;;;;;4746:17;;;;;;;;:24;;;;;4714:22;4746:24;;;;4780:19;;4714:14;;4780:19;;;4809:23;;;;;;;;;;;1483:1;1262;4390:449;;;:::o;3622:472:1:-;3808:22;1996:27:0;;;;;;;;;;:36;;;3705:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3743:13:1;1298:26;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1463:17;;1428:32;;;;:17;:32;;;;;;3779:13;;1428:52;1409:15;:71;;1401:80;;;;;;3833:12;:27;;;;;;;;;;;;3870:11;;;:18;;;;3884:4;3870:18;;;;;;3902:14;;3928:8;;;;3902:44;;3938:7;;;;3902:44;;3833:27;;-1:-1:-1;3902:14:1;;;;;3928:8;3938:7;;3902:44;;;;3938:7;;3902:44;;;;;3870:18;3902:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3898:190;;;3960:24;;3970:13;;3960:24;;;;;3898:190;;;4013:31;;4030:13;;4013:31;;;;;4058:11;;;:19;;;;;;3898:190;1335:1;2061::0;3622:472:1;;;:::o;4204:223::-;4307:32;;;;:17;:32;;;;;;;;;:51;;;4368:52;;;;;;;4325:13;;4368:52;;;;;;;;;4204:223;;:::o;7994:451:0:-;8126:18;8096:11;2124:13;;;;2120:36;;;2151:5;;;2120:36;8176:16;;8232:140;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8232:140:0;;;;;;8202:27;;;;;;;;;;:170;;;;;;;;;;;;;;;-1:-1:-1;8202:170:0;;;;;;;8176:16;;-1:-1:-1;8232:140:0;;8202:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8202:170:0;;;;;;;;;;;;;;;;;;;;;;;8382:16;:21;;-1:-1:-1;8382:21:0;;;8413:25;;8424:13;;8413:25;;-1:-1:-1;;8413:25:0;7994:451;;;;;;:::o;835:3594:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;835:3594:1;;;-1:-1:-1;835:3594:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/multisig/MultiSigWallet.sol": {
+ "id": 0
+ },
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/multisig/MultiSigWallet.sol": "// solhint-disable\npragma solidity ^0.4.10;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.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\n// solhint-disable\npragma solidity ^0.4.10;\n\nimport \"./MultiSigWallet.sol\";\n\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x063c8a81961942475e9c72a548f59309c9ce033f04d738fbba4b4f3133d39e0f",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestAssetProxyDispatcher.json b/packages/migrations/artifacts/2.0.0/TestAssetProxyDispatcher.json
new file mode 100644
index 000000000..2d73e013d
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestAssetProxyDispatcher.json
@@ -0,0 +1,208 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestAssetProxyDispatcher",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes4"
+ }
+ ],
+ "name": "assetProxies",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "assetProxyId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "getAssetProxy",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetData",
+ "type": "bytes"
+ },
+ {
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicDispatchTransferFrom",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "id",
+ "type": "bytes4"
+ },
+ {
+ "indexed": false,
+ "name": "assetProxy",
+ "type": "address"
+ }
+ ],
+ "name": "AssetProxyRegistered",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055610845806100256000396000f3006080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fd3c997811461007c57806360704108146100df578063889b6d8d146101195780638da5cb5b14610199578063c585bb93146101ae578063f2fde38b146101dc575b600080fd5b34801561008857600080fd5b506100b67fffffffff000000000000000000000000000000000000000000000000000000006004351661020a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100eb57600080fd5b506100b67fffffffff0000000000000000000000000000000000000000000000000000000060043516610232565b34801561012557600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101979436949293602493928401919081908401838280828437509497505073ffffffffffffffffffffffffffffffffffffffff8535811696506020860135169460400135935061027c92505050565b005b3480156101a557600080fd5b506100b661028e565b3480156101ba57600080fd5b5061019773ffffffffffffffffffffffffffffffffffffffff600435166102aa565b3480156101e857600080fd5b5061019773ffffffffffffffffffffffffffffffffffffffff60043516610537565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6102888484848461061d565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461033557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561039c57600080fd5b505af11580156103b0573d6000803e3d6000fd5b505050506040513d60208110156103c657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205490925073ffffffffffffffffffffffffffffffffffffffff169050801561048257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41535345545f50524f58595f414c52454144595f455849535453000000000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000821660008181526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155825193845287169083015280517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c031949281900390910190a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81161561061a57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080600083111561081157855160031061069957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000604482015290519081900360640190fd5b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600190925260409091205473ffffffffffffffffffffffffffffffffffffffff1680151561075757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000604482015290519081900360640190fd5b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b818110156107f357895181526020998a0199016107db565b61020084858403866000895af180151561080b573d85fd5b50505050505b5050505050505600a165627a7a723058208596529de05f7b278da42577d4c907440a35b7908dd6ca86f28b891d7b90c2e90029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x845 DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3FD3C997 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x889B6D8D EQ PUSH2 0x119 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x199 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 CALLDATALOAD AND PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x125 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x197 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD DUP2 AND SWAP7 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD AND SWAP5 PUSH1 0x40 ADD CALLDATALOAD SWAP4 POP PUSH2 0x27C SWAP3 POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH2 0x28E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2AA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x537 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x288 DUP5 DUP5 DUP5 DUP5 PUSH2 0x61D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x335 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x482 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP4 DUP5 MSTORE DUP8 AND SWAP1 DUP4 ADD MSTORE DUP1 MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x811 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x699 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x757 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x7F3 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x7DB JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x80B JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP6 SWAP7 MSTORE SWAP14 0xe0 0x5f PUSH28 0x278DA42577D4C907440A35B7908DD6CA86F28B891D7B90C2E9002900 ",
+ "sourceMap": "671:301:5:-;;;329:5:8;:18;;-1:-1:-1;;;;;;329:18:8;337:10;329:18;;;671:301:5;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100775763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633fd3c997811461007c57806360704108146100df578063889b6d8d146101195780638da5cb5b14610199578063c585bb93146101ae578063f2fde38b146101dc575b600080fd5b34801561008857600080fd5b506100b67fffffffff000000000000000000000000000000000000000000000000000000006004351661020a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156100eb57600080fd5b506100b67fffffffff0000000000000000000000000000000000000000000000000000000060043516610232565b34801561012557600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101979436949293602493928401919081908401838280828437509497505073ffffffffffffffffffffffffffffffffffffffff8535811696506020860135169460400135935061027c92505050565b005b3480156101a557600080fd5b506100b661028e565b3480156101ba57600080fd5b5061019773ffffffffffffffffffffffffffffffffffffffff600435166102aa565b3480156101e857600080fd5b5061019773ffffffffffffffffffffffffffffffffffffffff60043516610537565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526001602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6102888484848461061d565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600080548190819073ffffffffffffffffffffffffffffffffffffffff16331461033557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b8392508273ffffffffffffffffffffffffffffffffffffffff1663ae25532e6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561039c57600080fd5b505af11580156103b0573d6000803e3d6000fd5b505050506040513d60208110156103c657600080fd5b50517fffffffff00000000000000000000000000000000000000000000000000000000811660009081526001602052604090205490925073ffffffffffffffffffffffffffffffffffffffff169050801561048257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41535345545f50524f58595f414c52454144595f455849535453000000000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000821660008181526001602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691909117909155825193845287169083015280517fd2c6b762299c609bdb96520b58a49bfb80186934d4f71a86a367571a15c031949281900390910190a150505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146105bd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81161561061a57600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b600080600083111561081157855160031061069957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c454e4754485f475245415445525f5448414e5f335f52455155495245440000604482015290519081900360640190fd5b50506020848101517fffffffff00000000000000000000000000000000000000000000000000000000166000818152600190925260409091205473ffffffffffffffffffffffffffffffffffffffff1680151561075757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f41535345545f50524f58595f444f45535f4e4f545f4558495354000000000000604482015290519081900360640190fd5b604051660fffffffffffe0603f885101168060840182017fa85e59e40000000000000000000000000000000000000000000000000000000083526080600484015273ffffffffffffffffffffffffffffffffffffffff8816602484015273ffffffffffffffffffffffffffffffffffffffff87166044840152856064840152608483015b818110156107f357895181526020998a0199016107db565b61020084858403866000895af180151561080b573d85fd5b50505050505b5050505050505600a165627a7a723058208596529de05f7b278da42577d4c907440a35b7908dd6ca86f28b891d7b90c2e90029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3FD3C997 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x60704108 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x889B6D8D EQ PUSH2 0x119 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x199 JUMPI DUP1 PUSH4 0xC585BB93 EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1DC JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 PUSH1 0x4 CALLDATALOAD AND PUSH2 0x232 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x125 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x197 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 CALLDATALOAD DUP2 AND SWAP7 POP PUSH1 0x20 DUP7 ADD CALLDATALOAD AND SWAP5 PUSH1 0x40 ADD CALLDATALOAD SWAP4 POP PUSH2 0x27C SWAP3 POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH2 0x28E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2AA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x197 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x537 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH2 0x288 DUP5 DUP5 DUP5 DUP5 PUSH2 0x61D JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x335 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP4 SWAP3 POP DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAE25532E PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x39C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x3B0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x3C6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP1 ISZERO PUSH2 0x482 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41535345545F50524F58595F414C52454144595F455849535453000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 DUP3 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP4 DUP5 MSTORE DUP8 AND SWAP1 DUP4 ADD MSTORE DUP1 MLOAD PUSH32 0xD2C6B762299C609BDB96520B58A49BFB80186934D4F71A86A367571A15C03194 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x5BD JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x13 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x61A JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP4 GT ISZERO PUSH2 0x811 JUMPI DUP6 MLOAD PUSH1 0x3 LT PUSH2 0x699 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F335F52455155495245440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x20 DUP5 DUP2 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP3 MSTORE PUSH1 0x40 SWAP1 SWAP2 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP1 ISZERO ISZERO PUSH2 0x757 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x41535345545F50524F58595F444F45535F4E4F545F4558495354000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x40 MLOAD PUSH7 0xFFFFFFFFFFFE0 PUSH1 0x3F DUP9 MLOAD ADD AND DUP1 PUSH1 0x84 ADD DUP3 ADD PUSH32 0xA85E59E400000000000000000000000000000000000000000000000000000000 DUP4 MSTORE PUSH1 0x80 PUSH1 0x4 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND PUSH1 0x24 DUP5 ADD MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x44 DUP5 ADD MSTORE DUP6 PUSH1 0x64 DUP5 ADD MSTORE PUSH1 0x84 DUP4 ADD JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x7F3 JUMPI DUP10 MLOAD DUP2 MSTORE PUSH1 0x20 SWAP10 DUP11 ADD SWAP10 ADD PUSH2 0x7DB JUMP JUMPDEST PUSH2 0x200 DUP5 DUP6 DUP5 SUB DUP7 PUSH1 0x0 DUP10 GAS CALL DUP1 ISZERO ISZERO PUSH2 0x80B JUMPI RETURNDATASIZE DUP6 REVERT JUMPDEST POP POP POP POP POP JUMPDEST POP POP POP POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP6 SWAP7 MSTORE SWAP14 0xe0 0x5f PUSH28 0x278DA42577D4C907440A35B7908DD6CA86F28B891D7B90C2E9002900 ",
+ "sourceMap": "671:301:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;976:51:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;976:51:2;;;;;;;;;;;;;;;;;;;;;;;;;;2092:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2092:154:2;;;;;;;745:225:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;745:225:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;745:225:5;;-1:-1:-1;;745:225:5;;;;;;-1:-1:-1;745:225:5;;;;;;;;;;-1:-1:-1;745:225:5;;-1:-1:-1;;;745:225:5;;;258:20:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:8;;;;1236:666:2;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1236:666:2;;;;;;;500:167:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:8;;;;;;;976:51:2;;;;;;;;;;;;;;;:::o;2092:154::-;2213:26;;2183:7;2213:26;;;:12;:26;;;;;;;;;2092:154::o;745:225:5:-;914:49;935:9;946:4;952:2;956:6;914:20;:49::i;:::-;745:225;;;;:::o;258:20:8:-;;;;;;:::o;1236:666:2:-;1333:30;426:5:8;;1333:30:2;;;;426:5:8;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1378:10:2;1333:56;;1484:18;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1484:31:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1484:31:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1484:31:2;1553:26;;;;;;;:12;1484:31;1553:26;;;;;1484:31;;-1:-1:-1;1553:26:2;;;-1:-1:-1;1610:31:2;;1589:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1753:26;;;;;;;:12;:26;;;;;;;;;:47;;;;;;;;;;;;;;;1815:80;;;;;;;;;;;;;;;;;;;;;;;1236:666;;;;:::o;500:167:8:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;2561:5068:2:-;3031:19;3290:18;2797:1;2788:6;:10;2784:4839;;;2887:16;;2906:1;-1:-1:-1;2862:109:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3153:2:2;3138:18;;;3111:46;3179:66;3107:156;3311:26;;;;:12;:26;;;;;;;;;;3422:24;;;3397:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4923:2;4917:9;5239:15;5234:2;5222:9;5216:16;5212:25;5208:47;5392:14;5387:3;5383:24;5374:7;5370:38;5676:66;5667:7;5660:83;6160:3;6156:1;6147:7;6143:15;6136:28;6216:42;6210:4;6206:53;6201:2;6192:7;6188:16;6181:79;6310:42;6306:2;6302:51;6297:2;6288:7;6284:16;6277:77;6397:6;6391:3;6382:7;6378:17;6371:33;6563:3;6554:7;6550:17;6645:206;6665:5;6655:8;6652:19;6645:206;;;6714:16;;6697:34;;6778:2;6815:18;;;;6764:17;6645:206;;;7417:3;7346:7;7292;7285:5;7281:19;7208:7;7142:1;7067:10;7004:3;6978:512;7517:7;7510:15;7507:2;;;7564:16;7555:7;7548:33;7507:2;4724:2889;;;;;;2561:5068;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.sol": {
+ "id": 4
+ },
+ "2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 6
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 7
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 8
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/AssetProxy/interfaces/IAssetProxy.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 solidity 0.4.24;\n\nimport \"./IAuthorizable.sol\";\n\n\ncontract IAssetProxy is\n IAuthorizable\n{\n\n /// @dev Transfers assets. Either succeeds or throws.\n /// @param assetData Byte array encoded for the respective asset proxy.\n /// @param from Address to transfer asset from.\n /// @param to Address to transfer asset to.\n /// @param amount Amount of asset to transfer.\n function transferFrom(\n bytes assetData,\n address from,\n address to,\n uint256 amount\n )\n external;\n \n /// @dev Gets the proxy id associated with the proxy address.\n /// @return Proxy id.\n function getProxyId()\n external\n pure\n returns (bytes4);\n}\n",
+ "2.0.0/protocol/AssetProxy/interfaces/IAuthorizable.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 solidity 0.4.24;\n\nimport \"../../../utils/Ownable/IOwnable.sol\";\n\n\ncontract IAuthorizable is\n IOwnable\n{\n\n /// @dev Authorizes an address.\n /// @param target Address to authorize.\n function addAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n function removeAuthorizedAddress(address target)\n external;\n\n /// @dev Removes authorizion of an address.\n /// @param target Address to remove authorization from.\n /// @param index Index of target in authorities array.\n function removeAuthorizedAddressAtIndex(\n address target,\n uint256 index\n )\n external;\n \n /// @dev Gets all authorized addresses.\n /// @return Array of authorized addresses.\n function getAuthorizedAddresses()\n external\n view\n returns (address[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/MixinAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../../utils/Ownable/Ownable.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MAssetProxyDispatcher.sol\";\nimport \"../AssetProxy/interfaces/IAssetProxy.sol\";\n\n\ncontract MixinAssetProxyDispatcher is\n Ownable,\n MAssetProxyDispatcher\n{\n using LibBytes for bytes;\n \n // Mapping from Asset Proxy Id's to their respective Asset Proxy\n mapping (bytes4 => IAssetProxy) public assetProxies;\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external\n onlyOwner\n {\n IAssetProxy assetProxyContract = IAssetProxy(assetProxy);\n\n // Ensure that no asset proxy exists with current id.\n bytes4 assetProxyId = assetProxyContract.getProxyId();\n address currentAssetProxy = assetProxies[assetProxyId];\n require(\n currentAssetProxy == address(0),\n \"ASSET_PROXY_ALREADY_EXISTS\"\n );\n\n // Add asset proxy and log registration.\n assetProxies[assetProxyId] = assetProxyContract;\n emit AssetProxyRegistered(\n assetProxyId,\n assetProxy\n );\n }\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address)\n {\n return assetProxies[assetProxyId];\n }\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal\n {\n // Do nothing if no amount should be transferred.\n if (amount > 0) {\n // Ensure assetData length is valid\n require(\n assetData.length > 3,\n \"LENGTH_GREATER_THAN_3_REQUIRED\"\n );\n \n // Lookup assetProxy\n bytes4 assetProxyId;\n assembly {\n assetProxyId := and(mload(\n add(assetData, 32)),\n 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000\n )\n }\n address assetProxy = assetProxies[assetProxyId];\n\n // Ensure that assetProxy exists\n require(\n assetProxy != address(0),\n \"ASSET_PROXY_DOES_NOT_EXIST\"\n );\n \n // We construct calldata for the `assetProxy.transferFrom` ABI.\n // The layout of this calldata is in the table below.\n // \n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0 | 4 | function selector |\n // | Params | | 4 * 32 | function parameters: |\n // | | 4 | | 1. offset to assetData (*) |\n // | | 36 | | 2. from |\n // | | 68 | | 3. to |\n // | | 100 | | 4. amount |\n // | Data | | | assetData: |\n // | | 132 | 32 | assetData Length |\n // | | 164 | ** | assetData Contents |\n\n assembly {\n /////// Setup State ///////\n // `cdStart` is the start of the calldata for `assetProxy.transferFrom` (equal to free memory ptr).\n let cdStart := mload(64)\n // `dataAreaLength` is the total number of words needed to store `assetData`\n // As-per the ABI spec, this value is padded up to the nearest multiple of 32,\n // and includes 32-bytes for length.\n let dataAreaLength := and(add(mload(assetData), 63), 0xFFFFFFFFFFFE0)\n // `cdEnd` is the end of the calldata for `assetProxy.transferFrom`.\n let cdEnd := add(cdStart, add(132, dataAreaLength))\n\n \n /////// Setup Header Area ///////\n // This area holds the 4-byte `transferFromSelector`.\n // bytes4(keccak256(\"transferFrom(bytes,address,address,uint256)\")) = 0xa85e59e4\n mstore(cdStart, 0xa85e59e400000000000000000000000000000000000000000000000000000000)\n \n /////// Setup Params Area ///////\n // Each parameter is padded to 32-bytes. The entire Params Area is 128 bytes.\n // Notes:\n // 1. The offset to `assetData` is the length of the Params Area (128 bytes).\n // 2. A 20-byte mask is applied to addresses to zero-out the unused bytes.\n mstore(add(cdStart, 4), 128)\n mstore(add(cdStart, 36), and(from, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 68), and(to, 0xffffffffffffffffffffffffffffffffffffffff))\n mstore(add(cdStart, 100), amount)\n \n /////// Setup Data Area ///////\n // This area holds `assetData`.\n let dataArea := add(cdStart, 132)\n // solhint-disable-next-line no-empty-blocks\n for {} lt(dataArea, cdEnd) {} {\n mstore(dataArea, mload(assetData))\n dataArea := add(dataArea, 32)\n assetData := add(assetData, 32)\n }\n\n /////// Call `assetProxy.transferFrom` using the constructed calldata ///////\n let success := call(\n gas, // forward all gas\n assetProxy, // call address of asset proxy\n 0, // don't send any ETH\n cdStart, // pointer to start of input\n sub(cdEnd, cdStart), // length of input \n cdStart, // write output over input\n 512 // reserve 512 bytes for output\n )\n if iszero(success) {\n revert(cdStart, returndatasize())\n }\n }\n }\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../interfaces/IAssetProxyDispatcher.sol\";\n\n\ncontract MAssetProxyDispatcher is\n IAssetProxyDispatcher\n{\n\n // Logs registration of new asset proxy\n event AssetProxyRegistered(\n bytes4 id, // Id of new registered AssetProxy.\n address assetProxy // Address of new registered AssetProxy.\n );\n\n /// @dev Forwards arguments to assetProxy and calls `transferFrom`. Either succeeds or throws.\n /// @param assetData Byte array encoded for the asset.\n /// @param from Address to transfer token from.\n /// @param to Address to transfer token to.\n /// @param amount Amount of token to transfer.\n function dispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n internal;\n}\n",
+ "2.0.0/test/TestAssetProxyDispatcher/TestAssetProxyDispatcher.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/MixinAssetProxyDispatcher.sol\";\n\n\ncontract TestAssetProxyDispatcher is \n MixinAssetProxyDispatcher\n{\n function publicDispatchTransferFrom(\n bytes memory assetData,\n address from,\n address to,\n uint256 amount\n )\n public\n {\n dispatchTransferFrom(assetData, from, to, amount);\n }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xe80e3ae58808670ecf5febcead880d2b5744a406dd99b10c8c09a6d71a139876",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestAssetProxyOwner.json b/packages/migrations/artifacts/2.0.0/TestAssetProxyOwner.json
new file mode 100644
index 000000000..a3c6c3aa9
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestAssetProxyOwner.json
@@ -0,0 +1,48173 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestAssetProxyOwner",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "owners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "removeOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "revokeConfirmation",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isOwner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "confirmations",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "secondsTimeLocked",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "registerAssetProxy",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "addOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "isFunctionRemoveAuthorizedAddressAtIndex",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "isConfirmed",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeTimeLock",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isAssetProxyRegistered",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmationCount",
+ "outputs": [
+ {
+ "name": "count",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOwners",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "from",
+ "type": "uint256"
+ },
+ {
+ "name": "to",
+ "type": "uint256"
+ },
+ {
+ "name": "pending",
+ "type": "bool"
+ },
+ {
+ "name": "executed",
+ "type": "bool"
+ }
+ ],
+ "name": "getTransactionIds",
+ "outputs": [
+ {
+ "name": "_transactionIds",
+ "type": "uint256[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "getConfirmations",
+ "outputs": [
+ {
+ "name": "_confirmations",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "transactionCount",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_required",
+ "type": "uint256"
+ }
+ ],
+ "name": "changeRequirement",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "testValidRemoveAuthorizedAddressAtIndexTx",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "destination",
+ "type": "address"
+ },
+ {
+ "name": "value",
+ "type": "uint256"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ }
+ ],
+ "name": "submitTransaction",
+ "outputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadBytes4",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "confirmationTimes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAX_OWNER_COUNT",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "required",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "replaceOwner",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_owners",
+ "type": "address[]"
+ },
+ {
+ "name": "_assetProxyContracts",
+ "type": "address[]"
+ },
+ {
+ "name": "_required",
+ "type": "uint256"
+ },
+ {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "payable": true,
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "isRegistered",
+ "type": "bool"
+ }
+ ],
+ "name": "AssetProxyRegistration",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "name": "confirmationTime",
+ "type": "uint256"
+ }
+ ],
+ "name": "ConfirmationTimeSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ }
+ ],
+ "name": "TimeLockChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Confirmation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Revocation",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Submission",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "Execution",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "transactionId",
+ "type": "uint256"
+ }
+ ],
+ "name": "ExecutionFailure",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerAddition",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "OwnerRemoval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "name": "required",
+ "type": "uint256"
+ }
+ ],
+ "name": "RequirementChange",
+ "type": "event"
+ }
+ ],
+ "metadata": "{\"compiler\":{\"version\":\"0.4.10+commit.f0d539ae\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"owners\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"revokeConfirmation\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"}],\"name\":\"confirmations\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeRemoveAuthorizedAddressAtIndex\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"secondsTimeLocked\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"registerAssetProxy\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"addOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"isFunctionRemoveAuthorizedAddressAtIndex\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"isConfirmed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"changeTimeLock\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAssetProxyRegistered\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmationCount\",\"outputs\":[{\"name\":\"count\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"transactions\",\"outputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"from\",\"type\":\"uint256\"},{\"name\":\"to\",\"type\":\"uint256\"},{\"name\":\"pending\",\"type\":\"bool\"},{\"name\":\"executed\",\"type\":\"bool\"}],\"name\":\"getTransactionIds\",\"outputs\":[{\"name\":\"_transactionIds\",\"type\":\"uint256[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"getConfirmations\",\"outputs\":[{\"name\":\"_confirmations\",\"type\":\"address[]\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"transactionCount\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_required\",\"type\":\"uint256\"}],\"name\":\"changeRequirement\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"confirmTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"testValidRemoveAuthorizedAddressAtIndexTx\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"destination\",\"type\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"submitTransaction\",\"outputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bytes\"},{\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"publicReadBytes4\",\"outputs\":[{\"name\":\"result\",\"type\":\"bytes4\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"confirmationTimes\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"MAX_OWNER_COUNT\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"required\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"replaceOwner\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"executeTransaction\",\"outputs\":[],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_owners\",\"type\":\"address[]\"},{\"name\":\"_assetProxyContracts\",\"type\":\"address[]\"},{\"name\":\"_required\",\"type\":\"uint256\"},{\"name\":\"_secondsTimeLocked\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"constructor\"},{\"payable\":true,\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"assetProxyContract\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"isRegistered\",\"type\":\"bool\"}],\"name\":\"AssetProxyRegistration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"confirmationTime\",\"type\":\"uint256\"}],\"name\":\"ConfirmationTimeSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"secondsTimeLocked\",\"type\":\"uint256\"}],\"name\":\"TimeLockChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Confirmation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Revocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Submission\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"Execution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"transactionId\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnerRemoval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"required\",\"type\":\"uint256\"}],\"name\":\"RequirementChange\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"addOwner(address)\":{\"details\":\"Allows to add a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"changeRequirement(uint256)\":{\"details\":\"Allows to change the number of required confirmations. Transaction has to be sent by wallet.\",\"params\":{\"_required\":\"Number of required confirmations.\"}},\"changeTimeLock(uint256)\":{\"details\":\"Changes the duration of the time lock for transactions.\",\"params\":{\"_secondsTimeLocked\":\"Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\"}},\"confirmTransaction(uint256)\":{\"details\":\"Allows an owner to confirm a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeRemoveAuthorizedAddressAtIndex(uint256)\":{\"details\":\"Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"executeTransaction(uint256)\":{\"details\":\"Allows anyone to execute a confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"getConfirmationCount(uint256)\":{\"details\":\"Returns number of confirmations of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Number of confirmations.\"},\"getConfirmations(uint256)\":{\"details\":\"Returns array with owner addresses, which confirmed transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Returns array of owner addresses.\"},\"getOwners()\":{\"details\":\"Returns list of owners.\",\"return\":\"List of owner addresses.\"},\"getTransactionCount(bool,bool)\":{\"details\":\"Returns total number of transactions after filers are applied.\",\"params\":{\"executed\":\"Include executed transactions.\",\"pending\":\"Include pending transactions.\"},\"return\":\"Total number of transactions after filters are applied.\"},\"getTransactionIds(uint256,uint256,bool,bool)\":{\"details\":\"Returns list of transaction IDs in defined range.\",\"params\":{\"executed\":\"Include executed transactions.\",\"from\":\"Index start position of transaction array.\",\"pending\":\"Include pending transactions.\",\"to\":\"Index end position of transaction array.\"},\"return\":\"Returns array of transaction IDs.\"},\"isConfirmed(uint256)\":{\"details\":\"Returns the confirmation status of a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"},\"return\":\"Confirmation status.\"},\"isFunctionRemoveAuthorizedAddressAtIndex(bytes)\":{\"details\":\"Compares first 4 bytes of byte array to `removeAuthorizedAddressAtIndex` function selector.\",\"params\":{\"data\":\"Transaction data.\"},\"return\":\"Successful if data is a call to `removeAuthorizedAddressAtIndex`.\"},\"publicReadBytes4(bytes,uint256)\":{\"details\":\"Reads an unpadded bytes4 value from a position in a byte array.\",\"params\":{\"b\":\"Byte array containing a bytes4 value.\",\"index\":\"Index in byte array of bytes4 value.\"},\"return\":\"bytes4 value from byte array.\"},\"registerAssetProxy(address,bool)\":{\"details\":\"Registers or deregisters an AssetProxy to be able to execute `removeAuthorizedAddressAtIndex` without a timelock.\",\"params\":{\"assetProxyContract\":\"Address of AssetProxy contract.\",\"isRegistered\":\"Status of approval for AssetProxy contract.\"}},\"removeOwner(address)\":{\"details\":\"Allows to remove an owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of owner.\"}},\"replaceOwner(address,address)\":{\"details\":\"Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\",\"params\":{\"owner\":\"Address of new owner.\"}},\"revokeConfirmation(uint256)\":{\"details\":\"Allows an owner to revoke a confirmation for a transaction.\",\"params\":{\"transactionId\":\"Transaction ID.\"}},\"submitTransaction(address,uint256,bytes)\":{\"details\":\"Allows an owner to submit and confirm a transaction.\",\"params\":{\"data\":\"Transaction data payload.\",\"destination\":\"Transaction target address.\",\"value\":\"Transaction ether value.\"},\"return\":\"Returns transaction ID.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol\":\"TestAssetProxyOwner\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"2.0.0/multisig/MultiSigWallet.sol\":{\"keccak256\":\"0x5ad0f32801e51d60f02235477477b56ff9ccd727d6d2646d7efb84d1ffbd7bff\",\"urls\":[\"bzzr://0ca2767e1cde91f44a40176939eef3a46da233b552520aec19aeb97f4ef6bb00\"]},\"2.0.0/multisig/MultiSigWalletWithTimeLock.sol\":{\"keccak256\":\"0xd90adae0adda1b23bad71a37af6fc78f645204d519b7f4eeadea858241483611\",\"urls\":[\"bzzr://9761abd10cebccfcc948cc04cd7a5ee0a555d67d4510c82ef84422374beb8c8f\"]},\"2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol\":{\"keccak256\":\"0x6a77cd3a41d2ff7feab497e257cbc378167ae2d96975957116edf73c203d75d2\",\"urls\":[\"bzzr://b987bce902d5f514cf1d258f490007749a70787bb285805bdb8c613238977e46\"]},\"2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol\":{\"keccak256\":\"0x1ac6c24fe73a4140b8770ffdc3273a231775a3731853929b1fe211b5970284f9\",\"urls\":[\"bzzr://3d592fa58728cbf1969908f9132c5d9dedeaa502db068368ac4d4339a3b36b3f\"]}},\"version\":1}",
+ "evm": {
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "INVALID"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "CODESIZE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SUB"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSHSIZE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP4"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP4"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP4"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP5"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "DUP5"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "ADD"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 980,
+ "end": 987,
+ "name": "DUP4"
+ },
+ {
+ "begin": 989,
+ "end": 1009,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1011,
+ "end": 1020,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1022,
+ "end": 1040,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2381,
+ "end": 2390,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2448,
+ "end": 2466,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2322,
+ "end": 2329,
+ "name": "DUP6"
+ },
+ {
+ "begin": 2331,
+ "end": 2340,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2342,
+ "end": 2360,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2018,
+ "end": 2025,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2027,
+ "end": 2036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2979,
+ "end": 2985,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2933,
+ "end": 2940,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2933,
+ "end": 2947,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2949,
+ "end": 2958,
+ "name": "DUP3"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2986,
+ "end": 2987,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2979,
+ "end": 2987,
+ "name": "POP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2991,
+ "end": 2998,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2991,
+ "end": 3005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2989,
+ "end": 2990,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2989,
+ "end": 3005,
+ "name": "LT"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3037,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3038,
+ "end": 3045,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3046,
+ "end": 3047,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "LT"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MUL"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "ADD"
+ },
+ {
+ "begin": 3038,
+ "end": 3048,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "AND"
+ },
+ {
+ "begin": 3030,
+ "end": 3049,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "POP"
+ },
+ {
+ "begin": 3053,
+ "end": 3060,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3061,
+ "end": 3062,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "LT"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MUL"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "ADD"
+ },
+ {
+ "begin": 3053,
+ "end": 3063,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "AND"
+ },
+ {
+ "begin": 3067,
+ "end": 3068,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3053,
+ "end": 3068,
+ "name": "EQ"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3030,
+ "end": 3068,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3086,
+ "end": 3091,
+ "name": "REVERT"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 3026,
+ "end": 3091,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3127,
+ "end": 3131,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3105,
+ "end": 3112,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3113,
+ "end": 3120,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3121,
+ "end": 3122,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "LT"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MUL"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "ADD"
+ },
+ {
+ "begin": 3113,
+ "end": 3123,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3105,
+ "end": 3124,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "AND"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "OR"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3105,
+ "end": 3131,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "ADD"
+ },
+ {
+ "begin": 3007,
+ "end": 3010,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 2974,
+ "end": 3142,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3151,
+ "end": 3157,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "ADD"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 3151,
+ "end": 3167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3177,
+ "end": 3185,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3177,
+ "end": 3197,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 2834,
+ "end": 3204,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2052,
+ "end": 2069,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2052,
+ "end": 2090,
+ "name": "SSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 1884,
+ "end": 2097,
+ "name": "POP"
+ },
+ {
+ "begin": 2393,
+ "end": 2394,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2381,
+ "end": 2394,
+ "name": "POP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2400,
+ "end": 2420,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2400,
+ "end": 2427,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2396,
+ "end": 2397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2396,
+ "end": 2427,
+ "name": "LT"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2489,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2490,
+ "end": 2491,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "LT"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MUL"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "ADD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2469,
+ "end": 2492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "AND"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2514,
+ "end": 2538,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 2506,
+ "end": 2539,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "AND"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2575,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2587,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "AND"
+ },
+ {
+ "begin": 2590,
+ "end": 2594,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "OR"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2553,
+ "end": 2594,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "ADD"
+ },
+ {
+ "begin": 2429,
+ "end": 2432,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 2376,
+ "end": 2605,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 2097,
+ "end": 2611,
+ "name": "POP"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "POP"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "POP"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "POP"
+ },
+ {
+ "begin": 762,
+ "end": 1048,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "30"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SHA3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MUL"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "33"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "OR"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "36"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "37"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DIV"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "25E7C27"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "173825D9"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20EA8D86"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "2F54BF6E"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "3411C81C"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "3589B35C"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "37BD78A0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "54741525"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "5A1A66AF"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "7065CB48"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "72CBE61D"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "784547A7"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "7AD28C51"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "83250F79"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "8B51D13F"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "9ACE38C2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "A0E67E2B"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "A8ABE69A"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "B5DC40C3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "B77BF600"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "BA51A6DF"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "C01A8C84"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "C296E43C"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "24"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "C6427474"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "CC12CB28"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "D38F2D82"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "D74F8EDD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "DC8452CD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "E20056E6"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "30"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "EE22610B"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "EQ"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2539,
+ "end": 2540,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2527,
+ "end": 2536,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2527,
+ "end": 2540,
+ "name": "GT"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "PUSH [tag]",
+ "value": "35"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2574,
+ "end": 2583,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2562,
+ "end": 2572,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "AND"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "E1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SUB"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "ADD"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2554,
+ "end": 2584,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 2523,
+ "end": 2584,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2482,
+ "end": 2591,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "36"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "37"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "39"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "AND"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "STOP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "42"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "STOP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "45"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "INVALID"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SUB"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "ADD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "RETURN"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "INVALID"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SUB"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "ADD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "RETURN"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "51"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "STOP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "56"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SUB"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "57"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "57"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH [tag]",
+ "value": "59"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "58"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SUB"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "ADD"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "60"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "60"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "AND"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "PUSH [tag]",
+ "value": "62"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "61"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "STOP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "63"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "63"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "AND"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "PUSH [tag]",
+ "value": "65"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "64"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "STOP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH [tag]",
+ "value": "66"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "tag",
+ "value": "66"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DIV"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MUL"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "CALLDATACOPY"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH [tag]",
+ "value": "68"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP6"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "tag",
+ "value": "67"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SUB"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "ADD"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "RETURN"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "69"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "69"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "70"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SUB"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "ADD"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "RETURN"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "72"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "72"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "PUSH [tag]",
+ "value": "74"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "73"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "STOP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "75"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "INVALID"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "75"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH [tag]",
+ "value": "77"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "76"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SUB"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "ADD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "RETURN"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "78"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "78"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH [tag]",
+ "value": "80"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "79"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SUB"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "ADD"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "RETURN"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "81"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "INVALID"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "81"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "82"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "83"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "82"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP7"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "LT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "85"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DIV"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MUL"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "84"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "85"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "86"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "GT"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH [tag]",
+ "value": "86"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "84"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "POP"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "87"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "87"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "88"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH [tag]",
+ "value": "89"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "88"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "ADD"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "MUL"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "91"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "91"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "90"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "92"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "92"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "88"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH [tag]",
+ "value": "94"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "93"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "ADD"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "MUL"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "96"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "91"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "95"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "97"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "INVALID"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "97"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "88"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH [tag]",
+ "value": "99"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "98"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP6"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "ADD"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "MUL"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "101"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "90"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "91"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "100"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "102"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "102"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH [tag]",
+ "value": "104"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "103"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SUB"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "ADD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "RETURN"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "105"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "105"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "PUSH [tag]",
+ "value": "107"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "106"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "STOP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "108"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "INVALID"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "108"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "PUSH [tag]",
+ "value": "110"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "109"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "STOP"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH [tag]",
+ "value": "111"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "tag",
+ "value": "111"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH [tag]",
+ "value": "113"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "tag",
+ "value": "112"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SUB"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "ADD"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "RETURN"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "114"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "INVALID"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "114"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DIV"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MUL"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "AND"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "64"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "CALLDATACOPY"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH [tag]",
+ "value": "116"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP6"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "115"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SUB"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "ADD"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH [tag]",
+ "value": "117"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "tag",
+ "value": "117"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH [tag]",
+ "value": "118"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DIV"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MUL"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "CALLDATACOPY"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH [tag]",
+ "value": "119"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "tag",
+ "value": "118"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "AND"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SUB"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "ADD"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "120"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "120"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH [tag]",
+ "value": "122"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "121"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SUB"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "ADD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "RETURN"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "123"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "INVALID"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "123"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH [tag]",
+ "value": "125"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "124"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP3"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SUB"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "ADD"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "RETURN"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "126"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "INVALID"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "126"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "55"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH [tag]",
+ "value": "128"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "127"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP3"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SUB"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "ADD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "RETURN"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "129"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "129"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "AND"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "PUSH [tag]",
+ "value": "131"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "130"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "STOP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "132"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "132"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "PUSH [tag]",
+ "value": "134"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "133"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "STOP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "LT"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH [tag]",
+ "value": "135"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "INVALID"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "135"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SHA3"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "ADD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "tag",
+ "value": "136"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "POP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "EXP"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "AND"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "DUP2"
+ },
+ {
+ "begin": 956,
+ "end": 979,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3879,
+ "end": 3885,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "138"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "138"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3821,
+ "end": 3826,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "140"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "140"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "AND"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3849,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3842,
+ "end": 3856,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "AND"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3842,
+ "end": 3864,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3859,
+ "end": 3864,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "142"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3891,
+ "end": 3897,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3891,
+ "end": 3904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3891,
+ "end": 3908,
+ "name": "ADD"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3889,
+ "end": 3908,
+ "name": "LT"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3944,
+ "end": 3949,
+ "name": "DUP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3937,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3938,
+ "end": 3939,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "LT"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH [tag]",
+ "value": "145"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "145"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "ADD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "tag",
+ "value": "146"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "EXP"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3940,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "AND"
+ },
+ {
+ "begin": 3931,
+ "end": 3949,
+ "name": "EQ"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "147"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 3987,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3988,
+ "end": 4001,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "ADD"
+ },
+ {
+ "begin": 3988,
+ "end": 4005,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "LT"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH [tag]",
+ "value": "148"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "148"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "ADD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "tag",
+ "value": "149"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3981,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 3975,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3976,
+ "end": 3977,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "LT"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH [tag]",
+ "value": "150"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "INVALID"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "150"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "ADD"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "tag",
+ "value": "151"
+ },
+ {
+ "begin": 3969,
+ "end": 3978,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "EXP"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "NOT"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "AND"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "MUL"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "OR"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3969,
+ "end": 4006,
+ "name": "POP"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "PUSH [tag]",
+ "value": "143"
+ },
+ {
+ "begin": 4024,
+ "end": 4029,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "tag",
+ "value": "147"
+ },
+ {
+ "begin": 3927,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "144"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "ADD"
+ },
+ {
+ "begin": 3910,
+ "end": 3913,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "PUSH [tag]",
+ "value": "142"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "tag",
+ "value": "143"
+ },
+ {
+ "begin": 3874,
+ "end": 4044,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4053,
+ "end": 4059,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "ADD"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "152"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "tag",
+ "value": "152"
+ },
+ {
+ "begin": 4053,
+ "end": 4071,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4096,
+ "end": 4102,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4096,
+ "end": 4109,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4085,
+ "end": 4093,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4085,
+ "end": 4109,
+ "name": "GT"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "155"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4141,
+ "end": 4147,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4141,
+ "end": 4154,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "PUSH [tag]",
+ "value": "155"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4123,
+ "end": 4140,
+ "name": "PUSH [tag]",
+ "value": "107"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "tag",
+ "value": "155"
+ },
+ {
+ "begin": 4123,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "tag",
+ "value": "154"
+ },
+ {
+ "begin": 4081,
+ "end": 4155,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "AND"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4165,
+ "end": 4184,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "141"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "139"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "tag",
+ "value": "137"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "POP"
+ },
+ {
+ "begin": 3731,
+ "end": 4191,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3259,
+ "end": 3269,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "157"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "157"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1727,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1714,
+ "end": 1742,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3304,
+ "end": 3314,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1714,
+ "end": 1749,
+ "name": "AND"
+ },
+ {
+ "begin": 1713,
+ "end": 1749,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "PUSH [tag]",
+ "value": "159"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1763,
+ "end": 1768,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "tag",
+ "value": "159"
+ },
+ {
+ "begin": 1709,
+ "end": 1768,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1996,
+ "end": 2008,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3336,
+ "end": 3349,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "161"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "161"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3377,
+ "end": 3390,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "163"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "163"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "164"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "164"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3449,
+ "end": 3454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3419,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3434,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3435,
+ "end": 3445,
+ "name": "CALLER"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3406,
+ "end": 3446,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "AND"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3406,
+ "end": 3454,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "DUP9"
+ },
+ {
+ "begin": 3420,
+ "end": 3433,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "PUSH",
+ "value": "F6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3464,
+ "end": 3501,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "165"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "162"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "tag",
+ "value": "160"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1778,
+ "end": 1779,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "158"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "tag",
+ "value": "156"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "POP"
+ },
+ {
+ "begin": 3176,
+ "end": 3508,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SHA3"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "AND"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "DUP2"
+ },
+ {
+ "begin": 910,
+ "end": 950,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP4"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP5"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SHA3"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "AND"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "DUP2"
+ },
+ {
+ "begin": 840,
+ "end": 904,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3575,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3425,
+ "end": 3438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "167"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "167"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3463,
+ "end": 3476,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "169"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "169"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "170"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "170"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1418,
+ "end": 1440,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "AND"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1510,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3524,
+ "end": 3537,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "AND"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH [tag]",
+ "value": "172"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "tag",
+ "value": "172"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "72656D6F7665417574686F72697A6564416464726573734174496E6465782861"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "88"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "6464726573732C75696E7432353629"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "MUL"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "2F"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SUB"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "173"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "LT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "175"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "175"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "176"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "GT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "176"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SUB"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "174"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1565,
+ "end": 1566,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1555,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "173"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "EQ"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "178"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "tag",
+ "value": "178"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3578,
+ "end": 3590,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3626,
+ "name": "ADD"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "AND"
+ },
+ {
+ "begin": 3629,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "OR"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "ADD"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3578,
+ "end": 3605,
+ "name": "SWAP12"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3715,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3727,
+ "end": 3735,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3737,
+ "end": 3744,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3615,
+ "end": 3633,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "180"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "LT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "181"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DIV"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MUL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "180"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "181"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "182"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GT"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH [tag]",
+ "value": "182"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "AND"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "ADD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "tag",
+ "value": "180"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "GAS"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SUB"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "CALL"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3701,
+ "end": 3745,
+ "name": "POP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "183"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3769,
+ "end": 3782,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3759,
+ "end": 3783,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "PUSH [tag]",
+ "value": "165"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "183"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3829,
+ "end": 3842,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3812,
+ "end": 3843,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3857,
+ "end": 3868,
+ "name": "ADD"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "AND"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3857,
+ "end": 3876,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "tag",
+ "value": "184"
+ },
+ {
+ "begin": 3697,
+ "end": 3887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "tag",
+ "value": "179"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "171"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "168"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "tag",
+ "value": "166"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "POP"
+ },
+ {
+ "begin": 3320,
+ "end": 3893,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1029,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "59"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9263,
+ "end": 9273,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "186"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 9306,
+ "end": 9322,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9304,
+ "end": 9305,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9304,
+ "end": 9322,
+ "name": "LT"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "187"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9355,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "PUSH [tag]",
+ "value": "189"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9360,
+ "end": 9372,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9360,
+ "end": 9375,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "ADD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9360,
+ "end": 9384,
+ "name": "AND"
+ },
+ {
+ "begin": 9359,
+ "end": 9384,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "tag",
+ "value": "189"
+ },
+ {
+ "begin": 9348,
+ "end": 9384,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "191"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "POP"
+ },
+ {
+ "begin": 9404,
+ "end": 9412,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "PUSH [tag]",
+ "value": "191"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 9416,
+ "end": 9428,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9416,
+ "end": 9431,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "ADD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 9416,
+ "end": 9440,
+ "name": "AND"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "tag",
+ "value": "191"
+ },
+ {
+ "begin": 9404,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "tag",
+ "value": "190"
+ },
+ {
+ "begin": 9348,
+ "end": 9440,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "192"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9467,
+ "end": 9468,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "ADD"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9458,
+ "end": 9468,
+ "name": "POP"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "tag",
+ "value": "192"
+ },
+ {
+ "begin": 9341,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "188"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9324,
+ "end": 9327,
+ "name": "ADD"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "PUSH [tag]",
+ "value": "186"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMP"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "tag",
+ "value": "187"
+ },
+ {
+ "begin": 9289,
+ "end": 9468,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "tag",
+ "value": "185"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "POP"
+ },
+ {
+ "begin": 9156,
+ "end": 9475,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "62"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "194"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "194"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3020,
+ "end": 3038,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "196"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "196"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3076,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3096,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "AND"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "OR"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3054,
+ "end": 3111,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP5"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "PUSH",
+ "value": "DAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SUB"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "ADD"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3121,
+ "end": 3177,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "197"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "195"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "tag",
+ "value": "193"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "POP"
+ },
+ {
+ "begin": 2895,
+ "end": 3184,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "65"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "199"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "199"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3424,
+ "end": 3429,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "201"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "201"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3447,
+ "end": 3452,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "203"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "203"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3479,
+ "end": 3485,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3479,
+ "end": 3492,
+ "name": "POP"
+ },
+ {
+ "begin": 3495,
+ "end": 3496,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3479,
+ "end": 3496,
+ "name": "ADD"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 3498,
+ "end": 3506,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2266,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "205"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "205"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "206"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "206"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "207"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "207"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "208"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "208"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "AND"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3529,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3536,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "AND"
+ },
+ {
+ "begin": 3539,
+ "end": 3543,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "OR"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3522,
+ "end": 3543,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "210"
+ },
+ {
+ "begin": 3553,
+ "end": 3559,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH [tag]",
+ "value": "153"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "210"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "ADD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "tag",
+ "value": "212"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP11"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "EXP"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "MUL"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "NOT"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "AND"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "OR"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3553,
+ "end": 3571,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3581,
+ "end": 3601,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "209"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "204"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "POP"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "202"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "200"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "tag",
+ "value": "198"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "POP"
+ },
+ {
+ "begin": 3331,
+ "end": 3608,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "tag",
+ "value": "68"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "72656D6F7665417574686F72697A6564416464726573734174496E6465782861"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "88"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "6464726573732C75696E7432353629"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "MUL"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SUB"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "2F"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1639,
+ "end": 1643,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1639,
+ "end": 1643,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1666,
+ "end": 1732,
+ "name": "AND"
+ },
+ {
+ "begin": 1666,
+ "end": 1685,
+ "name": "PUSH [tag]",
+ "value": "214"
+ },
+ {
+ "begin": 1677,
+ "end": 1681,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1639,
+ "end": 1643,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1666,
+ "end": 1676,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 1666,
+ "end": 1685,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1666,
+ "end": 1685,
+ "name": "tag",
+ "value": "214"
+ },
+ {
+ "begin": 1666,
+ "end": 1685,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1666,
+ "end": 1732,
+ "name": "AND"
+ },
+ {
+ "begin": 1666,
+ "end": 1732,
+ "name": "EQ"
+ },
+ {
+ "begin": 1666,
+ "end": 1732,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "tag",
+ "value": "213"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "POP"
+ },
+ {
+ "begin": 1538,
+ "end": 1739,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "71"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7414,
+ "end": 7418,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "216"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7475,
+ "end": 7481,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7475,
+ "end": 7488,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7473,
+ "end": 7488,
+ "name": "LT"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "217"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7526,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7548,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7513,
+ "end": 7541,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "DUP5"
+ },
+ {
+ "begin": 7549,
+ "end": 7550,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "LT"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH [tag]",
+ "value": "219"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "INVALID"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "219"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "ADD"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "tag",
+ "value": "220"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "EXP"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "DIV"
+ },
+ {
+ "begin": 7542,
+ "end": 7551,
+ "name": "AND"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "DUP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SHA3"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 7513,
+ "end": 7552,
+ "name": "AND"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "PUSH [tag]",
+ "value": "221"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7579,
+ "end": 7580,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "ADD"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7570,
+ "end": 7580,
+ "name": "POP"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "tag",
+ "value": "221"
+ },
+ {
+ "begin": 7509,
+ "end": 7580,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 7607,
+ "end": 7615,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 7598,
+ "end": 7603,
+ "name": "DUP3"
+ },
+ {
+ "begin": 7598,
+ "end": 7615,
+ "name": "EQ"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "222"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 7640,
+ "end": 7644,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "POP"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "PUSH [tag]",
+ "value": "217"
+ },
+ {
+ "begin": 7633,
+ "end": 7644,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "tag",
+ "value": "222"
+ },
+ {
+ "begin": 7594,
+ "end": 7644,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "218"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 7490,
+ "end": 7493,
+ "name": "ADD"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "PUSH [tag]",
+ "value": "216"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMP"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "tag",
+ "value": "217"
+ },
+ {
+ "begin": 7458,
+ "end": 7655,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "tag",
+ "value": "215"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "POP"
+ },
+ {
+ "begin": 7324,
+ "end": 7661,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "74"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "224"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "224"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2398,
+ "end": 2415,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2398,
+ "end": 2436,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "D1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SUB"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "ADD"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2446,
+ "end": 2480,
+ "name": "LOG1"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "225"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "tag",
+ "value": "223"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "POP"
+ },
+ {
+ "begin": 2301,
+ "end": 2487,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "tag",
+ "value": "77"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SHA3"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "AND"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "DUP2"
+ },
+ {
+ "begin": 981,
+ "end": 1036,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "80"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8741,
+ "end": 8751,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "227"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8784,
+ "end": 8790,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8784,
+ "end": 8797,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8782,
+ "end": 8797,
+ "name": "LT"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "228"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8833,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8855,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8820,
+ "end": 8848,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8856,
+ "end": 8857,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "LT"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH [tag]",
+ "value": "230"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "INVALID"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "230"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "ADD"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "tag",
+ "value": "231"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "EXP"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "DIV"
+ },
+ {
+ "begin": 8849,
+ "end": 8858,
+ "name": "AND"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 8820,
+ "end": 8859,
+ "name": "AND"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "232"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 8886,
+ "end": 8887,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "ADD"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8877,
+ "end": 8887,
+ "name": "POP"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "tag",
+ "value": "232"
+ },
+ {
+ "begin": 8816,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "229"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8799,
+ "end": 8802,
+ "name": "ADD"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "PUSH [tag]",
+ "value": "227"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMP"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "tag",
+ "value": "228"
+ },
+ {
+ "begin": 8767,
+ "end": 8887,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "tag",
+ "value": "226"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "POP"
+ },
+ {
+ "begin": 8642,
+ "end": 8894,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "tag",
+ "value": "83"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SHA3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP4"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "ADD"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "AND"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "DUP5"
+ },
+ {
+ "begin": 785,
+ "end": 834,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "89"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "233"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "PUSH [tag]",
+ "value": "234"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "tag",
+ "value": "233"
+ },
+ {
+ "begin": 9629,
+ "end": 9638,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9661,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "236"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MUL"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SHA3"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "237"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "AND"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "ADD"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "GT"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "PUSH [tag]",
+ "value": "237"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "tag",
+ "value": "236"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9654,
+ "end": 9667,
+ "name": "POP"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "tag",
+ "value": "235"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9559,
+ "end": 9674,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "94"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "238"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "PUSH [tag]",
+ "value": "234"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "tag",
+ "value": "238"
+ },
+ {
+ "begin": 10902,
+ "end": 10924,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "240"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "PUSH [tag]",
+ "value": "234"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "tag",
+ "value": "240"
+ },
+ {
+ "begin": 10940,
+ "end": 10972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11013,
+ "end": 11023,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11037,
+ "end": 11043,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 10986,
+ "end": 11002,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "LT"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH [tag]",
+ "value": "242"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "242"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MUL"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "ADD"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "tag",
+ "value": "243"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10975,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10940,
+ "end": 11003,
+ "name": "POP"
+ },
+ {
+ "begin": 11026,
+ "end": 11027,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11013,
+ "end": 11027,
+ "name": "POP"
+ },
+ {
+ "begin": 11060,
+ "end": 11061,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11058,
+ "end": 11061,
+ "name": "POP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "244"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 11065,
+ "end": 11081,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11063,
+ "end": 11064,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11063,
+ "end": 11081,
+ "name": "LT"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "245"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11114,
+ "name": "DUP6"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "PUSH [tag]",
+ "value": "247"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11119,
+ "end": 11131,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11119,
+ "end": 11134,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "ADD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11119,
+ "end": 11143,
+ "name": "AND"
+ },
+ {
+ "begin": 11118,
+ "end": 11143,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "tag",
+ "value": "247"
+ },
+ {
+ "begin": 11107,
+ "end": 11143,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "249"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "POP"
+ },
+ {
+ "begin": 11163,
+ "end": 11171,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "PUSH [tag]",
+ "value": "249"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 11175,
+ "end": 11187,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11175,
+ "end": 11190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "ADD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 11175,
+ "end": 11199,
+ "name": "AND"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "tag",
+ "value": "249"
+ },
+ {
+ "begin": 11163,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "tag",
+ "value": "248"
+ },
+ {
+ "begin": 11107,
+ "end": 11199,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "250"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11259,
+ "end": 11260,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11249,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11250,
+ "end": 11255,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "LT"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH [tag]",
+ "value": "251"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "tag",
+ "value": "251"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "MUL"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11256,
+ "name": "ADD"
+ },
+ {
+ "begin": 11231,
+ "end": 11260,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11287,
+ "end": 11288,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "ADD"
+ },
+ {
+ "begin": 11278,
+ "end": 11288,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "tag",
+ "value": "250"
+ },
+ {
+ "begin": 11100,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "246"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11083,
+ "end": 11086,
+ "name": "ADD"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "PUSH [tag]",
+ "value": "244"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "tag",
+ "value": "245"
+ },
+ {
+ "begin": 11053,
+ "end": 11303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11346,
+ "end": 11350,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11343,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11341,
+ "end": 11350,
+ "name": "SUB"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "LT"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH [tag]",
+ "value": "252"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "252"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP1"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MUL"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "ADD"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "tag",
+ "value": "253"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11330,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 11312,
+ "end": 11351,
+ "name": "POP"
+ },
+ {
+ "begin": 11368,
+ "end": 11372,
+ "name": "DUP8"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11366,
+ "end": 11372,
+ "name": "POP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "254"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11376,
+ "end": 11378,
+ "name": "DUP7"
+ },
+ {
+ "begin": 11374,
+ "end": 11375,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11374,
+ "end": 11378,
+ "name": "LT"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "255"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11443,
+ "name": "DUP3"
+ },
+ {
+ "begin": 11444,
+ "end": 11445,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "LT"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "257"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "tag",
+ "value": "257"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MUL"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "ADD"
+ },
+ {
+ "begin": 11425,
+ "end": 11446,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11412,
+ "name": "DUP5"
+ },
+ {
+ "begin": 11417,
+ "end": 11421,
+ "name": "DUP10"
+ },
+ {
+ "begin": 11413,
+ "end": 11414,
+ "name": "DUP4"
+ },
+ {
+ "begin": 11413,
+ "end": 11421,
+ "name": "SUB"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "LT"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH [tag]",
+ "value": "258"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "INVALID"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "tag",
+ "value": "258"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "DUP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "MUL"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11422,
+ "name": "ADD"
+ },
+ {
+ "begin": 11397,
+ "end": 11446,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "256"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 11380,
+ "end": 11383,
+ "name": "ADD"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "PUSH [tag]",
+ "value": "254"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMP"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "tag",
+ "value": "255"
+ },
+ {
+ "begin": 11361,
+ "end": 11446,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "tag",
+ "value": "241"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "POP"
+ },
+ {
+ "begin": 10777,
+ "end": 11453,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "99"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "259"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "PUSH [tag]",
+ "value": "234"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "tag",
+ "value": "259"
+ },
+ {
+ "begin": 9948,
+ "end": 9972,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "260"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "PUSH [tag]",
+ "value": "234"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "tag",
+ "value": "260"
+ },
+ {
+ "begin": 9988,
+ "end": 10022,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10039,
+ "end": 10045,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10039,
+ "end": 10052,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10063,
+ "end": 10073,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "LT"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH [tag]",
+ "value": "262"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "262"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MUL"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "ADD"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "tag",
+ "value": "263"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10025,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 9988,
+ "end": 10053,
+ "name": "POP"
+ },
+ {
+ "begin": 10076,
+ "end": 10077,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10063,
+ "end": 10077,
+ "name": "POP"
+ },
+ {
+ "begin": 10110,
+ "end": 10111,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10108,
+ "end": 10111,
+ "name": "POP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "264"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10115,
+ "end": 10121,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10115,
+ "end": 10128,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10113,
+ "end": 10128,
+ "name": "LT"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "265"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP6"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10164,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10186,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10151,
+ "end": 10179,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10187,
+ "end": 10188,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "LT"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH [tag]",
+ "value": "267"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "267"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "ADD"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "tag",
+ "value": "268"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "EXP"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "DIV"
+ },
+ {
+ "begin": 10180,
+ "end": 10189,
+ "name": "AND"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "ADD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 10151,
+ "end": 10190,
+ "name": "AND"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "269"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10243,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10244,
+ "end": 10245,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "LT"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH [tag]",
+ "value": "270"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "270"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SHA3"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "ADD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "tag",
+ "value": "271"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "EXP"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10237,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10227,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10228,
+ "end": 10233,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "LT"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH [tag]",
+ "value": "272"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "tag",
+ "value": "272"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "AND"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "MUL"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10210,
+ "end": 10234,
+ "name": "ADD"
+ },
+ {
+ "begin": 10210,
+ "end": 10246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10273,
+ "end": 10274,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "ADD"
+ },
+ {
+ "begin": 10264,
+ "end": 10274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "tag",
+ "value": "269"
+ },
+ {
+ "begin": 10147,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "266"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10130,
+ "end": 10133,
+ "name": "ADD"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "PUSH [tag]",
+ "value": "264"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "tag",
+ "value": "265"
+ },
+ {
+ "begin": 10103,
+ "end": 10289,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10329,
+ "end": 10334,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "LT"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH [tag]",
+ "value": "273"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSIZE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "273"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP1"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MUL"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "ADD"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "tag",
+ "value": "274"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10315,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 10298,
+ "end": 10335,
+ "name": "POP"
+ },
+ {
+ "begin": 10352,
+ "end": 10353,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10350,
+ "end": 10353,
+ "name": "POP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "275"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10357,
+ "end": 10362,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10356,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10355,
+ "end": 10362,
+ "name": "LT"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "276"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10418,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10419,
+ "end": 10420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "LT"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "278"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "tag",
+ "value": "278"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MUL"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "ADD"
+ },
+ {
+ "begin": 10401,
+ "end": 10421,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10395,
+ "name": "DUP5"
+ },
+ {
+ "begin": 10396,
+ "end": 10397,
+ "name": "DUP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "LT"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH [tag]",
+ "value": "279"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "INVALID"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "tag",
+ "value": "279"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "AND"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "DUP4"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "MUL"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 10381,
+ "end": 10398,
+ "name": "ADD"
+ },
+ {
+ "begin": 10381,
+ "end": 10421,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "277"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 10364,
+ "end": 10367,
+ "name": "ADD"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "PUSH [tag]",
+ "value": "275"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMP"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "tag",
+ "value": "276"
+ },
+ {
+ "begin": 10345,
+ "end": 10421,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "tag",
+ "value": "261"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "POP"
+ },
+ {
+ "begin": 9853,
+ "end": 10428,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "tag",
+ "value": "104"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1011,
+ "end": 1039,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "107"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "281"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "281"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5112,
+ "end": 5118,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 5112,
+ "end": 5125,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 5127,
+ "end": 5136,
+ "name": "DUP2"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2284,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "PUSH [tag]",
+ "value": "283"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "POP"
+ },
+ {
+ "begin": 2312,
+ "end": 2322,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2309,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2300,
+ "end": 2322,
+ "name": "GT"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "tag",
+ "value": "283"
+ },
+ {
+ "begin": 2256,
+ "end": 2322,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "PUSH [tag]",
+ "value": "284"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2338,
+ "end": 2352,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "tag",
+ "value": "284"
+ },
+ {
+ "begin": 2256,
+ "end": 2352,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "PUSH [tag]",
+ "value": "285"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2368,
+ "end": 2383,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "tag",
+ "value": "285"
+ },
+ {
+ "begin": 2256,
+ "end": 2383,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "PUSH [tag]",
+ "value": "286"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2397,
+ "end": 2402,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "tag",
+ "value": "286"
+ },
+ {
+ "begin": 2249,
+ "end": 2402,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5152,
+ "end": 5160,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "DUP4"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5152,
+ "end": 5172,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "A3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SUB"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "ADD"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5182,
+ "end": 5210,
+ "name": "LOG1"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "tag",
+ "value": "287"
+ },
+ {
+ "begin": 2412,
+ "end": 2413,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "282"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "tag",
+ "value": "280"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "POP"
+ },
+ {
+ "begin": 5010,
+ "end": 5217,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "110"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2676,
+ "end": 2686,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "289"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "289"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1558,
+ "end": 1570,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1558,
+ "end": 1585,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "DUP3"
+ },
+ {
+ "begin": 2714,
+ "end": 2727,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1558,
+ "end": 1597,
+ "name": "AND"
+ },
+ {
+ "begin": 1558,
+ "end": 1602,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "PUSH [tag]",
+ "value": "291"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1616,
+ "end": 1621,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "tag",
+ "value": "291"
+ },
+ {
+ "begin": 1554,
+ "end": 1621,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1876,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1863,
+ "end": 1891,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2765,
+ "end": 2775,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1863,
+ "end": 1898,
+ "name": "AND"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "PUSH [tag]",
+ "value": "293"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1912,
+ "end": 1917,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "tag",
+ "value": "293"
+ },
+ {
+ "begin": 1859,
+ "end": 1917,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2803,
+ "end": 2816,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "PUSH [tag]",
+ "value": "295"
+ },
+ {
+ "begin": 1197,
+ "end": 1210,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1185,
+ "end": 1196,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "tag",
+ "value": "295"
+ },
+ {
+ "begin": 1185,
+ "end": 1211,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1184,
+ "end": 1211,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH [tag]",
+ "value": "296"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "tag",
+ "value": "296"
+ },
+ {
+ "begin": 1176,
+ "end": 1212,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2875,
+ "end": 2879,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2860,
+ "name": "SHA3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2861,
+ "end": 2871,
+ "name": "CALLER"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "DUP5"
+ },
+ {
+ "begin": 2832,
+ "end": 2872,
+ "name": "SHA3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "DUP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "AND"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "OR"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2832,
+ "end": 2879,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "DUP9"
+ },
+ {
+ "begin": 2846,
+ "end": 2859,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "PUSH",
+ "value": "4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 2889,
+ "end": 2928,
+ "name": "LOG3"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "PUSH [tag]",
+ "value": "298"
+ },
+ {
+ "begin": 2954,
+ "end": 2967,
+ "name": "DUP7"
+ },
+ {
+ "begin": 2942,
+ "end": 2953,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "tag",
+ "value": "298"
+ },
+ {
+ "begin": 2942,
+ "end": 2968,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "PUSH [tag]",
+ "value": "165"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "PUSH [tag]",
+ "value": "165"
+ },
+ {
+ "begin": 3004,
+ "end": 3017,
+ "name": "DUP7"
+ },
+ {
+ "begin": 3019,
+ "end": 3034,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 2984,
+ "end": 3003,
+ "name": "PUSH [tag]",
+ "value": "301"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "tag",
+ "value": "300"
+ },
+ {
+ "begin": 2984,
+ "end": 3035,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "tag",
+ "value": "299"
+ },
+ {
+ "begin": 2938,
+ "end": 3046,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "tag",
+ "value": "297"
+ },
+ {
+ "begin": 1222,
+ "end": 1223,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "tag",
+ "value": "294"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1927,
+ "end": 1928,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "tag",
+ "value": "292"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1631,
+ "end": 1632,
+ "name": "POP"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "290"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "tag",
+ "value": "288"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "POP"
+ },
+ {
+ "begin": 2593,
+ "end": 3052,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "tag",
+ "value": "113"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1203,
+ "end": 1207,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1511,
+ "end": 1525,
+ "name": "AND"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1510,
+ "name": "PUSH",
+ "value": "8"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1182,
+ "end": 1184,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1182,
+ "end": 1184,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1443,
+ "end": 1470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1488,
+ "end": 1526,
+ "name": "AND"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH [tag]",
+ "value": "303"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "tag",
+ "value": "303"
+ },
+ {
+ "begin": 1480,
+ "end": 1527,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "72656D6F7665417574686F72697A6564416464726573734174496E6465782861"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "88"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "6464726573732C75696E7432353629"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "MUL"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "PUSH",
+ "value": "2F"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SUB"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "ADD"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "304"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1121,
+ "end": 1181,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1556,
+ "end": 1563,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "LT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "175"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DIV"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MUL"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "174"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "306"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "307"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "GT"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH [tag]",
+ "value": "176"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SUB"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "ADD"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "305"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "POP"
+ },
+ {
+ "begin": 1565,
+ "end": 1566,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1545,
+ "end": 1555,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "tag",
+ "value": "304"
+ },
+ {
+ "begin": 1545,
+ "end": 1567,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "AND"
+ },
+ {
+ "begin": 1545,
+ "end": 1614,
+ "name": "EQ"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "308"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "tag",
+ "value": "308"
+ },
+ {
+ "begin": 1537,
+ "end": 1615,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1292,
+ "end": 1296,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1285,
+ "end": 1296,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1285,
+ "end": 1296,
+ "name": "POP"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "tag",
+ "value": "309"
+ },
+ {
+ "begin": 1625,
+ "end": 1626,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "tag",
+ "value": "302"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "POP"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "POP"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "POP"
+ },
+ {
+ "begin": 1058,
+ "end": 1303,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "116"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5580,
+ "end": 5598,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "PUSH [tag]",
+ "value": "311"
+ },
+ {
+ "begin": 5645,
+ "end": 5656,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5658,
+ "end": 5663,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5665,
+ "end": 5669,
+ "name": "DUP5"
+ },
+ {
+ "begin": 5630,
+ "end": 5644,
+ "name": "PUSH [tag]",
+ "value": "312"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "tag",
+ "value": "311"
+ },
+ {
+ "begin": 5630,
+ "end": 5670,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 5614,
+ "end": 5670,
+ "name": "POP"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "PUSH [tag]",
+ "value": "313"
+ },
+ {
+ "begin": 5699,
+ "end": 5712,
+ "name": "DUP2"
+ },
+ {
+ "begin": 5680,
+ "end": 5698,
+ "name": "PUSH [tag]",
+ "value": "110"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "tag",
+ "value": "313"
+ },
+ {
+ "begin": 5680,
+ "end": 5713,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "tag",
+ "value": "310"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "POP"
+ },
+ {
+ "begin": 5476,
+ "end": 5720,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "tag",
+ "value": "119"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2092,
+ "end": 2105,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2130,
+ "end": 2150,
+ "name": "PUSH [tag]",
+ "value": "315"
+ },
+ {
+ "begin": 2141,
+ "end": 2142,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2144,
+ "end": 2149,
+ "name": "DUP4"
+ },
+ {
+ "begin": 2130,
+ "end": 2140,
+ "name": "PUSH [tag]",
+ "value": "177"
+ },
+ {
+ "begin": 2130,
+ "end": 2150,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 2130,
+ "end": 2150,
+ "name": "tag",
+ "value": "315"
+ },
+ {
+ "begin": 2130,
+ "end": 2150,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2121,
+ "end": 2150,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "tag",
+ "value": "314"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "POP"
+ },
+ {
+ "begin": 1981,
+ "end": 2180,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "tag",
+ "value": "122"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1065,
+ "end": 1112,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "tag",
+ "value": "125"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 276,
+ "end": 278,
+ "name": "PUSH",
+ "value": "32"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "DUP2"
+ },
+ {
+ "begin": 237,
+ "end": 278,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "tag",
+ "value": "128"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "DUP2"
+ },
+ {
+ "begin": 985,
+ "end": 1005,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "131"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4561,
+ "end": 4567,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1228,
+ "end": 1232,
+ "name": "ADDRESS"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1216,
+ "name": "CALLER"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "AND"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "EQ"
+ },
+ {
+ "begin": 1206,
+ "end": 1233,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "PUSH [tag]",
+ "value": "317"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1247,
+ "end": 1252,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "tag",
+ "value": "317"
+ },
+ {
+ "begin": 1202,
+ "end": 1252,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1447,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4499,
+ "end": 4504,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1440,
+ "end": 1454,
+ "name": "AND"
+ },
+ {
+ "begin": 1439,
+ "end": 1454,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "PUSH [tag]",
+ "value": "319"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1468,
+ "end": 1473,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "tag",
+ "value": "319"
+ },
+ {
+ "begin": 1435,
+ "end": 1473,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1339,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4532,
+ "end": 4540,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1332,
+ "end": 1346,
+ "name": "AND"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "PUSH [tag]",
+ "value": "321"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1360,
+ "end": 1365,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "tag",
+ "value": "321"
+ },
+ {
+ "begin": 1328,
+ "end": 1365,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4568,
+ "end": 4569,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4561,
+ "end": 4569,
+ "name": "POP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "323"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4573,
+ "end": 4579,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4573,
+ "end": 4586,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4571,
+ "end": 4586,
+ "name": "LT"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "324"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4622,
+ "end": 4627,
+ "name": "DUP5"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4615,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4616,
+ "end": 4617,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "LT"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH [tag]",
+ "value": "326"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "326"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "ADD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "tag",
+ "value": "327"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "EXP"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "DIV"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4618,
+ "name": "AND"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "AND"
+ },
+ {
+ "begin": 4609,
+ "end": 4627,
+ "name": "EQ"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "328"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4659,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4647,
+ "end": 4653,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4654,
+ "end": 4655,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "LT"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH [tag]",
+ "value": "329"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "INVALID"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "329"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "ADD"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "tag",
+ "value": "330"
+ },
+ {
+ "begin": 4647,
+ "end": 4656,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "EXP"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "NOT"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "AND"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "MUL"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "OR"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4647,
+ "end": 4667,
+ "name": "POP"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "PUSH [tag]",
+ "value": "324"
+ },
+ {
+ "begin": 4685,
+ "end": 4690,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "tag",
+ "value": "328"
+ },
+ {
+ "begin": 4605,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "325"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "ADD"
+ },
+ {
+ "begin": 4588,
+ "end": 4591,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "PUSH [tag]",
+ "value": "323"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMP"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "tag",
+ "value": "324"
+ },
+ {
+ "begin": 4556,
+ "end": 4705,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP7"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "AND"
+ },
+ {
+ "begin": 4731,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4721,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP9"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "AND"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4746,
+ "end": 4763,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "AND"
+ },
+ {
+ "begin": 4714,
+ "end": 4736,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "OR"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 4746,
+ "end": 4770,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4714,
+ "end": 4728,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "PUSH",
+ "value": "8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4780,
+ "end": 4799,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "AND"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "F39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4809,
+ "end": 4832,
+ "name": "LOG2"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "tag",
+ "value": "322"
+ },
+ {
+ "begin": 1375,
+ "end": 1376,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "tag",
+ "value": "320"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1483,
+ "end": 1484,
+ "name": "POP"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "tag",
+ "value": "318"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1262,
+ "end": 1263,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "tag",
+ "value": "316"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "POP"
+ },
+ {
+ "begin": 4390,
+ "end": 4839,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "134"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3808,
+ "end": 3830,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1996,
+ "end": 2023,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "ADD"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3705,
+ "end": 3718,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 1996,
+ "end": 2032,
+ "name": "AND"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "PUSH [tag]",
+ "value": "332"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2046,
+ "end": 2051,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "tag",
+ "value": "332"
+ },
+ {
+ "begin": 1992,
+ "end": 2051,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3743,
+ "end": 3756,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "PUSH [tag]",
+ "value": "334"
+ },
+ {
+ "begin": 1310,
+ "end": 1323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1298,
+ "end": 1309,
+ "name": "PUSH [tag]",
+ "value": "71"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "tag",
+ "value": "334"
+ },
+ {
+ "begin": 1298,
+ "end": 1324,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH [tag]",
+ "value": "335"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "tag",
+ "value": "335"
+ },
+ {
+ "begin": 1290,
+ "end": 1325,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "PUSH",
+ "value": "6"
+ },
+ {
+ "begin": 1463,
+ "end": 1480,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1445,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1428,
+ "end": 1460,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3779,
+ "end": 3792,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1428,
+ "end": 1480,
+ "name": "ADD"
+ },
+ {
+ "begin": 1409,
+ "end": 1424,
+ "name": "TIMESTAMP"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "LT"
+ },
+ {
+ "begin": 1409,
+ "end": 1480,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH [tag]",
+ "value": "337"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "REVERT"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "tag",
+ "value": "337"
+ },
+ {
+ "begin": 1401,
+ "end": 1481,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3833,
+ "end": 3845,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3881,
+ "name": "ADD"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "AND"
+ },
+ {
+ "begin": 3884,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "OR"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "ADD"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3833,
+ "end": 3860,
+ "name": "SWAP11"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3916,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 3928,
+ "end": 3936,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3938,
+ "end": 3945,
+ "name": "SWAP3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3870,
+ "end": 3888,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "339"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "LT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "340"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DIV"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MUL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "339"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "340"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SHA3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "341"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GT"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH [tag]",
+ "value": "341"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "AND"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "ADD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "tag",
+ "value": "339"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "DUP8"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "PUSH",
+ "value": "8502"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "GAS"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SUB"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "CALL"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3902,
+ "end": 3946,
+ "name": "POP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "342"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "DUP6"
+ },
+ {
+ "begin": 3970,
+ "end": 3983,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3960,
+ "end": 3984,
+ "name": "LOG2"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "PUSH [tag]",
+ "value": "160"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMP"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "342"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "DUP6"
+ },
+ {
+ "begin": 4030,
+ "end": 4043,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4013,
+ "end": 4044,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4058,
+ "end": 4069,
+ "name": "ADD"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "DUP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "AND"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4058,
+ "end": 4077,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "tag",
+ "value": "343"
+ },
+ {
+ "begin": 3898,
+ "end": 4088,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "tag",
+ "value": "338"
+ },
+ {
+ "begin": 1491,
+ "end": 1492,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "tag",
+ "value": "336"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1335,
+ "end": 1336,
+ "name": "POP"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "tag",
+ "value": "333"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 2061,
+ "end": 2062,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "tag",
+ "value": "331"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "POP"
+ },
+ {
+ "begin": 3622,
+ "end": 4094,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "177"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4242,
+ "end": 4255,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4291,
+ "end": 4296,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4299,
+ "end": 4300,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 4291,
+ "end": 4300,
+ "name": "ADD"
+ },
+ {
+ "begin": 4279,
+ "end": 4280,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4279,
+ "end": 4287,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "LT"
+ },
+ {
+ "begin": 4279,
+ "end": 4300,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH [tag]",
+ "value": "345"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "REVERT"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "tag",
+ "value": "345"
+ },
+ {
+ "begin": 4271,
+ "end": 4301,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 4357,
+ "end": 4359,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4350,
+ "end": 4353,
+ "name": "ADD"
+ },
+ {
+ "begin": 4344,
+ "end": 4349,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "E0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 4488,
+ "end": 4491,
+ "name": "AND"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "tag",
+ "value": "344"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "POP"
+ },
+ {
+ "begin": 4135,
+ "end": 4606,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "301"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4324,
+ "name": "PUSH",
+ "value": "7"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4339,
+ "name": "SHA3"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4307,
+ "end": 4358,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP4"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "DUP5"
+ },
+ {
+ "begin": 4325,
+ "end": 4338,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "PUSH",
+ "value": "B237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "DUP3"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SUB"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "ADD"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 4368,
+ "end": 4420,
+ "name": "LOG2"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "tag",
+ "value": "346"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "POP"
+ },
+ {
+ "begin": 4204,
+ "end": 4427,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "312"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8126,
+ "end": 8144,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8096,
+ "end": 8107,
+ "name": "DUP4"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "DUP2"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "AND"
+ },
+ {
+ "begin": 2124,
+ "end": 2137,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "PUSH [tag]",
+ "value": "348"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 2151,
+ "end": 2156,
+ "name": "REVERT"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "tag",
+ "value": "348"
+ },
+ {
+ "begin": 2120,
+ "end": 2156,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "80"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP9"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP10"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP7"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP8"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SHA3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 8176,
+ "end": 8192,
+ "name": "SWAP7"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8232,
+ "end": 8372,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8229,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "350"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP6"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH [tag]",
+ "value": "351"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "tag",
+ "value": "350"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ADD"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "NOT"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "AND"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "OR"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8202,
+ "end": 8372,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8382,
+ "end": 8398,
+ "name": "PUSH",
+ "value": "5"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "DUP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "ADD"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8382,
+ "end": 8403,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "DUP3"
+ },
+ {
+ "begin": 8424,
+ "end": 8437,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "PUSH",
+ "value": "C0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "SWAP1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 8413,
+ "end": 8438,
+ "name": "LOG2"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "tag",
+ "value": "349"
+ },
+ {
+ "begin": 2166,
+ "end": 2167,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "tag",
+ "value": "347"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "POP"
+ },
+ {
+ "begin": 7994,
+ "end": 8445,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "153"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SHA3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "354"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "353"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "352"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "211"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SHA3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "141"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "354"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "356"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "355"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "234"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "239"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "351"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MUL"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SUB"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DIV"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SHA3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DIV"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "LT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "358"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "NOT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "AND"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP4"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "OR"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP6"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "360"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "358"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP6"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "360"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "359"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "360"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "359"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "360"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "357"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "361"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "354"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[in]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "361"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "354"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "235"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "363"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP3"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "GT"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "361"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "DUP2"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "ADD"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "PUSH [tag]",
+ "value": "363"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "364"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "POP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "tag",
+ "value": "362"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 703,
+ "end": 2182,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "bytecode": {
+ "object": "0x606060405234156200000d57fe5b6040516200217c3803806200217c83398101604090815281516020830151918301516060840151918401939290920191905b838383835b600060008584845b82825b600082518260328211806200006357508181115b806200006d575080155b8062000077575081155b15620000835760006000fd5b600092505b84518310156200015857600260008685815181101515620000a557fe5b6020908102909101810151600160a060020a031682528101919091526040016000205460ff1680620000f857508483815181101515620000e157fe5b90602001906020020151600160a060020a03166000145b15620001045760006000fd5b60016002600087868151811015156200011957fe5b602090810291909101810151600160a060020a03168252810191909152604001600020805460ff19169115159190911790555b60019092019162000088565b84516200016d90600390602088019062000206565b5060048490555b5b505050600683905550505b505050600091505b8451821015620001f4578482815181101515620001a157fe5b602090810290910101519050600160a060020a0381161515620001c45760006000fd5b600160a060020a0381166000908152600860205260409020805460ff191660011790555b60019091019062000188565b5b5050505050505b505050506200029f565b8280548282559060005260206000209081019282156200025e579160200282015b828111156200025e5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000227565b5b506200026d92915062000271565b5090565b6200029c91905b808211156200026d578054600160a060020a031916815560010162000278565b5090565b90565b611ecd80620002af6000396000f300606060405236156101645763ffffffff60e060020a600035041663025e7c2781146101b6578063173825d9146101e557806320ea8d86146102035780632f54bf6e146102185780633411c81c146102485780633589b35c1461027b57806337bd78a01461029057806354741525146102b25780635a1a66af146102de5780637065cb481461030157806372cbe61d1461031f578063784547a7146103895780637ad28c51146103b057806383250f79146103c55780638b51d13f146103f55780639ace38c21461041a578063a0e67e2b146104d7578063a8abe69a14610542578063b5dc40c3146105bd578063b77bf6001461062b578063ba51a6df1461064d578063c01a8c8414610662578063c296e43c14610677578063c64274741461069e578063cc12cb2814610713578063d38f2d8214610788578063d74f8edd146107ad578063dc8452cd146107cf578063e20056e6146107f1578063ee22610b14610815575b6101b45b60003411156101b157604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b34156101be57fe5b6101c960043561082a565b60408051600160a060020a039092168252519081900360200190f35b34156101ed57fe5b6101b4600160a060020a036004351661085c565b005b341561020b57fe5b6101b4600435610a0d565b005b341561022057fe5b610234600160a060020a0360043516610b01565b604080519115158252519081900360200190f35b341561025057fe5b610234600435600160a060020a0360243516610b16565b604080519115158252519081900360200190f35b341561028357fe5b6101b4600435610b36565b005b341561029857fe5b6102a0610de5565b60408051918252519081900360200190f35b34156102ba57fe5b6102a060043515156024351515610deb565b60408051918252519081900360200190f35b34156102e657fe5b6101b4600160a060020a03600435166024351515610e5a565b005b341561030957fe5b6101b4600160a060020a0360043516610efa565b005b341561032757fe5b610234600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061103195505050505050565b604080519115158252519081900360200190f35b341561039157fe5b6102346004356110a8565b604080519115158252519081900360200190f35b34156103b857fe5b6101b460043561113c565b005b34156103cd57fe5b610234600160a060020a036004351661119a565b604080519115158252519081900360200190f35b34156103fd57fe5b6102a06004356111af565b60408051918252519081900360200190f35b341561042257fe5b61042d60043561122e565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a0830190859080156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b50509550505050505060405180910390f35b34156104df57fe5b6104e7611262565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b341561054a57fe5b6104e7600435602435604435151560643515156112cb565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b34156105c557fe5b6104e7600435611400565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b341561063357fe5b6102a0611588565b60408051918252519081900360200190f35b341561065557fe5b6101b460043561158e565b005b341561066a57fe5b6101b460043561161e565b005b341561067f57fe5b610234600435611733565b604080519115158252519081900360200190f35b34156106a657fe5b604080516020600460443581810135601f81018490048402850184019095528484526102a0948235600160a060020a031694602480359560649492939190920191819084018382808284375094965061187a95505050505050565b60408051918252519081900360200190f35b341561071b57fe5b61076b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843750949650509335935061189a92505050565b60408051600160e060020a03199092168252519081900360200190f35b341561079057fe5b6102a06004356118af565b60408051918252519081900360200190f35b34156107b557fe5b6102a06118c1565b60408051918252519081900360200190f35b34156107d757fe5b6102a06118c6565b60408051918252519081900360200190f35b34156107f957fe5b6101b4600160a060020a03600435811690602435166118cc565b005b341561081d57fe5b6101b4600435611a88565b005b600380548290811061083857fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a031614151561087f5760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156108a95760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156109a45782600160a060020a03166003838154811015156108f357fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156109985760038054600019810190811061093457fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561096357fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506109a4565b5b6001909101906108cc565b6003805460001901906109b79082611d89565b5060035460045411156109d0576003546109d09061158e565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff161515610a365760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff161515610a6c5760006000fd5b600084815260208190526040902060030154849060ff1615610a8e5760006000fd5b84610a98816110a8565b15610aa35760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610b585760006000fd5b82610b62816110a8565b1515610b6e5760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610ba55760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610c949392830182828015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b50505050506000611c1d565b600160e060020a03191614610ca95760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610d525780601f10610d2757610100808354040283529160200191610d52565b820191906000526020600020905b815481529060010190602001808311610d3557829003601f168201915b505091505060006040518083038185876185025a03f19250505015610da15760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610af5565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610e5257838015610e18575060008181526020819052604090206003015460ff16155b80610e3c5750828015610e3c575060008181526020819052604090206003015460ff165b5b15610e49576001820191505b5b600101610def565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610e7b5760006000fd5b81600160a060020a0381161515610e925760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610f1b5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610f445760006000fd5b81600160a060020a0381161515610f5b5760006000fd5b6003805490506001016004546032821180610f7557508181115b80610f7e575080155b80610f87575081155b15610f925760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610fca8382611d89565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020820152905190819003602f019020600090600160e060020a0319166110958383611c1d565b600160e060020a0319161490505b919050565b600080805b60035481101561113457600084815260016020526040812060038054919291849081106110d657fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615611118576001820191505b60045482141561112b5760019250611134565b5b6001016110ad565b5b5050919050565b30600160a060020a031633600160a060020a031614151561115d5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b60035481101561122757600083815260016020526040812060038054919291849081106111dc57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561121e576001820191505b5b6001016111b3565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b61126a611ddd565b60038054806020026020016040519081016040528092919081815260200182805480156112c057602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116112a2575b505050505090505b90565b6112d3611ddd565b6112db611ddd565b600060006005546040518059106112ef5750595b908082528060200260200182016040525b50925060009150600090505b60055481101561138957858015611335575060008181526020819052604090206003015460ff16155b806113595750848015611359575060008181526020819052604090206003015460ff165b5b156113805780838381518110151561136e57fe5b60209081029091010152600191909101905b5b60010161130c565b8787036040518059106113995750595b908082528060200260200182016040525b5093508790505b868110156113f45782818151811015156113c757fe5b90602001906020020151848983038151811015156113e157fe5b602090810290910101525b6001016113b1565b5b505050949350505050565b611408611ddd565b611410611ddd565b60035460405160009182918059106114255750595b908082528060200260200182016040525b50925060009150600090505b60035481101561150a576000858152600160205260408120600380549192918490811061146b57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff16156115015760038054829081106114b457fe5b906000526020600020900160005b9054906101000a9004600160a060020a031683838151811015156114e257fe5b600160a060020a03909216602092830290910190910152600191909101905b5b600101611442565b816040518059106115185750595b908082528060200260200182016040525b509350600090505b8181101561157f57828181518110151561154757fe5b90602001906020020151848281518110151561155f57fe5b600160a060020a039092166020928302909101909101525b600101611531565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a03161415156115af5760006000fd5b6003548160328211806115c157508181115b806115ca575080155b806115d3575081155b156115de5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156116475760006000fd5b6000828152602081905260409020548290600160a060020a0316151561166d5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff16156116a25760006000fd5b846116ac816110a8565b156116b75760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611716866110a8565b15610af557610af58642611c4a565b5b5b5b505b50505b505b5050565b6000818152602081815260408083208054600160a060020a03168452600890925282205483919060ff1615156117695760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a0319909116936118589392830182828015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b50505050506000611c1d565b600160e060020a0319161461186d5760006000fd5b600192505b5b5050919050565b6000611887848484611c96565b90506118928161161e565b5b9392505050565b60006118a68383611c1d565b90505b92915050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156118ef5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff1615156119195760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156119425760006000fd5b600092505b6003548310156119ea5784600160a060020a031660038481548110151561196a57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156119de57836003848154811015156119a957fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506119ea565b5b600190920191611947565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff1615611aaa5760006000fd5b82611ab4816110a8565b1515611ac05760006000fd5b600654600085815260076020526040902054859101421015611ae25760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b505091505060006040518083038185876185025a03f19250505015611bda5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610af8565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b600081600401835110151515611c335760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a0381161515611caf5760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611d2f926002850192910190611e01565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b815481835581811511610a0657600083815260209020610a06918101908301611e80565b5b505050565b815481835581811511610a0657600083815260209020610a06918101908301611e80565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611e4257805160ff1916838001178555611e6f565b82800160010185558215611e6f579182015b82811115611e6f578251825591602001919060010190611e54565b5b50611e7c929150611e80565b5090565b6112c891905b80821115611e7c5760008155600101611e86565b5090565b905600a165627a7a72305820dfebd4bc1393ad5d741d2d12f334c78b86e9e4d031a3671a7869ea640fafc58f0029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLVALUE ISZERO PUSH3 0xD JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH3 0x217C CODESIZE SUB DUP1 PUSH3 0x217C DUP4 CODECOPY DUP2 ADD PUSH1 0x40 SWAP1 DUP2 MSTORE DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD SWAP2 DUP4 ADD MLOAD PUSH1 0x60 DUP5 ADD MLOAD SWAP2 DUP5 ADD SWAP4 SWAP3 SWAP1 SWAP3 ADD SWAP2 SWAP1 JUMPDEST DUP4 DUP4 DUP4 DUP4 JUMPDEST PUSH1 0x0 PUSH1 0x0 DUP6 DUP5 DUP5 JUMPDEST DUP3 DUP3 JUMPDEST PUSH1 0x0 DUP3 MLOAD DUP3 PUSH1 0x32 DUP3 GT DUP1 PUSH3 0x63 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH3 0x6D JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH3 0x77 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH3 0x83 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST DUP5 MLOAD DUP4 LT ISZERO PUSH3 0x158 JUMPI PUSH1 0x2 PUSH1 0x0 DUP7 DUP6 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xA5 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND DUP1 PUSH3 0xF8 JUMPI POP DUP5 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0xE1 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x0 EQ JUMPDEST ISZERO PUSH3 0x104 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 PUSH1 0x0 DUP8 DUP7 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x119 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 ADD DUP2 ADD MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP3 MSTORE DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH3 0x88 JUMP JUMPDEST DUP5 MLOAD PUSH3 0x16D SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x20 DUP9 ADD SWAP1 PUSH3 0x206 JUMP JUMPDEST POP PUSH1 0x4 DUP5 SWAP1 SSTORE JUMPDEST JUMPDEST POP POP POP PUSH1 0x6 DUP4 SWAP1 SSTORE POP POP JUMPDEST POP POP POP PUSH1 0x0 SWAP2 POP JUMPDEST DUP5 MLOAD DUP3 LT ISZERO PUSH3 0x1F4 JUMPI DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH3 0x1A1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MLOAD SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH3 0x1C4 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x188 JUMP JUMPDEST JUMPDEST POP POP POP POP POP POP JUMPDEST POP POP POP POP PUSH3 0x29F JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH3 0x25E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x25E JUMPI DUP3 MLOAD DUP3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND OR DUP3 SSTORE PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH3 0x227 JUMP JUMPDEST JUMPDEST POP PUSH3 0x26D SWAP3 SWAP2 POP PUSH3 0x271 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x29C SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x26D JUMPI DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x278 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x1ECD DUP1 PUSH3 0x2AF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x164 JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x25E7C27 DUP2 EQ PUSH2 0x1B6 JUMPI DUP1 PUSH4 0x173825D9 EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x20EA8D86 EQ PUSH2 0x203 JUMPI DUP1 PUSH4 0x2F54BF6E EQ PUSH2 0x218 JUMPI DUP1 PUSH4 0x3411C81C EQ PUSH2 0x248 JUMPI DUP1 PUSH4 0x3589B35C EQ PUSH2 0x27B JUMPI DUP1 PUSH4 0x37BD78A0 EQ PUSH2 0x290 JUMPI DUP1 PUSH4 0x54741525 EQ PUSH2 0x2B2 JUMPI DUP1 PUSH4 0x5A1A66AF EQ PUSH2 0x2DE JUMPI DUP1 PUSH4 0x7065CB48 EQ PUSH2 0x301 JUMPI DUP1 PUSH4 0x72CBE61D EQ PUSH2 0x31F JUMPI DUP1 PUSH4 0x784547A7 EQ PUSH2 0x389 JUMPI DUP1 PUSH4 0x7AD28C51 EQ PUSH2 0x3B0 JUMPI DUP1 PUSH4 0x83250F79 EQ PUSH2 0x3C5 JUMPI DUP1 PUSH4 0x8B51D13F EQ PUSH2 0x3F5 JUMPI DUP1 PUSH4 0x9ACE38C2 EQ PUSH2 0x41A JUMPI DUP1 PUSH4 0xA0E67E2B EQ PUSH2 0x4D7 JUMPI DUP1 PUSH4 0xA8ABE69A EQ PUSH2 0x542 JUMPI DUP1 PUSH4 0xB5DC40C3 EQ PUSH2 0x5BD JUMPI DUP1 PUSH4 0xB77BF600 EQ PUSH2 0x62B JUMPI DUP1 PUSH4 0xBA51A6DF EQ PUSH2 0x64D JUMPI DUP1 PUSH4 0xC01A8C84 EQ PUSH2 0x662 JUMPI DUP1 PUSH4 0xC296E43C EQ PUSH2 0x677 JUMPI DUP1 PUSH4 0xC6427474 EQ PUSH2 0x69E JUMPI DUP1 PUSH4 0xCC12CB28 EQ PUSH2 0x713 JUMPI DUP1 PUSH4 0xD38F2D82 EQ PUSH2 0x788 JUMPI DUP1 PUSH4 0xD74F8EDD EQ PUSH2 0x7AD JUMPI DUP1 PUSH4 0xDC8452CD EQ PUSH2 0x7CF JUMPI DUP1 PUSH4 0xE20056E6 EQ PUSH2 0x7F1 JUMPI DUP1 PUSH4 0xEE22610B EQ PUSH2 0x815 JUMPI JUMPDEST PUSH2 0x1B4 JUMPDEST PUSH1 0x0 CALLVALUE GT ISZERO PUSH2 0x1B1 JUMPI PUSH1 0x40 DUP1 MLOAD CALLVALUE DUP2 MSTORE SWAP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND SWAP2 PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 JUMPDEST JUMPDEST JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x1BE JUMPI INVALID JUMPDEST PUSH2 0x1C9 PUSH1 0x4 CALLDATALOAD PUSH2 0x82A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1ED JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x85C JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x20B JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0xA0D JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x220 JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0xB01 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x250 JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x24 CALLDATALOAD AND PUSH2 0xB16 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x283 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0xB36 JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x298 JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH2 0xDE5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2BA JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH1 0x4 CALLDATALOAD ISZERO ISZERO PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xDEB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x2E6 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0xE5A JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x309 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0xEFA JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x327 JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP7 POP PUSH2 0x1031 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x391 JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH2 0x10A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x3B8 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0x113C JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x3CD JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD AND PUSH2 0x119A JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x3FD JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH1 0x4 CALLDATALOAD PUSH2 0x11AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x422 JUMPI INVALID JUMPDEST PUSH2 0x42D PUSH1 0x4 CALLDATALOAD PUSH2 0x122E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP7 AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP6 SWAP1 MSTORE DUP3 ISZERO ISZERO PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 SWAP2 DUP2 ADD DUP3 DUP2 MSTORE DUP5 SLOAD PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV SWAP3 DUP3 ADD DUP4 SWAP1 MSTORE SWAP1 SWAP2 PUSH1 0xA0 DUP4 ADD SWAP1 DUP6 SWAP1 DUP1 ISZERO PUSH2 0x4C5 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x49A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x4C5 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x4A8 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x4DF JUMPI INVALID JUMPDEST PUSH2 0x4E7 PUSH2 0x1262 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x52F JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x52F JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x50F JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x54A JUMPI INVALID JUMPDEST PUSH2 0x4E7 PUSH1 0x4 CALLDATALOAD PUSH1 0x24 CALLDATALOAD PUSH1 0x44 CALLDATALOAD ISZERO ISZERO PUSH1 0x64 CALLDATALOAD ISZERO ISZERO PUSH2 0x12CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x52F JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x52F JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x50F JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x5C5 JUMPI INVALID JUMPDEST PUSH2 0x4E7 PUSH1 0x4 CALLDATALOAD PUSH2 0x1400 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x52F JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x52F JUMPI PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x50F JUMP JUMPDEST POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x633 JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH2 0x1588 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x655 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0x158E JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x66A JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0x161E JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x67F JUMPI INVALID JUMPDEST PUSH2 0x234 PUSH1 0x4 CALLDATALOAD PUSH2 0x1733 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x6A6 JUMPI INVALID JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x2A0 SWAP5 DUP3 CALLDATALOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD SWAP6 PUSH1 0x64 SWAP5 SWAP3 SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP7 POP PUSH2 0x187A SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x71B JUMPI INVALID JUMPDEST PUSH2 0x76B PUSH1 0x4 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP3 ADD DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP7 POP POP SWAP4 CALLDATALOAD SWAP4 POP PUSH2 0x189A SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x790 JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH1 0x4 CALLDATALOAD PUSH2 0x18AF JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x7B5 JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH2 0x18C1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x7D7 JUMPI INVALID JUMPDEST PUSH2 0x2A0 PUSH2 0x18C6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x7F9 JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x18CC JUMP JUMPDEST STOP JUMPDEST CALLVALUE ISZERO PUSH2 0x81D JUMPI INVALID JUMPDEST PUSH2 0x1B4 PUSH1 0x4 CALLDATALOAD PUSH2 0x1A88 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x838 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP2 POP SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x87F JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x8A9 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP2 POP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x0 NOT ADD DUP3 LT ISZERO PUSH2 0x9A4 JUMPI DUP3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x8F3 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x998 JUMPI PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT DUP2 ADD SWAP1 DUP2 LT PUSH2 0x934 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP4 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x963 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x9A4 JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x8CC JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD PUSH1 0x0 NOT ADD SWAP1 PUSH2 0x9B7 SWAP1 DUP3 PUSH2 0x1D89 JUMP JUMPDEST POP PUSH1 0x3 SLOAD PUSH1 0x4 SLOAD GT ISZERO PUSH2 0x9D0 JUMPI PUSH1 0x3 SLOAD PUSH2 0x9D0 SWAP1 PUSH2 0x158E JUMP JUMPDEST JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP5 AND SWAP1 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA36 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xA6C JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD DUP5 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xA8E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0xA98 DUP2 PUSH2 0x10A8 JUMP JUMPDEST ISZERO PUSH2 0xAA3 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP6 MSTORE SWAP3 MSTORE DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE MLOAD DUP9 SWAP3 PUSH32 0xF6A317157440607F36269043EB55F1287A5A19BA2216AFEAB88CD46CBCFB88E9 SWAP2 LOG3 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xB58 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0xB62 DUP2 PUSH2 0x10A8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0xB6E JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP6 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xBA5 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A6564416464726573734174496E6465782861 DUP2 MSTORE PUSH1 0x88 PUSH1 0x2 EXP PUSH15 0x6464726573732C75696E7432353629 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD PUSH1 0x2F SWAP3 DUP2 SWAP1 SUB SWAP3 SWAP1 SWAP3 ADD DUP3 SHA3 PUSH1 0x2 DUP6 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND SWAP4 PUSH2 0xC94 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xC88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH1 0x0 PUSH2 0x1C1D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND EQ PUSH2 0xCA9 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP12 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0xD52 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD27 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD52 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD35 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0xDA1 JUMPI PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xAF5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP7 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP6 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0xE52 JUMPI DUP4 DUP1 ISZERO PUSH2 0xE18 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0xE3C JUMPI POP DUP3 DUP1 ISZERO PUSH2 0xE3C JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0xE49 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0xDEF JUMP JUMPDEST JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xE7B JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xE92 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x8 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND DUP7 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP4 DUP5 MSTORE SWAP1 DUP4 ADD MSTORE DUP1 MLOAD PUSH32 0xDAEF8FF7DC66C5E34EB9C338AAB679D9F427F89868D9228494455A4D982EB2B0 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0xF1B JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0xF44 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0xF5B JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 DUP1 SLOAD SWAP1 POP PUSH1 0x1 ADD PUSH1 0x4 SLOAD PUSH1 0x32 DUP3 GT DUP1 PUSH2 0xF75 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0xF7E JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0xF87 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0xF92 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x3 DUP1 SLOAD SWAP1 SWAP2 DUP2 ADD PUSH2 0xFCA DUP4 DUP3 PUSH2 0x1D89 JUMP JUMPDEST SWAP2 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP11 AND PUSH2 0x100 SWAP4 SWAP1 SWAP4 EXP DUP4 DUP2 MUL SWAP2 MUL NOT SWAP1 SWAP2 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 SWAP2 POP PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMPDEST POP JUMPDEST POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A6564416464726573734174496E6465782861 DUP2 MSTORE PUSH1 0x88 PUSH1 0x2 EXP PUSH15 0x6464726573732C75696E7432353629 MUL PUSH1 0x20 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x2F ADD SWAP1 SHA3 PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND PUSH2 0x1095 DUP4 DUP4 PUSH2 0x1C1D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND EQ SWAP1 POP JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1134 JUMPI PUSH1 0x0 DUP5 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x10D6 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1118 JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST PUSH1 0x4 SLOAD DUP3 EQ ISZERO PUSH2 0x112B JUMPI PUSH1 0x1 SWAP3 POP PUSH2 0x1134 JUMP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x10AD JUMP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x115D JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xD1C9101A34FEFF75CCCEF14A28785A0279CB0B49C1F321F21F5F422E746B4377 SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP JUMP JUMPDEST PUSH1 0x8 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x1227 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x11DC JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x121E JUMPI PUSH1 0x1 DUP3 ADD SWAP2 POP JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x11B3 JUMP JUMPDEST JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP2 SWAP1 MSTORE SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 DUP1 SLOAD PUSH1 0x1 DUP3 ADD SLOAD PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND SWAP3 SWAP1 SWAP2 PUSH1 0x2 SWAP1 SWAP2 ADD SWAP1 PUSH1 0xFF AND DUP5 JUMP JUMPDEST PUSH2 0x126A PUSH2 0x1DDD JUMP JUMPDEST PUSH1 0x3 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x12C0 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12A2 JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x12D3 PUSH2 0x1DDD JUMP JUMPDEST PUSH2 0x12DB PUSH2 0x1DDD JUMP JUMPDEST PUSH1 0x0 PUSH1 0x0 PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x12EF JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x5 SLOAD DUP2 LT ISZERO PUSH2 0x1389 JUMPI DUP6 DUP1 ISZERO PUSH2 0x1335 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND ISZERO JUMPDEST DUP1 PUSH2 0x1359 JUMPI POP DUP5 DUP1 ISZERO PUSH2 0x1359 JUMPI POP PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 PUSH1 0x3 ADD SLOAD PUSH1 0xFF AND JUMPDEST JUMPDEST ISZERO PUSH2 0x1380 JUMPI DUP1 DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x136E JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x130C JUMP JUMPDEST DUP8 DUP8 SUB PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1399 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP DUP8 SWAP1 POP JUMPDEST DUP7 DUP2 LT ISZERO PUSH2 0x13F4 JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13C7 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP10 DUP4 SUB DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x13E1 JUMPI INVALID JUMPDEST PUSH1 0x20 SWAP1 DUP2 MUL SWAP1 SWAP2 ADD ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x13B1 JUMP JUMPDEST JUMPDEST POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x1408 PUSH2 0x1DDD JUMP JUMPDEST PUSH2 0x1410 PUSH2 0x1DDD JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 DUP3 SWAP2 DUP1 MSIZE LT PUSH2 0x1425 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH1 0x0 SWAP1 POP JUMPDEST PUSH1 0x3 SLOAD DUP2 LT ISZERO PUSH2 0x150A JUMPI PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 DUP1 SLOAD SWAP2 SWAP3 SWAP2 DUP5 SWAP1 DUP2 LT PUSH2 0x146B JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB PUSH2 0x100 SWAP3 SWAP1 SWAP3 EXP SWAP1 DIV AND DUP2 MSTORE PUSH1 0x20 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x40 ADD PUSH1 0x0 SHA3 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0x1501 JUMPI PUSH1 0x3 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x14B4 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP4 DUP4 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x14E2 JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE PUSH1 0x1 SWAP2 SWAP1 SWAP2 ADD SWAP1 JUMPDEST JUMPDEST PUSH1 0x1 ADD PUSH2 0x1442 JUMP JUMPDEST DUP2 PUSH1 0x40 MLOAD DUP1 MSIZE LT PUSH2 0x1518 JUMPI POP MSIZE JUMPDEST SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE JUMPDEST POP SWAP4 POP PUSH1 0x0 SWAP1 POP JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x157F JUMPI DUP3 DUP2 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x1547 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL ADD MLOAD DUP5 DUP3 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x155F JUMPI INVALID JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x20 SWAP3 DUP4 MUL SWAP1 SWAP2 ADD SWAP1 SWAP2 ADD MSTORE JUMPDEST PUSH1 0x1 ADD PUSH2 0x1531 JUMP JUMPDEST JUMPDEST POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x15AF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x3 SLOAD DUP2 PUSH1 0x32 DUP3 GT DUP1 PUSH2 0x15C1 JUMPI POP DUP2 DUP2 GT JUMPDEST DUP1 PUSH2 0x15CA JUMPI POP DUP1 ISZERO JUMPDEST DUP1 PUSH2 0x15D3 JUMPI POP DUP2 ISZERO JUMPDEST ISZERO PUSH2 0x15DE JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 DUP4 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE SWAP1 MLOAD PUSH32 0xA3F1EE9126A074D9326C682F561767F710E927FAA811F7A99829D49DC421797A SWAP2 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG1 JUMPDEST JUMPDEST POP POP JUMPDEST POP JUMP JUMPDEST CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1647 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND ISZERO ISZERO PUSH2 0x166D JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND DUP6 MSTORE SWAP3 MSTORE SWAP1 SWAP2 SHA3 SLOAD DUP5 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x16A2 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP5 PUSH2 0x16AC DUP2 PUSH2 0x10A8 JUMP JUMPDEST ISZERO PUSH2 0x16B7 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP7 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP5 SHA3 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND DUP1 DUP7 MSTORE SWAP3 MSTORE DUP1 DUP5 SHA3 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SWAP4 OR SWAP1 SWAP3 SSTORE SWAP1 MLOAD DUP9 SWAP3 PUSH32 0x4A504A94899432A9846E1AA406DCEB1BCFD538BB839071D49D1E5E23F5BE30EF SWAP2 LOG3 PUSH2 0x1716 DUP7 PUSH2 0x10A8 JUMP JUMPDEST ISZERO PUSH2 0xAF5 JUMPI PUSH2 0xAF5 DUP7 TIMESTAMP PUSH2 0x1C4A JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP POP JUMPDEST POP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP5 MSTORE PUSH1 0x8 SWAP1 SWAP3 MSTORE DUP3 SHA3 SLOAD DUP4 SWAP2 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1769 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x72656D6F7665417574686F72697A6564416464726573734174496E6465782861 DUP2 MSTORE PUSH1 0x88 PUSH1 0x2 EXP PUSH15 0x6464726573732C75696E7432353629 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP3 MLOAD PUSH1 0x2F SWAP3 DUP2 SWAP1 SUB SWAP3 SWAP1 SWAP3 ADD DUP3 SHA3 PUSH1 0x2 DUP6 DUP2 ADD DUP1 SLOAD PUSH1 0x1 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD AND SWAP2 SWAP1 SWAP2 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP2 AND SWAP4 PUSH2 0x1858 SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xC88 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5D JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC88 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6B JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP PUSH1 0x0 PUSH2 0x1C1D JUMP JUMPDEST PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND EQ PUSH2 0x186D JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 SWAP3 POP JUMPDEST JUMPDEST POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1887 DUP5 DUP5 DUP5 PUSH2 0x1C96 JUMP JUMPDEST SWAP1 POP PUSH2 0x1892 DUP2 PUSH2 0x161E JUMP JUMPDEST JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18A6 DUP4 DUP4 PUSH2 0x1C1D JUMP JUMPDEST SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x32 DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO ISZERO PUSH2 0x18EF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1919 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1942 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 SWAP3 POP JUMPDEST PUSH1 0x3 SLOAD DUP4 LT ISZERO PUSH2 0x19EA JUMPI DUP5 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x196A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND EQ ISZERO PUSH2 0x19DE JUMPI DUP4 PUSH1 0x3 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x19A9 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 ADD PUSH1 0x0 JUMPDEST PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB MUL NOT AND SWAP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND MUL OR SWAP1 SSTORE POP PUSH2 0x19EA JUMP JUMPDEST JUMPDEST PUSH1 0x1 SWAP1 SWAP3 ADD SWAP2 PUSH2 0x1947 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP7 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD PUSH1 0xFF NOT SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE SWAP4 DUP9 AND DUP3 MSTORE DUP1 DUP3 SHA3 DUP1 SLOAD SWAP1 SWAP5 AND PUSH1 0x1 OR SWAP1 SWAP4 SSTORE SWAP2 MLOAD SWAP1 SWAP2 PUSH32 0x8001553A916EF2F495D26A907CC54D96ED840D7BDA71E73194BF5A9DF7A76B90 SWAP2 LOG2 PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP6 AND SWAP1 PUSH32 0xF39E6E1EB0EDCF53C221607B54B00CD28F3196FED0A24994DC308B8F611B682D SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 PUSH1 0x3 ADD SLOAD DUP3 SWAP1 PUSH1 0xFF AND ISZERO PUSH2 0x1AAA JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST DUP3 PUSH2 0x1AB4 DUP2 PUSH2 0x10A8 JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1AC0 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP6 SWAP2 ADD TIMESTAMP LT ISZERO PUSH2 0x1AE2 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 SHA3 PUSH1 0x3 DUP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP2 SLOAD DUP2 DUP4 ADD SLOAD SWAP4 MLOAD PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD SWAP6 SWAP11 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP4 AND SWAP6 SWAP5 SWAP3 SWAP4 SWAP2 SWAP3 DUP4 SWAP3 DUP6 SWAP3 PUSH1 0x0 NOT SWAP2 DUP4 AND ISZERO PUSH2 0x100 MUL SWAP2 SWAP1 SWAP2 ADD SWAP1 SWAP2 AND DIV DUP1 ISZERO PUSH2 0x1B8B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1B60 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1B8B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1B6E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP8 PUSH2 0x8502 GAS SUB CALL SWAP3 POP POP POP ISZERO PUSH2 0x1BDA JUMPI PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x33E13ECB54C3076D8E8BB8C2881800A4D972B792045FFAE98FDF46DF365FED75 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH2 0xAF8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP6 SWAP1 PUSH32 0x526441BB6C1ABA3C9A4A6CA1D6545DA9C2333C8C48343EF398EB858D72B79236 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x3 DUP5 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE JUMPDEST JUMPDEST JUMPDEST POP JUMPDEST POP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1C33 JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x1 PUSH1 0xE0 PUSH1 0x2 EXP SUB NOT AND JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x7 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 SHA3 DUP4 SWAP1 SSTORE DUP2 MLOAD DUP4 DUP2 MSTORE SWAP2 MLOAD DUP5 SWAP3 PUSH32 0xB237AFE65F1514FD7EA3F923EA4FE792BDD07000A912B6CD1602A8E7F573C8D SWAP3 SWAP1 DUP3 SWAP1 SUB ADD SWAP1 LOG2 JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x1CAF JUMPI PUSH1 0x0 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x80 DUP2 ADD DUP3 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP9 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP10 DUP2 MSTORE DUP4 DUP6 ADD DUP10 DUP2 MSTORE PUSH1 0x0 PUSH1 0x60 DUP7 ADD DUP2 SWAP1 MSTORE DUP8 DUP2 MSTORE DUP1 DUP5 MSTORE SWAP6 SWAP1 SWAP6 SHA3 DUP5 MLOAD DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE MLOAD PUSH1 0x1 DUP4 ADD SSTORE SWAP3 MLOAD DUP1 MLOAD SWAP5 SWAP7 POP SWAP2 SWAP4 SWAP1 SWAP3 PUSH2 0x1D2F SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 SWAP2 ADD SWAP1 PUSH2 0x1E01 JUMP JUMPDEST POP PUSH1 0x60 SWAP2 SWAP1 SWAP2 ADD MLOAD PUSH1 0x3 SWAP1 SWAP2 ADD DUP1 SLOAD PUSH1 0xFF NOT AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x5 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH1 0x40 MLOAD DUP3 SWAP1 PUSH32 0xC0BA8FE4B176C1714197D43B9CC6BCF797A4A7461C5FE8D0EF6E184AE7601E51 SWAP1 PUSH1 0x0 SWAP1 LOG2 JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0xA06 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0xA06 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1E80 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 ISZERO GT PUSH2 0xA06 JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 SHA3 PUSH2 0xA06 SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x1E80 JUMP JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 ADD SWAP1 SWAP2 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 SHA3 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x1E42 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x1E6F JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x1E6F JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x1E6F JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1E54 JUMP JUMPDEST JUMPDEST POP PUSH2 0x1E7C SWAP3 SWAP2 POP PUSH2 0x1E80 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x12C8 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x1E7C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x1E86 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 0xdf 0xeb 0xd4 0xbc SGT SWAP4 0xad 0x5d PUSH21 0x1D2D12F334C78B86E9E4D031A3671A7869EA640FAF 0xc5 DUP16 STOP 0x29 ",
+ "sourceMap": "703:1479:3:-;;;762:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;980:7;989:20;1011:9;1022:18;2097:514:2;2381:9;2448:18;2322:7;2331:9;2342:18;1884:213:1;2018:7;2027:9;2834:370:0;2979:6;2933:7;:14;2949:9;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;2986:1;2979:8;;2974:168;2991:7;:14;2989:1;:16;2974:168;;;3030:7;:19;3038:7;3046:1;3038:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3030:19:0;;;;;;;;;;;-1:-1:-1;3030:19:0;;;;;:38;;;3053:7;3061:1;3053:10;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3053:15:0;3067:1;3053:15;3030:38;3026:65;;;3086:5;;;3026:65;3127:4;3105:7;:19;3113:7;3121:1;3113:10;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3105:19:0;;;;;;;;;;;-1:-1:-1;3105:19:0;:26;;-1:-1:-1;;3105:26:0;;;;;;;;;;2974:168;3007:3;;;;;2974:168;;;3151:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;3177:8:0;:20;;;2412:1;2834:370;-1:-1:-1;;;2052:17:1;:38;;;-1:-1:-1;;1884:213:1;;;;2393:1:2;2381:13;;2376:229;2400:20;:27;2396:1;:31;2376:229;;;2469:20;2490:1;2469:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2514:24:2;;;;2506:33;;;;;;-1:-1:-1;;;;;2553:34:2;;;;;;:22;:34;;;;;:41;;-1:-1:-1;;2553:41:2;2590:4;2553:41;;;2376:229;2429:3;;;;;2376:229;;;2097:514;;;;;;;762:286:3;;;;;703:1479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;703:1479:3;-1:-1:-1;;;;;703:1479:3;;;;;;;;;;;-1:-1:-1;703:1479:3;;;;;;;;-1:-1:-1;703:1479:3;;;-1:-1:-1;703:1479:3;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;;703:1479:3;;;;;;;;;;;;;:::o;:::-;;;;;;;",
+ "linkReferences": {}
+ },
+ "deployedBytecode": {
+ "object": "0x606060405236156101645763ffffffff60e060020a600035041663025e7c2781146101b6578063173825d9146101e557806320ea8d86146102035780632f54bf6e146102185780633411c81c146102485780633589b35c1461027b57806337bd78a01461029057806354741525146102b25780635a1a66af146102de5780637065cb481461030157806372cbe61d1461031f578063784547a7146103895780637ad28c51146103b057806383250f79146103c55780638b51d13f146103f55780639ace38c21461041a578063a0e67e2b146104d7578063a8abe69a14610542578063b5dc40c3146105bd578063b77bf6001461062b578063ba51a6df1461064d578063c01a8c8414610662578063c296e43c14610677578063c64274741461069e578063cc12cb2814610713578063d38f2d8214610788578063d74f8edd146107ad578063dc8452cd146107cf578063e20056e6146107f1578063ee22610b14610815575b6101b45b60003411156101b157604080513481529051600160a060020a033316917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a25b5b565b005b34156101be57fe5b6101c960043561082a565b60408051600160a060020a039092168252519081900360200190f35b34156101ed57fe5b6101b4600160a060020a036004351661085c565b005b341561020b57fe5b6101b4600435610a0d565b005b341561022057fe5b610234600160a060020a0360043516610b01565b604080519115158252519081900360200190f35b341561025057fe5b610234600435600160a060020a0360243516610b16565b604080519115158252519081900360200190f35b341561028357fe5b6101b4600435610b36565b005b341561029857fe5b6102a0610de5565b60408051918252519081900360200190f35b34156102ba57fe5b6102a060043515156024351515610deb565b60408051918252519081900360200190f35b34156102e657fe5b6101b4600160a060020a03600435166024351515610e5a565b005b341561030957fe5b6101b4600160a060020a0360043516610efa565b005b341561032757fe5b610234600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061103195505050505050565b604080519115158252519081900360200190f35b341561039157fe5b6102346004356110a8565b604080519115158252519081900360200190f35b34156103b857fe5b6101b460043561113c565b005b34156103cd57fe5b610234600160a060020a036004351661119a565b604080519115158252519081900360200190f35b34156103fd57fe5b6102a06004356111af565b60408051918252519081900360200190f35b341561042257fe5b61042d60043561122e565b60408051600160a060020a03861681526020810185905282151560608201526080918101828152845460026000196101006001841615020190911604928201839052909160a0830190859080156104c55780601f1061049a576101008083540402835291602001916104c5565b820191906000526020600020905b8154815290600101906020018083116104a857829003601f168201915b50509550505050505060405180910390f35b34156104df57fe5b6104e7611262565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b341561054a57fe5b6104e7600435602435604435151560643515156112cb565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b34156105c557fe5b6104e7600435611400565b604080516020808252835181830152835191928392908301918581019102808383821561052f575b80518252602083111561052f57601f19909201916020918201910161050f565b5050509050019250505060405180910390f35b341561063357fe5b6102a0611588565b60408051918252519081900360200190f35b341561065557fe5b6101b460043561158e565b005b341561066a57fe5b6101b460043561161e565b005b341561067f57fe5b610234600435611733565b604080519115158252519081900360200190f35b34156106a657fe5b604080516020600460443581810135601f81018490048402850184019095528484526102a0948235600160a060020a031694602480359560649492939190920191819084018382808284375094965061187a95505050505050565b60408051918252519081900360200190f35b341561071b57fe5b61076b600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843750949650509335935061189a92505050565b60408051600160e060020a03199092168252519081900360200190f35b341561079057fe5b6102a06004356118af565b60408051918252519081900360200190f35b34156107b557fe5b6102a06118c1565b60408051918252519081900360200190f35b34156107d757fe5b6102a06118c6565b60408051918252519081900360200190f35b34156107f957fe5b6101b4600160a060020a03600435811690602435166118cc565b005b341561081d57fe5b6101b4600435611a88565b005b600380548290811061083857fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b600030600160a060020a031633600160a060020a031614151561087f5760006000fd5b600160a060020a038216600090815260026020526040902054829060ff1615156108a95760006000fd5b600160a060020a0383166000908152600260205260408120805460ff1916905591505b600354600019018210156109a45782600160a060020a03166003838154811015156108f357fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156109985760038054600019810190811061093457fe5b906000526020600020900160005b9054906101000a9004600160a060020a031660038381548110151561096357fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506109a4565b5b6001909101906108cc565b6003805460001901906109b79082611d89565b5060035460045411156109d0576003546109d09061158e565b5b604051600160a060020a038416907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25b5b505b5050565b33600160a060020a03811660009081526002602052604090205460ff161515610a365760006000fd5b600082815260016020908152604080832033600160a060020a038116855292529091205483919060ff161515610a6c5760006000fd5b600084815260208190526040902060030154849060ff1615610a8e5760006000fd5b84610a98816110a8565b15610aa35760006000fd5b6000868152600160209081526040808320600160a060020a0333168085529252808320805460ff191690555188927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35b5b505b505b50505b5050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600081815260208190526040812060030154829060ff1615610b585760006000fd5b82610b62816110a8565b1515610b6e5760006000fd5b6000848152602081815260408083208054600160a060020a0316845260089092529091205485919060ff161515610ba55760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a031990911693610c949392830182828015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b50505050506000611c1d565b600160e060020a03191614610ca95760006000fd5b6000868152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959b50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015610d525780601f10610d2757610100808354040283529160200191610d52565b820191906000526020600020905b815481529060010190602001808311610d3557829003601f168201915b505091505060006040518083038185876185025a03f19250505015610da15760405186907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610af5565b60405186907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038501805460ff191690555b5b5b50505b505b505050565b60065481565b6000805b600554811015610e5257838015610e18575060008181526020819052604090206003015460ff16155b80610e3c5750828015610e3c575060008181526020819052604090206003015460ff165b5b15610e49576001820191505b5b600101610def565b5b5092915050565b30600160a060020a031633600160a060020a0316141515610e7b5760006000fd5b81600160a060020a0381161515610e925760006000fd5b600160a060020a038316600081815260086020908152604091829020805460ff191686151590811790915582519384529083015280517fdaef8ff7dc66c5e34eb9c338aab679d9f427f89868d9228494455a4d982eb2b09281900390910190a15b5b505b5050565b30600160a060020a031633600160a060020a0316141515610f1b5760006000fd5b600160a060020a038116600090815260026020526040902054819060ff1615610f445760006000fd5b81600160a060020a0381161515610f5b5760006000fd5b6003805490506001016004546032821180610f7557508181115b80610f7e575080155b80610f87575081155b15610f925760006000fd5b600160a060020a0385166000908152600260205260409020805460ff191660019081179091556003805490918101610fca8382611d89565b916000526020600020900160005b8154600160a060020a03808a166101009390930a838102910219909116179091556040519091507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b50505b505b505b50565b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020820152905190819003602f019020600090600160e060020a0319166110958383611c1d565b600160e060020a0319161490505b919050565b600080805b60035481101561113457600084815260016020526040812060038054919291849081106110d657fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff1615611118576001820191505b60045482141561112b5760019250611134565b5b6001016110ad565b5b5050919050565b30600160a060020a031633600160a060020a031614151561115d5760006000fd5b60068190556040805182815290517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b43779181900360200190a15b5b50565b60086020526000908152604090205460ff1681565b6000805b60035481101561122757600083815260016020526040812060038054919291849081106111dc57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff161561121e576001820191505b5b6001016111b3565b5b50919050565b6000602081905290815260409020805460018201546003830154600160a060020a0390921692909160029091019060ff1684565b61126a611ddd565b60038054806020026020016040519081016040528092919081815260200182805480156112c057602002820191906000526020600020905b8154600160a060020a031681526001909101906020018083116112a2575b505050505090505b90565b6112d3611ddd565b6112db611ddd565b600060006005546040518059106112ef5750595b908082528060200260200182016040525b50925060009150600090505b60055481101561138957858015611335575060008181526020819052604090206003015460ff16155b806113595750848015611359575060008181526020819052604090206003015460ff165b5b156113805780838381518110151561136e57fe5b60209081029091010152600191909101905b5b60010161130c565b8787036040518059106113995750595b908082528060200260200182016040525b5093508790505b868110156113f45782818151811015156113c757fe5b90602001906020020151848983038151811015156113e157fe5b602090810290910101525b6001016113b1565b5b505050949350505050565b611408611ddd565b611410611ddd565b60035460405160009182918059106114255750595b908082528060200260200182016040525b50925060009150600090505b60035481101561150a576000858152600160205260408120600380549192918490811061146b57fe5b906000526020600020900160005b9054600160a060020a036101009290920a900416815260208101919091526040016000205460ff16156115015760038054829081106114b457fe5b906000526020600020900160005b9054906101000a9004600160a060020a031683838151811015156114e257fe5b600160a060020a03909216602092830290910190910152600191909101905b5b600101611442565b816040518059106115185750595b908082528060200260200182016040525b509350600090505b8181101561157f57828181518110151561154757fe5b90602001906020020151848281518110151561155f57fe5b600160a060020a039092166020928302909101909101525b600101611531565b5b505050919050565b60055481565b30600160a060020a031633600160a060020a03161415156115af5760006000fd5b6003548160328211806115c157508181115b806115ca575080155b806115d3575081155b156115de5760006000fd5b60048390556040805184815290517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a9181900360200190a15b5b50505b50565b33600160a060020a03811660009081526002602052604090205460ff1615156116475760006000fd5b6000828152602081905260409020548290600160a060020a0316151561166d5760006000fd5b600083815260016020908152604080832033600160a060020a038116855292529091205484919060ff16156116a25760006000fd5b846116ac816110a8565b156116b75760006000fd5b6000868152600160208181526040808420600160a060020a0333168086529252808420805460ff1916909317909255905188927f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a3611716866110a8565b15610af557610af58642611c4a565b5b5b5b505b50505b505b5050565b6000818152602081815260408083208054600160a060020a03168452600890925282205483919060ff1615156117695760006000fd5b604080517f72656d6f7665417574686f72697a6564416464726573734174496e64657828618152608860020a6e6464726573732c75696e7432353629026020808301919091528251602f9281900392909201822060028581018054600181161561010002600019011691909104601f8101849004840285018401909552848452600160e060020a0319909116936118589392830182828015610c885780601f10610c5d57610100808354040283529160200191610c88565b820191906000526020600020905b815481529060010190602001808311610c6b57829003601f168201915b50505050506000611c1d565b600160e060020a0319161461186d5760006000fd5b600192505b5b5050919050565b6000611887848484611c96565b90506118928161161e565b5b9392505050565b60006118a68383611c1d565b90505b92915050565b60076020526000908152604090205481565b603281565b60045481565b600030600160a060020a031633600160a060020a03161415156118ef5760006000fd5b600160a060020a038316600090815260026020526040902054839060ff1615156119195760006000fd5b600160a060020a038316600090815260026020526040902054839060ff16156119425760006000fd5b600092505b6003548310156119ea5784600160a060020a031660038481548110151561196a57fe5b906000526020600020900160005b9054906101000a9004600160a060020a0316600160a060020a031614156119de57836003848154811015156119a957fe5b906000526020600020900160005b6101000a815481600160a060020a030219169083600160a060020a031602179055506119ea565b5b600190920191611947565b600160a060020a03808616600081815260026020526040808220805460ff1990811690915593881682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a2604051600160a060020a038516907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a25b5b505b505b505050565b600081815260208190526040812060030154829060ff1615611aaa5760006000fd5b82611ab4816110a8565b1515611ac05760006000fd5b600654600085815260076020526040902054859101421015611ae25760006000fd5b6000858152602081905260409081902060038101805460ff19166001908117909155815481830154935160028085018054959a50600160a060020a0390931695949293919283928592600019918316156101000291909101909116048015611b8b5780601f10611b6057610100808354040283529160200191611b8b565b820191906000526020600020905b815481529060010190602001808311611b6e57829003601f168201915b505091505060006040518083038185876185025a03f19250505015611bda5760405185907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2610af8565b60405185907f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923690600090a260038401805460ff191690555b5b5b505b505b505050565b600081600401835110151515611c335760006000fd5b506020820151600160e060020a0319165b92915050565b6000828152600760209081526040918290208390558151838152915184927f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d92908290030190a25b5050565b600083600160a060020a0381161515611caf5760006000fd5b60055460408051608081018252600160a060020a0388811682526020808301898152838501898152600060608601819052878152808452959095208451815473ffffffffffffffffffffffffffffffffffffffff191694169390931783555160018301559251805194965091939092611d2f926002850192910190611e01565b50606091909101516003909101805460ff191691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a25b5b509392505050565b815481835581811511610a0657600083815260209020610a06918101908301611e80565b5b505050565b815481835581811511610a0657600083815260209020610a06918101908301611e80565b5b505050565b60408051602081019091526000815290565b60408051602081019091526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611e4257805160ff1916838001178555611e6f565b82800160010185558215611e6f579182015b82811115611e6f578251825591602001919060010190611e54565b5b50611e7c929150611e80565b5090565b6112c891905b80821115611e7c5760008155600101611e86565b5090565b905600a165627a7a72305820dfebd4bc1393ad5d741d2d12f334c78b86e9e4d031a3671a7869ea640fafc58f0029",
+ "sourceMap": "703:1479:3:-;;;;;;;;-1:-1:-1;;;703:1479:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2482:109:0;2539:1;2527:9;:13;2523:61;;;2554:30;;;2574:9;2554:30;;;;-1:-1:-1;;;;;2562:10:0;2554:30;;;;;;;;;;;;2523:61;2482:109;:::o;703:1479:3:-;;956:23:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;;;;;;;;;;;;;3731:460;;;;;;;;-1:-1:-1;;;;;3731:460:0;;;;;;;3176:332:1;;;;;;;;;;;;;;910:40:0;;;;;;;;-1:-1:-1;;;;;910:40:0;;;;;;;;;;;;;;;;;;;;;;;840:64;;;;;;;;;;-1:-1:-1;;;;;840:64:0;;;;;;;;;;;;;;;;;;;;;;;3320:573:2;;;;;;;;;;;;;;1029:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;9156:319:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2895:289:2;;;;;;;;-1:-1:-1;;;;;2895:289:2;;;;;;;;;;;3331:277:0;;;;;;;;-1:-1:-1;;;;;3331:277:0;;;;;;;1538:201:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1538:201:3;;-1:-1:-1;1538:201:3;;-1:-1:-1;;;;;;1538:201:3;;;;;;;;;;;;;;;;;;;7324:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2301:186:1;;;;;;;;;;;;;;981:55:2;;;;;;;;-1:-1:-1;;;;;981:55:2;;;;;;;;;;;;;;;;;;;;;;;8642:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;785:49;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9559:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;10777:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;9853:575:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;-1:-1;;152:3;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;1011:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;5010:207;;;;;;;;;;;;;;2593:459:1;;;;;;;;;;;;;;1058:245:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5476:244:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5476:244:0;;-1:-1:-1;5476:244:0;;-1:-1:-1;;;;;;5476:244:0;;;;;;;;;;;;;;;;;1981:199:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1981:199:3;;-1:-1:-1;;1981:199:3;;;-1:-1:-1;1981:199:3;;-1:-1:-1;;;1981:199:3;;;;;-1:-1:-1;;;;;;1981:199:3;;;;;;;;;;;;;;1065:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;237:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;985:20;;;;;;;;;;;;;;;;;;;;;;;;;;4390:449;;;;;;;;-1:-1:-1;;;;;4390:449:0;;;;;;;;;;;;3622:472:1;;;;;;;;;;;;;;956:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;956:23:0;;:::o;3731:460::-;3879:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;3821:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;3842:14:0;;3859:5;3842:14;;;:7;:14;;;;;:22;;-1:-1:-1;;3842:22:0;;;3859:5;-1:-1:-1;3874:170:0;3891:6;:13;-1:-1:-1;;3891:17:0;3889:19;;3874:170;;;3944:5;-1:-1:-1;;;;;3931:18:0;:6;3938:1;3931:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3931:9:0;-1:-1:-1;;;;;3931:18:0;;3927:117;;;3981:6;3988:13;;-1:-1:-1;;3988:17:0;;;3981:25;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3981:25:0;3969:6;3976:1;3969:9;;;;;;;;;;;;;;;;;;;;:37;;;;;-1:-1:-1;;;;;3969:37:0;;;;;-1:-1:-1;;;;;3969:37:0;;;;;;4024:5;;3927:117;3874:170;3910:3;;;;;3874:170;;;4053:6;:18;;-1:-1:-1;;4053:18:0;;;;;;:::i;:::-;-1:-1:-1;4096:6:0;:13;4085:8;;:24;4081:74;;;4141:6;:13;4123:32;;:17;:32::i;:::-;4081:74;4165:19;;-1:-1:-1;;;;;4165:19:0;;;;;;;;1483:1;1262;;3731:460;;;:::o;3176:332:1:-;3259:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1714:28;;;;:13;:28;;;;;;;;3304:10:1;-1:-1:-1;;;;;1714:35:0;;;;;;;;;;:28;;3304:10:1;1714:35:0;;1713:36;1709:59;;;1763:5;;;1709:59;1996:12;:27;;;;;;;;;;:36;;;3336:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3377:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;3449:5;3406:28;;;:13;:28;;;;;;;;-1:-1:-1;;;;;3435:10:1;3406:40;;;;;;;;;:48;;-1:-1:-1;;3406:48:1;;;3464:37;3420:13;;3464:37;;;1222:1;2061::0;;1778;;1483;;;3176:332:1;;;:::o;910:40:0:-;;;;;;;;;;;;;;;:::o;840:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3320:573:2:-;3553:22;1996:27:0;;;;;;;;;;:36;;;3425:13:2;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3463:13:2;1298:26:1;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1418:22:2;1443:27;;;;;;;;;;;1511:14;;-1:-1:-1;;;;;1511:14:2;1488:38;;:22;:38;;;;;;;3524:13;;1443:27;1488:38;;1480:47;;;;;;;;1121:60;;;;;;-1:-1:-1;;;;;1121:60:2;;;;;;;;;;;;;;;;;;;;;1556:7;;;;1545:22;;;;;;;;-1:-1:-1;;1545:22:2;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1545:69:2;;;;:22;;1121:60;1545:22;;1556:7;1545:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1565:1;1545:10;:22::i;:::-;-1:-1:-1;;;;;;1545:69:2;;1537:78;;;;;;3578:12;:27;;;;;;;;;;;;3615:11;;;:18;;-1:-1:-1;;3615:18:2;3629:4;3615:18;;;;;;3701:14;;3727:8;;;;3701:44;;3737:7;;;;3701:44;;3578:27;;-1:-1:-1;;;;;;3701:14:2;;;;3727:8;3737:7;;3701:44;;;;3737:7;;-1:-1:-1;;3701:44:2;;;;3615:18;3701:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3697:190;;;3759:24;;3769:13;;3759:24;;;;;3697:190;;;3812:31;;3829:13;;3812:31;;;;;3857:11;;;:19;;-1:-1:-1;;3857:19:2;;;3697:190;1625:1;1335::1;;;2061::0;;3320:573:2;;;;:::o;1029:29:1:-;;;;:::o;9156:319:0:-;9263:10;;9289:179;9306:16;;9304:1;:18;9289:179;;;9348:7;:36;;;;-1:-1:-1;9360:12:0;:15;;;;;;;;;;:24;;;;;9359:25;9348:36;:92;;;;9404:8;:36;;;;-1:-1:-1;9416:12:0;:15;;;;;;;;;;:24;;;;;9404:36;9348:92;9341:127;;;9467:1;9458:10;;;;9341:127;9289:179;9324:3;;9289:179;;;9156:319;;;;;;:::o;2895:289:2:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;3020:18:2;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;-1:-1:-1;;;;;3054:42:2;;;;;;:22;:42;;;;;;;;;:57;;-1:-1:-1;;3054:57:2;;;;;;;;;;3121:56;;;;;;;;;;;;;;;;;;;;;2166:1:0;1262;;2895:289:2;;;:::o;3331:277:0:-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;3424:5;;1332:14;;1328:37;;;1360:5;;;1328:37;3447:5;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;3479:6;:13;;;;3495:1;3479:17;3498:8;;276:2;2256:10;:28;:66;;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;-1:-1:-1;;;;;3522:14:0;;;;;;:7;:14;;;;;:21;;-1:-1:-1;;3522:21:0;3539:4;3522:21;;;;;;3553:6;:18;;:6;;:18;;;:6;:18;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;3553:18:0;;;;;;;;;;;;;;;;;;;;;3581:20;;3553:18;;-1:-1:-1;3581:20:0;;-1:-1:-1;;3581:20:0;2412:1;2166;;;1375;;1262;;3331:277;;:::o;1538:201:3:-;1121:60:2;;;;;;-1:-1:-1;;;;;1121:60:2;;;;;;;;;;;;;;1639:4:3;;-1:-1:-1;;;;;;1666:66:3;:19;1677:4;1639;1666:10;:19::i;:::-;-1:-1:-1;;;;;;1666:66:3;;;-1:-1:-1;1538:201:3;;;;:::o;7324:337:0:-;7414:4;;;7458:197;7475:6;:13;7473:15;;7458:197;;;7513:28;;;;:13;:28;;;;;7542:6;:9;;7513:28;;;7549:1;;7542:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7542:9:0;;;;;;;;7513:39;;;;;;;;;;;-1:-1:-1;7513:39:0;;;;7509:71;;;7579:1;7570:10;;;;7509:71;7607:8;;7598:5;:17;7594:50;;;7640:4;7633:11;;;;7594:50;7458:197;7490:3;;7458:197;;;7324:337;;;;;;:::o;2301:186:1:-;1228:4:0;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;2398:17:1;:38;;;2446:34;;;;;;;;;;;;;;;;;1262:1:0;2301:186:1;;:::o;981:55:2:-;;;;;;;;;;;;;;;:::o;8642:252:0:-;8741:10;;8767:120;8784:6;:13;8782:15;;8767:120;;;8820:28;;;;:13;:28;;;;;8849:6;:9;;8820:28;;;8856:1;;8849:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8849:9:0;;;;;;;;8820:39;;;;;;;;;;;-1:-1:-1;8820:39:0;;;;8816:71;;;8886:1;8877:10;;;;8816:71;8767:120;8799:3;;8767:120;;;8642:252;;;;;:::o;785:49::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;785:49:0;;;;;;;;;;;;;;:::o;9559:115::-;9629:9;;:::i;:::-;9661:6;9654:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9654:13:0;;;;;;;;;;;;;;;;;;;;;;;9559:115;;:::o;10777:676::-;10902:22;;:::i;:::-;10940:32;;:::i;:::-;11013:10;11037:6;10986:16;;10975:28;;;;;;;;;;;;;;;;;;;;;;;;;10940:63;;11026:1;11013:14;;11060:1;11058:3;;11053:250;11065:16;;11063:1;:18;11053:250;;;11107:7;:36;;;;-1:-1:-1;11119:12:0;:15;;;;;;;;;;:24;;;;;11118:25;11107:36;:92;;;;11163:8;:36;;;;-1:-1:-1;11175:12:0;:15;;;;;;;;;;:24;;;;;11163:36;11107:92;11100:203;;;11259:1;11231:18;11250:5;11231:25;;;;;;;;;;;;;;;;;;:29;11287:1;11278:10;;;;;11100:203;11053:250;11083:3;;11053:250;;;11346:4;11341:2;:9;11330:21;;;;;;;;;;;;;;;;;;;;;;;;;11312:39;;11368:4;11366:6;;11361:85;11376:2;11374:1;:4;11361:85;;;11425:18;11444:1;11425:21;;;;;;;;;;;;;;;;;;11397:15;11417:4;11413:1;:8;11397:25;;;;;;;;;;;;;;;;;;:49;11361:85;11380:3;;11361:85;;;10777:676;;;;;;;;;;:::o;9853:575::-;9948:24;;:::i;:::-;9988:34;;:::i;:::-;10039:6;:13;10025:28;;10063:10;;;;10025:28;;;;;;;;;;;;;;;;;;;;;;;9988:65;;10076:1;10063:14;;10110:1;10108:3;;10103:186;10115:6;:13;10113:15;;10103:186;;;10151:28;;;;:13;:28;;;;;10180:6;:9;;10151:28;;;10187:1;;10180:9;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10180:9:0;;;;;;;;10151:39;;;;;;;;;;;-1:-1:-1;10151:39:0;;;;10147:142;;;10237:6;:9;;10244:1;;10237:9;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10237:9:0;10210:17;10228:5;10210:24;;;;;;;;;;-1:-1:-1;;;;;10210:36:0;;;:24;;;;;;;;;;:36;10273:1;10264:10;;;;;10147:142;10103:186;10130:3;;10103:186;;;10329:5;10315:20;;;;;;;;;;;;;;;;;;;;;;;;;10298:37;;10352:1;10350:3;;10345:76;10357:5;10355:1;:7;10345:76;;;10401:17;10419:1;10401:20;;;;;;;;;;;;;;;;;;10381:14;10396:1;10381:17;;;;;;;;;;-1:-1:-1;;;;;10381:40:0;;;:17;;;;;;;;;;:40;10345:76;10364:3;;10345:76;;;9853:575;;;;;;;:::o;1011:28::-;;;;:::o;5010:207::-;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;5112:6;:13;5127:9;276:2;2256:28;;;:66;;;2312:10;2300:9;:22;2256:66;:96;;;-1:-1:-1;2338:14:0;;2256:96;:127;;;-1:-1:-1;2368:15:0;;2256:127;2249:153;;;2397:5;;;2249:153;5152:8;:20;;;5182:28;;;;;;;;;;;;;;;;;2412:1;1262;;;5010:207;;:::o;2593:459:1:-;2676:10;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;;;1439:15;1435:38;;;1468:5;;;1435:38;1558:12;:27;;;;;;;;;;:39;2714:13:1;;-1:-1:-1;;;;;1558:39:0;:44;1554:67;;;1616:5;;;1554:67;1863:28;;;;:13;:28;;;;;;;;2765:10:1;-1:-1:-1;;;;;1863:35:0;;;;;;;;;;:28;;2765:10:1;1863:35:0;;1859:58;;;1912:5;;;1859:58;2803:13:1;1185:26;1197:13;1185:11;:26::i;:::-;1184:27;1176:36;;;;;;2832:28;;;;2875:4;2832:28;;;;;;;;-1:-1:-1;;;;;2861:10:1;2832:40;;;;;;;;;:47;;-1:-1:-1;;2832:47:1;;;;;;;2889:39;;2846:13;;2889:39;;;2942:26;2954:13;2942:11;:26::i;:::-;2938:108;;;2984:51;3004:13;3019:15;2984:19;:51::i;:::-;2938:108;1222:1;1927::0;;1631;;;1483;;2593:459:1;;;:::o;1058:245:3:-;1203:4;1443:27:2;;;;;;;;;;;1511:14;;-1:-1:-1;;;;;1511:14:2;1488:38;;:22;:38;;;;;;1182:2:3;;1443:27:2;1488:38;;1480:47;;;;;;;;1121:60;;;;;;-1:-1:-1;;;;;1121:60:2;;;;;;;;;;;;;;;;;;;;;1556:7;;;;1545:22;;;;;;;;-1:-1:-1;;1545:22:2;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1545:69:2;;;;:22;;1121:60;1545:22;;1556:7;1545:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1565:1;1545:10;:22::i;:::-;-1:-1:-1;;;;;;1545:69:2;;1537:78;;;;;;1292:4:3;1285:11;;1625:1:2;1058:245:3;;;;;;:::o;5476:244:0:-;5580:18;5630:40;5645:11;5658:5;5665:4;5630:14;:40::i;:::-;5614:56;;5680:33;5699:13;5680:18;:33::i;:::-;5476:244;;;;;;:::o;1981:199:3:-;2092:13;2130:20;2141:1;2144:5;2130:10;:20::i;:::-;2121:29;-1:-1:-1;1981:199:3;;;;;:::o;1065:47:1:-;;;;;;;;;;;;;:::o;237:41:0:-;276:2;237:41;:::o;985:20::-;;;;:::o;4390:449::-;4561:6;1228:4;-1:-1:-1;;;;;1206:27:0;:10;-1:-1:-1;;;;;1206:27:0;;;1202:50;;;1247:5;;;1202:50;-1:-1:-1;;;;;1440:14:0;;;;;;:7;:14;;;;;;4499:5;;1440:14;;1439:15;1435:38;;;1468:5;;;1435:38;-1:-1:-1;;;;;1332:14:0;;;;;;:7;:14;;;;;;4532:8;;1332:14;;1328:37;;;1360:5;;;1328:37;4568:1;4561:8;;4556:149;4573:6;:13;4571:15;;4556:149;;;4622:5;-1:-1:-1;;;;;4609:18:0;:6;4616:1;4609:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4609:9:0;-1:-1:-1;;;;;4609:18:0;;4605:100;;;4659:8;4647:6;4654:1;4647:9;;;;;;;;;;;;;;;;;;;;:20;;;;;-1:-1:-1;;;;;4647:20:0;;;;;-1:-1:-1;;;;;4647:20:0;;;;;;4685:5;;4605:100;4556:149;4588:3;;;;;4556:149;;;-1:-1:-1;;;;;4714:14:0;;;4731:5;4714:14;;;:7;:14;;;;;;:22;;-1:-1:-1;;4714:22:0;;;;;;4746:17;;;;;;;;:24;;;;;4714:22;4746:24;;;;4780:19;;4714:14;;4780:19;;;4809:23;;-1:-1:-1;;;;;4809:23:0;;;;;;;;1375:1;1483;;1262;;4390:449;;;;:::o;3622:472:1:-;3808:22;1996:27:0;;;;;;;;;;:36;;;3705:13:1;;1996:36:0;;1992:59;;;2046:5;;;1992:59;3743:13:1;1298:26;1310:13;1298:11;:26::i;:::-;1290:35;;;;;;;;1463:17;;1428:32;;;;:17;:32;;;;;;3779:13;;1428:52;1409:15;:71;;1401:80;;;;;;3833:12;:27;;;;;;;;;;;;3870:11;;;:18;;-1:-1:-1;;3870:18:1;3884:4;3870:18;;;;;;3902:14;;3928:8;;;;3902:44;;3938:7;;;;3902:44;;3833:27;;-1:-1:-1;;;;;;3902:14:1;;;;3928:8;3938:7;;3902:44;;;;3938:7;;-1:-1:-1;;3902:44:1;;;;3870:18;3902:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3898:190;;;3960:24;;3970:13;;3960:24;;;;;3898:190;;;4013:31;;4030:13;;4013:31;;;;;4058:11;;;:19;;-1:-1:-1;;4058:19:1;;;3898:190;1491:1;1335;;2061::0;;3622:472:1;;;;:::o;4135:471:2:-;4242:13;4291:5;4299:1;4291:9;4279:1;:8;:21;;4271:30;;;;;;;;-1:-1:-1;4357:2:2;4350:3;;4344:5;-1:-1:-1;;;;;;4488:3:2;4135:471;;;;;:::o;4204:223:1:-;4307:32;;;;:17;:32;;;;;;;;;:51;;;4368:52;;;;;;;4325:13;;4368:52;;;;;;;;;4204:223;;;:::o;7994:451:0:-;8126:18;8096:11;-1:-1:-1;;;;;2124:13:0;;;2120:36;;;2151:5;;;2120:36;8176:16;;8232:140;;;;;;;;-1:-1:-1;;;;;8232:140:0;;;;;;;;;;;;;;;;;;-1:-1:-1;8232:140:0;;;;;;8202:27;;;;;;;;;;:170;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;-1:-1:-1;8202:170:0;;;;;;;8176:16;;-1:-1:-1;8232:140:0;;8202:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;8202:170:0;;;;;;;;;;;;-1:-1:-1;;8202:170:0;;;;;;;;;;8382:16;:21;;-1:-1:-1;8382:21:0;;;8413:25;;8424:13;;8413:25;;-1:-1:-1;;8413:25:0;2166:1;7994:451;;;;;;;:::o;703:1479:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;703:1479:3;;;:::o;:::-;;;;;;;;;;-1:-1:-1;703:1479:3;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;703:1479:3;;;-1:-1:-1;703:1479:3;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o",
+ "linkReferences": {}
+ },
+ "methodIdentifiers": {
+ "MAX_OWNER_COUNT()": "d74f8edd",
+ "addOwner(address)": "7065cb48",
+ "changeRequirement(uint256)": "ba51a6df",
+ "changeTimeLock(uint256)": "7ad28c51",
+ "confirmTransaction(uint256)": "c01a8c84",
+ "confirmationTimes(uint256)": "d38f2d82",
+ "confirmations(uint256,address)": "3411c81c",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "3589b35c",
+ "executeTransaction(uint256)": "ee22610b",
+ "getConfirmationCount(uint256)": "8b51d13f",
+ "getConfirmations(uint256)": "b5dc40c3",
+ "getOwners()": "a0e67e2b",
+ "getTransactionCount(bool,bool)": "54741525",
+ "getTransactionIds(uint256,uint256,bool,bool)": "a8abe69a",
+ "isAssetProxyRegistered(address)": "83250f79",
+ "isConfirmed(uint256)": "784547a7",
+ "isFunctionRemoveAuthorizedAddressAtIndex(bytes)": "72cbe61d",
+ "isOwner(address)": "2f54bf6e",
+ "owners(uint256)": "025e7c27",
+ "publicReadBytes4(bytes,uint256)": "cc12cb28",
+ "registerAssetProxy(address,bool)": "5a1a66af",
+ "removeOwner(address)": "173825d9",
+ "replaceOwner(address,address)": "e20056e6",
+ "required()": "dc8452cd",
+ "revokeConfirmation(uint256)": "20ea8d86",
+ "secondsTimeLocked()": "37bd78a0",
+ "submitTransaction(address,uint256,bytes)": "c6427474",
+ "testValidRemoveAuthorizedAddressAtIndexTx(uint256)": "c296e43c",
+ "transactionCount()": "b77bf600",
+ "transactions(uint256)": "9ace38c2"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "1577000",
+ "executionCost": "infinite"
+ },
+ "internal": {},
+ "external": {
+ "": "2253",
+ "MAX_OWNER_COUNT()": "1550",
+ "addOwner(address)": "infinite",
+ "changeRequirement(uint256)": "21923",
+ "changeTimeLock(uint256)": "21582",
+ "confirmTransaction(uint256)": "infinite",
+ "confirmationTimes(uint256)": "1550",
+ "confirmations(uint256,address)": "1550",
+ "executeRemoveAuthorizedAddressAtIndex(uint256)": "infinite",
+ "executeTransaction(uint256)": "infinite",
+ "getConfirmationCount(uint256)": "infinite",
+ "getConfirmations(uint256)": "infinite",
+ "getOwners()": "infinite",
+ "getTransactionCount(bool,bool)": "infinite",
+ "getTransactionIds(uint256,uint256,bool,bool)": "infinite",
+ "isAssetProxyRegistered(address)": "1550",
+ "isConfirmed(uint256)": "infinite",
+ "isFunctionRemoveAuthorizedAddressAtIndex(bytes)": "infinite",
+ "isOwner(address)": "1550",
+ "owners(uint256)": "1550",
+ "publicReadBytes4(bytes,uint256)": "infinite",
+ "registerAssetProxy(address,bool)": "22074",
+ "removeOwner(address)": "infinite",
+ "replaceOwner(address,address)": "infinite",
+ "required()": "1550",
+ "revokeConfirmation(uint256)": "infinite",
+ "secondsTimeLocked()": "1550",
+ "submitTransaction(address,uint256,bytes)": "infinite",
+ "testValidRemoveAuthorizedAddressAtIndexTx(uint256)": "infinite",
+ "transactionCount()": "1550",
+ "transactions(uint256)": "infinite"
+ }
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/multisig/MultiSigWallet.sol": {
+ "id": "0",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 531,
+ "name": "PragmaDirective",
+ "src": "19:24:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 1492
+ ],
+ "name": "MultiSigWallet"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "MAX_OWNER_COUNT",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 532,
+ "name": "ElementaryTypeName",
+ "src": "237:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3530",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 50",
+ "value": "50"
+ },
+ "id": 533,
+ "name": "Literal",
+ "src": "276:2:0"
+ }
+ ],
+ "id": 534,
+ "name": "VariableDeclaration",
+ "src": "237:41:0"
+ },
+ {
+ "attributes": {
+ "name": "Confirmation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 535,
+ "name": "ElementaryTypeName",
+ "src": "304:7:0"
+ }
+ ],
+ "id": 536,
+ "name": "VariableDeclaration",
+ "src": "304:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 537,
+ "name": "ElementaryTypeName",
+ "src": "328:4:0"
+ }
+ ],
+ "id": 538,
+ "name": "VariableDeclaration",
+ "src": "328:26:0"
+ }
+ ],
+ "id": 539,
+ "name": "ParameterList",
+ "src": "303:52:0"
+ }
+ ],
+ "id": 540,
+ "name": "EventDefinition",
+ "src": "285:71:0"
+ },
+ {
+ "attributes": {
+ "name": "Revocation"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 541,
+ "name": "ElementaryTypeName",
+ "src": "378:7:0"
+ }
+ ],
+ "id": 542,
+ "name": "VariableDeclaration",
+ "src": "378:22:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 543,
+ "name": "ElementaryTypeName",
+ "src": "402:4:0"
+ }
+ ],
+ "id": 544,
+ "name": "VariableDeclaration",
+ "src": "402:26:0"
+ }
+ ],
+ "id": 545,
+ "name": "ParameterList",
+ "src": "377:52:0"
+ }
+ ],
+ "id": 546,
+ "name": "EventDefinition",
+ "src": "361:69:0"
+ },
+ {
+ "attributes": {
+ "name": "Submission"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 547,
+ "name": "ElementaryTypeName",
+ "src": "452:4:0"
+ }
+ ],
+ "id": 548,
+ "name": "VariableDeclaration",
+ "src": "452:26:0"
+ }
+ ],
+ "id": 549,
+ "name": "ParameterList",
+ "src": "451:28:0"
+ }
+ ],
+ "id": 550,
+ "name": "EventDefinition",
+ "src": "435:45:0"
+ },
+ {
+ "attributes": {
+ "name": "Execution"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 551,
+ "name": "ElementaryTypeName",
+ "src": "501:4:0"
+ }
+ ],
+ "id": 552,
+ "name": "VariableDeclaration",
+ "src": "501:26:0"
+ }
+ ],
+ "id": 553,
+ "name": "ParameterList",
+ "src": "500:28:0"
+ }
+ ],
+ "id": 554,
+ "name": "EventDefinition",
+ "src": "485:44:0"
+ },
+ {
+ "attributes": {
+ "name": "ExecutionFailure"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 555,
+ "name": "ElementaryTypeName",
+ "src": "557:4:0"
+ }
+ ],
+ "id": 556,
+ "name": "VariableDeclaration",
+ "src": "557:26:0"
+ }
+ ],
+ "id": 557,
+ "name": "ParameterList",
+ "src": "556:28:0"
+ }
+ ],
+ "id": 558,
+ "name": "EventDefinition",
+ "src": "534:51:0"
+ },
+ {
+ "attributes": {
+ "name": "Deposit"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 559,
+ "name": "ElementaryTypeName",
+ "src": "604:7:0"
+ }
+ ],
+ "id": 560,
+ "name": "VariableDeclaration",
+ "src": "604:22:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 561,
+ "name": "ElementaryTypeName",
+ "src": "628:4:0"
+ }
+ ],
+ "id": 562,
+ "name": "VariableDeclaration",
+ "src": "628:10:0"
+ }
+ ],
+ "id": 563,
+ "name": "ParameterList",
+ "src": "603:36:0"
+ }
+ ],
+ "id": 564,
+ "name": "EventDefinition",
+ "src": "590:50:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerAddition"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 565,
+ "name": "ElementaryTypeName",
+ "src": "665:7:0"
+ }
+ ],
+ "id": 566,
+ "name": "VariableDeclaration",
+ "src": "665:21:0"
+ }
+ ],
+ "id": 567,
+ "name": "ParameterList",
+ "src": "664:23:0"
+ }
+ ],
+ "id": 568,
+ "name": "EventDefinition",
+ "src": "645:43:0"
+ },
+ {
+ "attributes": {
+ "name": "OwnerRemoval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 569,
+ "name": "ElementaryTypeName",
+ "src": "712:7:0"
+ }
+ ],
+ "id": 570,
+ "name": "VariableDeclaration",
+ "src": "712:21:0"
+ }
+ ],
+ "id": 571,
+ "name": "ParameterList",
+ "src": "711:23:0"
+ }
+ ],
+ "id": 572,
+ "name": "EventDefinition",
+ "src": "693:42:0"
+ },
+ {
+ "attributes": {
+ "name": "RequirementChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 573,
+ "name": "ElementaryTypeName",
+ "src": "764:4:0"
+ }
+ ],
+ "id": 574,
+ "name": "VariableDeclaration",
+ "src": "764:13:0"
+ }
+ ],
+ "id": 575,
+ "name": "ParameterList",
+ "src": "763:15:0"
+ }
+ ],
+ "id": 576,
+ "name": "EventDefinition",
+ "src": "740:39:0"
+ },
+ {
+ "attributes": {
+ "name": "transactions",
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 577,
+ "name": "ElementaryTypeName",
+ "src": "794:4:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 578,
+ "name": "UserDefinedTypeName",
+ "src": "802:11:0"
+ }
+ ],
+ "id": 579,
+ "name": "Mapping",
+ "src": "785:29:0"
+ }
+ ],
+ "id": 580,
+ "name": "VariableDeclaration",
+ "src": "785:49:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmations",
+ "type": "mapping(uint256 => mapping(address => bool))"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 581,
+ "name": "ElementaryTypeName",
+ "src": "849:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 582,
+ "name": "ElementaryTypeName",
+ "src": "866:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 583,
+ "name": "ElementaryTypeName",
+ "src": "877:4:0"
+ }
+ ],
+ "id": 584,
+ "name": "Mapping",
+ "src": "857:25:0"
+ }
+ ],
+ "id": 585,
+ "name": "Mapping",
+ "src": "840:43:0"
+ }
+ ],
+ "id": 586,
+ "name": "VariableDeclaration",
+ "src": "840:64:0"
+ },
+ {
+ "attributes": {
+ "name": "isOwner",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 587,
+ "name": "ElementaryTypeName",
+ "src": "919:7:0"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 588,
+ "name": "ElementaryTypeName",
+ "src": "930:4:0"
+ }
+ ],
+ "id": 589,
+ "name": "Mapping",
+ "src": "910:25:0"
+ }
+ ],
+ "id": 590,
+ "name": "VariableDeclaration",
+ "src": "910:40:0"
+ },
+ {
+ "attributes": {
+ "name": "owners",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 591,
+ "name": "ElementaryTypeName",
+ "src": "956:7:0"
+ }
+ ],
+ "id": 592,
+ "name": "ArrayTypeName",
+ "src": "956:9:0"
+ }
+ ],
+ "id": 593,
+ "name": "VariableDeclaration",
+ "src": "956:23:0"
+ },
+ {
+ "attributes": {
+ "name": "required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 594,
+ "name": "ElementaryTypeName",
+ "src": "985:4:0"
+ }
+ ],
+ "id": 595,
+ "name": "VariableDeclaration",
+ "src": "985:20:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 596,
+ "name": "ElementaryTypeName",
+ "src": "1011:4:0"
+ }
+ ],
+ "id": 597,
+ "name": "VariableDeclaration",
+ "src": "1011:28:0"
+ },
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 598,
+ "name": "ElementaryTypeName",
+ "src": "1075:7:0"
+ }
+ ],
+ "id": 599,
+ "name": "VariableDeclaration",
+ "src": "1075:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 600,
+ "name": "ElementaryTypeName",
+ "src": "1104:4:0"
+ }
+ ],
+ "id": 601,
+ "name": "VariableDeclaration",
+ "src": "1104:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 602,
+ "name": "ElementaryTypeName",
+ "src": "1124:5:0"
+ }
+ ],
+ "id": 603,
+ "name": "VariableDeclaration",
+ "src": "1124:10:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 604,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 605,
+ "name": "VariableDeclaration",
+ "src": "1144:13:0"
+ }
+ ],
+ "id": 606,
+ "name": "StructDefinition",
+ "src": "1046:118:0"
+ },
+ {
+ "attributes": {
+ "name": "onlyWallet"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 607,
+ "name": "ParameterList",
+ "src": "1189:2:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 608,
+ "name": "Identifier",
+ "src": "1206:3:0"
+ }
+ ],
+ "id": 609,
+ "name": "MemberAccess",
+ "src": "1206:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 610,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1220:7:0"
+ },
+ {
+ "attributes": {
+ "type": "contract MultiSigWallet",
+ "value": "this"
+ },
+ "id": 611,
+ "name": "Identifier",
+ "src": "1228:4:0"
+ }
+ ],
+ "id": 612,
+ "name": "FunctionCall",
+ "src": "1220:13:0"
+ }
+ ],
+ "id": 613,
+ "name": "BinaryOperation",
+ "src": "1206:27:0"
+ },
+ {
+ "children": [],
+ "id": 614,
+ "name": "Throw",
+ "src": "1247:5:0"
+ }
+ ],
+ "id": 615,
+ "name": "IfStatement",
+ "src": "1202:50:0"
+ },
+ {
+ "id": 616,
+ "name": "PlaceholderStatement",
+ "src": "1262:1:0"
+ }
+ ],
+ "id": 617,
+ "name": "Block",
+ "src": "1192:78:0"
+ }
+ ],
+ "id": 618,
+ "name": "ModifierDefinition",
+ "src": "1170:100:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerDoesNotExist"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 619,
+ "name": "ElementaryTypeName",
+ "src": "1303:7:0"
+ }
+ ],
+ "id": 620,
+ "name": "VariableDeclaration",
+ "src": "1303:13:0"
+ }
+ ],
+ "id": 621,
+ "name": "ParameterList",
+ "src": "1302:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 622,
+ "name": "Identifier",
+ "src": "1332:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 623,
+ "name": "Identifier",
+ "src": "1340:5:0"
+ }
+ ],
+ "id": 624,
+ "name": "IndexAccess",
+ "src": "1332:14:0"
+ },
+ {
+ "children": [],
+ "id": 625,
+ "name": "Throw",
+ "src": "1360:5:0"
+ }
+ ],
+ "id": 626,
+ "name": "IfStatement",
+ "src": "1328:37:0"
+ },
+ {
+ "id": 627,
+ "name": "PlaceholderStatement",
+ "src": "1375:1:0"
+ }
+ ],
+ "id": 628,
+ "name": "Block",
+ "src": "1318:65:0"
+ }
+ ],
+ "id": 629,
+ "name": "ModifierDefinition",
+ "src": "1276:107:0"
+ },
+ {
+ "attributes": {
+ "name": "ownerExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 630,
+ "name": "ElementaryTypeName",
+ "src": "1410:7:0"
+ }
+ ],
+ "id": 631,
+ "name": "VariableDeclaration",
+ "src": "1410:13:0"
+ }
+ ],
+ "id": 632,
+ "name": "ParameterList",
+ "src": "1409:15:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 633,
+ "name": "Identifier",
+ "src": "1440:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 634,
+ "name": "Identifier",
+ "src": "1448:5:0"
+ }
+ ],
+ "id": 635,
+ "name": "IndexAccess",
+ "src": "1440:14:0"
+ }
+ ],
+ "id": 636,
+ "name": "UnaryOperation",
+ "src": "1439:15:0"
+ },
+ {
+ "children": [],
+ "id": 637,
+ "name": "Throw",
+ "src": "1468:5:0"
+ }
+ ],
+ "id": 638,
+ "name": "IfStatement",
+ "src": "1435:38:0"
+ },
+ {
+ "id": 639,
+ "name": "PlaceholderStatement",
+ "src": "1483:1:0"
+ }
+ ],
+ "id": 640,
+ "name": "Block",
+ "src": "1425:66:0"
+ }
+ ],
+ "id": 641,
+ "name": "ModifierDefinition",
+ "src": "1389:102:0"
+ },
+ {
+ "attributes": {
+ "name": "transactionExists"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 642,
+ "name": "ElementaryTypeName",
+ "src": "1524:4:0"
+ }
+ ],
+ "id": 643,
+ "name": "VariableDeclaration",
+ "src": "1524:18:0"
+ }
+ ],
+ "id": 644,
+ "name": "ParameterList",
+ "src": "1523:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 645,
+ "name": "Identifier",
+ "src": "1558:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 646,
+ "name": "Identifier",
+ "src": "1571:13:0"
+ }
+ ],
+ "id": 647,
+ "name": "IndexAccess",
+ "src": "1558:27:0"
+ }
+ ],
+ "id": 648,
+ "name": "MemberAccess",
+ "src": "1558:39:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 649,
+ "name": "Literal",
+ "src": "1601:1:0"
+ }
+ ],
+ "id": 650,
+ "name": "BinaryOperation",
+ "src": "1558:44:0"
+ },
+ {
+ "children": [],
+ "id": 651,
+ "name": "Throw",
+ "src": "1616:5:0"
+ }
+ ],
+ "id": 652,
+ "name": "IfStatement",
+ "src": "1554:67:0"
+ },
+ {
+ "id": 653,
+ "name": "PlaceholderStatement",
+ "src": "1631:1:0"
+ }
+ ],
+ "id": 654,
+ "name": "Block",
+ "src": "1544:95:0"
+ }
+ ],
+ "id": 655,
+ "name": "ModifierDefinition",
+ "src": "1497:142:0"
+ },
+ {
+ "attributes": {
+ "name": "confirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 656,
+ "name": "ElementaryTypeName",
+ "src": "1664:4:0"
+ }
+ ],
+ "id": 657,
+ "name": "VariableDeclaration",
+ "src": "1664:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 658,
+ "name": "ElementaryTypeName",
+ "src": "1684:7:0"
+ }
+ ],
+ "id": 659,
+ "name": "VariableDeclaration",
+ "src": "1684:13:0"
+ }
+ ],
+ "id": 660,
+ "name": "ParameterList",
+ "src": "1663:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 661,
+ "name": "Identifier",
+ "src": "1714:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 662,
+ "name": "Identifier",
+ "src": "1728:13:0"
+ }
+ ],
+ "id": 663,
+ "name": "IndexAccess",
+ "src": "1714:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 664,
+ "name": "Identifier",
+ "src": "1743:5:0"
+ }
+ ],
+ "id": 665,
+ "name": "IndexAccess",
+ "src": "1714:35:0"
+ }
+ ],
+ "id": 666,
+ "name": "UnaryOperation",
+ "src": "1713:36:0"
+ },
+ {
+ "children": [],
+ "id": 667,
+ "name": "Throw",
+ "src": "1763:5:0"
+ }
+ ],
+ "id": 668,
+ "name": "IfStatement",
+ "src": "1709:59:0"
+ },
+ {
+ "id": 669,
+ "name": "PlaceholderStatement",
+ "src": "1778:1:0"
+ }
+ ],
+ "id": 670,
+ "name": "Block",
+ "src": "1699:87:0"
+ }
+ ],
+ "id": 671,
+ "name": "ModifierDefinition",
+ "src": "1645:141:0"
+ },
+ {
+ "attributes": {
+ "name": "notConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 672,
+ "name": "ElementaryTypeName",
+ "src": "1814:4:0"
+ }
+ ],
+ "id": 673,
+ "name": "VariableDeclaration",
+ "src": "1814:18:0"
+ },
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 674,
+ "name": "ElementaryTypeName",
+ "src": "1834:7:0"
+ }
+ ],
+ "id": 675,
+ "name": "VariableDeclaration",
+ "src": "1834:13:0"
+ }
+ ],
+ "id": 676,
+ "name": "ParameterList",
+ "src": "1813:35:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 677,
+ "name": "Identifier",
+ "src": "1863:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 678,
+ "name": "Identifier",
+ "src": "1877:13:0"
+ }
+ ],
+ "id": 679,
+ "name": "IndexAccess",
+ "src": "1863:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 680,
+ "name": "Identifier",
+ "src": "1892:5:0"
+ }
+ ],
+ "id": 681,
+ "name": "IndexAccess",
+ "src": "1863:35:0"
+ },
+ {
+ "children": [],
+ "id": 682,
+ "name": "Throw",
+ "src": "1912:5:0"
+ }
+ ],
+ "id": 683,
+ "name": "IfStatement",
+ "src": "1859:58:0"
+ },
+ {
+ "id": 684,
+ "name": "PlaceholderStatement",
+ "src": "1927:1:0"
+ }
+ ],
+ "id": 685,
+ "name": "Block",
+ "src": "1849:86:0"
+ }
+ ],
+ "id": 686,
+ "name": "ModifierDefinition",
+ "src": "1792:143:0"
+ },
+ {
+ "attributes": {
+ "name": "notExecuted"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 687,
+ "name": "ElementaryTypeName",
+ "src": "1962:4:0"
+ }
+ ],
+ "id": 688,
+ "name": "VariableDeclaration",
+ "src": "1962:18:0"
+ }
+ ],
+ "id": 689,
+ "name": "ParameterList",
+ "src": "1961:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 690,
+ "name": "Identifier",
+ "src": "1996:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 691,
+ "name": "Identifier",
+ "src": "2009:13:0"
+ }
+ ],
+ "id": 692,
+ "name": "IndexAccess",
+ "src": "1996:27:0"
+ }
+ ],
+ "id": 693,
+ "name": "MemberAccess",
+ "src": "1996:36:0"
+ },
+ {
+ "children": [],
+ "id": 694,
+ "name": "Throw",
+ "src": "2046:5:0"
+ }
+ ],
+ "id": 695,
+ "name": "IfStatement",
+ "src": "1992:59:0"
+ },
+ {
+ "id": 696,
+ "name": "PlaceholderStatement",
+ "src": "2061:1:0"
+ }
+ ],
+ "id": 697,
+ "name": "Block",
+ "src": "1982:87:0"
+ }
+ ],
+ "id": 698,
+ "name": "ModifierDefinition",
+ "src": "1941:128:0"
+ },
+ {
+ "attributes": {
+ "name": "notNull"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_address",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 699,
+ "name": "ElementaryTypeName",
+ "src": "2092:7:0"
+ }
+ ],
+ "id": 700,
+ "name": "VariableDeclaration",
+ "src": "2092:16:0"
+ }
+ ],
+ "id": 701,
+ "name": "ParameterList",
+ "src": "2091:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_address"
+ },
+ "id": 702,
+ "name": "Identifier",
+ "src": "2124:8:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 703,
+ "name": "Literal",
+ "src": "2136:1:0"
+ }
+ ],
+ "id": 704,
+ "name": "BinaryOperation",
+ "src": "2124:13:0"
+ },
+ {
+ "children": [],
+ "id": 705,
+ "name": "Throw",
+ "src": "2151:5:0"
+ }
+ ],
+ "id": 706,
+ "name": "IfStatement",
+ "src": "2120:36:0"
+ },
+ {
+ "id": 707,
+ "name": "PlaceholderStatement",
+ "src": "2166:1:0"
+ }
+ ],
+ "id": 708,
+ "name": "Block",
+ "src": "2110:64:0"
+ }
+ ],
+ "id": 709,
+ "name": "ModifierDefinition",
+ "src": "2075:99:0"
+ },
+ {
+ "attributes": {
+ "name": "validRequirement"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ownerCount",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 710,
+ "name": "ElementaryTypeName",
+ "src": "2206:4:0"
+ }
+ ],
+ "id": 711,
+ "name": "VariableDeclaration",
+ "src": "2206:15:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 712,
+ "name": "ElementaryTypeName",
+ "src": "2223:4:0"
+ }
+ ],
+ "id": 713,
+ "name": "VariableDeclaration",
+ "src": "2223:14:0"
+ }
+ ],
+ "id": 714,
+ "name": "ParameterList",
+ "src": "2205:33:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 715,
+ "name": "Identifier",
+ "src": "2256:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_OWNER_COUNT"
+ },
+ "id": 716,
+ "name": "Identifier",
+ "src": "2269:15:0"
+ }
+ ],
+ "id": 717,
+ "name": "BinaryOperation",
+ "src": "2256:28:0"
+ },
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 718,
+ "name": "Identifier",
+ "src": "2300:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 719,
+ "name": "Identifier",
+ "src": "2312:10:0"
+ }
+ ],
+ "id": 720,
+ "name": "BinaryOperation",
+ "src": "2300:22:0"
+ }
+ ],
+ "id": 721,
+ "name": "BinaryOperation",
+ "src": "2256:66:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 722,
+ "name": "Identifier",
+ "src": "2338:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 723,
+ "name": "Literal",
+ "src": "2351:1:0"
+ }
+ ],
+ "id": 724,
+ "name": "BinaryOperation",
+ "src": "2338:14:0"
+ }
+ ],
+ "id": 725,
+ "name": "BinaryOperation",
+ "src": "2256:96:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "ownerCount"
+ },
+ "id": 726,
+ "name": "Identifier",
+ "src": "2368:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 727,
+ "name": "Literal",
+ "src": "2382:1:0"
+ }
+ ],
+ "id": 728,
+ "name": "BinaryOperation",
+ "src": "2368:15:0"
+ }
+ ],
+ "id": 729,
+ "name": "BinaryOperation",
+ "src": "2256:127:0"
+ },
+ {
+ "children": [],
+ "id": 730,
+ "name": "Throw",
+ "src": "2397:5:0"
+ }
+ ],
+ "id": 731,
+ "name": "IfStatement",
+ "src": "2249:153:0"
+ },
+ {
+ "id": 732,
+ "name": "PlaceholderStatement",
+ "src": "2412:1:0"
+ }
+ ],
+ "id": 733,
+ "name": "Block",
+ "src": "2239:181:0"
+ }
+ ],
+ "id": 734,
+ "name": "ModifierDefinition",
+ "src": "2180:240:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "payable": true,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 735,
+ "name": "ParameterList",
+ "src": "2490:2:0"
+ },
+ {
+ "children": [],
+ "id": 736,
+ "name": "ParameterList",
+ "src": "2513:0:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 737,
+ "name": "Identifier",
+ "src": "2527:3:0"
+ }
+ ],
+ "id": 738,
+ "name": "MemberAccess",
+ "src": "2527:9:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 739,
+ "name": "Literal",
+ "src": "2539:1:0"
+ }
+ ],
+ "id": 740,
+ "name": "BinaryOperation",
+ "src": "2527:13:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Deposit"
+ },
+ "id": 741,
+ "name": "Identifier",
+ "src": "2554:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 742,
+ "name": "Identifier",
+ "src": "2562:3:0"
+ }
+ ],
+ "id": 743,
+ "name": "MemberAccess",
+ "src": "2562:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 744,
+ "name": "Identifier",
+ "src": "2574:3:0"
+ }
+ ],
+ "id": 745,
+ "name": "MemberAccess",
+ "src": "2574:9:0"
+ }
+ ],
+ "id": 746,
+ "name": "FunctionCall",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 747,
+ "name": "ExpressionStatement",
+ "src": "2554:30:0"
+ }
+ ],
+ "id": 748,
+ "name": "IfStatement",
+ "src": "2523:61:0"
+ }
+ ],
+ "id": 749,
+ "name": "Block",
+ "src": "2513:78:0"
+ }
+ ],
+ "id": 750,
+ "name": "FunctionDefinition",
+ "src": "2482:109:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWallet",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 751,
+ "name": "ElementaryTypeName",
+ "src": "2858:7:0"
+ }
+ ],
+ "id": 752,
+ "name": "ArrayTypeName",
+ "src": "2858:9:0"
+ }
+ ],
+ "id": 753,
+ "name": "VariableDeclaration",
+ "src": "2858:17:0"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 754,
+ "name": "ElementaryTypeName",
+ "src": "2877:4:0"
+ }
+ ],
+ "id": 755,
+ "name": "VariableDeclaration",
+ "src": "2877:14:0"
+ }
+ ],
+ "id": 756,
+ "name": "ParameterList",
+ "src": "2857:35:0"
+ },
+ {
+ "children": [],
+ "id": 762,
+ "name": "ParameterList",
+ "src": "2964:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 757,
+ "name": "Identifier",
+ "src": "2916:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 758,
+ "name": "Identifier",
+ "src": "2933:7:0"
+ }
+ ],
+ "id": 759,
+ "name": "MemberAccess",
+ "src": "2933:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 760,
+ "name": "Identifier",
+ "src": "2949:9:0"
+ }
+ ],
+ "id": 761,
+ "name": "ModifierInvocation",
+ "src": "2916:43:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 763,
+ "name": "ElementaryTypeName",
+ "src": "2979:4:0"
+ }
+ ],
+ "id": 764,
+ "name": "VariableDeclaration",
+ "src": "2979:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 765,
+ "name": "Literal",
+ "src": "2986:1:0"
+ }
+ ],
+ "id": 766,
+ "name": "VariableDeclarationStatement",
+ "src": "2979:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 767,
+ "name": "Identifier",
+ "src": "2989:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 768,
+ "name": "Identifier",
+ "src": "2991:7:0"
+ }
+ ],
+ "id": 769,
+ "name": "MemberAccess",
+ "src": "2991:14:0"
+ }
+ ],
+ "id": 770,
+ "name": "BinaryOperation",
+ "src": "2989:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 771,
+ "name": "Identifier",
+ "src": "3007:1:0"
+ }
+ ],
+ "id": 772,
+ "name": "UnaryOperation",
+ "src": "3007:3:0"
+ }
+ ],
+ "id": 773,
+ "name": "ExpressionStatement",
+ "src": "3007:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 774,
+ "name": "Identifier",
+ "src": "3030:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 775,
+ "name": "Identifier",
+ "src": "3038:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 776,
+ "name": "Identifier",
+ "src": "3046:1:0"
+ }
+ ],
+ "id": 777,
+ "name": "IndexAccess",
+ "src": "3038:10:0"
+ }
+ ],
+ "id": 778,
+ "name": "IndexAccess",
+ "src": "3030:19:0"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 779,
+ "name": "Identifier",
+ "src": "3053:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 780,
+ "name": "Identifier",
+ "src": "3061:1:0"
+ }
+ ],
+ "id": 781,
+ "name": "IndexAccess",
+ "src": "3053:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 782,
+ "name": "Literal",
+ "src": "3067:1:0"
+ }
+ ],
+ "id": 783,
+ "name": "BinaryOperation",
+ "src": "3053:15:0"
+ }
+ ],
+ "id": 784,
+ "name": "BinaryOperation",
+ "src": "3030:38:0"
+ },
+ {
+ "children": [],
+ "id": 785,
+ "name": "Throw",
+ "src": "3086:5:0"
+ }
+ ],
+ "id": 786,
+ "name": "IfStatement",
+ "src": "3026:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 787,
+ "name": "Identifier",
+ "src": "3105:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 788,
+ "name": "Identifier",
+ "src": "3113:7:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 789,
+ "name": "Identifier",
+ "src": "3121:1:0"
+ }
+ ],
+ "id": 790,
+ "name": "IndexAccess",
+ "src": "3113:10:0"
+ }
+ ],
+ "id": 791,
+ "name": "IndexAccess",
+ "src": "3105:19:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 792,
+ "name": "Literal",
+ "src": "3127:4:0"
+ }
+ ],
+ "id": 793,
+ "name": "Assignment",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 794,
+ "name": "ExpressionStatement",
+ "src": "3105:26:0"
+ }
+ ],
+ "id": 795,
+ "name": "Block",
+ "src": "3012:130:0"
+ }
+ ],
+ "id": 796,
+ "name": "ForStatement",
+ "src": "2974:168:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 797,
+ "name": "Identifier",
+ "src": "3151:6:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 798,
+ "name": "Identifier",
+ "src": "3160:7:0"
+ }
+ ],
+ "id": 799,
+ "name": "Assignment",
+ "src": "3151:16:0"
+ }
+ ],
+ "id": 800,
+ "name": "ExpressionStatement",
+ "src": "3151:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 801,
+ "name": "Identifier",
+ "src": "3177:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 802,
+ "name": "Identifier",
+ "src": "3188:9:0"
+ }
+ ],
+ "id": 803,
+ "name": "Assignment",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 804,
+ "name": "ExpressionStatement",
+ "src": "3177:20:0"
+ }
+ ],
+ "id": 805,
+ "name": "Block",
+ "src": "2964:240:0"
+ }
+ ],
+ "id": 806,
+ "name": "FunctionDefinition",
+ "src": "2834:370:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 807,
+ "name": "ElementaryTypeName",
+ "src": "3349:7:0"
+ }
+ ],
+ "id": 808,
+ "name": "VariableDeclaration",
+ "src": "3349:13:0"
+ }
+ ],
+ "id": 809,
+ "name": "ParameterList",
+ "src": "3348:15:0"
+ },
+ {
+ "children": [],
+ "id": 825,
+ "name": "ParameterList",
+ "src": "3512:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 810,
+ "name": "Identifier",
+ "src": "3387:10:0"
+ }
+ ],
+ "id": 811,
+ "name": "ModifierInvocation",
+ "src": "3387:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 812,
+ "name": "Identifier",
+ "src": "3406:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 813,
+ "name": "Identifier",
+ "src": "3424:5:0"
+ }
+ ],
+ "id": 814,
+ "name": "ModifierInvocation",
+ "src": "3406:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 815,
+ "name": "Identifier",
+ "src": "3439:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 816,
+ "name": "Identifier",
+ "src": "3447:5:0"
+ }
+ ],
+ "id": 817,
+ "name": "ModifierInvocation",
+ "src": "3439:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 818,
+ "name": "Identifier",
+ "src": "3462:16:0"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 819,
+ "name": "Identifier",
+ "src": "3479:6:0"
+ }
+ ],
+ "id": 820,
+ "name": "MemberAccess",
+ "src": "3479:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 821,
+ "name": "Literal",
+ "src": "3495:1:0"
+ }
+ ],
+ "id": 822,
+ "name": "BinaryOperation",
+ "src": "3479:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 823,
+ "name": "Identifier",
+ "src": "3498:8:0"
+ }
+ ],
+ "id": 824,
+ "name": "ModifierInvocation",
+ "src": "3462:45:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 826,
+ "name": "Identifier",
+ "src": "3522:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 827,
+ "name": "Identifier",
+ "src": "3530:5:0"
+ }
+ ],
+ "id": 828,
+ "name": "IndexAccess",
+ "src": "3522:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 829,
+ "name": "Literal",
+ "src": "3539:4:0"
+ }
+ ],
+ "id": 830,
+ "name": "Assignment",
+ "src": "3522:21:0"
+ }
+ ],
+ "id": 831,
+ "name": "ExpressionStatement",
+ "src": "3522:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "push",
+ "type": "function (address) returns (uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 832,
+ "name": "Identifier",
+ "src": "3553:6:0"
+ }
+ ],
+ "id": 834,
+ "name": "MemberAccess",
+ "src": "3553:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 835,
+ "name": "Identifier",
+ "src": "3565:5:0"
+ }
+ ],
+ "id": 836,
+ "name": "FunctionCall",
+ "src": "3553:18:0"
+ }
+ ],
+ "id": 837,
+ "name": "ExpressionStatement",
+ "src": "3553:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 838,
+ "name": "Identifier",
+ "src": "3581:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 839,
+ "name": "Identifier",
+ "src": "3595:5:0"
+ }
+ ],
+ "id": 840,
+ "name": "FunctionCall",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 841,
+ "name": "ExpressionStatement",
+ "src": "3581:20:0"
+ }
+ ],
+ "id": 842,
+ "name": "Block",
+ "src": "3512:96:0"
+ }
+ ],
+ "id": 843,
+ "name": "FunctionDefinition",
+ "src": "3331:277:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "removeOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 844,
+ "name": "ElementaryTypeName",
+ "src": "3752:7:0"
+ }
+ ],
+ "id": 845,
+ "name": "VariableDeclaration",
+ "src": "3752:13:0"
+ }
+ ],
+ "id": 846,
+ "name": "ParameterList",
+ "src": "3751:15:0"
+ },
+ {
+ "children": [],
+ "id": 852,
+ "name": "ParameterList",
+ "src": "3832:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 847,
+ "name": "Identifier",
+ "src": "3790:10:0"
+ }
+ ],
+ "id": 848,
+ "name": "ModifierInvocation",
+ "src": "3790:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 849,
+ "name": "Identifier",
+ "src": "3809:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 850,
+ "name": "Identifier",
+ "src": "3821:5:0"
+ }
+ ],
+ "id": 851,
+ "name": "ModifierInvocation",
+ "src": "3809:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 853,
+ "name": "Identifier",
+ "src": "3842:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 854,
+ "name": "Identifier",
+ "src": "3850:5:0"
+ }
+ ],
+ "id": 855,
+ "name": "IndexAccess",
+ "src": "3842:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 856,
+ "name": "Literal",
+ "src": "3859:5:0"
+ }
+ ],
+ "id": 857,
+ "name": "Assignment",
+ "src": "3842:22:0"
+ }
+ ],
+ "id": 858,
+ "name": "ExpressionStatement",
+ "src": "3842:22:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 859,
+ "name": "ElementaryTypeName",
+ "src": "3879:4:0"
+ }
+ ],
+ "id": 860,
+ "name": "VariableDeclaration",
+ "src": "3879:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 861,
+ "name": "Literal",
+ "src": "3886:1:0"
+ }
+ ],
+ "id": 862,
+ "name": "VariableDeclarationStatement",
+ "src": "3879:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 863,
+ "name": "Identifier",
+ "src": "3889:1:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 864,
+ "name": "Identifier",
+ "src": "3891:6:0"
+ }
+ ],
+ "id": 865,
+ "name": "MemberAccess",
+ "src": "3891:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 866,
+ "name": "Literal",
+ "src": "3907:1:0"
+ }
+ ],
+ "id": 867,
+ "name": "BinaryOperation",
+ "src": "3891:17:0"
+ }
+ ],
+ "id": 868,
+ "name": "BinaryOperation",
+ "src": "3889:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 869,
+ "name": "Identifier",
+ "src": "3910:1:0"
+ }
+ ],
+ "id": 870,
+ "name": "UnaryOperation",
+ "src": "3910:3:0"
+ }
+ ],
+ "id": 871,
+ "name": "ExpressionStatement",
+ "src": "3910:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 872,
+ "name": "Identifier",
+ "src": "3931:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 873,
+ "name": "Identifier",
+ "src": "3938:1:0"
+ }
+ ],
+ "id": 874,
+ "name": "IndexAccess",
+ "src": "3931:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 875,
+ "name": "Identifier",
+ "src": "3944:5:0"
+ }
+ ],
+ "id": 876,
+ "name": "BinaryOperation",
+ "src": "3931:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 877,
+ "name": "Identifier",
+ "src": "3969:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 878,
+ "name": "Identifier",
+ "src": "3976:1:0"
+ }
+ ],
+ "id": 879,
+ "name": "IndexAccess",
+ "src": "3969:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 880,
+ "name": "Identifier",
+ "src": "3981:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 881,
+ "name": "Identifier",
+ "src": "3988:6:0"
+ }
+ ],
+ "id": 882,
+ "name": "MemberAccess",
+ "src": "3988:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 883,
+ "name": "Literal",
+ "src": "4004:1:0"
+ }
+ ],
+ "id": 884,
+ "name": "BinaryOperation",
+ "src": "3988:17:0"
+ }
+ ],
+ "id": 885,
+ "name": "IndexAccess",
+ "src": "3981:25:0"
+ }
+ ],
+ "id": 886,
+ "name": "Assignment",
+ "src": "3969:37:0"
+ }
+ ],
+ "id": 887,
+ "name": "ExpressionStatement",
+ "src": "3969:37:0"
+ },
+ {
+ "id": 888,
+ "name": "Break",
+ "src": "4024:5:0"
+ }
+ ],
+ "id": 889,
+ "name": "Block",
+ "src": "3951:93:0"
+ }
+ ],
+ "id": 890,
+ "name": "IfStatement",
+ "src": "3927:117:0"
+ }
+ ],
+ "id": 891,
+ "name": "ForStatement",
+ "src": "3874:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 892,
+ "name": "Identifier",
+ "src": "4053:6:0"
+ }
+ ],
+ "id": 894,
+ "name": "MemberAccess",
+ "src": "4053:13:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 895,
+ "name": "Literal",
+ "src": "4070:1:0"
+ }
+ ],
+ "id": 896,
+ "name": "Assignment",
+ "src": "4053:18:0"
+ }
+ ],
+ "id": 897,
+ "name": "ExpressionStatement",
+ "src": "4053:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": ">",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 898,
+ "name": "Identifier",
+ "src": "4085:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 899,
+ "name": "Identifier",
+ "src": "4096:6:0"
+ }
+ ],
+ "id": 900,
+ "name": "MemberAccess",
+ "src": "4096:13:0"
+ }
+ ],
+ "id": 901,
+ "name": "BinaryOperation",
+ "src": "4085:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "changeRequirement"
+ },
+ "id": 902,
+ "name": "Identifier",
+ "src": "4123:17:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 903,
+ "name": "Identifier",
+ "src": "4141:6:0"
+ }
+ ],
+ "id": 904,
+ "name": "MemberAccess",
+ "src": "4141:13:0"
+ }
+ ],
+ "id": 905,
+ "name": "FunctionCall",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 906,
+ "name": "ExpressionStatement",
+ "src": "4123:32:0"
+ }
+ ],
+ "id": 907,
+ "name": "IfStatement",
+ "src": "4081:74:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 908,
+ "name": "Identifier",
+ "src": "4165:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 909,
+ "name": "Identifier",
+ "src": "4178:5:0"
+ }
+ ],
+ "id": 910,
+ "name": "FunctionCall",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 911,
+ "name": "ExpressionStatement",
+ "src": "4165:19:0"
+ }
+ ],
+ "id": 912,
+ "name": "Block",
+ "src": "3832:359:0"
+ }
+ ],
+ "id": 913,
+ "name": "FunctionDefinition",
+ "src": "3731:460:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "replaceOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "owner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 914,
+ "name": "ElementaryTypeName",
+ "src": "4412:7:0"
+ }
+ ],
+ "id": 915,
+ "name": "VariableDeclaration",
+ "src": "4412:13:0"
+ },
+ {
+ "attributes": {
+ "name": "newOwner",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 916,
+ "name": "ElementaryTypeName",
+ "src": "4427:7:0"
+ }
+ ],
+ "id": 917,
+ "name": "VariableDeclaration",
+ "src": "4427:16:0"
+ }
+ ],
+ "id": 918,
+ "name": "ParameterList",
+ "src": "4411:33:0"
+ },
+ {
+ "children": [],
+ "id": 927,
+ "name": "ParameterList",
+ "src": "4546:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 919,
+ "name": "Identifier",
+ "src": "4468:10:0"
+ }
+ ],
+ "id": 920,
+ "name": "ModifierInvocation",
+ "src": "4468:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 921,
+ "name": "Identifier",
+ "src": "4487:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 922,
+ "name": "Identifier",
+ "src": "4499:5:0"
+ }
+ ],
+ "id": 923,
+ "name": "ModifierInvocation",
+ "src": "4487:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerDoesNotExist"
+ },
+ "id": 924,
+ "name": "Identifier",
+ "src": "4514:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 925,
+ "name": "Identifier",
+ "src": "4532:8:0"
+ }
+ ],
+ "id": 926,
+ "name": "ModifierInvocation",
+ "src": "4514:27:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 928,
+ "name": "ElementaryTypeName",
+ "src": "4561:4:0"
+ }
+ ],
+ "id": 929,
+ "name": "VariableDeclaration",
+ "src": "4561:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 930,
+ "name": "Literal",
+ "src": "4568:1:0"
+ }
+ ],
+ "id": 931,
+ "name": "VariableDeclarationStatement",
+ "src": "4561:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 932,
+ "name": "Identifier",
+ "src": "4571:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 933,
+ "name": "Identifier",
+ "src": "4573:6:0"
+ }
+ ],
+ "id": 934,
+ "name": "MemberAccess",
+ "src": "4573:13:0"
+ }
+ ],
+ "id": 935,
+ "name": "BinaryOperation",
+ "src": "4571:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 936,
+ "name": "Identifier",
+ "src": "4588:1:0"
+ }
+ ],
+ "id": 937,
+ "name": "UnaryOperation",
+ "src": "4588:3:0"
+ }
+ ],
+ "id": 938,
+ "name": "ExpressionStatement",
+ "src": "4588:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 939,
+ "name": "Identifier",
+ "src": "4609:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 940,
+ "name": "Identifier",
+ "src": "4616:1:0"
+ }
+ ],
+ "id": 941,
+ "name": "IndexAccess",
+ "src": "4609:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 942,
+ "name": "Identifier",
+ "src": "4622:5:0"
+ }
+ ],
+ "id": 943,
+ "name": "BinaryOperation",
+ "src": "4609:18:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 944,
+ "name": "Identifier",
+ "src": "4647:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 945,
+ "name": "Identifier",
+ "src": "4654:1:0"
+ }
+ ],
+ "id": 946,
+ "name": "IndexAccess",
+ "src": "4647:9:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 947,
+ "name": "Identifier",
+ "src": "4659:8:0"
+ }
+ ],
+ "id": 948,
+ "name": "Assignment",
+ "src": "4647:20:0"
+ }
+ ],
+ "id": 949,
+ "name": "ExpressionStatement",
+ "src": "4647:20:0"
+ },
+ {
+ "id": 950,
+ "name": "Break",
+ "src": "4685:5:0"
+ }
+ ],
+ "id": 951,
+ "name": "Block",
+ "src": "4629:76:0"
+ }
+ ],
+ "id": 952,
+ "name": "IfStatement",
+ "src": "4605:100:0"
+ }
+ ],
+ "id": 953,
+ "name": "ForStatement",
+ "src": "4556:149:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 954,
+ "name": "Identifier",
+ "src": "4714:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 955,
+ "name": "Identifier",
+ "src": "4722:5:0"
+ }
+ ],
+ "id": 956,
+ "name": "IndexAccess",
+ "src": "4714:14:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 957,
+ "name": "Literal",
+ "src": "4731:5:0"
+ }
+ ],
+ "id": 958,
+ "name": "Assignment",
+ "src": "4714:22:0"
+ }
+ ],
+ "id": 959,
+ "name": "ExpressionStatement",
+ "src": "4714:22:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isOwner"
+ },
+ "id": 960,
+ "name": "Identifier",
+ "src": "4746:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 961,
+ "name": "Identifier",
+ "src": "4754:8:0"
+ }
+ ],
+ "id": 962,
+ "name": "IndexAccess",
+ "src": "4746:17:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 963,
+ "name": "Literal",
+ "src": "4766:4:0"
+ }
+ ],
+ "id": 964,
+ "name": "Assignment",
+ "src": "4746:24:0"
+ }
+ ],
+ "id": 965,
+ "name": "ExpressionStatement",
+ "src": "4746:24:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerRemoval"
+ },
+ "id": 966,
+ "name": "Identifier",
+ "src": "4780:12:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "owner"
+ },
+ "id": 967,
+ "name": "Identifier",
+ "src": "4793:5:0"
+ }
+ ],
+ "id": 968,
+ "name": "FunctionCall",
+ "src": "4780:19:0"
+ }
+ ],
+ "id": 969,
+ "name": "ExpressionStatement",
+ "src": "4780:19:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address) constant",
+ "value": "OwnerAddition"
+ },
+ "id": 970,
+ "name": "Identifier",
+ "src": "4809:13:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "newOwner"
+ },
+ "id": 971,
+ "name": "Identifier",
+ "src": "4823:8:0"
+ }
+ ],
+ "id": 972,
+ "name": "FunctionCall",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 973,
+ "name": "ExpressionStatement",
+ "src": "4809:23:0"
+ }
+ ],
+ "id": 974,
+ "name": "Block",
+ "src": "4546:293:0"
+ }
+ ],
+ "id": 975,
+ "name": "FunctionDefinition",
+ "src": "4390:449:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeRequirement",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 976,
+ "name": "ElementaryTypeName",
+ "src": "5037:4:0"
+ }
+ ],
+ "id": 977,
+ "name": "VariableDeclaration",
+ "src": "5037:14:0"
+ }
+ ],
+ "id": 978,
+ "name": "ParameterList",
+ "src": "5036:16:0"
+ },
+ {
+ "children": [],
+ "id": 986,
+ "name": "ParameterList",
+ "src": "5142:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 979,
+ "name": "Identifier",
+ "src": "5076:10:0"
+ }
+ ],
+ "id": 980,
+ "name": "ModifierInvocation",
+ "src": "5076:10:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,uint256)",
+ "value": "validRequirement"
+ },
+ "id": 981,
+ "name": "Identifier",
+ "src": "5095:16:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 982,
+ "name": "Identifier",
+ "src": "5112:6:0"
+ }
+ ],
+ "id": 983,
+ "name": "MemberAccess",
+ "src": "5112:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 984,
+ "name": "Identifier",
+ "src": "5127:9:0"
+ }
+ ],
+ "id": 985,
+ "name": "ModifierInvocation",
+ "src": "5095:42:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 987,
+ "name": "Identifier",
+ "src": "5152:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 988,
+ "name": "Identifier",
+ "src": "5163:9:0"
+ }
+ ],
+ "id": 989,
+ "name": "Assignment",
+ "src": "5152:20:0"
+ }
+ ],
+ "id": 990,
+ "name": "ExpressionStatement",
+ "src": "5152:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "RequirementChange"
+ },
+ "id": 991,
+ "name": "Identifier",
+ "src": "5182:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 992,
+ "name": "Identifier",
+ "src": "5200:9:0"
+ }
+ ],
+ "id": 993,
+ "name": "FunctionCall",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 994,
+ "name": "ExpressionStatement",
+ "src": "5182:28:0"
+ }
+ ],
+ "id": 995,
+ "name": "Block",
+ "src": "5142:75:0"
+ }
+ ],
+ "id": 996,
+ "name": "FunctionDefinition",
+ "src": "5010:207:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "submitTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 997,
+ "name": "ElementaryTypeName",
+ "src": "5503:7:0"
+ }
+ ],
+ "id": 998,
+ "name": "VariableDeclaration",
+ "src": "5503:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 999,
+ "name": "ElementaryTypeName",
+ "src": "5524:4:0"
+ }
+ ],
+ "id": 1000,
+ "name": "VariableDeclaration",
+ "src": "5524:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 1001,
+ "name": "ElementaryTypeName",
+ "src": "5536:5:0"
+ }
+ ],
+ "id": 1002,
+ "name": "VariableDeclaration",
+ "src": "5536:10:0"
+ }
+ ],
+ "id": 1003,
+ "name": "ParameterList",
+ "src": "5502:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1004,
+ "name": "ElementaryTypeName",
+ "src": "5580:4:0"
+ }
+ ],
+ "id": 1005,
+ "name": "VariableDeclaration",
+ "src": "5580:18:0"
+ }
+ ],
+ "id": 1006,
+ "name": "ParameterList",
+ "src": "5579:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1007,
+ "name": "Identifier",
+ "src": "5614:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256,bytes memory) returns (uint256)",
+ "value": "addTransaction"
+ },
+ "id": 1008,
+ "name": "Identifier",
+ "src": "5630:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1009,
+ "name": "Identifier",
+ "src": "5645:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 1010,
+ "name": "Identifier",
+ "src": "5658:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 1011,
+ "name": "Identifier",
+ "src": "5665:4:0"
+ }
+ ],
+ "id": 1012,
+ "name": "FunctionCall",
+ "src": "5630:40:0"
+ }
+ ],
+ "id": 1013,
+ "name": "Assignment",
+ "src": "5614:56:0"
+ }
+ ],
+ "id": 1014,
+ "name": "ExpressionStatement",
+ "src": "5614:56:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "confirmTransaction"
+ },
+ "id": 1015,
+ "name": "Identifier",
+ "src": "5680:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1016,
+ "name": "Identifier",
+ "src": "5699:13:0"
+ }
+ ],
+ "id": 1017,
+ "name": "FunctionCall",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 1018,
+ "name": "ExpressionStatement",
+ "src": "5680:33:0"
+ }
+ ],
+ "id": 1019,
+ "name": "Block",
+ "src": "5604:116:0"
+ }
+ ],
+ "id": 1020,
+ "name": "FunctionDefinition",
+ "src": "5476:244:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1021,
+ "name": "ElementaryTypeName",
+ "src": "5854:4:0"
+ }
+ ],
+ "id": 1022,
+ "name": "VariableDeclaration",
+ "src": "5854:18:0"
+ }
+ ],
+ "id": 1023,
+ "name": "ParameterList",
+ "src": "5853:20:0"
+ },
+ {
+ "children": [],
+ "id": 1036,
+ "name": "ParameterList",
+ "src": "6014:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 1024,
+ "name": "Identifier",
+ "src": "5897:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1025,
+ "name": "Identifier",
+ "src": "5909:3:0"
+ }
+ ],
+ "id": 1026,
+ "name": "MemberAccess",
+ "src": "5909:10:0"
+ }
+ ],
+ "id": 1027,
+ "name": "ModifierInvocation",
+ "src": "5897:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 1028,
+ "name": "Identifier",
+ "src": "5929:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1029,
+ "name": "Identifier",
+ "src": "5947:13:0"
+ }
+ ],
+ "id": 1030,
+ "name": "ModifierInvocation",
+ "src": "5929:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 1031,
+ "name": "Identifier",
+ "src": "5970:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1032,
+ "name": "Identifier",
+ "src": "5983:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1033,
+ "name": "Identifier",
+ "src": "5998:3:0"
+ }
+ ],
+ "id": 1034,
+ "name": "MemberAccess",
+ "src": "5998:10:0"
+ }
+ ],
+ "id": 1035,
+ "name": "ModifierInvocation",
+ "src": "5970:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1037,
+ "name": "Identifier",
+ "src": "6024:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1038,
+ "name": "Identifier",
+ "src": "6038:13:0"
+ }
+ ],
+ "id": 1041,
+ "name": "IndexAccess",
+ "src": "6024:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1039,
+ "name": "Identifier",
+ "src": "6053:3:0"
+ }
+ ],
+ "id": 1040,
+ "name": "MemberAccess",
+ "src": "6053:10:0"
+ }
+ ],
+ "id": 1042,
+ "name": "IndexAccess",
+ "src": "6024:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1043,
+ "name": "Literal",
+ "src": "6067:4:0"
+ }
+ ],
+ "id": 1044,
+ "name": "Assignment",
+ "src": "6024:47:0"
+ }
+ ],
+ "id": 1045,
+ "name": "ExpressionStatement",
+ "src": "6024:47:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 1046,
+ "name": "Identifier",
+ "src": "6081:12:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1047,
+ "name": "Identifier",
+ "src": "6094:3:0"
+ }
+ ],
+ "id": 1048,
+ "name": "MemberAccess",
+ "src": "6094:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1049,
+ "name": "Identifier",
+ "src": "6106:13:0"
+ }
+ ],
+ "id": 1050,
+ "name": "FunctionCall",
+ "src": "6081:39:0"
+ }
+ ],
+ "id": 1051,
+ "name": "ExpressionStatement",
+ "src": "6081:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256)",
+ "value": "executeTransaction"
+ },
+ "id": 1052,
+ "name": "Identifier",
+ "src": "6130:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1053,
+ "name": "Identifier",
+ "src": "6149:13:0"
+ }
+ ],
+ "id": 1054,
+ "name": "FunctionCall",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 1055,
+ "name": "ExpressionStatement",
+ "src": "6130:33:0"
+ }
+ ],
+ "id": 1056,
+ "name": "Block",
+ "src": "6014:156:0"
+ }
+ ],
+ "id": 1057,
+ "name": "FunctionDefinition",
+ "src": "5826:344:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1058,
+ "name": "ElementaryTypeName",
+ "src": "6322:4:0"
+ }
+ ],
+ "id": 1059,
+ "name": "VariableDeclaration",
+ "src": "6322:18:0"
+ }
+ ],
+ "id": 1060,
+ "name": "ParameterList",
+ "src": "6321:20:0"
+ },
+ {
+ "children": [],
+ "id": 1073,
+ "name": "ParameterList",
+ "src": "6473:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 1061,
+ "name": "Identifier",
+ "src": "6365:11:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1062,
+ "name": "Identifier",
+ "src": "6377:3:0"
+ }
+ ],
+ "id": 1063,
+ "name": "MemberAccess",
+ "src": "6377:10:0"
+ }
+ ],
+ "id": 1064,
+ "name": "ModifierInvocation",
+ "src": "6365:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 1065,
+ "name": "Identifier",
+ "src": "6397:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1066,
+ "name": "Identifier",
+ "src": "6407:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1067,
+ "name": "Identifier",
+ "src": "6422:3:0"
+ }
+ ],
+ "id": 1068,
+ "name": "MemberAccess",
+ "src": "6422:10:0"
+ }
+ ],
+ "id": 1069,
+ "name": "ModifierInvocation",
+ "src": "6397:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 1070,
+ "name": "Identifier",
+ "src": "6442:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1071,
+ "name": "Identifier",
+ "src": "6454:13:0"
+ }
+ ],
+ "id": 1072,
+ "name": "ModifierInvocation",
+ "src": "6442:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1074,
+ "name": "Identifier",
+ "src": "6483:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1075,
+ "name": "Identifier",
+ "src": "6497:13:0"
+ }
+ ],
+ "id": 1078,
+ "name": "IndexAccess",
+ "src": "6483:28:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1076,
+ "name": "Identifier",
+ "src": "6512:3:0"
+ }
+ ],
+ "id": 1077,
+ "name": "MemberAccess",
+ "src": "6512:10:0"
+ }
+ ],
+ "id": 1079,
+ "name": "IndexAccess",
+ "src": "6483:40:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1080,
+ "name": "Literal",
+ "src": "6526:5:0"
+ }
+ ],
+ "id": 1081,
+ "name": "Assignment",
+ "src": "6483:48:0"
+ }
+ ],
+ "id": 1082,
+ "name": "ExpressionStatement",
+ "src": "6483:48:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 1083,
+ "name": "Identifier",
+ "src": "6541:10:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 1084,
+ "name": "Identifier",
+ "src": "6552:3:0"
+ }
+ ],
+ "id": 1085,
+ "name": "MemberAccess",
+ "src": "6552:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1086,
+ "name": "Identifier",
+ "src": "6564:13:0"
+ }
+ ],
+ "id": 1087,
+ "name": "FunctionCall",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1088,
+ "name": "ExpressionStatement",
+ "src": "6541:37:0"
+ }
+ ],
+ "id": 1089,
+ "name": "Block",
+ "src": "6473:112:0"
+ }
+ ],
+ "id": 1090,
+ "name": "FunctionDefinition",
+ "src": "6294:291:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1091,
+ "name": "ElementaryTypeName",
+ "src": "6727:4:0"
+ }
+ ],
+ "id": 1092,
+ "name": "VariableDeclaration",
+ "src": "6727:18:0"
+ }
+ ],
+ "id": 1093,
+ "name": "ParameterList",
+ "src": "6726:20:0"
+ },
+ {
+ "children": [],
+ "id": 1097,
+ "name": "ParameterList",
+ "src": "6801:0:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 1094,
+ "name": "Identifier",
+ "src": "6770:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1095,
+ "name": "Identifier",
+ "src": "6782:13:0"
+ }
+ ],
+ "id": 1096,
+ "name": "ModifierInvocation",
+ "src": "6770:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 1098,
+ "name": "Identifier",
+ "src": "6815:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1099,
+ "name": "Identifier",
+ "src": "6827:13:0"
+ }
+ ],
+ "id": 1100,
+ "name": "FunctionCall",
+ "src": "6815:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 1101,
+ "name": "UserDefinedTypeName",
+ "src": "6857:11:0"
+ }
+ ],
+ "id": 1102,
+ "name": "VariableDeclaration",
+ "src": "6857:14:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1103,
+ "name": "Identifier",
+ "src": "6874:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1104,
+ "name": "Identifier",
+ "src": "6887:13:0"
+ }
+ ],
+ "id": 1105,
+ "name": "IndexAccess",
+ "src": "6874:27:0"
+ }
+ ],
+ "id": 1106,
+ "name": "VariableDeclarationStatement",
+ "src": "6857:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1107,
+ "name": "Identifier",
+ "src": "6915:2:0"
+ }
+ ],
+ "id": 1109,
+ "name": "MemberAccess",
+ "src": "6915:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1110,
+ "name": "Literal",
+ "src": "6929:4:0"
+ }
+ ],
+ "id": 1111,
+ "name": "Assignment",
+ "src": "6915:18:0"
+ }
+ ],
+ "id": 1112,
+ "name": "ExpressionStatement",
+ "src": "6915:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1113,
+ "name": "Identifier",
+ "src": "6951:2:0"
+ }
+ ],
+ "id": 1114,
+ "name": "MemberAccess",
+ "src": "6951:14:0"
+ }
+ ],
+ "id": 1115,
+ "name": "MemberAccess",
+ "src": "6951:19:0"
+ }
+ ],
+ "id": 1116,
+ "name": "MemberAccess",
+ "src": "6951:25:0"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1117,
+ "name": "Identifier",
+ "src": "6977:2:0"
+ }
+ ],
+ "id": 1118,
+ "name": "MemberAccess",
+ "src": "6977:8:0"
+ }
+ ],
+ "id": 1119,
+ "name": "FunctionCall",
+ "src": "6951:35:0"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1120,
+ "name": "Identifier",
+ "src": "6987:2:0"
+ }
+ ],
+ "id": 1121,
+ "name": "MemberAccess",
+ "src": "6987:7:0"
+ }
+ ],
+ "id": 1122,
+ "name": "FunctionCall",
+ "src": "6951:44:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 1123,
+ "name": "Identifier",
+ "src": "7013:9:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1124,
+ "name": "Identifier",
+ "src": "7023:13:0"
+ }
+ ],
+ "id": 1125,
+ "name": "FunctionCall",
+ "src": "7013:24:0"
+ }
+ ],
+ "id": 1126,
+ "name": "ExpressionStatement",
+ "src": "7013:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 1127,
+ "name": "Identifier",
+ "src": "7074:16:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1128,
+ "name": "Identifier",
+ "src": "7091:13:0"
+ }
+ ],
+ "id": 1129,
+ "name": "FunctionCall",
+ "src": "7074:31:0"
+ }
+ ],
+ "id": 1130,
+ "name": "ExpressionStatement",
+ "src": "7074:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 1131,
+ "name": "Identifier",
+ "src": "7123:2:0"
+ }
+ ],
+ "id": 1133,
+ "name": "MemberAccess",
+ "src": "7123:11:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1134,
+ "name": "Literal",
+ "src": "7137:5:0"
+ }
+ ],
+ "id": 1135,
+ "name": "Assignment",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1136,
+ "name": "ExpressionStatement",
+ "src": "7123:19:0"
+ }
+ ],
+ "id": 1137,
+ "name": "Block",
+ "src": "7056:101:0"
+ }
+ ],
+ "id": 1138,
+ "name": "IfStatement",
+ "src": "6947:210:0"
+ }
+ ],
+ "id": 1139,
+ "name": "Block",
+ "src": "6843:324:0"
+ }
+ ],
+ "id": 1140,
+ "name": "IfStatement",
+ "src": "6811:356:0"
+ }
+ ],
+ "id": 1141,
+ "name": "Block",
+ "src": "6801:372:0"
+ }
+ ],
+ "id": 1142,
+ "name": "FunctionDefinition",
+ "src": "6699:474:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "isConfirmed",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1143,
+ "name": "ElementaryTypeName",
+ "src": "7345:4:0"
+ }
+ ],
+ "id": 1144,
+ "name": "VariableDeclaration",
+ "src": "7345:18:0"
+ }
+ ],
+ "id": 1145,
+ "name": "ParameterList",
+ "src": "7344:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1146,
+ "name": "ElementaryTypeName",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1147,
+ "name": "VariableDeclaration",
+ "src": "7414:4:0"
+ }
+ ],
+ "id": 1148,
+ "name": "ParameterList",
+ "src": "7413:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1149,
+ "name": "ElementaryTypeName",
+ "src": "7434:4:0"
+ }
+ ],
+ "id": 1150,
+ "name": "VariableDeclaration",
+ "src": "7434:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1151,
+ "name": "Literal",
+ "src": "7447:1:0"
+ }
+ ],
+ "id": 1152,
+ "name": "VariableDeclarationStatement",
+ "src": "7434:14:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1153,
+ "name": "ElementaryTypeName",
+ "src": "7463:4:0"
+ }
+ ],
+ "id": 1154,
+ "name": "VariableDeclaration",
+ "src": "7463:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1155,
+ "name": "Literal",
+ "src": "7470:1:0"
+ }
+ ],
+ "id": 1156,
+ "name": "VariableDeclarationStatement",
+ "src": "7463:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1157,
+ "name": "Identifier",
+ "src": "7473:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1158,
+ "name": "Identifier",
+ "src": "7475:6:0"
+ }
+ ],
+ "id": 1159,
+ "name": "MemberAccess",
+ "src": "7475:13:0"
+ }
+ ],
+ "id": 1160,
+ "name": "BinaryOperation",
+ "src": "7473:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1161,
+ "name": "Identifier",
+ "src": "7490:1:0"
+ }
+ ],
+ "id": 1162,
+ "name": "UnaryOperation",
+ "src": "7490:3:0"
+ }
+ ],
+ "id": 1163,
+ "name": "ExpressionStatement",
+ "src": "7490:3:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1164,
+ "name": "Identifier",
+ "src": "7513:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1165,
+ "name": "Identifier",
+ "src": "7527:13:0"
+ }
+ ],
+ "id": 1166,
+ "name": "IndexAccess",
+ "src": "7513:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1167,
+ "name": "Identifier",
+ "src": "7542:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1168,
+ "name": "Identifier",
+ "src": "7549:1:0"
+ }
+ ],
+ "id": 1169,
+ "name": "IndexAccess",
+ "src": "7542:9:0"
+ }
+ ],
+ "id": 1170,
+ "name": "IndexAccess",
+ "src": "7513:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1171,
+ "name": "Identifier",
+ "src": "7570:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1172,
+ "name": "Literal",
+ "src": "7579:1:0"
+ }
+ ],
+ "id": 1173,
+ "name": "Assignment",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1174,
+ "name": "ExpressionStatement",
+ "src": "7570:10:0"
+ }
+ ],
+ "id": 1175,
+ "name": "IfStatement",
+ "src": "7509:71:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1176,
+ "name": "Identifier",
+ "src": "7598:5:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "required"
+ },
+ "id": 1177,
+ "name": "Identifier",
+ "src": "7607:8:0"
+ }
+ ],
+ "id": 1178,
+ "name": "BinaryOperation",
+ "src": "7598:17:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 1179,
+ "name": "Literal",
+ "src": "7640:4:0"
+ }
+ ],
+ "id": 1180,
+ "name": "Return",
+ "src": "7633:11:0"
+ }
+ ],
+ "id": 1181,
+ "name": "IfStatement",
+ "src": "7594:50:0"
+ }
+ ],
+ "id": 1182,
+ "name": "Block",
+ "src": "7495:160:0"
+ }
+ ],
+ "id": 1183,
+ "name": "ForStatement",
+ "src": "7458:197:0"
+ }
+ ],
+ "id": 1184,
+ "name": "Block",
+ "src": "7424:237:0"
+ }
+ ],
+ "id": 1185,
+ "name": "FunctionDefinition",
+ "src": "7324:337:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "addTransaction",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1186,
+ "name": "ElementaryTypeName",
+ "src": "8018:7:0"
+ }
+ ],
+ "id": 1187,
+ "name": "VariableDeclaration",
+ "src": "8018:19:0"
+ },
+ {
+ "attributes": {
+ "name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1188,
+ "name": "ElementaryTypeName",
+ "src": "8039:4:0"
+ }
+ ],
+ "id": 1189,
+ "name": "VariableDeclaration",
+ "src": "8039:10:0"
+ },
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 1190,
+ "name": "ElementaryTypeName",
+ "src": "8051:5:0"
+ }
+ ],
+ "id": 1191,
+ "name": "VariableDeclaration",
+ "src": "8051:10:0"
+ }
+ ],
+ "id": 1192,
+ "name": "ParameterList",
+ "src": "8017:45:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1196,
+ "name": "ElementaryTypeName",
+ "src": "8126:4:0"
+ }
+ ],
+ "id": 1197,
+ "name": "VariableDeclaration",
+ "src": "8126:18:0"
+ }
+ ],
+ "id": 1198,
+ "name": "ParameterList",
+ "src": "8125:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 1193,
+ "name": "Identifier",
+ "src": "8088:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1194,
+ "name": "Identifier",
+ "src": "8096:11:0"
+ }
+ ],
+ "id": 1195,
+ "name": "ModifierInvocation",
+ "src": "8088:20:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1199,
+ "name": "Identifier",
+ "src": "8160:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1200,
+ "name": "Identifier",
+ "src": "8176:16:0"
+ }
+ ],
+ "id": 1201,
+ "name": "Assignment",
+ "src": "8160:32:0"
+ }
+ ],
+ "id": 1202,
+ "name": "ExpressionStatement",
+ "src": "8160:32:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1203,
+ "name": "Identifier",
+ "src": "8202:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1204,
+ "name": "Identifier",
+ "src": "8215:13:0"
+ }
+ ],
+ "id": 1205,
+ "name": "IndexAccess",
+ "src": "8202:27:0"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(struct MultiSigWallet.Transaction storage pointer)",
+ "value": "Transaction"
+ },
+ "id": 1206,
+ "name": "Identifier",
+ "src": "8232:11:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "destination"
+ },
+ "id": 1207,
+ "name": "Identifier",
+ "src": "8271:11:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "value"
+ },
+ "id": 1208,
+ "name": "Identifier",
+ "src": "8303:5:0"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 1209,
+ "name": "Identifier",
+ "src": "8328:4:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 1210,
+ "name": "Literal",
+ "src": "8356:5:0"
+ }
+ ],
+ "id": 1211,
+ "name": "FunctionCall",
+ "src": "8232:140:0"
+ }
+ ],
+ "id": 1212,
+ "name": "Assignment",
+ "src": "8202:170:0"
+ }
+ ],
+ "id": 1213,
+ "name": "ExpressionStatement",
+ "src": "8202:170:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1214,
+ "name": "Identifier",
+ "src": "8382:16:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1215,
+ "name": "Literal",
+ "src": "8402:1:0"
+ }
+ ],
+ "id": 1216,
+ "name": "Assignment",
+ "src": "8382:21:0"
+ }
+ ],
+ "id": 1217,
+ "name": "ExpressionStatement",
+ "src": "8382:21:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Submission"
+ },
+ "id": 1218,
+ "name": "Identifier",
+ "src": "8413:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1219,
+ "name": "Identifier",
+ "src": "8424:13:0"
+ }
+ ],
+ "id": 1220,
+ "name": "FunctionCall",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1221,
+ "name": "ExpressionStatement",
+ "src": "8413:25:0"
+ }
+ ],
+ "id": 1222,
+ "name": "Block",
+ "src": "8150:295:0"
+ }
+ ],
+ "id": 1223,
+ "name": "FunctionDefinition",
+ "src": "7994:451:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmationCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1224,
+ "name": "ElementaryTypeName",
+ "src": "8672:4:0"
+ }
+ ],
+ "id": 1225,
+ "name": "VariableDeclaration",
+ "src": "8672:18:0"
+ }
+ ],
+ "id": 1226,
+ "name": "ParameterList",
+ "src": "8671:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1227,
+ "name": "ElementaryTypeName",
+ "src": "8741:4:0"
+ }
+ ],
+ "id": 1228,
+ "name": "VariableDeclaration",
+ "src": "8741:10:0"
+ }
+ ],
+ "id": 1229,
+ "name": "ParameterList",
+ "src": "8740:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1230,
+ "name": "ElementaryTypeName",
+ "src": "8772:4:0"
+ }
+ ],
+ "id": 1231,
+ "name": "VariableDeclaration",
+ "src": "8772:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1232,
+ "name": "Literal",
+ "src": "8779:1:0"
+ }
+ ],
+ "id": 1233,
+ "name": "VariableDeclarationStatement",
+ "src": "8772:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1234,
+ "name": "Identifier",
+ "src": "8782:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1235,
+ "name": "Identifier",
+ "src": "8784:6:0"
+ }
+ ],
+ "id": 1236,
+ "name": "MemberAccess",
+ "src": "8784:13:0"
+ }
+ ],
+ "id": 1237,
+ "name": "BinaryOperation",
+ "src": "8782:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1238,
+ "name": "Identifier",
+ "src": "8799:1:0"
+ }
+ ],
+ "id": 1239,
+ "name": "UnaryOperation",
+ "src": "8799:3:0"
+ }
+ ],
+ "id": 1240,
+ "name": "ExpressionStatement",
+ "src": "8799:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1241,
+ "name": "Identifier",
+ "src": "8820:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1242,
+ "name": "Identifier",
+ "src": "8834:13:0"
+ }
+ ],
+ "id": 1243,
+ "name": "IndexAccess",
+ "src": "8820:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1244,
+ "name": "Identifier",
+ "src": "8849:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1245,
+ "name": "Identifier",
+ "src": "8856:1:0"
+ }
+ ],
+ "id": 1246,
+ "name": "IndexAccess",
+ "src": "8849:9:0"
+ }
+ ],
+ "id": 1247,
+ "name": "IndexAccess",
+ "src": "8820:39:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1248,
+ "name": "Identifier",
+ "src": "8877:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1249,
+ "name": "Literal",
+ "src": "8886:1:0"
+ }
+ ],
+ "id": 1250,
+ "name": "Assignment",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1251,
+ "name": "ExpressionStatement",
+ "src": "8877:10:0"
+ }
+ ],
+ "id": 1252,
+ "name": "IfStatement",
+ "src": "8816:71:0"
+ }
+ ],
+ "id": 1253,
+ "name": "ForStatement",
+ "src": "8767:120:0"
+ }
+ ],
+ "id": 1254,
+ "name": "Block",
+ "src": "8757:137:0"
+ }
+ ],
+ "id": 1255,
+ "name": "FunctionDefinition",
+ "src": "8642:252:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionCount",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1256,
+ "name": "ElementaryTypeName",
+ "src": "9185:4:0"
+ }
+ ],
+ "id": 1257,
+ "name": "VariableDeclaration",
+ "src": "9185:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1258,
+ "name": "ElementaryTypeName",
+ "src": "9199:4:0"
+ }
+ ],
+ "id": 1259,
+ "name": "VariableDeclaration",
+ "src": "9199:13:0"
+ }
+ ],
+ "id": 1260,
+ "name": "ParameterList",
+ "src": "9184:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1261,
+ "name": "ElementaryTypeName",
+ "src": "9263:4:0"
+ }
+ ],
+ "id": 1262,
+ "name": "VariableDeclaration",
+ "src": "9263:10:0"
+ }
+ ],
+ "id": 1263,
+ "name": "ParameterList",
+ "src": "9262:12:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1264,
+ "name": "ElementaryTypeName",
+ "src": "9294:4:0"
+ }
+ ],
+ "id": 1265,
+ "name": "VariableDeclaration",
+ "src": "9294:6:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1266,
+ "name": "Literal",
+ "src": "9301:1:0"
+ }
+ ],
+ "id": 1267,
+ "name": "VariableDeclarationStatement",
+ "src": "9294:8:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1268,
+ "name": "Identifier",
+ "src": "9304:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1269,
+ "name": "Identifier",
+ "src": "9306:16:0"
+ }
+ ],
+ "id": 1270,
+ "name": "BinaryOperation",
+ "src": "9304:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1271,
+ "name": "Identifier",
+ "src": "9324:1:0"
+ }
+ ],
+ "id": 1272,
+ "name": "UnaryOperation",
+ "src": "9324:3:0"
+ }
+ ],
+ "id": 1273,
+ "name": "ExpressionStatement",
+ "src": "9324:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1274,
+ "name": "Identifier",
+ "src": "9348:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1275,
+ "name": "Identifier",
+ "src": "9360:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1276,
+ "name": "Identifier",
+ "src": "9373:1:0"
+ }
+ ],
+ "id": 1277,
+ "name": "IndexAccess",
+ "src": "9360:15:0"
+ }
+ ],
+ "id": 1278,
+ "name": "MemberAccess",
+ "src": "9360:24:0"
+ }
+ ],
+ "id": 1279,
+ "name": "UnaryOperation",
+ "src": "9359:25:0"
+ }
+ ],
+ "id": 1280,
+ "name": "BinaryOperation",
+ "src": "9348:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1281,
+ "name": "Identifier",
+ "src": "9404:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1282,
+ "name": "Identifier",
+ "src": "9416:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1283,
+ "name": "Identifier",
+ "src": "9429:1:0"
+ }
+ ],
+ "id": 1284,
+ "name": "IndexAccess",
+ "src": "9416:15:0"
+ }
+ ],
+ "id": 1285,
+ "name": "MemberAccess",
+ "src": "9416:24:0"
+ }
+ ],
+ "id": 1286,
+ "name": "BinaryOperation",
+ "src": "9404:36:0"
+ }
+ ],
+ "id": 1287,
+ "name": "BinaryOperation",
+ "src": "9348:92:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1288,
+ "name": "Identifier",
+ "src": "9458:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1289,
+ "name": "Literal",
+ "src": "9467:1:0"
+ }
+ ],
+ "id": 1290,
+ "name": "Assignment",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1291,
+ "name": "ExpressionStatement",
+ "src": "9458:10:0"
+ }
+ ],
+ "id": 1292,
+ "name": "IfStatement",
+ "src": "9341:127:0"
+ }
+ ],
+ "id": 1293,
+ "name": "ForStatement",
+ "src": "9289:179:0"
+ }
+ ],
+ "id": 1294,
+ "name": "Block",
+ "src": "9279:196:0"
+ }
+ ],
+ "id": 1295,
+ "name": "FunctionDefinition",
+ "src": "9156:319:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getOwners",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 1296,
+ "name": "ParameterList",
+ "src": "9577:2:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1297,
+ "name": "ElementaryTypeName",
+ "src": "9629:7:0"
+ }
+ ],
+ "id": 1298,
+ "name": "ArrayTypeName",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1299,
+ "name": "VariableDeclaration",
+ "src": "9629:9:0"
+ }
+ ],
+ "id": 1300,
+ "name": "ParameterList",
+ "src": "9628:11:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1301,
+ "name": "Identifier",
+ "src": "9661:6:0"
+ }
+ ],
+ "id": 1302,
+ "name": "Return",
+ "src": "9654:13:0"
+ }
+ ],
+ "id": 1303,
+ "name": "Block",
+ "src": "9644:30:0"
+ }
+ ],
+ "id": 1304,
+ "name": "FunctionDefinition",
+ "src": "9559:115:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getConfirmations",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1305,
+ "name": "ElementaryTypeName",
+ "src": "9879:4:0"
+ }
+ ],
+ "id": 1306,
+ "name": "VariableDeclaration",
+ "src": "9879:18:0"
+ }
+ ],
+ "id": 1307,
+ "name": "ParameterList",
+ "src": "9878:20:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_confirmations",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1308,
+ "name": "ElementaryTypeName",
+ "src": "9948:7:0"
+ }
+ ],
+ "id": 1309,
+ "name": "ArrayTypeName",
+ "src": "9948:9:0"
+ }
+ ],
+ "id": 1310,
+ "name": "VariableDeclaration",
+ "src": "9948:24:0"
+ }
+ ],
+ "id": 1311,
+ "name": "ParameterList",
+ "src": "9947:26:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "confirmationsTemp",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1313,
+ "name": "ElementaryTypeName",
+ "src": "9988:7:0"
+ }
+ ],
+ "id": 1314,
+ "name": "ArrayTypeName",
+ "src": "9988:9:0"
+ }
+ ],
+ "id": 1315,
+ "name": "VariableDeclaration",
+ "src": "9988:34:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1316,
+ "name": "ElementaryTypeName",
+ "src": "10029:7:0"
+ }
+ ],
+ "id": 1317,
+ "name": "ArrayTypeName",
+ "src": "10029:9:0"
+ }
+ ],
+ "id": 1318,
+ "name": "NewExpression",
+ "src": "10025:13:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1319,
+ "name": "Identifier",
+ "src": "10039:6:0"
+ }
+ ],
+ "id": 1320,
+ "name": "MemberAccess",
+ "src": "10039:13:0"
+ }
+ ],
+ "id": 1321,
+ "name": "FunctionCall",
+ "src": "10025:28:0"
+ }
+ ],
+ "id": 1322,
+ "name": "VariableDeclarationStatement",
+ "src": "9988:65:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1323,
+ "name": "ElementaryTypeName",
+ "src": "10063:4:0"
+ }
+ ],
+ "id": 1324,
+ "name": "VariableDeclaration",
+ "src": "10063:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1325,
+ "name": "Literal",
+ "src": "10076:1:0"
+ }
+ ],
+ "id": 1326,
+ "name": "VariableDeclarationStatement",
+ "src": "10063:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1327,
+ "name": "ElementaryTypeName",
+ "src": "10087:4:0"
+ }
+ ],
+ "id": 1328,
+ "name": "VariableDeclaration",
+ "src": "10087:6:0"
+ }
+ ],
+ "id": 1329,
+ "name": "VariableDeclarationStatement",
+ "src": "10087:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1330,
+ "name": "Identifier",
+ "src": "10108:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1331,
+ "name": "Literal",
+ "src": "10110:1:0"
+ }
+ ],
+ "id": 1332,
+ "name": "Assignment",
+ "src": "10108:3:0"
+ }
+ ],
+ "id": 1333,
+ "name": "ExpressionStatement",
+ "src": "10108:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1334,
+ "name": "Identifier",
+ "src": "10113:1:0"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1335,
+ "name": "Identifier",
+ "src": "10115:6:0"
+ }
+ ],
+ "id": 1336,
+ "name": "MemberAccess",
+ "src": "10115:13:0"
+ }
+ ],
+ "id": 1337,
+ "name": "BinaryOperation",
+ "src": "10113:15:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1338,
+ "name": "Identifier",
+ "src": "10130:1:0"
+ }
+ ],
+ "id": 1339,
+ "name": "UnaryOperation",
+ "src": "10130:3:0"
+ }
+ ],
+ "id": 1340,
+ "name": "ExpressionStatement",
+ "src": "10130:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 1341,
+ "name": "Identifier",
+ "src": "10151:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 1342,
+ "name": "Identifier",
+ "src": "10165:13:0"
+ }
+ ],
+ "id": 1343,
+ "name": "IndexAccess",
+ "src": "10151:28:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1344,
+ "name": "Identifier",
+ "src": "10180:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1345,
+ "name": "Identifier",
+ "src": "10187:1:0"
+ }
+ ],
+ "id": 1346,
+ "name": "IndexAccess",
+ "src": "10180:9:0"
+ }
+ ],
+ "id": 1347,
+ "name": "IndexAccess",
+ "src": "10151:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1348,
+ "name": "Identifier",
+ "src": "10210:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1349,
+ "name": "Identifier",
+ "src": "10228:5:0"
+ }
+ ],
+ "id": 1350,
+ "name": "IndexAccess",
+ "src": "10210:24:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] storage ref",
+ "value": "owners"
+ },
+ "id": 1351,
+ "name": "Identifier",
+ "src": "10237:6:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1352,
+ "name": "Identifier",
+ "src": "10244:1:0"
+ }
+ ],
+ "id": 1353,
+ "name": "IndexAccess",
+ "src": "10237:9:0"
+ }
+ ],
+ "id": 1354,
+ "name": "Assignment",
+ "src": "10210:36:0"
+ }
+ ],
+ "id": 1355,
+ "name": "ExpressionStatement",
+ "src": "10210:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1356,
+ "name": "Identifier",
+ "src": "10264:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1357,
+ "name": "Literal",
+ "src": "10273:1:0"
+ }
+ ],
+ "id": 1358,
+ "name": "Assignment",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1359,
+ "name": "ExpressionStatement",
+ "src": "10264:10:0"
+ }
+ ],
+ "id": 1360,
+ "name": "Block",
+ "src": "10192:97:0"
+ }
+ ],
+ "id": 1361,
+ "name": "IfStatement",
+ "src": "10147:142:0"
+ }
+ ],
+ "id": 1362,
+ "name": "ForStatement",
+ "src": "10103:186:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1363,
+ "name": "Identifier",
+ "src": "10298:14:0"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (address[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 1364,
+ "name": "ElementaryTypeName",
+ "src": "10319:7:0"
+ }
+ ],
+ "id": 1365,
+ "name": "ArrayTypeName",
+ "src": "10319:9:0"
+ }
+ ],
+ "id": 1366,
+ "name": "NewExpression",
+ "src": "10315:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1367,
+ "name": "Identifier",
+ "src": "10329:5:0"
+ }
+ ],
+ "id": 1368,
+ "name": "FunctionCall",
+ "src": "10315:20:0"
+ }
+ ],
+ "id": 1369,
+ "name": "Assignment",
+ "src": "10298:37:0"
+ }
+ ],
+ "id": 1370,
+ "name": "ExpressionStatement",
+ "src": "10298:37:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1371,
+ "name": "Identifier",
+ "src": "10350:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1372,
+ "name": "Literal",
+ "src": "10352:1:0"
+ }
+ ],
+ "id": 1373,
+ "name": "Assignment",
+ "src": "10350:3:0"
+ }
+ ],
+ "id": 1374,
+ "name": "ExpressionStatement",
+ "src": "10350:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1375,
+ "name": "Identifier",
+ "src": "10355:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1376,
+ "name": "Identifier",
+ "src": "10357:5:0"
+ }
+ ],
+ "id": 1377,
+ "name": "BinaryOperation",
+ "src": "10355:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1378,
+ "name": "Identifier",
+ "src": "10364:1:0"
+ }
+ ],
+ "id": 1379,
+ "name": "UnaryOperation",
+ "src": "10364:3:0"
+ }
+ ],
+ "id": 1380,
+ "name": "ExpressionStatement",
+ "src": "10364:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_confirmations"
+ },
+ "id": 1381,
+ "name": "Identifier",
+ "src": "10381:14:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1382,
+ "name": "Identifier",
+ "src": "10396:1:0"
+ }
+ ],
+ "id": 1383,
+ "name": "IndexAccess",
+ "src": "10381:17:0"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "confirmationsTemp"
+ },
+ "id": 1384,
+ "name": "Identifier",
+ "src": "10401:17:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1385,
+ "name": "Identifier",
+ "src": "10419:1:0"
+ }
+ ],
+ "id": 1386,
+ "name": "IndexAccess",
+ "src": "10401:20:0"
+ }
+ ],
+ "id": 1387,
+ "name": "Assignment",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1388,
+ "name": "ExpressionStatement",
+ "src": "10381:40:0"
+ }
+ ],
+ "id": 1389,
+ "name": "ForStatement",
+ "src": "10345:76:0"
+ }
+ ],
+ "id": 1390,
+ "name": "Block",
+ "src": "9978:450:0"
+ }
+ ],
+ "id": 1391,
+ "name": "FunctionDefinition",
+ "src": "9853:575:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "getTransactionIds",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "from",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1392,
+ "name": "ElementaryTypeName",
+ "src": "10804:4:0"
+ }
+ ],
+ "id": 1393,
+ "name": "VariableDeclaration",
+ "src": "10804:9:0"
+ },
+ {
+ "attributes": {
+ "name": "to",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1394,
+ "name": "ElementaryTypeName",
+ "src": "10815:4:0"
+ }
+ ],
+ "id": 1395,
+ "name": "VariableDeclaration",
+ "src": "10815:7:0"
+ },
+ {
+ "attributes": {
+ "name": "pending",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1396,
+ "name": "ElementaryTypeName",
+ "src": "10824:4:0"
+ }
+ ],
+ "id": 1397,
+ "name": "VariableDeclaration",
+ "src": "10824:12:0"
+ },
+ {
+ "attributes": {
+ "name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 1398,
+ "name": "ElementaryTypeName",
+ "src": "10838:4:0"
+ }
+ ],
+ "id": 1399,
+ "name": "VariableDeclaration",
+ "src": "10838:13:0"
+ }
+ ],
+ "id": 1400,
+ "name": "ParameterList",
+ "src": "10803:49:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_transactionIds",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1401,
+ "name": "ElementaryTypeName",
+ "src": "10902:4:0"
+ }
+ ],
+ "id": 1402,
+ "name": "ArrayTypeName",
+ "src": "10902:6:0"
+ }
+ ],
+ "id": 1403,
+ "name": "VariableDeclaration",
+ "src": "10902:22:0"
+ }
+ ],
+ "id": 1404,
+ "name": "ParameterList",
+ "src": "10901:24:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionIdsTemp",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1406,
+ "name": "ElementaryTypeName",
+ "src": "10940:4:0"
+ }
+ ],
+ "id": 1407,
+ "name": "ArrayTypeName",
+ "src": "10940:6:0"
+ }
+ ],
+ "id": 1408,
+ "name": "VariableDeclaration",
+ "src": "10940:32:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1409,
+ "name": "ElementaryTypeName",
+ "src": "10979:4:0"
+ }
+ ],
+ "id": 1410,
+ "name": "ArrayTypeName",
+ "src": "10979:6:0"
+ }
+ ],
+ "id": 1411,
+ "name": "NewExpression",
+ "src": "10975:10:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1412,
+ "name": "Identifier",
+ "src": "10986:16:0"
+ }
+ ],
+ "id": 1413,
+ "name": "FunctionCall",
+ "src": "10975:28:0"
+ }
+ ],
+ "id": 1414,
+ "name": "VariableDeclarationStatement",
+ "src": "10940:63:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "count",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1415,
+ "name": "ElementaryTypeName",
+ "src": "11013:4:0"
+ }
+ ],
+ "id": 1416,
+ "name": "VariableDeclaration",
+ "src": "11013:10:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1417,
+ "name": "Literal",
+ "src": "11026:1:0"
+ }
+ ],
+ "id": 1418,
+ "name": "VariableDeclarationStatement",
+ "src": "11013:14:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1419,
+ "name": "ElementaryTypeName",
+ "src": "11037:4:0"
+ }
+ ],
+ "id": 1420,
+ "name": "VariableDeclaration",
+ "src": "11037:6:0"
+ }
+ ],
+ "id": 1421,
+ "name": "VariableDeclarationStatement",
+ "src": "11037:7:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1422,
+ "name": "Identifier",
+ "src": "11058:1:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 1423,
+ "name": "Literal",
+ "src": "11060:1:0"
+ }
+ ],
+ "id": 1424,
+ "name": "Assignment",
+ "src": "11058:3:0"
+ }
+ ],
+ "id": 1425,
+ "name": "ExpressionStatement",
+ "src": "11058:3:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1426,
+ "name": "Identifier",
+ "src": "11063:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionCount"
+ },
+ "id": 1427,
+ "name": "Identifier",
+ "src": "11065:16:0"
+ }
+ ],
+ "id": 1428,
+ "name": "BinaryOperation",
+ "src": "11063:18:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1429,
+ "name": "Identifier",
+ "src": "11083:1:0"
+ }
+ ],
+ "id": 1430,
+ "name": "UnaryOperation",
+ "src": "11083:3:0"
+ }
+ ],
+ "id": 1431,
+ "name": "ExpressionStatement",
+ "src": "11083:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "||",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "pending"
+ },
+ "id": 1432,
+ "name": "Identifier",
+ "src": "11107:7:0"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1433,
+ "name": "Identifier",
+ "src": "11119:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1434,
+ "name": "Identifier",
+ "src": "11132:1:0"
+ }
+ ],
+ "id": 1435,
+ "name": "IndexAccess",
+ "src": "11119:15:0"
+ }
+ ],
+ "id": 1436,
+ "name": "MemberAccess",
+ "src": "11119:24:0"
+ }
+ ],
+ "id": 1437,
+ "name": "UnaryOperation",
+ "src": "11118:25:0"
+ }
+ ],
+ "id": 1438,
+ "name": "BinaryOperation",
+ "src": "11107:36:0"
+ },
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "executed"
+ },
+ "id": 1439,
+ "name": "Identifier",
+ "src": "11163:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 1440,
+ "name": "Identifier",
+ "src": "11175:12:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1441,
+ "name": "Identifier",
+ "src": "11188:1:0"
+ }
+ ],
+ "id": 1442,
+ "name": "IndexAccess",
+ "src": "11175:15:0"
+ }
+ ],
+ "id": 1443,
+ "name": "MemberAccess",
+ "src": "11175:24:0"
+ }
+ ],
+ "id": 1444,
+ "name": "BinaryOperation",
+ "src": "11163:36:0"
+ }
+ ],
+ "id": 1445,
+ "name": "BinaryOperation",
+ "src": "11107:92:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1446,
+ "name": "Identifier",
+ "src": "11231:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1447,
+ "name": "Identifier",
+ "src": "11250:5:0"
+ }
+ ],
+ "id": 1448,
+ "name": "IndexAccess",
+ "src": "11231:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1449,
+ "name": "Identifier",
+ "src": "11259:1:0"
+ }
+ ],
+ "id": 1450,
+ "name": "Assignment",
+ "src": "11231:29:0"
+ }
+ ],
+ "id": 1451,
+ "name": "ExpressionStatement",
+ "src": "11231:29:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "count"
+ },
+ "id": 1452,
+ "name": "Identifier",
+ "src": "11278:5:0"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 1453,
+ "name": "Literal",
+ "src": "11287:1:0"
+ }
+ ],
+ "id": 1454,
+ "name": "Assignment",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1455,
+ "name": "ExpressionStatement",
+ "src": "11278:10:0"
+ }
+ ],
+ "id": 1456,
+ "name": "Block",
+ "src": "11213:90:0"
+ }
+ ],
+ "id": 1457,
+ "name": "IfStatement",
+ "src": "11100:203:0"
+ }
+ ],
+ "id": 1458,
+ "name": "ForStatement",
+ "src": "11053:250:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256[] memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1459,
+ "name": "Identifier",
+ "src": "11312:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) returns (uint256[] memory)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 1460,
+ "name": "ElementaryTypeName",
+ "src": "11334:4:0"
+ }
+ ],
+ "id": 1461,
+ "name": "ArrayTypeName",
+ "src": "11334:6:0"
+ }
+ ],
+ "id": 1462,
+ "name": "NewExpression",
+ "src": "11330:10:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1463,
+ "name": "Identifier",
+ "src": "11341:2:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1464,
+ "name": "Identifier",
+ "src": "11346:4:0"
+ }
+ ],
+ "id": 1465,
+ "name": "BinaryOperation",
+ "src": "11341:9:0"
+ }
+ ],
+ "id": 1466,
+ "name": "FunctionCall",
+ "src": "11330:21:0"
+ }
+ ],
+ "id": 1467,
+ "name": "Assignment",
+ "src": "11312:39:0"
+ }
+ ],
+ "id": 1468,
+ "name": "ExpressionStatement",
+ "src": "11312:39:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1469,
+ "name": "Identifier",
+ "src": "11366:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1470,
+ "name": "Identifier",
+ "src": "11368:4:0"
+ }
+ ],
+ "id": 1471,
+ "name": "Assignment",
+ "src": "11366:6:0"
+ }
+ ],
+ "id": 1472,
+ "name": "ExpressionStatement",
+ "src": "11366:6:0"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1473,
+ "name": "Identifier",
+ "src": "11374:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "to"
+ },
+ "id": 1474,
+ "name": "Identifier",
+ "src": "11376:2:0"
+ }
+ ],
+ "id": 1475,
+ "name": "BinaryOperation",
+ "src": "11374:4:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1476,
+ "name": "Identifier",
+ "src": "11380:1:0"
+ }
+ ],
+ "id": 1477,
+ "name": "UnaryOperation",
+ "src": "11380:3:0"
+ }
+ ],
+ "id": 1478,
+ "name": "ExpressionStatement",
+ "src": "11380:3:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "_transactionIds"
+ },
+ "id": 1479,
+ "name": "Identifier",
+ "src": "11397:15:0"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1480,
+ "name": "Identifier",
+ "src": "11413:1:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "from"
+ },
+ "id": 1481,
+ "name": "Identifier",
+ "src": "11417:4:0"
+ }
+ ],
+ "id": 1482,
+ "name": "BinaryOperation",
+ "src": "11413:8:0"
+ }
+ ],
+ "id": 1483,
+ "name": "IndexAccess",
+ "src": "11397:25:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256[] memory",
+ "value": "transactionIdsTemp"
+ },
+ "id": 1484,
+ "name": "Identifier",
+ "src": "11425:18:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 1485,
+ "name": "Identifier",
+ "src": "11444:1:0"
+ }
+ ],
+ "id": 1486,
+ "name": "IndexAccess",
+ "src": "11425:21:0"
+ }
+ ],
+ "id": 1487,
+ "name": "Assignment",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1488,
+ "name": "ExpressionStatement",
+ "src": "11397:49:0"
+ }
+ ],
+ "id": 1489,
+ "name": "ForStatement",
+ "src": "11361:85:0"
+ }
+ ],
+ "id": 1490,
+ "name": "Block",
+ "src": "10930:523:0"
+ }
+ ],
+ "id": 1491,
+ "name": "FunctionDefinition",
+ "src": "10777:676:0"
+ }
+ ],
+ "id": 1492,
+ "name": "ContractDefinition",
+ "src": "206:11249:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.sol": {
+ "id": "1",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 277,
+ "name": "PragmaDirective",
+ "src": "599:24:1"
+ },
+ {
+ "attributes": {
+ "file": "./MultiSigWallet.sol"
+ },
+ "id": 278,
+ "name": "ImportDirective",
+ "src": "625:30:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 529,
+ 1492
+ ],
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWallet"
+ },
+ "id": 279,
+ "name": "UserDefinedTypeName",
+ "src": "874:14:1"
+ }
+ ],
+ "id": 280,
+ "name": "InheritanceSpecifier",
+ "src": "874:14:1"
+ },
+ {
+ "attributes": {
+ "name": "ConfirmationTimeSet"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 281,
+ "name": "ElementaryTypeName",
+ "src": "922:4:1"
+ }
+ ],
+ "id": 282,
+ "name": "VariableDeclaration",
+ "src": "922:26:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 283,
+ "name": "ElementaryTypeName",
+ "src": "950:4:1"
+ }
+ ],
+ "id": 284,
+ "name": "VariableDeclaration",
+ "src": "950:21:1"
+ }
+ ],
+ "id": 285,
+ "name": "ParameterList",
+ "src": "921:51:1"
+ }
+ ],
+ "id": 286,
+ "name": "EventDefinition",
+ "src": "896:77:1"
+ },
+ {
+ "attributes": {
+ "name": "TimeLockChange"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 287,
+ "name": "ElementaryTypeName",
+ "src": "999:4:1"
+ }
+ ],
+ "id": 288,
+ "name": "VariableDeclaration",
+ "src": "999:22:1"
+ }
+ ],
+ "id": 289,
+ "name": "ParameterList",
+ "src": "998:24:1"
+ }
+ ],
+ "id": 290,
+ "name": "EventDefinition",
+ "src": "978:45:1"
+ },
+ {
+ "attributes": {
+ "name": "secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 291,
+ "name": "ElementaryTypeName",
+ "src": "1029:4:1"
+ }
+ ],
+ "id": 292,
+ "name": "VariableDeclaration",
+ "src": "1029:29:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTimes",
+ "type": "mapping(uint256 => uint256)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 293,
+ "name": "ElementaryTypeName",
+ "src": "1074:4:1"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 294,
+ "name": "ElementaryTypeName",
+ "src": "1082:4:1"
+ }
+ ],
+ "id": 295,
+ "name": "Mapping",
+ "src": "1065:22:1"
+ }
+ ],
+ "id": 296,
+ "name": "VariableDeclaration",
+ "src": "1065:47:1"
+ },
+ {
+ "attributes": {
+ "name": "notFullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 297,
+ "name": "ElementaryTypeName",
+ "src": "1146:4:1"
+ }
+ ],
+ "id": 298,
+ "name": "VariableDeclaration",
+ "src": "1146:18:1"
+ }
+ ],
+ "id": 299,
+ "name": "ParameterList",
+ "src": "1145:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 300,
+ "name": "Identifier",
+ "src": "1176:7:1"
+ },
+ {
+ "attributes": {
+ "operator": "!",
+ "prefix": true,
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 301,
+ "name": "Identifier",
+ "src": "1185:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 302,
+ "name": "Identifier",
+ "src": "1197:13:1"
+ }
+ ],
+ "id": 303,
+ "name": "FunctionCall",
+ "src": "1185:26:1"
+ }
+ ],
+ "id": 304,
+ "name": "UnaryOperation",
+ "src": "1184:27:1"
+ }
+ ],
+ "id": 305,
+ "name": "FunctionCall",
+ "src": "1176:36:1"
+ }
+ ],
+ "id": 306,
+ "name": "ExpressionStatement",
+ "src": "1176:36:1"
+ },
+ {
+ "id": 307,
+ "name": "PlaceholderStatement",
+ "src": "1222:1:1"
+ }
+ ],
+ "id": 308,
+ "name": "Block",
+ "src": "1166:64:1"
+ }
+ ],
+ "id": 309,
+ "name": "ModifierDefinition",
+ "src": "1119:111:1"
+ },
+ {
+ "attributes": {
+ "name": "fullyConfirmed"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 310,
+ "name": "ElementaryTypeName",
+ "src": "1260:4:1"
+ }
+ ],
+ "id": 311,
+ "name": "VariableDeclaration",
+ "src": "1260:18:1"
+ }
+ ],
+ "id": 312,
+ "name": "ParameterList",
+ "src": "1259:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 313,
+ "name": "Identifier",
+ "src": "1290:7:1"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 314,
+ "name": "Identifier",
+ "src": "1298:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 315,
+ "name": "Identifier",
+ "src": "1310:13:1"
+ }
+ ],
+ "id": 316,
+ "name": "FunctionCall",
+ "src": "1298:26:1"
+ }
+ ],
+ "id": 317,
+ "name": "FunctionCall",
+ "src": "1290:35:1"
+ }
+ ],
+ "id": 318,
+ "name": "ExpressionStatement",
+ "src": "1290:35:1"
+ },
+ {
+ "id": 319,
+ "name": "PlaceholderStatement",
+ "src": "1335:1:1"
+ }
+ ],
+ "id": 320,
+ "name": "Block",
+ "src": "1280:63:1"
+ }
+ ],
+ "id": 321,
+ "name": "ModifierDefinition",
+ "src": "1236:107:1"
+ },
+ {
+ "attributes": {
+ "name": "pastTimeLock"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 322,
+ "name": "ElementaryTypeName",
+ "src": "1371:4:1"
+ }
+ ],
+ "id": 323,
+ "name": "VariableDeclaration",
+ "src": "1371:18:1"
+ }
+ ],
+ "id": 324,
+ "name": "ParameterList",
+ "src": "1370:20:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 325,
+ "name": "Identifier",
+ "src": "1401:7:1"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 326,
+ "name": "Identifier",
+ "src": "1409:5:1"
+ }
+ ],
+ "id": 327,
+ "name": "MemberAccess",
+ "src": "1409:15:1"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 328,
+ "name": "Identifier",
+ "src": "1428:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 329,
+ "name": "Identifier",
+ "src": "1446:13:1"
+ }
+ ],
+ "id": 330,
+ "name": "IndexAccess",
+ "src": "1428:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 331,
+ "name": "Identifier",
+ "src": "1463:17:1"
+ }
+ ],
+ "id": 332,
+ "name": "BinaryOperation",
+ "src": "1428:52:1"
+ }
+ ],
+ "id": 333,
+ "name": "BinaryOperation",
+ "src": "1409:71:1"
+ }
+ ],
+ "id": 334,
+ "name": "FunctionCall",
+ "src": "1401:80:1"
+ }
+ ],
+ "id": 335,
+ "name": "ExpressionStatement",
+ "src": "1401:80:1"
+ },
+ {
+ "id": 336,
+ "name": "PlaceholderStatement",
+ "src": "1491:1:1"
+ }
+ ],
+ "id": 337,
+ "name": "Block",
+ "src": "1391:108:1"
+ }
+ ],
+ "id": 338,
+ "name": "ModifierDefinition",
+ "src": "1349:150:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "MultiSigWalletWithTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 339,
+ "name": "ElementaryTypeName",
+ "src": "1920:7:1"
+ }
+ ],
+ "id": 340,
+ "name": "ArrayTypeName",
+ "src": "1920:9:1"
+ }
+ ],
+ "id": 341,
+ "name": "VariableDeclaration",
+ "src": "1920:17:1"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 342,
+ "name": "ElementaryTypeName",
+ "src": "1939:4:1"
+ }
+ ],
+ "id": 343,
+ "name": "VariableDeclaration",
+ "src": "1939:14:1"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 344,
+ "name": "ElementaryTypeName",
+ "src": "1955:4:1"
+ }
+ ],
+ "id": 345,
+ "name": "VariableDeclaration",
+ "src": "1955:23:1"
+ }
+ ],
+ "id": 346,
+ "name": "ParameterList",
+ "src": "1919:60:1"
+ },
+ {
+ "children": [],
+ "id": 351,
+ "name": "ParameterList",
+ "src": "2042:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWallet)",
+ "value": "MultiSigWallet"
+ },
+ "id": 347,
+ "name": "Identifier",
+ "src": "2003:14:1"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 348,
+ "name": "Identifier",
+ "src": "2018:7:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 349,
+ "name": "Identifier",
+ "src": "2027:9:1"
+ }
+ ],
+ "id": 350,
+ "name": "ModifierInvocation",
+ "src": "2003:34:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 352,
+ "name": "Identifier",
+ "src": "2052:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 353,
+ "name": "Identifier",
+ "src": "2072:18:1"
+ }
+ ],
+ "id": 354,
+ "name": "Assignment",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 355,
+ "name": "ExpressionStatement",
+ "src": "2052:38:1"
+ }
+ ],
+ "id": 356,
+ "name": "Block",
+ "src": "2042:55:1"
+ }
+ ],
+ "id": 357,
+ "name": "FunctionDefinition",
+ "src": "1884:213:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "changeTimeLock",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 358,
+ "name": "ElementaryTypeName",
+ "src": "2325:4:1"
+ }
+ ],
+ "id": 359,
+ "name": "VariableDeclaration",
+ "src": "2325:23:1"
+ }
+ ],
+ "id": 360,
+ "name": "ParameterList",
+ "src": "2324:25:1"
+ },
+ {
+ "children": [],
+ "id": 363,
+ "name": "ParameterList",
+ "src": "2388:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 361,
+ "name": "Identifier",
+ "src": "2373:10:1"
+ }
+ ],
+ "id": 362,
+ "name": "ModifierInvocation",
+ "src": "2373:10:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "secondsTimeLocked"
+ },
+ "id": 364,
+ "name": "Identifier",
+ "src": "2398:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 365,
+ "name": "Identifier",
+ "src": "2418:18:1"
+ }
+ ],
+ "id": 366,
+ "name": "Assignment",
+ "src": "2398:38:1"
+ }
+ ],
+ "id": 367,
+ "name": "ExpressionStatement",
+ "src": "2398:38:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "TimeLockChange"
+ },
+ "id": 368,
+ "name": "Identifier",
+ "src": "2446:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 369,
+ "name": "Identifier",
+ "src": "2461:18:1"
+ }
+ ],
+ "id": 370,
+ "name": "FunctionCall",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 371,
+ "name": "ExpressionStatement",
+ "src": "2446:34:1"
+ }
+ ],
+ "id": 372,
+ "name": "Block",
+ "src": "2388:99:1"
+ }
+ ],
+ "id": 373,
+ "name": "FunctionDefinition",
+ "src": "2301:186:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "confirmTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 374,
+ "name": "ElementaryTypeName",
+ "src": "2621:4:1"
+ }
+ ],
+ "id": 375,
+ "name": "VariableDeclaration",
+ "src": "2621:18:1"
+ }
+ ],
+ "id": 376,
+ "name": "ParameterList",
+ "src": "2620:20:1"
+ },
+ {
+ "children": [],
+ "id": 392,
+ "name": "ParameterList",
+ "src": "2822:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 377,
+ "name": "Identifier",
+ "src": "2664:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 378,
+ "name": "Identifier",
+ "src": "2676:3:1"
+ }
+ ],
+ "id": 379,
+ "name": "MemberAccess",
+ "src": "2676:10:1"
+ }
+ ],
+ "id": 380,
+ "name": "ModifierInvocation",
+ "src": "2664:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "transactionExists"
+ },
+ "id": 381,
+ "name": "Identifier",
+ "src": "2696:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 382,
+ "name": "Identifier",
+ "src": "2714:13:1"
+ }
+ ],
+ "id": 383,
+ "name": "ModifierInvocation",
+ "src": "2696:32:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "notConfirmed"
+ },
+ "id": 384,
+ "name": "Identifier",
+ "src": "2737:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 385,
+ "name": "Identifier",
+ "src": "2750:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 386,
+ "name": "Identifier",
+ "src": "2765:3:1"
+ }
+ ],
+ "id": 387,
+ "name": "MemberAccess",
+ "src": "2765:10:1"
+ }
+ ],
+ "id": 388,
+ "name": "ModifierInvocation",
+ "src": "2737:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 389,
+ "name": "Identifier",
+ "src": "2785:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 390,
+ "name": "Identifier",
+ "src": "2803:13:1"
+ }
+ ],
+ "id": 391,
+ "name": "ModifierInvocation",
+ "src": "2785:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 393,
+ "name": "Identifier",
+ "src": "2832:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 394,
+ "name": "Identifier",
+ "src": "2846:13:1"
+ }
+ ],
+ "id": 397,
+ "name": "IndexAccess",
+ "src": "2832:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 395,
+ "name": "Identifier",
+ "src": "2861:3:1"
+ }
+ ],
+ "id": 396,
+ "name": "MemberAccess",
+ "src": "2861:10:1"
+ }
+ ],
+ "id": 398,
+ "name": "IndexAccess",
+ "src": "2832:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 399,
+ "name": "Literal",
+ "src": "2875:4:1"
+ }
+ ],
+ "id": 400,
+ "name": "Assignment",
+ "src": "2832:47:1"
+ }
+ ],
+ "id": 401,
+ "name": "ExpressionStatement",
+ "src": "2832:47:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Confirmation"
+ },
+ "id": 402,
+ "name": "Identifier",
+ "src": "2889:12:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 403,
+ "name": "Identifier",
+ "src": "2902:3:1"
+ }
+ ],
+ "id": 404,
+ "name": "MemberAccess",
+ "src": "2902:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 405,
+ "name": "Identifier",
+ "src": "2914:13:1"
+ }
+ ],
+ "id": 406,
+ "name": "FunctionCall",
+ "src": "2889:39:1"
+ }
+ ],
+ "id": 407,
+ "name": "ExpressionStatement",
+ "src": "2889:39:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant returns (bool)",
+ "value": "isConfirmed"
+ },
+ "id": 408,
+ "name": "Identifier",
+ "src": "2942:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 409,
+ "name": "Identifier",
+ "src": "2954:13:1"
+ }
+ ],
+ "id": 410,
+ "name": "FunctionCall",
+ "src": "2942:26:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256)",
+ "value": "setConfirmationTime"
+ },
+ "id": 411,
+ "name": "Identifier",
+ "src": "2984:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 412,
+ "name": "Identifier",
+ "src": "3004:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "timestamp",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "block",
+ "value": "block"
+ },
+ "id": 413,
+ "name": "Identifier",
+ "src": "3019:5:1"
+ }
+ ],
+ "id": 414,
+ "name": "MemberAccess",
+ "src": "3019:15:1"
+ }
+ ],
+ "id": 415,
+ "name": "FunctionCall",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 416,
+ "name": "ExpressionStatement",
+ "src": "2984:51:1"
+ }
+ ],
+ "id": 417,
+ "name": "Block",
+ "src": "2970:76:1"
+ }
+ ],
+ "id": 418,
+ "name": "IfStatement",
+ "src": "2938:108:1"
+ }
+ ],
+ "id": 419,
+ "name": "Block",
+ "src": "2822:230:1"
+ }
+ ],
+ "id": 420,
+ "name": "FunctionDefinition",
+ "src": "2593:459:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "revokeConfirmation",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 421,
+ "name": "ElementaryTypeName",
+ "src": "3204:4:1"
+ }
+ ],
+ "id": 422,
+ "name": "VariableDeclaration",
+ "src": "3204:18:1"
+ }
+ ],
+ "id": 423,
+ "name": "ParameterList",
+ "src": "3203:20:1"
+ },
+ {
+ "children": [],
+ "id": 439,
+ "name": "ParameterList",
+ "src": "3396:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "ownerExists"
+ },
+ "id": 424,
+ "name": "Identifier",
+ "src": "3247:11:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 425,
+ "name": "Identifier",
+ "src": "3259:3:1"
+ }
+ ],
+ "id": 426,
+ "name": "MemberAccess",
+ "src": "3259:10:1"
+ }
+ ],
+ "id": 427,
+ "name": "ModifierInvocation",
+ "src": "3247:23:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256,address)",
+ "value": "confirmed"
+ },
+ "id": 428,
+ "name": "Identifier",
+ "src": "3279:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 429,
+ "name": "Identifier",
+ "src": "3289:13:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 430,
+ "name": "Identifier",
+ "src": "3304:3:1"
+ }
+ ],
+ "id": 431,
+ "name": "MemberAccess",
+ "src": "3304:10:1"
+ }
+ ],
+ "id": 432,
+ "name": "ModifierInvocation",
+ "src": "3279:36:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 433,
+ "name": "Identifier",
+ "src": "3324:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 434,
+ "name": "Identifier",
+ "src": "3336:13:1"
+ }
+ ],
+ "id": 435,
+ "name": "ModifierInvocation",
+ "src": "3324:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notFullyConfirmed"
+ },
+ "id": 436,
+ "name": "Identifier",
+ "src": "3359:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 437,
+ "name": "Identifier",
+ "src": "3377:13:1"
+ }
+ ],
+ "id": 438,
+ "name": "ModifierInvocation",
+ "src": "3359:32:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => mapping(address => bool))",
+ "value": "confirmations"
+ },
+ "id": 440,
+ "name": "Identifier",
+ "src": "3406:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 441,
+ "name": "Identifier",
+ "src": "3420:13:1"
+ }
+ ],
+ "id": 444,
+ "name": "IndexAccess",
+ "src": "3406:28:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 442,
+ "name": "Identifier",
+ "src": "3435:3:1"
+ }
+ ],
+ "id": 443,
+ "name": "MemberAccess",
+ "src": "3435:10:1"
+ }
+ ],
+ "id": 445,
+ "name": "IndexAccess",
+ "src": "3406:40:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 446,
+ "name": "Literal",
+ "src": "3449:5:1"
+ }
+ ],
+ "id": 447,
+ "name": "Assignment",
+ "src": "3406:48:1"
+ }
+ ],
+ "id": 448,
+ "name": "ExpressionStatement",
+ "src": "3406:48:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,uint256) constant",
+ "value": "Revocation"
+ },
+ "id": 449,
+ "name": "Identifier",
+ "src": "3464:10:1"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 450,
+ "name": "Identifier",
+ "src": "3475:3:1"
+ }
+ ],
+ "id": 451,
+ "name": "MemberAccess",
+ "src": "3475:10:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 452,
+ "name": "Identifier",
+ "src": "3487:13:1"
+ }
+ ],
+ "id": 453,
+ "name": "FunctionCall",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 454,
+ "name": "ExpressionStatement",
+ "src": "3464:37:1"
+ }
+ ],
+ "id": 455,
+ "name": "Block",
+ "src": "3396:112:1"
+ }
+ ],
+ "id": 456,
+ "name": "FunctionDefinition",
+ "src": "3176:332:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeTransaction",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 457,
+ "name": "ElementaryTypeName",
+ "src": "3650:4:1"
+ }
+ ],
+ "id": 458,
+ "name": "VariableDeclaration",
+ "src": "3650:18:1"
+ }
+ ],
+ "id": 459,
+ "name": "ParameterList",
+ "src": "3649:20:1"
+ },
+ {
+ "children": [],
+ "id": 469,
+ "name": "ParameterList",
+ "src": "3798:0:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 460,
+ "name": "Identifier",
+ "src": "3693:11:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 461,
+ "name": "Identifier",
+ "src": "3705:13:1"
+ }
+ ],
+ "id": 462,
+ "name": "ModifierInvocation",
+ "src": "3693:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 463,
+ "name": "Identifier",
+ "src": "3728:14:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 464,
+ "name": "Identifier",
+ "src": "3743:13:1"
+ }
+ ],
+ "id": 465,
+ "name": "ModifierInvocation",
+ "src": "3728:29:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "pastTimeLock"
+ },
+ "id": 466,
+ "name": "Identifier",
+ "src": "3766:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 467,
+ "name": "Identifier",
+ "src": "3779:13:1"
+ }
+ ],
+ "id": 468,
+ "name": "ModifierInvocation",
+ "src": "3766:27:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 470,
+ "name": "UserDefinedTypeName",
+ "src": "3808:11:1"
+ }
+ ],
+ "id": 471,
+ "name": "VariableDeclaration",
+ "src": "3808:22:1"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 472,
+ "name": "Identifier",
+ "src": "3833:12:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 473,
+ "name": "Identifier",
+ "src": "3846:13:1"
+ }
+ ],
+ "id": 474,
+ "name": "IndexAccess",
+ "src": "3833:27:1"
+ }
+ ],
+ "id": 475,
+ "name": "VariableDeclarationStatement",
+ "src": "3808:52:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 476,
+ "name": "Identifier",
+ "src": "3870:2:1"
+ }
+ ],
+ "id": 478,
+ "name": "MemberAccess",
+ "src": "3870:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 479,
+ "name": "Literal",
+ "src": "3884:4:1"
+ }
+ ],
+ "id": 480,
+ "name": "Assignment",
+ "src": "3870:18:1"
+ }
+ ],
+ "id": 481,
+ "name": "ExpressionStatement",
+ "src": "3870:18:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 482,
+ "name": "Identifier",
+ "src": "3902:2:1"
+ }
+ ],
+ "id": 483,
+ "name": "MemberAccess",
+ "src": "3902:14:1"
+ }
+ ],
+ "id": 484,
+ "name": "MemberAccess",
+ "src": "3902:19:1"
+ }
+ ],
+ "id": 485,
+ "name": "MemberAccess",
+ "src": "3902:25:1"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 486,
+ "name": "Identifier",
+ "src": "3928:2:1"
+ }
+ ],
+ "id": 487,
+ "name": "MemberAccess",
+ "src": "3928:8:1"
+ }
+ ],
+ "id": 488,
+ "name": "FunctionCall",
+ "src": "3902:35:1"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 489,
+ "name": "Identifier",
+ "src": "3938:2:1"
+ }
+ ],
+ "id": 490,
+ "name": "MemberAccess",
+ "src": "3938:7:1"
+ }
+ ],
+ "id": 491,
+ "name": "FunctionCall",
+ "src": "3902:44:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 492,
+ "name": "Identifier",
+ "src": "3960:9:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 493,
+ "name": "Identifier",
+ "src": "3970:13:1"
+ }
+ ],
+ "id": 494,
+ "name": "FunctionCall",
+ "src": "3960:24:1"
+ }
+ ],
+ "id": 495,
+ "name": "ExpressionStatement",
+ "src": "3960:24:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 496,
+ "name": "Identifier",
+ "src": "4013:16:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 497,
+ "name": "Identifier",
+ "src": "4030:13:1"
+ }
+ ],
+ "id": 498,
+ "name": "FunctionCall",
+ "src": "4013:31:1"
+ }
+ ],
+ "id": 499,
+ "name": "ExpressionStatement",
+ "src": "4013:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 500,
+ "name": "Identifier",
+ "src": "4058:2:1"
+ }
+ ],
+ "id": 502,
+ "name": "MemberAccess",
+ "src": "4058:11:1"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 503,
+ "name": "Literal",
+ "src": "4072:5:1"
+ }
+ ],
+ "id": 504,
+ "name": "Assignment",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 505,
+ "name": "ExpressionStatement",
+ "src": "4058:19:1"
+ }
+ ],
+ "id": 506,
+ "name": "Block",
+ "src": "3999:89:1"
+ }
+ ],
+ "id": 507,
+ "name": "IfStatement",
+ "src": "3898:190:1"
+ }
+ ],
+ "id": 508,
+ "name": "Block",
+ "src": "3798:296:1"
+ }
+ ],
+ "id": 509,
+ "name": "FunctionDefinition",
+ "src": "3622:472:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "setConfirmationTime",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 510,
+ "name": "ElementaryTypeName",
+ "src": "4233:4:1"
+ }
+ ],
+ "id": 511,
+ "name": "VariableDeclaration",
+ "src": "4233:18:1"
+ },
+ {
+ "attributes": {
+ "name": "confirmationTime",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 512,
+ "name": "ElementaryTypeName",
+ "src": "4253:4:1"
+ }
+ ],
+ "id": 513,
+ "name": "VariableDeclaration",
+ "src": "4253:21:1"
+ }
+ ],
+ "id": 514,
+ "name": "ParameterList",
+ "src": "4232:43:1"
+ },
+ {
+ "children": [],
+ "id": 515,
+ "name": "ParameterList",
+ "src": "4297:0:1"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => uint256)",
+ "value": "confirmationTimes"
+ },
+ "id": 516,
+ "name": "Identifier",
+ "src": "4307:17:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 517,
+ "name": "Identifier",
+ "src": "4325:13:1"
+ }
+ ],
+ "id": 518,
+ "name": "IndexAccess",
+ "src": "4307:32:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 519,
+ "name": "Identifier",
+ "src": "4342:16:1"
+ }
+ ],
+ "id": 520,
+ "name": "Assignment",
+ "src": "4307:51:1"
+ }
+ ],
+ "id": 521,
+ "name": "ExpressionStatement",
+ "src": "4307:51:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256,uint256) constant",
+ "value": "ConfirmationTimeSet"
+ },
+ "id": 522,
+ "name": "Identifier",
+ "src": "4368:19:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 523,
+ "name": "Identifier",
+ "src": "4388:13:1"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "confirmationTime"
+ },
+ "id": 524,
+ "name": "Identifier",
+ "src": "4403:16:1"
+ }
+ ],
+ "id": 525,
+ "name": "FunctionCall",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 526,
+ "name": "ExpressionStatement",
+ "src": "4368:52:1"
+ }
+ ],
+ "id": 527,
+ "name": "Block",
+ "src": "4297:130:1"
+ }
+ ],
+ "id": 528,
+ "name": "FunctionDefinition",
+ "src": "4204:223:1"
+ }
+ ],
+ "id": 529,
+ "name": "ContractDefinition",
+ "src": "835:3594:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol": {
+ "id": "2",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 74,
+ "name": "PragmaDirective",
+ "src": "580:23:2"
+ },
+ {
+ "attributes": {
+ "file": "../../multisig/MultiSigWalletWithTimeLock.sol"
+ },
+ "id": 75,
+ "name": "ImportDirective",
+ "src": "605:55:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 275,
+ 529,
+ 1492
+ ],
+ "name": "AssetProxyOwner"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "MultiSigWalletWithTimeLock"
+ },
+ "id": 76,
+ "name": "UserDefinedTypeName",
+ "src": "695:26:2"
+ }
+ ],
+ "id": 77,
+ "name": "InheritanceSpecifier",
+ "src": "695:26:2"
+ },
+ {
+ "attributes": {
+ "name": "AssetProxyRegistration"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 78,
+ "name": "ElementaryTypeName",
+ "src": "758:7:2"
+ }
+ ],
+ "id": 79,
+ "name": "VariableDeclaration",
+ "src": "758:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 80,
+ "name": "ElementaryTypeName",
+ "src": "786:4:2"
+ }
+ ],
+ "id": 81,
+ "name": "VariableDeclaration",
+ "src": "786:17:2"
+ }
+ ],
+ "id": 82,
+ "name": "ParameterList",
+ "src": "757:47:2"
+ }
+ ],
+ "id": 83,
+ "name": "EventDefinition",
+ "src": "729:76:2"
+ },
+ {
+ "attributes": {
+ "name": "isAssetProxyRegistered",
+ "type": "mapping(address => bool)"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 84,
+ "name": "ElementaryTypeName",
+ "src": "990:7:2"
+ },
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 85,
+ "name": "ElementaryTypeName",
+ "src": "1001:4:2"
+ }
+ ],
+ "id": 86,
+ "name": "Mapping",
+ "src": "981:25:2"
+ }
+ ],
+ "id": 87,
+ "name": "VariableDeclaration",
+ "src": "981:55:2"
+ },
+ {
+ "attributes": {
+ "name": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 88,
+ "name": "ElementaryTypeName",
+ "src": "1043:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(bytes4)",
+ "value": "bytes4"
+ },
+ "id": 89,
+ "name": "ElementaryTypeNameExpression",
+ "src": "1114:6:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes32",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () returns (bytes32)",
+ "value": "keccak256"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1121:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "72656d6f7665417574686f72697a6564416464726573734174496e64657828616464726573732c75696e7432353629",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"removeAuthorizedAddressAtIndex(address,uint256)\"",
+ "value": "removeAuthorizedAddressAtIndex(address,uint256)"
+ },
+ "id": 91,
+ "name": "Literal",
+ "src": "1131:49:2"
+ }
+ ],
+ "id": 92,
+ "name": "FunctionCall",
+ "src": "1121:60:2"
+ }
+ ],
+ "id": 93,
+ "name": "FunctionCall",
+ "src": "1114:68:2"
+ }
+ ],
+ "id": 94,
+ "name": "VariableDeclaration",
+ "src": "1043:139:2"
+ },
+ {
+ "attributes": {
+ "name": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 95,
+ "name": "ElementaryTypeName",
+ "src": "1385:7:2"
+ }
+ ],
+ "id": 96,
+ "name": "VariableDeclaration",
+ "src": "1385:21:2"
+ }
+ ],
+ "id": 97,
+ "name": "ParameterList",
+ "src": "1384:23:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 98,
+ "name": "UserDefinedTypeName",
+ "src": "1418:11:2"
+ }
+ ],
+ "id": 99,
+ "name": "VariableDeclaration",
+ "src": "1418:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1443:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 101,
+ "name": "Identifier",
+ "src": "1456:13:2"
+ }
+ ],
+ "id": 102,
+ "name": "IndexAccess",
+ "src": "1443:27:2"
+ }
+ ],
+ "id": 103,
+ "name": "VariableDeclarationStatement",
+ "src": "1418:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 104,
+ "name": "Identifier",
+ "src": "1480:7:2"
+ },
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 105,
+ "name": "Identifier",
+ "src": "1488:22:2"
+ },
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 106,
+ "name": "Identifier",
+ "src": "1511:2:2"
+ }
+ ],
+ "id": 107,
+ "name": "MemberAccess",
+ "src": "1511:14:2"
+ }
+ ],
+ "id": 108,
+ "name": "IndexAccess",
+ "src": "1488:38:2"
+ }
+ ],
+ "id": 109,
+ "name": "FunctionCall",
+ "src": "1480:47:2"
+ }
+ ],
+ "id": 110,
+ "name": "ExpressionStatement",
+ "src": "1480:47:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "1537:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bytes memory,uint256) returns (bytes4)",
+ "value": "readBytes4"
+ },
+ "id": 112,
+ "name": "Identifier",
+ "src": "1545:10:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 113,
+ "name": "Identifier",
+ "src": "1556:2:2"
+ }
+ ],
+ "id": 114,
+ "name": "MemberAccess",
+ "src": "1556:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 115,
+ "name": "Literal",
+ "src": "1565:1:2"
+ }
+ ],
+ "id": 116,
+ "name": "FunctionCall",
+ "src": "1545:22:2"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR"
+ },
+ "id": 117,
+ "name": "Identifier",
+ "src": "1571:43:2"
+ }
+ ],
+ "id": 118,
+ "name": "BinaryOperation",
+ "src": "1545:69:2"
+ }
+ ],
+ "id": 119,
+ "name": "FunctionCall",
+ "src": "1537:78:2"
+ }
+ ],
+ "id": 120,
+ "name": "ExpressionStatement",
+ "src": "1537:78:2"
+ },
+ {
+ "id": 121,
+ "name": "PlaceholderStatement",
+ "src": "1625:1:2"
+ }
+ ],
+ "id": 122,
+ "name": "Block",
+ "src": "1408:225:2"
+ }
+ ],
+ "id": 123,
+ "name": "ModifierDefinition",
+ "src": "1338:295:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "AssetProxyOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 124,
+ "name": "ElementaryTypeName",
+ "src": "2131:7:2"
+ }
+ ],
+ "id": 125,
+ "name": "ArrayTypeName",
+ "src": "2131:9:2"
+ }
+ ],
+ "id": 126,
+ "name": "VariableDeclaration",
+ "src": "2131:24:2"
+ },
+ {
+ "attributes": {
+ "name": "_assetProxyContracts",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 127,
+ "name": "ElementaryTypeName",
+ "src": "2165:7:2"
+ }
+ ],
+ "id": 128,
+ "name": "ArrayTypeName",
+ "src": "2165:9:2"
+ }
+ ],
+ "id": 129,
+ "name": "VariableDeclaration",
+ "src": "2165:37:2"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 130,
+ "name": "ElementaryTypeName",
+ "src": "2212:7:2"
+ }
+ ],
+ "id": 131,
+ "name": "VariableDeclaration",
+ "src": "2212:17:2"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 132,
+ "name": "ElementaryTypeName",
+ "src": "2239:7:2"
+ }
+ ],
+ "id": 133,
+ "name": "VariableDeclaration",
+ "src": "2239:26:2"
+ }
+ ],
+ "id": 134,
+ "name": "ParameterList",
+ "src": "2121:150:2"
+ },
+ {
+ "children": [],
+ "id": 140,
+ "name": "ParameterList",
+ "src": "2366:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract MultiSigWalletWithTimeLock)",
+ "value": "MultiSigWalletWithTimeLock"
+ },
+ "id": 135,
+ "name": "Identifier",
+ "src": "2295:26:2"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 136,
+ "name": "Identifier",
+ "src": "2322:7:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 137,
+ "name": "Identifier",
+ "src": "2331:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 138,
+ "name": "Identifier",
+ "src": "2342:18:2"
+ }
+ ],
+ "id": 139,
+ "name": "ModifierInvocation",
+ "src": "2295:66:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "i",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 141,
+ "name": "ElementaryTypeName",
+ "src": "2381:7:2"
+ }
+ ],
+ "id": 142,
+ "name": "VariableDeclaration",
+ "src": "2381:9:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 143,
+ "name": "Literal",
+ "src": "2393:1:2"
+ }
+ ],
+ "id": 144,
+ "name": "VariableDeclarationStatement",
+ "src": "2381:13:2"
+ },
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "2396:1:2"
+ },
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "2400:20:2"
+ }
+ ],
+ "id": 147,
+ "name": "MemberAccess",
+ "src": "2400:27:2"
+ }
+ ],
+ "id": 148,
+ "name": "BinaryOperation",
+ "src": "2396:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "++",
+ "prefix": false,
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 149,
+ "name": "Identifier",
+ "src": "2429:1:2"
+ }
+ ],
+ "id": 150,
+ "name": "UnaryOperation",
+ "src": "2429:3:2"
+ }
+ ],
+ "id": 151,
+ "name": "ExpressionStatement",
+ "src": "2429:3:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxy",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 152,
+ "name": "ElementaryTypeName",
+ "src": "2448:7:2"
+ }
+ ],
+ "id": 153,
+ "name": "VariableDeclaration",
+ "src": "2448:18:2"
+ },
+ {
+ "attributes": {
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 154,
+ "name": "Identifier",
+ "src": "2469:20:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "i"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "2490:1:2"
+ }
+ ],
+ "id": 156,
+ "name": "IndexAccess",
+ "src": "2469:23:2"
+ }
+ ],
+ "id": 157,
+ "name": "VariableDeclarationStatement",
+ "src": "2448:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 158,
+ "name": "Identifier",
+ "src": "2506:7:2"
+ },
+ {
+ "attributes": {
+ "operator": "!=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "2514:10:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "type_conversion": true
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "type(address)",
+ "value": "address"
+ },
+ "id": 160,
+ "name": "ElementaryTypeNameExpression",
+ "src": "2528:7:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 161,
+ "name": "Literal",
+ "src": "2536:1:2"
+ }
+ ],
+ "id": 162,
+ "name": "FunctionCall",
+ "src": "2528:10:2"
+ }
+ ],
+ "id": 163,
+ "name": "BinaryOperation",
+ "src": "2514:24:2"
+ }
+ ],
+ "id": 164,
+ "name": "FunctionCall",
+ "src": "2506:33:2"
+ }
+ ],
+ "id": 165,
+ "name": "ExpressionStatement",
+ "src": "2506:33:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 166,
+ "name": "Identifier",
+ "src": "2553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxy"
+ },
+ "id": 167,
+ "name": "Identifier",
+ "src": "2576:10:2"
+ }
+ ],
+ "id": 168,
+ "name": "IndexAccess",
+ "src": "2553:34:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 169,
+ "name": "Literal",
+ "src": "2590:4:2"
+ }
+ ],
+ "id": 170,
+ "name": "Assignment",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 171,
+ "name": "ExpressionStatement",
+ "src": "2553:41:2"
+ }
+ ],
+ "id": 172,
+ "name": "Block",
+ "src": "2434:171:2"
+ }
+ ],
+ "id": 173,
+ "name": "ForStatement",
+ "src": "2376:229:2"
+ }
+ ],
+ "id": 174,
+ "name": "Block",
+ "src": "2366:245:2"
+ }
+ ],
+ "id": 175,
+ "name": "FunctionDefinition",
+ "src": "2097:514:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "registerAssetProxy",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "assetProxyContract",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 176,
+ "name": "ElementaryTypeName",
+ "src": "2923:7:2"
+ }
+ ],
+ "id": 177,
+ "name": "VariableDeclaration",
+ "src": "2923:26:2"
+ },
+ {
+ "attributes": {
+ "name": "isRegistered",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 178,
+ "name": "ElementaryTypeName",
+ "src": "2951:4:2"
+ }
+ ],
+ "id": 179,
+ "name": "VariableDeclaration",
+ "src": "2951:17:2"
+ }
+ ],
+ "id": 180,
+ "name": "ParameterList",
+ "src": "2922:47:2"
+ },
+ {
+ "children": [],
+ "id": 186,
+ "name": "ParameterList",
+ "src": "3044:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier ()",
+ "value": "onlyWallet"
+ },
+ "id": 181,
+ "name": "Identifier",
+ "src": "2993:10:2"
+ }
+ ],
+ "id": 182,
+ "name": "ModifierInvocation",
+ "src": "2993:10:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (address)",
+ "value": "notNull"
+ },
+ "id": 183,
+ "name": "Identifier",
+ "src": "3012:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 184,
+ "name": "Identifier",
+ "src": "3020:18:2"
+ }
+ ],
+ "id": 185,
+ "name": "ModifierInvocation",
+ "src": "3012:27:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => bool)",
+ "value": "isAssetProxyRegistered"
+ },
+ "id": 187,
+ "name": "Identifier",
+ "src": "3054:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 188,
+ "name": "Identifier",
+ "src": "3077:18:2"
+ }
+ ],
+ "id": 189,
+ "name": "IndexAccess",
+ "src": "3054:42:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 190,
+ "name": "Identifier",
+ "src": "3099:12:2"
+ }
+ ],
+ "id": 191,
+ "name": "Assignment",
+ "src": "3054:57:2"
+ }
+ ],
+ "id": 192,
+ "name": "ExpressionStatement",
+ "src": "3054:57:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,bool) constant",
+ "value": "AssetProxyRegistration"
+ },
+ "id": 193,
+ "name": "Identifier",
+ "src": "3121:22:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "assetProxyContract"
+ },
+ "id": 194,
+ "name": "Identifier",
+ "src": "3144:18:2"
+ },
+ {
+ "attributes": {
+ "type": "bool",
+ "value": "isRegistered"
+ },
+ "id": 195,
+ "name": "Identifier",
+ "src": "3164:12:2"
+ }
+ ],
+ "id": 196,
+ "name": "FunctionCall",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 197,
+ "name": "ExpressionStatement",
+ "src": "3121:56:2"
+ }
+ ],
+ "id": 198,
+ "name": "Block",
+ "src": "3044:140:2"
+ }
+ ],
+ "id": 199,
+ "name": "FunctionDefinition",
+ "src": "2895:289:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "executeRemoveAuthorizedAddressAtIndex",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "transactionId",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 200,
+ "name": "ElementaryTypeName",
+ "src": "3367:7:2"
+ }
+ ],
+ "id": 201,
+ "name": "VariableDeclaration",
+ "src": "3367:21:2"
+ }
+ ],
+ "id": 202,
+ "name": "ParameterList",
+ "src": "3366:23:2"
+ },
+ {
+ "children": [],
+ "id": 212,
+ "name": "ParameterList",
+ "src": "3543:0:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "notExecuted"
+ },
+ "id": 203,
+ "name": "Identifier",
+ "src": "3413:11:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 204,
+ "name": "Identifier",
+ "src": "3425:13:2"
+ }
+ ],
+ "id": 205,
+ "name": "ModifierInvocation",
+ "src": "3413:26:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "fullyConfirmed"
+ },
+ "id": 206,
+ "name": "Identifier",
+ "src": "3448:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 207,
+ "name": "Identifier",
+ "src": "3463:13:2"
+ }
+ ],
+ "id": 208,
+ "name": "ModifierInvocation",
+ "src": "3448:29:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "3486:37:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 210,
+ "name": "Identifier",
+ "src": "3524:13:2"
+ }
+ ],
+ "id": 211,
+ "name": "ModifierInvocation",
+ "src": "3486:52:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "tx",
+ "type": "struct MultiSigWallet.Transaction storage pointer"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "Transaction"
+ },
+ "id": 213,
+ "name": "UserDefinedTypeName",
+ "src": "3553:11:2"
+ }
+ ],
+ "id": 214,
+ "name": "VariableDeclaration",
+ "src": "3553:22:2"
+ },
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(uint256 => struct MultiSigWallet.Transaction storage ref)",
+ "value": "transactions"
+ },
+ "id": 215,
+ "name": "Identifier",
+ "src": "3578:12:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 216,
+ "name": "Identifier",
+ "src": "3591:13:2"
+ }
+ ],
+ "id": 217,
+ "name": "IndexAccess",
+ "src": "3578:27:2"
+ }
+ ],
+ "id": 218,
+ "name": "VariableDeclarationStatement",
+ "src": "3553:52:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 219,
+ "name": "Identifier",
+ "src": "3615:2:2"
+ }
+ ],
+ "id": 221,
+ "name": "MemberAccess",
+ "src": "3615:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 222,
+ "name": "Literal",
+ "src": "3629:4:2"
+ }
+ ],
+ "id": 223,
+ "name": "Assignment",
+ "src": "3615:18:2"
+ }
+ ],
+ "id": 224,
+ "name": "ExpressionStatement",
+ "src": "3615:18:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bool",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function () payable returns (bool)",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "function (uint256) returns (function () payable returns (bool))"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "call",
+ "type": "function () payable returns (bool)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "destination",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 225,
+ "name": "Identifier",
+ "src": "3701:2:2"
+ }
+ ],
+ "id": 226,
+ "name": "MemberAccess",
+ "src": "3701:14:2"
+ }
+ ],
+ "id": 227,
+ "name": "MemberAccess",
+ "src": "3701:19:2"
+ }
+ ],
+ "id": 228,
+ "name": "MemberAccess",
+ "src": "3701:25:2"
+ },
+ {
+ "attributes": {
+ "member_name": "value",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 229,
+ "name": "Identifier",
+ "src": "3727:2:2"
+ }
+ ],
+ "id": 230,
+ "name": "MemberAccess",
+ "src": "3727:8:2"
+ }
+ ],
+ "id": 231,
+ "name": "FunctionCall",
+ "src": "3701:35:2"
+ },
+ {
+ "attributes": {
+ "member_name": "data",
+ "type": "bytes storage ref"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 232,
+ "name": "Identifier",
+ "src": "3737:2:2"
+ }
+ ],
+ "id": 233,
+ "name": "MemberAccess",
+ "src": "3737:7:2"
+ }
+ ],
+ "id": 234,
+ "name": "FunctionCall",
+ "src": "3701:44:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "Execution"
+ },
+ "id": 235,
+ "name": "Identifier",
+ "src": "3759:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 236,
+ "name": "Identifier",
+ "src": "3769:13:2"
+ }
+ ],
+ "id": 237,
+ "name": "FunctionCall",
+ "src": "3759:24:2"
+ }
+ ],
+ "id": 238,
+ "name": "ExpressionStatement",
+ "src": "3759:24:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (uint256) constant",
+ "value": "ExecutionFailure"
+ },
+ "id": 239,
+ "name": "Identifier",
+ "src": "3812:16:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "transactionId"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "3829:13:2"
+ }
+ ],
+ "id": 241,
+ "name": "FunctionCall",
+ "src": "3812:31:2"
+ }
+ ],
+ "id": 242,
+ "name": "ExpressionStatement",
+ "src": "3812:31:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "executed",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "struct MultiSigWallet.Transaction storage pointer",
+ "value": "tx"
+ },
+ "id": 243,
+ "name": "Identifier",
+ "src": "3857:2:2"
+ }
+ ],
+ "id": 245,
+ "name": "MemberAccess",
+ "src": "3857:11:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 246,
+ "name": "Literal",
+ "src": "3871:5:2"
+ }
+ ],
+ "id": 247,
+ "name": "Assignment",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 248,
+ "name": "ExpressionStatement",
+ "src": "3857:19:2"
+ }
+ ],
+ "id": 249,
+ "name": "Block",
+ "src": "3798:89:2"
+ }
+ ],
+ "id": 250,
+ "name": "IfStatement",
+ "src": "3697:190:2"
+ }
+ ],
+ "id": 251,
+ "name": "Block",
+ "src": "3543:350:2"
+ }
+ ],
+ "id": 252,
+ "name": "FunctionDefinition",
+ "src": "3320:573:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "readBytes4",
+ "payable": false,
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "b",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 253,
+ "name": "ElementaryTypeName",
+ "src": "4164:5:2"
+ }
+ ],
+ "id": 254,
+ "name": "VariableDeclaration",
+ "src": "4164:14:2"
+ },
+ {
+ "attributes": {
+ "name": "index",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 255,
+ "name": "ElementaryTypeName",
+ "src": "4188:7:2"
+ }
+ ],
+ "id": 256,
+ "name": "VariableDeclaration",
+ "src": "4188:13:2"
+ }
+ ],
+ "id": 257,
+ "name": "ParameterList",
+ "src": "4154:53:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "result",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 258,
+ "name": "ElementaryTypeName",
+ "src": "4242:6:2"
+ }
+ ],
+ "id": 259,
+ "name": "VariableDeclaration",
+ "src": "4242:13:2"
+ }
+ ],
+ "id": 260,
+ "name": "ParameterList",
+ "src": "4241:15:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bool)",
+ "value": "require"
+ },
+ "id": 261,
+ "name": "Identifier",
+ "src": "4271:7:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "member_name": "length",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "b"
+ },
+ "id": 262,
+ "name": "Identifier",
+ "src": "4279:1:2"
+ }
+ ],
+ "id": 263,
+ "name": "MemberAccess",
+ "src": "4279:8:2"
+ },
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "index"
+ },
+ "id": 264,
+ "name": "Identifier",
+ "src": "4291:5:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "34",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 4",
+ "value": "4"
+ },
+ "id": 265,
+ "name": "Literal",
+ "src": "4299:1:2"
+ }
+ ],
+ "id": 266,
+ "name": "BinaryOperation",
+ "src": "4291:9:2"
+ }
+ ],
+ "id": 267,
+ "name": "BinaryOperation",
+ "src": "4279:21:2"
+ }
+ ],
+ "id": 268,
+ "name": "FunctionCall",
+ "src": "4271:30:2"
+ }
+ ],
+ "id": 269,
+ "name": "ExpressionStatement",
+ "src": "4271:30:2"
+ },
+ {
+ "children": [],
+ "id": 270,
+ "name": "InlineAssembly",
+ "src": "4311:281:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "result"
+ },
+ "id": 271,
+ "name": "Identifier",
+ "src": "4593:6:2"
+ }
+ ],
+ "id": 272,
+ "name": "Return",
+ "src": "4586:13:2"
+ }
+ ],
+ "id": 273,
+ "name": "Block",
+ "src": "4261:345:2"
+ }
+ ],
+ "id": 274,
+ "name": "FunctionDefinition",
+ "src": "4135:471:2"
+ }
+ ],
+ "id": 275,
+ "name": "ContractDefinition",
+ "src": "663:3945:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.sol": {
+ "id": "3",
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".10"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:3"
+ },
+ {
+ "attributes": {
+ "file": "../../protocol/AssetProxyOwner/AssetProxyOwner.sol"
+ },
+ "id": 2,
+ "name": "ImportDirective",
+ "src": "605:60:3"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 72,
+ 275,
+ 529,
+ 1492
+ ],
+ "name": "TestAssetProxyOwner"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "AssetProxyOwner"
+ },
+ "id": 3,
+ "name": "UserDefinedTypeName",
+ "src": "739:15:3"
+ }
+ ],
+ "id": 4,
+ "name": "InheritanceSpecifier",
+ "src": "739:15:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "TestAssetProxyOwner",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "_owners",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 5,
+ "name": "ElementaryTypeName",
+ "src": "800:7:3"
+ }
+ ],
+ "id": 6,
+ "name": "ArrayTypeName",
+ "src": "800:9:3"
+ }
+ ],
+ "id": 7,
+ "name": "VariableDeclaration",
+ "src": "800:24:3"
+ },
+ {
+ "attributes": {
+ "name": "_assetProxyContracts",
+ "type": "address[] memory"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 8,
+ "name": "ElementaryTypeName",
+ "src": "834:7:3"
+ }
+ ],
+ "id": 9,
+ "name": "ArrayTypeName",
+ "src": "834:9:3"
+ }
+ ],
+ "id": 10,
+ "name": "VariableDeclaration",
+ "src": "834:37:3"
+ },
+ {
+ "attributes": {
+ "name": "_required",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 11,
+ "name": "ElementaryTypeName",
+ "src": "881:7:3"
+ }
+ ],
+ "id": 12,
+ "name": "VariableDeclaration",
+ "src": "881:17:3"
+ },
+ {
+ "attributes": {
+ "name": "_secondsTimeLocked",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 13,
+ "name": "ElementaryTypeName",
+ "src": "908:7:3"
+ }
+ ],
+ "id": 14,
+ "name": "VariableDeclaration",
+ "src": "908:26:3"
+ }
+ ],
+ "id": 15,
+ "name": "ParameterList",
+ "src": "790:150:3"
+ },
+ {
+ "children": [],
+ "id": 22,
+ "name": "ParameterList",
+ "src": "1046:0:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "type(contract AssetProxyOwner)",
+ "value": "AssetProxyOwner"
+ },
+ "id": 16,
+ "name": "Identifier",
+ "src": "964:15:3"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_owners"
+ },
+ "id": 17,
+ "name": "Identifier",
+ "src": "980:7:3"
+ },
+ {
+ "attributes": {
+ "type": "address[] memory",
+ "value": "_assetProxyContracts"
+ },
+ "id": 18,
+ "name": "Identifier",
+ "src": "989:20:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_required"
+ },
+ "id": 19,
+ "name": "Identifier",
+ "src": "1011:9:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_secondsTimeLocked"
+ },
+ "id": 20,
+ "name": "Identifier",
+ "src": "1022:18:3"
+ }
+ ],
+ "id": 21,
+ "name": "ModifierInvocation",
+ "src": "964:77:3"
+ },
+ {
+ "children": [],
+ "id": 23,
+ "name": "Block",
+ "src": "1046:2:3"
+ }
+ ],
+ "id": 24,
+ "name": "FunctionDefinition",
+ "src": "762:286:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "testValidRemoveAuthorizedAddressAtIndexTx",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "id",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 25,
+ "name": "ElementaryTypeName",
+ "src": "1109:7:3"
+ }
+ ],
+ "id": 26,
+ "name": "VariableDeclaration",
+ "src": "1109:10:3"
+ }
+ ],
+ "id": 27,
+ "name": "ParameterList",
+ "src": "1108:12:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 31,
+ "name": "ElementaryTypeName",
+ "src": "1203:4:3"
+ }
+ ],
+ "id": 32,
+ "name": "VariableDeclaration",
+ "src": "1203:4:3"
+ }
+ ],
+ "id": 33,
+ "name": "ParameterList",
+ "src": "1202:6:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "modifier (uint256)",
+ "value": "validRemoveAuthorizedAddressAtIndexTx"
+ },
+ "id": 28,
+ "name": "Identifier",
+ "src": "1144:37:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "id"
+ },
+ "id": 29,
+ "name": "Identifier",
+ "src": "1182:2:3"
+ }
+ ],
+ "id": 30,
+ "name": "ModifierInvocation",
+ "src": "1144:41:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 34,
+ "name": "Literal",
+ "src": "1292:4:3"
+ }
+ ],
+ "id": 35,
+ "name": "Return",
+ "src": "1285:11:3"
+ }
+ ],
+ "id": 36,
+ "name": "Block",
+ "src": "1213:90:3"
+ }
+ ],
+ "id": 37,
+ "name": "FunctionDefinition",
+ "src": "1058:245:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "isFunctionRemoveAuthorizedAddressAtIndex",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "data",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 38,
+ "name": "ElementaryTypeName",
+ "src": "1588:5:3"
+ }
+ ],
+ "id": 39,
+ "name": "VariableDeclaration",
+ "src": "1588:17:3"
+ }
+ ],
+ "id": 40,
+ "name": "ParameterList",
+ "src": "1587:19:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 41,
+ "name": "ElementaryTypeName",
+ "src": "1639:4:3"
+ }
+ ],
+ "id": 42,
+ "name": "VariableDeclaration",
+ "src": "1639:4:3"
+ }
+ ],
+ "id": 43,
+ "name": "ParameterList",
+ "src": "1638:6:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "==",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bytes memory,uint256) returns (bytes4)",
+ "value": "readBytes4"
+ },
+ "id": 44,
+ "name": "Identifier",
+ "src": "1666:10:3"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "data"
+ },
+ "id": 45,
+ "name": "Identifier",
+ "src": "1677:4:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 0",
+ "value": "0"
+ },
+ "id": 46,
+ "name": "Literal",
+ "src": "1683:1:3"
+ }
+ ],
+ "id": 47,
+ "name": "FunctionCall",
+ "src": "1666:19:3"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR"
+ },
+ "id": 48,
+ "name": "Identifier",
+ "src": "1689:43:3"
+ }
+ ],
+ "id": 49,
+ "name": "BinaryOperation",
+ "src": "1666:66:3"
+ }
+ ],
+ "id": 50,
+ "name": "Return",
+ "src": "1659:73:3"
+ }
+ ],
+ "id": 51,
+ "name": "Block",
+ "src": "1649:90:3"
+ }
+ ],
+ "id": 52,
+ "name": "FunctionDefinition",
+ "src": "1538:201:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "publicReadBytes4",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "b",
+ "type": "bytes memory"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes"
+ },
+ "id": 53,
+ "name": "ElementaryTypeName",
+ "src": "2016:5:3"
+ }
+ ],
+ "id": 54,
+ "name": "VariableDeclaration",
+ "src": "2016:14:3"
+ },
+ {
+ "attributes": {
+ "name": "index",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint256"
+ },
+ "id": 55,
+ "name": "ElementaryTypeName",
+ "src": "2040:7:3"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "2040:13:3"
+ }
+ ],
+ "id": 57,
+ "name": "ParameterList",
+ "src": "2006:53:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "result",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bytes4"
+ },
+ "id": 58,
+ "name": "ElementaryTypeName",
+ "src": "2092:6:3"
+ }
+ ],
+ "id": 59,
+ "name": "VariableDeclaration",
+ "src": "2092:13:3"
+ }
+ ],
+ "id": 60,
+ "name": "ParameterList",
+ "src": "2091:15:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "bytes4"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "result"
+ },
+ "id": 61,
+ "name": "Identifier",
+ "src": "2121:6:3"
+ },
+ {
+ "attributes": {
+ "type": "bytes4",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (bytes memory,uint256) returns (bytes4)",
+ "value": "readBytes4"
+ },
+ "id": 62,
+ "name": "Identifier",
+ "src": "2130:10:3"
+ },
+ {
+ "attributes": {
+ "type": "bytes memory",
+ "value": "b"
+ },
+ "id": 63,
+ "name": "Identifier",
+ "src": "2141:1:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "index"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "2144:5:3"
+ }
+ ],
+ "id": 65,
+ "name": "FunctionCall",
+ "src": "2130:20:3"
+ }
+ ],
+ "id": 66,
+ "name": "Assignment",
+ "src": "2121:29:3"
+ }
+ ],
+ "id": 67,
+ "name": "ExpressionStatement",
+ "src": "2121:29:3"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "bytes4",
+ "value": "result"
+ },
+ "id": 68,
+ "name": "Identifier",
+ "src": "2167:6:3"
+ }
+ ],
+ "id": 69,
+ "name": "Return",
+ "src": "2160:13:3"
+ }
+ ],
+ "id": 70,
+ "name": "Block",
+ "src": "2111:69:3"
+ }
+ ],
+ "id": 71,
+ "name": "FunctionDefinition",
+ "src": "1981:199:3"
+ }
+ ],
+ "id": 72,
+ "name": "ContractDefinition",
+ "src": "703:1479:3"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/multisig/MultiSigWallet.sol": "// solhint-disable\npragma solidity ^0.4.10;\n\n\n/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.\n/// @author Stefan George - <stefan.george@consensys.net>\ncontract MultiSigWallet {\n\n uint constant public MAX_OWNER_COUNT = 50;\n\n event Confirmation(address indexed sender, uint indexed transactionId);\n event Revocation(address indexed sender, uint indexed transactionId);\n event Submission(uint indexed transactionId);\n event Execution(uint indexed transactionId);\n event ExecutionFailure(uint indexed transactionId);\n event Deposit(address indexed sender, uint value);\n event OwnerAddition(address indexed owner);\n event OwnerRemoval(address indexed owner);\n event RequirementChange(uint required);\n\n mapping (uint => Transaction) public transactions;\n mapping (uint => mapping (address => bool)) public confirmations;\n mapping (address => bool) public isOwner;\n address[] public owners;\n uint public required;\n uint public transactionCount;\n\n struct Transaction {\n address destination;\n uint value;\n bytes data;\n bool executed;\n }\n\n modifier onlyWallet() {\n if (msg.sender != address(this))\n throw;\n _;\n }\n\n modifier ownerDoesNotExist(address owner) {\n if (isOwner[owner])\n throw;\n _;\n }\n\n modifier ownerExists(address owner) {\n if (!isOwner[owner])\n throw;\n _;\n }\n\n modifier transactionExists(uint transactionId) {\n if (transactions[transactionId].destination == 0)\n throw;\n _;\n }\n\n modifier confirmed(uint transactionId, address owner) {\n if (!confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notConfirmed(uint transactionId, address owner) {\n if (confirmations[transactionId][owner])\n throw;\n _;\n }\n\n modifier notExecuted(uint transactionId) {\n if (transactions[transactionId].executed)\n throw;\n _;\n }\n\n modifier notNull(address _address) {\n if (_address == 0)\n throw;\n _;\n }\n\n modifier validRequirement(uint ownerCount, uint _required) {\n if ( ownerCount > MAX_OWNER_COUNT\n || _required > ownerCount\n || _required == 0\n || ownerCount == 0)\n throw;\n _;\n }\n\n /// @dev Fallback function allows to deposit ether.\n function()\n payable\n {\n if (msg.value > 0)\n Deposit(msg.sender, msg.value);\n }\n\n /*\n * Public functions\n */\n /// @dev Contract constructor sets initial owners and required number of confirmations.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n function MultiSigWallet(address[] _owners, uint _required)\n public\n validRequirement(_owners.length, _required)\n {\n for (uint i=0; i<_owners.length; i++) {\n if (isOwner[_owners[i]] || _owners[i] == 0)\n throw;\n isOwner[_owners[i]] = true;\n }\n owners = _owners;\n required = _required;\n }\n\n /// @dev Allows to add a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of new owner.\n function addOwner(address owner)\n public\n onlyWallet\n ownerDoesNotExist(owner)\n notNull(owner)\n validRequirement(owners.length + 1, required)\n {\n isOwner[owner] = true;\n owners.push(owner);\n OwnerAddition(owner);\n }\n\n /// @dev Allows to remove an owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner.\n function removeOwner(address owner)\n public\n onlyWallet\n ownerExists(owner)\n {\n isOwner[owner] = false;\n for (uint i=0; i<owners.length - 1; i++)\n if (owners[i] == owner) {\n owners[i] = owners[owners.length - 1];\n break;\n }\n owners.length -= 1;\n if (required > owners.length)\n changeRequirement(owners.length);\n OwnerRemoval(owner);\n }\n\n /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.\n /// @param owner Address of owner to be replaced.\n /// @param owner Address of new owner.\n function replaceOwner(address owner, address newOwner)\n public\n onlyWallet\n ownerExists(owner)\n ownerDoesNotExist(newOwner)\n {\n for (uint i=0; i<owners.length; i++)\n if (owners[i] == owner) {\n owners[i] = newOwner;\n break;\n }\n isOwner[owner] = false;\n isOwner[newOwner] = true;\n OwnerRemoval(owner);\n OwnerAddition(newOwner);\n }\n\n /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.\n /// @param _required Number of required confirmations.\n function changeRequirement(uint _required)\n public\n onlyWallet\n validRequirement(owners.length, _required)\n {\n required = _required;\n RequirementChange(_required);\n }\n\n /// @dev Allows an owner to submit and confirm a transaction.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function submitTransaction(address destination, uint value, bytes data)\n public\n returns (uint transactionId)\n {\n transactionId = addTransaction(destination, value, data);\n confirmTransaction(transactionId);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n executeTransaction(transactionId);\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n {\n if (isConfirmed(transactionId)) {\n Transaction tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n }\n\n /// @dev Returns the confirmation status of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Confirmation status.\n function isConfirmed(uint transactionId)\n public\n constant\n returns (bool)\n {\n uint count = 0;\n for (uint i=0; i<owners.length; i++) {\n if (confirmations[transactionId][owners[i]])\n count += 1;\n if (count == required)\n return true;\n }\n }\n\n /*\n * Internal functions\n */\n /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.\n /// @param destination Transaction target address.\n /// @param value Transaction ether value.\n /// @param data Transaction data payload.\n /// @return Returns transaction ID.\n function addTransaction(address destination, uint value, bytes data)\n internal\n notNull(destination)\n returns (uint transactionId)\n {\n transactionId = transactionCount;\n transactions[transactionId] = Transaction({\n destination: destination,\n value: value,\n data: data,\n executed: false\n });\n transactionCount += 1;\n Submission(transactionId);\n }\n\n /*\n * Web3 call functions\n */\n /// @dev Returns number of confirmations of a transaction.\n /// @param transactionId Transaction ID.\n /// @return Number of confirmations.\n function getConfirmationCount(uint transactionId)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]])\n count += 1;\n }\n\n /// @dev Returns total number of transactions after filers are applied.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Total number of transactions after filters are applied.\n function getTransactionCount(bool pending, bool executed)\n public\n constant\n returns (uint count)\n {\n for (uint i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n count += 1;\n }\n\n /// @dev Returns list of owners.\n /// @return List of owner addresses.\n function getOwners()\n public\n constant\n returns (address[])\n {\n return owners;\n }\n\n /// @dev Returns array with owner addresses, which confirmed transaction.\n /// @param transactionId Transaction ID.\n /// @return Returns array of owner addresses.\n function getConfirmations(uint transactionId)\n public\n constant\n returns (address[] _confirmations)\n {\n address[] memory confirmationsTemp = new address[](owners.length);\n uint count = 0;\n uint i;\n for (i=0; i<owners.length; i++)\n if (confirmations[transactionId][owners[i]]) {\n confirmationsTemp[count] = owners[i];\n count += 1;\n }\n _confirmations = new address[](count);\n for (i=0; i<count; i++)\n _confirmations[i] = confirmationsTemp[i];\n }\n\n /// @dev Returns list of transaction IDs in defined range.\n /// @param from Index start position of transaction array.\n /// @param to Index end position of transaction array.\n /// @param pending Include pending transactions.\n /// @param executed Include executed transactions.\n /// @return Returns array of transaction IDs.\n function getTransactionIds(uint from, uint to, bool pending, bool executed)\n public\n constant\n returns (uint[] _transactionIds)\n {\n uint[] memory transactionIdsTemp = new uint[](transactionCount);\n uint count = 0;\n uint i;\n for (i=0; i<transactionCount; i++)\n if ( pending && !transactions[i].executed\n || executed && transactions[i].executed)\n {\n transactionIdsTemp[count] = i;\n count += 1;\n }\n _transactionIds = new uint[](to - from);\n for (i=from; i<to; i++)\n _transactionIds[i - from] = transactionIdsTemp[i];\n }\n}\n",
+ "2.0.0/multisig/MultiSigWalletWithTimeLock.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\n// solhint-disable\npragma solidity ^0.4.10;\n\nimport \"./MultiSigWallet.sol\";\n\n\n/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.\n/// @author Amir Bandeali - <amir@0xProject.com>\ncontract MultiSigWalletWithTimeLock is MultiSigWallet {\n\n event ConfirmationTimeSet(uint indexed transactionId, uint confirmationTime);\n event TimeLockChange(uint secondsTimeLocked);\n\n uint public secondsTimeLocked;\n\n mapping (uint => uint) public confirmationTimes;\n\n modifier notFullyConfirmed(uint transactionId) {\n require(!isConfirmed(transactionId));\n _;\n }\n\n modifier fullyConfirmed(uint transactionId) {\n require(isConfirmed(transactionId));\n _;\n }\n\n modifier pastTimeLock(uint transactionId) {\n require(block.timestamp >= confirmationTimes[transactionId] + secondsTimeLocked);\n _;\n }\n\n /*\n * Public functions\n */\n\n /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.\n /// @param _owners List of initial owners.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function MultiSigWalletWithTimeLock(address[] _owners, uint _required, uint _secondsTimeLocked)\n public\n MultiSigWallet(_owners, _required)\n {\n secondsTimeLocked = _secondsTimeLocked;\n }\n\n /// @dev Changes the duration of the time lock for transactions.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function changeTimeLock(uint _secondsTimeLocked)\n public\n onlyWallet\n {\n secondsTimeLocked = _secondsTimeLocked;\n TimeLockChange(_secondsTimeLocked);\n }\n\n /// @dev Allows an owner to confirm a transaction.\n /// @param transactionId Transaction ID.\n function confirmTransaction(uint transactionId)\n public\n ownerExists(msg.sender)\n transactionExists(transactionId)\n notConfirmed(transactionId, msg.sender)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = true;\n Confirmation(msg.sender, transactionId);\n if (isConfirmed(transactionId)) {\n setConfirmationTime(transactionId, block.timestamp);\n }\n }\n\n /// @dev Allows an owner to revoke a confirmation for a transaction.\n /// @param transactionId Transaction ID.\n function revokeConfirmation(uint transactionId)\n public\n ownerExists(msg.sender)\n confirmed(transactionId, msg.sender)\n notExecuted(transactionId)\n notFullyConfirmed(transactionId)\n {\n confirmations[transactionId][msg.sender] = false;\n Revocation(msg.sender, transactionId);\n }\n\n /// @dev Allows anyone to execute a confirmed transaction.\n /// @param transactionId Transaction ID.\n function executeTransaction(uint transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n pastTimeLock(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /*\n * Internal functions\n */\n\n /// @dev Sets the time of when a submission first passed.\n function setConfirmationTime(uint transactionId, uint confirmationTime)\n internal\n {\n confirmationTimes[transactionId] = confirmationTime;\n ConfirmationTimeSet(transactionId, confirmationTime);\n }\n}\n",
+ "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.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 solidity 0.4.10;\n\nimport \"../../multisig/MultiSigWalletWithTimeLock.sol\";\n\n\ncontract AssetProxyOwner is\n MultiSigWalletWithTimeLock\n{\n\n event AssetProxyRegistration(address assetProxyContract, bool isRegistered);\n\n // Mapping of AssetProxy contract address =>\n // if this contract is allowed to call the AssetProxy's `removeAuthorizedAddressAtIndex` method without a time lock.\n mapping (address => bool) public isAssetProxyRegistered;\n\n bytes4 constant internal REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR = bytes4(keccak256(\"removeAuthorizedAddressAtIndex(address,uint256)\"));\n\n /// @dev Function will revert if the transaction does not call `removeAuthorizedAddressAtIndex`\n /// on an approved AssetProxy contract.\n modifier validRemoveAuthorizedAddressAtIndexTx(uint256 transactionId) {\n Transaction storage tx = transactions[transactionId];\n require(isAssetProxyRegistered[tx.destination]);\n require(readBytes4(tx.data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR);\n _;\n }\n\n /// @dev Contract constructor sets initial owners, required number of confirmations,\n /// time lock, and list of AssetProxy addresses.\n /// @param _owners List of initial owners.\n /// @param _assetProxyContracts Array of AssetProxy contract addresses.\n /// @param _required Number of required confirmations.\n /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.\n function AssetProxyOwner(\n address[] memory _owners,\n address[] memory _assetProxyContracts,\n uint256 _required,\n uint256 _secondsTimeLocked\n )\n public\n MultiSigWalletWithTimeLock(_owners, _required, _secondsTimeLocked)\n {\n for (uint256 i = 0; i < _assetProxyContracts.length; i++) {\n address assetProxy = _assetProxyContracts[i];\n require(assetProxy != address(0));\n isAssetProxyRegistered[assetProxy] = true;\n }\n }\n\n /// @dev Registers or deregisters an AssetProxy to be able to execute\n /// `removeAuthorizedAddressAtIndex` without a timelock.\n /// @param assetProxyContract Address of AssetProxy contract.\n /// @param isRegistered Status of approval for AssetProxy contract.\n function registerAssetProxy(address assetProxyContract, bool isRegistered)\n public\n onlyWallet\n notNull(assetProxyContract)\n {\n isAssetProxyRegistered[assetProxyContract] = isRegistered;\n AssetProxyRegistration(assetProxyContract, isRegistered);\n }\n\n /// @dev Allows execution of `removeAuthorizedAddressAtIndex` without time lock.\n /// @param transactionId Transaction ID.\n function executeRemoveAuthorizedAddressAtIndex(uint256 transactionId)\n public\n notExecuted(transactionId)\n fullyConfirmed(transactionId)\n validRemoveAuthorizedAddressAtIndexTx(transactionId)\n {\n Transaction storage tx = transactions[transactionId];\n tx.executed = true;\n // solhint-disable-next-line avoid-call-value\n if (tx.destination.call.value(tx.value)(tx.data))\n Execution(transactionId);\n else {\n ExecutionFailure(transactionId);\n tx.executed = false;\n }\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n returns (bytes4 result)\n {\n require(b.length >= index + 4);\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n}\n",
+ "2.0.0/test/TestAssetProxyOwner/TestAssetProxyOwner.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 solidity 0.4.10;\n\nimport \"../../protocol/AssetProxyOwner/AssetProxyOwner.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract TestAssetProxyOwner is\n AssetProxyOwner\n{\n\n function TestAssetProxyOwner(\n address[] memory _owners,\n address[] memory _assetProxyContracts,\n uint256 _required,\n uint256 _secondsTimeLocked\n )\n public\n AssetProxyOwner(_owners, _assetProxyContracts, _required, _secondsTimeLocked)\n {}\n \n function testValidRemoveAuthorizedAddressAtIndexTx(uint256 id)\n public\n validRemoveAuthorizedAddressAtIndexTx(id)\n returns (bool)\n {\n // Do nothing. We expect reverts through the modifier\n return true;\n }\n \n /// @dev Compares first 4 bytes of byte array to `removeAuthorizedAddressAtIndex` function selector.\n /// @param data Transaction data.\n /// @return Successful if data is a call to `removeAuthorizedAddressAtIndex`.\n function isFunctionRemoveAuthorizedAddressAtIndex(bytes memory data)\n public\n returns (bool)\n {\n return readBytes4(data, 0) == REMOVE_AUTHORIZED_ADDRESS_AT_INDEX_SELECTOR;\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function publicReadBytes4(\n bytes memory b,\n uint256 index\n )\n public\n returns (bytes4 result)\n {\n result = readBytes4(b, index);\n return result;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xfe242c83ed003ffe272f8b71d74dfda07c6fad38846d442a205839eae225dc5d",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.10+commit.f0d539ae.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestConstants.json b/packages/migrations/artifacts/2.0.0/TestConstants.json
new file mode 100644
index 000000000..ef414a6ca
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestConstants.json
@@ -0,0 +1,85 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestConstants",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "assertValidZrxAssetData",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "MAINNET_ZRX_ASSET_DATA",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b506105dc806100206000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634e7411e28114610050578063a7e889e714610079575b600080fd5b34801561005c57600080fd5b50610065610103565b604080519115158252519081900360200190f35b34801561008557600080fd5b5061008e610425565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100c85781810151838201526020016100b0565b50505050905090810190601f1680156100f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b604080517f4552433230546f6b656e2861646472657373290000000000000000000000000081528151908190036013018120736ff6c0ff1d68b964901f986d4c9fa3ac6834657060248084019190915283518084038201815260449093018452602083810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092528351606081810186529181527ff47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac928101929092527f6834657000000000000000000000000000000000000000000000000000000000938201939093526000929061022490839063ffffffff61048516565b151561029157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f494e56414c49445f4b4f56414e5f5a52585f41535345545f4441544100000000604482015290519081900360640190fd5b50604080517f4552433230546f6b656e286164647265737329000000000000000000000000008152815190819003601301812073e41d2489571d322189246dafa5ebde1f4699f49860248084019190915283518084038201815260449093018452602083810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925283516060810185529081527ff47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f918101919091527f4699f4980000000000000000000000000000000000000000000000000000000092810192909252906103af90829063ffffffff61048516565b151561041c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f494e56414c49445f4d41494e4e45545f5a52585f41535345545f444154410000604482015290519081900360640190fd5b60019250505090565b606060405190810160405280602481526020017ff47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f81526020017f4699f4980000000000000000000000000000000000000000000000000000000081525081565b6000815183511480156105a95750816040518082805190602001908083835b602083106104e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104a4565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061057657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610539565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b93925050505600a165627a7a7230582045bf6ffda00e4c4f750c832af42e8e5cc6f6eaea82d2dbb520fb1665ea5989c40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5DC DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x4E7411E2 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xA7E889E7 EQ PUSH2 0x79 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x65 PUSH2 0x103 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8E PUSH2 0x425 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH20 0x6FF6C0FF1D68B964901F986D4C9FA3AC68346570 PUSH1 0x24 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP5 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP4 ADD DUP5 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE DUP4 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP7 MSTORE SWAP2 DUP2 MSTORE PUSH32 0xF47261B00000000000000000000000006FF6C0FF1D68B964901F986D4C9FA3AC SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH32 0x6834657000000000000000000000000000000000000000000000000000000000 SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 SWAP3 SWAP1 PUSH2 0x224 SWAP1 DUP4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x485 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4B4F56414E5F5A52585F41535345545F4441544100000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH20 0xE41D2489571D322189246DAFA5EBDE1F4699F498 PUSH1 0x24 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP5 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP4 ADD DUP5 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE DUP4 MLOAD PUSH1 0x60 DUP2 ADD DUP6 MSTORE SWAP1 DUP2 MSTORE PUSH32 0xF47261B0000000000000000000000000E41D2489571D322189246DAFA5EBDE1F SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x4699F49800000000000000000000000000000000000000000000000000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH2 0x3AF SWAP1 DUP3 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x485 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x41C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4D41494E4E45545F5A52585F41535345545F444154410000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0xF47261B0000000000000000000000000E41D2489571D322189246DAFA5EBDE1F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4699F49800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x5A9 JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4E1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4A4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x576 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x539 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP4 SWAP3 POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 GASLIMIT 0xbf PUSH16 0xFDA00E4C4F750C832AF42E8E5CC6F6EA 0xea DUP3 0xd2 0xdb 0xb5 KECCAK256 CREATE2 AND PUSH6 0xEA5989C40029 ",
+ "sourceMap": "686:1347:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;686:1347:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634e7411e28114610050578063a7e889e714610079575b600080fd5b34801561005c57600080fd5b50610065610103565b604080519115158252519081900360200190f35b34801561008557600080fd5b5061008e610425565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100c85781810151838201526020016100b0565b50505050905090810190601f1680156100f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b604080517f4552433230546f6b656e2861646472657373290000000000000000000000000081528151908190036013018120736ff6c0ff1d68b964901f986d4c9fa3ac6834657060248084019190915283518084038201815260449093018452602083810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092528351606081810186529181527ff47261b00000000000000000000000006ff6c0ff1d68b964901f986d4c9fa3ac928101929092527f6834657000000000000000000000000000000000000000000000000000000000938201939093526000929061022490839063ffffffff61048516565b151561029157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f494e56414c49445f4b4f56414e5f5a52585f41535345545f4441544100000000604482015290519081900360640190fd5b50604080517f4552433230546f6b656e286164647265737329000000000000000000000000008152815190819003601301812073e41d2489571d322189246dafa5ebde1f4699f49860248084019190915283518084038201815260449093018452602083810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925283516060810185529081527ff47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f918101919091527f4699f4980000000000000000000000000000000000000000000000000000000092810192909252906103af90829063ffffffff61048516565b151561041c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f494e56414c49445f4d41494e4e45545f5a52585f41535345545f444154410000604482015290519081900360640190fd5b60019250505090565b606060405190810160405280602481526020017ff47261b0000000000000000000000000e41d2489571d322189246dafa5ebde1f81526020017f4699f4980000000000000000000000000000000000000000000000000000000081525081565b6000815183511480156105a95750816040518082805190602001908083835b602083106104e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016104a4565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061057657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610539565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916145b93925050505600a165627a7a7230582045bf6ffda00e4c4f750c832af42e8e5cc6f6eaea82d2dbb520fb1665ea5989c40029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x4E7411E2 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xA7E889E7 EQ PUSH2 0x79 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x65 PUSH2 0x103 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x85 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8E PUSH2 0x425 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xC8 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xB0 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xF5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH20 0x6FF6C0FF1D68B964901F986D4C9FA3AC68346570 PUSH1 0x24 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP5 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP4 ADD DUP5 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE DUP4 MLOAD PUSH1 0x60 DUP2 DUP2 ADD DUP7 MSTORE SWAP2 DUP2 MSTORE PUSH32 0xF47261B00000000000000000000000006FF6C0FF1D68B964901F986D4C9FA3AC SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE PUSH32 0x6834657000000000000000000000000000000000000000000000000000000000 SWAP4 DUP3 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x0 SWAP3 SWAP1 PUSH2 0x224 SWAP1 DUP4 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x485 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x291 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4B4F56414E5F5A52585F41535345545F4441544100000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH32 0x4552433230546F6B656E28616464726573732900000000000000000000000000 DUP2 MSTORE DUP2 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x13 ADD DUP2 KECCAK256 PUSH20 0xE41D2489571D322189246DAFA5EBDE1F4699F498 PUSH1 0x24 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP4 MLOAD DUP1 DUP5 SUB DUP3 ADD DUP2 MSTORE PUSH1 0x44 SWAP1 SWAP4 ADD DUP5 MSTORE PUSH1 0x20 DUP4 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE DUP4 MLOAD PUSH1 0x60 DUP2 ADD DUP6 MSTORE SWAP1 DUP2 MSTORE PUSH32 0xF47261B0000000000000000000000000E41D2489571D322189246DAFA5EBDE1F SWAP2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x4699F49800000000000000000000000000000000000000000000000000000000 SWAP3 DUP2 ADD SWAP3 SWAP1 SWAP3 MSTORE SWAP1 PUSH2 0x3AF SWAP1 DUP3 SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x485 AND JUMP JUMPDEST ISZERO ISZERO PUSH2 0x41C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F4D41494E4E45545F5A52585F41535345545F444154410000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 SWAP3 POP POP POP SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x24 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0xF47261B0000000000000000000000000E41D2489571D322189246DAFA5EBDE1F DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4699F49800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x5A9 JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x4E1 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x4A4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x576 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x539 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ JUMPDEST SWAP4 SWAP3 POP POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 GASLIMIT 0xbf PUSH16 0xFDA00E4C4F750C832AF42E8E5CC6F6EA 0xea DUP3 0xd2 0xdb 0xb5 KECCAK256 CREATE2 AND PUSH6 0xEA5989C40029 ",
+ "sourceMap": "686:1347:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:590;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1441:590:0;;;;;;;;;;;;;;;;;;;;;;1237:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1237:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1237:193:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1441:590;799:32;;;;;;;;;;;;;;;;889:42;1574:57;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1574:57:0;;;;;;;25:18:-1;;;61:17;;1574:57:0;182:15:-1;1574:57:0;;;;179:29:-1;;;;160:49;;;1687:20:0;;1541:30;1687:20;;;;;;;;;;;;;;;;;;;;;;;;1521:4;;1541:30;1662:46;;1574:57;;1662:46;:24;:46;:::i;:::-;1641:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;799:32:0;;;;;;;;;;;;;;;;1189:42;1807:59;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1807:59:0;;;;;;;25:18:-1;;;61:17;;1807:59:0;182:15:-1;1807:59:0;;;;179:29:-1;;;;160:49;;;1923:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;1807:59;1897:49;;1807:59;;1897:49;:25;:49;:::i;:::-;1876:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2020:4;2013:11;;1441:590;;;:::o;1237:193::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9642:403:1:-;9763:10;9992:3;:10;9978:3;:10;:24;:60;;;;;10034:3;10024:14;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;10024:14:1;;;;;;;;;;;10006;;10024;;-1:-1:-1;10006:14:1;;-1:-1:-1;10024:14:1;;;;-1:-1:-1;10006:14:1;;;;10024;10006;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10006:14:1;;;;;;;;;;;;;;;;:32;;;;9978:60;9971:67;9642:403;-1:-1:-1;;;9642:403:1:o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/test/TestConstants/TestConstants.sol": {
+ "id": 0
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/test/TestConstants/TestConstants.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\n\n// solhint-disable max-line-length\ncontract TestConstants {\n \n using LibBytes for bytes;\n\n bytes4 constant internal ERC20_PROXY_ID = bytes4(keccak256(\"ERC20Token(address)\"));\n \n address constant internal KOVAN_ZRX_ADDRESS = 0x6Ff6C0Ff1d68b964901F986d4C9FA3ac68346570;\n bytes constant internal KOVAN_ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x6f\\xf6\\xc0\\xff\\x1d\\x68\\xb9\\x64\\x90\\x1f\\x98\\x6d\\x4c\\x9f\\xa3\\xac\\x68\\x34\\x65\\x70\";\n \n address constant internal MAINNET_ZRX_ADDRESS = 0xE41d2489571d322189246DaFA5ebDe1F4699F498;\n bytes constant public MAINNET_ZRX_ASSET_DATA = \"\\xf4\\x72\\x61\\xb0\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xe4\\x1d\\x24\\x89\\x57\\x1d\\x32\\x21\\x89\\x24\\x6d\\xaf\\xa5\\xeb\\xde\\x1f\\x46\\x99\\xf4\\x98\";\n \n function assertValidZrxAssetData()\n public\n pure\n returns (bool)\n {\n bytes memory kovanZrxAssetData = abi.encodeWithSelector(ERC20_PROXY_ID, KOVAN_ZRX_ADDRESS);\n require(\n kovanZrxAssetData.equals(KOVAN_ZRX_ASSET_DATA),\n \"INVALID_KOVAN_ZRX_ASSET_DATA\"\n );\n\n bytes memory mainetZrxAssetData = abi.encodeWithSelector(ERC20_PROXY_ID, MAINNET_ZRX_ADDRESS);\n require(\n mainetZrxAssetData.equals(MAINNET_ZRX_ASSET_DATA),\n \"INVALID_MAINNET_ZRX_ASSET_DATA\"\n );\n\n return true;\n }\n}\n// solhint-enable max-line-length",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xb5794744b3536d028632e570dfee6eba5773c0b152ae28b8428066e27d54420f",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestLibBytes.json b/packages/migrations/artifacts/2.0.0/TestLibBytes.json
new file mode 100644
index 000000000..7e9505d70
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestLibBytes.json
@@ -0,0 +1,426 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestLibBytes",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicPopLastByte",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "result",
+ "type": "bytes1"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadBytesWithLength",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "dest",
+ "type": "bytes"
+ },
+ {
+ "name": "source",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicDeepCopyBytes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "name": "input",
+ "type": "address"
+ }
+ ],
+ "name": "publicWriteAddress",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "name": "input",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicWriteBytesWithLength",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "mem",
+ "type": "bytes"
+ },
+ {
+ "name": "dest",
+ "type": "uint256"
+ },
+ {
+ "name": "source",
+ "type": "uint256"
+ },
+ {
+ "name": "length",
+ "type": "uint256"
+ }
+ ],
+ "name": "testMemcpy",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadAddress",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "name": "input",
+ "type": "bytes32"
+ }
+ ],
+ "name": "publicWriteBytes32",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicPopLast20Bytes",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "result",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "lhs",
+ "type": "bytes"
+ },
+ {
+ "name": "rhs",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicEqualsPop1",
+ "outputs": [
+ {
+ "name": "equal",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ },
+ {
+ "name": "input",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicWriteUint256",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadBytes32",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadBytes4",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "bytes4"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "b",
+ "type": "bytes"
+ },
+ {
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicReadUint256",
+ "outputs": [
+ {
+ "name": "result",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "lhs",
+ "type": "bytes"
+ },
+ {
+ "name": "rhs",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicEquals",
+ "outputs": [
+ {
+ "name": "equal",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b506114f8806100206000396000f3006080604052600436106100da5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630301d5e181146100df578063076eec08146101fb57806318c535d9146102cb5780633f2a25ec146103625780634b368768146103d957806378bbae9b1461047657806382e2fa24146104dc57806384f8775814610560578063a4b19654146105c2578063b1840e8d14610689578063b79650a414610734578063be766f1b14610796578063cc12cb2814610803578063e3a85ce414610893578063f06f300d146108ee575b600080fd5b3480156100eb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101389436949293602493928401919081908401838280828437509497506109859650505050505050565b6040518080602001837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001828103825284818151815260200191508051906020019080838360005b838110156101bf5781810151838201526020016101a7565b50505050905090810190601f1680156101ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561020757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375094975050933594506109999350505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610290578181015183820152602001610278565b50505050905090810190601f1680156102bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506109b29650505050505050565b34801561036e57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050505060209091013573ffffffffffffffffffffffffffffffffffffffff1690506109c5565b3480156103e557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b8a359b909a9099940197509195509182019350915081908401838280828437509497506109e09650505050505050565b34801561048257600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020830135926040013591506109f39050565b3480156104e857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105379436949293602493928401919081908401838280828437509497505093359450610a3d9350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561056c57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020909201359150610a4f9050565b3480156105ce57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261061b943694929360249392840191908190840183828082843750949750610a629650505050505050565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000838110156101bf5781810151838201526020016101a7565b34801561069557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261072094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610a6f9650505050505050565b604080519115158252519081900360200190f35b34801561074057600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020909201359150610a959050565b3480156107a257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526107f19436949293602493928401919081908401838280828437509497505093359450610aa89350505050565b60408051918252519081900360200190f35b34801561080f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261085e9436949293602493928401919081908401838280828437509497505093359450610aba9350505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561089f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526107f19436949293602493928401919081908401838280828437509497505093359450610acc9350505050565b3480156108fa57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261072094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610ade9650505050505050565b6060600061099283610af0565b9293915050565b60606109ab838363ffffffff610c0f16565b9392505050565b60606109be8383610cc5565b5090919050565b60606109d884848463ffffffff610d7d16565b509192915050565b60606109d884848463ffffffff610e6116565b60606000855183850111151515610a0957600080fd5b85518584011115610a1957600080fd5b610a2286610f20565b9050610a3385820185830185610f26565b5093949350505050565b60006109ab838363ffffffff610fe916565b60606109d884848463ffffffff6110a516565b6060600061099283611146565b6000610a7a83610af0565b50610a8482610af0565b506109ab838363ffffffff61121a16565b60606109d884848463ffffffff61134416565b60006109ab838363ffffffff61134f16565b60006109ab838363ffffffff6113f516565b60006109ab838363ffffffff6114bd16565b60006109ab838363ffffffff61121a16565b6000808251111515610b8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560448201527f4400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610bb957fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b60606000610c1d84846114bd565b9050602083019250808301845110151515610cbf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b50500190565b80518251811115610d5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f534f555243455f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b610d78610d6984610f20565b610d7284610f20565b83610f26565b505050565b8251601483011115610e1657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6014919092010180517fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091189052565b80518260200101835110151515610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b610d7882610f0c85610f20565b01610f16836114c9565b8351602001610f26565b60200190565b6020811015610f50576001816020036101000a038019835116818551168082178652505050610d78565b82821415610f5d57610d78565b82821115610f975760208103905080820181840181515b82851015610f8f578451865260209586019590940193610f74565b905250610d78565b60208103905080820181840183515b81861215610fe057825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190610fa6565b85525050505050565b60008160140183511015151561108657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b825160208301111561113e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b910160200152565b600060148251101515156111e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6111ef826014845103610fe9565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000815183511480156109ab5750816040518082805190602001908083835b6020831061127657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611239565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061130b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112ce565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916149392505050565b610d788383836110a5565b6000816020018351101515156113ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016020015190565b60008160040183511015151561149257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160448201527f5549524544000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006109ab838361134f565b905600a165627a7a72305820ba7b4c0f930a784427242f01fcb14fd9900b2467aebb82d18d9264cfa7cad0c00029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x14F8 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xDA JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x301D5E1 DUP2 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x76EEC08 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x18C535D9 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0x3F2A25EC EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x4B368768 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0x78BBAE9B EQ PUSH2 0x476 JUMPI DUP1 PUSH4 0x82E2FA24 EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0x84F87758 EQ PUSH2 0x560 JUMPI DUP1 PUSH4 0xA4B19654 EQ PUSH2 0x5C2 JUMPI DUP1 PUSH4 0xB1840E8D EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0xB79650A4 EQ PUSH2 0x734 JUMPI DUP1 PUSH4 0xBE766F1B EQ PUSH2 0x796 JUMPI DUP1 PUSH4 0xCC12CB28 EQ PUSH2 0x803 JUMPI DUP1 PUSH4 0xE3A85CE4 EQ PUSH2 0x893 JUMPI DUP1 PUSH4 0xF06F300D EQ PUSH2 0x8EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x138 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x985 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1A7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1EC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x999 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x290 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x278 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2BD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x9B2 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP POP PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x9C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 DUP11 CALLDATALOAD SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x9E0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x40 ADD CALLDATALOAD SWAP2 POP PUSH2 0x9F3 SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x537 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xA3D SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 POP PUSH2 0xA4F SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x61B SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xA62 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 DUP2 LT ISZERO PUSH2 0x1BF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x695 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x720 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xA6F SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x740 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 POP PUSH2 0xA95 SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x7F1 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xAA8 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x80F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x85E SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xABA SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x7F1 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xACC SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x720 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xADE SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x992 DUP4 PUSH2 0xAF0 JUMP JUMPDEST SWAP3 SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xC0F AND JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9BE DUP4 DUP4 PUSH2 0xCC5 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xD7D AND JUMP JUMPDEST POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xE61 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD DUP4 DUP6 ADD GT ISZERO ISZERO ISZERO PUSH2 0xA09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0xA19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA22 DUP7 PUSH2 0xF20 JUMP JUMPDEST SWAP1 POP PUSH2 0xA33 DUP6 DUP3 ADD DUP6 DUP4 ADD DUP6 PUSH2 0xF26 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xFE9 AND JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10A5 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x992 DUP4 PUSH2 0x1146 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA7A DUP4 PUSH2 0xAF0 JUMP JUMPDEST POP PUSH2 0xA84 DUP3 PUSH2 0xAF0 JUMP JUMPDEST POP PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x121A AND JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1344 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x134F AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13F5 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x14BD AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x121A AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0xB89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xBB9 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC1D DUP5 DUP5 PUSH2 0x14BD JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xCBF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 MLOAD DUP2 GT ISZERO PUSH2 0xD5D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F534F555243455F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD78 PUSH2 0xD69 DUP5 PUSH2 0xF20 JUMP JUMPDEST PUSH2 0xD72 DUP5 PUSH2 0xF20 JUMP JUMPDEST DUP4 PUSH2 0xF26 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 MLOAD PUSH1 0x14 DUP4 ADD GT ISZERO PUSH2 0xE16 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x14 SWAP2 SWAP1 SWAP3 ADD ADD DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 XOR SWAP1 MSTORE JUMP JUMPDEST DUP1 MLOAD DUP3 PUSH1 0x20 ADD ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xEFF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD78 DUP3 PUSH2 0xF0C DUP6 PUSH2 0xF20 JUMP JUMPDEST ADD PUSH2 0xF16 DUP4 PUSH2 0x14C9 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 ADD PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF50 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xD78 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xF5D JUMPI PUSH2 0xD78 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xF97 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xF8F JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xF74 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0xD78 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0xFE0 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xFA6 JUMP JUMPDEST DUP6 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1086 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP4 ADD GT ISZERO PUSH2 0x113E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP2 ADD PUSH1 0x20 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x11E1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11EF DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0xFE9 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x9AB JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1276 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1239 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x130B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD78 DUP4 DUP4 DUP4 PUSH2 0x10A5 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13EC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1492 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH2 0x134F JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xba PUSH28 0x4C0F930A784427242F01FCB14FD9900B2467AEBB82D18D9264CFA7CA 0xd0 0xc0 STOP 0x29 ",
+ "sourceMap": "651:7079:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;651:7079:0;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100da5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630301d5e181146100df578063076eec08146101fb57806318c535d9146102cb5780633f2a25ec146103625780634b368768146103d957806378bbae9b1461047657806382e2fa24146104dc57806384f8775814610560578063a4b19654146105c2578063b1840e8d14610689578063b79650a414610734578063be766f1b14610796578063cc12cb2814610803578063e3a85ce414610893578063f06f300d146108ee575b600080fd5b3480156100eb57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101389436949293602493928401919081908401838280828437509497506109859650505050505050565b6040518080602001837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001828103825284818151815260200191508051906020019080838360005b838110156101bf5781810151838201526020016101a7565b50505050905090810190601f1680156101ec5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561020757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375094975050933594506109999350505050565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610290578181015183820152602001610278565b50505050905090810190601f1680156102bd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102d757600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506109b29650505050505050565b34801561036e57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050505060209091013573ffffffffffffffffffffffffffffffffffffffff1690506109c5565b3480156103e557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261025694369492936024939284019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b8a359b909a9099940197509195509182019350915081908401838280828437509497506109e09650505050505050565b34801561048257600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020830135926040013591506109f39050565b3480156104e857600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526105379436949293602493928401919081908401838280828437509497505093359450610a3d9350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561056c57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020909201359150610a4f9050565b3480156105ce57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261061b943694929360249392840191908190840183828082843750949750610a629650505050505050565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182810382528481815181526020019150805190602001908083836000838110156101bf5781810151838201526020016101a7565b34801561069557600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261072094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610a6f9650505050505050565b604080519115158252519081900360200190f35b34801561074057600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610256943694929360249392840191908190840183828082843750949750508435955050506020909201359150610a959050565b3480156107a257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526107f19436949293602493928401919081908401838280828437509497505093359450610aa89350505050565b60408051918252519081900360200190f35b34801561080f57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261085e9436949293602493928401919081908401838280828437509497505093359450610aba9350505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b34801561089f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526107f19436949293602493928401919081908401838280828437509497505093359450610acc9350505050565b3480156108fa57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261072094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610ade9650505050505050565b6060600061099283610af0565b9293915050565b60606109ab838363ffffffff610c0f16565b9392505050565b60606109be8383610cc5565b5090919050565b60606109d884848463ffffffff610d7d16565b509192915050565b60606109d884848463ffffffff610e6116565b60606000855183850111151515610a0957600080fd5b85518584011115610a1957600080fd5b610a2286610f20565b9050610a3385820185830185610f26565b5093949350505050565b60006109ab838363ffffffff610fe916565b60606109d884848463ffffffff6110a516565b6060600061099283611146565b6000610a7a83610af0565b50610a8482610af0565b506109ab838363ffffffff61121a16565b60606109d884848463ffffffff61134416565b60006109ab838363ffffffff61134f16565b60006109ab838363ffffffff6113f516565b60006109ab838363ffffffff6114bd16565b60006109ab838363ffffffff61121a16565b6000808251111515610b8957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560448201527f4400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610bb957fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b60606000610c1d84846114bd565b9050602083019250808301845110151515610cbf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b50500190565b80518251811115610d5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f534f555243455f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b610d78610d6984610f20565b610d7284610f20565b83610f26565b505050565b8251601483011115610e1657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6014919092010180517fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091189052565b80518260200101835110151515610eff57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f475245415445525f4f525f455155414c5f544f5f4e45535445445f425954455360448201527f5f4c454e4754485f524551554952454400000000000000000000000000000000606482015290519081900360840190fd5b610d7882610f0c85610f20565b01610f16836114c9565b8351602001610f26565b60200190565b6020811015610f50576001816020036101000a038019835116818551168082178652505050610d78565b82821415610f5d57610d78565b82821115610f975760208103905080820181840181515b82851015610f8f578451865260209586019590940193610f74565b905250610d78565b60208103905080820181840183515b81861215610fe057825182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09283019290910190610fa6565b85525050505050565b60008160140183511015151561108657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016014015173ffffffffffffffffffffffffffffffffffffffff1690565b825160208301111561113e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b910160200152565b600060148251101515156111e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6111ef826014845103610fe9565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b6000815183511480156109ab5750816040518082805190602001908083835b6020831061127657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611239565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052604051919093018190038120885190955088945090928392508401908083835b6020831061130b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016112ce565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902060001916149392505050565b610d788383836110a5565b6000816020018351101515156113ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016020015190565b60008160040183511015151561149257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f475245415445525f4f525f455155414c5f544f5f345f4c454e4754485f52455160448201527f5549524544000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b5050602001517fffffffff000000000000000000000000000000000000000000000000000000001690565b60006109ab838361134f565b905600a165627a7a72305820ba7b4c0f930a784427242f01fcb14fd9900b2467aebb82d18d9264cfa7cad0c00029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xDA JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x301D5E1 DUP2 EQ PUSH2 0xDF JUMPI DUP1 PUSH4 0x76EEC08 EQ PUSH2 0x1FB JUMPI DUP1 PUSH4 0x18C535D9 EQ PUSH2 0x2CB JUMPI DUP1 PUSH4 0x3F2A25EC EQ PUSH2 0x362 JUMPI DUP1 PUSH4 0x4B368768 EQ PUSH2 0x3D9 JUMPI DUP1 PUSH4 0x78BBAE9B EQ PUSH2 0x476 JUMPI DUP1 PUSH4 0x82E2FA24 EQ PUSH2 0x4DC JUMPI DUP1 PUSH4 0x84F87758 EQ PUSH2 0x560 JUMPI DUP1 PUSH4 0xA4B19654 EQ PUSH2 0x5C2 JUMPI DUP1 PUSH4 0xB1840E8D EQ PUSH2 0x689 JUMPI DUP1 PUSH4 0xB79650A4 EQ PUSH2 0x734 JUMPI DUP1 PUSH4 0xBE766F1B EQ PUSH2 0x796 JUMPI DUP1 PUSH4 0xCC12CB28 EQ PUSH2 0x803 JUMPI DUP1 PUSH4 0xE3A85CE4 EQ PUSH2 0x893 JUMPI DUP1 PUSH4 0xF06F300D EQ PUSH2 0x8EE JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xEB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x138 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x985 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1A7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1EC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x207 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0x999 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x290 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x278 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x2BD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2D7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x9B2 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP POP PUSH1 0x20 SWAP1 SWAP2 ADD CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH2 0x9C5 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3E5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 DUP11 CALLDATALOAD SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x9E0 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x482 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 DUP4 ADD CALLDATALOAD SWAP3 PUSH1 0x40 ADD CALLDATALOAD SWAP2 POP PUSH2 0x9F3 SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4E8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x537 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xA3D SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x56C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 POP PUSH2 0xA4F SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5CE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x61B SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xA62 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP5 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 DUP4 DUP2 LT ISZERO PUSH2 0x1BF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x695 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x720 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xA6F SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x740 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x256 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP DUP5 CALLDATALOAD SWAP6 POP POP POP PUSH1 0x20 SWAP1 SWAP3 ADD CALLDATALOAD SWAP2 POP PUSH2 0xA95 SWAP1 POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7A2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x7F1 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xAA8 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x80F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x85E SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xABA SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x89F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x7F1 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP POP SWAP4 CALLDATALOAD SWAP5 POP PUSH2 0xACC SWAP4 POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8FA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x720 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xADE SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x992 DUP4 PUSH2 0xAF0 JUMP JUMPDEST SWAP3 SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xC0F AND JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9BE DUP4 DUP4 PUSH2 0xCC5 JUMP JUMPDEST POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xD7D AND JUMP JUMPDEST POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0xE61 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 DUP6 MLOAD DUP4 DUP6 ADD GT ISZERO ISZERO ISZERO PUSH2 0xA09 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0xA19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xA22 DUP7 PUSH2 0xF20 JUMP JUMPDEST SWAP1 POP PUSH2 0xA33 DUP6 DUP3 ADD DUP6 DUP4 ADD DUP6 PUSH2 0xF26 JUMP JUMPDEST POP SWAP4 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0xFE9 AND JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x10A5 AND JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0x992 DUP4 PUSH2 0x1146 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA7A DUP4 PUSH2 0xAF0 JUMP JUMPDEST POP PUSH2 0xA84 DUP3 PUSH2 0xAF0 JUMP JUMPDEST POP PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x121A AND JUMP JUMPDEST PUSH1 0x60 PUSH2 0x9D8 DUP5 DUP5 DUP5 PUSH4 0xFFFFFFFF PUSH2 0x1344 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x134F AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x13F5 AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x14BD AND JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x121A AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0xB89 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0xBB9 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x0 PUSH2 0xC1D DUP5 DUP5 PUSH2 0x14BD JUMP JUMPDEST SWAP1 POP PUSH1 0x20 DUP4 ADD SWAP3 POP DUP1 DUP4 ADD DUP5 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xCBF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD DUP3 MLOAD DUP2 GT ISZERO PUSH2 0xD5D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F534F555243455F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD78 PUSH2 0xD69 DUP5 PUSH2 0xF20 JUMP JUMPDEST PUSH2 0xD72 DUP5 PUSH2 0xF20 JUMP JUMPDEST DUP4 PUSH2 0xF26 JUMP JUMPDEST POP POP POP JUMP JUMPDEST DUP3 MLOAD PUSH1 0x14 DUP4 ADD GT ISZERO PUSH2 0xE16 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH1 0x14 SWAP2 SWAP1 SWAP3 ADD ADD DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 XOR SWAP1 MSTORE JUMP JUMPDEST DUP1 MLOAD DUP3 PUSH1 0x20 ADD ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0xEFF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x30 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F4E45535445445F4259544553 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5F4C454E4754485F524551554952454400000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0xD78 DUP3 PUSH2 0xF0C DUP6 PUSH2 0xF20 JUMP JUMPDEST ADD PUSH2 0xF16 DUP4 PUSH2 0x14C9 JUMP JUMPDEST DUP4 MLOAD PUSH1 0x20 ADD PUSH2 0xF26 JUMP JUMPDEST PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xF50 JUMPI PUSH1 0x1 DUP2 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP4 MLOAD AND DUP2 DUP6 MLOAD AND DUP1 DUP3 OR DUP7 MSTORE POP POP POP PUSH2 0xD78 JUMP JUMPDEST DUP3 DUP3 EQ ISZERO PUSH2 0xF5D JUMPI PUSH2 0xD78 JUMP JUMPDEST DUP3 DUP3 GT ISZERO PUSH2 0xF97 JUMPI PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP2 MLOAD JUMPDEST DUP3 DUP6 LT ISZERO PUSH2 0xF8F JUMPI DUP5 MLOAD DUP7 MSTORE PUSH1 0x20 SWAP6 DUP7 ADD SWAP6 SWAP1 SWAP5 ADD SWAP4 PUSH2 0xF74 JUMP JUMPDEST SWAP1 MSTORE POP PUSH2 0xD78 JUMP JUMPDEST PUSH1 0x20 DUP2 SUB SWAP1 POP DUP1 DUP3 ADD DUP2 DUP5 ADD DUP4 MLOAD JUMPDEST DUP2 DUP7 SLT ISZERO PUSH2 0xFE0 JUMPI DUP3 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0xFA6 JUMP JUMPDEST DUP6 MSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1086 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 MLOAD PUSH1 0x20 DUP4 ADD GT ISZERO PUSH2 0x113E JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST SWAP2 ADD PUSH1 0x20 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x11E1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11EF DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0xFE9 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD DUP4 MLOAD EQ DUP1 ISZERO PUSH2 0x9AB JUMPI POP DUP2 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1276 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1239 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP9 MLOAD SWAP1 SWAP6 POP DUP9 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x130B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x12CE JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 NOT AND EQ SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD78 DUP4 DUP4 DUP4 PUSH2 0x10A5 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x13EC JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x4 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1492 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F345F4C454E4754485F524551 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5549524544000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x20 ADD MLOAD PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9AB DUP4 DUP4 PUSH2 0x134F JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xba PUSH28 0x4C0F930A784427242F01FCB14FD9900B2467AEBB82D18D9264CFA7CA 0xd0 0xc0 STOP 0x29 ",
+ "sourceMap": "651:7079:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;889:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;889:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;889:190:0;;-1:-1:-1;889:190:0;;-1:-1:-1;;;;;;;889:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;889:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5966:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5966:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5966:235:0;;-1:-1:-1;;5966:235:0;;;-1:-1:-1;5966:235:0;;-1:-1:-1;;;;5966:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5966:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2360:228;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2360:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2360:228:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2360:228:0;;;;-1:-1:-1;2360:228:0;-1:-1:-1;2360:228:0;;-1:-1:-1;2360:228:0;;;;;;;;-1:-1:-1;2360:228:0;;-1:-1:-1;2360:228:0;;-1:-1:-1;;;;;;;2360:228:0;3253:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3253:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3253:230:0;;-1:-1:-1;;3253:230:0;;;-1:-1:-1;;;;3253:230:0;;;;;;;;-1:-1:-1;3253:230:0;;6460:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6460:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6460:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6460:251:0;;-1:-1:-1;6460:251:0;;;;-1:-1:-1;6460:251:0;-1:-1:-1;6460:251:0;;;;;;;;;;-1:-1:-1;6460:251:0;;-1:-1:-1;6460:251:0;;-1:-1:-1;;;;;;;6460:251:0;7080:648;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7080:648:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7080:648:0;;-1:-1:-1;;7080:648:0;;;-1:-1:-1;;;7080:648:0;;;;;;;;;-1:-1:-1;7080:648:0;;-1:-1:-1;7080:648:0;2802:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2802:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2802:214:0;;-1:-1:-1;;2802:214:0;;;-1:-1:-1;2802:214:0;;-1:-1:-1;;;;2802:214:0;;;;;;;;;;;;;;;;;;;;4169:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4169:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4169:230:0;;-1:-1:-1;;4169:230:0;;;-1:-1:-1;;;4169:230:0;;;;;;-1:-1:-1;4169:230:0;;-1:-1:-1;4169:230:0;1274:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1274:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1274:197:0;;-1:-1:-1;1274:197:0;;-1:-1:-1;;;;;;;1274:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1875:239:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1875:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1875:239:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1875:239:0;;;;-1:-1:-1;1875:239:0;-1:-1:-1;1875:239:0;;-1:-1:-1;1875:239:0;;;;;;;;-1:-1:-1;1875:239:0;;-1:-1:-1;1875:239:0;;-1:-1:-1;;;;;;;1875:239:0;;;;;;;;;;;;;;;;;;;5085:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5085:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5085:230:0;;-1:-1:-1;;5085:230:0;;;-1:-1:-1;;;5085:230:0;;;;;;-1:-1:-1;5085:230:0;;-1:-1:-1;5085:230:0;3719:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3719:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3719:214:0;;-1:-1:-1;;3719:214:0;;;-1:-1:-1;3719:214:0;;-1:-1:-1;;;;3719:214:0;;;;;;;;;;;;;;;;;5557:211;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5557:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5557:211:0;;-1:-1:-1;;5557:211:0;;;-1:-1:-1;5557:211:0;;-1:-1:-1;;;;5557:211:0;;;;;;;;;;;;;;;;;;;;4635:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4635:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4635:214:0;;-1:-1:-1;;4635:214:0;;;-1:-1:-1;4635:214:0;;-1:-1:-1;;;;4635:214:0;1684:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1684:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1684:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1684:181:0;;;;-1:-1:-1;1684:181:0;-1:-1:-1;1684:181:0;;-1:-1:-1;1684:181:0;;;;;;;;-1:-1:-1;1684:181:0;;-1:-1:-1;1684:181:0;;-1:-1:-1;;;;;;;1684:181:0;889:190;977:5;991:13;1029:15;:1;:13;:15::i;:::-;1062:1;;889:190;-1:-1:-1;;889:190:0:o;5966:235::-;6099:19;6143:28;:1;6165:5;6143:28;:21;:28;:::i;:::-;6134:37;5966:235;-1:-1:-1;;;5966:235:0:o;2360:228::-;2496:5;2524:36;2547:4;2553:6;2524:22;:36::i;:::-;-1:-1:-1;2577:4:0;;2360:228;-1:-1:-1;2360:228:0:o;3253:230::-;3402:5;3430:28;:1;3445:5;3452;3430:28;:14;:28;:::i;:::-;-1:-1:-1;3475:1:0;;3253:230;-1:-1:-1;;3253:230:0:o;6460:251::-;6622:5;6650:36;:1;6673:5;6680;6650:36;:22;:36;:::i;7080:648::-;7281:5;7491:14;7381:3;:10;7371:6;7362;:15;:29;;7354:38;;;;;;;;7427:10;;7410:13;;;:27;;7402:36;;;;;;7508:20;:3;:18;:20::i;:::-;7491:37;;7601:56;7627:4;7618:6;:13;7642:6;7633;:15;7650:6;7601:16;:56::i;:::-;-1:-1:-1;7718:3:0;;7080:648;-1:-1:-1;;;;7080:648:0:o;2802:214::-;2927:14;2966:20;:1;2980:5;2966:20;:13;:20;:::i;4169:230::-;4318:5;4346:28;:1;4361:5;4368;4346:28;:14;:28;:::i;1274:197::-;1365:5;1379:14;1418:18;:1;:16;:18::i;1875:239::-;1982:10;2008:17;:3;:15;:17::i;:::-;;2035;:3;:15;:17::i;:::-;-1:-1:-1;2070:15:0;:3;2081;2070:15;:10;:15;:::i;5085:230::-;5234:5;5262:28;:1;5277:5;5284;5262:28;:14;:28;:::i;3719:214::-;3844:14;3883:20;:1;3897:5;3883:20;:13;:20;:::i;5557:211::-;5681:13;5719:19;:1;5732:5;5719:19;:12;:19;:::i;4635:214::-;4760:14;4799:20;:1;4813:5;4799:20;:13;:20;:::i;1684:181::-;1787:10;1821:15;:3;1832;1821:15;:10;:15;:::i;8304:448:1:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:1;;;;;;;8304:448::o;16441:672::-;16570:19;16644:25;16672:21;16684:1;16687:5;16672:11;:21::i;:::-;16644:49;;16712:2;16703:11;;;;16848:17;16840:5;:25;16828:1;:8;:37;;16807:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17061:13:1;;16441:672::o;18206:504::-;18355:13;;18483:11;;:24;-1:-1:-1;18483:24:1;18462:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18591:112;18612:21;:4;:19;:21::i;:::-;18647:23;:6;:21;:23::i;:::-;18684:9;18591:7;:112::i;:::-;18206:504;;;:::o;11382:1663::-;11545:8;;11565:2;11557:10;;-1:-1:-1;11545:22:1;11524:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11906:2;12612:13;;;;;12606:20;;12644:66;12585:139;12869:42;12858:54;;;13007:21;;;;12985:44;;11971:1068::o;17329:631::-;17605:5;:12;17592:5;17600:2;17592:10;:25;17580:1;:8;:37;;17559:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17764:189;17806:5;17785:18;:1;:16;:18::i;:::-;:26;17825:18;:5;:16;:18::i;:::-;17887:5;:12;17902:2;17887:17;17764:7;:189::i;1341:228::-;1520:2;1509:14;;1341:228::o;1808:4337::-;1958:2;1949:6;:11;1945:4194;;;2247:1;2237:6;2233:2;2229:15;2224:3;2220:25;2216:33;2298:4;2294:9;2285:6;2279:13;2275:29;2347:4;2340;2334:11;2330:22;2388:1;2385;2382:8;2376:4;2369:22;2186:219;;;;;;2509:4;2499:6;:14;2495:59;;;2533:7;;2495:59;3243:4;3234:6;:13;3230:2899;;;3569:2;3561:6;3557:15;3547:25;;3617:6;3609;3605:19;3667:6;3661:4;3657:17;3974:4;3968:11;4242:198;4260:4;4252:6;4249:16;4242:198;;;4308:13;;4295:27;;4369:2;4405:13;;;;4357:15;;;;4242:198;;;4529:18;;-1:-1:-1;3276:1289:1;;;4810:2;4802:6;4798:15;4788:25;;4858:6;4850;4846:19;4908:6;4902:4;4898:17;5218:6;5212:13;5797:191;5814:4;5808;5804:15;5797:191;;;5862:11;;5849:25;;5907:13;;;;;5953;;;;5797:191;;;6078:19;;-1:-1:-1;;1808:4337:1;;;:::o;10259:886::-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:1;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o;14007:456::-;14170:8;;14190:2;14182:10;;-1:-1:-1;14170:22:1;14149:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14426:13;;14337:2;14426:13;14419:28;14405:52::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:1;8947:482::o;9642:403::-;9763:10;9992:3;:10;9978:3;:10;:24;:60;;;;;10034:3;10024:14;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;10024:14:1;;;;;;;;;;;10006;;10024;;-1:-1:-1;10006:14:1;;-1:-1:-1;10024:14:1;;;;-1:-1:-1;10006:14:1;;;;10024;10006;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10006:14:1;;;;;;;;;;;;;;;;:32;;;;9971:67;9642:403;-1:-1:-1;;;9642:403:1:o;15130:187::-;15272:38;15285:1;15288:5;15303;15272:12;:38::i;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:1;13620:2;13718:13;13712:20;;13281:490::o;15559:559::-;15679:13;15741:5;15749:1;15741:9;15729:1;:8;:21;;15708:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15869:2:1;15862:10;15856:17;16012:66;16000:79;;15559:559::o;14699:195::-;14820:14;14865:21;14877:1;14880:5;14865:11;:21::i;922:215::-;1086:5;922:215::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/test/TestLibBytes/TestLibBytes.sol": {
+ "id": 0
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/test/TestLibBytes/TestLibBytes.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\n\ncontract TestLibBytes {\n \n using LibBytes for bytes;\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function publicPopLastByte(bytes memory b)\n public\n pure\n returns (bytes memory, bytes1 result)\n {\n result = b.popLastByte();\n return (b, result);\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function publicPopLast20Bytes(bytes memory b)\n public\n pure\n returns (bytes memory, address result)\n {\n result = b.popLast20Bytes();\n return (b, result);\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function publicEquals(bytes memory lhs, bytes memory rhs)\n public\n pure\n returns (bool equal)\n {\n equal = lhs.equals(rhs);\n return equal;\n }\n \n function publicEqualsPop1(bytes memory lhs, bytes memory rhs)\n public\n pure\n returns (bool equal)\n {\n lhs.popLastByte();\n rhs.popLastByte();\n equal = lhs.equals(rhs);\n return equal;\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function publicDeepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n public\n pure\n returns (bytes memory)\n {\n LibBytes.deepCopyBytes(dest, source);\n return dest;\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function publicReadAddress(\n bytes memory b,\n uint256 index\n )\n public\n pure\n returns (address result)\n {\n result = b.readAddress(index);\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function publicWriteAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n public\n pure\n returns (bytes memory)\n {\n b.writeAddress(index, input);\n return b;\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function publicReadBytes32(\n bytes memory b,\n uint256 index\n )\n public\n pure\n returns (bytes32 result)\n {\n result = b.readBytes32(index);\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function publicWriteBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n public\n pure\n returns (bytes memory)\n {\n b.writeBytes32(index, input);\n return b;\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function publicReadUint256(\n bytes memory b,\n uint256 index\n )\n public\n pure\n returns (uint256 result)\n {\n result = b.readUint256(index);\n return result;\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function publicWriteUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n public\n pure\n returns (bytes memory)\n {\n b.writeUint256(index, input);\n return b;\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function publicReadBytes4(\n bytes memory b,\n uint256 index\n )\n public\n pure\n returns (bytes4 result)\n {\n result = b.readBytes4(index);\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function publicReadBytesWithLength(\n bytes memory b,\n uint256 index\n )\n public\n pure\n returns (bytes memory result)\n {\n result = b.readBytesWithLength(index);\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n /// @return b Updated input byte array\n function publicWriteBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n public\n pure\n returns (bytes memory)\n {\n b.writeBytesWithLength(index, input);\n return b;\n }\n \n /// @dev Copies a block of memory from one location to another.\n /// @param mem Memory contents we want to apply memCopy to\n /// @param dest Destination offset into <mem>.\n /// @param source Source offset into <mem>.\n /// @param length Length of bytes to copy from <source> to <dest>\n /// @return mem Memory contents after calling memCopy.\n function testMemcpy(\n bytes mem,\n uint256 dest,\n uint256 source,\n uint256 length\n )\n public // not external, we need input in memory\n pure\n returns (bytes)\n {\n // Sanity check. Overflows are not checked.\n require(source + length <= mem.length);\n require(dest + length <= mem.length);\n\n // Get pointer to memory contents\n uint256 offset = mem.contentAddress();\n\n // Execute memCopy adjusted for memory array location\n LibBytes.memCopy(offset + dest, offset + source, length);\n\n // Return modified memory contents\n return mem;\n }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x576c249cc9fbe26dcf247612088418c48ae9deb865ccc461cf72c637a4acc6d0",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestLibs.json b/packages/migrations/artifacts/2.0.0/TestLibs.json
new file mode 100644
index 000000000..02adb277d
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestLibs.json
@@ -0,0 +1,396 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestLibs",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "name": "denominator",
+ "type": "uint256"
+ },
+ {
+ "name": "target",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicGetPartialAmount",
+ "outputs": [
+ {
+ "name": "partialAmount",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getDomainSeparatorSchemaHash",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalFillResults",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "singleFillResults",
+ "type": "tuple"
+ }
+ ],
+ "name": "publicAddFillResults",
+ "outputs": [
+ {
+ "components": [
+ {
+ "name": "makerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "takerAssetFilledAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "makerFeePaid",
+ "type": "uint256"
+ },
+ {
+ "name": "takerFeePaid",
+ "type": "uint256"
+ }
+ ],
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getOrderSchemaHash",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "numerator",
+ "type": "uint256"
+ },
+ {
+ "name": "denominator",
+ "type": "uint256"
+ },
+ {
+ "name": "target",
+ "type": "uint256"
+ }
+ ],
+ "name": "publicIsRoundingError",
+ "outputs": [
+ {
+ "name": "isError",
+ "type": "bool"
+ }
+ ],
+ "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": "publicGetOrderHash",
+ "outputs": [
+ {
+ "name": "orderHash",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EIP712_DOMAIN_HASH",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "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": "order",
+ "type": "tuple"
+ },
+ {
+ "name": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicAbiEncodeFillOrder",
+ "outputs": [
+ {
+ "name": "fillOrderCalldata",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "pure",
+ "type": "function"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x7f454950373132446f6d61696e280000000000000000000000000000000000000060a09081527f737472696e67206e616d652c000000000000000000000000000000000000000060ad527f737472696e672076657273696f6e2c000000000000000000000000000000000060b9527f6164647265737320766572696679696e67436f6e74726163740000000000000060c8527f290000000000000000000000000000000000000000000000000000000000000060e1526042608081815260e26040819052909290918291908083835b602083106100ed5780518252601f1990920191602091820191016100ce565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101755780518252601f199092019160209182019101610156565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101fd5780518252601f1990920191602091820191016101de565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208282019890985281840196909652606081019690965250306080808701919091528151808703909101815260a09095019081905284519093849350850191508083835b602083106102865780518252601f199092019160209182019101610267565b5181516000196020949094036101000a9390930192831692191691909117905260405192018290039091206000555050506113b8806102c66000396000f30060806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663041e63fe8114610092578063494d9297146100c857806366758d7b146100dd5780637d33c6ee1461010a5780638ae633161461011f578063d98020881461014c578063e306f7791461016c578063e9c7aa1a14610181575b600080fd5b34801561009e57600080fd5b506100b26100ad366004611131565b6101ae565b6040516100bf919061124f565b60405180910390f35b3480156100d457600080fd5b506100b26101c3565b3480156100e957600080fd5b506100fd6100f8366004611045565b61031b565b6040516100bf919061127e565b34801561011657600080fd5b506100b2610336565b34801561012b57600080fd5b5061013f61013a366004611131565b6105b6565b6040516100bf9190611241565b34801561015857600080fd5b506100b2610167366004611080565b6105c3565b34801561017857600080fd5b506100b26105ce565b34801561018d57600080fd5b506101a161019c3660046110b5565b6105d4565b6040516100bf919061125d565b60006101bb8484846105e1565b949350505050565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825160428184030181526062909201928390528151600093918291908401908083835b602083106102e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102ac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b610323610df1565b61032d83836105f6565b50815b92915050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009391829190840190808383602083106102e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102ac565b60006101bb848484610658565b6000610330826106ae565b60005481565b60606101bb8484846106c1565b60006101bb6105f08584610893565b84610902565b815181516106049190610919565b82526020808301519082015161061a9190610919565b6020830152604080830151908201516106339190610919565b60408301526060808301519082015161064c9190610919565b60609092019190915250565b60008060008480151561066757fe5b868509915081151561067c57600092506106a5565b61069b61068c83620f4240610893565b6106968887610893565b610902565b6103e88111935090505b50509392505050565b60006103306106bc83610958565b610db1565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156107c85783518552602094850194909301926001016107aa565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b818110156108115783518552602094850194909301926001016107f3565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b8181101561085957835185526020948501949093019260010161083b565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b6000808315156108a657600091506108fb565b508282028284828115156108b657fe5b04146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061126e565b60405180910390fd5b8091505b5092915050565b600080828481151561091057fe5b04949350505050565b6000828201838110156108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061126e565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310610be057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610ba3565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310610c7b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c3e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310610d1657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610cd9565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610e268235611305565b9392505050565b6000601f82018313610e3e57600080fd5b8135610e51610e4c826112b3565b61128c565b91508082526020830160208301858383011115610e6d57600080fd5b610e7883828461131e565b50505092915050565b600060808284031215610e9357600080fd5b610e9d608061128c565b90506000610eab8484611039565b8252506020610ebc84848301611039565b6020830152506040610ed084828501611039565b6040830152506060610ee484828501611039565b60608301525092915050565b60006101808284031215610f0357600080fd5b610f0e61018061128c565b90506000610f1c8484610e1a565b8252506020610f2d84848301610e1a565b6020830152506040610f4184828501610e1a565b6040830152506060610f5584828501610e1a565b6060830152506080610f6984828501611039565b60808301525060a0610f7d84828501611039565b60a08301525060c0610f9184828501611039565b60c08301525060e0610fa584828501611039565b60e083015250610100610fba84828501611039565b61010083015250610120610fd084828501611039565b6101208301525061014082013567ffffffffffffffff811115610ff257600080fd5b610ffe84828501610e2d565b6101408301525061016082013567ffffffffffffffff81111561102057600080fd5b61102c84828501610e2d565b6101608301525092915050565b6000610e268235611302565b600080610100838503121561105957600080fd5b60006110658585610e81565b925050608061107685828601610e81565b9150509250929050565b60006020828403121561109257600080fd5b813567ffffffffffffffff8111156110a957600080fd5b6101bb84828501610ef0565b6000806000606084860312156110ca57600080fd5b833567ffffffffffffffff8111156110e157600080fd5b6110ed86828701610ef0565b93505060206110fe86828701611039565b925050604084013567ffffffffffffffff81111561111b57600080fd5b61112786828701610e2d565b9150509250925092565b60008060006060848603121561114657600080fd5b60006111528686611039565b935050602061116386828701611039565b925050604061112786828701611039565b61117d816112fd565b82525050565b61117d81611302565b6000611197826112f9565b8084526111ab81602086016020860161132a565b6111b481611356565b9093016020019392505050565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b805160808301906112028482611183565b5060208201516112156020850182611183565b5060408201516112286040850182611183565b50606082015161123b6060850182611183565b50505050565b602081016103308284611174565b602081016103308284611183565b60208082528101610e26818461118c565b60208082528101610330816111c1565b6080810161033082846111f1565b60405181810167ffffffffffffffff811182821017156112ab57600080fd5b604052919050565b600067ffffffffffffffff8211156112ca57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b151590565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561134557818101518382015260200161132d565b8381111561123b5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820843158b32ba1371bbd94889c3cc24c2ed50165e2c2d248763814d58efe32c7746c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0xAD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0xB9 MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0xC8 MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0xE1 MSTORE PUSH1 0x42 PUSH1 0x80 DUP2 DUP2 MSTORE PUSH1 0xE2 PUSH1 0x40 DUP2 SWAP1 MSTORE SWAP1 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xED JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x175 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x156 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1FD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1DE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP3 ADD SWAP9 SWAP1 SWAP9 MSTORE DUP2 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE POP ADDRESS PUSH1 0x80 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP8 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP6 ADD SWAP1 DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 SWAP4 DUP5 SWAP4 POP DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x286 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x267 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x0 SSTORE POP POP POP PUSH2 0x13B8 DUP1 PUSH2 0x2C6 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x41E63FE DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x494D9297 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x66758D7B EQ PUSH2 0xDD JUMPI DUP1 PUSH4 0x7D33C6EE EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x8AE63316 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xD9802088 EQ PUSH2 0x14C JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x16C JUMPI DUP1 PUSH4 0xE9C7AA1A EQ PUSH2 0x181 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x1131 JUMP JUMPDEST PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x124F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x1C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFD PUSH2 0xF8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1045 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x127E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x336 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13F PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x1131 JUMP JUMPDEST PUSH2 0x5B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x1241 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x158 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x167 CALLDATASIZE PUSH1 0x4 PUSH2 0x1080 JUMP JUMPDEST PUSH2 0x5C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x178 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x5CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A1 PUSH2 0x19C CALLDATASIZE PUSH1 0x4 PUSH2 0x10B5 JUMP JUMPDEST PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x125D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x5E1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x323 PUSH2 0xDF1 JUMP JUMPDEST PUSH2 0x32D DUP4 DUP4 PUSH2 0x5F6 JUMP JUMPDEST POP DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x2E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x658 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x330 DUP3 PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x6C1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB PUSH2 0x5F0 DUP6 DUP5 PUSH2 0x893 JUMP JUMPDEST DUP5 PUSH2 0x902 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x604 SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x61A SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x633 SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x64C SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x667 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x67C JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x6A5 JUMP JUMPDEST PUSH2 0x69B PUSH2 0x68C DUP4 PUSH3 0xF4240 PUSH2 0x893 JUMP JUMPDEST PUSH2 0x696 DUP9 DUP8 PUSH2 0x893 JUMP JUMPDEST PUSH2 0x902 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x330 PUSH2 0x6BC DUP4 PUSH2 0x958 JUMP JUMPDEST PUSH2 0xDB1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x7C8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x7AA JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x811 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x7F3 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x859 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x83B JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x8FB JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x8B6 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x8F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EE SWAP1 PUSH2 0x126E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x910 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x8F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EE SWAP1 PUSH2 0x126E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBE0 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBA3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC7B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC3E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD16 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCD9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE26 DUP3 CALLDATALOAD PUSH2 0x1305 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE3E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE51 PUSH2 0xE4C DUP3 PUSH2 0x12B3 JUMP JUMPDEST PUSH2 0x128C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xE6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE78 DUP4 DUP3 DUP5 PUSH2 0x131E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE9D PUSH1 0x80 PUSH2 0x128C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xEAB DUP5 DUP5 PUSH2 0x1039 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xEBC DUP5 DUP5 DUP4 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xED0 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xEE4 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF0E PUSH2 0x180 PUSH2 0x128C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF1C DUP5 DUP5 PUSH2 0xE1A JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xF2D DUP5 DUP5 DUP4 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xF41 DUP5 DUP3 DUP6 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xF55 DUP5 DUP3 DUP6 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0xF69 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0xF7D DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0xF91 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0xFA5 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0xFBA DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0xFD0 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFFE DUP5 DUP3 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1020 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x102C DUP5 DUP3 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE26 DUP3 CALLDATALOAD PUSH2 0x1302 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1059 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1065 DUP6 DUP6 PUSH2 0xE81 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1076 DUP6 DUP3 DUP7 ADD PUSH2 0xE81 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB DUP5 DUP3 DUP6 ADD PUSH2 0xEF0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10ED DUP7 DUP3 DUP8 ADD PUSH2 0xEF0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x10FE DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1127 DUP7 DUP3 DUP8 ADD PUSH2 0xE2D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1146 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1152 DUP7 DUP7 PUSH2 0x1039 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1163 DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x1127 DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x117D DUP2 PUSH2 0x12FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x117D DUP2 PUSH2 0x1302 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1197 DUP3 PUSH2 0x12F9 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x11AB DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132A JUMP JUMPDEST PUSH2 0x11B4 DUP2 PUSH2 0x1356 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x1202 DUP5 DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1215 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1228 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x123B PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x1174 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x1183 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE26 DUP2 DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x330 DUP2 PUSH2 0x11C1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x11F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x12AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x12CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1345 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x132D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x123B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 DUP5 BALANCE PC 0xb3 0x2b LOG1 CALLDATACOPY SHL 0xbd SWAP5 DUP9 SWAP13 EXTCODECOPY 0xc2 0x4c 0x2e 0xd5 ADD PUSH6 0xE2C2D2487638 EQ 0xd5 DUP15 INVALID ORIGIN 0xc7 PUSH21 0x6C6578706572696D656E74616CF500370000000000 ",
+ "sourceMap": "1044:148:1:-;;;;;;;;;;;;;;;;;22:32:-1;859:1955:5;6:49:-1;;;1044:148:1;859:1955:5;1044:148:1;;;859:1955:5;;1044:148:1;;;;;22:32:-1;1044:148:1;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1034:159:1;;;;;;;;;;;;1510:18;;;;;;;;;;;;;;;;1494:36;;1034:159;;-1:-1:-1;1034:159:1;;-1:-1:-1;1494:36:1;;;;-1:-1:-1;1510:18:1;1494:36;1510:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1494:36:1;;;;;;;;;;;;1560:21;;;;;274:1:-1;1560:21:1;;;;;;;;;;1544:39;;1494:36;;-1:-1:-1;1494:36:1;;-1:-1:-1;1544:39:1;;;;-1:-1:-1;274:1;1544:39:1;1560:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1544:39:1;;;;;;;;;;;;1415:214;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1613:4:1;1415:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1415:214:1;;;;;;;;1405:225;;1415:214;;;;-1:-1:-1;1405:225:1;;;-1:-1:-1;1405:225:1;1415:214;1405:225;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1405:225:1;;;;;;;;;;-1:-1:-1;1384:246:1;-1:-1:-1;;;859:1955:5;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x60806040526004361061008d5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663041e63fe8114610092578063494d9297146100c857806366758d7b146100dd5780637d33c6ee1461010a5780638ae633161461011f578063d98020881461014c578063e306f7791461016c578063e9c7aa1a14610181575b600080fd5b34801561009e57600080fd5b506100b26100ad366004611131565b6101ae565b6040516100bf919061124f565b60405180910390f35b3480156100d457600080fd5b506100b26101c3565b3480156100e957600080fd5b506100fd6100f8366004611045565b61031b565b6040516100bf919061127e565b34801561011657600080fd5b506100b2610336565b34801561012b57600080fd5b5061013f61013a366004611131565b6105b6565b6040516100bf9190611241565b34801561015857600080fd5b506100b2610167366004611080565b6105c3565b34801561017857600080fd5b506100b26105ce565b34801561018d57600080fd5b506101a161019c3660046110b5565b6105d4565b6040516100bf919061125d565b60006101bb8484846105e1565b949350505050565b604080517f454950373132446f6d61696e28000000000000000000000000000000000000006020808301919091527f737472696e67206e616d652c0000000000000000000000000000000000000000602d8301527f737472696e672076657273696f6e2c000000000000000000000000000000000060398301527f6164647265737320766572696679696e67436f6e74726163740000000000000060488301527f29000000000000000000000000000000000000000000000000000000000000006061830152825160428184030181526062909201928390528151600093918291908401908083835b602083106102e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102ac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b610323610df1565b61032d83836105f6565b50815b92915050565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009391829190840190808383602083106102e957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016102ac565b60006101bb848484610658565b6000610330826106ae565b60005481565b60606101bb8484846106c1565b60006101bb6105f08584610893565b84610902565b815181516106049190610919565b82526020808301519082015161061a9190610919565b6020830152604080830151908201516106339190610919565b60408301526060808301519082015161064c9190610919565b60609092019190915250565b60008060008480151561066757fe5b868509915081151561067c57600092506106a5565b61069b61068c83620f4240610893565b6106968887610893565b610902565b6103e88111935090505b50509392505050565b60006103306106bc83610958565b610db1565b604080517fb4be83d5000000000000000000000000000000000000000000000000000000006020808301919091526060602483018181528751608485019081528884015160a48601529488015160c48501529087015160e4840152608087015161010484015260a087015161012484015260c087015161014484015260e08701516101648401526101008701516101848401526101208701516101a4840152610140870180516101c485019081526101608901516101e4860152610180905251805161020485018190529394919384936044870192849261022489019291820191601f82010460005b818110156107c85783518552602094850194909301926001016107aa565b50505050818103610160808401919091528a0151805180835260209283019291820191601f82010460005b818110156108115783518552602094850194909301926001016107f3565b50505089845250848103602093840190815288518083529093918201918981019190601f82010460005b8181101561085957835185526020948501949093019260010161083b565b5050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08883030188525060405250505050509392505050565b6000808315156108a657600091506108fb565b508282028284828115156108b657fe5b04146108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061126e565b60405180910390fd5b8091505b5092915050565b600080828481151561091057fe5b04949350505050565b6000828201838110156108f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ee9061126e565b604080517f4f726465722800000000000000000000000000000000000000000000000000006020808301919091527f61646472657373206d616b6572416464726573732c000000000000000000000060268301527f616464726573732074616b6572416464726573732c0000000000000000000000603b8301527f6164647265737320666565526563697069656e74416464726573732c0000000060508301527f616464726573732073656e646572416464726573732c00000000000000000000606c8301527f75696e74323536206d616b65724173736574416d6f756e742c0000000000000060828301527f75696e743235362074616b65724173736574416d6f756e742c00000000000000609b8301527f75696e74323536206d616b65724665652c00000000000000000000000000000060b48301527f75696e743235362074616b65724665652c00000000000000000000000000000060c58301527f75696e743235362065787069726174696f6e54696d655365636f6e64732c000060d68301527f75696e743235362073616c742c0000000000000000000000000000000000000060f48301527f6279746573206d616b65724173736574446174612c00000000000000000000006101018301527f62797465732074616b65724173736574446174610000000000000000000000006101168301527f290000000000000000000000000000000000000000000000000000000000000061012a830152825161010b81840301815261012b90920192839052815160009384938493849391929182918401908083835b60208310610be057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610ba3565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101408b0151805191995095509093508392850191508083835b60208310610c7b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c3e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930181900381206101608b0151805191985095509093508392850191508083835b60208310610d1657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610cd9565b5181516020939093036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909116921691909117905260405192018290039091207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0890180516101408b018051610160909c0180519a84529881529288526101a0822091529890525050509190525090919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b608060405190810160405280600081526020016000815260200160008152602001600081525090565b6000610e268235611305565b9392505050565b6000601f82018313610e3e57600080fd5b8135610e51610e4c826112b3565b61128c565b91508082526020830160208301858383011115610e6d57600080fd5b610e7883828461131e565b50505092915050565b600060808284031215610e9357600080fd5b610e9d608061128c565b90506000610eab8484611039565b8252506020610ebc84848301611039565b6020830152506040610ed084828501611039565b6040830152506060610ee484828501611039565b60608301525092915050565b60006101808284031215610f0357600080fd5b610f0e61018061128c565b90506000610f1c8484610e1a565b8252506020610f2d84848301610e1a565b6020830152506040610f4184828501610e1a565b6040830152506060610f5584828501610e1a565b6060830152506080610f6984828501611039565b60808301525060a0610f7d84828501611039565b60a08301525060c0610f9184828501611039565b60c08301525060e0610fa584828501611039565b60e083015250610100610fba84828501611039565b61010083015250610120610fd084828501611039565b6101208301525061014082013567ffffffffffffffff811115610ff257600080fd5b610ffe84828501610e2d565b6101408301525061016082013567ffffffffffffffff81111561102057600080fd5b61102c84828501610e2d565b6101608301525092915050565b6000610e268235611302565b600080610100838503121561105957600080fd5b60006110658585610e81565b925050608061107685828601610e81565b9150509250929050565b60006020828403121561109257600080fd5b813567ffffffffffffffff8111156110a957600080fd5b6101bb84828501610ef0565b6000806000606084860312156110ca57600080fd5b833567ffffffffffffffff8111156110e157600080fd5b6110ed86828701610ef0565b93505060206110fe86828701611039565b925050604084013567ffffffffffffffff81111561111b57600080fd5b61112786828701610e2d565b9150509250925092565b60008060006060848603121561114657600080fd5b60006111528686611039565b935050602061116386828701611039565b925050604061112786828701611039565b61117d816112fd565b82525050565b61117d81611302565b6000611197826112f9565b8084526111ab81602086016020860161132a565b6111b481611356565b9093016020019392505050565b601081527f55494e543235365f4f564552464c4f5700000000000000000000000000000000602082015260400190565b805160808301906112028482611183565b5060208201516112156020850182611183565b5060408201516112286040850182611183565b50606082015161123b6060850182611183565b50505050565b602081016103308284611174565b602081016103308284611183565b60208082528101610e26818461118c565b60208082528101610330816111c1565b6080810161033082846111f1565b60405181810167ffffffffffffffff811182821017156112ab57600080fd5b604052919050565b600067ffffffffffffffff8211156112ca57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b151590565b90565b73ffffffffffffffffffffffffffffffffffffffff1690565b82818337506000910152565b60005b8381101561134557818101518382015260200161132d565b8381111561123b5750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820843158b32ba1371bbd94889c3cc24c2ed50165e2c2d248763814d58efe32c7746c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x8D JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x41E63FE DUP2 EQ PUSH2 0x92 JUMPI DUP1 PUSH4 0x494D9297 EQ PUSH2 0xC8 JUMPI DUP1 PUSH4 0x66758D7B EQ PUSH2 0xDD JUMPI DUP1 PUSH4 0x7D33C6EE EQ PUSH2 0x10A JUMPI DUP1 PUSH4 0x8AE63316 EQ PUSH2 0x11F JUMPI DUP1 PUSH4 0xD9802088 EQ PUSH2 0x14C JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x16C JUMPI DUP1 PUSH4 0xE9C7AA1A EQ PUSH2 0x181 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0xAD CALLDATASIZE PUSH1 0x4 PUSH2 0x1131 JUMP JUMPDEST PUSH2 0x1AE JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x124F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x1C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xFD PUSH2 0xF8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1045 JUMP JUMPDEST PUSH2 0x31B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x127E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x116 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x336 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13F PUSH2 0x13A CALLDATASIZE PUSH1 0x4 PUSH2 0x1131 JUMP JUMPDEST PUSH2 0x5B6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x1241 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x158 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x167 CALLDATASIZE PUSH1 0x4 PUSH2 0x1080 JUMP JUMPDEST PUSH2 0x5C3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x178 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH2 0x5CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A1 PUSH2 0x19C CALLDATASIZE PUSH1 0x4 PUSH2 0x10B5 JUMP JUMPDEST PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xBF SWAP2 SWAP1 PUSH2 0x125D JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x5E1 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0x2D DUP4 ADD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0x39 DUP4 ADD MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0x48 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x61 DUP4 ADD MSTORE DUP3 MLOAD PUSH1 0x42 DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x62 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AC JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x323 PUSH2 0xDF1 JUMP JUMPDEST PUSH2 0x32D DUP4 DUP4 PUSH2 0x5F6 JUMP JUMPDEST POP DUP2 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x2E9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x658 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x330 DUP3 PUSH2 0x6AE JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x60 PUSH2 0x1BB DUP5 DUP5 DUP5 PUSH2 0x6C1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1BB PUSH2 0x5F0 DUP6 DUP5 PUSH2 0x893 JUMP JUMPDEST DUP5 PUSH2 0x902 JUMP JUMPDEST DUP2 MLOAD DUP2 MLOAD PUSH2 0x604 SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x61A SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE PUSH1 0x40 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x633 SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE PUSH1 0x60 DUP1 DUP4 ADD MLOAD SWAP1 DUP3 ADD MLOAD PUSH2 0x64C SWAP2 SWAP1 PUSH2 0x919 JUMP JUMPDEST PUSH1 0x60 SWAP1 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 DUP1 ISZERO ISZERO PUSH2 0x667 JUMPI INVALID JUMPDEST DUP7 DUP6 MULMOD SWAP2 POP DUP2 ISZERO ISZERO PUSH2 0x67C JUMPI PUSH1 0x0 SWAP3 POP PUSH2 0x6A5 JUMP JUMPDEST PUSH2 0x69B PUSH2 0x68C DUP4 PUSH3 0xF4240 PUSH2 0x893 JUMP JUMPDEST PUSH2 0x696 DUP9 DUP8 PUSH2 0x893 JUMP JUMPDEST PUSH2 0x902 JUMP JUMPDEST PUSH2 0x3E8 DUP2 GT SWAP4 POP SWAP1 POP JUMPDEST POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x330 PUSH2 0x6BC DUP4 PUSH2 0x958 JUMP JUMPDEST PUSH2 0xDB1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x60 PUSH1 0x24 DUP4 ADD DUP2 DUP2 MSTORE DUP8 MLOAD PUSH1 0x84 DUP6 ADD SWAP1 DUP2 MSTORE DUP9 DUP5 ADD MLOAD PUSH1 0xA4 DUP7 ADD MSTORE SWAP5 DUP9 ADD MLOAD PUSH1 0xC4 DUP6 ADD MSTORE SWAP1 DUP8 ADD MLOAD PUSH1 0xE4 DUP5 ADD MSTORE PUSH1 0x80 DUP8 ADD MLOAD PUSH2 0x104 DUP5 ADD MSTORE PUSH1 0xA0 DUP8 ADD MLOAD PUSH2 0x124 DUP5 ADD MSTORE PUSH1 0xC0 DUP8 ADD MLOAD PUSH2 0x144 DUP5 ADD MSTORE PUSH1 0xE0 DUP8 ADD MLOAD PUSH2 0x164 DUP5 ADD MSTORE PUSH2 0x100 DUP8 ADD MLOAD PUSH2 0x184 DUP5 ADD MSTORE PUSH2 0x120 DUP8 ADD MLOAD PUSH2 0x1A4 DUP5 ADD MSTORE PUSH2 0x140 DUP8 ADD DUP1 MLOAD PUSH2 0x1C4 DUP6 ADD SWAP1 DUP2 MSTORE PUSH2 0x160 DUP10 ADD MLOAD PUSH2 0x1E4 DUP7 ADD MSTORE PUSH2 0x180 SWAP1 MSTORE MLOAD DUP1 MLOAD PUSH2 0x204 DUP6 ADD DUP2 SWAP1 MSTORE SWAP4 SWAP5 SWAP2 SWAP4 DUP5 SWAP4 PUSH1 0x44 DUP8 ADD SWAP3 DUP5 SWAP3 PUSH2 0x224 DUP10 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x7C8 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x7AA JUMP JUMPDEST POP POP POP POP DUP2 DUP2 SUB PUSH2 0x160 DUP1 DUP5 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP11 ADD MLOAD DUP1 MLOAD DUP1 DUP4 MSTORE PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP2 DUP3 ADD SWAP2 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x811 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x7F3 JUMP JUMPDEST POP POP POP DUP10 DUP5 MSTORE POP DUP5 DUP2 SUB PUSH1 0x20 SWAP4 DUP5 ADD SWAP1 DUP2 MSTORE DUP9 MLOAD DUP1 DUP4 MSTORE SWAP1 SWAP4 SWAP2 DUP3 ADD SWAP2 DUP10 DUP2 ADD SWAP2 SWAP1 PUSH1 0x1F DUP3 ADD DIV PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x859 JUMPI DUP4 MLOAD DUP6 MSTORE PUSH1 0x20 SWAP5 DUP6 ADD SWAP5 SWAP1 SWAP4 ADD SWAP3 PUSH1 0x1 ADD PUSH2 0x83B JUMP JUMPDEST POP POP POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP9 DUP4 SUB ADD DUP9 MSTORE POP PUSH1 0x40 MSTORE POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP4 ISZERO ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 SWAP2 POP PUSH2 0x8FB JUMP JUMPDEST POP DUP3 DUP3 MUL DUP3 DUP5 DUP3 DUP2 ISZERO ISZERO PUSH2 0x8B6 JUMPI INVALID JUMPDEST DIV EQ PUSH2 0x8F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EE SWAP1 PUSH2 0x126E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 DUP2 ISZERO ISZERO PUSH2 0x910 JUMPI INVALID JUMPDEST DIV SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 ADD DUP4 DUP2 LT ISZERO PUSH2 0x8F7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x8EE SWAP1 PUSH2 0x126E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x4F72646572280000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x61646472657373206D616B6572416464726573732C0000000000000000000000 PUSH1 0x26 DUP4 ADD MSTORE PUSH32 0x616464726573732074616B6572416464726573732C0000000000000000000000 PUSH1 0x3B DUP4 ADD MSTORE PUSH32 0x6164647265737320666565526563697069656E74416464726573732C00000000 PUSH1 0x50 DUP4 ADD MSTORE PUSH32 0x616464726573732073656E646572416464726573732C00000000000000000000 PUSH1 0x6C DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724173736574416D6F756E742C00000000000000 PUSH1 0x82 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724173736574416D6F756E742C00000000000000 PUSH1 0x9B DUP4 ADD MSTORE PUSH32 0x75696E74323536206D616B65724665652C000000000000000000000000000000 PUSH1 0xB4 DUP4 ADD MSTORE PUSH32 0x75696E743235362074616B65724665652C000000000000000000000000000000 PUSH1 0xC5 DUP4 ADD MSTORE PUSH32 0x75696E743235362065787069726174696F6E54696D655365636F6E64732C0000 PUSH1 0xD6 DUP4 ADD MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0xF4 DUP4 ADD MSTORE PUSH32 0x6279746573206D616B65724173736574446174612C0000000000000000000000 PUSH2 0x101 DUP4 ADD MSTORE PUSH32 0x62797465732074616B6572417373657444617461000000000000000000000000 PUSH2 0x116 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH2 0x12A DUP4 ADD MSTORE DUP3 MLOAD PUSH2 0x10B DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH2 0x12B SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP2 SWAP3 SWAP2 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xBE0 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xBA3 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x140 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP10 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xC7B JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xC3E JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 PUSH2 0x160 DUP12 ADD MLOAD DUP1 MLOAD SWAP2 SWAP9 POP SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xD16 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCD9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 SWAP1 SWAP4 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP2 AND SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP10 ADD DUP1 MLOAD PUSH2 0x140 DUP12 ADD DUP1 MLOAD PUSH2 0x160 SWAP1 SWAP13 ADD DUP1 MLOAD SWAP11 DUP5 MSTORE SWAP9 DUP2 MSTORE SWAP3 DUP9 MSTORE PUSH2 0x1A0 DUP3 KECCAK256 SWAP2 MSTORE SWAP9 SWAP1 MSTORE POP POP POP SWAP2 SWAP1 MSTORE POP SWAP1 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x80 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE26 DUP3 CALLDATALOAD PUSH2 0x1305 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0xE3E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0xE51 PUSH2 0xE4C DUP3 PUSH2 0x12B3 JUMP JUMPDEST PUSH2 0x128C JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0xE6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE78 DUP4 DUP3 DUP5 PUSH2 0x131E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x80 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xE93 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xE9D PUSH1 0x80 PUSH2 0x128C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xEAB DUP5 DUP5 PUSH2 0x1039 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xEBC DUP5 DUP5 DUP4 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xED0 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xEE4 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xF0E PUSH2 0x180 PUSH2 0x128C JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xF1C DUP5 DUP5 PUSH2 0xE1A JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0xF2D DUP5 DUP5 DUP4 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0xF41 DUP5 DUP3 DUP6 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0xF55 DUP5 DUP3 DUP6 ADD PUSH2 0xE1A JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0xF69 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0xF7D DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0xF91 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0xFA5 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0xFBA DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0xFD0 DUP5 DUP3 DUP6 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0xFF2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0xFFE DUP5 DUP3 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x1020 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x102C DUP5 DUP3 DUP6 ADD PUSH2 0xE2D JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE26 DUP3 CALLDATALOAD PUSH2 0x1302 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x100 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1059 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1065 DUP6 DUP6 PUSH2 0xE81 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1076 DUP6 DUP3 DUP7 ADD PUSH2 0xE81 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1092 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1BB DUP5 DUP3 DUP6 ADD PUSH2 0xEF0 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x10CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x10E1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x10ED DUP7 DUP3 DUP8 ADD PUSH2 0xEF0 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x10FE DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 DUP5 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x111B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1127 DUP7 DUP3 DUP8 ADD PUSH2 0xE2D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x1146 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1152 DUP7 DUP7 PUSH2 0x1039 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x20 PUSH2 0x1163 DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x40 PUSH2 0x1127 DUP7 DUP3 DUP8 ADD PUSH2 0x1039 JUMP JUMPDEST PUSH2 0x117D DUP2 PUSH2 0x12FD JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x117D DUP2 PUSH2 0x1302 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1197 DUP3 PUSH2 0x12F9 JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x11AB DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x132A JUMP JUMPDEST PUSH2 0x11B4 DUP2 PUSH2 0x1356 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x10 DUP2 MSTORE PUSH32 0x55494E543235365F4F564552464C4F5700000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x80 DUP4 ADD SWAP1 PUSH2 0x1202 DUP5 DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x20 DUP3 ADD MLOAD PUSH2 0x1215 PUSH1 0x20 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD PUSH2 0x1228 PUSH1 0x40 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH2 0x123B PUSH1 0x60 DUP6 ADD DUP3 PUSH2 0x1183 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x1174 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x1183 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xE26 DUP2 DUP5 PUSH2 0x118C JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x330 DUP2 PUSH2 0x11C1 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0x330 DUP3 DUP5 PUSH2 0x11F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0x12AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0x12CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1345 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x132D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x123B JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 DUP5 BALANCE PC 0xb3 0x2b LOG1 CALLDATACOPY SHL 0xbd SWAP5 DUP9 SWAP13 EXTCODECOPY 0xc2 0x4c 0x2e 0xd5 ADD PUSH6 0xE2C2D2487638 EQ 0xd5 DUP15 INVALID ORIGIN 0xc7 PUSH21 0x6C6578706572696D656E74616CF500370000000000 ",
+ "sourceMap": "859:1955:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1353:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1353:347:5;;;;;;;;;;;;;;;;;;;;;;;;;2374:157;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2374:157:5;;;;2537:275;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2537:275:5;;;;;;;;;;;;;;;;;2232:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2232:136:5;;;;1706:324;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1706:324:5;;;;;;;;;;;;;;;;;2036:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2036:190:5;;;;;;;;;1300:33:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1300:33:1;;;;953:394:5;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;953:394:5;;;;;;;;;;;;;;;;;1353:347;1516:21;1569:94;1599:9;1622:11;1647:6;1569:16;:94::i;:::-;1553:110;1353:347;-1:-1:-1;;;;1353:347:5:o;2374:157::-;1044:148:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1044:148:1;;;;;;;;1034:159;;2459:7:5;;1044:148:1;;;1034:159;;;;;1044:148;1034:159;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;1034:159:1;;;;;;;;;;;;;;;;2482:42:5;;2374:157;:::o;2537:275::-;2687:11;;:::i;:::-;2721:51;2736:16;2754:17;2721:14;:51::i;:::-;-1:-1:-1;2789:16:5;2537:275;;;;;:::o;2232:136::-;778:457:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:4;;;;;;;;768:468;;2307:7:5;;778:457:4;;;768:468;;;;;778:457;768:468;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;1706:324:5;1868:12;1906:93;1935:9;1958:11;1983:6;1906:15;:93::i;2036:190::-;2129:17;2174:19;2187:5;2174:12;:19::i;1300:33:1:-;;;;:::o;953:394:5:-;1136:30;1202:104;1234:5;1253:20;1287:9;1202:18;:104::i;937:331:3:-;1096:21;1149:82;1170:26;1178:9;1189:6;1170:7;:26::i;:::-;1210:11;1149:7;:82::i;1772:648:2:-;1965:39;;2006:40;;1957:90;;1965:39;1957:7;:90::i;:::-;1915:132;;2107:39;;;;;2148:40;;;;2099:90;;2107:39;2099:7;:90::i;:::-;2057:39;;;:132;2239:29;;;;;2270:30;;;;2231:70;;2239:29;2231:7;:70::i;:::-;2199:29;;;:102;2351:29;;;;;2382:30;;;;2343:70;;2351:29;2343:7;:70::i;:::-;2311:29;;;;:102;;;;-1:-1:-1;1772:648:2:o;1507:560:3:-;1665:12;1693:17;1850:33;1739:11;1713:38;;;;;;;1728:9;1720:6;1713:38;1693:58;-1:-1:-1;1765:14:3;;1761:79;;;1802:5;1795:12;;;;1761:79;1886:98;1907:27;1915:9;1926:7;1907;:27::i;:::-;1948:26;1956:9;1967:6;1948:7;:26::i;:::-;1886:7;:98::i;:::-;2032:4;2004:32;;;-1:-1:-1;1850:134:3;-1:-1:-1;1507:560:3;;;;;;;;:::o;4212:202:4:-;4301:17;4346:35;4364:16;4374:5;4364:9;:16::i;:::-;4346:17;:35::i;1011:10099:0:-;5031:4;5025:11;;5321:66;5314:4;5291:28;;;5284:104;;;;1199:30;5445:4;5422:28;;6444:59;;;6770:19;;5736:26;;;6750:40;;;6883:23;;;6877:30;6853:22;;;6846:62;6979:23;;;6973:30;6949:22;;;6942:62;7082:23;;;7076:30;7052:22;;;7045:62;7197:4;7179:23;;7173:30;7149:22;;;7142:62;7297:4;7279:23;;7273:30;7249:22;;;7242:62;7397:4;7379:23;;7373:30;7349:22;;;7342:62;7495:4;7477:23;;7471:30;7447:22;;;7440:62;7594:5;7576:24;;7570:31;7545:23;;;7538:64;7699:5;7681:24;;7675:31;7650:23;;;7643:64;7787:5;7769:24;;7763:31;;7738:23;;;7731:64;;;7895:5;7877:24;;7871:31;7846:23;;;7839:64;7979:5;8106:74;;8268:24;8340:19;;7962:23;;;8544:34;;;5025:11;;5422:28;;;;6536:27;;;;5736:26;;8606:22;;;;8388:23;;;;8464:4;8445:24;;8441:35;6190:1;8698:237;8721:13;8718:1;8715:20;8698:237;;;8791:19;;8771:40;;8860:4;8843:22;;;;8898:23;;;;8749:1;8742:9;8698:237;;;-1:-1:-1;;;;9045:31:0;;;9029:13;9010:33;;;9003:74;;;;9171:17;;9165:24;9237:19;;9441:34;;;9037:4;9503:22;;;;9285:23;;;;9361:4;9342:24;;9338:35;9610:1;9596:237;9619:13;9616:1;9613:20;9596:237;;;9689:19;;9669:40;;9758:4;9741:22;;;;9796:23;;;;9647:1;9640:9;9596:237;;;-1:-1:-1;;;9902:46:0;;;-1:-1:-1;10133:33:0;;;10003:4;9981:27;;;10108:59;;;10281:19;;10472:34;;;9981:27;;10534:22;;;;10329:23;;;;10281:19;10405:4;10386:24;;10382:35;-1:-1:-1;10613:237:0;10636:13;10633:1;10630:20;10613:237;;;10706:19;;10686:40;;10775:4;10758:22;;;;10813:23;;;;10664:1;10657:9;10613:237;;;-1:-1:-1;;;10928:46:0;;;;;10902:73;;-1:-1:-1;11041:4:0;11034:25;-1:-1:-1;;;;;1011:10099:0;;;;;:::o;50:288:6:-;136:7;;163:6;;159:45;;;192:1;185:8;;;;159:45;-1:-1:-1;225:5:6;;;229:1;225;:5;261;;;;;;;;:10;240:73;;;;;;;;;;;;;;;;;;;;;;330:1;323:8;;50:288;;;;;;:::o;344:151::-;430:7;453:9;469:1;465;:5;;;;;;;;;344:151;-1:-1:-1;;;;344:151:6:o;715:230::-;801:7;836:5;;;872:6;;;;851:69;;;;;;;;;;;;;4554:1678:4;778:457;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;778:457:4;;;;;;;;768:468;;4640:14;;;;;;;;778:457;;;;;768:468;;;;778:457;768:468;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;768:468:4;;;;;;;;;;;4764:20;;;;4754:31;;768:468;;-1:-1:-1;4764:20:4;-1:-1:-1;768:468:4;;-1:-1:-1;768:468:4;;4754:31;;;-1:-1:-1;4754:31:4;768:468;4754:31;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;4754:31:4;;;;;;;;;;;4834:20;;;;4824:31;;4754;;-1:-1:-1;4834:20:4;-1:-1:-1;4754:31:4;;-1:-1:-1;4754:31:4;;4824;;;-1:-1:-1;4824:31:4;4754;4824;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;;;;365:33;;4824:31:4;;;;;;;;;;5621:14;;;5764:11;;5671:3;5660:15;;5801:11;;5711:3;5700:15;;;5838:11;;5904:24;;;5941:32;;;5986;;;6057:3;6041:20;;6110:19;;6142;;;-1:-1:-1;;;6174:19:4;;;-1:-1:-1;6041:20:4;;4554:1678;-1:-1:-1;4554:1678:4:o;1833:924:1:-;1927:14;1984:18;2296:2;2290:9;2328:66;2313:82;;2445:1;2433:14;;2426:40;;;;2563:2;2551:15;;2544:35;;;;2715:2;2697:21;;;1833:924::o;859:1955:5:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;131:432;;221:4;209:17;;205:27;-1:-1;195:2;;246:1;243;236:12;195:2;283:6;270:20;305:60;320:44;357:6;320:44;;;305:60;;;296:69;;385:6;378:5;371:21;421:4;413:6;409:17;454:4;447:5;443:16;489:3;480:6;475:3;471:16;468:25;465:2;;;506:1;503;496:12;465:2;516:41;550:6;545:3;540;516:41;;;188:375;;;;;;;;1060:809;;1177:4;1165:9;1160:3;1156:19;1152:30;1149:2;;;1195:1;1192;1185:12;1149:2;1213:20;1228:4;1213:20;;;1204:29;-1:-1;1301:1;1332:49;1377:3;1357:9;1332:49;;;1308:74;;-1:-1;1461:2;1494:49;1539:3;1515:22;;;1494:49;;;1487:4;1480:5;1476:16;1469:75;1403:152;1613:2;1646:49;1691:3;1682:6;1671:9;1667:22;1646:49;;;1639:4;1632:5;1628:16;1621:75;1565:142;1765:2;1798:49;1843:3;1834:6;1823:9;1819:22;1798:49;;;1791:4;1784:5;1780:16;1773:75;1717:142;1143:726;;;;;1904:2208;;2015:5;2003:9;1998:3;1994:19;1990:31;1987:2;;;2034:1;2031;2024:12;1987:2;2052:21;2067:5;2052:21;;;2043:30;-1:-1;2131:1;2162:49;2207:3;2187:9;2162:49;;;2138:74;;-1:-1;2281:2;2314:49;2359:3;2335:22;;;2314:49;;;2307:4;2300:5;2296:16;2289:75;2233:142;2440:2;2473:49;2518:3;2509:6;2498:9;2494:22;2473:49;;;2466:4;2459:5;2455:16;2448:75;2385:149;2593:2;2626:49;2671:3;2662:6;2651:9;2647:22;2626:49;;;2619:4;2612:5;2608:16;2601:75;2544:143;2749:3;2783:49;2828:3;2819:6;2808:9;2804:22;2783:49;;;2776:4;2769:5;2765:16;2758:75;2697:147;2906:3;2940:49;2985:3;2976:6;2965:9;2961:22;2940:49;;;2933:4;2926:5;2922:16;2915:75;2854:147;3055:3;3089:49;3134:3;3125:6;3114:9;3110:22;3089:49;;;3082:4;3075:5;3071:16;3064:75;3011:139;3204:3;3238:49;3283:3;3274:6;3263:9;3259:22;3238:49;;;3231:4;3224:5;3220:16;3213:75;3160:139;3366:3;3401:49;3446:3;3437:6;3426:9;3422:22;3401:49;;;3393:5;3386;3382:17;3375:76;3309:153;3512:3;3547:49;3592:3;3583:6;3572:9;3568:22;3547:49;;;3539:5;3532;3528:17;3521:76;3472:136;3696:3;3685:9;3681:19;3668:33;3721:18;3713:6;3710:30;3707:2;;;3753:1;3750;3743:12;3707:2;3789:54;3839:3;3830:6;3819:9;3815:22;3789:54;;;3781:5;3774;3770:17;3763:81;3618:237;3943:3;3932:9;3928:19;3915:33;3968:18;3960:6;3957:30;3954:2;;;4000:1;3997;3990:12;3954:2;4036:54;4086:3;4077:6;4066:9;4062:22;4036:54;;;4028:5;4021;4017:17;4010:81;3865:237;1981:2131;;;;;4119:118;;4186:46;4224:6;4211:20;4186:46;;4244:480;;;4421:3;4409:9;4400:7;4396:23;4392:33;4389:2;;;4438:1;4435;4428:12;4389:2;4473:1;4490:81;4563:7;4543:9;4490:81;;;4480:91;;4452:125;4608:3;4627:81;4700:7;4691:6;4680:9;4676:22;4627:81;;;4617:91;;4587:127;4383:341;;;;;;4731:371;;4857:2;4845:9;4836:7;4832:23;4828:32;4825:2;;;4873:1;4870;4863:12;4825:2;4908:31;;4959:18;4948:30;;4945:2;;;4991:1;4988;4981:12;4945:2;5011:75;5078:7;5069:6;5058:9;5054:22;5011:75;;5109:725;;;;5278:2;5266:9;5257:7;5253:23;5249:32;5246:2;;;5294:1;5291;5284:12;5246:2;5329:31;;5380:18;5369:30;;5366:2;;;5412:1;5409;5402:12;5366:2;5432:75;5499:7;5490:6;5479:9;5475:22;5432:75;;;5422:85;;5308:205;5544:2;5562:53;5607:7;5598:6;5587:9;5583:22;5562:53;;;5552:63;;5523:98;5680:2;5669:9;5665:18;5652:32;5704:18;5696:6;5693:30;5690:2;;;5736:1;5733;5726:12;5690:2;5756:62;5810:7;5801:6;5790:9;5786:22;5756:62;;;5746:72;;5631:193;5240:594;;;;;;5841:491;;;;5979:2;5967:9;5958:7;5954:23;5950:32;5947:2;;;5995:1;5992;5985:12;5947:2;6030:1;6047:53;6092:7;6072:9;6047:53;;;6037:63;;6009:97;6137:2;6155:53;6200:7;6191:6;6180:9;6176:22;6155:53;;;6145:63;;6116:98;6245:2;6263:53;6308:7;6299:6;6288:9;6284:22;6263:53;;6339:101;6406:28;6428:5;6406:28;;;6401:3;6394:41;6388:52;;;6447:110;6520:31;6545:5;6520:31;;6564:297;;6664:38;6696:5;6664:38;;;6719:6;6714:3;6707:19;6731:63;6787:6;6780:4;6775:3;6771:14;6764:4;6757:5;6753:16;6731:63;;;6826:29;6848:6;6826:29;;;6806:50;;;6819:4;6806:50;;6644:217;-1:-1;;;6644:217;6869:296;7024:2;7012:15;;7061:66;7056:2;7047:12;;7040:88;7156:2;7147:12;;7005:160;7250:886;7476:22;;7389:4;7380:14;;;7510:61;7384:3;7476:22;7510:61;;;7409:174;7677:4;7670:5;7666:16;7660:23;7695:62;7751:4;7746:3;7742:14;7729:11;7695:62;;;7593:176;7853:4;7846:5;7842:16;7836:23;7871:62;7927:4;7922:3;7918:14;7905:11;7871:62;;;7779:166;8029:4;8022:5;8018:16;8012:23;8047:62;8103:4;8098:3;8094:14;8081:11;8047:62;;;7955:166;7362:774;;;;8260:181;8362:2;8347:18;;8376:55;8351:9;8404:6;8376:55;;8448:193;8556:2;8541:18;;8570:61;8545:9;8604:6;8570:61;;8648:277;8774:2;8788:47;;;8759:18;;8849:66;8759:18;8901:6;8849:66;;8932:387;9113:2;9127:47;;;9098:18;;9188:121;9098:18;9188:121;;9326:306;9490:3;9475:19;;9505:117;9479:9;9595:6;9505:117;;9839:256;9901:2;9895:9;9927:17;;;10002:18;9987:34;;10023:22;;;9984:62;9981:2;;;10059:1;10056;10049:12;9981:2;10075;10068:22;9879:216;;-1:-1;9879:216;10102:254;;10241:18;10233:6;10230:30;10227:2;;;10273:1;10270;10263:12;10227:2;-1:-1;10346:4;10317;10294:17;;;;10313:9;10290:33;10336:15;;10164:192;10628:91;10702:12;;10686:33;10726:92;10799:13;10792:21;;10775:43;10825:79;10894:5;10877:27;10997:128;11077:42;11066:54;;11049:76;11219:145;11300:6;11295:3;11290;11277:30;-1:-1;11356:1;11338:16;;11331:27;11270:94;11373:268;11438:1;11445:101;11459:6;11456:1;11453:13;11445:101;;;11526:11;;;11520:18;11507:11;;;11500:39;11481:2;11474:10;11445:101;;;11561:6;11558:1;11555:13;11552:2;;;-1:-1;;11626:1;11608:16;;11601:27;11422:219;11649:97;11737:2;11717:14;11733:7;11713:28;;11697:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/libs/LibMath.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 4
+ },
+ "2.0.0/test/TestLibs/TestLibs.sol": {
+ "id": 5
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 6
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/libs/LibAbiEncoder.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./LibOrder.sol\";\n\n\ncontract LibAbiEncoder {\n\n /// @dev ABI encodes calldata for `fillOrder`.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return ABI encoded calldata for `fillOrder`.\n function abiEncodeFillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n internal\n pure\n returns (bytes memory fillOrderCalldata)\n {\n // We need to call MExchangeCore.fillOrder using a delegatecall in\n // assembly so that we can intercept a call that throws. For this, we\n // need the input encoded in memory in the Ethereum ABIv2 format [1].\n\n // | Area | Offset | Length | Contents |\n // | -------- |--------|---------|-------------------------------------------- |\n // | Header | 0x00 | 4 | function selector |\n // | Params | | 3 * 32 | function parameters: |\n // | | 0x00 | | 1. offset to order (*) |\n // | | 0x20 | | 2. takerAssetFillAmount |\n // | | 0x40 | | 3. offset to signature (*) |\n // | Data | | 12 * 32 | order: |\n // | | 0x000 | | 1. senderAddress |\n // | | 0x020 | | 2. makerAddress |\n // | | 0x040 | | 3. takerAddress |\n // | | 0x060 | | 4. feeRecipientAddress |\n // | | 0x080 | | 5. makerAssetAmount |\n // | | 0x0A0 | | 6. takerAssetAmount |\n // | | 0x0C0 | | 7. makerFeeAmount |\n // | | 0x0E0 | | 8. takerFeeAmount |\n // | | 0x100 | | 9. expirationTimeSeconds |\n // | | 0x120 | | 10. salt |\n // | | 0x140 | | 11. Offset to makerAssetData (*) |\n // | | 0x160 | | 12. Offset to takerAssetData (*) |\n // | | 0x180 | 32 | makerAssetData Length |\n // | | 0x1A0 | ** | makerAssetData Contents |\n // | | 0x1C0 | 32 | takerAssetData Length |\n // | | 0x1E0 | ** | takerAssetData Contents |\n // | | 0x200 | 32 | signature Length |\n // | | 0x220 | ** | signature Contents |\n\n // * Offsets are calculated from the beginning of the current area: Header, Params, Data:\n // An offset stored in the Params area is calculated from the beginning of the Params section.\n // An offset stored in the Data area is calculated from the beginning of the Data section.\n\n // ** The length of dynamic array contents are stored in the field immediately preceeding the contents.\n\n // [1]: https://solidity.readthedocs.io/en/develop/abi-spec.html\n\n assembly {\n\n // Areas below may use the following variables:\n // 1. <area>Start -- Start of this area in memory\n // 2. <area>End -- End of this area in memory. This value may\n // be precomputed (before writing contents),\n // or it may be computed as contents are written.\n // 3. <area>Offset -- Current offset into area. If an area's End\n // is precomputed, this variable tracks the\n // offsets of contents as they are written.\n\n /////// Setup Header Area ///////\n // Load free memory pointer\n fillOrderCalldata := mload(0x40)\n // bytes4(keccak256(\"fillOrder((address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes),uint256,bytes)\"))\n // = 0xb4be83d5\n // Leave 0x20 bytes to store the length\n mstore(add(fillOrderCalldata, 0x20), 0xb4be83d500000000000000000000000000000000000000000000000000000000)\n let headerAreaEnd := add(fillOrderCalldata, 0x24)\n\n /////// Setup Params Area ///////\n // This area is preallocated and written to later.\n // This is because we need to fill in offsets that have not yet been calculated.\n let paramsAreaStart := headerAreaEnd\n let paramsAreaEnd := add(paramsAreaStart, 0x60)\n let paramsAreaOffset := paramsAreaStart\n\n /////// Setup Data Area ///////\n let dataAreaStart := paramsAreaEnd\n let dataAreaEnd := dataAreaStart\n\n // Offset from the source data we're reading from\n let sourceOffset := order\n // arrayLenBytes and arrayLenWords track the length of a dynamically-allocated bytes array.\n let arrayLenBytes := 0\n let arrayLenWords := 0\n\n /////// Write order Struct ///////\n // Write memory location of Order, relative to the start of the\n // parameter list, then increment the paramsAreaOffset respectively.\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n // Write values for each field in the order\n // It would be nice to use a loop, but we save on gas by writing\n // the stores sequentially.\n mstore(dataAreaEnd, mload(sourceOffset)) // makerAddress\n mstore(add(dataAreaEnd, 0x20), mload(add(sourceOffset, 0x20))) // takerAddress\n mstore(add(dataAreaEnd, 0x40), mload(add(sourceOffset, 0x40))) // feeRecipientAddress\n mstore(add(dataAreaEnd, 0x60), mload(add(sourceOffset, 0x60))) // senderAddress\n mstore(add(dataAreaEnd, 0x80), mload(add(sourceOffset, 0x80))) // makerAssetAmount\n mstore(add(dataAreaEnd, 0xA0), mload(add(sourceOffset, 0xA0))) // takerAssetAmount\n mstore(add(dataAreaEnd, 0xC0), mload(add(sourceOffset, 0xC0))) // makerFeeAmount\n mstore(add(dataAreaEnd, 0xE0), mload(add(sourceOffset, 0xE0))) // takerFeeAmount\n mstore(add(dataAreaEnd, 0x100), mload(add(sourceOffset, 0x100))) // expirationTimeSeconds\n mstore(add(dataAreaEnd, 0x120), mload(add(sourceOffset, 0x120))) // salt\n mstore(add(dataAreaEnd, 0x140), mload(add(sourceOffset, 0x140))) // Offset to makerAssetData\n mstore(add(dataAreaEnd, 0x160), mload(add(sourceOffset, 0x160))) // Offset to takerAssetData\n dataAreaEnd := add(dataAreaEnd, 0x180)\n sourceOffset := add(sourceOffset, 0x180)\n\n // Write offset to <order.makerAssetData>\n mstore(add(dataAreaStart, mul(10, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.makerAssetData>\n sourceOffset := mload(add(order, 0x140)) // makerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.makerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.makerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Write offset to <order.takerAssetData>\n mstore(add(dataAreaStart, mul(11, 0x20)), sub(dataAreaEnd, dataAreaStart))\n\n // Calculate length of <order.takerAssetData>\n sourceOffset := mload(add(order, 0x160)) // takerAssetData\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of <order.takerAssetData>\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of <order.takerAssetData>\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n /////// Write takerAssetFillAmount ///////\n mstore(paramsAreaOffset, takerAssetFillAmount)\n paramsAreaOffset := add(paramsAreaOffset, 0x20)\n\n /////// Write signature ///////\n // Write offset to paramsArea\n mstore(paramsAreaOffset, sub(dataAreaEnd, paramsAreaStart))\n\n // Calculate length of signature\n sourceOffset := signature\n arrayLenBytes := mload(sourceOffset)\n sourceOffset := add(sourceOffset, 0x20)\n arrayLenWords := div(add(arrayLenBytes, 0x1F), 0x20)\n\n // Write length of signature\n mstore(dataAreaEnd, arrayLenBytes)\n dataAreaEnd := add(dataAreaEnd, 0x20)\n\n // Write contents of signature\n for {let i := 0} lt(i, arrayLenWords) {i := add(i, 1)} {\n mstore(dataAreaEnd, mload(sourceOffset))\n dataAreaEnd := add(dataAreaEnd, 0x20)\n sourceOffset := add(sourceOffset, 0x20)\n }\n\n // Set length of calldata\n mstore(fillOrderCalldata, sub(dataAreaEnd, add(fillOrderCalldata, 0x20)))\n\n // Increment free memory pointer\n mstore(0x40, dataAreaEnd)\n }\n\n return fillOrderCalldata;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibMath.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibMath is\n SafeMath\n{\n\n /// @dev Calculates partial value given a numerator and denominator.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to calculate partial of.\n /// @return Partial value of target.\n function getPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = safeDiv(\n safeMul(numerator, target),\n denominator\n );\n return partialAmount;\n }\n\n /// @dev Checks if rounding error > 0.1%.\n /// @param numerator Numerator.\n /// @param denominator Denominator.\n /// @param target Value to multiply with numerator/denominator.\n /// @return Rounding error is present.\n function isRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n internal\n pure\n returns (bool isError)\n {\n uint256 remainder = mulmod(target, numerator, denominator);\n if (remainder == 0) {\n return false; // No rounding error.\n }\n\n uint256 errPercentageTimes1000000 = safeDiv(\n safeMul(remainder, 1000000),\n safeMul(numerator, target)\n );\n isError = errPercentageTimes1000000 > 1000;\n return isError;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/test/TestLibs/TestLibs.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/libs/LibMath.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../protocol/Exchange/libs/LibFillResults.sol\";\nimport \"../../protocol/Exchange/libs/LibAbiEncoder.sol\";\n\n\ncontract TestLibs is \n LibMath,\n LibOrder,\n LibFillResults,\n LibAbiEncoder\n{\n\n function publicAbiEncodeFillOrder(\n Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n pure\n returns (bytes memory fillOrderCalldata)\n {\n fillOrderCalldata = abiEncodeFillOrder(\n order,\n takerAssetFillAmount,\n signature\n );\n return fillOrderCalldata;\n }\n\n function publicGetPartialAmount(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (uint256 partialAmount)\n {\n partialAmount = getPartialAmount(\n numerator,\n denominator,\n target\n );\n return partialAmount;\n }\n\n function publicIsRoundingError(\n uint256 numerator,\n uint256 denominator,\n uint256 target\n )\n public\n pure\n returns (bool isError)\n {\n isError = isRoundingError(\n numerator,\n denominator,\n target\n );\n return isError;\n }\n\n function publicGetOrderHash(Order memory order)\n public\n view\n returns (bytes32 orderHash)\n {\n orderHash = getOrderHash(order);\n return orderHash;\n }\n\n function getOrderSchemaHash()\n public\n pure\n returns (bytes32)\n {\n return EIP712_ORDER_SCHEMA_HASH;\n }\n\n function getDomainSeparatorSchemaHash()\n public\n pure\n returns (bytes32)\n {\n return EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH;\n }\n\n function publicAddFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n public\n pure\n returns (FillResults memory)\n {\n addFillResults(totalFillResults, singleFillResults);\n return totalFillResults;\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x5cd39689b8d545b46ea1dd66975d62544809b7d27e913ace8cae37772da6e1a8",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json b/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json
new file mode 100644
index 000000000..82fff91f6
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestSignatureValidator.json
@@ -0,0 +1,332 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestSignatureValidator",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "preSign",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "name": "transactions",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "name": "approval",
+ "type": "bool"
+ }
+ ],
+ "name": "setSignatureValidatorApproval",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowedValidators",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "preSigned",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signer",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "publicIsValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "data",
+ "type": "bytes"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "executeTransaction",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "EIP712_DOMAIN_HASH",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "currentContextAddress",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "validatorAddress",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "SignatureValidatorApproval",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x7f454950373132446f6d61696e280000000000000000000000000000000000000060a09081527f737472696e67206e616d652c000000000000000000000000000000000000000060ad527f737472696e672076657273696f6e2c000000000000000000000000000000000060b9527f6164647265737320766572696679696e67436f6e74726163740000000000000060c8527f290000000000000000000000000000000000000000000000000000000000000060e1526042608081815260e26040819052909290918291908083835b602083106100ed5780518252601f1990920191602091820191016100ce565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208285018552600b8084527f30782050726f746f636f6c000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101755780518252601f199092019160209182019101610156565b51815160209384036101000a600019018019909216911617905260408051929094018290038220828501855260018084527f3200000000000000000000000000000000000000000000000000000000000000928401928352945190965091945090928392508083835b602083106101fd5780518252601f1990920191602091820191016101de565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208282019890985281840196909652606081019690965250306080808701919091528151808703909101815260a09095019081905284519093849350850191508083835b602083106102865780518252601f199092019160209182019101610267565b5181516000196020949094036101000a939093019283169219169190911790526040519201829003909120600055505050611ae880620002c76000396000f3006080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e81146100a8578063642f2eaf146100e857806377fcce68146101145780637b8e35141461014757806382c174d01461017b57806393634702146101ac578063abba41cc14610222578063bfc8bfce14610298578063e306f779146102e2578063eea086ba14610309575b600080fd5b3480156100b457600080fd5b506100e660048035906024803573ffffffffffffffffffffffffffffffffffffffff1691604435918201910135610347565b005b3480156100f457600080fd5b5061010060043561044c565b604080519115158252519081900360200190f35b34801561012057600080fd5b506100e673ffffffffffffffffffffffffffffffffffffffff600435166024351515610461565b34801561015357600080fd5b5061010073ffffffffffffffffffffffffffffffffffffffff6004358116906024351661050a565b34801561018757600080fd5b5061010060043573ffffffffffffffffffffffffffffffffffffffff6024351661052a565b3480156101b857600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610100948235946024803573ffffffffffffffffffffffffffffffffffffffff169536959460649492019190819084018382808284375094975061054a9650505050505050565b34801561022e57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610100948235946024803573ffffffffffffffffffffffffffffffffffffffff16953695946064949201919081908401838280828437509497506110f99650505050505050565b3480156102a457600080fd5b506100e660048035906024803573ffffffffffffffffffffffffffffffffffffffff169160443580830192908201359160643591820191013561110e565b3480156102ee57600080fd5b506102f761147b565b60408051918252519081900360200190f35b34801561031557600080fd5b5061031e611481565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610382848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375061054a945050505050565b15156103ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604482015290519081900360640190fd5b5050600091825260016020818152604080852073ffffffffffffffffffffffffffffffffffffffff9094168552929052912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b60036020526000908152604090205460ff1681565b600061046b61149d565b73ffffffffffffffffffffffffffffffffffffffff81811660008181526002602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915582519081529151949550929391927fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89192918290030190a3505050565b600260209081526000928352604080842090915290825290205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600080600080600080600080600089511115156105c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604482015290519081900360640190fd5b6105d1896114e6565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff88161061066857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5349474e41545552455f554e535550504f525445440000000000000000000000604482015290519081900360640190fd5b8660ff16600981111561067757fe5b9550600086600981111561068757fe5b14156106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604482015290519081900360640190fd5b600186600981111561070257fe5b141561077f5788511561077657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604482015290519081900360640190fd5b600097506110eb565b600286600981111561078d57fe5b141561092d57885160411461080357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b88600081518110151561081257fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061085289600163ffffffff61160516565b935061086589602163ffffffff61160516565b925060018b868686604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af11580156108de573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c811690821614995092506110eb9050565b600386600981111561093b57fe5b1415610b6c5788516041146109b157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b8860008151811015156109c057fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450610a0089600163ffffffff61160516565b9350610a1389602163ffffffff61160516565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a77565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822060008084528383018087529190915260ff8d1683860152606083018c9052608083018b9052935160a080840197509195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019492819003909101925090865af11580156108de573d6000803e3d6000fd5b6004866009811115610b7a57fe5b1415610c0e57885115610bee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8a16331497506110eb565b6005866009811115610c1c57fe5b1415610d36578973ffffffffffffffffffffffffffffffffffffffff16631626ba7e8c8b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cb6578181015183820152602001610c9e565b50505050905090810190601f168015610ce35780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b505050506040513d6020811015610d2d57600080fd5b505197506110eb565b6006866009811115610d4457fe5b1415610eb057610d53896116ab565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526002602090815260408083209385168352929052205490915060ff161515610d9b57600097506110eb565b8073ffffffffffffffffffffffffffffffffffffffff1663936347028c8c8c6040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e62578181015183820152602001610e4a565b50505050905090810190601f168015610e8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d0357600080fd5b6007866009811115610ebe57fe5b1415610efe5760008b815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff1697506110eb565b6008866009811115610f0c57fe5b1415611084578851604114610f8257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b886000815181101515610f9157fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450610fd189600163ffffffff61160516565b9350610fe489602163ffffffff61160516565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b01826000191660001916815260200191505060405160208183030381529060405260405180828051906020019080838360208310610ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a77565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5349474e41545552455f554e535550504f525445440000000000000000000000604482015290519081900360640190fd5b505050505050509392505050565b600061110684848461054a565b949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff161561119657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000604482015290519081900360640190fd5b6111d96111d4888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375061177f945050505050565b6119c0565b60008181526003602052604090205490915060ff161561125a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f54585f484153480000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff86163314611360576112b2818785858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061054a945050505050565b151561131f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f494e56414c49445f54585f5349474e4154555245000000000000000000000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af4915050151561142c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4641494c45445f455845435554494f4e00000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616331461147257600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b60005481565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b600454600090819073ffffffffffffffffffffffffffffffffffffffff16156114de5760045473ffffffffffffffffffffffffffffffffffffffff166114e0565b335b92915050565b600080825111151561157f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560448201527f4400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106115af57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b6000816020018351101515156116a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016020015190565b6000601482511015151561174657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611754826014845103611a00565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b602083106118a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161186b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061193e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611901565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b600081601401835110151515611a9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016014015173ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582064617c7f0d76b3eb43fdaa52ce7e0a7493cb434561c7bc8c72fc0d08711999310029",
+ "opcodes": "PUSH32 0x454950373132446F6D61696E2800000000000000000000000000000000000000 PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH32 0x737472696E67206E616D652C0000000000000000000000000000000000000000 PUSH1 0xAD MSTORE PUSH32 0x737472696E672076657273696F6E2C0000000000000000000000000000000000 PUSH1 0xB9 MSTORE PUSH32 0x6164647265737320766572696679696E67436F6E747261637400000000000000 PUSH1 0xC8 MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0xE1 MSTORE PUSH1 0x42 PUSH1 0x80 DUP2 DUP2 MSTORE PUSH1 0xE2 PUSH1 0x40 DUP2 SWAP1 MSTORE SWAP1 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xED JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0xB DUP1 DUP5 MSTORE PUSH32 0x30782050726F746F636F6C000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x175 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x156 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP6 ADD DUP6 MSTORE PUSH1 0x1 DUP1 DUP5 MSTORE PUSH32 0x3200000000000000000000000000000000000000000000000000000000000000 SWAP3 DUP5 ADD SWAP3 DUP4 MSTORE SWAP5 MLOAD SWAP1 SWAP7 POP SWAP2 SWAP5 POP SWAP1 SWAP3 DUP4 SWAP3 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1FD JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1DE JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 DUP3 DUP3 ADD SWAP9 SWAP1 SWAP9 MSTORE DUP2 DUP5 ADD SWAP7 SWAP1 SWAP7 MSTORE PUSH1 0x60 DUP2 ADD SWAP7 SWAP1 SWAP7 MSTORE POP ADDRESS PUSH1 0x80 DUP1 DUP8 ADD SWAP2 SWAP1 SWAP2 MSTORE DUP2 MLOAD DUP1 DUP8 SUB SWAP1 SWAP2 ADD DUP2 MSTORE PUSH1 0xA0 SWAP1 SWAP6 ADD SWAP1 DUP2 SWAP1 MSTORE DUP5 MLOAD SWAP1 SWAP4 DUP5 SWAP4 POP DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x286 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x267 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x0 NOT PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP SWAP4 SWAP1 SWAP4 ADD SWAP3 DUP4 AND SWAP3 NOT AND SWAP2 SWAP1 SWAP2 OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP3 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x0 SSTORE POP POP POP PUSH2 0x1AE8 DUP1 PUSH3 0x2C7 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x114 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x2E2 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x309 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x347 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH1 0x4 CALLDATALOAD PUSH2 0x44C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x461 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x50A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x52A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x100 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x54A SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x100 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x10F9 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD DUP1 DUP4 ADD SWAP3 SWAP1 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x110E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F7 PUSH2 0x147B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31E PUSH2 0x1481 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x382 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x54A SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x3EF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP6 MSTORE SWAP3 SWAP1 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46B PUSH2 0x149D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD SWAP5 SWAP6 POP SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x5C8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x5D1 DUP10 PUSH2 0x14E6 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x668 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x677 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x687 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x6F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x702 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x77F JUMPI DUP9 MLOAD ISZERO PUSH2 0x776 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x78D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x92D JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x803 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x812 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x852 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x865 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x10EB SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x93B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB6C JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x9B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9C0 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xA00 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0xA13 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xAB4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA77 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 DUP5 MSTORE DUP4 DUP4 ADD DUP1 DUP8 MSTORE SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF DUP14 AND DUP4 DUP7 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP13 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP12 SWAP1 MSTORE SWAP4 MLOAD PUSH1 0xA0 DUP1 DUP5 ADD SWAP8 POP SWAP2 SWAP6 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD SWAP5 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP3 POP SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xB7A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC0E JUMPI DUP9 MLOAD ISZERO PUSH2 0xBEE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xD36 JUMPI DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x1626BA7E DUP13 DUP12 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCB6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC9E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xCE3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD17 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xD44 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEB0 JUMPI PUSH2 0xD53 DUP10 PUSH2 0x16AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xD9B JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x93634702 DUP13 DUP13 DUP13 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xEBE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEFE JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xF0C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1084 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0xF82 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF91 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xFD1 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0xFE4 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xAB4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA77 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1106 DUP5 DUP5 DUP5 PUSH2 0x54A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1196 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11D9 PUSH2 0x11D4 DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x177F SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x125A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1360 JUMPI PUSH2 0x12B2 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x54A SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x131F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x142C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1472 JUMPI PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x14DE JUMPI PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14E0 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x157F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x15AF JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x16A2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1746 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1754 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1A00 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x18A8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x186B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x193E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1901 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1A9D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH5 0x617C7F0D76 0xb3 0xeb NUMBER REVERT 0xaa MSTORE 0xce PUSH31 0xA7493CB434561C7BC8C72FC0D087119993100290000000000000000000000 ",
+ "sourceMap": "1044:148:6:-;;;;;;;;;;;;;;;;;22:32:-1;725:412:10;6:49:-1;;;1044:148:6;725:412:10;1044:148:6;;;725:412:10;;1044:148:6;;;;;22:32:-1;1044:148:6;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1034:159:6;;;;;;;;;;;;1510:18;;;;;;;;;;;;;;;;1494:36;;1034:159;;-1:-1:-1;1034:159:6;;-1:-1:-1;1494:36:6;;;;-1:-1:-1;1510:18:6;1494:36;1510:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1494:36:6;;;;;;;;;;;;1560:21;;;;;274:1:-1;1560:21:6;;;;;;;;;;1544:39;;1494:36;;-1:-1:-1;1494:36:6;;-1:-1:-1;1544:39:6;;;;-1:-1:-1;274:1;1544:39:6;1560:21;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;1544:39:6;;;;;;;;;;;;1415:214;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1613:4:6;1415:214;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1415:214:6;;;;;;;;1405:225;;1415:214;;;;-1:-1:-1;1405:225:6;;;-1:-1:-1;1405:225:6;1415:214;1405:225;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;;254:3;250:22;246:30;;;;340:21;;;311:9;;295:26;377:20;;;;365:33;;1405:225:6;;;;;;;;;;-1:-1:-1;1384:246:6;-1:-1:-1;;;725:412:10;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100a35763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416633683ef8e81146100a8578063642f2eaf146100e857806377fcce68146101145780637b8e35141461014757806382c174d01461017b57806393634702146101ac578063abba41cc14610222578063bfc8bfce14610298578063e306f779146102e2578063eea086ba14610309575b600080fd5b3480156100b457600080fd5b506100e660048035906024803573ffffffffffffffffffffffffffffffffffffffff1691604435918201910135610347565b005b3480156100f457600080fd5b5061010060043561044c565b604080519115158252519081900360200190f35b34801561012057600080fd5b506100e673ffffffffffffffffffffffffffffffffffffffff600435166024351515610461565b34801561015357600080fd5b5061010073ffffffffffffffffffffffffffffffffffffffff6004358116906024351661050a565b34801561018757600080fd5b5061010060043573ffffffffffffffffffffffffffffffffffffffff6024351661052a565b3480156101b857600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610100948235946024803573ffffffffffffffffffffffffffffffffffffffff169536959460649492019190819084018382808284375094975061054a9650505050505050565b34801561022e57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610100948235946024803573ffffffffffffffffffffffffffffffffffffffff16953695946064949201919081908401838280828437509497506110f99650505050505050565b3480156102a457600080fd5b506100e660048035906024803573ffffffffffffffffffffffffffffffffffffffff169160443580830192908201359160643591820191013561110e565b3480156102ee57600080fd5b506102f761147b565b60408051918252519081900360200190f35b34801561031557600080fd5b5061031e611481565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610382848484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375061054a945050505050565b15156103ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604482015290519081900360640190fd5b5050600091825260016020818152604080852073ffffffffffffffffffffffffffffffffffffffff9094168552929052912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055565b60036020526000908152604090205460ff1681565b600061046b61149d565b73ffffffffffffffffffffffffffffffffffffffff81811660008181526002602090815260408083209489168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688151590811790915582519081529151949550929391927fa8656e308026eeabce8f0bc18048433252318ab80ac79da0b3d3d8697dfba89192918290030190a3505050565b600260209081526000928352604080842090915290825290205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b600080600080600080600080600089511115156105c857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4c454e4754485f475245415445525f5448414e5f305f52455155495245440000604482015290519081900360640190fd5b6105d1896114e6565b7f010000000000000000000000000000000000000000000000000000000000000090049650600960ff88161061066857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5349474e41545552455f554e535550504f525445440000000000000000000000604482015290519081900360640190fd5b8660ff16600981111561067757fe5b9550600086600981111561068757fe5b14156106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5349474e41545552455f494c4c4547414c000000000000000000000000000000604482015290519081900360640190fd5b600186600981111561070257fe5b141561077f5788511561077657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604482015290519081900360640190fd5b600097506110eb565b600286600981111561078d57fe5b141561092d57885160411461080357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b88600081518110151561081257fe5b01602001517f010000000000000000000000000000000000000000000000000000000000000090819004810204945061085289600163ffffffff61160516565b935061086589602163ffffffff61160516565b925060018b868686604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af11580156108de573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015173ffffffffffffffffffffffffffffffffffffffff8c811690821614995092506110eb9050565b600386600981111561093b57fe5b1415610b6c5788516041146109b157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b8860008151811015156109c057fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450610a0089600163ffffffff61160516565b9350610a1389602163ffffffff61160516565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a77565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822060008084528383018087529190915260ff8d1683860152606083018c9052608083018b9052935160a080840197509195507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019492819003909101925090865af11580156108de573d6000803e3d6000fd5b6004866009811115610b7a57fe5b1415610c0e57885115610bee57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4c454e4754485f305f5245515549524544000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8a16331497506110eb565b6005866009811115610c1c57fe5b1415610d36578973ffffffffffffffffffffffffffffffffffffffff16631626ba7e8c8b6040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610cb6578181015183820152602001610c9e565b50505050905090810190601f168015610ce35780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b158015610d0357600080fd5b505af1158015610d17573d6000803e3d6000fd5b505050506040513d6020811015610d2d57600080fd5b505197506110eb565b6006866009811115610d4457fe5b1415610eb057610d53896116ab565b73ffffffffffffffffffffffffffffffffffffffff808c1660009081526002602090815260408083209385168352929052205490915060ff161515610d9b57600097506110eb565b8073ffffffffffffffffffffffffffffffffffffffff1663936347028c8c8c6040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600019166000191681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e62578181015183820152602001610e4a565b50505050905090810190601f168015610e8f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d0357600080fd5b6007866009811115610ebe57fe5b1415610efe5760008b815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290205460ff1697506110eb565b6008866009811115610f0c57fe5b1415611084578851604114610f8257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b886000815181101515610f9157fe5b01602001517f0100000000000000000000000000000000000000000000000000000000000000908190048102049450610fd189600163ffffffff61160516565b9350610fe489602163ffffffff61160516565b925060018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a200000000000815250601b01826000191660001916815260200191505060405160208183030381529060405260405180828051906020019080838360208310610ab457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a77565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5349474e41545552455f554e535550504f525445440000000000000000000000604482015290519081900360640190fd5b505050505050509392505050565b600061110684848461054a565b949350505050565b60045460009073ffffffffffffffffffffffffffffffffffffffff161561119657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f5245454e5452414e43595f494c4c4547414c0000000000000000000000000000604482015290519081900360640190fd5b6111d96111d4888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375061177f945050505050565b6119c0565b60008181526003602052604090205490915060ff161561125a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f494e56414c49445f54585f484153480000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff86163314611360576112b2818785858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061054a945050505050565b151561131f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f494e56414c49445f54585f5349474e4154555245000000000000000000000000604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790555b6000818152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555130908690869080838380828437820191505092505050600060405180830381855af4915050151561142c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4641494c45445f455845435554494f4e00000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8616331461147257600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555b50505050505050565b60005481565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b600454600090819073ffffffffffffffffffffffffffffffffffffffff16156114de5760045473ffffffffffffffffffffffffffffffffffffffff166114e0565b335b92915050565b600080825111151561157f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f475245415445525f5448414e5f5a45524f5f4c454e4754485f5245515549524560448201527f4400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b815182907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019081106115af57fe5b016020015182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909252507f0100000000000000000000000000000000000000000000000000000000000000908190040290565b6000816020018351101515156116a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016020015190565b6000601482511015151561174657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611754826014845103611a00565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec019092525090565b604080517f5a65726f45785472616e73616374696f6e2800000000000000000000000000006020808301919091527f75696e743235362073616c742c0000000000000000000000000000000000000060328301527f61646472657373207369676e6572416464726573732c00000000000000000000603f8301527f627974657320646174610000000000000000000000000000000000000000000060558301527f2900000000000000000000000000000000000000000000000000000000000000605f830152825180830384018152606090920192839052815160009384938493909282918401908083835b602083106118a857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161186b565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905260405191909301819003812089519097508995509093508392850191508083835b6020831061193e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611901565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040805192909401829003822097825281019a909a525073ffffffffffffffffffffffffffffffffffffffff97909716968801969096525050606085015250506080909120919050565b6000546040517f19010000000000000000000000000000000000000000000000000000000000008152600281019190915260228101919091526042902090565b600081601401835110151515611a9d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f32305f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b50016014015173ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582064617c7f0d76b3eb43fdaa52ce7e0a7493cb434561c7bc8c72fc0d08711999310029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xA3 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x3683EF8E DUP2 EQ PUSH2 0xA8 JUMPI DUP1 PUSH4 0x642F2EAF EQ PUSH2 0xE8 JUMPI DUP1 PUSH4 0x77FCCE68 EQ PUSH2 0x114 JUMPI DUP1 PUSH4 0x7B8E3514 EQ PUSH2 0x147 JUMPI DUP1 PUSH4 0x82C174D0 EQ PUSH2 0x17B JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0x1AC JUMPI DUP1 PUSH4 0xABBA41CC EQ PUSH2 0x222 JUMPI DUP1 PUSH4 0xBFC8BFCE EQ PUSH2 0x298 JUMPI DUP1 PUSH4 0xE306F779 EQ PUSH2 0x2E2 JUMPI DUP1 PUSH4 0xEEA086BA EQ PUSH2 0x309 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x347 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH1 0x4 CALLDATALOAD PUSH2 0x44C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x120 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD ISZERO ISZERO PUSH2 0x461 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x153 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x50A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x100 PUSH1 0x4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x24 CALLDATALOAD AND PUSH2 0x52A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x100 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x54A SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x22E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x44 CALLDATALOAD DUP2 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x100 SWAP5 DUP3 CALLDATALOAD SWAP5 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 SWAP5 PUSH1 0x64 SWAP5 SWAP3 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x10F9 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE6 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD DUP1 DUP4 ADD SWAP3 SWAP1 DUP3 ADD CALLDATALOAD SWAP2 PUSH1 0x64 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x110E JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2EE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2F7 PUSH2 0x147B JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x315 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x31E PUSH2 0x1481 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH2 0x382 DUP5 DUP5 DUP5 DUP5 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x54A SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x3EF JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F5349474E4154555245000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP6 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP5 AND DUP6 MSTORE SWAP3 SWAP1 MSTORE SWAP2 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x46B PUSH2 0x149D JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP10 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND DUP9 ISZERO ISZERO SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD SWAP5 SWAP6 POP SWAP3 SWAP4 SWAP2 SWAP3 PUSH32 0xA8656E308026EEABCE8F0BC18048433252318AB80AC79DA0B3D3D8697DFBA891 SWAP3 SWAP2 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP10 MLOAD GT ISZERO ISZERO PUSH2 0x5C8 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F475245415445525F5448414E5F305F52455155495245440000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x5D1 DUP10 PUSH2 0x14E6 JUMP JUMPDEST PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP7 POP PUSH1 0x9 PUSH1 0xFF DUP9 AND LT PUSH2 0x668 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 PUSH1 0xFF AND PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x677 JUMPI INVALID JUMPDEST SWAP6 POP PUSH1 0x0 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x687 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x6F4 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F494C4C4547414C000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x1 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x702 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x77F JUMPI DUP9 MLOAD ISZERO PUSH2 0x776 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x0 SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x2 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x78D JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x92D JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x803 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x812 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0x852 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0x865 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 DUP7 DUP7 DUP7 PUSH1 0x40 MLOAD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP6 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 SUB SWAP1 DUP1 DUP5 SUB SWAP1 PUSH1 0x0 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND SWAP1 DUP3 AND EQ SWAP10 POP SWAP3 POP PUSH2 0x10EB SWAP1 POP JUMP JUMPDEST PUSH1 0x3 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0x93B JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xB6C JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0x9B1 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0x9C0 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xA00 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0xA13 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A333200000000 DUP2 MSTORE POP PUSH1 0x1C ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xAB4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA77 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 PUSH1 0x0 DUP1 DUP5 MSTORE DUP4 DUP4 ADD DUP1 DUP8 MSTORE SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0xFF DUP14 AND DUP4 DUP7 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP13 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP12 SWAP1 MSTORE SWAP4 MLOAD PUSH1 0xA0 DUP1 DUP5 ADD SWAP8 POP SWAP2 SWAP6 POP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 ADD SWAP5 SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP3 POP SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x8DE JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST PUSH1 0x4 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xB7A JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xC0E JUMPI DUP9 MLOAD ISZERO PUSH2 0xBEE JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x11 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F305F5245515549524544000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP11 AND CALLER EQ SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x5 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xD36 JUMPI DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x1626BA7E DUP13 DUP12 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xCB6 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xC9E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xCE3 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP4 POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xD17 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xD2D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP MLOAD SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x6 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xD44 JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEB0 JUMPI PUSH2 0xD53 DUP10 PUSH2 0x16AB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP13 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO ISZERO PUSH2 0xD9B JUMPI PUSH1 0x0 SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x93634702 DUP13 DUP13 DUP13 PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xE62 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xE4A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xE8F JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xD03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x7 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xEBE JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0xEFE JUMPI PUSH1 0x0 DUP12 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP15 AND DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND SWAP8 POP PUSH2 0x10EB JUMP JUMPDEST PUSH1 0x8 DUP7 PUSH1 0x9 DUP2 GT ISZERO PUSH2 0xF0C JUMPI INVALID JUMPDEST EQ ISZERO PUSH2 0x1084 JUMPI DUP9 MLOAD PUSH1 0x41 EQ PUSH2 0xF82 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP9 PUSH1 0x0 DUP2 MLOAD DUP2 LT ISZERO ISZERO PUSH2 0xF91 JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV DUP2 MUL DIV SWAP5 POP PUSH2 0xFD1 DUP10 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP4 POP PUSH2 0xFE4 DUP10 PUSH1 0x21 PUSH4 0xFFFFFFFF PUSH2 0x1605 AND JUMP JUMPDEST SWAP3 POP PUSH1 0x1 DUP12 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP1 PUSH32 0x19457468657265756D205369676E6564204D6573736167653A0A200000000000 DUP2 MSTORE POP PUSH1 0x1B ADD DUP3 PUSH1 0x0 NOT AND PUSH1 0x0 NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xAB4 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA77 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5349474E41545552455F554E535550504F525445440000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST POP POP POP POP POP POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1106 DUP5 DUP5 DUP5 PUSH2 0x54A JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x1196 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5245454E5452414E43595F494C4C4547414C0000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH2 0x11D9 PUSH2 0x11D4 DUP9 DUP9 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x177F SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x19C0 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD SWAP1 SWAP2 POP PUSH1 0xFF AND ISZERO PUSH2 0x125A JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xF PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F54585F484153480000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1360 JUMPI PUSH2 0x12B2 DUP2 DUP8 DUP6 DUP6 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP PUSH2 0x54A SWAP5 POP POP POP POP POP JUMP JUMPDEST ISZERO ISZERO PUSH2 0x131F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x14 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x494E56414C49445F54585F5349474E4154555245000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 AND OR SWAP1 SSTORE JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0x1 OR SWAP1 SSTORE MLOAD ADDRESS SWAP1 DUP7 SWAP1 DUP7 SWAP1 DUP1 DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY DUP3 ADD SWAP2 POP POP SWAP3 POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 GAS DELEGATECALL SWAP2 POP POP ISZERO ISZERO PUSH2 0x142C JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x10 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4641494C45445F455845435554494F4E00000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP7 AND CALLER EQ PUSH2 0x1472 JUMPI PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE JUMPDEST POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x4 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ISZERO PUSH2 0x14DE JUMPI PUSH1 0x4 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x14E0 JUMP JUMPDEST CALLER JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 MLOAD GT ISZERO ISZERO PUSH2 0x157F JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x21 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F5448414E5F5A45524F5F4C454E4754485F52455155495245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x4400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST DUP2 MLOAD DUP3 SWAP1 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x15AF JUMPI INVALID JUMPDEST ADD PUSH1 0x20 ADD MLOAD DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP3 MSTORE POP PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DUP2 SWAP1 DIV MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x16A2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x14 DUP3 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1746 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST PUSH2 0x1754 DUP3 PUSH1 0x14 DUP5 MLOAD SUB PUSH2 0x1A00 JUMP JUMPDEST DUP3 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC ADD SWAP1 SWAP3 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0x5A65726F45785472616E73616374696F6E280000000000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x75696E743235362073616C742C00000000000000000000000000000000000000 PUSH1 0x32 DUP4 ADD MSTORE PUSH32 0x61646472657373207369676E6572416464726573732C00000000000000000000 PUSH1 0x3F DUP4 ADD MSTORE PUSH32 0x6279746573206461746100000000000000000000000000000000000000000000 PUSH1 0x55 DUP4 ADD MSTORE PUSH32 0x2900000000000000000000000000000000000000000000000000000000000000 PUSH1 0x5F DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB DUP5 ADD DUP2 MSTORE PUSH1 0x60 SWAP1 SWAP3 ADD SWAP3 DUP4 SWAP1 MSTORE DUP2 MLOAD PUSH1 0x0 SWAP4 DUP5 SWAP4 DUP5 SWAP4 SWAP1 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x18A8 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x186B JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP4 ADD DUP2 SWAP1 SUB DUP2 KECCAK256 DUP10 MLOAD SWAP1 SWAP8 POP DUP10 SWAP6 POP SWAP1 SWAP4 POP DUP4 SWAP3 DUP6 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x193E JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1901 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB DUP3 KECCAK256 SWAP8 DUP3 MSTORE DUP2 ADD SWAP11 SWAP1 SWAP11 MSTORE POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 SWAP1 SWAP8 AND SWAP7 DUP9 ADD SWAP7 SWAP1 SWAP7 MSTORE POP POP PUSH1 0x60 DUP6 ADD MSTORE POP POP PUSH1 0x80 SWAP1 SWAP2 KECCAK256 SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH32 0x1901000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x2 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x22 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x42 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x14 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x1A9D JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F32305F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x14 ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 PUSH5 0x617C7F0D76 0xb3 0xeb NUMBER REVERT 0xaa MSTORE 0xce PUSH31 0xA7493CB434561C7BC8C72FC0D087119993100290000000000000000000000 ",
+ "sourceMap": "725:412:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1493:360:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1493:360:0;;;;;;;;;;;;;;;;;;;;;;;968:45:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;968:45:1;;;;;;;;;;;;;;;;;;;;;;;2090:391:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2090:391:0;;;;;;;;;;;1087:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1087:71:0;;;;;;;;;;;;967:63;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;967:63:0;;;;;;;;;2853:6730;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2853:6730:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2853:6730:0;;-1:-1:-1;2853:6730:0;;-1:-1:-1;;;;;;;2853:6730:0;818:317:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;818:317:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;818:317:10;;-1:-1:-1;818:317:10;;-1:-1:-1;;;;;;;818:317:10;1710:1456:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1710:1456:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1300:33:6;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1300:33:6;;;;;;;;;;;;;;;;;;;;1065:36:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1065:36:1;;;;;;;;;;;;;;;;;;;;;;;1493:360:0;1646:110;1680:4;1702:13;1733:9;;1646:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1646:16:0;;-1:-1:-1;;;;;1646:110:0:i;:::-;1625:174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1809:15:0;;;;1842:4;1809:15;;;;;;;;:30;;;;;;;;;;;:37;;;;;;;;;1493:360::o;968:45:1:-;;;;;;;;;;;;;;;:::o;2090:391:0:-;2223:21;2247:26;:24;:26::i;:::-;2283:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;;;;:61;;;;;;;;;;;;;2359:115;;;;;;;2283:32;;-1:-1:-1;2283:50:0;;:32;;2359:115;;;;;;;;;2090:391;;;:::o;1087:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;967:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2853:6730::-;3015:12;3205:22;3446:27;3567:7;3584:9;3603;3622:17;7428:24;3083:1;3064:9;:16;:20;3043:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3236:23;:9;:21;:23::i;:::-;3230:30;;;;-1:-1:-1;3358:29:0;3333:55;;;;3312:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3490:16;3476:31;;;;;;;;;;3446:61;-1:-1:-1;3989:21:0;3972:13;:38;;;;;;;;;3968:5265;;;4026:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3968:5265;4335:21;4318:13;:38;;;;;;;;;4314:4919;;;4397:16;;:21;4372:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4493:5;;-1:-1:-1;4512:14:0;;4314:4919;4599:20;4582:13;:37;;;;;;;;;4578:4655;;;4660:16;;4680:2;4660:22;4635:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4758:9;4768:1;4758:12;;;;;;;;;;;;;;;;;;;;;4752:19;;-1:-1:-1;4789:24:0;:9;4811:1;4789:24;:21;:24;:::i;:::-;4785:28;-1:-1:-1;4831:25:0;:9;4853:2;4831:25;:21;:25;:::i;:::-;4827:29;;4882:102;4909:4;4931:1;4950;4969;4882:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4882:102:0;;;;;5008:26;;;;;;;;;-1:-1:-1;4882:102:0;-1:-1:-1;5048:14:0;;-1:-1:-1;5048:14:0;4578:4655;5139:21;5122:13;:38;;;;;;;;;5118:4115;;;5201:16;;5221:2;5201:22;5176:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:9;5309:1;5299:12;;;;;;;;;;;;;;;;;;;;;5293:19;;-1:-1:-1;5330:24:0;:9;5352:1;5330:24;:21;:24;:::i;:::-;5326:28;-1:-1:-1;5372:25:0;:9;5394:2;5372:25;:21;:25;:::i;:::-;5368:29;;5423:225;5554:4;5460:116;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5460:116:0;;;5450:127;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5450:127:0;;;;;;;;;;;;-1:-1:-1;5423:225:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;263:2;;-1:-1;;5423:225:0;;;;;;;;;;;-1:-1:-1;5423:225:0;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5118:4115:0;6316:20;6299:13;:37;;;;;;;;;6295:2938;;;6377:16;;:21;6352:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6473:27;;;6490:10;6473:27;;-1:-1:-1;6514:14:0;;6295:2938;6698:20;6681:13;:37;;;;;;;;;6677:2556;;;6752:13;6744:39;;;6784:4;6790:9;6744:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6744:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6744:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6744:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6744:56:0;;-1:-1:-1;6814:14:0;;6677:2556;7327:23;7310:13;:40;;;;;;;;;7306:1927;;;7455:26;:9;:24;:26::i;:::-;7566:32;;;;;;;;:17;:32;;;;;;;;:50;;;;;;;;;;7428:53;;-1:-1:-1;7566:50:0;;7565:51;7561:102;;;7643:5;7636:12;;;;7561:102;7697:16;7686:45;;;7749:4;7771:13;7802:9;7686:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7686:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;7306:1927:0;7961:23;7944:13;:40;;;;;;;;;7940:1293;;;8010:15;;;;:9;:15;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;8054:14:0;;7940:1293;8634:20;8617:13;:37;;;;;;;;;8613:620;;;8695:16;;8715:2;8695:22;8670:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8793:9;8803:1;8793:12;;;;;;;;;;;;;;;;;;;;;8787:19;;-1:-1:-1;8824:24:0;:9;8846:1;8824:24;:21;:24;:::i;:::-;8820:28;-1:-1:-1;8866:25:0;:9;8888:2;8866:25;:21;:25;:::i;:::-;8862:29;;8917:227;9050:4;8954:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8954:118:0;;;8944:129;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;8613:620:0;9545:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2853:6730;;;;;;;;;;;;;:::o;818:317:10:-;979:12;1017:87;1047:4;1065:6;1085:9;1017:16;:87::i;:::-;1007:97;818:317;-1:-1:-1;;;;818:317:10:o;1710:1456:1:-;1924:21;;2014:23;;1924:35;:21;:35;1903:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2040:113;2058:94;2093:4;2111:13;2138:4;;2058:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:21:1;;-1:-1:-1;;;;;2058:94:1:i;:::-;2040:17;:113::i;:::-;2240:29;;;;:12;:29;;;;;;2014:139;;-1:-1:-1;2240:29:1;;2239:30;2218:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2396:27;;;2413:10;2396:27;2392:410;;2498:137;2536:15;2573:13;2608:9;;2498:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2498:16:1;;-1:-1:-1;;;;;2498:137:1:i;:::-;2473:216;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2754:21;:37;;;;;;;;;;2392:410;2843:29;;;;:12;:29;;;;;;;:36;;;;2875:4;2843:36;;;2910:32;2918:4;;2937;;;;2910:32;2937:4;;;;2910:32;;;;;;;;;;;;;;;;;;;;;;;;2889:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3072:27;;;3089:10;3072:27;3068:92;;3115:21;:34;;;;;;3068:92;1710:1456;;;;;;;:::o;1300:33:6:-;;;;:::o;1065:36:1:-;;;;;;:::o;5125:241::-;5256:21;;5208:7;;;;5256:35;:21;:35;:72;;5307:21;;;;5256:72;;;5294:10;5256:72;5231:97;5125:241;-1:-1:-1;;5125:241:1:o;8304:448:11:-;8388:13;8449:1;8438;:8;:12;8417:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8559:8;;8557:1;;8559:12;;;;8557:15;;;;;;;;;;8671:8;;8667:16;;8696:17;;;-1:-1:-1;8557:15:11;;;;;;;8304:448::o;13281:490::-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:11;13620:2;13718:13;13712:20;;13281:490::o;8947:482::-;9034:14;9097:2;9085:1;:8;:14;;9064:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9215:29;9227:1;9241:2;9230:1;:8;:13;9215:11;:29::i;:::-;9347:8;;9343:17;;9373;;;-1:-1:-1;9206:38:11;8947:482::o;3459:1222:1:-;1237:146;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;1237:146:1;;;;;;;;1227:157;;3623:14;;;;;;1237:146;;;;1227:157;;;;1237:146;1227:157;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;1227:157:1;;;;;;;;;;;3740:15;;1227:157;;-1:-1:-1;3740:15:1;;-1:-1:-1;1227:157:1;;-1:-1:-1;1227:157:1;;3740:15;;;-1:-1:-1;3740:15:1;1227:157;3740:15;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3740:15:1;;;;;;;;;;;;4118:26;;;4244:15;;4237:29;;;;-1:-1:-1;4389:42:1;4370:62;;;;4353:15;;;4346:87;;;;-1:-1:-1;;4483:2:1;4471:15;;4464:33;-1:-1:-1;;4638:3:1;4620:22;;;;3459:1222;-1:-1:-1;3459:1222:1:o;1833:924:6:-;1927:14;1984:18;2296:2;2290:9;2328:66;2313:82;;2445:1;2433:14;;2426:40;;;;2563:2;2551:15;;2544:35;;;;2715:2;2697:21;;;1833:924::o;10259:886:11:-;10380:14;10443:5;10451:2;10443:10;10431:1;:8;:22;;10410:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11047:13:11;10792:2;11047:13;11041:20;11063:42;11037:69;;10259:886::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/MixinTransactions.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 4
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 5
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 6
+ },
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.sol": {
+ "id": 7
+ },
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.sol": {
+ "id": 8
+ },
+ "2.0.0/protocol/Exchange/mixins/MTransactions.sol": {
+ "id": 9
+ },
+ "2.0.0/test/TestSignatureValidator/TestSignatureValidator.sol": {
+ "id": 10
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 11
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/MixinSignatureValidator.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 solidity 0.4.24;\n\nimport \"../../utils/LibBytes/LibBytes.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./interfaces/IWallet.sol\";\nimport \"./interfaces/IValidator.sol\";\n\n\ncontract MixinSignatureValidator is\n MSignatureValidator,\n MTransactions\n{\n using LibBytes for bytes;\n \n // Mapping of hash => signer => signed\n mapping (bytes32 => mapping (address => bool)) public preSigned;\n\n // Mapping of signer => validator => approved\n mapping (address => mapping (address => bool)) public allowedValidators;\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n {\n require(\n isValidSignature(\n hash,\n signerAddress,\n signature\n ),\n \"INVALID_SIGNATURE\"\n );\n preSigned[hash][signerAddress] = true;\n }\n\n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external\n {\n address signerAddress = getCurrentContextAddress();\n allowedValidators[signerAddress][validatorAddress] = approval;\n emit SignatureValidatorApproval(\n signerAddress,\n validatorAddress,\n approval\n );\n }\n\n /// @dev Verifies that a hash has been signed by the given signer.\n /// @param hash Any 32 byte hash.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n /// @return True if the address recovered from the provided signature matches the input signer address.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n require(\n signature.length > 0,\n \"LENGTH_GREATER_THAN_0_REQUIRED\"\n );\n\n // Pop last byte off of signature byte array.\n uint8 signatureTypeRaw = uint8(signature.popLastByte());\n\n // Ensure signature is supported\n require(\n signatureTypeRaw < uint8(SignatureType.NSignatureTypes),\n \"SIGNATURE_UNSUPPORTED\"\n );\n\n SignatureType signatureType = SignatureType(signatureTypeRaw);\n\n // Variables are not scoped in Solidity.\n uint8 v;\n bytes32 r;\n bytes32 s;\n address recovered;\n\n // Always illegal signature.\n // This is always an implicit option since a signer can create a\n // signature array with invalid type or length. We may as well make\n // it an explicit option. This aids testing and analysis. It is\n // also the initialization value for the enum type.\n if (signatureType == SignatureType.Illegal) {\n revert(\"SIGNATURE_ILLEGAL\");\n\n // Always invalid signature.\n // Like Illegal, this is always implicitly available and therefore\n // offered explicitly. It can be implicitly created by providing\n // a correctly formatted but incorrect signature.\n } else if (signatureType == SignatureType.Invalid) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = false;\n return isValid;\n\n // Signature using EIP712\n } else if (signatureType == SignatureType.EIP712) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n hash,\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Signed using web3.eth_sign\n } else if (signatureType == SignatureType.EthSign) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n32\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n\n // Implicitly signed by caller.\n // The signer has initiated the call. In the case of non-contract\n // accounts it means the transaction itself was signed.\n // Example: let's say for a particular operation three signatures\n // A, B and C are required. To submit the transaction, A and B can\n // give a signature to C, who can then submit the transaction using\n // `Caller` for his own signature. Or A and C can sign and B can\n // submit using `Caller`. Having `Caller` allows this flexibility.\n } else if (signatureType == SignatureType.Caller) {\n require(\n signature.length == 0,\n \"LENGTH_0_REQUIRED\"\n );\n isValid = signerAddress == msg.sender;\n return isValid;\n\n // Signature verified by wallet contract.\n // If used with an order, the maker of the order is the wallet contract.\n } else if (signatureType == SignatureType.Wallet) {\n isValid = IWallet(signerAddress).isValidSignature(hash, signature);\n return isValid;\n\n // Signature verified by validator contract.\n // If used with an order, the maker of the order can still be an EOA.\n // A signature using this type should be encoded as:\n // | Offset | Length | Contents |\n // | 0x00 | x | Signature to validate |\n // | 0x00 + x | 20 | Address of validator contract |\n // | 0x14 + x | 1 | Signature type is always \"\\x06\" |\n } else if (signatureType == SignatureType.Validator) {\n // Pop last 20 bytes off of signature byte array.\n address validatorAddress = signature.popLast20Bytes();\n \n // Ensure signer has approved validator.\n if (!allowedValidators[signerAddress][validatorAddress]) {\n return false;\n }\n isValid = IValidator(validatorAddress).isValidSignature(\n hash,\n signerAddress,\n signature\n );\n return isValid;\n\n // Signer signed hash previously using the preSign function.\n } else if (signatureType == SignatureType.PreSigned) {\n isValid = preSigned[hash][signerAddress];\n return isValid;\n\n // Signature from Trezor hardware wallet.\n // It differs from web3.eth_sign in the encoding of message length\n // (Bitcoin varint encoding vs ascii-decimal, the latter is not\n // self-terminating which leads to ambiguities).\n // See also:\n // https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/ethereum.c#L602\n // https://github.com/trezor/trezor-mcu/blob/master/firmware/crypto.c#L36\n } else if (signatureType == SignatureType.Trezor) {\n require(\n signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n v = uint8(signature[0]);\n r = signature.readBytes32(1);\n s = signature.readBytes32(33);\n recovered = ecrecover(\n keccak256(abi.encodePacked(\n \"\\x19Ethereum Signed Message:\\n\\x20\",\n hash\n )),\n v,\n r,\n s\n );\n isValid = signerAddress == recovered;\n return isValid;\n }\n\n // Anything else is illegal (We do not return false because\n // the signature may actually be valid, just not in a format\n // that we currently support. In this case returning false\n // may lead the caller to incorrectly believe that the\n // signature was invalid.)\n revert(\"SIGNATURE_UNSUPPORTED\");\n }\n}\n",
+ "2.0.0/protocol/Exchange/MixinTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"./libs/LibExchangeErrors.sol\";\nimport \"./mixins/MSignatureValidator.sol\";\nimport \"./mixins/MTransactions.sol\";\nimport \"./libs/LibEIP712.sol\";\n\n\ncontract MixinTransactions is\n LibEIP712,\n MSignatureValidator,\n MTransactions\n{\n\n // Mapping of transaction hash => executed\n // This prevents transactions from being executed more than once.\n mapping (bytes32 => bool) public transactions;\n\n // Address of current transaction signer\n address public currentContextAddress;\n\n // Hash for the EIP712 ZeroEx Transaction Schema\n bytes32 constant internal EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"ZeroExTransaction(\",\n \"uint256 salt,\",\n \"address signerAddress,\",\n \"bytes data\",\n \")\"\n ));\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external\n {\n // Prevent reentrancy\n require(\n currentContextAddress == address(0),\n \"REENTRANCY_ILLEGAL\"\n );\n\n bytes32 transactionHash = hashEIP712Message(hashZeroExTransaction(\n salt,\n signerAddress,\n data\n ));\n\n // Validate transaction has not been executed\n require(\n !transactions[transactionHash],\n \"INVALID_TX_HASH\"\n );\n\n // Transaction always valid if signer is sender of transaction\n if (signerAddress != msg.sender) {\n // Validate signature\n require(\n isValidSignature(\n transactionHash,\n signerAddress,\n signature\n ),\n \"INVALID_TX_SIGNATURE\"\n );\n\n // Set the current transaction signer\n currentContextAddress = signerAddress;\n }\n\n // Execute transaction\n transactions[transactionHash] = true;\n require(\n address(this).delegatecall(data),\n \"FAILED_EXECUTION\"\n );\n\n // Reset current transaction signer if it was previously updated\n if (signerAddress != msg.sender) {\n currentContextAddress = address(0);\n }\n }\n\n /// @dev Calculates EIP712 hash of the Transaction.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @return EIP712 hash of the Transaction.\n function hashZeroExTransaction(\n uint256 salt,\n address signerAddress,\n bytes memory data\n )\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH;\n bytes32 dataHash = keccak256(data);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ZEROEX_TRANSACTION_SCHEMA_HASH,\n // salt,\n // bytes32(signerAddress),\n // keccak256(data)\n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, schemaHash) // hash of schema\n mstore(add(memPtr, 32), salt) // salt\n mstore(add(memPtr, 64), and(signerAddress, 0xffffffffffffffffffffffffffffffffffffffff)) // signerAddress\n mstore(add(memPtr, 96), dataHash) // hash of data\n\n // Compute hash\n result := keccak256(memPtr, 128)\n }\n return result;\n }\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address)\n {\n address contextAddress = currentContextAddress == address(0) ? msg.sender : currentContextAddress;\n return contextAddress;\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibExchangeErrors.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\n// solhint-disable\npragma solidity 0.4.24;\n\n\n/// @dev This contract documents the revert reasons used in the Exchange contract.\n/// This contract is intended to serve as a reference, but is not actually used for efficiency reasons.\ncontract LibExchangeErrors {\n\n /// Order validation errors ///\n string constant ORDER_UNFILLABLE = \"ORDER_UNFILLABLE\"; // Order cannot be filled.\n string constant INVALID_MAKER = \"INVALID_MAKER\"; // Invalid makerAddress.\n string constant INVALID_TAKER = \"INVALID_TAKER\"; // Invalid takerAddress.\n string constant INVALID_SENDER = \"INVALID_SENDER\"; // Invalid `msg.sender`.\n string constant INVALID_ORDER_SIGNATURE = \"INVALID_ORDER_SIGNATURE\"; // Signature validation failed. \n \n /// fillOrder validation errors ///\n string constant INVALID_TAKER_AMOUNT = \"INVALID_TAKER_AMOUNT\"; // takerAssetFillAmount cannot equal 0.\n string constant ROUNDING_ERROR = \"ROUNDING_ERROR\"; // Rounding error greater than 0.1% of takerAssetFillAmount. \n \n /// Signature validation errors ///\n string constant INVALID_SIGNATURE = \"INVALID_SIGNATURE\"; // Signature validation failed. \n string constant SIGNATURE_ILLEGAL = \"SIGNATURE_ILLEGAL\"; // Signature type is illegal.\n string constant SIGNATURE_UNSUPPORTED = \"SIGNATURE_UNSUPPORTED\"; // Signature type unsupported.\n \n /// cancelOrdersUptTo errors ///\n string constant INVALID_NEW_ORDER_EPOCH = \"INVALID_NEW_ORDER_EPOCH\"; // Specified salt must be greater than or equal to existing orderEpoch.\n\n /// fillOrKillOrder errors ///\n string constant COMPLETE_FILL_FAILED = \"COMPLETE_FILL_FAILED\"; // Desired takerAssetFillAmount could not be completely filled. \n\n /// matchOrders errors ///\n string constant NEGATIVE_SPREAD_REQUIRED = \"NEGATIVE_SPREAD_REQUIRED\"; // Matched orders must have a negative spread.\n\n /// Transaction errors ///\n string constant REENTRANCY_ILLEGAL = \"REENTRANCY_ILLEGAL\"; // Recursive reentrancy is not allowed. \n string constant INVALID_TX_HASH = \"INVALID_TX_HASH\"; // Transaction has already been executed. \n string constant INVALID_TX_SIGNATURE = \"INVALID_TX_SIGNATURE\"; // Signature validation failed. \n string constant FAILED_EXECUTION = \"FAILED_EXECUTION\"; // Transaction execution failed. \n \n /// registerAssetProxy errors ///\n string constant ASSET_PROXY_ALREADY_EXISTS = \"ASSET_PROXY_ALREADY_EXISTS\"; // AssetProxy with same id already exists.\n\n /// dispatchTransferFrom errors ///\n string constant ASSET_PROXY_DOES_NOT_EXIST = \"ASSET_PROXY_DOES_NOT_EXIST\"; // No assetProxy registered at given id.\n string constant TRANSFER_FAILED = \"TRANSFER_FAILED\"; // Asset transfer unsuccesful.\n\n /// Length validation errors ///\n string constant LENGTH_GREATER_THAN_0_REQUIRED = \"LENGTH_GREATER_THAN_0_REQUIRED\"; // Byte array must have a length greater than 0.\n string constant LENGTH_GREATER_THAN_3_REQUIRED = \"LENGTH_GREATER_THAN_3_REQUIRED\"; // Byte array must have a length greater than 3.\n string constant LENGTH_0_REQUIRED = \"LENGTH_0_REQUIRED\"; // Byte array must have a length of 0.\n string constant LENGTH_65_REQUIRED = \"LENGTH_65_REQUIRED\"; // Byte array must have a length of 65.\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MSignatureValidator.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 solidity 0.4.24;\n\nimport \"../interfaces/ISignatureValidator.sol\";\n\n\ncontract MSignatureValidator is\n ISignatureValidator\n{\n event SignatureValidatorApproval(\n address indexed signerAddress, // Address that approves or disapproves a contract to verify signatures.\n address indexed validatorAddress, // Address of signature validator contract.\n bool approved // Approval or disapproval of validator contract.\n );\n\n // Allowed signature types.\n enum SignatureType {\n Illegal, // 0x00, default value\n Invalid, // 0x01\n EIP712, // 0x02\n EthSign, // 0x03\n Caller, // 0x04\n Wallet, // 0x05\n Validator, // 0x06\n PreSigned, // 0x07\n Trezor, // 0x08\n NSignatureTypes // 0x09, number of signature types. Always leave at end.\n }\n}\n",
+ "2.0.0/protocol/Exchange/mixins/MTransactions.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*/\npragma solidity 0.4.24;\n\nimport \"../interfaces/ITransactions.sol\";\n\n\ncontract MTransactions is\n ITransactions\n{\n\n /// @dev The current function will be called in the context of this address (either 0x transaction signer or `msg.sender`).\n /// If calling a fill function, this address will represent the taker.\n /// If calling a cancel function, this address will represent the maker.\n /// @return Signer of 0x transaction if entry point is `executeTransaction`.\n /// `msg.sender` if entry point is any other function.\n function getCurrentContextAddress()\n internal\n view\n returns (address);\n}\n",
+ "2.0.0/test/TestSignatureValidator/TestSignatureValidator.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/MixinSignatureValidator.sol\";\nimport \"../../protocol/Exchange/MixinTransactions.sol\";\n\n\ncontract TestSignatureValidator is\n MixinSignatureValidator,\n MixinTransactions\n{\n\n function publicIsValidSignature(\n bytes32 hash,\n address signer,\n bytes memory signature\n )\n public\n view\n returns (bool isValid)\n {\n isValid = isValidSignature(\n hash,\n signer,\n signature\n );\n return isValid;\n }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x973d22eaba0971dd4b226ad3e89230f150ced7ee42408e9a42639a6d87f7e939",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestValidator.json b/packages/migrations/artifacts/2.0.0/TestValidator.json
new file mode 100644
index 000000000..fbb81433a
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestValidator.json
@@ -0,0 +1,95 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestValidator",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "validSigner",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50604051602080610134833981016040525160008054600160a060020a03909216600160a060020a031990921691909117905560e3806100516000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639363470281146043575b600080fd5b348015604e57600080fd5b50607e60048035906024803573ffffffffffffffffffffffffffffffffffffffff16916044359182019101356092565b604080519115158252519081900360200190f35b505060005473ffffffffffffffffffffffffffffffffffffffff9081169116149190505600a165627a7a72305820d9ff38e223fed81fc27fa163d79eee48b3957563fafa97170dee28cd838d91e60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x134 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0xE3 DUP1 PUSH2 0x51 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x93634702 DUP2 EQ PUSH1 0x43 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x7E PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH1 0x92 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd9 SELFDESTRUCT CODESIZE 0xe2 0x23 INVALID 0xd8 0x1f 0xc2 PUSH32 0xA163D79EEE48B3957563FAFA97170DEE28CD838D91E600290000000000000000 ",
+ "sourceMap": "667:1000:1:-;;;977:84;8:9:-1;5:2;;;30:1;27;20:12;5:2;977:84:1;;;;;;;;;;;;;1028:12;:26;;-1:-1:-1;;;;;1028:26:1;;;-1:-1:-1;;;;;;1028:26:1;;;;;;;;;667:1000;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639363470281146043575b600080fd5b348015604e57600080fd5b50607e60048035906024803573ffffffffffffffffffffffffffffffffffffffff16916044359182019101356092565b604080519115158252519081900360200190f35b505060005473ffffffffffffffffffffffffffffffffffffffff9081169116149190505600a165627a7a72305820d9ff38e223fed81fc27fa163d79eee48b3957563fafa97170dee28cd838d91e60029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x93634702 DUP2 EQ PUSH1 0x43 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x7E PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH1 0x92 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xd9 SELFDESTRUCT CODESIZE 0xe2 0x23 INVALID 0xd8 0x1f 0xc2 PUSH32 0xA163D79EEE48B3957563FAFA97170DEE28CD838D91E600290000000000000000 ",
+ "sourceMap": "667:1000:1:-;;;;;;;;;;;;;;;;;;;;;;;1398:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1398:230:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1555:12:1;1608;;;;;1591:29;;;;1398:230;-1:-1:-1;1398:230:1:o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 0
+ },
+ "2.0.0/test/TestValidator/TestValidator.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/test/TestValidator/TestValidator.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IValidator.sol\";\n\n\ncontract TestValidator is \n IValidator\n{\n\n // The single valid signer for this wallet.\n // solhint-disable-next-line var-name-mixedcase\n address internal VALID_SIGNER;\n\n /// @dev constructs a new `TestValidator` with a single valid signer.\n /// @param validSigner The sole, valid signer.\n constructor (address validSigner) public {\n VALID_SIGNER = validSigner;\n }\n\n /// @dev Verifies that a signature is valid. `signer` must match `VALID_SIGNER`.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of signature.\n // solhint-disable no-unused-vars\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid)\n {\n return (signerAddress == VALID_SIGNER);\n }\n // solhint-enable no-unused-vars\n}\n"
+ },
+ "sourceTreeHashHex": "0x3aab123236e3d7692e368430b803197db0cab02b088bba7835223dadbee10077",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TestWallet.json b/packages/migrations/artifacts/2.0.0/TestWallet.json
new file mode 100644
index 000000000..d54bb98fa
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TestWallet.json
@@ -0,0 +1,95 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TestWallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "eip712Signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "walletOwner",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b5060405160208061040a833981016040525160008054600160a060020a03909216600160a060020a03199092169190911790556103b8806100526000396000f3006080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631626ba7e8114610045575b600080fd5b34801561005157600080fd5b5061006960048035906024803590810191013561007d565b604080519115158252519081900360200190f35b600080808080604186146100f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b868660008181106100ff57fe5b905001357f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000900493506101d3600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b9250610219602188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b60408051600080825260208083018085528d905260ff8916838501526060830188905260808301859052925193955060019360a080840194937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0830193908390039091019190865af1158015610293573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015160005473ffffffffffffffffffffffffffffffffffffffff9182169116149998505050505050505050565b60008160200183511015151561038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b500160200151905600a165627a7a723058208825aaf9d7959cb0be8576f99e10a1c04cd0b7ca2689235aaebe344ec32d3f4e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x40A DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x3B8 DUP1 PUSH2 0x52 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1626BA7E DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 DUP2 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x41 DUP7 EQ PUSH2 0xF2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 DUP7 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0xFF JUMPI INVALID JUMPDEST SWAP1 POP ADD CALLDATALOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP4 POP PUSH2 0x1D3 PUSH1 0x1 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST SWAP3 POP PUSH2 0x219 PUSH1 0x21 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 DUP6 MSTORE DUP14 SWAP1 MSTORE PUSH1 0xFF DUP10 AND DUP4 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP9 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE SWAP3 MLOAD SWAP4 SWAP6 POP PUSH1 0x1 SWAP4 PUSH1 0xA0 DUP1 DUP5 ADD SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 ADD SWAP4 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x293 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x383 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 0x25 0xaa 0xf9 0xd7 SWAP6 SWAP13 0xb0 0xbe DUP6 PUSH23 0xF99E10A1C04CD0B7CA2689235AAEBE344EC32D3F4E0029 ",
+ "sourceMap": "708:1193:1:-;;;1019:84;8:9:-1;5:2;;;30:1;27;20:12;5:2;1019:84:1;;;;;;;;;;;;;1070:12;:26;;-1:-1:-1;;;;;1070:26:1;;;-1:-1:-1;;;;;;1070:26:1;;;;;;;;;708:1193;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631626ba7e8114610045575b600080fd5b34801561005157600080fd5b5061006960048035906024803590810191013561007d565b604080519115158252519081900360200190f35b600080808080604186146100f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b868660008181106100ff57fe5b905001357f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000900493506101d3600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b9250610219602188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b60408051600080825260208083018085528d905260ff8916838501526060830188905260808301859052925193955060019360a080840194937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0830193908390039091019190865af1158015610293573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015160005473ffffffffffffffffffffffffffffffffffffffff9182169116149998505050505050505050565b60008160200183511015151561038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b500160200151905600a165627a7a723058208825aaf9d7959cb0be8576f99e10a1c04cd0b7ca2689235aaebe344ec32d3f4e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1626BA7E DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 DUP2 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x41 DUP7 EQ PUSH2 0xF2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 DUP7 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0xFF JUMPI INVALID JUMPDEST SWAP1 POP ADD CALLDATALOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP4 POP PUSH2 0x1D3 PUSH1 0x1 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST SWAP3 POP PUSH2 0x219 PUSH1 0x21 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 DUP6 MSTORE DUP14 SWAP1 MSTORE PUSH1 0xFF DUP10 AND DUP4 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP9 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE SWAP3 MLOAD SWAP4 SWAP6 POP PUSH1 0x1 SWAP4 PUSH1 0xA0 DUP1 DUP5 ADD SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 ADD SWAP4 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x293 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x383 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 DUP9 0x25 0xaa 0xf9 0xd7 SWAP6 SWAP13 0xb0 0xbe DUP6 PUSH23 0xF99E10A1C04CD0B7CA2689235AAEBE344EC32D3F4E0029 ",
+ "sourceMap": "708:1193:1:-;;;;;;;;;;;;;;;;;;;;;;;1351:548;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1351:548:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1483:12;;;;;1558:2;1532:28;;1511:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1631:15;;1647:1;1631:18;;;;;;;;;;;;;;;;;;;1625:25;;;1615:35;;1672:30;1700:1;1672:15;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1672:27:1;;:30;-1:-1:-1;;1672:30:1;:27;:30;;-1:-1:-1;;;1672:30:1:i;:::-;1660:42;;1724:31;1752:2;1724:15;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1724:27:1;;:31;-1:-1:-1;;1724:31:1;:27;:31;;-1:-1:-1;;;1724:31:1:i;:::-;1792:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1712:43;;-1:-1:-1;1792:24:1;;;;;;;;-1:-1:-1;1792:24:1;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1792:24:1;;;;;1836:12;;:32;;;;:12;;:32;;1351:548;-1:-1:-1;;;;;;;;;1351:548:1:o;13281:490:2:-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:2;13620:2;13718:13;13712:20;;13281:490::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 0
+ },
+ "2.0.0/test/TestWallet/TestWallet.sol": {
+ "id": 1
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 2
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/test/TestWallet/TestWallet.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IWallet.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\n\ncontract TestWallet is \n IWallet\n{\n using LibBytes for bytes;\n\n // The owner of this wallet.\n // solhint-disable-next-line var-name-mixedcase\n address internal WALLET_OWNER;\n\n /// @dev constructs a new `TestWallet` with a single owner.\n /// @param walletOwner The owner of this wallet.\n constructor (address walletOwner) public {\n WALLET_OWNER = walletOwner;\n }\n\n /// @dev Validates an EIP712 signature.\n /// The signer must match the owner of this wallet.\n /// @param hash Message hash that is signed.\n /// @param eip712Signature Proof of signing.\n /// @return Validity of signature.\n function isValidSignature(\n bytes32 hash,\n bytes eip712Signature\n )\n external\n view\n returns (bool isValid)\n {\n require(\n eip712Signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n\n uint8 v = uint8(eip712Signature[0]);\n bytes32 r = eip712Signature.readBytes32(1);\n bytes32 s = eip712Signature.readBytes32(33);\n address recoveredAddress = ecrecover(hash, v, r, s);\n isValid = WALLET_OWNER == recoveredAddress;\n return isValid;\n }\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x6371bfeaaf096ad3212420412e4507c6cef266a4df89047f9e5086ec4c4b7bdb",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/TokenRegistry.json b/packages/migrations/artifacts/2.0.0/TokenRegistry.json
new file mode 100644
index 000000000..0ed4df473
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/TokenRegistry.json
@@ -0,0 +1,598 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "TokenRegistry",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_index",
+ "type": "uint256"
+ }
+ ],
+ "name": "removeToken",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenAddressByName",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenAddressBySymbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "setTokenSwarmHash",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ }
+ ],
+ "name": "getTokenMetaData",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_name",
+ "type": "string"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ },
+ {
+ "name": "_decimals",
+ "type": "uint8"
+ },
+ {
+ "name": "_ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "name": "_swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "addToken",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "setTokenName",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "tokens",
+ "outputs": [
+ {
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "tokenAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_name",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenByName",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "getTokenAddresses",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address[]"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_ipfsHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "setTokenIpfsHash",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "getTokenBySymbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "string"
+ },
+ {
+ "name": "",
+ "type": "uint8"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ },
+ {
+ "name": "",
+ "type": "bytes"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_token",
+ "type": "address"
+ },
+ {
+ "name": "_symbol",
+ "type": "string"
+ }
+ ],
+ "name": "setTokenSymbol",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogAddToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "symbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "decimals",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "name": "ipfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "swarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogRemoveToken",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldName",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "newName",
+ "type": "string"
+ }
+ ],
+ "name": "LogTokenNameChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldSymbol",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "name": "newSymbol",
+ "type": "string"
+ }
+ ],
+ "name": "LogTokenSymbolChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldIpfsHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "newIpfsHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogTokenIpfsHashChange",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "token",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "oldSwarmHash",
+ "type": "bytes"
+ },
+ {
+ "indexed": false,
+ "name": "newSwarmHash",
+ "type": "bytes"
+ }
+ ],
+ "name": "LogTokenSwarmHashChange",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260008054600160a060020a03191633179055612d9a806100256000396000f3006080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a72305820a2b015e1c6a978406b24e8687202ced017fe0b041c7b9b9d741eb9bcb14a014e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND CALLER OR SWAP1 SSTORE PUSH2 0x2D9A DUP1 PUSH2 0x25 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 LOG2 0xb0 ISZERO 0xe1 0xc6 0xa9 PUSH25 0x406B24E8687202CED017FE0B041C7B9B9D741EB9BCB14A014E STOP 0x29 ",
+ "sourceMap": "886:8364:1:-;;;282:5:0;:18;;-1:-1:-1;;;;;;282:18:0;290:10;282:18;;;886:8364:1;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166313baf1e681146100ea5780632fbfeba91461011d5780633550b6d91461019f57806356318820146101f85780637abccac91461026c5780638da5cb5b14610484578063a880319d14610499578063c370c86d146105d0578063e486033914610644578063e5df8b8414610672578063e73fc0c31461068a578063ee8c24b8146106e3578063eef05f6514610748578063efa74f1f146107bc578063f036417f14610815578063f2fde38b14610889575b600080fd5b3480156100f657600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff600435166024356108b7565b005b34801561012957600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610efb9650505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156101ab57600080fd5b506040805160206004803580820135601f8101849004840285018401909552848452610176943694929360249392840191908190840183828082843750949750610fb59650505050505050565b34801561020457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506110069650505050505050565b34801561027857600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166111d8565b604051808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001806020018660ff1660ff168152602001806020018060200185810385528a818151815260200191508051906020019080838360005b83811015610321578181015183820152602001610309565b50505050905090810190601f16801561034e5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156103e15781810151838201526020016103c9565b50505050905090810190601f16801561040e5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015610441578181015183820152602001610429565b50505050905090810190601f16801561046e5780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34801561049057600080fd5b50610176611528565b3480156104a557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff1695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b60ff8b35169b909a90999401975091955091820193509150819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506115449650505050505050565b3480156105dc57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff16953695604494919390910191908190840183828082843750949750611cbc9650505050505050565b34801561065057600080fd5b5061029a73ffffffffffffffffffffffffffffffffffffffff600435166120d9565b34801561067e57600080fd5b506101766004356123ce565b34801561069657600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a9436949293602493928401919081908401838280828437509497506124039650505050505050565b3480156106ef57600080fd5b506106f86124e3565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561073457818101518382015260200161071c565b505050509050019250505060405180910390f35b34801561075457600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506125539650505050505050565b3480156107c857600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261029a94369492936024939284019190819084018382808284375094975061271e9650505050505050565b34801561082157600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261011b95833573ffffffffffffffffffffffffffffffffffffffff169536956044949193909101919081908401838280828437509497506127799650505050505050565b34801561089557600080fd5b5061011b73ffffffffffffffffffffffffffffffffffffffff60043516612b95565b6000805473ffffffffffffffffffffffffffffffffffffffff1633146108dc57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561091157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660048481548110151561093757fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161461096357600080fd5b600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061099357fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff90921691859081106109c657fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600480547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190610a459082612c19565b5073ffffffffffffffffffffffffffffffffffffffff80851660009081526001602081815260409283902080546003820154855160ff90911695810186905260a0808252838601805460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9882161561010002989098011687900491830182905293995091909616957f32c54f1e2ea75844ded7517e7dbcd3895da7cd0c28f9ab9f9cf6ecf5f83762c695929489019360048a019260058b0192918291908201906060830190608084019060c08501908b908015610b655780601f10610b3a57610100808354040283529160200191610b65565b820191906000526020600020905b815481529060010190602001808311610b4857829003601f168201915b50508581038452895460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010060018416150201909116048082526020909101908a908015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b50508581038352875460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019088908015610c895780601f10610c5e57610100808354040283529160200191610c89565b820191906000526020600020905b815481529060010190602001808311610c6c57829003601f168201915b50508581038252865460027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600184161502019091160480825260209091019087908015610d1b5780601f10610cf057610100808354040283529160200191610d1b565b820191906000526020600020905b815481529060010190602001808311610cfe57829003601f168201915b5050995050505050505050505060405180910390a26002826002016040518082805460018160011615610100020316600290048015610d915780601f10610d6f576101008083540402835291820191610d91565b820191906000526020600020905b815481529060010190602001808311610d7d575b5050915050908152602001604051809103902060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003826001016040518082805460018160011615610100020316600290048015610e285780601f10610e06576101008083540402835291820191610e28565b820191906000526020600020905b815481529060010190602001808311610e14575b50509283525050604080516020928190038301902080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff871660009081526001938490529182208054909116815591610e9f90830182612c42565b610ead600283016000612c42565b6003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ee5600483016000612c42565b610ef3600583016000612c42565b505050505050565b60006003826040518082805190602001908083835b60208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16949350505050565b600060028260405180828051906020019080838360208310610f4d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f10565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461102b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808416600090815260016020526040902054849116151561106057600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600582018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507fc3168fdc13112e44a031057dbf6c609b33353addb4d8037d24543e22cbfe2acd93889282919082019060608301908690801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611180578181015183820152602001611168565b50505050905090810190601f1680156111ad5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060058401906020860190612c86565b5050505050565b600060608060006060806111ea612d04565b73ffffffffffffffffffffffffffffffffffffffff888116600090815260016020818152604092839020835160c0810185528154909516855280830180548551600261010096831615969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911694909404601f8101849004840285018401909552848452909385830193928301828280156112cb5780601f106112a0576101008083540402835291602001916112cb565b820191906000526020600020905b8154815290600101906020018083116112ae57829003601f168201915b5050509183525050600282810180546040805160206001841615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190931694909404601f8101839004830285018301909152808452938101939083018282801561137b5780601f106113505761010080835404028352916020019161137b565b820191906000526020600020905b81548152906001019060200180831161135e57829003601f168201915b5050509183525050600382015460ff1660208083019190915260048301805460408051601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600186161561010002019094169390930492830185900485028101850182528281529401939283018282801561143a5780601f1061140f5761010080835404028352916020019161143a565b820191906000526020600020905b81548152906001019060200180831161141d57829003601f168201915b505050918352505060058201805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529382019392918301828280156114ec5780601f106114c1576101008083540402835291602001916114ec565b820191906000526020600020905b8154815290600101906020018083116114cf57829003601f168201915b5050509190925250508151602083015160408401516060850151608086015160a090960151939e929d50909b5099509297509550909350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff16331461156857600080fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600160205260409020548791161561159c57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff811615156115bf57600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061162857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016115eb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611699905057600080fd5b87600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b6020831061170257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016116c5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611773905057600080fd5b6040805160c08101825273ffffffffffffffffffffffffffffffffffffffff8c811680835260208084018e81528486018e905260ff8d166060860152608085018c905260a085018b90526000928352600180835295909220845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783559051805193949293611812938501929190910190612c86565b506040820151805161182e916002840191602090910190612c86565b5060608201516003820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560808201518051611882916004840191602090910190612c86565b5060a0820151805161189e916005840191602090910190612c86565b5050600480546001810182556000919091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8d161790555060405188518b916002918b9190819060208401908083835b6020831061196657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611929565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199092169116179052920194855250604051938490038101842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff969096169590951790945550508a518c926003928d9290918291908401908083835b60208310611a4757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611a0a565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060408051948590038201852080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff97881617905560ff8d169085015260a08085528e51908501528d51948f16947fd8d928b0b50ca11d9dc273236b46f3526515b03602f71f3a6af4f45bd9fa9144948f94508e93508d928d928d92918291828201916060840191608085019160c0860191908c019080838360005b83811015611b4f578181015183820152602001611b37565b50505050905090810190601f168015611b7c5780820380516001836020036101000a031916815260200191505b5085810384528951815289516020918201918b019080838360005b83811015611baf578181015183820152602001611b97565b50505050905090810190601f168015611bdc5780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b83811015611c0f578181015183820152602001611bf7565b50505050905090810190601f168015611c3c5780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b83811015611c6f578181015183820152602001611c57565b50505050905090810190601f168015611c9c5780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390a250505050505050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff163314611ce157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600160205260409020548491161515611d1657600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166003826040518082805190602001908083835b60208310611d7f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d42565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff16929092149150611df0905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481528184018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529097507f4a6dbfc867b179991dec22ff19960f0a94d8d9d891fc556f547764670340e8ae938992829190820190606083019086908015611edb5780601f10611eb057610100808354040283529160200191611edb565b820191906000526020600020905b815481529060010190602001808311611ebe57829003601f168201915b5050838103825284518152845160209182019186019080838360005b83811015611f0f578181015183820152602001611ef7565b50505050905090810190601f168015611f3c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26003836001016040518082805460018160011615610100020316600290048015611fac5780601f10611f8a576101008083540402835291820191611fac565b820191906000526020600020905b815481529060010190602001808311611f98575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600392889282918401908083835b6020831061203657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611ff9565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506001860191870190612c86565b600160208181526000928352604092839020805481840180548651600261010097831615979097027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911695909504601f810185900485028601850190965285855273ffffffffffffffffffffffffffffffffffffffff909116949193929091908301828280156121ad5780601f10612182576101008083540402835291602001916121ad565b820191906000526020600020905b81548152906001019060200180831161219057829003601f168201915b50505060028085018054604080516020601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100600187161502019094169590950492830185900485028101850190915281815295969594509092509083018282801561225d5780601f106122325761010080835404028352916020019161225d565b820191906000526020600020905b81548152906001019060200180831161224057829003601f168201915b50505050600383015460048401805460408051602060026101006001861615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f8101849004840282018401909252818152959660ff90941695939450908301828280156123165780601f106122eb57610100808354040283529160200191612316565b820191906000526020600020905b8154815290600101906020018083116122f957829003601f168201915b5050505060058301805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f81018490048402820184019092528181529495949350908301828280156123c45780601f10612399576101008083540402835291602001916123c4565b820191906000526020600020905b8154815290600101906020018083116123a757829003601f168201915b5050505050905086565b60048054829081106123dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6000606080600060608060006003886040518082805190602001908083835b6020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff1692506124ce91508290506111d8565b949d939c50919a509850965090945092505050565b6060600480548060200260200160405190810160405280929190818152602001828054801561254857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161251d575b505050505090505b90565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461257857600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156125ad57600080fd5b73ffffffffffffffffffffffffffffffffffffffff84166000818152600160208181526040928390208351848152600482018054600295811615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0116949094049481018590529096507f5b19f79ac4e8cfa820815502e11615f1a449e28155dc289ec5cac1a11f9086949388928291908201906060830190869080156126995780601f1061266e57610100808354040283529160200191612699565b820191906000526020600020905b81548152906001019060200180831161267c57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156126cd5781810151838201526020016126b5565b50505050905090810190601f1680156126fa5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a282516111d19060048401906020860190612c86565b6000606080600060608060006002886040518082805190602001908083836020831061245f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612422565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461279e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff80841660009081526001602052604090205484911615156127d357600080fd5b82600073ffffffffffffffffffffffffffffffffffffffff166002826040518082805190602001908083835b6020831061283c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016127ff565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003019092205473ffffffffffffffffffffffffffffffffffffffff169290921491506128ad905057600080fd5b73ffffffffffffffffffffffffffffffffffffffff851660008181526001602081815260409283902083518481526002808301805495861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01909516049481018590529097507f53d878a6530e56c9bc96548fa0a8cae4f1d1f49c86b0e934c086b992ebb6998f9389928291908201906060830190869080156129975780601f1061296c57610100808354040283529160200191612997565b820191906000526020600020905b81548152906001019060200180831161297a57829003601f168201915b5050838103825284518152845160209182019186019080838360005b838110156129cb5781810151838201526020016129b3565b50505050905090810190601f1680156129f85780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26002836002016040518082805460018160011615610100020316600290048015612a685780601f10612a46576101008083540402835291820191612a68565b820191906000526020600020905b815481529060010190602001808311612a54575b50509283525050604051908190036020908101822080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905585518792600292889282918401908083835b60208310612af257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612ab5565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018019909216911617905292019485525060405193849003810190932080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590951694909417909355508551610ef392506002860191870190612c86565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bb957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811615612c1657600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b815481835581811115612c3d57600083815260209020612c3d918101908301612d54565b505050565b50805460018160011615610100020316600290046000825580601f10612c685750612c16565b601f016020900490600052602060002090810190612c169190612d54565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612cc757805160ff1916838001178555612cf4565b82800160010185558215612cf4579182015b82811115612cf4578251825591602001919060010190612cd9565b50612d00929150612d54565b5090565b60c060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016060815260200160608152602001600060ff16815260200160608152602001606081525090565b61255091905b80821115612d005760008155600101612d5a5600a165627a7a72305820a2b015e1c6a978406b24e8687202ced017fe0b041c7b9b9d741eb9bcb14a014e0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xE5 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x13BAF1E6 DUP2 EQ PUSH2 0xEA JUMPI DUP1 PUSH4 0x2FBFEBA9 EQ PUSH2 0x11D JUMPI DUP1 PUSH4 0x3550B6D9 EQ PUSH2 0x19F JUMPI DUP1 PUSH4 0x56318820 EQ PUSH2 0x1F8 JUMPI DUP1 PUSH4 0x7ABCCAC9 EQ PUSH2 0x26C JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x484 JUMPI DUP1 PUSH4 0xA880319D EQ PUSH2 0x499 JUMPI DUP1 PUSH4 0xC370C86D EQ PUSH2 0x5D0 JUMPI DUP1 PUSH4 0xE4860339 EQ PUSH2 0x644 JUMPI DUP1 PUSH4 0xE5DF8B84 EQ PUSH2 0x672 JUMPI DUP1 PUSH4 0xE73FC0C3 EQ PUSH2 0x68A JUMPI DUP1 PUSH4 0xEE8C24B8 EQ PUSH2 0x6E3 JUMPI DUP1 PUSH4 0xEEF05F65 EQ PUSH2 0x748 JUMPI DUP1 PUSH4 0xEFA74F1F EQ PUSH2 0x7BC JUMPI DUP1 PUSH4 0xF036417F EQ PUSH2 0x815 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x889 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x8B7 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x129 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xEFB SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1AB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x176 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0xFB5 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x204 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1006 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x278 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x11D8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP8 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP7 PUSH1 0xFF AND PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP6 DUP2 SUB DUP6 MSTORE DUP11 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x321 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x309 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x34E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x381 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x369 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x3AE JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x3E1 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x3C9 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x40E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x441 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x429 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x46E JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP11 POP POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x490 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH2 0x1528 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP2 DUP11 ADD CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD DUP6 MSTORE DUP2 DUP5 MSTORE SWAP9 SWAP12 PUSH1 0xFF DUP12 CALLDATALOAD AND SWAP12 SWAP1 SWAP11 SWAP1 SWAP10 SWAP5 ADD SWAP8 POP SWAP2 SWAP6 POP SWAP2 DUP3 ADD SWAP4 POP SWAP2 POP DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1544 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x1CBC SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x650 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x29A PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x20D9 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x67E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x176 PUSH1 0x4 CALLDATALOAD PUSH2 0x23CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x696 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2403 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6EF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6F8 PUSH2 0x24E3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 DUP2 ADD SWAP2 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x734 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x71C JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x754 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2553 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x7C8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0x29A SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x271E SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x821 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 PUSH1 0x24 DUP1 CALLDATALOAD DUP3 DUP2 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH2 0x11B SWAP6 DUP4 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP6 CALLDATASIZE SWAP6 PUSH1 0x44 SWAP5 SWAP2 SWAP4 SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x2779 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x895 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x11B PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x2B95 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x8DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x911 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x4 DUP5 DUP2 SLOAD DUP2 LT ISZERO ISZERO PUSH2 0x937 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x963 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 ADD SWAP1 DUP2 LT PUSH2 0x993 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH1 0x4 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 DUP6 SWAP1 DUP2 LT PUSH2 0x9C6 JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x4 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 PUSH2 0xA45 SWAP1 DUP3 PUSH2 0x2C19 JUMP JUMPDEST POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0x3 DUP3 ADD SLOAD DUP6 MLOAD PUSH1 0xFF SWAP1 SWAP2 AND SWAP6 DUP2 ADD DUP7 SWAP1 MSTORE PUSH1 0xA0 DUP1 DUP3 MSTORE DUP4 DUP7 ADD DUP1 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP9 DUP3 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD AND DUP8 SWAP1 DIV SWAP2 DUP4 ADD DUP3 SWAP1 MSTORE SWAP4 SWAP10 POP SWAP2 SWAP1 SWAP7 AND SWAP6 PUSH32 0x32C54F1E2EA75844DED7517E7DBCD3895DA7CD0C28F9AB9F9CF6ECF5F83762C6 SWAP6 SWAP3 SWAP5 DUP10 ADD SWAP4 PUSH1 0x4 DUP11 ADD SWAP3 PUSH1 0x5 DUP12 ADD SWAP3 SWAP2 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 PUSH1 0x80 DUP5 ADD SWAP1 PUSH1 0xC0 DUP6 ADD SWAP1 DUP12 SWAP1 DUP1 ISZERO PUSH2 0xB65 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xB3A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xB65 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xB48 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP11 SWAP1 DUP1 ISZERO PUSH2 0xBF7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xBCC JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xBF7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xBDA JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP9 SWAP1 DUP1 ISZERO PUSH2 0xC89 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xC5E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xC89 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xC6C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 SLOAD PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP5 AND ISZERO MUL ADD SWAP1 SWAP2 AND DIV DUP1 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 DUP8 SWAP1 DUP1 ISZERO PUSH2 0xD1B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xCF0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xD1B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xCFE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP3 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xD91 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD6F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xD91 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD7D JUMPI JUMPDEST POP POP SWAP2 POP POP SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE PUSH1 0x3 DUP3 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0xE28 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xE06 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0xE28 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xE14 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 SWAP3 DUP2 SWAP1 SUB DUP4 ADD SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 SWAP1 DUP2 AND SWAP1 SWAP2 SSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 SWAP4 DUP5 SWAP1 MSTORE SWAP2 DUP3 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 AND DUP2 SSTORE SWAP2 PUSH2 0xE9F SWAP1 DUP4 ADD DUP3 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEAD PUSH1 0x2 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP1 SSTORE PUSH2 0xEE5 PUSH1 0x4 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST PUSH2 0xEF3 PUSH1 0x5 DUP4 ADD PUSH1 0x0 PUSH2 0x2C42 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0xF4D JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xF10 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x102B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1060 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0xC3168FDC13112E44A031057DBF6C609B33353ADDB4D8037D24543E22CBFE2ACD SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x114C JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1121 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x114C JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x112F JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1180 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1168 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11AD JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x5 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH2 0x11EA PUSH2 0x2D04 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP9 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD PUSH1 0xC0 DUP2 ADD DUP6 MSTORE DUP2 SLOAD SWAP1 SWAP6 AND DUP6 MSTORE DUP1 DUP4 ADD DUP1 SLOAD DUP6 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP7 DUP4 AND ISZERO SWAP7 SWAP1 SWAP7 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE SWAP1 SWAP4 DUP6 DUP4 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x12CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x12A0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x12CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x12AE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x2 DUP3 DUP2 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1 DUP5 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP4 AND SWAP5 SWAP1 SWAP5 DIV PUSH1 0x1F DUP2 ADD DUP4 SWAP1 DIV DUP4 MUL DUP6 ADD DUP4 ADD SWAP1 SWAP2 MSTORE DUP1 DUP5 MSTORE SWAP4 DUP2 ADD SWAP4 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x137B JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1350 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x137B JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x135E JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x3 DUP3 ADD SLOAD PUSH1 0xFF AND PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x1 DUP7 AND ISZERO PUSH2 0x100 MUL ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD DUP3 MSTORE DUP3 DUP2 MSTORE SWAP5 ADD SWAP4 SWAP3 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x143A JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x140F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x143A JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x141D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 DUP4 MSTORE POP POP PUSH1 0x5 DUP3 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP4 DUP3 ADD SWAP4 SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x14EC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x14C1 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x14EC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x14CF JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP SWAP2 SWAP1 SWAP3 MSTORE POP POP DUP2 MLOAD PUSH1 0x20 DUP4 ADD MLOAD PUSH1 0x40 DUP5 ADD MLOAD PUSH1 0x60 DUP6 ADD MLOAD PUSH1 0x80 DUP7 ADD MLOAD PUSH1 0xA0 SWAP1 SWAP7 ADD MLOAD SWAP4 SWAP15 SWAP3 SWAP14 POP SWAP1 SWAP12 POP SWAP10 POP SWAP3 SWAP8 POP SWAP6 POP SWAP1 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1568 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP8 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP8 SWAP2 AND ISZERO PUSH2 0x159C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO ISZERO PUSH2 0x15BF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP6 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1628 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15EB JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1699 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1702 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x16C5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1773 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP13 DUP2 AND DUP1 DUP4 MSTORE PUSH1 0x20 DUP1 DUP5 ADD DUP15 DUP2 MSTORE DUP5 DUP7 ADD DUP15 SWAP1 MSTORE PUSH1 0xFF DUP14 AND PUSH1 0x60 DUP7 ADD MSTORE PUSH1 0x80 DUP6 ADD DUP13 SWAP1 MSTORE PUSH1 0xA0 DUP6 ADD DUP12 SWAP1 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x1 DUP1 DUP4 MSTORE SWAP6 SWAP1 SWAP3 KECCAK256 DUP5 MLOAD DUP2 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP5 AND SWAP4 SWAP1 SWAP4 OR DUP4 SSTORE SWAP1 MLOAD DUP1 MLOAD SWAP4 SWAP5 SWAP3 SWAP4 PUSH2 0x1812 SWAP4 DUP6 ADD SWAP3 SWAP2 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x40 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x182E SWAP2 PUSH1 0x2 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0x60 DUP3 ADD MLOAD PUSH1 0x3 DUP3 ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND PUSH1 0xFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x80 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x1882 SWAP2 PUSH1 0x4 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP PUSH1 0xA0 DUP3 ADD MLOAD DUP1 MLOAD PUSH2 0x189E SWAP2 PUSH1 0x5 DUP5 ADD SWAP2 PUSH1 0x20 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST POP POP PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP3 SSTORE PUSH1 0x0 SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x8A35ACFBC15FF81A39AE7D344FD709F28E8600B4AA8C65C6B64BFE7FE36BD19B ADD DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP14 AND OR SWAP1 SSTORE POP PUSH1 0x40 MLOAD DUP9 MLOAD DUP12 SWAP2 PUSH1 0x2 SWAP2 DUP12 SWAP2 SWAP1 DUP2 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1966 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1929 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD DUP5 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP7 SWAP1 SWAP7 AND SWAP6 SWAP1 SWAP6 OR SWAP1 SWAP5 SSTORE POP POP DUP11 MLOAD DUP13 SWAP3 PUSH1 0x3 SWAP3 DUP14 SWAP3 SWAP1 SWAP2 DUP3 SWAP2 SWAP1 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1A47 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1A0A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 DUP1 MLOAD SWAP5 DUP6 SWAP1 SUB DUP3 ADD DUP6 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP8 DUP9 AND OR SWAP1 SSTORE PUSH1 0xFF DUP14 AND SWAP1 DUP6 ADD MSTORE PUSH1 0xA0 DUP1 DUP6 MSTORE DUP15 MLOAD SWAP1 DUP6 ADD MSTORE DUP14 MLOAD SWAP5 DUP16 AND SWAP5 PUSH32 0xD8D928B0B50CA11D9DC273236B46F3526515B03602F71F3A6AF4F45BD9FA9144 SWAP5 DUP16 SWAP5 POP DUP15 SWAP4 POP DUP14 SWAP3 DUP14 SWAP3 DUP14 SWAP3 SWAP2 DUP3 SWAP2 DUP3 DUP3 ADD SWAP2 PUSH1 0x60 DUP5 ADD SWAP2 PUSH1 0x80 DUP6 ADD SWAP2 PUSH1 0xC0 DUP7 ADD SWAP2 SWAP1 DUP13 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1B4F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B37 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1B7C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP5 MSTORE DUP10 MLOAD DUP2 MSTORE DUP10 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP12 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1BAF JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1B97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1BDC JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP4 MSTORE DUP8 MLOAD DUP2 MSTORE DUP8 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP10 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1BF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP6 DUP2 SUB DUP3 MSTORE DUP7 MLOAD DUP2 MSTORE DUP7 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP9 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1C6F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C57 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1C9C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x1CE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x1D16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x3 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x1D7F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1D42 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x1DF0 SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE DUP2 DUP5 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x4A6DBFC867B179991DEC22FF19960F0A94D8D9D891FC556F547764670340E8AE SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x1EDB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1EB0 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x1EDB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1EBE JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1F0F JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1EF7 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1F3C JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x3 DUP4 PUSH1 0x1 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x1FAC JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x1F8A JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x1FAC JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x1F98 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x3 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2036 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x1FF9 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x1 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP1 SLOAD DUP2 DUP5 ADD DUP1 SLOAD DUP7 MLOAD PUSH1 0x2 PUSH2 0x100 SWAP8 DUP4 AND ISZERO SWAP8 SWAP1 SWAP8 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP2 AND SWAP6 SWAP1 SWAP6 DIV PUSH1 0x1F DUP2 ADD DUP6 SWAP1 DIV DUP6 MUL DUP7 ADD DUP6 ADD SWAP1 SWAP7 MSTORE DUP6 DUP6 MSTORE PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP5 SWAP2 SWAP4 SWAP3 SWAP1 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x21AD JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2182 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x21AD JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2190 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP PUSH1 0x2 DUP1 DUP6 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH2 0x100 PUSH1 0x1 DUP8 AND ISZERO MUL ADD SWAP1 SWAP5 AND SWAP6 SWAP1 SWAP6 DIV SWAP3 DUP4 ADD DUP6 SWAP1 DIV DUP6 MUL DUP2 ADD DUP6 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 SWAP6 SWAP5 POP SWAP1 SWAP3 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x225D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2232 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x225D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2240 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x3 DUP4 ADD SLOAD PUSH1 0x4 DUP5 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH2 0x100 PUSH1 0x1 DUP7 AND ISZERO MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP7 PUSH1 0xFF SWAP1 SWAP5 AND SWAP6 SWAP4 SWAP5 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x2316 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x22EB JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2316 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x22F9 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP PUSH1 0x5 DUP4 ADD DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP5 SWAP6 SWAP5 SWAP4 POP SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x23C4 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2399 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x23C4 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x23A7 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP DUP7 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD DUP3 SWAP1 DUP2 LT PUSH2 0x23DC JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 SWAP1 SWAP2 KECCAK256 ADD SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x3 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 POP PUSH2 0x24CE SWAP2 POP DUP3 SWAP1 POP PUSH2 0x11D8 JUMP JUMPDEST SWAP5 SWAP14 SWAP4 SWAP13 POP SWAP2 SWAP11 POP SWAP9 POP SWAP7 POP SWAP1 SWAP5 POP SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD DUP1 ISZERO PUSH2 0x2548 JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x251D JUMPI JUMPDEST POP POP POP POP POP SWAP1 POP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2578 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x25AD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x4 DUP3 ADD DUP1 SLOAD PUSH1 0x2 SWAP6 DUP2 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD AND SWAP5 SWAP1 SWAP5 DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP7 POP PUSH32 0x5B19F79AC4E8CFA820815502E11615F1A449E28155DC289EC5CAC1A11F908694 SWAP4 DUP9 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2699 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x266E JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2699 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x267C JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x26CD JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x26B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x26FA JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP3 MLOAD PUSH2 0x11D1 SWAP1 PUSH1 0x4 DUP5 ADD SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x60 DUP1 PUSH1 0x0 PUSH1 0x2 DUP9 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x20 DUP4 LT PUSH2 0x245F JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2422 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x279E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP5 SWAP2 AND ISZERO ISZERO PUSH2 0x27D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x2 DUP3 PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x283C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x27FF JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB ADD SWAP1 SWAP3 KECCAK256 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP3 SWAP1 SWAP3 EQ SWAP2 POP PUSH2 0x28AD SWAP1 POP JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 SWAP3 DUP4 SWAP1 KECCAK256 DUP4 MLOAD DUP5 DUP2 MSTORE PUSH1 0x2 DUP1 DUP4 ADD DUP1 SLOAD SWAP6 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP6 AND DIV SWAP5 DUP2 ADD DUP6 SWAP1 MSTORE SWAP1 SWAP8 POP PUSH32 0x53D878A6530E56C9BC96548FA0A8CAE4F1D1F49C86B0E934C086B992EBB6998F SWAP4 DUP10 SWAP3 DUP3 SWAP2 SWAP1 DUP3 ADD SWAP1 PUSH1 0x60 DUP4 ADD SWAP1 DUP7 SWAP1 DUP1 ISZERO PUSH2 0x2997 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x296C JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x2997 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x297A JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x29CB JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x29B3 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x29F8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 DUP4 PUSH1 0x2 ADD PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x2A68 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x2A46 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x2A68 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x2A54 JUMPI JUMPDEST POP POP SWAP3 DUP4 MSTORE POP POP PUSH1 0x40 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 SWAP1 DUP2 ADD DUP3 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND SWAP1 SSTORE DUP6 MLOAD DUP8 SWAP3 PUSH1 0x2 SWAP3 DUP9 SWAP3 DUP3 SWAP2 DUP5 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x2AF2 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x2AB5 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE SWAP3 ADD SWAP5 DUP6 MSTORE POP PUSH1 0x40 MLOAD SWAP4 DUP5 SWAP1 SUB DUP2 ADD SWAP1 SWAP4 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP6 SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP4 SSTORE POP DUP6 MLOAD PUSH2 0xEF3 SWAP3 POP PUSH1 0x2 DUP7 ADD SWAP2 DUP8 ADD SWAP1 PUSH2 0x2C86 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x2BB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x2C16 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST DUP2 SLOAD DUP2 DUP4 SSTORE DUP2 DUP2 GT ISZERO PUSH2 0x2C3D JUMPI PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 PUSH2 0x2C3D SWAP2 DUP2 ADD SWAP1 DUP4 ADD PUSH2 0x2D54 JUMP JUMPDEST POP POP POP JUMP JUMPDEST POP DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV PUSH1 0x0 DUP3 SSTORE DUP1 PUSH1 0x1F LT PUSH2 0x2C68 JUMPI POP PUSH2 0x2C16 JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP1 PUSH2 0x2C16 SWAP2 SWAP1 PUSH2 0x2D54 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x2CC7 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x2CF4 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x2CF4 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x2CF4 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x2CD9 JUMP JUMPDEST POP PUSH2 0x2D00 SWAP3 SWAP2 POP PUSH2 0x2D54 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC0 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x60 DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH2 0x2550 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x2D00 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x2D5A JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 LOG2 0xb0 ISZERO 0xe1 0xc6 0xa9 PUSH25 0x406B24E8687202CED017FE0B041C7B9B9D741EB9BCB14A014E STOP 0x29 ",
+ "sourceMap": "886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3940:650;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3940:650:1;;;;;;;;;;;7067:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7067:114:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7067:114:1;;-1:-1:-1;7067:114:1;;-1:-1:-1;;;;;;;7067:114:1;;;;;;;;;;;;;;;;;;;;6781:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6781:122:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6781:122:1;;-1:-1:-1;6781:122:1;;-1:-1:-1;;;;;;;6781:122:1;6273:295;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6273:295:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6273:295:1;;-1:-1:-1;6273:295:1;;-1:-1:-1;;;;;;;6273:295:1;7345:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7345:550:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7345:550:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;223:20:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;223:20:0;;;;2960:852:1;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;;;;;;;;;-1:-1:-1;;2960:852:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2960:852:1;;;;-1:-1:-1;2960:852:1;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;;;;;;;-1:-1:-1;2960:852:1;;-1:-1:-1;2960:852:1;;-1:-1:-1;;;;;;;2960:852:1;4738:370;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4738:370:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4738:370:1;;-1:-1:-1;4738:370:1;;-1:-1:-1;;;;;;;4738:370:1;1656:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1656:48:1;;;;;;;1803:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1803:31:1;;;;;8052:392;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8052:392:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8052:392:1;;-1:-1:-1;8052:392:1;;-1:-1:-1;;;;;;;8052:392:1;9117:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9117:131:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9117:131:1;;;;;;;;;;;;;;;;;5820:288;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5820:288:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5820:288:1;;-1:-1:-1;5820:288:1;;-1:-1:-1;;;;;;;5820:288:1;8607:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8607:400:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8607:400:1;;-1:-1:-1;8607:400:1;;-1:-1:-1;;;;;;;8607:400:1;5262:396;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5262:396:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5262:396:1;;-1:-1:-1;5262:396:1;;-1:-1:-1;;;;;;;5262:396:1;396:140:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;396:140:0;;;;;;;3940:650:1;4230:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;4043:6;;2070:20;:34;;2062:43;;;;;;4099:6;4073:32;;:14;4088:6;4073:22;;;;;;;;;;;;;;;;;;;;;;:32;4065:41;;;;;;4142:14;4157:21;;:25;;;;4142:41;;;;;;;;;;;;;;;;4117:14;:22;;4142:41;;;;;4132:6;;4117:22;;;;;;;;;;;;;;;:66;;;;;;;;;;;;;;;4193:14;:26;;;;;;;;;:::i;:::-;-1:-1:-1;4260:14:1;;;;;;;;:6;:14;;;;;;;;;4312:11;;4387:14;;;;4284:184;;4387:14;;;;4284:184;;;;;;;;;;4337:10;;;4284:184;;4361:12;4284:184;;;;;4312:11;4284:184;;;;;;;;;;;;;;;4260:14;;-1:-1:-1;4312:11:1;;;;;4284:184;;4337:10;;4361:12;;;4415:14;;;;4443:15;;;;4284:184;;;;;;;;;;;;;;;;;;;4337:10;;4284:184;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4284:184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4485:13;4499:5;:12;;4485:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:34;;;;;;;;;;;4529:11;4541:5;:10;;4529:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4529:23:1;;;-1:-1:-1;;4529:23:1;;;;;;;;;;;;4522:30;;;;;;;;;;4569:14;;-1:-1:-1;4569:14:1;;;-1:-1:-1;4569:14:1;;;;;;;4562:21;;;;;;;4569:14;4562:21;;;;-1:-1:-1;4562:21:1;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;382:1:0;3940:650:1;;;:::o;7067:114::-;7130:7;7156:11;7168:5;7156:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;7156:18:1;;;;;-1:-1:-1;7156:18:1;;;;;;;;;;;;;;7067:114;-1:-1:-1;;;;7067:114:1:o;6781:122::-;6848:7;6874:13;6888:7;6874:22;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;6273:295:1;6409:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;6387:6;;2070:20;:34;;2062:43;;;;;;6439:14;;;;;;;:6;:14;;;;;;;;;6463:60;;;;;6495:15;;;6463:60;;;;;;;;;;;;;;;;;;;;;;6439:14;;-1:-1:-1;6463:60:1;;6512:10;;6463:60;;;;;;;;;;6495:15;;6463:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6463:60:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6463:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6533:28;;;;:15;;;;:28;;;;;:::i;:::-;;382:1:0;6273:295:1;;;:::o;7345:550::-;7449:7;7486:6;7515;7546:5;7579;7612;7658:26;;:::i;:::-;7687:14;;;;;;;;:6;:14;;;;;;;;;7658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7687:14;;7658:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;-1:-1:-1;;7658:43:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7658:43:1;;;;-1:-1:-1;;7732:11:1;;7757:10;;;;7781:12;;;;7807:14;;;;7835;;;;7863:15;;;;;7732:11;;7757:10;;-1:-1:-1;7781:12:1;;-1:-1:-1;7807:14:1;-1:-1:-1;7835:14:1;;-1:-1:-1;7863:15:1;-1:-1:-1;7345:550:1;;-1:-1:-1;;;;7345:550:1:o;223:20:0:-;;;;;;:::o;2960:852:1:-;366:5:0;;;;352:10;:19;344:28;;;;;;2190:34:1;:14;;;2222:1;2190:14;;;:6;:14;;;;;:20;3184:6;;2190:20;:34;2182:43;;;;;;3215:6;2547:22;;;;;2539:31;;;;;;3250:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2426:22:1;;;;;-1:-1:-1;2426:22:1;;;;;;;;;;;;;:36;;;;;-1:-1:-1;2418:45:1;;-1:-1:-1;2418:45:1;;;;;3284:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2307:18:1;;;;;-1:-1:-1;2307:18:1;;;;;;;;;;;;;:32;;;;;-1:-1:-1;2299:41:1;;-1:-1:-1;2299:41:1;;;;;3322:207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3305:14:1;;;:6;:14;;;;;;;:224;;;;;;;;;;;;;;;;;;3322:207;;3305:14;;:224;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;3305:224:1;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;3539:14:1;27:10:-1;;39:1;23:18;;45:23;;-1:-1;3539:27:1;;;;;;;;;;;;;;;;-1:-1:-1;3576:22:1;;;;3539:27;;3576:13;;:22;;;;;3539:27;3576:22;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3576:22:1;;;;;-1:-1:-1;3576:22:1;;;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;;3617:18:1;;3638:6;;3617:11;;:18;;3576:22;;;;3617:18;;;;;3576:22;3617:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;3617:18:1;;;;;-1:-1:-1;3617:18:1;;;;;;;;;;;:27;;;;;;;;;;;3654:151;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3718:7:1;;-1:-1:-1;3654:151:1;;3762:9;;3785:10;;3617:18;;;3654:151;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3654:151:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3654:151:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:1;2580;2235;382::0;2960:852:1;;;;;;:::o;4738:370::-;4897:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;4843:6;;2070:20;:34;;2062:43;;;;;;4876:5;2337:1;2307:32;;:11;2319:5;2307:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2307:18:1;;;;;-1:-1:-1;2307:18:1;;;;;;;;;;;;;:32;;;;;-1:-1:-1;2299:41:1;;-1:-1:-1;2299:41:1;;;;;4927:14;;;;;;;:6;:14;;;;;;;;;4951:45;;;;;4978:10;;;4951:45;;;;;;;;;;;;;;;;;;;;;;4927:14;;-1:-1:-1;4951:45:1;;4990:5;;4951:45;;;;;;;;;;4978:10;;4951:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4951:45:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4951:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5013:11;5025:5;:10;;5013:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5013:23:1;;;-1:-1:-1;;5013:23:1;;;;;;;;;;;;5006:30;;;;;;5046:18;;5067:6;;5046:11;;5058:5;;5013:23;;5046:18;;;;5013:23;5046:18;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5046:18:1;;;;;-1:-1:-1;5046:18:1;;;;;;;;;;;:27;;;;;;;;;;;;;;;;-1:-1:-1;5083:18:1;;;;-1:-1:-1;;5083:10:1;;;:18;;;;:::i;1656:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1656:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1803:31::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1803:31:1;:::o;8052:392::-;8152:7;8189:6;8218;8249:5;8282;8315;8361:14;8378:11;8390:5;8378:18;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;8378:18:1;;;;;-1:-1:-1;8378:18:1;;;;;;;;;;;;;;-1:-1:-1;8413:24:1;;-1:-1:-1;8378:18:1;;-1:-1:-1;8413:16:1;:24::i;:::-;8406:31;;;;-1:-1:-1;8406:31:1;;-1:-1:-1;8406:31:1;-1:-1:-1;8406:31:1;-1:-1:-1;8406:31:1;;-1:-1:-1;8052:392:1;-1:-1:-1;;;8052:392:1:o;9117:131::-;9195:9;9227:14;9220:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9117:131;;:::o;5820:288::-;5954:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;5932:6;;2070:20;:34;;2062:43;;;;;;5984:14;;;;;;;:6;:14;;;;;;;;;6008:57;;;;;6039:14;;;6008:57;;;;;;;;;;;;;;;;;;;;;;5984:14;;-1:-1:-1;6008:57:1;;6055:9;;6008:57;;;;;;;;;;6039:14;;6008:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6008:57:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6008:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6075:26;;;;:14;;;;:26;;;;;:::i;8607:400::-;8711:7;8748:6;8777;8808:5;8841;8874;8920:14;8937:13;8951:7;8937:22;;;;;;;;;;;;;66:2:-1;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;5262:396:1;5429:27;366:5:0;;;;352:10;:19;344:28;;;;;;2070:34:1;:14;;;2102:1;2070:14;;;:6;:14;;;;;:20;5371:6;;2070:20;:34;;2062:43;;;;;;5406:7;2460:1;2426:36;;:13;2440:7;2426:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;2426:22:1;;;;;-1:-1:-1;2426:22:1;;;;;;;;;;;;;:36;;;;;-1:-1:-1;2418:45:1;;-1:-1:-1;2418:45:1;;;;;5459:14;;;;;;;:6;:14;;;;;;;;;5483:51;;;;;5512:12;;;;5483:51;;;;;;;;;;;;;;;;;;;;5459:14;;-1:-1:-1;5483:51:1;;5526:7;;5483:51;;;;;;;;;;5512:12;;5483:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5483:51:1;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5483:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5551:13;5565:5;:12;;5551:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5551:27:1;;;-1:-1:-1;;5551:27:1;;;;;;;;;;;;5544:34;;;;;;5588:22;;5613:6;;5588:13;;5602:7;;5551:27;;5588:22;;;;5551:27;5588:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;246:30;;311:9;;295:26;;;340:21;;377:20;365:33;;5588:22:1;;;;;-1:-1:-1;5588:22:1;;;;;;;;;;;:31;;;;;;;;;;;;;;;;-1:-1:-1;5629:22:1;;;;-1:-1:-1;5629:12:1;;;;:22;;;;:::i;396:140:0:-;366:5;;;;352:10;:19;344:28;;;;;;465:22;;;;461:69;;503:5;:16;;;;;;;;;;461:69;396:140;:::o;886:8364:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;886:8364:1;;;-1:-1:-1;886:8364:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;"
+ }
+ }
+ },
+ "sources": {
+ "1.0.0/Ownable/Ownable_v1.sol": {
+ "id": 0
+ },
+ "1.0.0/TokenRegistry/TokenRegistry.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "1.0.0/Ownable/Ownable_v1.sol": "pragma solidity ^0.4.11;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract Ownable_v1 {\n address public owner;\n\n function Ownable_v1() {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n function transferOwnership(address newOwner) onlyOwner {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "1.0.0/TokenRegistry/TokenRegistry.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 solidity ^0.4.11;\n\nimport { Ownable_v1 as Ownable } from \"../Ownable/Ownable_v1.sol\";\n\n/// @title Token Registry - Stores metadata associated with ERC20 tokens. See ERC22 https://github.com/ethereum/EIPs/issues/22\n/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>\ncontract TokenRegistry is Ownable {\n\n event LogAddToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogRemoveToken(\n address indexed token,\n string name,\n string symbol,\n uint8 decimals,\n bytes ipfsHash,\n bytes swarmHash\n );\n\n event LogTokenNameChange(address indexed token, string oldName, string newName);\n event LogTokenSymbolChange(address indexed token, string oldSymbol, string newSymbol);\n event LogTokenIpfsHashChange(address indexed token, bytes oldIpfsHash, bytes newIpfsHash);\n event LogTokenSwarmHashChange(address indexed token, bytes oldSwarmHash, bytes newSwarmHash);\n\n mapping (address => TokenMetadata) public tokens;\n mapping (string => address) tokenBySymbol;\n mapping (string => address) tokenByName;\n\n address[] public tokenAddresses;\n\n struct TokenMetadata {\n address token;\n string name;\n string symbol;\n uint8 decimals;\n bytes ipfsHash;\n bytes swarmHash;\n }\n\n modifier tokenExists(address _token) {\n require(tokens[_token].token != address(0));\n _;\n }\n\n modifier tokenDoesNotExist(address _token) {\n require(tokens[_token].token == address(0));\n _;\n }\n\n modifier nameDoesNotExist(string _name) {\n require(tokenByName[_name] == address(0));\n _;\n }\n\n modifier symbolDoesNotExist(string _symbol) {\n require(tokenBySymbol[_symbol] == address(0));\n _;\n }\n\n modifier addressNotNull(address _address) {\n require(_address != address(0));\n _;\n }\n\n\n /// @dev Allows owner to add a new token to the registry.\n /// @param _token Address of new token.\n /// @param _name Name of new token.\n /// @param _symbol Symbol for new token.\n /// @param _decimals Number of decimals, divisibility of new token.\n /// @param _ipfsHash IPFS hash of token icon.\n /// @param _swarmHash Swarm hash of token icon.\n function addToken(\n address _token,\n string _name,\n string _symbol,\n uint8 _decimals,\n bytes _ipfsHash,\n bytes _swarmHash)\n public\n onlyOwner\n tokenDoesNotExist(_token)\n addressNotNull(_token)\n symbolDoesNotExist(_symbol)\n nameDoesNotExist(_name)\n {\n tokens[_token] = TokenMetadata({\n token: _token,\n name: _name,\n symbol: _symbol,\n decimals: _decimals,\n ipfsHash: _ipfsHash,\n swarmHash: _swarmHash\n });\n tokenAddresses.push(_token);\n tokenBySymbol[_symbol] = _token;\n tokenByName[_name] = _token;\n LogAddToken(\n _token,\n _name,\n _symbol,\n _decimals,\n _ipfsHash,\n _swarmHash\n );\n }\n\n /// @dev Allows owner to remove an existing token from the registry.\n /// @param _token Address of existing token.\n function removeToken(address _token, uint _index)\n public\n onlyOwner\n tokenExists(_token)\n {\n require(tokenAddresses[_index] == _token);\n\n tokenAddresses[_index] = tokenAddresses[tokenAddresses.length - 1];\n tokenAddresses.length -= 1;\n\n TokenMetadata storage token = tokens[_token];\n LogRemoveToken(\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n delete tokenBySymbol[token.symbol];\n delete tokenByName[token.name];\n delete tokens[_token];\n }\n\n /// @dev Allows owner to modify an existing token's name.\n /// @param _token Address of existing token.\n /// @param _name New name.\n function setTokenName(address _token, string _name)\n public\n onlyOwner\n tokenExists(_token)\n nameDoesNotExist(_name)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenNameChange(_token, token.name, _name);\n delete tokenByName[token.name];\n tokenByName[_name] = _token;\n token.name = _name;\n }\n\n /// @dev Allows owner to modify an existing token's symbol.\n /// @param _token Address of existing token.\n /// @param _symbol New symbol.\n function setTokenSymbol(address _token, string _symbol)\n public\n onlyOwner\n tokenExists(_token)\n symbolDoesNotExist(_symbol)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSymbolChange(_token, token.symbol, _symbol);\n delete tokenBySymbol[token.symbol];\n tokenBySymbol[_symbol] = _token;\n token.symbol = _symbol;\n }\n\n /// @dev Allows owner to modify an existing token's IPFS hash.\n /// @param _token Address of existing token.\n /// @param _ipfsHash New IPFS hash.\n function setTokenIpfsHash(address _token, bytes _ipfsHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenIpfsHashChange(_token, token.ipfsHash, _ipfsHash);\n token.ipfsHash = _ipfsHash;\n }\n\n /// @dev Allows owner to modify an existing token's Swarm hash.\n /// @param _token Address of existing token.\n /// @param _swarmHash New Swarm hash.\n function setTokenSwarmHash(address _token, bytes _swarmHash)\n public\n onlyOwner\n tokenExists(_token)\n {\n TokenMetadata storage token = tokens[_token];\n LogTokenSwarmHashChange(_token, token.swarmHash, _swarmHash);\n token.swarmHash = _swarmHash;\n }\n\n /*\n * Web3 call functions\n */\n\n /// @dev Provides a registered token's address when given the token symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token's address.\n function getTokenAddressBySymbol(string _symbol) constant returns (address) {\n return tokenBySymbol[_symbol];\n }\n\n /// @dev Provides a registered token's address when given the token name.\n /// @param _name Name of registered token.\n /// @return Token's address.\n function getTokenAddressByName(string _name) constant returns (address) {\n return tokenByName[_name];\n }\n\n /// @dev Provides a registered token's metadata, looked up by address.\n /// @param _token Address of registered token.\n /// @return Token metadata.\n function getTokenMetaData(address _token)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n TokenMetadata memory token = tokens[_token];\n return (\n token.token,\n token.name,\n token.symbol,\n token.decimals,\n token.ipfsHash,\n token.swarmHash\n );\n }\n\n /// @dev Provides a registered token's metadata, looked up by name.\n /// @param _name Name of registered token.\n /// @return Token metadata.\n function getTokenByName(string _name)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenByName[_name];\n return getTokenMetaData(_token);\n }\n\n /// @dev Provides a registered token's metadata, looked up by symbol.\n /// @param _symbol Symbol of registered token.\n /// @return Token metadata.\n function getTokenBySymbol(string _symbol)\n public\n constant\n returns (\n address, //tokenAddress\n string, //name\n string, //symbol\n uint8, //decimals\n bytes, //ipfsHash\n bytes //swarmHash\n )\n {\n address _token = tokenBySymbol[_symbol];\n return getTokenMetaData(_token);\n }\n\n /// @dev Returns an array containing all token addresses.\n /// @return Array of token addresses.\n function getTokenAddresses()\n public\n constant\n returns (address[])\n {\n return tokenAddresses;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0x63a45b019e6836d66dc6b82f872f30b7cb9375dca2fd0b2e5975a1ceb586a40f",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/Validator.json b/packages/migrations/artifacts/2.0.0/Validator.json
new file mode 100644
index 000000000..be95af0fb
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/Validator.json
@@ -0,0 +1,95 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Validator",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "validSigner",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b50604051602080610134833981016040525160008054600160a060020a03909216600160a060020a031990921691909117905560e3806100516000396000f300608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639363470281146043575b600080fd5b348015604e57600080fd5b50607e60048035906024803573ffffffffffffffffffffffffffffffffffffffff16916044359182019101356092565b604080519115158252519081900360200190f35b505060005473ffffffffffffffffffffffffffffffffffffffff9081169116149190505600a165627a7a72305820259f430412a09c8349761ab0914a530884d942868e34128f7bba0c2ec9f618740029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x134 DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0xE3 DUP1 PUSH2 0x51 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x93634702 DUP2 EQ PUSH1 0x43 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x7E PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH1 0x92 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x25 SWAP16 NUMBER DIV SLT LOG0 SWAP13 DUP4 0x49 PUSH23 0x1AB0914A530884D942868E34128F7BBA0C2EC9F6187400 0x29 ",
+ "sourceMap": "667:992:0:-;;;969:84;8:9:-1;5:2;;;30:1;27;20:12;5:2;969:84:0;;;;;;;;;;;;;1020:12;:26;;-1:-1:-1;;;;;1020:26:0;;;-1:-1:-1;;;;;;1020:26:0;;;;;;;;;667:992;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x608060405260043610603e5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416639363470281146043575b600080fd5b348015604e57600080fd5b50607e60048035906024803573ffffffffffffffffffffffffffffffffffffffff16916044359182019101356092565b604080519115158252519081900360200190f35b505060005473ffffffffffffffffffffffffffffffffffffffff9081169116149190505600a165627a7a72305820259f430412a09c8349761ab0914a530884d942868e34128f7bba0c2ec9f618740029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH1 0x3E JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x93634702 DUP2 EQ PUSH1 0x43 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH1 0x4E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x7E PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP2 PUSH1 0x44 CALLDATALOAD SWAP2 DUP3 ADD SWAP2 ADD CALLDATALOAD PUSH1 0x92 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST POP POP PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 DUP2 AND SWAP2 AND EQ SWAP2 SWAP1 POP JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x25 SWAP16 NUMBER DIV SLT LOG0 SWAP13 DUP4 0x49 PUSH23 0x1AB0914A530884D942868E34128F7BBA0C2EC9F6187400 0x29 ",
+ "sourceMap": "667:992:0:-;;;;;;;;;;;;;;;;;;;;;;;1390:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1390:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1547:12:0;1600;;;;;1583:29;;;;1390:230;-1:-1:-1;1390:230:0:o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/examples/Validator/Validator.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/interfaces/IValidator.sol": {
+ "id": 1
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/examples/Validator/Validator.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IValidator.sol\";\n\n\ncontract Validator is \n IValidator\n{\n\n // The single valid signer for this wallet.\n // solhint-disable-next-line var-name-mixedcase\n address internal VALID_SIGNER;\n\n /// @dev constructs a new `Validator` with a single valid signer.\n /// @param validSigner The sole, valid signer.\n constructor (address validSigner) public {\n VALID_SIGNER = validSigner;\n }\n\n /// @dev Verifies that a signature is valid. `signer` must match `VALID_SIGNER`.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of signature.\n // solhint-disable no-unused-vars\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid)\n {\n return (signerAddress == VALID_SIGNER);\n }\n // solhint-enable no-unused-vars\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IValidator.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 solidity 0.4.24;\n\n\ncontract IValidator {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n"
+ },
+ "sourceTreeHashHex": "0x0c2638dd4422383a85743676a5dee23af676beaaf84b534c400a24be6594572e",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/WETH9.json b/packages/migrations/artifacts/2.0.0/WETH9.json
new file mode 100644
index 000000000..5b9e11425
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/WETH9.json
@@ -0,0 +1,336 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "WETH9",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "guy",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "src",
+ "type": "address"
+ },
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "withdraw",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "dst",
+ "type": "address"
+ },
+ {
+ "name": "wad",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [],
+ "name": "deposit",
+ "outputs": [],
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ },
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "payable": true,
+ "stateMutability": "payable",
+ "type": "fallback"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Deposit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Withdrawal",
+ "type": "event"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60c0604052600d60808190527f577261707065642045746865720000000000000000000000000000000000000060a090815261003e91600091906100a3565b506040805180820190915260048082527f57455448000000000000000000000000000000000000000000000000000000006020909201918252610083916001916100a3565b506002805460ff1916601217905534801561009d57600080fd5b5061013e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e457805160ff1916838001178555610111565b82800160010185558215610111579182015b828111156101115782518255916020019190600101906100f6565b5061011d929150610121565b5090565b61013b91905b8082111561011d5760008155600101610127565b90565b6107688061014d6000396000f3006080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100b8578063095ea7b31461014257806318160ddd1461018757806323b872dd146101ae5780632e1a7d4d146101e5578063313ce567146101fd57806370a082311461022857806395d89b4114610256578063a9059cbb1461026b578063d0e30db0146100ae578063dd62ed3e1461029c575b6100b66102d0565b005b3480156100c457600080fd5b506100cd61031f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101075781810151838201526020016100ef565b50505050905090810190601f1680156101345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014e57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff600435166024356103cb565b604080519115158252519081900360200190f35b34801561019357600080fd5b5061019c61043e565b60408051918252519081900360200190f35b3480156101ba57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610443565b3480156101f157600080fd5b506100b66004356105e3565b34801561020957600080fd5b50610212610678565b6040805160ff9092168252519081900360200190f35b34801561023457600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff60043516610681565b34801561026257600080fd5b506100cd610693565b34801561027757600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff6004351660243561070b565b3480156102a857600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff6004358116906024351661071f565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b820191906000526020600020905b8154815290600101906020018083116103a657829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b303190565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561047557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104eb575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105655773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561052d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b336000908152600360205260409020548111156105ff57600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f1935050505015801561063e573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b6000610718338484610443565b9392505050565b6004602090815260009283526040808420909152908252902054815600a165627a7a72305820228981f11f47ad9630080069b0a81423fcfba5aa8e0f478a579c4bc080ba7e820029",
+ "opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE PUSH1 0xD PUSH1 0x80 DUP2 SWAP1 MSTORE PUSH32 0x5772617070656420457468657200000000000000000000000000000000000000 PUSH1 0xA0 SWAP1 DUP2 MSTORE PUSH2 0x3E SWAP2 PUSH1 0x0 SWAP2 SWAP1 PUSH2 0xA3 JUMP JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP1 DUP3 MSTORE PUSH32 0x5745544800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 SWAP1 SWAP3 ADD SWAP2 DUP3 MSTORE PUSH2 0x83 SWAP2 PUSH1 0x1 SWAP2 PUSH2 0xA3 JUMP JUMPDEST POP PUSH1 0x2 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x12 OR SWAP1 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x9D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13E JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xE4 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x111 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x111 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x111 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xF6 JUMP JUMPDEST POP PUSH2 0x11D SWAP3 SWAP2 POP PUSH2 0x121 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x13B SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x11D JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x127 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH2 0x768 DUP1 PUSH2 0x14D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xB8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x29C JUMPI JUMPDEST PUSH2 0xB6 PUSH2 0x2D0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x31F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x107 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x134 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH2 0x43E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH1 0x4 CALLDATALOAD PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x678 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x70B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x71F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD CALLVALUE SWAP1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x4EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ ISZERO JUMPDEST ISZERO PUSH2 0x565 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 GT ISZERO PUSH2 0x5FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 SWAP1 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x63E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 DUP5 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x718 CALLER DUP5 DUP5 PUSH2 0x443 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x22 DUP10 DUP2 CALL 0x1f 0x47 0xad SWAP7 ADDRESS ADDMOD STOP PUSH10 0xB0A81423FCFBA5AA8E0F 0x47 DUP11 JUMPI SWAP13 0x4b 0xc0 DUP1 0xba PUSH31 0x82002900000000000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "753:40:0:-;732:1806;753:40;;732:1806;753:40;;;;;;;;;;-1:-1:-1;;753:40:0;;:::i;:::-;-1:-1:-1;799:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;836:27:0;;;-1:-1:-1;;836:27:0;861:2;836:27;;;732:1806;5:2:-1;;;;30:1;27;20:12;5:2;732:1806:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;732:1806:0;;;-1:-1:-1;732:1806:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100ae5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100b8578063095ea7b31461014257806318160ddd1461018757806323b872dd146101ae5780632e1a7d4d146101e5578063313ce567146101fd57806370a082311461022857806395d89b4114610256578063a9059cbb1461026b578063d0e30db0146100ae578063dd62ed3e1461029c575b6100b66102d0565b005b3480156100c457600080fd5b506100cd61031f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101075781810151838201526020016100ef565b50505050905090810190601f1680156101345780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014e57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff600435166024356103cb565b604080519115158252519081900360200190f35b34801561019357600080fd5b5061019c61043e565b60408051918252519081900360200190f35b3480156101ba57600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610443565b3480156101f157600080fd5b506100b66004356105e3565b34801561020957600080fd5b50610212610678565b6040805160ff9092168252519081900360200190f35b34801561023457600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff60043516610681565b34801561026257600080fd5b506100cd610693565b34801561027757600080fd5b5061017373ffffffffffffffffffffffffffffffffffffffff6004351660243561070b565b3480156102a857600080fd5b5061019c73ffffffffffffffffffffffffffffffffffffffff6004358116906024351661071f565b33600081815260036020908152604091829020805434908101909155825190815291517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9281900390910190a2565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b820191906000526020600020905b8154815290600101906020018083116103a657829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b303190565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081205482111561047557600080fd5b73ffffffffffffffffffffffffffffffffffffffff841633148015906104eb575073ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156105655773ffffffffffffffffffffffffffffffffffffffff8416600090815260046020908152604080832033845290915290205482111561052d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602090815260408083203384529091529020805483900390555b73ffffffffffffffffffffffffffffffffffffffff808516600081815260036020908152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060019392505050565b336000908152600360205260409020548111156105ff57600080fd5b33600081815260036020526040808220805485900390555183156108fc0291849190818181858888f1935050505015801561063e573d6000803e3d6000fd5b5060408051828152905133917f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65919081900360200190a250565b60025460ff1681565b60036020526000908152604090205481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156103c35780601f10610398576101008083540402835291602001916103c3565b6000610718338484610443565b9392505050565b6004602090815260009283526040808420909152908252902054815600a165627a7a72305820228981f11f47ad9630080069b0a81423fcfba5aa8e0f478a579c4bc080ba7e820029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xAE JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0xB8 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x142 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1AE JUMPI DUP1 PUSH4 0x2E1A7D4D EQ PUSH2 0x1E5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x256 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x26B JUMPI DUP1 PUSH4 0xD0E30DB0 EQ PUSH2 0xAE JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x29C JUMPI JUMPDEST PUSH2 0xB6 PUSH2 0x2D0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x31F JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x107 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xEF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x134 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3CB JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH2 0x43E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1BA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x443 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1F1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB6 PUSH1 0x4 CALLDATALOAD PUSH2 0x5E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x209 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x212 PUSH2 0x678 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x262 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xCD PUSH2 0x693 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x173 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x70B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19C PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x71F JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD CALLVALUE SWAP1 DUP2 ADD SWAP1 SWAP2 SSTORE DUP3 MLOAD SWAP1 DUP2 MSTORE SWAP2 MLOAD PUSH32 0xE1FFFCC4923D04B559F4D29A8BFC6CDA04EB5B0D3C460751C2402C5C5CC9109C SWAP3 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3A6 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP8 AND DUP1 DUP6 MSTORE SWAP1 DUP4 MSTORE DUP2 DUP5 KECCAK256 DUP7 SWAP1 SSTORE DUP2 MLOAD DUP7 DUP2 MSTORE SWAP2 MLOAD SWAP4 SWAP5 SWAP1 SWAP4 SWAP1 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 DUP3 SWAP1 SUB ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP3 SWAP2 POP POP JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x475 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND CALLER EQ DUP1 ISZERO SWAP1 PUSH2 0x4EB JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF EQ ISZERO JUMPDEST ISZERO PUSH2 0x565 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 SLOAD DUP3 GT ISZERO PUSH2 0x52D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 CALLER DUP5 MSTORE SWAP1 SWAP2 MSTORE SWAP1 KECCAK256 DUP1 SLOAD DUP4 SWAP1 SUB SWAP1 SSTORE JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 GT ISZERO PUSH2 0x5FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD DUP6 SWAP1 SUB SWAP1 SSTORE MLOAD DUP4 ISZERO PUSH2 0x8FC MUL SWAP2 DUP5 SWAP2 SWAP1 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x63E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP3 DUP2 MSTORE SWAP1 MLOAD CALLER SWAP2 PUSH32 0x7FCF532C15F0A6DB0BD6D0E038BEA71D30D808C7D98CB3BF7268A95BF5081B65 SWAP2 SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 LOG2 POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x3 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 DUP5 DUP7 AND ISZERO PUSH2 0x100 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3C3 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x398 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3C3 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x718 CALLER DUP5 DUP5 PUSH2 0x443 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x0 SWAP3 DUP4 MSTORE PUSH1 0x40 DUP1 DUP5 KECCAK256 SWAP1 SWAP2 MSTORE SWAP1 DUP3 MSTORE SWAP1 KECCAK256 SLOAD DUP2 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0x22 DUP10 DUP2 CALL 0x1f 0x47 0xad SWAP7 ADDRESS ADDMOD STOP PUSH10 0xB0A81423FCFBA5AA8E0F 0x47 DUP11 JUMPI SWAP13 0x4b 0xc0 DUP1 0xba PUSH31 0x82002900000000000000000000000000000000000000000000000000000000 ",
+ "sourceMap": "732:1806:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1329:9;:7;:9::i;:::-;732:1806;753:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;753:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;753:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1776:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1776:172:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1684:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1684:86:0;;;;;;;;;;;;;;;;;;;;2081:455;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2081:455:0;;;;;;;;;;;;;;1480:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1480:198:0;;;;;836:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;836:27:0;;;;;;;;;;;;;;;;;;;;;;;1150:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1150:65:0;;;;;;;799:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;799:31:0;;;;1954:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1954:121:0;;;;;;;;;1221:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1221:65:0;;;;;;;;;;;;1350:125;1404:10;1394:21;;;;:9;:21;;;;;;;;;:34;;1419:9;1394:34;;;;;;1438:30;;;;;;;;;;;;;;;;;1350:125::o;753:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1776:172::-;1858:10;1832:4;1848:21;;;:9;:21;;;;;;;;;:26;;;;;;;;;;;:32;;;1890:30;;;;;;;1832:4;;1848:26;;1858:10;;1890:30;;;;;;;;-1:-1:-1;1937:4:0;1776:172;;;;:::o;1684:86::-;1751:4;:12;1684:86;:::o;2081:455::-;2199:14;;;2171:4;2199:14;;;:9;:14;;;;;;:21;-1:-1:-1;2199:21:0;2191:30;;;;;;2236:17;;;2243:10;2236:17;;;;:59;;-1:-1:-1;2257:14:0;;;;;;;:9;:14;;;;;;;;2272:10;2257:26;;;;;;;;2292:2;2257:38;;2236:59;2232:179;;;2319:14;;;;;;;:9;:14;;;;;;;;2334:10;2319:26;;;;;;;;:33;-1:-1:-1;2319:33:0;2311:42;;;;;;2367:14;;;;;;;:9;:14;;;;;;;;2382:10;2367:26;;;;;;;:33;;;;;;;2232:179;2421:14;;;;;;;;:9;:14;;;;;;;;:21;;;;;;;2452:14;;;;;;;;;;:21;;;;;;2484:23;;;;;;;2452:14;;2484:23;;;;;;;;;;;-1:-1:-1;2525:4:0;2081:455;;;;;:::o;1480:198::-;1543:10;1533:21;;;;:9;:21;;;;;;:28;-1:-1:-1;1533:28:0;1525:37;;;;;;1582:10;1572:21;;;;:9;:21;;;;;;:28;;;;;;;1610:24;;;;;;1597:3;;1610:24;;1572:21;1610:24;1597:3;1582:10;1610:24;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;1644:27:0;;;;;;;;1655:10;;1644:27;;;;;;;;;;1480:198;:::o;836:27::-;;;;;;:::o;1150:65::-;;;;;;;;;;;;;:::o;799:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1954:121;2011:4;2034:34;2047:10;2059:3;2064;2034:12;:34::i;:::-;2027:41;1954:121;-1:-1:-1;;;1954:121:0:o;1221:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/tokens/EtherToken/WETH9.sol": {
+ "id": 0
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/tokens/EtherToken/WETH9.sol": "// Copyright (C) 2015, 2016, 2017 Dapphub\n\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n\n// You should have received a copy of the GNU General Public License\n// along with this program. If not, see <http://www.gnu.org/licenses/>.\n\n// solhint-disable\npragma solidity ^0.4.18;\n\n\ncontract WETH9 {\n string public name = \"Wrapped Ether\";\n string public symbol = \"WETH\";\n uint8 public decimals = 18;\n\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Deposit(address indexed _owner, uint _value);\n event Withdrawal(address indexed _owner, uint _value);\n\n mapping (address => uint) public balanceOf;\n mapping (address => mapping (address => uint)) public allowance;\n\n function() public payable {\n deposit();\n }\n function deposit() public payable {\n balanceOf[msg.sender] += msg.value;\n Deposit(msg.sender, msg.value);\n }\n function withdraw(uint wad) public {\n require(balanceOf[msg.sender] >= wad);\n balanceOf[msg.sender] -= wad;\n msg.sender.transfer(wad);\n Withdrawal(msg.sender, wad);\n }\n\n function totalSupply() public view returns (uint) {\n return this.balance;\n }\n\n function approve(address guy, uint wad) public returns (bool) {\n allowance[msg.sender][guy] = wad;\n Approval(msg.sender, guy, wad);\n return true;\n }\n\n function transfer(address dst, uint wad) public returns (bool) {\n return transferFrom(msg.sender, dst, wad);\n }\n\n function transferFrom(address src, address dst, uint wad)\n public\n returns (bool)\n {\n require(balanceOf[src] >= wad);\n\n if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {\n require(allowance[src][msg.sender] >= wad);\n allowance[src][msg.sender] -= wad;\n }\n\n balanceOf[src] -= wad;\n balanceOf[dst] += wad;\n\n Transfer(src, dst, wad);\n\n return true;\n }\n}\n\n\n/*\n GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n Preamble\n\n The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users. We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors. You can apply it to\nyour programs, too.\n\n When we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights. Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received. You must make sure that they, too, receive\nor can get the source code. And you must show them these terms so they\nknow their rights.\n\n Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software. For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so. This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software. The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable. Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts. If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary. To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n The precise terms and conditions for copying, distribution and\nmodification follow.\n\n TERMS AND CONDITIONS\n\n 0. Definitions.\n\n \"This License\" refers to version 3 of the GNU General Public License.\n\n \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n \"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n 1. Source Code.\n\n The \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\n A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n The Corresponding Source for a work in source code form is that\nsame work.\n\n 2. Basic Permissions.\n\n All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n Conveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n 4. Conveying Verbatim Copies.\n\n You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n 5. Conveying Modified Source Versions.\n\n You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n\n b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n\n c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n\n d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\n A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n\n b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n\n c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n\n d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n\n e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\n A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n 7. Additional Terms.\n\n \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n\n b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n\n c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n\n d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n\n e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n\n f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors.\n\n All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n 8. Termination.\n\n You may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n 9. Acceptance Not Required for Having Copies.\n\n You are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n 10. Automatic Licensing of Downstream Recipients.\n\n Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\n An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n 11. Patents.\n\n A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\n A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n 12. No Surrender of Others' Freedom.\n\n If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n 13. Use with the GNU Affero General Public License.\n\n Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n 14. Revised Versions of this License.\n\n The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time. Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n Each version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation. If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n Later license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n 15. Disclaimer of Warranty.\n\n THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n 16. Limitation of Liability.\n\n IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n 17. Interpretation of Sections 15 and 16.\n\n If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n END OF TERMS AND CONDITIONS\n\n How to Apply These Terms to Your New Programs\n\n If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n To do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n <one line to give the program's name and a brief idea of what it does.>\n Copyright (C) <year> <name of author>\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n <program> Copyright (C) <year> <name of author>\n This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n This is free software, and you are welcome to redistribute it\n under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License. Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n The GNU General Public License does not permit incorporating your program\ninto proprietary programs. If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library. If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License. But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n*/\n"
+ },
+ "sourceTreeHashHex": "0x08a4125fbc1137215308db8e8f4c0774b2adbec12342172c17216bcaa6e596c6",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x0b1ba0af832d7c05fd64161e0db78e85978e8082",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/Wallet.json b/packages/migrations/artifacts/2.0.0/Wallet.json
new file mode 100644
index 000000000..a8007e933
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/Wallet.json
@@ -0,0 +1,95 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Wallet",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "eip712Signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "walletOwner",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x608060405234801561001057600080fd5b5060405160208061040a833981016040525160008054600160a060020a03909216600160a060020a03199092169190911790556103b8806100526000396000f3006080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631626ba7e8114610045575b600080fd5b34801561005157600080fd5b5061006960048035906024803590810191013561007d565b604080519115158252519081900360200190f35b600080808080604186146100f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b868660008181106100ff57fe5b905001357f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000900493506101d3600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b9250610219602188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b60408051600080825260208083018085528d905260ff8916838501526060830188905260808301859052925193955060019360a080840194937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0830193908390039091019190865af1158015610293573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015160005473ffffffffffffffffffffffffffffffffffffffff9182169116149998505050505050505050565b60008160200183511015151561038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b500160200151905600a165627a7a72305820c457c1219764665009a8e20a7d8a023757dd403ddb68510bd5fda9064bfa18ed0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH2 0x40A DUP4 CODECOPY DUP2 ADD PUSH1 0x40 MSTORE MLOAD PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP3 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH2 0x3B8 DUP1 PUSH2 0x52 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1626BA7E DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 DUP2 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x41 DUP7 EQ PUSH2 0xF2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 DUP7 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0xFF JUMPI INVALID JUMPDEST SWAP1 POP ADD CALLDATALOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP4 POP PUSH2 0x1D3 PUSH1 0x1 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST SWAP3 POP PUSH2 0x219 PUSH1 0x21 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 DUP6 MSTORE DUP14 SWAP1 MSTORE PUSH1 0xFF DUP10 AND DUP4 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP9 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE SWAP3 MLOAD SWAP4 SWAP6 POP PUSH1 0x1 SWAP4 PUSH1 0xA0 DUP1 DUP5 ADD SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 ADD SWAP4 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x293 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x383 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc4 JUMPI 0xc1 0x21 SWAP8 PUSH5 0x665009A8E2 EXP PUSH30 0x8A023757DD403DDB68510BD5FDA9064BFA18ED0029000000000000000000 ",
+ "sourceMap": "708:1185:0:-;;;1011:84;8:9:-1;5:2;;;30:1;27;20:12;5:2;1011:84:0;;;;;;;;;;;;;1062:12;:26;;-1:-1:-1;;;;;1062:26:0;;;-1:-1:-1;;;;;;1062:26:0;;;;;;;;;708:1185;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100405763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416631626ba7e8114610045575b600080fd5b34801561005157600080fd5b5061006960048035906024803590810191013561007d565b604080519115158252519081900360200190f35b600080808080604186146100f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4c454e4754485f36355f52455155495245440000000000000000000000000000604482015290519081900360640190fd5b868660008181106100ff57fe5b905001357f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000900493506101d3600188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b9250610219602188888080601f01602080910402602001604051908101604052809392919081815260200183838082843750949594505063ffffffff6102e61692505050565b60408051600080825260208083018085528d905260ff8916838501526060830188905260808301859052925193955060019360a080840194937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0830193908390039091019190865af1158015610293573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015160005473ffffffffffffffffffffffffffffffffffffffff9182169116149998505050505050505050565b60008160200183511015151561038357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f475245415445525f4f525f455155414c5f544f5f33325f4c454e4754485f524560448201527f5155495245440000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b500160200151905600a165627a7a72305820c457c1219764665009a8e20a7d8a023757dd403ddb68510bd5fda9064bfa18ed0029",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x1626BA7E DUP2 EQ PUSH2 0x45 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x69 PUSH1 0x4 DUP1 CALLDATALOAD SWAP1 PUSH1 0x24 DUP1 CALLDATALOAD SWAP1 DUP2 ADD SWAP2 ADD CALLDATALOAD PUSH2 0x7D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 DUP1 DUP1 DUP1 PUSH1 0x41 DUP7 EQ PUSH2 0xF2 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x12 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4C454E4754485F36355F52455155495245440000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x64 ADD SWAP1 REVERT JUMPDEST DUP7 DUP7 PUSH1 0x0 DUP2 DUP2 LT PUSH2 0xFF JUMPI INVALID JUMPDEST SWAP1 POP ADD CALLDATALOAD PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 MUL PUSH31 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH32 0x100000000000000000000000000000000000000000000000000000000000000 SWAP1 DIV SWAP4 POP PUSH2 0x1D3 PUSH1 0x1 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST SWAP3 POP PUSH2 0x219 PUSH1 0x21 DUP9 DUP9 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP6 SWAP5 POP POP PUSH4 0xFFFFFFFF PUSH2 0x2E6 AND SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP1 DUP6 MSTORE DUP14 SWAP1 MSTORE PUSH1 0xFF DUP10 AND DUP4 DUP6 ADD MSTORE PUSH1 0x60 DUP4 ADD DUP9 SWAP1 MSTORE PUSH1 0x80 DUP4 ADD DUP6 SWAP1 MSTORE SWAP3 MLOAD SWAP4 SWAP6 POP PUSH1 0x1 SWAP4 PUSH1 0xA0 DUP1 DUP5 ADD SWAP5 SWAP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP4 ADD SWAP4 SWAP1 DUP4 SWAP1 SUB SWAP1 SWAP2 ADD SWAP2 SWAP1 DUP7 GAS CALL ISZERO DUP1 ISZERO PUSH2 0x293 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP PUSH1 0x40 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 ADD MLOAD PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP2 AND EQ SWAP10 SWAP9 POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x20 ADD DUP4 MLOAD LT ISZERO ISZERO ISZERO PUSH2 0x383 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x475245415445525F4F525F455155414C5F544F5F33325F4C454E4754485F5245 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x5155495245440000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE SWAP1 MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x84 ADD SWAP1 REVERT JUMPDEST POP ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 0xc4 JUMPI 0xc1 0x21 SWAP8 PUSH5 0x665009A8E2 EXP PUSH30 0x8A023757DD403DDB68510BD5FDA9064BFA18ED0029000000000000000000 ",
+ "sourceMap": "708:1185:0:-;;;;;;;;;;;;;;;;;;;;;;;1343:548;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1343:548:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1475:12;;;;;1550:2;1524:28;;1503:93;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1623:15;;1639:1;1623:18;;;;;;;;;;;;;;;;;;;1617:25;;;1607:35;;1664:30;1692:1;1664:15;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1664:27:0;;:30;-1:-1:-1;;1664:30:0;:27;:30;;-1:-1:-1;;;1664:30:0:i;:::-;1652:42;;1716:31;1744:2;1716:15;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1716:27:0;;:31;-1:-1:-1;;1716:31:0;:27;:31;;-1:-1:-1;;;1716:31:0:i;:::-;1784:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:43;;-1:-1:-1;1784:24:0;;;;;;;;-1:-1:-1;1784:24:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;1784:24:0;;;;;1828:12;;:32;;;;:12;;:32;;1343:548;-1:-1:-1;;;;;;;;;1343:548:0:o;13281:490:2:-;13402:14;13465:5;13473:2;13465:10;13453:1;:8;:22;;13432:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13718:13:2;13620:2;13718:13;13712:20;;13281:490::o"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/examples/Wallet/Wallet.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWallet.sol": {
+ "id": 1
+ },
+ "2.0.0/utils/LibBytes/LibBytes.sol": {
+ "id": 2
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/examples/Wallet/Wallet.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 solidity 0.4.24;\n\nimport \"../../protocol/Exchange/interfaces/IWallet.sol\";\nimport \"../../utils/LibBytes/LibBytes.sol\";\n\n\ncontract Wallet is \n IWallet\n{\n using LibBytes for bytes;\n\n // The owner of this wallet.\n // solhint-disable-next-line var-name-mixedcase\n address internal WALLET_OWNER;\n\n /// @dev constructs a new `Wallet` with a single owner.\n /// @param walletOwner The owner of this wallet.\n constructor (address walletOwner) public {\n WALLET_OWNER = walletOwner;\n }\n\n /// @dev Validates an EIP712 signature.\n /// The signer must match the owner of this wallet.\n /// @param hash Message hash that is signed.\n /// @param eip712Signature Proof of signing.\n /// @return Validity of signature.\n function isValidSignature(\n bytes32 hash,\n bytes eip712Signature\n )\n external\n view\n returns (bool isValid)\n {\n require(\n eip712Signature.length == 65,\n \"LENGTH_65_REQUIRED\"\n );\n\n uint8 v = uint8(eip712Signature[0]);\n bytes32 r = eip712Signature.readBytes32(1);\n bytes32 s = eip712Signature.readBytes32(33);\n address recoveredAddress = ecrecover(hash, v, r, s);\n isValid = WALLET_OWNER == recoveredAddress;\n return isValid;\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWallet.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 solidity 0.4.24;\n\n\ncontract IWallet {\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n bytes signature\n )\n external\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/utils/LibBytes/LibBytes.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 solidity 0.4.24;\n\n\nlibrary LibBytes {\n\n using LibBytes for bytes;\n\n /// @dev Gets the memory address for a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of byte array. This\n /// points to the header of the byte array which contains\n /// the length.\n function rawAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := input\n }\n return memoryAddress;\n }\n \n /// @dev Gets the memory address for the contents of a byte array.\n /// @param input Byte array to lookup.\n /// @return memoryAddress Memory address of the contents of the byte array.\n function contentAddress(bytes memory input)\n internal\n pure\n returns (uint256 memoryAddress)\n {\n assembly {\n memoryAddress := add(input, 32)\n }\n return memoryAddress;\n }\n\n /// @dev Copies `length` bytes from memory location `source` to `dest`.\n /// @param dest memory address to copy bytes to.\n /// @param source memory address to copy bytes from.\n /// @param length number of bytes to copy.\n function memCopy(\n uint256 dest,\n uint256 source,\n uint256 length\n )\n internal\n pure\n {\n if (length < 32) {\n // Handle a partial word by reading destination and masking\n // off the bits we are interested in.\n // This correctly handles overlap, zero lengths and source == dest\n assembly {\n let mask := sub(exp(256, sub(32, length)), 1)\n let s := and(mload(source), not(mask))\n let d := and(mload(dest), mask)\n mstore(dest, or(s, d))\n }\n } else {\n // Skip the O(length) loop when source == dest.\n if (source == dest) {\n return;\n }\n\n // For large copies we copy whole words at a time. The final\n // word is aligned to the end of the range (instead of after the\n // previous) to handle partial words. So a copy will look like this:\n //\n // ####\n // ####\n // ####\n // ####\n //\n // We handle overlap in the source and destination range by\n // changing the copying direction. This prevents us from\n // overwriting parts of source that we still need to copy.\n //\n // This correctly handles source == dest\n //\n if (source > dest) {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because it\n // is easier to compare with in the loop, and these\n // are also the addresses we need for copying the\n // last bytes.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the last 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the last bytes in\n // source already due to overlap.\n let last := mload(sEnd)\n\n // Copy whole words front to back\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} lt(source, sEnd) {} {\n mstore(dest, mload(source))\n source := add(source, 32)\n dest := add(dest, 32)\n }\n \n // Write the last 32 bytes\n mstore(dEnd, last)\n }\n } else {\n assembly {\n // We subtract 32 from `sEnd` and `dEnd` because those\n // are the starting points when copying a word at the end.\n length := sub(length, 32)\n let sEnd := add(source, length)\n let dEnd := add(dest, length)\n\n // Remember the first 32 bytes of source\n // This needs to be done here and not after the loop\n // because we may have overwritten the first bytes in\n // source already due to overlap.\n let first := mload(source)\n\n // Copy whole words back to front\n // We use a signed comparisson here to allow dEnd to become\n // negative (happens when source and dest < 32). Valid\n // addresses in local memory will never be larger than\n // 2**255, so they can be safely re-interpreted as signed.\n // Note: the first check is always true,\n // this could have been a do-while loop.\n // solhint-disable-next-line no-empty-blocks\n for {} slt(dest, dEnd) {} {\n mstore(dEnd, mload(sEnd))\n sEnd := sub(sEnd, 32)\n dEnd := sub(dEnd, 32)\n }\n \n // Write the first 32 bytes\n mstore(dest, first)\n }\n }\n }\n }\n\n /// @dev Returns a slices from a byte array.\n /// @param b The byte array to take a slice from.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n function slice(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure and copy contents\n result = new bytes(to - from);\n memCopy(\n result.contentAddress(),\n b.contentAddress() + from,\n result.length);\n return result;\n }\n \n /// @dev Returns a slice from a byte array without preserving the input.\n /// @param b The byte array to take a slice from. Will be destroyed in the process.\n /// @param from The starting index for the slice (inclusive).\n /// @param to The final index for the slice (exclusive).\n /// @return result The slice containing bytes at indices [from, to)\n /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.\n function sliceDestructive(\n bytes memory b,\n uint256 from,\n uint256 to\n )\n internal\n pure\n returns (bytes memory result)\n {\n require(\n from <= to,\n \"FROM_LESS_THAN_TO_REQUIRED\"\n );\n require(\n to < b.length,\n \"TO_LESS_THAN_LENGTH_REQUIRED\"\n );\n \n // Create a new bytes structure around [from, to) in-place.\n assembly {\n result := add(b, from)\n mstore(result, sub(to, from))\n }\n return result;\n }\n\n /// @dev Pops the last byte off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The byte that was popped off.\n function popLastByte(bytes memory b)\n internal\n pure\n returns (bytes1 result)\n {\n require(\n b.length > 0,\n \"GREATER_THAN_ZERO_LENGTH_REQUIRED\"\n );\n\n // Store last byte.\n result = b[b.length - 1];\n\n assembly {\n // Decrement length of byte array.\n let newLen := sub(mload(b), 1)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Pops the last 20 bytes off of a byte array by modifying its length.\n /// @param b Byte array that will be modified.\n /// @return The 20 byte address that was popped off.\n function popLast20Bytes(bytes memory b)\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= 20,\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Store last 20 bytes.\n result = readAddress(b, b.length - 20);\n\n assembly {\n // Subtract 20 from byte array length.\n let newLen := sub(mload(b), 20)\n mstore(b, newLen)\n }\n return result;\n }\n\n /// @dev Tests equality of two byte arrays.\n /// @param lhs First byte array to compare.\n /// @param rhs Second byte array to compare.\n /// @return True if arrays are the same. False otherwise.\n function equals(\n bytes memory lhs,\n bytes memory rhs\n )\n internal\n pure\n returns (bool equal)\n {\n // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.\n // We early exit on unequal lengths, but keccak would also correctly\n // handle this.\n return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);\n }\n\n /// @dev Reads an address from a position in a byte array.\n /// @param b Byte array containing an address.\n /// @param index Index in byte array of address.\n /// @return address from byte array.\n function readAddress(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (address result)\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Read address from array memory\n assembly {\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 20-byte mask to obtain address\n result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)\n }\n return result;\n }\n\n /// @dev Writes an address into a specific position in a byte array.\n /// @param b Byte array to insert address into.\n /// @param index Index in byte array of address.\n /// @param input Address to put into byte array.\n function writeAddress(\n bytes memory b,\n uint256 index,\n address input\n )\n internal\n pure\n {\n require(\n b.length >= index + 20, // 20 is length of address\n \"GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED\"\n );\n\n // Add offset to index:\n // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)\n // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)\n index += 20;\n\n // Store address into array memory\n assembly {\n // The address occupies 20 bytes and mstore stores 32 bytes.\n // First fetch the 32-byte word where we'll be storing the address, then\n // apply a mask so we have only the bytes in the word that the address will not occupy.\n // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.\n\n // 1. Add index to address of bytes array\n // 2. Load 32-byte word from memory\n // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address\n let neighbors := and(\n mload(add(b, index)),\n 0xffffffffffffffffffffffff0000000000000000000000000000000000000000\n )\n \n // Make sure input address is clean.\n // (Solidity does not guarantee this)\n input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Store the neighbors and address into memory\n mstore(add(b, index), xor(input, neighbors))\n }\n }\n\n /// @dev Reads a bytes32 value from a position in a byte array.\n /// @param b Byte array containing a bytes32 value.\n /// @param index Index in byte array of bytes32 value.\n /// @return bytes32 value from byte array.\n function readBytes32(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes32 result)\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n result := mload(add(b, index))\n }\n return result;\n }\n\n /// @dev Writes a bytes32 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes32 to put into byte array.\n function writeBytes32(\n bytes memory b,\n uint256 index,\n bytes32 input\n )\n internal\n pure\n {\n require(\n b.length >= index + 32,\n \"GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED\"\n );\n\n // Arrays are prefixed by a 256 bit length parameter\n index += 32;\n\n // Read the bytes32 from array memory\n assembly {\n mstore(add(b, index), input)\n }\n }\n\n /// @dev Reads a uint256 value from a position in a byte array.\n /// @param b Byte array containing a uint256 value.\n /// @param index Index in byte array of uint256 value.\n /// @return uint256 value from byte array.\n function readUint256(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (uint256 result)\n {\n return uint256(readBytes32(b, index));\n }\n\n /// @dev Writes a uint256 into a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input uint256 to put into byte array.\n function writeUint256(\n bytes memory b,\n uint256 index,\n uint256 input\n )\n internal\n pure\n {\n writeBytes32(b, index, bytes32(input));\n }\n\n /// @dev Reads an unpadded bytes4 value from a position in a byte array.\n /// @param b Byte array containing a bytes4 value.\n /// @param index Index in byte array of bytes4 value.\n /// @return bytes4 value from byte array.\n function readBytes4(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes4 result)\n {\n require(\n b.length >= index + 4,\n \"GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED\"\n );\n assembly {\n result := mload(add(b, 32))\n // Solidity does not require us to clean the trailing bytes.\n // We do it anyway\n result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)\n }\n return result;\n }\n\n /// @dev Reads nested bytes from a specific position.\n /// @dev NOTE: the returned value overlaps with the input value.\n /// Both should be treated as immutable.\n /// @param b Byte array containing nested bytes.\n /// @param index Index of nested bytes.\n /// @return result Nested bytes.\n function readBytesWithLength(\n bytes memory b,\n uint256 index\n )\n internal\n pure\n returns (bytes memory result)\n {\n // Read length of nested bytes\n uint256 nestedBytesLength = readUint256(b, index);\n index += 32;\n\n // Assert length of <b> is valid, given\n // length of nested bytes\n require(\n b.length >= index + nestedBytesLength,\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n \n // Return a pointer to the byte array as it exists inside `b`\n assembly {\n result := add(b, index)\n }\n return result;\n }\n\n /// @dev Inserts bytes at a specific position in a byte array.\n /// @param b Byte array to insert <input> into.\n /// @param index Index in byte array of <input>.\n /// @param input bytes to insert.\n function writeBytesWithLength(\n bytes memory b,\n uint256 index,\n bytes memory input\n )\n internal\n pure\n {\n // Assert length of <b> is valid, given\n // length of input\n require(\n b.length >= index + 32 + input.length, // 32 bytes to store length\n \"GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED\"\n );\n\n // Copy <input> into <b>\n memCopy(\n b.contentAddress() + index,\n input.rawAddress(), // includes length of <input>\n input.length + 32 // +32 bytes to store <input> length\n );\n }\n\n /// @dev Performs a deep copy of a byte array onto another byte array of greater than or equal length.\n /// @param dest Byte array that will be overwritten with source bytes.\n /// @param source Byte array to copy onto dest bytes.\n function deepCopyBytes(\n bytes memory dest,\n bytes memory source\n )\n internal\n pure\n {\n uint256 sourceLen = source.length;\n // Dest length must be >= source length, or some bytes would not be copied.\n require(\n dest.length >= sourceLen,\n \"GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED\"\n );\n memCopy(\n dest.contentAddress(),\n source.contentAddress(),\n sourceLen\n );\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xf6cbc040b363092795a47cd5041dafb604813ed924388559057aba6ec3abccd1",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/Whitelist.json b/packages/migrations/artifacts/2.0.0/Whitelist.json
new file mode 100644
index 000000000..8bf309084
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/Whitelist.json
@@ -0,0 +1,284 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "Whitelist",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": false,
+ "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": "takerAssetFillAmount",
+ "type": "uint256"
+ },
+ {
+ "name": "salt",
+ "type": "uint256"
+ },
+ {
+ "name": "orderSignature",
+ "type": "bytes"
+ }
+ ],
+ "name": "fillOrderIfWhitelisted",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "isWhitelisted",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "hash",
+ "type": "bytes32"
+ },
+ {
+ "name": "signerAddress",
+ "type": "address"
+ },
+ {
+ "name": "signature",
+ "type": "bytes"
+ }
+ ],
+ "name": "isValidSignature",
+ "outputs": [
+ {
+ "name": "isValid",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "target",
+ "type": "address"
+ },
+ {
+ "name": "isApproved",
+ "type": "bool"
+ }
+ ],
+ "name": "updateWhitelistStatus",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "newOwner",
+ "type": "address"
+ }
+ ],
+ "name": "transferOwnership",
+ "outputs": [],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "name": "_exchange",
+ "type": "address"
+ }
+ ],
+ "payable": false,
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ }
+ ],
+ "evm": {
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60806040523480156200001157600080fd5b5060405160208062000f59833981018060405262000033919081019062000185565b6000805433600160a060020a03199182161790915560028054909116600160a060020a03831617905560408051306c01000000000000000000000000026020808301919091527f060000000000000000000000000000000000000000000000000000000000000060348301528251808303601501815260359092019092528051620000c3926003920190620000cb565b5050620001ba565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200010e57805160ff19168380011785556200013e565b828001600101855582156200013e579182015b828111156200013e57825182559160200191906001019062000121565b506200014c92915062000150565b5090565b6200016d91905b808211156200014c576000815560010162000157565b90565b60006200017e8251620001ae565b9392505050565b6000602082840312156200019857600080fd5b6000620001a6848462000170565b949350505050565b600160a060020a031690565b610d8f80620001ca6000396000f3006080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820fd0440f6b6ab77af8b9eb9e31c234d6b4784a7932fefafa5f65448be7034d6406c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP1 PUSH3 0xF59 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x33 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x185 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP4 AND OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD ADDRESS PUSH13 0x1000000000000000000000000 MUL PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH32 0x600000000000000000000000000000000000000000000000000000000000000 PUSH1 0x34 DUP4 ADD MSTORE DUP3 MLOAD DUP1 DUP4 SUB PUSH1 0x15 ADD DUP2 MSTORE PUSH1 0x35 SWAP1 SWAP3 ADD SWAP1 SWAP3 MSTORE DUP1 MLOAD PUSH3 0xC3 SWAP3 PUSH1 0x3 SWAP3 ADD SWAP1 PUSH3 0xCB JUMP JUMPDEST POP POP PUSH3 0x1BA JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x10E JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x13E JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x13E JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x13E JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x121 JUMP JUMPDEST POP PUSH3 0x14C SWAP3 SWAP2 POP PUSH3 0x150 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x16D SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x14C JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x157 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x17E DUP3 MLOAD PUSH3 0x1AE JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0x198 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x1A6 DUP5 DUP5 PUSH3 0x170 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH2 0xD8F DUP1 PUSH3 0x1CA PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 REVERT DIV BLOCKHASH 0xf6 0xb6 0xab PUSH24 0xAF8B9EB9E31C234D6B4784A7932FEFAFA5F65448BE7034D6 BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
+ "sourceMap": "794:3556:0:-;;;1181:188;8:9:-1;5:2;;;30:1;27;20:12;5:2;1181:188:0;;;;;;;;;;;;;;;;;;;;;;329:5:12;:18;;337:10;-1:-1:-1;;;;;;329:18:12;;;;;;;1242:8:0;:31;;;;;-1:-1:-1;;;;;1242:31:0;;;;;1305:57;;;1330:4;1305:57;;;;;;;;;;1337:24;1305:57;;;;;;26:21:-1;;;22:32;;6:49;;1305:57:0;;;;;;;1283:79;;;;:19;;:79;;;:::i;:::-;;1181:188;794:3556;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;794:3556:0;;;-1:-1:-1;794:3556:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:263;;249:2;237:9;228:7;224:23;220:32;217:2;;;265:1;262;255:12;217:2;300:1;317:64;373:7;353:9;317:64;;;307:74;211:186;-1:-1;;;;211:186;404:128;-1:-1;;;;;473:54;;456:76;;794:3556:0;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x6080604052600436106100775763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663141da876811461007c5780633af32abf1461009e5780638da5cb5b146100d457806393634702146100f6578063c07732a314610116578063f2fde38b14610136575b600080fd5b34801561008857600080fd5b5061009c61009736600461082e565b610156565b005b3480156100aa57600080fd5b506100be6100b9366004610766565b6103ab565b6040516100cb9190610b88565b60405180910390f35b3480156100e057600080fd5b506100e96103c0565b6040516100cb9190610b74565b34801561010257600080fd5b506100be6101113660046107c6565b6103dc565b34801561012257600080fd5b5061009c61013136600461078c565b6103fd565b34801561014257600080fd5b5061009c610151366004610766565b6104a4565b33606032821461019b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bc6565b60405180910390fd5b855173ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1615156101fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610bb6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604090205460ff16151561025e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610b96565b6040517fb4be83d5000000000000000000000000000000000000000000000000000000009061029590889088908790602401610bd6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925260025491517fbfc8bfce00000000000000000000000000000000000000000000000000000000815290925073ffffffffffffffffffffffffffffffffffffffff9091169063bfc8bfce9061037190879086908690600390600401610c08565b600060405180830381600087803b15801561038b57600080fd5b505af115801561039f573d6000803e3d6000fd5b50505050505050505050565b60016020526000908152604090205460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b73ffffffffffffffffffffffffffffffffffffffff83163214949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461044e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019290610ba6565b73ffffffffffffffffffffffffffffffffffffffff81161561055257600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b50565b60006105618235610cd0565b9392505050565b60006105618235610ce9565b60006105618235610cee565b600080601f8301841361059257600080fd5b50813567ffffffffffffffff8111156105aa57600080fd5b6020830191508360018202830111156105c257600080fd5b9250929050565b6000601f820183136105da57600080fd5b81356105ed6105e882610c7a565b610c53565b9150808252602083016020830185838301111561060957600080fd5b610614838284610cf1565b50505092915050565b6000610180828403121561063057600080fd5b61063b610180610c53565b905060006106498484610555565b825250602061065a84848301610555565b602083015250604061066e84828501610555565b604083015250606061068284828501610555565b606083015250608061069684828501610574565b60808301525060a06106aa84828501610574565b60a08301525060c06106be84828501610574565b60c08301525060e06106d284828501610574565b60e0830152506101006106e784828501610574565b610100830152506101206106fd84828501610574565b6101208301525061014082013567ffffffffffffffff81111561071f57600080fd5b61072b848285016105c9565b6101408301525061016082013567ffffffffffffffff81111561074d57600080fd5b610759848285016105c9565b6101608301525092915050565b60006020828403121561077857600080fd5b60006107848484610555565b949350505050565b6000806040838503121561079f57600080fd5b60006107ab8585610555565b92505060206107bc85828601610568565b9150509250929050565b600080600080606085870312156107dc57600080fd5b60006107e88787610574565b94505060206107f987828801610555565b935050604085013567ffffffffffffffff81111561081657600080fd5b61082287828801610580565b95989497509550505050565b6000806000806080858703121561084457600080fd5b843567ffffffffffffffff81111561085b57600080fd5b6108678782880161061d565b945050602061087887828801610574565b935050604061088987828801610574565b925050606085013567ffffffffffffffff8111156108a657600080fd5b6108b2878288016105c9565b91505092959194509250565b6108c781610cd0565b82525050565b6108c781610ce9565b60006108e182610ccc565b8084526108f5816020860160208601610cfd565b6108fe81610d2d565b9093016020019392505050565b6000815460018116600081146109285760018114610964576109a0565b60028204607f1685527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821660208601526040850192506109a0565b6002820480865260208601955061097a85610cc0565b60005b828110156109995781548882015260019091019060200161097d565b8701945050505b505092915050565b601581527f54414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b601381527f4f4e4c595f434f4e54524143545f4f574e455200000000000000000000000000602082015260400190565b601581527f4d414b45525f4e4f545f57484954454c49535445440000000000000000000000602082015260400190565b600e81527f494e56414c49445f53454e444552000000000000000000000000000000000000602082015260400190565b8051600090610180840190610a7d85826108be565b506020830151610a9060208601826108be565b506040830151610aa360408601826108be565b506060830151610ab660608601826108be565b506080830151610ac96080860182610b6b565b5060a0830151610adc60a0860182610b6b565b5060c0830151610aef60c0860182610b6b565b5060e0830151610b0260e0860182610b6b565b50610100830151610b17610100860182610b6b565b50610120830151610b2c610120860182610b6b565b50610140830151848203610140860152610b4682826108d6565b915050610160830151848203610160860152610b6282826108d6565b95945050505050565b6108c781610cee565b60208101610b8282846108be565b92915050565b60208101610b8282846108cd565b60208082528101610b82816109a8565b60208082528101610b82816109d8565b60208082528101610b8281610a08565b60208082528101610b8281610a38565b60608082528101610be78186610a68565b9050610bf66020830185610b6b565b8181036040830152610b6281846108d6565b60808101610c168287610b6b565b610c2360208301866108be565b8181036040830152610c3581856108d6565b90508181036060830152610c49818461090b565b9695505050505050565b60405181810167ffffffffffffffff81118282101715610c7257600080fd5b604052919050565b600067ffffffffffffffff821115610c9157600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b60009081526020902090565b5190565b73ffffffffffffffffffffffffffffffffffffffff1690565b151590565b90565b82818337506000910152565b60005b83811015610d18578181015183820152602001610d00565b83811115610d27576000848401525b50505050565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016905600a265627a7a72305820fd0440f6b6ab77af8b9eb9e31c234d6b4784a7932fefafa5f65448be7034d6406c6578706572696d656e74616cf50037",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x77 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x141DA876 DUP2 EQ PUSH2 0x7C JUMPI DUP1 PUSH4 0x3AF32ABF EQ PUSH2 0x9E JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0xD4 JUMPI DUP1 PUSH4 0x93634702 EQ PUSH2 0xF6 JUMPI DUP1 PUSH4 0xC07732A3 EQ PUSH2 0x116 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x136 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x88 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x97 CALLDATASIZE PUSH1 0x4 PUSH2 0x82E JUMP JUMPDEST PUSH2 0x156 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0xB9 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x3AB JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE9 PUSH2 0x3C0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCB SWAP2 SWAP1 PUSH2 0xB74 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x102 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBE PUSH2 0x111 CALLDATASIZE PUSH1 0x4 PUSH2 0x7C6 JUMP JUMPDEST PUSH2 0x3DC JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x122 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x131 CALLDATASIZE PUSH1 0x4 PUSH2 0x78C JUMP JUMPDEST PUSH2 0x3FD JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x142 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x9C PUSH2 0x151 CALLDATASIZE PUSH1 0x4 PUSH2 0x766 JUMP JUMPDEST PUSH2 0x4A4 JUMP JUMPDEST CALLER PUSH1 0x60 ORIGIN DUP3 EQ PUSH2 0x19B JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBC6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP6 MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x1FD JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBB6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH2 0x25E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xB96 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH32 0xB4BE83D500000000000000000000000000000000000000000000000000000000 SWAP1 PUSH2 0x295 SWAP1 DUP9 SWAP1 DUP9 SWAP1 DUP8 SWAP1 PUSH1 0x24 ADD PUSH2 0xBD6 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 DUP2 MSTORE PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000 SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 OR SWAP1 SWAP3 MSTORE PUSH1 0x2 SLOAD SWAP2 MLOAD PUSH32 0xBFC8BFCE00000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP1 SWAP3 POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND SWAP1 PUSH4 0xBFC8BFCE SWAP1 PUSH2 0x371 SWAP1 DUP8 SWAP1 DUP7 SWAP1 DUP7 SWAP1 PUSH1 0x3 SWAP1 PUSH1 0x4 ADD PUSH2 0xC08 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x38B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x39F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND ORIGIN EQ SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x44E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP2 SWAP1 SWAP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 AND SWAP2 ISZERO ISZERO SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER EQ PUSH2 0x4F5 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x192 SWAP1 PUSH2 0xBA6 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND ISZERO PUSH2 0x552 JUMPI PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND OR SWAP1 SSTORE JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCD0 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x561 DUP3 CALLDATALOAD PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1F DUP4 ADD DUP5 SGT PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x5AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 DUP4 ADD SWAP2 POP DUP4 PUSH1 0x1 DUP3 MUL DUP4 ADD GT ISZERO PUSH2 0x5C2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH2 0x5DA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH2 0x5ED PUSH2 0x5E8 DUP3 PUSH2 0xC7A JUMP JUMPDEST PUSH2 0xC53 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH2 0x609 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x614 DUP4 DUP3 DUP5 PUSH2 0xCF1 JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x180 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x630 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x63B PUSH2 0x180 PUSH2 0xC53 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0x649 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST DUP3 MSTORE POP PUSH1 0x20 PUSH2 0x65A DUP5 DUP5 DUP4 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x20 DUP4 ADD MSTORE POP PUSH1 0x40 PUSH2 0x66E DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x40 DUP4 ADD MSTORE POP PUSH1 0x60 PUSH2 0x682 DUP5 DUP3 DUP6 ADD PUSH2 0x555 JUMP JUMPDEST PUSH1 0x60 DUP4 ADD MSTORE POP PUSH1 0x80 PUSH2 0x696 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MSTORE POP PUSH1 0xA0 PUSH2 0x6AA DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xA0 DUP4 ADD MSTORE POP PUSH1 0xC0 PUSH2 0x6BE DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xC0 DUP4 ADD MSTORE POP PUSH1 0xE0 PUSH2 0x6D2 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH1 0xE0 DUP4 ADD MSTORE POP PUSH2 0x100 PUSH2 0x6E7 DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x100 DUP4 ADD MSTORE POP PUSH2 0x120 PUSH2 0x6FD DUP5 DUP3 DUP6 ADD PUSH2 0x574 JUMP JUMPDEST PUSH2 0x120 DUP4 ADD MSTORE POP PUSH2 0x140 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x71F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x72B DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x140 DUP4 ADD MSTORE POP PUSH2 0x160 DUP3 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x74D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x759 DUP5 DUP3 DUP6 ADD PUSH2 0x5C9 JUMP JUMPDEST PUSH2 0x160 DUP4 ADD MSTORE POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x778 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x784 DUP5 DUP5 PUSH2 0x555 JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x79F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7AB DUP6 DUP6 PUSH2 0x555 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x7BC DUP6 DUP3 DUP7 ADD PUSH2 0x568 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x7DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x7E8 DUP8 DUP8 PUSH2 0x574 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x7F9 DUP8 DUP3 DUP9 ADD PUSH2 0x555 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x816 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x822 DUP8 DUP3 DUP9 ADD PUSH2 0x580 JUMP JUMPDEST SWAP6 SWAP9 SWAP5 SWAP8 POP SWAP6 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x80 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x844 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x85B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x867 DUP8 DUP3 DUP9 ADD PUSH2 0x61D JUMP JUMPDEST SWAP5 POP POP PUSH1 0x20 PUSH2 0x878 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x40 PUSH2 0x889 DUP8 DUP3 DUP9 ADD PUSH2 0x574 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x60 DUP6 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH2 0x8A6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x8B2 DUP8 DUP3 DUP9 ADD PUSH2 0x5C9 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCD0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCE9 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x8E1 DUP3 PUSH2 0xCCC JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x8F5 DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0xCFD JUMP JUMPDEST PUSH2 0x8FE DUP2 PUSH2 0xD2D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SLOAD PUSH1 0x1 DUP2 AND PUSH1 0x0 DUP2 EQ PUSH2 0x928 JUMPI PUSH1 0x1 DUP2 EQ PUSH2 0x964 JUMPI PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV PUSH1 0x7F AND DUP6 MSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00 DUP3 AND PUSH1 0x20 DUP7 ADD MSTORE PUSH1 0x40 DUP6 ADD SWAP3 POP PUSH2 0x9A0 JUMP JUMPDEST PUSH1 0x2 DUP3 DIV DUP1 DUP7 MSTORE PUSH1 0x20 DUP7 ADD SWAP6 POP PUSH2 0x97A DUP6 PUSH2 0xCC0 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP3 DUP2 LT ISZERO PUSH2 0x999 JUMPI DUP2 SLOAD DUP9 DUP3 ADD MSTORE PUSH1 0x1 SWAP1 SWAP2 ADD SWAP1 PUSH1 0x20 ADD PUSH2 0x97D JUMP JUMPDEST DUP8 ADD SWAP5 POP POP POP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x54414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x13 DUP2 MSTORE PUSH32 0x4F4E4C595F434F4E54524143545F4F574E455200000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x15 DUP2 MSTORE PUSH32 0x4D414B45525F4E4F545F57484954454C49535445440000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0xE DUP2 MSTORE PUSH32 0x494E56414C49445F53454E444552000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST DUP1 MLOAD PUSH1 0x0 SWAP1 PUSH2 0x180 DUP5 ADD SWAP1 PUSH2 0xA7D DUP6 DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x20 DUP4 ADD MLOAD PUSH2 0xA90 PUSH1 0x20 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x40 DUP4 ADD MLOAD PUSH2 0xAA3 PUSH1 0x40 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x60 DUP4 ADD MLOAD PUSH2 0xAB6 PUSH1 0x60 DUP7 ADD DUP3 PUSH2 0x8BE JUMP JUMPDEST POP PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0xAC9 PUSH1 0x80 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xA0 DUP4 ADD MLOAD PUSH2 0xADC PUSH1 0xA0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xC0 DUP4 ADD MLOAD PUSH2 0xAEF PUSH1 0xC0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH1 0xE0 DUP4 ADD MLOAD PUSH2 0xB02 PUSH1 0xE0 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x100 DUP4 ADD MLOAD PUSH2 0xB17 PUSH2 0x100 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x120 DUP4 ADD MLOAD PUSH2 0xB2C PUSH2 0x120 DUP7 ADD DUP3 PUSH2 0xB6B JUMP JUMPDEST POP PUSH2 0x140 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x140 DUP7 ADD MSTORE PUSH2 0xB46 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x160 DUP4 ADD MLOAD DUP5 DUP3 SUB PUSH2 0x160 DUP7 ADD MSTORE PUSH2 0xB62 DUP3 DUP3 PUSH2 0x8D6 JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x8C7 DUP2 PUSH2 0xCEE JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8BE JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0xB82 DUP3 DUP5 PUSH2 0x8CD JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9A8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0x9D8 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA08 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xB82 DUP2 PUSH2 0xA38 JUMP JUMPDEST PUSH1 0x60 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0xBE7 DUP2 DUP7 PUSH2 0xA68 JUMP JUMPDEST SWAP1 POP PUSH2 0xBF6 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0xB6B JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xB62 DUP2 DUP5 PUSH2 0x8D6 JUMP JUMPDEST PUSH1 0x80 DUP2 ADD PUSH2 0xC16 DUP3 DUP8 PUSH2 0xB6B JUMP JUMPDEST PUSH2 0xC23 PUSH1 0x20 DUP4 ADD DUP7 PUSH2 0x8BE JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0xC35 DUP2 DUP6 PUSH2 0x8D6 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 SUB PUSH1 0x60 DUP4 ADD MSTORE PUSH2 0xC49 DUP2 DUP5 PUSH2 0x90B JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH2 0xC72 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH2 0xC91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 SWAP1 KECCAK256 SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xD18 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0xD00 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0xD27 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 REVERT DIV BLOCKHASH 0xf6 0xb6 0xab PUSH24 0xAF8B9EB9E31C234D6B4784A7932FEFAFA5F65448BE7034D6 BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ",
+ "sourceMap": "794:3556:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3144:1204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3144:1204:0;;;;;;;;;;;882:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;882:46:0;;;;;;;;;;;;;;;;;;;;;;;;;258:20:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;258:20:12;;;;;;;;;;;;2217:278:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2217:278:0;;;;;;;;;1563:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1563:176:0;;;;;;;;;500:167:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;500:167:12;;;;;;;;;3144:1204:0;3368:10;3970:17;3553:9;3537:25;;3459:143;;;;;;;;;;;;;;;;;;;;;;3695:18;;3681:33;;;;;;:13;:33;;;;;;;;3660:101;;;;;;;;;;;;;;;;3840:27;;;;;;;:13;:27;;;;;;;;3819:95;;;;;;;;;;;;;;;;3990:154;;4026:27;;3990:154;;4067:5;;4086:20;;4120:14;;3990:154;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;3990:154:0;;;49:4:-1;25:18;;61:17;;3990:154:0;182:15:-1;3990:154:0;;;;179:29:-1;;;;160:49;;;4209:8:0;;:132;;;;;3990:154;;-1:-1:-1;4209:8:0;;;;;:27;;:132;;4250:4;;4268:12;;3990:154;;4312:19;;4209:132;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4209:132:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4209:132:0;;;;3144:1204;;;;;;:::o;882:46::-;;;;;;;;;;;;;;;:::o;258:20:12:-;;;;;;:::o;2217:278:0:-;2462:26;;;2479:9;2462:26;2217:278;;;;;;:::o;1563:176::-;426:5:12;;;;412:10;:19;391:85;;;;;;;;;;;;;;1698:21:0;;;;;;;;;:13;:21;;;;;:34;;;;;;;;;;;;;1563:176::o;500:167:12:-;426:5;;;;412:10;:19;391:85;;;;;;;;;;;;;;596:22;;;;592:69;;634:5;:16;;;;;;;;;;592:69;500:167;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;;63:55;57:66;-1:-1;;;57:66;130:112;;194:43;229:6;216:20;194:43;;249:118;;316:46;354:6;341:20;316:46;;388:335;;;495:4;483:17;;479:27;-1:-1;469:2;;520:1;517;510:12;469:2;-1:-1;540:20;;580:18;569:30;;566:2;;;612:1;609;602:12;566:2;646:4;638:6;634:17;622:29;;696:3;689;681:6;677:16;667:8;663:31;660:40;657:2;;;713:1;710;703:12;657:2;462:261;;;;;;732:432;;822:4;810:17;;806:27;-1:-1;796:2;;847:1;844;837:12;796:2;884:6;871:20;906:60;921:44;958:6;921:44;;;906:60;;;897:69;;986:6;979:5;972:21;1022:4;1014:6;1010:17;1055:4;1048:5;1044:16;1090:3;1081:6;1076:3;1072:16;1069:25;1066:2;;;1107:1;1104;1097:12;1066:2;1117:41;1151:6;1146:3;1141;1117:41;;;789:375;;;;;;;;1649:2208;;1760:5;1748:9;1743:3;1739:19;1735:31;1732:2;;;1779:1;1776;1769:12;1732:2;1797:21;1812:5;1797:21;;;1788:30;-1:-1;1876:1;1907:49;1952:3;1932:9;1907:49;;;1883:74;;-1:-1;2026:2;2059:49;2104:3;2080:22;;;2059:49;;;2052:4;2045:5;2041:16;2034:75;1978:142;2185:2;2218:49;2263:3;2254:6;2243:9;2239:22;2218:49;;;2211:4;2204:5;2200:16;2193:75;2130:149;2338:2;2371:49;2416:3;2407:6;2396:9;2392:22;2371:49;;;2364:4;2357:5;2353:16;2346:75;2289:143;2494:3;2528:49;2573:3;2564:6;2553:9;2549:22;2528:49;;;2521:4;2514:5;2510:16;2503:75;2442:147;2651:3;2685:49;2730:3;2721:6;2710:9;2706:22;2685:49;;;2678:4;2671:5;2667:16;2660:75;2599:147;2800:3;2834:49;2879:3;2870:6;2859:9;2855:22;2834:49;;;2827:4;2820:5;2816:16;2809:75;2756:139;2949:3;2983:49;3028:3;3019:6;3008:9;3004:22;2983:49;;;2976:4;2969:5;2965:16;2958:75;2905:139;3111:3;3146:49;3191:3;3182:6;3171:9;3167:22;3146:49;;;3138:5;3131;3127:17;3120:76;3054:153;3257:3;3292:49;3337:3;3328:6;3317:9;3313:22;3292:49;;;3284:5;3277;3273:17;3266:76;3217:136;3441:3;3430:9;3426:19;3413:33;3466:18;3458:6;3455:30;3452:2;;;3498:1;3495;3488:12;3452:2;3534:54;3584:3;3575:6;3564:9;3560:22;3534:54;;;3526:5;3519;3515:17;3508:81;3363:237;3688:3;3677:9;3673:19;3660:33;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3781:54;3831:3;3822:6;3811:9;3807:22;3781:54;;;3773:5;3766;3762:17;3755:81;3610:237;1726:2131;;;;;3989:241;;4093:2;4081:9;4072:7;4068:23;4064:32;4061:2;;;4109:1;4106;4099:12;4061:2;4144:1;4161:53;4206:7;4186:9;4161:53;;;4151:63;4055:175;-1:-1;;;;4055:175;4237:360;;;4355:2;4343:9;4334:7;4330:23;4326:32;4323:2;;;4371:1;4368;4361:12;4323:2;4406:1;4423:53;4468:7;4448:9;4423:53;;;4413:63;;4385:97;4513:2;4531:50;4573:7;4564:6;4553:9;4549:22;4531:50;;;4521:60;;4492:95;4317:280;;;;;;4604:615;;;;;4761:2;4749:9;4740:7;4736:23;4732:32;4729:2;;;4777:1;4774;4767:12;4729:2;4812:1;4829:53;4874:7;4854:9;4829:53;;;4819:63;;4791:97;4919:2;4937:53;4982:7;4973:6;4962:9;4958:22;4937:53;;;4927:63;;4898:98;5055:2;5044:9;5040:18;5027:32;5079:18;5071:6;5068:30;5065:2;;;5111:1;5108;5101:12;5065:2;5139:64;5195:7;5186:6;5175:9;5171:22;5139:64;;;4723:496;;;;-1:-1;5121:82;-1:-1;;;;4723:496;5226:851;;;;;5412:3;5400:9;5391:7;5387:23;5383:33;5380:2;;;5429:1;5426;5419:12;5380:2;5464:31;;5515:18;5504:30;;5501:2;;;5547:1;5544;5537:12;5501:2;5567:75;5634:7;5625:6;5614:9;5610:22;5567:75;;;5557:85;;5443:205;5679:2;5697:53;5742:7;5733:6;5722:9;5718:22;5697:53;;;5687:63;;5658:98;5787:2;5805:53;5850:7;5841:6;5830:9;5826:22;5805:53;;;5795:63;;5766:98;5923:2;5912:9;5908:18;5895:32;5947:18;5939:6;5936:30;5933:2;;;5979:1;5976;5969:12;5933:2;5999:62;6053:7;6044:6;6033:9;6029:22;5999:62;;;5989:72;;5874:193;5374:703;;;;;;;;6084:110;6157:31;6182:5;6157:31;;;6152:3;6145:44;6139:55;;;6201:101;6268:28;6290:5;6268:28;;6309:297;;6409:38;6441:5;6409:38;;;6464:6;6459:3;6452:19;6476:63;6532:6;6525:4;6520:3;6516:14;6509:4;6502:5;6498:16;6476:63;;;6571:29;6593:6;6571:29;;;6551:50;;;6564:4;6551:50;;6389:217;-1:-1;;;6389:217;6932:731;;7039:5;7033:12;7073:1;7062:9;7058:17;7086:1;7081:200;;;;7292:1;7287:370;;;;7051:606;;7081:200;7155:1;7140:17;;7159:4;7136:28;7171:19;;7235:9;7220:25;;7213:4;7204:14;;7197:49;7269:4;7260:14;;;-1:-1;7081:200;;7287:370;7356:1;7345:9;7341:17;7377:6;7372:3;7365:19;7407:4;7402:3;7398:14;7391:21;;7434:37;7465:5;7434:37;;;7487:1;7495:130;7509:6;7506:1;7503:13;7495:130;;;7568:14;;7555:11;;;7548:35;7615:1;7602:15;;;;7531:4;7524:12;7495:130;;;7639:11;;;-1:-1;;;7051:606;;7009:654;;;;;;7672:296;7827:2;7815:15;;7864:66;7859:2;7850:12;;7843:88;7959:2;7950:12;;7808:160;7977:296;8132:2;8120:15;;8169:66;8164:2;8155:12;;8148:88;8264:2;8255:12;;8113:160;8282:296;8437:2;8425:15;;8474:66;8469:2;8460:12;;8453:88;8569:2;8560:12;;8418:160;8587:296;8742:2;8730:15;;8779:66;8774:2;8765:12;;8758:88;8874:2;8865:12;;8723:160;8944:2417;9157:22;;8944:2417;;9079:5;9070:15;;;9191:61;9074:3;9157:22;9191:61;;;9100:164;9348:4;9341:5;9337:16;9331:23;9366:62;9422:4;9417:3;9413:14;9400:11;9366:62;;;9274:166;9531:4;9524:5;9520:16;9514:23;9549:62;9605:4;9600:3;9596:14;9583:11;9549:62;;;9450:173;9708:4;9701:5;9697:16;9691:23;9726:62;9782:4;9777:3;9773:14;9760:11;9726:62;;;9633:167;9888:4;9881:5;9877:16;9871:23;9906:62;9962:4;9957:3;9953:14;9940:11;9906:62;;;9810:170;10068:4;10061:5;10057:16;10051:23;10086:62;10142:4;10137:3;10133:14;10120:11;10086:62;;;9990:170;10240:4;10233:5;10229:16;10223:23;10258:62;10314:4;10309:3;10305:14;10292:11;10258:62;;;10170:162;10412:4;10405:5;10401:16;10395:23;10430:62;10486:4;10481:3;10477:14;10464:11;10430:62;;;10342:162;10597:5;10590;10586:17;10580:24;10616:63;10672:5;10667:3;10663:15;10650:11;10616:63;;;10514:177;10767:5;10760;10756:17;10750:24;10786:63;10842:5;10837:3;10833:15;10820:11;10786:63;;;10701:160;10947:5;10940;10936:17;10930:24;11000:3;10994:4;10990:14;10982:5;10977:3;10973:15;10966:39;11020:66;11081:4;11068:11;11020:66;;;11012:74;;10871:227;11184:5;11177;11173:17;11167:24;11237:3;11231:4;11227:14;11219:5;11214:3;11210:15;11203:39;11257:66;11318:4;11305:11;11257:66;;;11249:74;9052:2309;-1:-1;;;;;9052:2309;11368:110;11441:31;11466:5;11441:31;;11485:193;11593:2;11578:18;;11607:61;11582:9;11641:6;11607:61;;;11564:114;;;;;11685:181;11787:2;11772:18;;11801:55;11776:9;11829:6;11801:55;;11873:387;12054:2;12068:47;;;12039:18;;12129:121;12039:18;12129:121;;12267:387;12448:2;12462:47;;;12433:18;;12523:121;12433:18;12523:121;;12661:387;12842:2;12856:47;;;12827:18;;12917:121;12827:18;12917:121;;13055:387;13236:2;13250:47;;;13221:18;;13311:121;13221:18;13311:121;;13449:615;13675:2;13689:47;;;13660:18;;13750:92;13660:18;13828:6;13750:92;;;13742:100;;13853:62;13911:2;13900:9;13896:18;13887:6;13853:62;;;13963:9;13957:4;13953:20;13948:2;13937:9;13933:18;13926:48;13988:66;14049:4;14040:6;13988:66;;14071:659;14296:3;14281:19;;14311:61;14285:9;14345:6;14311:61;;;14383:62;14441:2;14430:9;14426:18;14417:6;14383:62;;;14493:9;14487:4;14483:20;14478:2;14467:9;14463:18;14456:48;14518:66;14579:4;14570:6;14518:66;;;14510:74;;14632:9;14626:4;14622:20;14617:2;14606:9;14602:18;14595:48;14657:63;14715:4;14706:6;14657:63;;;14649:71;14267:463;-1:-1;;;;;;14267:463;14737:256;14799:2;14793:9;14825:17;;;14900:18;14885:34;;14921:22;;;14882:62;14879:2;;;14957:1;14954;14947:12;14879:2;14973;14966:22;14777:216;;-1:-1;14777:216;15000:254;;15139:18;15131:6;15128:30;15125:2;;;15171:1;15168;15161:12;15125:2;-1:-1;15244:4;15215;15192:17;;;;15211:9;15188:33;15234:15;;15062:192;15528:125;;15594:15;;;15641:4;15628:18;;;15586:67;15662:87;15732:12;;15716:33;15854:128;15934:42;15923:54;;15906:76;15989:92;16062:13;16055:21;;16038:43;16088:79;16157:5;16140:27;16581:145;16662:6;16657:3;16652;16639:30;-1:-1;16718:1;16700:16;;16693:27;16632:94;16735:268;16800:1;16807:101;16821:6;16818:1;16815:13;16807:101;;;16888:11;;;16882:18;16869:11;;;16862:39;16843:2;16836:10;16807:101;;;16923:6;16920:1;16917:13;16914:2;;;16988:1;16979:6;16974:3;16970:16;16963:27;16914:2;16784:219;;;;;17011:97;17099:2;17079:14;17095:7;17075:28;;17059:49"
+ }
+ }
+ },
+ "sources": {
+ "2.0.0/examples/Whitelist/Whitelist.sol": {
+ "id": 0
+ },
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.sol": {
+ "id": 1
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchange.sol": {
+ "id": 2
+ },
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.sol": {
+ "id": 3
+ },
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.sol": {
+ "id": 4
+ },
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.sol": {
+ "id": 5
+ },
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.sol": {
+ "id": 6
+ },
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.sol": {
+ "id": 7
+ },
+ "2.0.0/protocol/Exchange/libs/LibEIP712.sol": {
+ "id": 8
+ },
+ "2.0.0/protocol/Exchange/libs/LibFillResults.sol": {
+ "id": 9
+ },
+ "2.0.0/protocol/Exchange/libs/LibOrder.sol": {
+ "id": 10
+ },
+ "2.0.0/utils/Ownable/IOwnable.sol": {
+ "id": 11
+ },
+ "2.0.0/utils/Ownable/Ownable.sol": {
+ "id": 12
+ },
+ "2.0.0/utils/SafeMath/SafeMath.sol": {
+ "id": 13
+ }
+ },
+ "sourceCodes": {
+ "2.0.0/examples/Whitelist/Whitelist.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../../protocol/Exchange/interfaces/IExchange.sol\";\nimport \"../../protocol/Exchange/libs/LibOrder.sol\";\nimport \"../../utils/Ownable/Ownable.sol\";\n\n\ncontract Whitelist is\n Ownable\n{\n\n // Mapping of address => whitelist status.\n mapping (address => bool) public isWhitelisted;\n\n // Exchange contract.\n // solhint-disable var-name-mixedcase\n IExchange internal EXCHANGE;\n bytes internal TX_ORIGIN_SIGNATURE;\n // solhint-enable var-name-mixedcase\n\n byte constant internal VALIDATOR_SIGNATURE_BYTE = \"\\x06\";\n\n constructor (address _exchange)\n public\n {\n EXCHANGE = IExchange(_exchange);\n TX_ORIGIN_SIGNATURE = abi.encodePacked(address(this), VALIDATOR_SIGNATURE_BYTE);\n }\n\n /// @dev Adds or removes an address from the whitelist.\n /// @param target Address to add or remove from whitelist.\n /// @param isApproved Whitelist status to assign to address.\n function updateWhitelistStatus(\n address target,\n bool isApproved\n )\n external\n onlyOwner\n {\n isWhitelisted[target] = isApproved;\n }\n\n /// @dev Verifies signer is same as signer of current Ethereum transaction.\n /// NOTE: This function can currently be used to validate signatures coming from outside of this contract.\n /// Extra safety checks can be added for a production contract.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n // solhint-disable no-unused-vars\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external\n view\n returns (bool isValid)\n {\n // solhint-disable-next-line avoid-tx-origin\n return signerAddress == tx.origin;\n }\n // solhint-enable no-unused-vars\n\n /// @dev Fills an order using `msg.sender` as the taker.\n /// The transaction will revert if both the maker and taker are not whitelisted.\n /// Orders should specify this contract as the `senderAddress` in order to gaurantee\n /// that both maker and taker have been whitelisted.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param salt Arbitrary value to gaurantee uniqueness of 0x transaction hash.\n /// @param orderSignature Proof that order has been created by maker.\n function fillOrderIfWhitelisted(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n uint256 salt,\n bytes memory orderSignature\n )\n public\n {\n address takerAddress = msg.sender;\n\n // This contract must be the entry point for the transaction.\n require(\n // solhint-disable-next-line avoid-tx-origin\n takerAddress == tx.origin,\n \"INVALID_SENDER\"\n );\n\n // Check if maker is on the whitelist.\n require(\n isWhitelisted[order.makerAddress],\n \"MAKER_NOT_WHITELISTED\"\n );\n\n // Check if taker is on the whitelist.\n require(\n isWhitelisted[takerAddress],\n \"TAKER_NOT_WHITELISTED\"\n );\n\n // Encode arguments into byte array.\n bytes memory data = abi.encodeWithSelector(\n EXCHANGE.fillOrder.selector,\n order,\n takerAssetFillAmount,\n orderSignature\n );\n\n // Call `fillOrder` via `executeTransaction`.\n EXCHANGE.executeTransaction(\n salt,\n takerAddress,\n data,\n TX_ORIGIN_SIGNATURE\n );\n }\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IAssetProxyDispatcher.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 solidity 0.4.24;\n\n\ncontract IAssetProxyDispatcher {\n\n /// @dev Registers an asset proxy to its asset proxy id.\n /// Once an asset proxy is registered, it cannot be unregistered.\n /// @param assetProxy Address of new asset proxy to register.\n function registerAssetProxy(address assetProxy)\n external;\n\n /// @dev Gets an asset proxy.\n /// @param assetProxyId Id of the asset proxy.\n /// @return The asset proxy registered to assetProxyId. Returns 0x0 if no proxy is registered.\n function getAssetProxy(bytes4 assetProxyId)\n external\n view\n returns (address);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchange.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"./IExchangeCore.sol\";\nimport \"./IMatchOrders.sol\";\nimport \"./ISignatureValidator.sol\";\nimport \"./ITransactions.sol\";\nimport \"./IAssetProxyDispatcher.sol\";\nimport \"./IWrapperFunctions.sol\";\n\n\n// solhint-disable no-empty-blocks\ncontract IExchange is\n IExchangeCore,\n IMatchOrders,\n ISignatureValidator,\n ITransactions,\n IAssetProxyDispatcher,\n IWrapperFunctions\n{}\n",
+ "2.0.0/protocol/Exchange/interfaces/IExchangeCore.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IExchangeCore {\n\n /// @dev Cancels all orders created by makerAddress with a salt less than or equal to the targetOrderEpoch\n /// and senderAddress equal to msg.sender (or null address if msg.sender == makerAddress).\n /// @param targetOrderEpoch Orders created with a salt less or equal to this value will be cancelled.\n function cancelOrdersUpTo(uint256 targetOrderEpoch)\n external;\n\n /// @dev Fills the input order.\n /// @param order Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev After calling, the order can not be filled anymore.\n /// @param order Order struct containing order specifications.\n function cancelOrder(LibOrder.Order memory order)\n public;\n\n /// @dev Gets information about an order: status, hash, and amount filled.\n /// @param order Order to gather information on.\n /// @return OrderInfo Information about the order and its state.\n /// See LibOrder.OrderInfo for a complete description.\n function getOrderInfo(LibOrder.Order memory order)\n public\n view\n returns (LibOrder.OrderInfo memory orderInfo);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IMatchOrders.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*/\npragma solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IMatchOrders {\n\n /// @dev Match two complementary orders that have a profitable spread.\n /// Each order is filled at their respective price point. However, the calculations are\n /// carried out as though the orders are both being filled at the right order's price point.\n /// The profit made by the left order goes to the taker (who matched the two orders).\n /// @param leftOrder First order to match.\n /// @param rightOrder Second order to match.\n /// @param leftSignature Proof that order was created by the left maker.\n /// @param rightSignature Proof that order was created by the right maker.\n /// @return matchedFillResults Amounts filled and fees paid by maker and taker of matched orders.\n function matchOrders(\n LibOrder.Order memory leftOrder,\n LibOrder.Order memory rightOrder,\n bytes memory leftSignature,\n bytes memory rightSignature\n )\n public\n returns (LibFillResults.MatchedFillResults memory matchedFillResults);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ISignatureValidator.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 solidity 0.4.24;\n\n\ncontract ISignatureValidator {\n\n /// @dev Approves a hash on-chain using any valid signature type.\n /// After presigning a hash, the preSign signature type will become valid for that hash and signer.\n /// @param signerAddress Address that should have signed the given hash.\n /// @param signature Proof that the hash has been signed by signer.\n function preSign(\n bytes32 hash,\n address signerAddress,\n bytes signature\n )\n external;\n \n /// @dev Approves/unnapproves a Validator contract to verify signatures on signer's behalf.\n /// @param validatorAddress Address of Validator contract.\n /// @param approval Approval or disapproval of Validator contract.\n function setSignatureValidatorApproval(\n address validatorAddress,\n bool approval\n )\n external;\n\n /// @dev Verifies that a signature is valid.\n /// @param hash Message hash that is signed.\n /// @param signerAddress Address of signer.\n /// @param signature Proof of signing.\n /// @return Validity of order signature.\n function isValidSignature(\n bytes32 hash,\n address signerAddress,\n bytes memory signature\n )\n public\n view\n returns (bool isValid);\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/ITransactions.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*/\npragma solidity 0.4.24;\n\n\ncontract ITransactions {\n\n /// @dev Executes an exchange method call in the context of signer.\n /// @param salt Arbitrary number to ensure uniqueness of transaction hash.\n /// @param signerAddress Address of transaction signer.\n /// @param data AbiV2 encoded calldata.\n /// @param signature Proof of signer transaction by signer.\n function executeTransaction(\n uint256 salt,\n address signerAddress,\n bytes data,\n bytes signature\n )\n external;\n}\n",
+ "2.0.0/protocol/Exchange/interfaces/IWrapperFunctions.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 solidity 0.4.24;\npragma experimental ABIEncoderV2;\n\nimport \"../libs/LibOrder.sol\";\nimport \"../libs/LibFillResults.sol\";\n\n\ncontract IWrapperFunctions {\n\n /// @dev Fills the input order. Reverts if exact takerAssetFillAmount not filled.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n function fillOrKillOrder(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param order LibOrder.Order struct containing order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signature Proof that order has been created by maker.\n /// @return Amounts filled and fees paid by maker and taker.\n function fillOrderNoThrow(\n LibOrder.Order memory order,\n uint256 takerAssetFillAmount,\n bytes memory signature\n )\n public\n returns (LibFillResults.FillResults memory fillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrKill.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrKillOrders(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Fills an order with specified parameters and ECDSA signature.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmounts Array of desired amounts of takerAsset to sell in orders.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function batchFillOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256[] memory takerAssetFillAmounts,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been created by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrders(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of takerAsset is sold by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param takerAssetFillAmount Desired amount of takerAsset to sell.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketSellOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 takerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple calls of fillOrder until total amount of makerAsset is bought by taker.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrders(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously executes multiple fill orders in a single transaction until total amount is bought by taker.\n /// Returns false if the transaction would otherwise revert.\n /// @param orders Array of order specifications.\n /// @param makerAssetFillAmount Desired amount of makerAsset to buy.\n /// @param signatures Proofs that orders have been signed by makers.\n /// @return Amounts filled and fees paid by makers and taker.\n function marketBuyOrdersNoThrow(\n LibOrder.Order[] memory orders,\n uint256 makerAssetFillAmount,\n bytes[] memory signatures\n )\n public\n returns (LibFillResults.FillResults memory totalFillResults);\n\n /// @dev Synchronously cancels multiple orders in a single transaction.\n /// @param orders Array of order specifications.\n function batchCancelOrders(LibOrder.Order[] memory orders)\n public;\n\n /// @dev Fetches information for all passed in orders\n /// @param orders Array of order specifications.\n /// @return Array of OrderInfo instances that correspond to each order.\n function getOrdersInfo(LibOrder.Order[] memory orders)\n public\n view\n returns (LibOrder.OrderInfo[] memory);\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibEIP712.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 solidity 0.4.24;\n\n\ncontract LibEIP712 {\n // EIP191 header for EIP712 prefix\n string constant internal EIP191_HEADER = \"\\x19\\x01\";\n\n // EIP712 Domain Name value\n string constant internal EIP712_DOMAIN_NAME = \"0x Protocol\";\n\n // EIP712 Domain Version value\n string constant internal EIP712_DOMAIN_VERSION = \"2\";\n\n // Hash of the EIP712 Domain Separator Schema\n bytes32 constant internal EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"EIP712Domain(\",\n \"string name,\",\n \"string version,\",\n \"address verifyingContract\",\n \")\"\n ));\n\n // Hash of the EIP712 Domain Separator data\n // solhint-disable-next-line var-name-mixedcase\n bytes32 public EIP712_DOMAIN_HASH;\n\n constructor ()\n public\n {\n EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(\n EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,\n keccak256(bytes(EIP712_DOMAIN_NAME)),\n keccak256(bytes(EIP712_DOMAIN_VERSION)),\n bytes32(address(this))\n ));\n }\n\n /// @dev Calculates EIP712 encoding for a hash struct in this EIP712 Domain.\n /// @param hashStruct The EIP712 hash struct.\n /// @return EIP712 hash applied to this EIP712 Domain.\n function hashEIP712Message(bytes32 hashStruct)\n internal\n view\n returns (bytes32 result)\n {\n bytes32 eip712DomainHash = EIP712_DOMAIN_HASH;\n\n // Assembly for more efficient computing:\n // keccak256(abi.encodePacked(\n // EIP191_HEADER,\n // EIP712_DOMAIN_HASH,\n // hashStruct \n // ));\n\n assembly {\n // Load free memory pointer\n let memPtr := mload(64)\n\n mstore(memPtr, 0x1901000000000000000000000000000000000000000000000000000000000000) // EIP191 header\n mstore(add(memPtr, 2), eip712DomainHash) // EIP712 domain hash\n mstore(add(memPtr, 34), hashStruct) // Hash of struct\n\n // Compute hash\n result := keccak256(memPtr, 66)\n }\n return result;\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibFillResults.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 solidity 0.4.24;\n\nimport \"../../../utils/SafeMath/SafeMath.sol\";\n\n\ncontract LibFillResults is\n SafeMath\n{\n\n struct FillResults {\n uint256 makerAssetFilledAmount; // Total amount of makerAsset(s) filled.\n uint256 takerAssetFilledAmount; // Total amount of takerAsset(s) filled.\n uint256 makerFeePaid; // Total amount of ZRX paid by maker(s) to feeRecipient(s).\n uint256 takerFeePaid; // Total amount of ZRX paid by taker to feeRecipients(s).\n }\n\n struct MatchedFillResults {\n FillResults left; // Amounts filled and fees paid of left order.\n FillResults right; // Amounts filled and fees paid of right order.\n uint256 leftMakerAssetSpreadAmount; // Spread between price of left and right order, denominated in the left order's makerAsset, paid to taker.\n }\n\n /// @dev Adds properties of both FillResults instances.\n /// Modifies the first FillResults instance specified.\n /// @param totalFillResults Fill results instance that will be added onto.\n /// @param singleFillResults Fill results instance that will be added to totalFillResults.\n function addFillResults(FillResults memory totalFillResults, FillResults memory singleFillResults)\n internal\n pure\n {\n totalFillResults.makerAssetFilledAmount = safeAdd(totalFillResults.makerAssetFilledAmount, singleFillResults.makerAssetFilledAmount);\n totalFillResults.takerAssetFilledAmount = safeAdd(totalFillResults.takerAssetFilledAmount, singleFillResults.takerAssetFilledAmount);\n totalFillResults.makerFeePaid = safeAdd(totalFillResults.makerFeePaid, singleFillResults.makerFeePaid);\n totalFillResults.takerFeePaid = safeAdd(totalFillResults.takerFeePaid, singleFillResults.takerFeePaid);\n }\n}\n",
+ "2.0.0/protocol/Exchange/libs/LibOrder.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 solidity 0.4.24;\n\nimport \"./LibEIP712.sol\";\n\n\ncontract LibOrder is\n LibEIP712\n{\n\n // Hash for the EIP712 Order Schema\n bytes32 constant internal EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked(\n \"Order(\",\n \"address makerAddress,\",\n \"address takerAddress,\",\n \"address feeRecipientAddress,\",\n \"address senderAddress,\",\n \"uint256 makerAssetAmount,\",\n \"uint256 takerAssetAmount,\",\n \"uint256 makerFee,\",\n \"uint256 takerFee,\",\n \"uint256 expirationTimeSeconds,\",\n \"uint256 salt,\",\n \"bytes makerAssetData,\",\n \"bytes takerAssetData\",\n \")\"\n ));\n\n // A valid order remains fillable until it is expired, fully filled, or cancelled.\n // An order's state is unaffected by external factors, like account balances.\n enum OrderStatus {\n INVALID, // Default value\n INVALID_MAKER_ASSET_AMOUNT, // Order does not have a valid maker asset amount\n INVALID_TAKER_ASSET_AMOUNT, // Order does not have a valid taker asset amount\n FILLABLE, // Order is fillable\n EXPIRED, // Order has already expired\n FULLY_FILLED, // Order is fully filled\n CANCELLED // Order has been cancelled\n }\n\n // solhint-disable max-line-length\n struct Order {\n address makerAddress; // Address that created the order. \n address takerAddress; // Address that is allowed to fill the order. If set to 0, any address is allowed to fill the order. \n address feeRecipientAddress; // Address that will recieve fees when order is filled. \n address senderAddress; // Address that is allowed to call Exchange contract methods that affect this order. If set to 0, any address is allowed to call these methods.\n uint256 makerAssetAmount; // Amount of makerAsset being offered by maker. Must be greater than 0. \n uint256 takerAssetAmount; // Amount of takerAsset being bid on by maker. Must be greater than 0. \n uint256 makerFee; // Amount of ZRX paid to feeRecipient by maker when order is filled. If set to 0, no transfer of ZRX from maker to feeRecipient will be attempted.\n uint256 takerFee; // Amount of ZRX paid to feeRecipient by taker when order is filled. If set to 0, no transfer of ZRX from taker to feeRecipient will be attempted.\n uint256 expirationTimeSeconds; // Timestamp in seconds at which order expires. \n uint256 salt; // Arbitrary number to facilitate uniqueness of the order's hash. \n bytes makerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring makerAsset. The last byte references the id of this proxy.\n bytes takerAssetData; // Encoded data that can be decoded by a specified proxy contract when transferring takerAsset. The last byte references the id of this proxy.\n }\n // solhint-enable max-line-length\n\n struct OrderInfo {\n uint8 orderStatus; // Status that describes order's validity and fillability.\n bytes32 orderHash; // EIP712 hash of the order (see LibOrder.getOrderHash).\n uint256 orderTakerAssetFilledAmount; // Amount of order that has already been filled.\n }\n\n /// @dev Calculates Keccak-256 hash of the order.\n /// @param order The order structure.\n /// @return Keccak-256 EIP712 hash of the order.\n function getOrderHash(Order memory order)\n internal\n view\n returns (bytes32 orderHash)\n {\n orderHash = hashEIP712Message(hashOrder(order));\n return orderHash;\n }\n\n /// @dev Calculates EIP712 hash of the order.\n /// @param order The order structure.\n /// @return EIP712 hash of the order.\n function hashOrder(Order memory order)\n internal\n pure\n returns (bytes32 result)\n {\n bytes32 schemaHash = EIP712_ORDER_SCHEMA_HASH;\n bytes32 makerAssetDataHash = keccak256(order.makerAssetData);\n bytes32 takerAssetDataHash = keccak256(order.takerAssetData);\n\n // Assembly for more efficiently computing:\n // keccak256(abi.encodePacked(\n // EIP712_ORDER_SCHEMA_HASH,\n // bytes32(order.makerAddress),\n // bytes32(order.takerAddress),\n // bytes32(order.feeRecipientAddress),\n // bytes32(order.senderAddress),\n // order.makerAssetAmount,\n // order.takerAssetAmount,\n // order.makerFee,\n // order.takerFee,\n // order.expirationTimeSeconds,\n // order.salt,\n // keccak256(order.makerAssetData),\n // keccak256(order.takerAssetData)\n // ));\n\n assembly {\n // Calculate memory addresses that will be swapped out before hashing\n let pos1 := sub(order, 32)\n let pos2 := add(order, 320)\n let pos3 := add(order, 352)\n\n // Backup\n let temp1 := mload(pos1)\n let temp2 := mload(pos2)\n let temp3 := mload(pos3)\n \n // Hash in place\n mstore(pos1, schemaHash)\n mstore(pos2, makerAssetDataHash)\n mstore(pos3, takerAssetDataHash)\n result := keccak256(pos1, 416)\n \n // Restore\n mstore(pos1, temp1)\n mstore(pos2, temp2)\n mstore(pos3, temp3)\n }\n return result;\n }\n}\n",
+ "2.0.0/utils/Ownable/IOwnable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\ncontract IOwnable {\n function transferOwnership(address newOwner)\n public;\n}\n",
+ "2.0.0/utils/Ownable/Ownable.sol": "pragma solidity 0.4.24;\n\n/*\n * Ownable\n *\n * Base contract with an owner.\n * Provides onlyOwner modifier, which prevents function from running if it is called by anyone other than the owner.\n */\n\nimport \"./IOwnable.sol\";\n\n\ncontract Ownable is IOwnable {\n address public owner;\n\n constructor ()\n public\n {\n owner = msg.sender;\n }\n\n modifier onlyOwner() {\n require(\n msg.sender == owner,\n \"ONLY_CONTRACT_OWNER\"\n );\n _;\n }\n\n function transferOwnership(address newOwner)\n public\n onlyOwner\n {\n if (newOwner != address(0)) {\n owner = newOwner;\n }\n }\n}\n",
+ "2.0.0/utils/SafeMath/SafeMath.sol": "pragma solidity 0.4.24;\n\n\ncontract SafeMath {\n function safeMul(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n if (a == 0) {\n return 0;\n }\n uint256 c = a * b;\n require(\n c / a == b,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function safeDiv(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a / b;\n return c;\n }\n\n function safeSub(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n require(\n b <= a,\n \"UINT256_UNDERFLOW\"\n );\n return a - b;\n }\n\n function safeAdd(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n uint256 c = a + b;\n require(\n c >= a,\n \"UINT256_OVERFLOW\"\n );\n return c;\n }\n\n function max64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min64(uint64 a, uint64 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n\n function max256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a >= b ? a : b;\n }\n\n function min256(uint256 a, uint256 b)\n internal\n pure\n returns (uint256)\n {\n return a < b ? a : b;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xb174bee5bc2de2b5bb1601483e6acbeb4cfa969243f9df3d970e54af754b26c9",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.24+commit.e67f0147.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {}
+} \ No newline at end of file
diff --git a/packages/migrations/artifacts/2.0.0/ZRXToken.json b/packages/migrations/artifacts/2.0.0/ZRXToken.json
new file mode 100644
index 000000000..0ce91c1c1
--- /dev/null
+++ b/packages/migrations/artifacts/2.0.0/ZRXToken.json
@@ -0,0 +1,10031 @@
+{
+ "schemaVersion": "2.0.0",
+ "contractName": "ZRXToken",
+ "compilerOutput": {
+ "abi": [
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": false,
+ "inputs": [
+ {
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "constant": true,
+ "inputs": [
+ {
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "name": "_spender",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "payable": false,
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "payable": false,
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "name": "_owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "name": "_spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "name": "_value",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ }
+ ],
+ "devdoc": {
+ "methods": {
+ "transferFrom(address,address,uint256)": {
+ "details": "ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.",
+ "params": {
+ "_from": "Address to transfer from.",
+ "_to": "Address to transfer to.",
+ "_value": "Amount to transfer."
+ },
+ "return": "Success of transfer."
+ }
+ }
+ },
+ "evm": {
+ "assembly": " /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":958:964 10**27 */\n 0x33b2e3c9fd0803ce8000000\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n 0x3\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\n jumpi(tag_1, iszero(callvalue))\n invalid\ntag_1:\ntag_2:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1222:1233 totalSupply */\n sload(0x3)\n sub(exp(0x2, 0xa0), 0x1)\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1208:1218 msg.sender */\n caller\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n and\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1207 balances */\n 0x0\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1219 balances[msg.sender] */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1199:1233 balances[msg.sender] = totalSupply */\n sstore\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1150:1240 function ZRXToken()... */\ntag_3:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\ntag_4:\n dataSize(sub_0)\n dup1\n dataOffset(sub_0)\n 0x0\n codecopy\n 0x0\n return\nstop\n\nsub_0: assembly {\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":795:1242 contract ZRXToken is UnlimitedAllowanceToken {... */\n mstore(0x40, 0x60)\n jumpi(tag_1, iszero(calldatasize))\n and(div(calldataload(0x0), 0x100000000000000000000000000000000000000000000000000000000), 0xffffffff)\n 0x6fdde03\n dup2\n eq\n tag_2\n jumpi\n dup1\n 0x95ea7b3\n eq\n tag_3\n jumpi\n dup1\n 0x18160ddd\n eq\n tag_4\n jumpi\n dup1\n 0x23b872dd\n eq\n tag_5\n jumpi\n dup1\n 0x313ce567\n eq\n tag_6\n jumpi\n dup1\n 0x70a08231\n eq\n tag_7\n jumpi\n dup1\n 0x95d89b41\n eq\n tag_8\n jumpi\n dup1\n 0xa9059cbb\n eq\n tag_9\n jumpi\n dup1\n 0xdd62ed3e\n eq\n tag_10\n jumpi\n tag_1:\n invalid\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_2:\n jumpi(tag_11, iszero(callvalue))\n invalid\n tag_11:\n tag_12\n jump(tag_13)\n tag_12:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_15:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_14:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_16:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_3:\n jumpi(tag_17, iszero(callvalue))\n invalid\n tag_17:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_19)\n tag_18:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_4:\n jumpi(tag_20, iszero(callvalue))\n invalid\n tag_20:\n tag_21\n jump(tag_22)\n tag_21:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_5:\n jumpi(tag_23, iszero(callvalue))\n invalid\n tag_23:\n tag_18\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n calldataload(0x44)\n jump(tag_25)\n tag_24:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_6:\n jumpi(tag_26, iszero(callvalue))\n invalid\n tag_26:\n tag_27\n jump(tag_28)\n tag_27:\n 0x40\n dup1\n mload\n 0xff\n swap1\n swap3\n and\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_7:\n jumpi(tag_29, iszero(callvalue))\n invalid\n tag_29:\n tag_21\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n jump(tag_31)\n tag_30:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_8:\n jumpi(tag_32, iszero(callvalue))\n invalid\n tag_32:\n tag_12\n jump(tag_34)\n tag_33:\n 0x40\n dup1\n mload\n 0x20\n dup1\n dup3\n mstore\n dup4\n mload\n dup2\n dup4\n add\n mstore\n dup4\n mload\n swap2\n swap3\n dup4\n swap3\n swap1\n dup4\n add\n swap2\n dup6\n add\n swap1\n dup1\n dup4\n dup4\n /* \"--CODEGEN--\":18:20 */\n dup3\n iszero\n /* \"--CODEGEN--\":13:16 */\n tag_14\n /* \"--CODEGEN--\":7:12 */\n jumpi\n /* \"--CODEGEN--\":32:37 */\n tag_36:\n /* \"--CODEGEN--\":59:62 */\n dup1\n /* \"--CODEGEN--\":53:58 */\n mload\n /* \"--CODEGEN--\":48:51 */\n dup3\n /* \"--CODEGEN--\":41:47 */\n mstore\n /* \"--CODEGEN--\":93:95 */\n 0x20\n /* \"--CODEGEN--\":88:91 */\n dup4\n /* \"--CODEGEN--\":85:87 */\n gt\n /* \"--CODEGEN--\":78:84 */\n iszero\n /* \"--CODEGEN--\":73:76 */\n tag_14\n /* \"--CODEGEN--\":67:72 */\n jumpi\n /* \"--CODEGEN--\":152:155 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0\n swap1\n swap3\n add\n swap2\n /* \"--CODEGEN--\":117:119 */\n 0x20\n /* \"--CODEGEN--\":108:111 */\n swap2\n dup3\n add\n swap2\n /* \"--CODEGEN--\":130:133 */\n add\n /* \"--CODEGEN--\":172:177 */\n tag_15\n /* \"--CODEGEN--\":167:171 */\n jump\n /* \"--CODEGEN--\":181:184 */\n tag_35:\n /* \"--CODEGEN--\":3:189 */\n pop\n pop\n pop\n swap1\n pop\n swap1\n dup2\n add\n swap1\n 0x1f\n and\n dup1\n iszero\n tag_16\n jumpi\n dup1\n dup3\n sub\n dup1\n mload\n 0x1\n dup4\n 0x20\n sub\n 0x100\n exp\n sub\n not\n and\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n tag_37:\n pop\n swap3\n pop\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_9:\n jumpi(tag_38, iszero(callvalue))\n invalid\n tag_38:\n tag_18\n and(calldataload(0x4), 0xffffffffffffffffffffffffffffffffffffffff)\n calldataload(0x24)\n jump(tag_40)\n tag_39:\n 0x40\n dup1\n mload\n swap2\n iszero\n iszero\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_10:\n jumpi(tag_41, iszero(callvalue))\n invalid\n tag_41:\n tag_21\n 0xffffffffffffffffffffffffffffffffffffffff\n calldataload(0x4)\n dup2\n and\n swap1\n calldataload(0x24)\n and\n jump(tag_43)\n tag_42:\n 0x40\n dup1\n mload\n swap2\n dup3\n mstore\n mload\n swap1\n dup2\n swap1\n sub\n 0x20\n add\n swap1\n return\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1009:1058 string constant public name = \"0x Protocol Token\" */\n tag_13:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x11\n dup2\n mstore\n 0x30782050726f746f636f6c20546f6b656e000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_19:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1168:1178 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n dup2\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1167 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap5\n dup8\n and\n dup1\n dup5\n mstore\n swap5\n dup3\n mstore\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1198 */\n dup7\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n dup1\n mload\n dup7\n dup2\n mstore\n swap1\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1144:1148 */\n swap3\n swap5\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1189 */\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1160:1179 */\n swap3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1208:1246 */\n 0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\n swap3\n swap2\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1263:1267 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1087:1274 */\n tag_44:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":932:964 uint public totalSupply = 10**27 */\n tag_22:\n sload(0x3)\n dup2\n jump\t// out\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_25:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1161:1165 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n dup2\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1205 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1212 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1213:1223 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1198:1224 */\n swap1\n swap6\n and\n dup4\n mstore\n swap4\n dup2\n mstore\n dup4\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1253 */\n swap3\n dup3\n mstore\n dup2\n swap1\n mstore\n swap2\n dup3\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1263 */\n dup4\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1292:1298 */\n dup3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1288 */\n dup2\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1279:1298 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1298 */\n tag_46:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n dup1\n iszero\n tag_47\n jumpi\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup5\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1348 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1340:1353 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1336 */\n dup4\n dup2\n add\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1314:1353 */\n lt\n iszero\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1238:1353 */\n tag_47:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n iszero\n tag_48\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup6\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1386 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1391 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup1\n dup3\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1378:1401 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1430 */\n swap2\n dup8\n and\n dup2\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1415:1440 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":768:778 */\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1458:1478 */\n dup2\n lt\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n iszero\n tag_49\n jumpi\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup7\n and\n 0x0\n swap1\n dup2\n mstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1505 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1512 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1513:1523 */\n caller\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1524 */\n swap1\n swap5\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1498:1534 */\n dup1\n sload\n dup5\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1454:1549 */\n tag_49:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1578:1581 */\n dup4\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1571:1576 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n 0xffffffffffffffffffffffffffffffffffffffff\n and\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1583:1589 */\n dup6\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1562:1590 */\n mload(0x40)\n dup1\n dup3\n dup2\n mstore\n 0x20\n add\n swap2\n pop\n pop\n mload(0x40)\n dup1\n swap2\n sub\n swap1\n log3\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1611:1615 */\n 0x1\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1604:1615 */\n swap2\n pop\n jump(tag_50)\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_48:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1653:1658 */\n 0x0\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1646:1658 */\n swap2\n pop\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1234:1669 */\n tag_50:\n /* \"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":1066:1675 */\n tag_45:\n pop\n swap4\n swap3\n pop\n pop\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n tag_28:\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":924:926 18 */\n 0x12\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":891:926 uint8 constant public decimals = 18 */\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_31:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1035:1039 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1058:1074 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":982:1081 */\n tag_51:\n swap2\n swap1\n pop\n jump\t// out\n /* \"2.0.0/tokens/ZRXToken/ZRXToken.sol\":1064:1101 string constant public symbol = \"ZRX\" */\n tag_34:\n 0x40\n dup1\n mload\n dup1\n dup3\n add\n swap1\n swap2\n mstore\n 0x3\n dup2\n mstore\n 0x5a52580000000000000000000000000000000000000000000000000000000000\n 0x20\n dup3\n add\n mstore\n dup2\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_40:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":276:286 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":178:182 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:287 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n dup2\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:297 */\n dup3\n swap1\n lt\n dup1\n iszero\n swap1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53\n jumpi\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:335 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":327:340 */\n swap1\n dup2\n mstore\n 0x20\n dup2\n swap1\n mstore\n 0x40\n swap1\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:323 */\n dup3\n dup2\n add\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":301:340 */\n lt\n iszero\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":267:340 */\n tag_53:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n iszero\n tag_54\n jumpi\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n 0xffffffffffffffffffffffffffffffffffffffff\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":365:375 */\n caller\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:364 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:376 */\n dup2\n dup2\n mstore\n 0x20\n dup2\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":356:386 */\n dup1\n sload\n dup9\n swap1\n sub\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap4\n dup8\n and\n dup1\n dup4\n mstore\n swap2\n dup5\n swap1\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:423 */\n dup1\n sload\n dup8\n add\n swap1\n sstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n dup4\n mload\n dup7\n dup2\n mstore\n swap4\n mload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":400:413 */\n swap2\n swap4\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":437:470 */\n 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\n swap3\n swap1\n dup2\n swap1\n sub\n swap1\n swap2\n add\n swap1\n log3\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":491:495 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":484:495 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_54:\n pop\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":521:526 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":514:526 */\n jump(tag_44)\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":263:529 */\n tag_55:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":125:535 */\n tag_52:\n swap3\n swap2\n pop\n pop\n jump\t// out\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_43:\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0xffffffffffffffffffffffffffffffffffffffff\n dup1\n dup4\n and\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1351:1355 */\n 0x0\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n swap1\n dup2\n mstore\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1381 */\n 0x1\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1389 */\n 0x20\n swap1\n dup2\n mstore\n 0x40\n dup1\n dup4\n sha3\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1374:1399 */\n swap4\n dup6\n and\n dup4\n mstore\n swap3\n swap1\n mstore\n sha3\n sload\n /* \"1.0.0/ERC20Token/ERC20Token_v1.sol\":1280:1406 */\n tag_56:\n swap3\n swap2\n pop\n pop\n jump\t// out\n}\n",
+ "bytecode": {
+ "linkReferences": {},
+ "object": "0x60606040526b033b2e3c9fd0803ce8000000600355341561001c57fe5b5b600354600160a060020a0333166000908152602081905260409020555b5b61078d8061004a6000396000f300606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE PUSH12 0x33B2E3C9FD0803CE8000000 PUSH1 0x3 SSTORE CALLVALUE ISZERO PUSH2 0x1C JUMPI INVALID JUMPDEST JUMPDEST PUSH1 0x3 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SSTORE JUMPDEST JUMPDEST PUSH2 0x78D DUP1 PUSH2 0x4A PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;958:6;932:32;;1150:90;;;;;;;1222:11;;-1:-1:-1;;;;;1208:10:3;1199:20;:8;:20;;;;;;;;;;:34;1150:90;795:447;;;;;;;"
+ },
+ "deployedBytecode": {
+ "linkReferences": {},
+ "object": "0x606060405236156100965763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610098578063095ea7b31461014657806318160ddd1461018657806323b872dd146101a8578063313ce567146101ee57806370a082311461021457806395d89b411461024f578063a9059cbb146102fd578063dd62ed3e1461033d575bfe5b34156100a057fe5b6100a861037e565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561014e57fe5b61017273ffffffffffffffffffffffffffffffffffffffff600435166024356103b5565b604080519115158252519081900360200190f35b341561018e57fe5b61019661042d565b60408051918252519081900360200190f35b34156101b057fe5b61017273ffffffffffffffffffffffffffffffffffffffff60043581169060243516604435610433565b604080519115158252519081900360200190f35b34156101f657fe5b6101fe6105d4565b6040805160ff9092168252519081900360200190f35b341561021c57fe5b61019673ffffffffffffffffffffffffffffffffffffffff600435166105d9565b60408051918252519081900360200190f35b341561025757fe5b6100a8610605565b60408051602080825283518183015283519192839290830191850190808383821561010c575b80518252602083111561010c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016100ce565b505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561030557fe5b61017273ffffffffffffffffffffffffffffffffffffffff6004351660243561063c565b604080519115158252519081900360200190f35b341561034557fe5b61019673ffffffffffffffffffffffffffffffffffffffff60043581169060243516610727565b60408051918252519081900360200190f35b60408051808201909152601181527f30782050726f746f636f6c20546f6b656e000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff338116600081815260016020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60035481565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832033909516835293815283822054928252819052918220548390108015906104835750828110155b80156104b6575073ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090205483810110155b156105c65773ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220805487019055918716815220805484900390557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156105585773ffffffffffffffffffffffffffffffffffffffff808616600090815260016020908152604080832033909416835292905220805484900390555b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506105cb565b600091505b5b509392505050565b601281565b73ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020545b919050565b60408051808201909152600381527f5a52580000000000000000000000000000000000000000000000000000000000602082015281565b73ffffffffffffffffffffffffffffffffffffffff3316600090815260208190526040812054829010801590610699575073ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205482810110155b156107185773ffffffffffffffffffffffffffffffffffffffff33811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a3506001610427565b506000610427565b5b92915050565b73ffffffffffffffffffffffffffffffffffffffff8083166000908152600160209081526040808320938516835292905220545b929150505600a165627a7a723058208999c5329f53064aac58d4b553cb379a45bfca17e024506ff916637cfc36f7b20029",
+ "opcodes": "PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x96 JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x6FDDE03 DUP2 EQ PUSH2 0x98 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x146 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x186 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A8 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1EE JUMPI DUP1 PUSH4 0x70A08231 EQ PUSH2 0x214 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x24F JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2FD JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x33D JUMPI JUMPDEST INVALID JUMPDEST CALLVALUE ISZERO PUSH2 0xA0 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x37E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x14E JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x3B5 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x18E JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH2 0x42D JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1B0 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH1 0x44 CALLDATALOAD PUSH2 0x433 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x1F6 JUMPI INVALID JUMPDEST PUSH2 0x1FE PUSH2 0x5D4 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xFF SWAP1 SWAP3 AND DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x21C JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH2 0x5D9 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x257 JUMPI INVALID JUMPDEST PUSH2 0xA8 PUSH2 0x605 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP1 DUP3 MSTORE DUP4 MLOAD DUP2 DUP4 ADD MSTORE DUP4 MLOAD SWAP2 SWAP3 DUP4 SWAP3 SWAP1 DUP4 ADD SWAP2 DUP6 ADD SWAP1 DUP1 DUP4 DUP4 DUP3 ISZERO PUSH2 0x10C JUMPI JUMPDEST DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP4 GT ISZERO PUSH2 0x10C JUMPI PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0 SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xCE JUMP JUMPDEST POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x138 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x305 JUMPI INVALID JUMPDEST PUSH2 0x172 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD AND PUSH1 0x24 CALLDATALOAD PUSH2 0x63C JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 ISZERO ISZERO DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST CALLVALUE ISZERO PUSH2 0x345 JUMPI INVALID JUMPDEST PUSH2 0x196 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF PUSH1 0x4 CALLDATALOAD DUP2 AND SWAP1 PUSH1 0x24 CALLDATALOAD AND PUSH2 0x727 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP2 DUP3 MSTORE MLOAD SWAP1 DUP2 SWAP1 SUB PUSH1 0x20 ADD SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x11 DUP2 MSTORE PUSH32 0x30782050726F746F636F6C20546F6B656E000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 DUP3 MSTORE DUP1 DUP4 SHA3 DUP7 SWAP1 SSTORE DUP1 MLOAD DUP7 DUP2 MSTORE SWAP1 MLOAD SWAP3 SWAP5 SWAP4 SWAP3 PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP3 SWAP2 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP6 AND DUP4 MSTORE SWAP4 DUP2 MSTORE DUP4 DUP3 SHA3 SLOAD SWAP3 DUP3 MSTORE DUP2 SWAP1 MSTORE SWAP2 DUP3 SHA3 SLOAD DUP4 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x483 JUMPI POP DUP3 DUP2 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x4B6 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP4 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x5C6 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP6 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE SWAP2 DUP8 AND DUP2 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 LT ISZERO PUSH2 0x558 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 CALLER SWAP1 SWAP5 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 DUP1 SLOAD DUP5 SWAP1 SUB SWAP1 SSTORE JUMPDEST DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP6 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP6 PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x1 SWAP2 POP PUSH2 0x5CB JUMP JUMPDEST PUSH1 0x0 SWAP2 POP JUMPDEST JUMPDEST POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x5A52580000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE DUP2 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 SHA3 SLOAD DUP3 SWAP1 LT DUP1 ISZERO SWAP1 PUSH2 0x699 JUMPI POP PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 SHA3 SLOAD DUP3 DUP2 ADD LT ISZERO JUMPDEST ISZERO PUSH2 0x718 JUMPI PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF CALLER DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x20 DUP2 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 DUP1 SLOAD DUP9 SWAP1 SUB SWAP1 SSTORE SWAP4 DUP8 AND DUP1 DUP4 MSTORE SWAP2 DUP5 SWAP1 SHA3 DUP1 SLOAD DUP8 ADD SWAP1 SSTORE DUP4 MLOAD DUP7 DUP2 MSTORE SWAP4 MLOAD SWAP2 SWAP4 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP3 SWAP1 DUP2 SWAP1 SUB SWAP1 SWAP2 ADD SWAP1 LOG3 POP PUSH1 0x1 PUSH2 0x427 JUMP JUMPDEST POP PUSH1 0x0 PUSH2 0x427 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP1 DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 SHA3 SWAP4 DUP6 AND DUP4 MSTORE SWAP3 SWAP1 MSTORE SHA3 SLOAD JUMPDEST SWAP3 SWAP2 POP POP JUMP STOP LOG1 PUSH6 0x627A7A723058 SHA3 DUP10 SWAP10 0xc5 ORIGIN SWAP16 MSTORE8 MOD 0x4a 0xac PC 0xd4 0xb5 MSTORE8 0xcb CALLDATACOPY SWAP11 GASLIMIT 0xbf 0xca OR 0xe0 0x24 POP PUSH16 0xF916637CFC36F7B20029000000000000 ",
+ "sourceMap": "795:447:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1087:187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;932:32:3;;;;;;;;;;;;;;;;;;;;;;;;;;1066:609:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;891:35:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;982:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1064:37:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18:2:-1;;13:3;7:5;32;59:3;53:5;48:3;41:6;93:2;88:3;85:2;78:6;73:3;67:5;152:3;;;;;117:2;108:3;;;;130;172:5;167:4;181:3;3:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;125:410:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1280:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1009:49:3;;;;;;;;;;;;;;;;;;;:::o;1087:187:0:-;1160:19;1168:10;1160:19;;1144:4;1160:19;;;:7;:19;;;;;;;;:29;;;;;;;;;;;;:38;;;1208;;;;;;;1144:4;;1160:29;:19;1208:38;;;;;;;;;;;-1:-1:-1;1263:4:0;1087:187;;;;;:::o;932:32:3:-;;;;:::o;1066:609:2:-;1198:14;;;;1161:4;1198:14;;;:7;:14;;;;;;;;1213:10;1198:26;;;;;;;;;;;;1238:15;;;;;;;;;;:25;;;;;;:60;;;1292:6;1279:9;:19;;1238:60;:115;;;;-1:-1:-1;1340:13:2;;;:8;:13;;;;;;;;;;;1314:22;;;:39;;1238:115;1234:435;;;1378:13;;;;:8;:13;;;;;;;;;;;:23;;;;;;1415:15;;;;;;:25;;;;;;;768:10;1458:20;;1454:95;;;1498:14;;;;;;;;:7;:14;;;;;;;;1513:10;1498:26;;;;;;;;;:36;;;;;;;1454:95;1578:3;1562:28;;1571:5;1562:28;;;1583:6;1562:28;;;;;;;;;;;;;;;;;;1611:4;1604:11;;;;1234:435;1653:5;1646:12;;1234:435;1066:609;;;;;;;:::o;891:35:3:-;924:2;891:35;:::o;982:99:0:-;1058:16;;;1035:4;1058:16;;;;;;;;;;;982:99;;;;:::o;1064:37:3:-;;;;;;;;;;;;;;;;;;;:::o;125:410:0:-;267:20;276:10;267:20;178:4;267:20;;;;;;;;;;;:30;;;;;;:73;;-1:-1:-1;327:13:0;;;:8;:13;;;;;;;;;;;301:22;;;:39;;267:73;263:266;;;356:20;365:10;356:20;;:8;:20;;;;;;;;;;;:30;;;;;;;400:13;;;;;;;;;;:23;;;;;;437:33;;;;;;;400:13;;437:33;;;;;;;;;;;-1:-1:-1;491:4:0;484:11;;263:266;-1:-1:-1;521:5:0;514:12;;263:266;125:410;;;;;:::o;1280:126::-;1374:15;;;;1351:4;1374:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;1280:126;;;;;:::o"
+ },
+ "gasEstimates": {
+ "creation": {
+ "codeDepositCost": "386600",
+ "executionCost": "40780",
+ "totalCost": "427380"
+ },
+ "external": {
+ "allowance(address,address)": "737",
+ "approve(address,uint256)": "22218",
+ "balanceOf(address)": "579",
+ "decimals()": "270",
+ "name()": "530",
+ "symbol()": "662",
+ "totalSupply()": "417",
+ "transfer(address,uint256)": "43393",
+ "transferFrom(address,address,uint256)": "64116"
+ }
+ },
+ "legacyAssembly": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 958,
+ "end": 964,
+ "name": "PUSH",
+ "value": "33B2E3C9FD0803CE8000000"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1222,
+ "end": 1233,
+ "name": "SLOAD"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "A0"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "PUSH",
+ "value": "2"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "EXP"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1218,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "AND"
+ },
+ {
+ "begin": 1199,
+ "end": 1207,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1199,
+ "end": 1219,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1199,
+ "end": 1233,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1150,
+ "end": 1240,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH #[$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [$]",
+ "value": "0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CODECOPY"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "RETURN"
+ }
+ ],
+ ".data": {
+ "0": {
+ ".code": [
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "60"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATASIZE"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "FFFFFFFF"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "100000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DIV"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "AND"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "6FDDE03"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "2"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95EA7B3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "3"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "18160DDD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "4"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "23B872DD"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "5"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "313CE567"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "6"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "70A08231"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "7"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "95D89B41"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "8"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "A9059CBB"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "9"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "DUP1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH",
+ "value": "DD62ED3E"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "EQ"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "PUSH [tag]",
+ "value": "10"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "tag",
+ "value": "1"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 795,
+ "end": 1242,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH [tag]",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "12"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "15"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "14"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "17"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "AND"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH [tag]",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "18"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SUB"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "ADD"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "RETURN"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "4"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "INVALID"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH [tag]",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "21"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SUB"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "ADD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "5"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "23"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "AND"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "44"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH [tag]",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "24"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SUB"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "ADD"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "RETURN"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "6"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "INVALID"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "26"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH [tag]",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "27"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "FF"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "AND"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP3"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SUB"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "ADD"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "RETURN"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "7"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "INVALID"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "29"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "AND"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH [tag]",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "30"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP3"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "DUP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SUB"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "ADD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "8"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "32"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "12"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH [tag]",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "33"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP4"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "DUP3"
+ },
+ {
+ "begin": 18,
+ "end": 20,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 13,
+ "end": 16,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 7,
+ "end": 12,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "tag",
+ "value": "36"
+ },
+ {
+ "begin": 32,
+ "end": 37,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 59,
+ "end": 62,
+ "name": "DUP1"
+ },
+ {
+ "begin": 53,
+ "end": 58,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 48,
+ "end": 51,
+ "name": "DUP3"
+ },
+ {
+ "begin": 41,
+ "end": 47,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 93,
+ "end": 95,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 88,
+ "end": 91,
+ "name": "DUP4"
+ },
+ {
+ "begin": 85,
+ "end": 87,
+ "name": "GT"
+ },
+ {
+ "begin": 78,
+ "end": 84,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 73,
+ "end": 76,
+ "name": "PUSH [tag]",
+ "value": "14"
+ },
+ {
+ "begin": 67,
+ "end": 72,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "ADD"
+ },
+ {
+ "begin": 152,
+ "end": 155,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 117,
+ "end": 119,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "DUP3"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "ADD"
+ },
+ {
+ "begin": 108,
+ "end": 111,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 130,
+ "end": 133,
+ "name": "ADD"
+ },
+ {
+ "begin": 172,
+ "end": 177,
+ "name": "PUSH [tag]",
+ "value": "15"
+ },
+ {
+ "begin": 167,
+ "end": 171,
+ "name": "JUMP"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "tag",
+ "value": "35"
+ },
+ {
+ "begin": 181,
+ "end": 184,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1F"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH [tag]",
+ "value": "16"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "100"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "EXP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "NOT"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "AND"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "ADD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "tag",
+ "value": "37"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "POP"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SUB"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 3,
+ "end": 189,
+ "name": "RETURN"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "9"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "INVALID"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "38"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "18"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "AND"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH [tag]",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "39"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "DUP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SUB"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "ADD"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "10"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLVALUE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "INVALID"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "41"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "21"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "4"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "24"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "CALLDATALOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "AND"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH [tag]",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "42"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SUB"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "ADD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "RETURN"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "tag",
+ "value": "13"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "11"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "30782050726F746F636F6C20546F6B656E000000000000000000000000000000"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "ADD"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1009,
+ "end": 1058,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "19"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1168,
+ "end": 1178,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "AND"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1167,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "AND"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1160,
+ "end": 1198,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1144,
+ "end": 1148,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1160,
+ "end": 1189,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1160,
+ "end": 1179,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "PUSH",
+ "value": "8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SUB"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "ADD"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1208,
+ "end": 1246,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1263,
+ "end": 1267,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "tag",
+ "value": "44"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "POP"
+ },
+ {
+ "begin": 1087,
+ "end": 1274,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "tag",
+ "value": "22"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "DUP2"
+ },
+ {
+ "begin": 932,
+ "end": 964,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "25"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "AND"
+ },
+ {
+ "begin": 1161,
+ "end": 1165,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1205,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1212,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1213,
+ "end": 1223,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP6"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "AND"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1198,
+ "end": 1224,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1238,
+ "end": 1253,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "LT"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1263,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "PUSH [tag]",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "POP"
+ },
+ {
+ "begin": 1292,
+ "end": 1298,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1279,
+ "end": 1288,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "LT"
+ },
+ {
+ "begin": 1279,
+ "end": 1298,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "tag",
+ "value": "46"
+ },
+ {
+ "begin": 1238,
+ "end": 1298,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "PUSH [tag]",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "AND"
+ },
+ {
+ "begin": 1340,
+ "end": 1348,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1340,
+ "end": 1353,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1314,
+ "end": 1336,
+ "name": "ADD"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "LT"
+ },
+ {
+ "begin": 1314,
+ "end": 1353,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "tag",
+ "value": "47"
+ },
+ {
+ "begin": 1238,
+ "end": 1353,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "PUSH [tag]",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "AND"
+ },
+ {
+ "begin": 1378,
+ "end": 1386,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1378,
+ "end": 1391,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "ADD"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1378,
+ "end": 1401,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP8"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "AND"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1415,
+ "end": 1430,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SUB"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1415,
+ "end": 1440,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 768,
+ "end": 778,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1458,
+ "end": 1478,
+ "name": "LT"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "PUSH [tag]",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP7"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1505,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1512,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1513,
+ "end": 1523,
+ "name": "CALLER"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "AND"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1498,
+ "end": 1524,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "DUP5"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SUB"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1498,
+ "end": 1534,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "tag",
+ "value": "49"
+ },
+ {
+ "begin": 1454,
+ "end": 1549,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1578,
+ "end": 1581,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1571,
+ "end": 1576,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "AND"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 1583,
+ "end": 1589,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "ADD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "POP"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SUB"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1562,
+ "end": 1590,
+ "name": "LOG3"
+ },
+ {
+ "begin": 1611,
+ "end": 1615,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "POP"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "PUSH [tag]",
+ "value": "50"
+ },
+ {
+ "begin": 1604,
+ "end": 1615,
+ "name": "JUMP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "48"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1653,
+ "end": 1658,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1646,
+ "end": 1658,
+ "name": "POP"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "tag",
+ "value": "50"
+ },
+ {
+ "begin": 1234,
+ "end": 1669,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "tag",
+ "value": "45"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "POP"
+ },
+ {
+ "begin": 1066,
+ "end": 1675,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "tag",
+ "value": "28"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 924,
+ "end": 926,
+ "name": "PUSH",
+ "value": "12"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "DUP2"
+ },
+ {
+ "begin": 891,
+ "end": 926,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "31"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "AND"
+ },
+ {
+ "begin": 1035,
+ "end": 1039,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1058,
+ "end": 1074,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "tag",
+ "value": "51"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "POP"
+ },
+ {
+ "begin": 982,
+ "end": 1081,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "tag",
+ "value": "34"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "5A52580000000000000000000000000000000000000000000000000000000000"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP3"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "ADD"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1064,
+ "end": 1101,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "40"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 276,
+ "end": 286,
+ "name": "CALLER"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "AND"
+ },
+ {
+ "begin": 178,
+ "end": 182,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "DUP2"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SHA3"
+ },
+ {
+ "begin": 267,
+ "end": 287,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP3"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "LT"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "DUP1"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 297,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "PUSH [tag]",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPI"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP4"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "AND"
+ },
+ {
+ "begin": 327,
+ "end": 335,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "DUP2"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SHA3"
+ },
+ {
+ "begin": 327,
+ "end": 340,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP3"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "DUP2"
+ },
+ {
+ "begin": 301,
+ "end": 323,
+ "name": "ADD"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "LT"
+ },
+ {
+ "begin": 301,
+ "end": 340,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "tag",
+ "value": "53"
+ },
+ {
+ "begin": 267,
+ "end": 340,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "ISZERO"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "PUSH [tag]",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPI"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 365,
+ "end": 375,
+ "name": "CALLER"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "AND"
+ },
+ {
+ "begin": 356,
+ "end": 364,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP2"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "DUP4"
+ },
+ {
+ "begin": 356,
+ "end": 376,
+ "name": "SHA3"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "DUP9"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SUB"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 356,
+ "end": 386,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "AND"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP4"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "DUP5"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SHA3"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "DUP8"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "ADD"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 400,
+ "end": 423,
+ "name": "SSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP7"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "MLOAD"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 400,
+ "end": 413,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "PUSH",
+ "value": "DDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "DUP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SUB"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "ADD"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 437,
+ "end": 470,
+ "name": "LOG3"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 491,
+ "end": 495,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 484,
+ "end": 495,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "54"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": -1,
+ "end": -1,
+ "name": "POP"
+ },
+ {
+ "begin": 521,
+ "end": 526,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "PUSH [tag]",
+ "value": "44"
+ },
+ {
+ "begin": 514,
+ "end": 526,
+ "name": "JUMP"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "tag",
+ "value": "55"
+ },
+ {
+ "begin": 263,
+ "end": 529,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "tag",
+ "value": "52"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "POP"
+ },
+ {
+ "begin": 125,
+ "end": 535,
+ "name": "JUMP",
+ "value": "[out]"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "43"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "AND"
+ },
+ {
+ "begin": 1351,
+ "end": 1355,
+ "name": "PUSH",
+ "value": "0"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1381,
+ "name": "PUSH",
+ "value": "1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "20"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP2"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "PUSH",
+ "value": "40"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1389,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP6"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "AND"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "DUP4"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SWAP1"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "MSTORE"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SHA3"
+ },
+ {
+ "begin": 1374,
+ "end": 1399,
+ "name": "SLOAD"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "tag",
+ "value": "56"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMPDEST"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP3"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "SWAP2"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "POP"
+ },
+ {
+ "begin": 1280,
+ "end": 1406,
+ "name": "JUMP",
+ "value": "[out]"
+ }
+ ]
+ }
+ }
+ },
+ "methodIdentifiers": {
+ "allowance(address,address)": "dd62ed3e",
+ "approve(address,uint256)": "095ea7b3",
+ "balanceOf(address)": "70a08231",
+ "decimals()": "313ce567",
+ "name()": "06fdde03",
+ "symbol()": "95d89b41",
+ "totalSupply()": "18160ddd",
+ "transfer(address,uint256)": "a9059cbb",
+ "transferFrom(address,address,uint256)": "23b872dd"
+ }
+ },
+ "metadata": "{\"compiler\":{\"version\":\"0.4.11+commit.68ef5810\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"constant\":true,\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_spender\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_from\",\"type\":\"address\"},{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_to\",\"type\":\"address\"},{\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\"},{\"name\":\"_spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"_spender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"}],\"devdoc\":{\"methods\":{\"transferFrom(address,address,uint256)\":{\"details\":\"ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\",\"params\":{\"_from\":\"Address to transfer from.\",\"_to\":\"Address to transfer to.\",\"_value\":\"Amount to transfer.\"},\"return\":\"Success of transfer.\"}}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":\"ZRXToken\"},\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"1.0.0/ERC20Token/ERC20Token_v1.sol\":{\"keccak256\":\"0x3d710b436c430d6fe49f64b091555405360d76da6454b93faa8e213eea34a96d\",\"urls\":[\"bzzr://d12710a563415ad98ff28ecb3aab0b68467b3d023e7c130c73ed9918ef86158e\"]},\"1.0.0/Token/Token_v1.sol\":{\"keccak256\":\"0x35a82bc7bc0994caa97f8ea44660b9b5e796acfe72705b5ff7ed8f2a3c47ff37\",\"urls\":[\"bzzr://a62ae857a4cf2e8948e36d02470c612ac1a5ac20ebe1c1b553ad1ed8becb634e\"]},\"1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\":{\"keccak256\":\"0x2e1f4b899081cedd8940a9cd0f0f7413264c883312ed0ba9c53885766fe0a1a5\",\"urls\":[\"bzzr://47c42a58e56ffe81e49c8aabd3c391f5fa807fea299b3a2178501e3669baeb52\"]},\"2.0.0/tokens/ZRXToken/ZRXToken.sol\":{\"keccak256\":\"0x9eeb623d48909b083c77688b13b610811c53e37622b3fcbaa23c01873230f5d6\",\"urls\":[\"bzzr://84f3b5c2653068092771d443281018ff2ee0543817426d0fb6f9037a3570e37f\"]}},\"version\":1}",
+ "userdoc": {
+ "methods": {}
+ }
+ },
+ "sources": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": {
+ "id": 0,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 126,
+ "name": "PragmaDirective",
+ "src": "0:24:0"
+ },
+ {
+ "attributes": {
+ "file": "../Token/Token_v1.sol"
+ },
+ "id": 128,
+ "name": "ImportDirective",
+ "src": "26:58:0"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 322,
+ 397
+ ],
+ "name": "ERC20Token_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "Token"
+ },
+ "id": 129,
+ "name": "UserDefinedTypeName",
+ "src": "112:5:0"
+ }
+ ],
+ "id": 130,
+ "name": "InheritanceSpecifier",
+ "src": "112:5:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 131,
+ "name": "ElementaryTypeName",
+ "src": "143:7:0"
+ }
+ ],
+ "id": 132,
+ "name": "VariableDeclaration",
+ "src": "143:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 133,
+ "name": "ElementaryTypeName",
+ "src": "156:4:0"
+ }
+ ],
+ "id": 134,
+ "name": "VariableDeclaration",
+ "src": "156:11:0"
+ }
+ ],
+ "id": 135,
+ "name": "ParameterList",
+ "src": "142:26:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 136,
+ "name": "ElementaryTypeName",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 137,
+ "name": "VariableDeclaration",
+ "src": "178:4:0"
+ }
+ ],
+ "id": 138,
+ "name": "ParameterList",
+ "src": "177:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 139,
+ "name": "Identifier",
+ "src": "267:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 140,
+ "name": "Identifier",
+ "src": "276:3:0"
+ }
+ ],
+ "id": 141,
+ "name": "MemberAccess",
+ "src": "276:10:0"
+ }
+ ],
+ "id": 142,
+ "name": "IndexAccess",
+ "src": "267:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 143,
+ "name": "Identifier",
+ "src": "291:6:0"
+ }
+ ],
+ "id": 144,
+ "name": "BinaryOperation",
+ "src": "267:30:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 145,
+ "name": "Identifier",
+ "src": "301:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 146,
+ "name": "Identifier",
+ "src": "310:3:0"
+ }
+ ],
+ "id": 147,
+ "name": "IndexAccess",
+ "src": "301:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 148,
+ "name": "Identifier",
+ "src": "317:6:0"
+ }
+ ],
+ "id": 149,
+ "name": "BinaryOperation",
+ "src": "301:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 150,
+ "name": "Identifier",
+ "src": "327:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 151,
+ "name": "Identifier",
+ "src": "336:3:0"
+ }
+ ],
+ "id": 152,
+ "name": "IndexAccess",
+ "src": "327:13:0"
+ }
+ ],
+ "id": 153,
+ "name": "BinaryOperation",
+ "src": "301:39:0"
+ }
+ ],
+ "id": 154,
+ "name": "BinaryOperation",
+ "src": "267:73:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 155,
+ "name": "Identifier",
+ "src": "356:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 156,
+ "name": "Identifier",
+ "src": "365:3:0"
+ }
+ ],
+ "id": 157,
+ "name": "MemberAccess",
+ "src": "365:10:0"
+ }
+ ],
+ "id": 158,
+ "name": "IndexAccess",
+ "src": "356:20:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 159,
+ "name": "Identifier",
+ "src": "380:6:0"
+ }
+ ],
+ "id": 160,
+ "name": "Assignment",
+ "src": "356:30:0"
+ }
+ ],
+ "id": 161,
+ "name": "ExpressionStatement",
+ "src": "356:30:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 162,
+ "name": "Identifier",
+ "src": "400:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 163,
+ "name": "Identifier",
+ "src": "409:3:0"
+ }
+ ],
+ "id": 164,
+ "name": "IndexAccess",
+ "src": "400:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 165,
+ "name": "Identifier",
+ "src": "417:6:0"
+ }
+ ],
+ "id": 166,
+ "name": "Assignment",
+ "src": "400:23:0"
+ }
+ ],
+ "id": 167,
+ "name": "ExpressionStatement",
+ "src": "400:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 168,
+ "name": "Identifier",
+ "src": "437:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 169,
+ "name": "Identifier",
+ "src": "446:3:0"
+ }
+ ],
+ "id": 170,
+ "name": "MemberAccess",
+ "src": "446:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 171,
+ "name": "Identifier",
+ "src": "458:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 172,
+ "name": "Identifier",
+ "src": "463:6:0"
+ }
+ ],
+ "id": 173,
+ "name": "FunctionCall",
+ "src": "437:33:0"
+ }
+ ],
+ "id": 174,
+ "name": "ExpressionStatement",
+ "src": "437:33:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 175,
+ "name": "Literal",
+ "src": "491:4:0"
+ }
+ ],
+ "id": 176,
+ "name": "Return",
+ "src": "484:11:0"
+ }
+ ],
+ "id": 177,
+ "name": "Block",
+ "src": "342:164:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 178,
+ "name": "Literal",
+ "src": "521:5:0"
+ }
+ ],
+ "id": 179,
+ "name": "Return",
+ "src": "514:12:0"
+ }
+ ],
+ "id": 180,
+ "name": "Block",
+ "src": "512:17:0"
+ }
+ ],
+ "id": 181,
+ "name": "IfStatement",
+ "src": "263:266:0"
+ }
+ ],
+ "id": 182,
+ "name": "Block",
+ "src": "184:351:0"
+ }
+ ],
+ "id": 183,
+ "name": "FunctionDefinition",
+ "src": "125:410:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 184,
+ "name": "ElementaryTypeName",
+ "src": "563:7:0"
+ }
+ ],
+ "id": 185,
+ "name": "VariableDeclaration",
+ "src": "563:13:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 186,
+ "name": "ElementaryTypeName",
+ "src": "578:7:0"
+ }
+ ],
+ "id": 187,
+ "name": "VariableDeclaration",
+ "src": "578:11:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 188,
+ "name": "ElementaryTypeName",
+ "src": "591:4:0"
+ }
+ ],
+ "id": 189,
+ "name": "VariableDeclaration",
+ "src": "591:11:0"
+ }
+ ],
+ "id": 190,
+ "name": "ParameterList",
+ "src": "562:41:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 191,
+ "name": "ElementaryTypeName",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 192,
+ "name": "VariableDeclaration",
+ "src": "613:4:0"
+ }
+ ],
+ "id": 193,
+ "name": "ParameterList",
+ "src": "612:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 194,
+ "name": "Identifier",
+ "src": "633:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 195,
+ "name": "Identifier",
+ "src": "642:5:0"
+ }
+ ],
+ "id": 196,
+ "name": "IndexAccess",
+ "src": "633:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 197,
+ "name": "Identifier",
+ "src": "652:6:0"
+ }
+ ],
+ "id": 198,
+ "name": "BinaryOperation",
+ "src": "633:25:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 199,
+ "name": "Identifier",
+ "src": "662:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 200,
+ "name": "Identifier",
+ "src": "670:5:0"
+ }
+ ],
+ "id": 201,
+ "name": "IndexAccess",
+ "src": "662:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 202,
+ "name": "Identifier",
+ "src": "677:3:0"
+ }
+ ],
+ "id": 203,
+ "name": "MemberAccess",
+ "src": "677:10:0"
+ }
+ ],
+ "id": 204,
+ "name": "IndexAccess",
+ "src": "662:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 205,
+ "name": "Identifier",
+ "src": "692:6:0"
+ }
+ ],
+ "id": 206,
+ "name": "BinaryOperation",
+ "src": "662:36:0"
+ }
+ ],
+ "id": 207,
+ "name": "BinaryOperation",
+ "src": "633:65:0"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 208,
+ "name": "Identifier",
+ "src": "702:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 209,
+ "name": "Identifier",
+ "src": "711:3:0"
+ }
+ ],
+ "id": 210,
+ "name": "IndexAccess",
+ "src": "702:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 211,
+ "name": "Identifier",
+ "src": "718:6:0"
+ }
+ ],
+ "id": 212,
+ "name": "BinaryOperation",
+ "src": "702:22:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 213,
+ "name": "Identifier",
+ "src": "728:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 214,
+ "name": "Identifier",
+ "src": "737:3:0"
+ }
+ ],
+ "id": 215,
+ "name": "IndexAccess",
+ "src": "728:13:0"
+ }
+ ],
+ "id": 216,
+ "name": "BinaryOperation",
+ "src": "702:39:0"
+ }
+ ],
+ "id": 217,
+ "name": "BinaryOperation",
+ "src": "633:108:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 218,
+ "name": "Identifier",
+ "src": "757:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 219,
+ "name": "Identifier",
+ "src": "766:3:0"
+ }
+ ],
+ "id": 220,
+ "name": "IndexAccess",
+ "src": "757:13:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 221,
+ "name": "Identifier",
+ "src": "774:6:0"
+ }
+ ],
+ "id": 222,
+ "name": "Assignment",
+ "src": "757:23:0"
+ }
+ ],
+ "id": 223,
+ "name": "ExpressionStatement",
+ "src": "757:23:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 224,
+ "name": "Identifier",
+ "src": "794:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 225,
+ "name": "Identifier",
+ "src": "803:5:0"
+ }
+ ],
+ "id": 226,
+ "name": "IndexAccess",
+ "src": "794:15:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 227,
+ "name": "Identifier",
+ "src": "813:6:0"
+ }
+ ],
+ "id": 228,
+ "name": "Assignment",
+ "src": "794:25:0"
+ }
+ ],
+ "id": 229,
+ "name": "ExpressionStatement",
+ "src": "794:25:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 230,
+ "name": "Identifier",
+ "src": "833:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 231,
+ "name": "Identifier",
+ "src": "841:5:0"
+ }
+ ],
+ "id": 234,
+ "name": "IndexAccess",
+ "src": "833:14:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 232,
+ "name": "Identifier",
+ "src": "848:3:0"
+ }
+ ],
+ "id": 233,
+ "name": "MemberAccess",
+ "src": "848:10:0"
+ }
+ ],
+ "id": 235,
+ "name": "IndexAccess",
+ "src": "833:26:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 236,
+ "name": "Identifier",
+ "src": "863:6:0"
+ }
+ ],
+ "id": 237,
+ "name": "Assignment",
+ "src": "833:36:0"
+ }
+ ],
+ "id": 238,
+ "name": "ExpressionStatement",
+ "src": "833:36:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 239,
+ "name": "Identifier",
+ "src": "883:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 240,
+ "name": "Identifier",
+ "src": "892:5:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 241,
+ "name": "Identifier",
+ "src": "899:3:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 242,
+ "name": "Identifier",
+ "src": "904:6:0"
+ }
+ ],
+ "id": 243,
+ "name": "FunctionCall",
+ "src": "883:28:0"
+ }
+ ],
+ "id": 244,
+ "name": "ExpressionStatement",
+ "src": "883:28:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 245,
+ "name": "Literal",
+ "src": "932:4:0"
+ }
+ ],
+ "id": 246,
+ "name": "Return",
+ "src": "925:11:0"
+ }
+ ],
+ "id": 247,
+ "name": "Block",
+ "src": "743:204:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 248,
+ "name": "Literal",
+ "src": "962:5:0"
+ }
+ ],
+ "id": 249,
+ "name": "Return",
+ "src": "955:12:0"
+ }
+ ],
+ "id": 250,
+ "name": "Block",
+ "src": "953:17:0"
+ }
+ ],
+ "id": 251,
+ "name": "IfStatement",
+ "src": "629:341:0"
+ }
+ ],
+ "id": 252,
+ "name": "Block",
+ "src": "619:357:0"
+ }
+ ],
+ "id": 253,
+ "name": "FunctionDefinition",
+ "src": "541:435:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 254,
+ "name": "ElementaryTypeName",
+ "src": "1001:7:0"
+ }
+ ],
+ "id": 255,
+ "name": "VariableDeclaration",
+ "src": "1001:14:0"
+ }
+ ],
+ "id": 256,
+ "name": "ParameterList",
+ "src": "1000:16:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 257,
+ "name": "ElementaryTypeName",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 258,
+ "name": "VariableDeclaration",
+ "src": "1035:4:0"
+ }
+ ],
+ "id": 259,
+ "name": "ParameterList",
+ "src": "1034:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 260,
+ "name": "Identifier",
+ "src": "1058:8:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 261,
+ "name": "Identifier",
+ "src": "1067:6:0"
+ }
+ ],
+ "id": 262,
+ "name": "IndexAccess",
+ "src": "1058:16:0"
+ }
+ ],
+ "id": 263,
+ "name": "Return",
+ "src": "1051:23:0"
+ }
+ ],
+ "id": 264,
+ "name": "Block",
+ "src": "1041:40:0"
+ }
+ ],
+ "id": 265,
+ "name": "FunctionDefinition",
+ "src": "982:99:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 266,
+ "name": "ElementaryTypeName",
+ "src": "1104:7:0"
+ }
+ ],
+ "id": 267,
+ "name": "VariableDeclaration",
+ "src": "1104:16:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 268,
+ "name": "ElementaryTypeName",
+ "src": "1122:4:0"
+ }
+ ],
+ "id": 269,
+ "name": "VariableDeclaration",
+ "src": "1122:11:0"
+ }
+ ],
+ "id": 270,
+ "name": "ParameterList",
+ "src": "1103:31:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 271,
+ "name": "ElementaryTypeName",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 272,
+ "name": "VariableDeclaration",
+ "src": "1144:4:0"
+ }
+ ],
+ "id": 273,
+ "name": "ParameterList",
+ "src": "1143:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 274,
+ "name": "Identifier",
+ "src": "1160:7:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 275,
+ "name": "Identifier",
+ "src": "1168:3:0"
+ }
+ ],
+ "id": 276,
+ "name": "MemberAccess",
+ "src": "1168:10:0"
+ }
+ ],
+ "id": 278,
+ "name": "IndexAccess",
+ "src": "1160:19:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 277,
+ "name": "Identifier",
+ "src": "1180:8:0"
+ }
+ ],
+ "id": 279,
+ "name": "IndexAccess",
+ "src": "1160:29:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 280,
+ "name": "Identifier",
+ "src": "1192:6:0"
+ }
+ ],
+ "id": 281,
+ "name": "Assignment",
+ "src": "1160:38:0"
+ }
+ ],
+ "id": 282,
+ "name": "ExpressionStatement",
+ "src": "1160:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Approval"
+ },
+ "id": 283,
+ "name": "Identifier",
+ "src": "1208:8:0"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 284,
+ "name": "Identifier",
+ "src": "1217:3:0"
+ }
+ ],
+ "id": 285,
+ "name": "MemberAccess",
+ "src": "1217:10:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 286,
+ "name": "Identifier",
+ "src": "1229:8:0"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 287,
+ "name": "Identifier",
+ "src": "1239:6:0"
+ }
+ ],
+ "id": 288,
+ "name": "FunctionCall",
+ "src": "1208:38:0"
+ }
+ ],
+ "id": 289,
+ "name": "ExpressionStatement",
+ "src": "1208:38:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 290,
+ "name": "Literal",
+ "src": "1263:4:0"
+ }
+ ],
+ "id": 291,
+ "name": "Return",
+ "src": "1256:11:0"
+ }
+ ],
+ "id": 292,
+ "name": "Block",
+ "src": "1150:124:0"
+ }
+ ],
+ "id": 293,
+ "name": "FunctionDefinition",
+ "src": "1087:187:0"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 294,
+ "name": "ElementaryTypeName",
+ "src": "1299:7:0"
+ }
+ ],
+ "id": 295,
+ "name": "VariableDeclaration",
+ "src": "1299:14:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 296,
+ "name": "ElementaryTypeName",
+ "src": "1315:7:0"
+ }
+ ],
+ "id": 297,
+ "name": "VariableDeclaration",
+ "src": "1315:16:0"
+ }
+ ],
+ "id": 298,
+ "name": "ParameterList",
+ "src": "1298:34:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 299,
+ "name": "ElementaryTypeName",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 300,
+ "name": "VariableDeclaration",
+ "src": "1351:4:0"
+ }
+ ],
+ "id": 301,
+ "name": "ParameterList",
+ "src": "1350:6:0"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 302,
+ "name": "Identifier",
+ "src": "1374:7:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_owner"
+ },
+ "id": 303,
+ "name": "Identifier",
+ "src": "1382:6:0"
+ }
+ ],
+ "id": 304,
+ "name": "IndexAccess",
+ "src": "1374:15:0"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_spender"
+ },
+ "id": 305,
+ "name": "Identifier",
+ "src": "1390:8:0"
+ }
+ ],
+ "id": 306,
+ "name": "IndexAccess",
+ "src": "1374:25:0"
+ }
+ ],
+ "id": 307,
+ "name": "Return",
+ "src": "1367:32:0"
+ }
+ ],
+ "id": 308,
+ "name": "Block",
+ "src": "1357:49:0"
+ }
+ ],
+ "id": 309,
+ "name": "FunctionDefinition",
+ "src": "1280:126:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balances",
+ "storageLocation": "default",
+ "type": "mapping(address => uint256)",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 310,
+ "name": "ElementaryTypeName",
+ "src": "1421:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 311,
+ "name": "ElementaryTypeName",
+ "src": "1432:4:0"
+ }
+ ],
+ "id": 312,
+ "name": "Mapping",
+ "src": "1412:25:0"
+ }
+ ],
+ "id": 313,
+ "name": "VariableDeclaration",
+ "src": "1412:34:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowed",
+ "storageLocation": "default",
+ "type": "mapping(address => mapping(address => uint256))",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 314,
+ "name": "ElementaryTypeName",
+ "src": "1461:7:0"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 315,
+ "name": "ElementaryTypeName",
+ "src": "1481:7:0"
+ },
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 316,
+ "name": "ElementaryTypeName",
+ "src": "1492:4:0"
+ }
+ ],
+ "id": 317,
+ "name": "Mapping",
+ "src": "1472:25:0"
+ }
+ ],
+ "id": 318,
+ "name": "Mapping",
+ "src": "1452:46:0"
+ }
+ ],
+ "id": 319,
+ "name": "VariableDeclaration",
+ "src": "1452:54:0"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 320,
+ "name": "ElementaryTypeName",
+ "src": "1512:4:0"
+ }
+ ],
+ "id": 321,
+ "name": "VariableDeclaration",
+ "src": "1512:23:0"
+ }
+ ],
+ "id": 322,
+ "name": "ContractDefinition",
+ "src": "86:1452:0"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/Token/Token_v1.sol": {
+ "id": 1,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 324,
+ "name": "PragmaDirective",
+ "src": "0:24:1"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 397
+ ],
+ "name": "Token_v1"
+ },
+ "children": [
+ {
+ "attributes": {
+ "constant": true,
+ "name": "totalSupply",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 325,
+ "name": "ParameterList",
+ "src": "110:2:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "supply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 326,
+ "name": "ElementaryTypeName",
+ "src": "131:4:1"
+ }
+ ],
+ "id": 327,
+ "name": "VariableDeclaration",
+ "src": "131:11:1"
+ }
+ ],
+ "id": 328,
+ "name": "ParameterList",
+ "src": "130:13:1"
+ },
+ {
+ "children": [],
+ "id": 329,
+ "name": "Block",
+ "src": "144:2:1"
+ }
+ ],
+ "id": 330,
+ "name": "FunctionDefinition",
+ "src": "90:56:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "balanceOf",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 331,
+ "name": "ElementaryTypeName",
+ "src": "274:7:1"
+ }
+ ],
+ "id": 332,
+ "name": "VariableDeclaration",
+ "src": "274:14:1"
+ }
+ ],
+ "id": 333,
+ "name": "ParameterList",
+ "src": "273:16:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "balance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 334,
+ "name": "ElementaryTypeName",
+ "src": "308:4:1"
+ }
+ ],
+ "id": 335,
+ "name": "VariableDeclaration",
+ "src": "308:12:1"
+ }
+ ],
+ "id": 336,
+ "name": "ParameterList",
+ "src": "307:14:1"
+ },
+ {
+ "children": [],
+ "id": 337,
+ "name": "Block",
+ "src": "322:2:1"
+ }
+ ],
+ "id": 338,
+ "name": "FunctionDefinition",
+ "src": "255:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transfer",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 339,
+ "name": "ElementaryTypeName",
+ "src": "578:7:1"
+ }
+ ],
+ "id": 340,
+ "name": "VariableDeclaration",
+ "src": "578:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 341,
+ "name": "ElementaryTypeName",
+ "src": "591:4:1"
+ }
+ ],
+ "id": 342,
+ "name": "VariableDeclaration",
+ "src": "591:11:1"
+ }
+ ],
+ "id": 343,
+ "name": "ParameterList",
+ "src": "577:26:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 344,
+ "name": "ElementaryTypeName",
+ "src": "613:4:1"
+ }
+ ],
+ "id": 345,
+ "name": "VariableDeclaration",
+ "src": "613:12:1"
+ }
+ ],
+ "id": 346,
+ "name": "ParameterList",
+ "src": "612:14:1"
+ },
+ {
+ "children": [],
+ "id": 347,
+ "name": "Block",
+ "src": "627:2:1"
+ }
+ ],
+ "id": 348,
+ "name": "FunctionDefinition",
+ "src": "560:69:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 349,
+ "name": "ElementaryTypeName",
+ "src": "972:7:1"
+ }
+ ],
+ "id": 350,
+ "name": "VariableDeclaration",
+ "src": "972:13:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 351,
+ "name": "ElementaryTypeName",
+ "src": "987:7:1"
+ }
+ ],
+ "id": 352,
+ "name": "VariableDeclaration",
+ "src": "987:11:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 353,
+ "name": "ElementaryTypeName",
+ "src": "1000:4:1"
+ }
+ ],
+ "id": 354,
+ "name": "VariableDeclaration",
+ "src": "1000:11:1"
+ }
+ ],
+ "id": 355,
+ "name": "ParameterList",
+ "src": "971:41:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 356,
+ "name": "ElementaryTypeName",
+ "src": "1022:4:1"
+ }
+ ],
+ "id": 357,
+ "name": "VariableDeclaration",
+ "src": "1022:12:1"
+ }
+ ],
+ "id": 358,
+ "name": "ParameterList",
+ "src": "1021:14:1"
+ },
+ {
+ "children": [],
+ "id": 359,
+ "name": "Block",
+ "src": "1036:2:1"
+ }
+ ],
+ "id": 360,
+ "name": "FunctionDefinition",
+ "src": "950:88:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "approve",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 361,
+ "name": "ElementaryTypeName",
+ "src": "1338:7:1"
+ }
+ ],
+ "id": 362,
+ "name": "VariableDeclaration",
+ "src": "1338:16:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 363,
+ "name": "ElementaryTypeName",
+ "src": "1356:4:1"
+ }
+ ],
+ "id": 364,
+ "name": "VariableDeclaration",
+ "src": "1356:11:1"
+ }
+ ],
+ "id": 365,
+ "name": "ParameterList",
+ "src": "1337:31:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "success",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 366,
+ "name": "ElementaryTypeName",
+ "src": "1378:4:1"
+ }
+ ],
+ "id": 367,
+ "name": "VariableDeclaration",
+ "src": "1378:12:1"
+ }
+ ],
+ "id": 368,
+ "name": "ParameterList",
+ "src": "1377:14:1"
+ },
+ {
+ "children": [],
+ "id": 369,
+ "name": "Block",
+ "src": "1392:2:1"
+ }
+ ],
+ "id": 370,
+ "name": "FunctionDefinition",
+ "src": "1321:73:1"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "allowance",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 371,
+ "name": "ElementaryTypeName",
+ "src": "1621:7:1"
+ }
+ ],
+ "id": 372,
+ "name": "VariableDeclaration",
+ "src": "1621:14:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 373,
+ "name": "ElementaryTypeName",
+ "src": "1637:7:1"
+ }
+ ],
+ "id": 374,
+ "name": "VariableDeclaration",
+ "src": "1637:16:1"
+ }
+ ],
+ "id": 375,
+ "name": "ParameterList",
+ "src": "1620:34:1"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "remaining",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 376,
+ "name": "ElementaryTypeName",
+ "src": "1673:4:1"
+ }
+ ],
+ "id": 377,
+ "name": "VariableDeclaration",
+ "src": "1673:14:1"
+ }
+ ],
+ "id": 378,
+ "name": "ParameterList",
+ "src": "1672:16:1"
+ },
+ {
+ "children": [],
+ "id": 379,
+ "name": "Block",
+ "src": "1689:2:1"
+ }
+ ],
+ "id": 380,
+ "name": "FunctionDefinition",
+ "src": "1602:89:1"
+ },
+ {
+ "attributes": {
+ "name": "Transfer"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 381,
+ "name": "ElementaryTypeName",
+ "src": "1712:7:1"
+ }
+ ],
+ "id": 382,
+ "name": "VariableDeclaration",
+ "src": "1712:21:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 383,
+ "name": "ElementaryTypeName",
+ "src": "1735:7:1"
+ }
+ ],
+ "id": 384,
+ "name": "VariableDeclaration",
+ "src": "1735:19:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 385,
+ "name": "ElementaryTypeName",
+ "src": "1756:4:1"
+ }
+ ],
+ "id": 386,
+ "name": "VariableDeclaration",
+ "src": "1756:11:1"
+ }
+ ],
+ "id": 387,
+ "name": "ParameterList",
+ "src": "1711:57:1"
+ }
+ ],
+ "id": 388,
+ "name": "EventDefinition",
+ "src": "1697:72:1"
+ },
+ {
+ "attributes": {
+ "name": "Approval"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_owner",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 389,
+ "name": "ElementaryTypeName",
+ "src": "1789:7:1"
+ }
+ ],
+ "id": 390,
+ "name": "VariableDeclaration",
+ "src": "1789:22:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": true,
+ "name": "_spender",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 391,
+ "name": "ElementaryTypeName",
+ "src": "1813:7:1"
+ }
+ ],
+ "id": 392,
+ "name": "VariableDeclaration",
+ "src": "1813:24:1"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "indexed": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 393,
+ "name": "ElementaryTypeName",
+ "src": "1839:4:1"
+ }
+ ],
+ "id": 394,
+ "name": "VariableDeclaration",
+ "src": "1839:11:1"
+ }
+ ],
+ "id": 395,
+ "name": "ParameterList",
+ "src": "1788:63:1"
+ }
+ ],
+ "id": 396,
+ "name": "EventDefinition",
+ "src": "1774:78:1"
+ }
+ ],
+ "id": 397,
+ "name": "ContractDefinition",
+ "src": "26:1828:1"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol": {
+ "id": 2,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "^",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 33,
+ "name": "PragmaDirective",
+ "src": "580:24:2"
+ },
+ {
+ "attributes": {
+ "file": "../ERC20Token/ERC20Token_v1.sol"
+ },
+ "id": 35,
+ "name": "ImportDirective",
+ "src": "606:78:2"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 124,
+ 322,
+ 397
+ ],
+ "name": "UnlimitedAllowanceToken_v1"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "ERC20Token"
+ },
+ "id": 36,
+ "name": "UserDefinedTypeName",
+ "src": "725:10:2"
+ }
+ ],
+ "id": 37,
+ "name": "InheritanceSpecifier",
+ "src": "725:10:2"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "MAX_UINT",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 38,
+ "name": "ElementaryTypeName",
+ "src": "743:4:2"
+ },
+ {
+ "attributes": {
+ "operator": "-",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639935"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 115792089237316195423570985008687907853269984665640564039457584007913129639936"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "32",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 2",
+ "value": "2"
+ },
+ "id": 39,
+ "name": "Literal",
+ "src": "768:1:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "323536",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 256",
+ "value": "256"
+ },
+ "id": 40,
+ "name": "Literal",
+ "src": "771:3:2"
+ }
+ ],
+ "id": 41,
+ "name": "BinaryOperation",
+ "src": "768:6:2"
+ },
+ {
+ "attributes": {
+ "hexvalue": "31",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 1",
+ "value": "1"
+ },
+ "id": 42,
+ "name": "Literal",
+ "src": "777:1:2"
+ }
+ ],
+ "id": 43,
+ "name": "BinaryOperation",
+ "src": "768:10:2"
+ }
+ ],
+ "id": 44,
+ "name": "VariableDeclaration",
+ "src": "743:35:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "transferFrom",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_from",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 45,
+ "name": "ElementaryTypeName",
+ "src": "1088:7:2"
+ }
+ ],
+ "id": 46,
+ "name": "VariableDeclaration",
+ "src": "1088:13:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_to",
+ "storageLocation": "default",
+ "type": "address",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "address"
+ },
+ "id": 47,
+ "name": "ElementaryTypeName",
+ "src": "1103:7:2"
+ }
+ ],
+ "id": 48,
+ "name": "VariableDeclaration",
+ "src": "1103:11:2"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "_value",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 49,
+ "name": "ElementaryTypeName",
+ "src": "1116:4:2"
+ }
+ ],
+ "id": 50,
+ "name": "VariableDeclaration",
+ "src": "1116:11:2"
+ }
+ ],
+ "id": 51,
+ "name": "ParameterList",
+ "src": "1087:41:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "",
+ "storageLocation": "default",
+ "type": "bool",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "bool"
+ },
+ "id": 52,
+ "name": "ElementaryTypeName",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 53,
+ "name": "VariableDeclaration",
+ "src": "1161:4:2"
+ }
+ ],
+ "id": 54,
+ "name": "ParameterList",
+ "src": "1160:6:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "constant": false,
+ "name": "allowance",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "internal"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 55,
+ "name": "ElementaryTypeName",
+ "src": "1181:4:2"
+ }
+ ],
+ "id": 56,
+ "name": "VariableDeclaration",
+ "src": "1181:14:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 57,
+ "name": "Identifier",
+ "src": "1198:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 58,
+ "name": "Identifier",
+ "src": "1206:5:2"
+ }
+ ],
+ "id": 59,
+ "name": "IndexAccess",
+ "src": "1198:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 60,
+ "name": "Identifier",
+ "src": "1213:3:2"
+ }
+ ],
+ "id": 61,
+ "name": "MemberAccess",
+ "src": "1213:10:2"
+ }
+ ],
+ "id": 62,
+ "name": "IndexAccess",
+ "src": "1198:26:2"
+ }
+ ],
+ "id": 63,
+ "name": "VariableDeclarationStatement",
+ "src": "1181:43:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "&&",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 64,
+ "name": "Identifier",
+ "src": "1238:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 65,
+ "name": "Identifier",
+ "src": "1247:5:2"
+ }
+ ],
+ "id": 66,
+ "name": "IndexAccess",
+ "src": "1238:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 67,
+ "name": "Identifier",
+ "src": "1257:6:2"
+ }
+ ],
+ "id": 68,
+ "name": "BinaryOperation",
+ "src": "1238:25:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 69,
+ "name": "Identifier",
+ "src": "1279:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 70,
+ "name": "Identifier",
+ "src": "1292:6:2"
+ }
+ ],
+ "id": 71,
+ "name": "BinaryOperation",
+ "src": "1279:19:2"
+ }
+ ],
+ "id": 72,
+ "name": "BinaryOperation",
+ "src": "1238:60:2"
+ },
+ {
+ "attributes": {
+ "operator": ">=",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "operator": "+",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 73,
+ "name": "Identifier",
+ "src": "1314:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 74,
+ "name": "Identifier",
+ "src": "1323:3:2"
+ }
+ ],
+ "id": 75,
+ "name": "IndexAccess",
+ "src": "1314:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 76,
+ "name": "Identifier",
+ "src": "1330:6:2"
+ }
+ ],
+ "id": 77,
+ "name": "BinaryOperation",
+ "src": "1314:22:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 78,
+ "name": "Identifier",
+ "src": "1340:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 79,
+ "name": "Identifier",
+ "src": "1349:3:2"
+ }
+ ],
+ "id": 80,
+ "name": "IndexAccess",
+ "src": "1340:13:2"
+ }
+ ],
+ "id": 81,
+ "name": "BinaryOperation",
+ "src": "1314:39:2"
+ }
+ ],
+ "id": 82,
+ "name": "BinaryOperation",
+ "src": "1238:115:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "+=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 83,
+ "name": "Identifier",
+ "src": "1378:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 84,
+ "name": "Identifier",
+ "src": "1387:3:2"
+ }
+ ],
+ "id": 85,
+ "name": "IndexAccess",
+ "src": "1378:13:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 86,
+ "name": "Identifier",
+ "src": "1395:6:2"
+ }
+ ],
+ "id": 87,
+ "name": "Assignment",
+ "src": "1378:23:2"
+ }
+ ],
+ "id": 88,
+ "name": "ExpressionStatement",
+ "src": "1378:23:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 89,
+ "name": "Identifier",
+ "src": "1415:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 90,
+ "name": "Identifier",
+ "src": "1424:5:2"
+ }
+ ],
+ "id": 91,
+ "name": "IndexAccess",
+ "src": "1415:15:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 92,
+ "name": "Identifier",
+ "src": "1434:6:2"
+ }
+ ],
+ "id": 93,
+ "name": "Assignment",
+ "src": "1415:25:2"
+ }
+ ],
+ "id": 94,
+ "name": "ExpressionStatement",
+ "src": "1415:25:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "<",
+ "type": "bool"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "allowance"
+ },
+ "id": 95,
+ "name": "Identifier",
+ "src": "1458:9:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "MAX_UINT"
+ },
+ "id": 96,
+ "name": "Identifier",
+ "src": "1470:8:2"
+ }
+ ],
+ "id": 97,
+ "name": "BinaryOperation",
+ "src": "1458:20:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "-=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => mapping(address => uint256))",
+ "value": "allowed"
+ },
+ "id": 98,
+ "name": "Identifier",
+ "src": "1498:7:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 99,
+ "name": "Identifier",
+ "src": "1506:5:2"
+ }
+ ],
+ "id": 102,
+ "name": "IndexAccess",
+ "src": "1498:14:2"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 100,
+ "name": "Identifier",
+ "src": "1513:3:2"
+ }
+ ],
+ "id": 101,
+ "name": "MemberAccess",
+ "src": "1513:10:2"
+ }
+ ],
+ "id": 103,
+ "name": "IndexAccess",
+ "src": "1498:26:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 104,
+ "name": "Identifier",
+ "src": "1528:6:2"
+ }
+ ],
+ "id": 105,
+ "name": "Assignment",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 106,
+ "name": "ExpressionStatement",
+ "src": "1498:36:2"
+ }
+ ],
+ "id": 107,
+ "name": "Block",
+ "src": "1480:69:2"
+ }
+ ],
+ "id": 108,
+ "name": "IfStatement",
+ "src": "1454:95:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "type": "tuple()",
+ "type_conversion": false
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "function (address,address,uint256) constant",
+ "value": "Transfer"
+ },
+ "id": 109,
+ "name": "Identifier",
+ "src": "1562:8:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_from"
+ },
+ "id": 110,
+ "name": "Identifier",
+ "src": "1571:5:2"
+ },
+ {
+ "attributes": {
+ "type": "address",
+ "value": "_to"
+ },
+ "id": 111,
+ "name": "Identifier",
+ "src": "1578:3:2"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "_value"
+ },
+ "id": 112,
+ "name": "Identifier",
+ "src": "1583:6:2"
+ }
+ ],
+ "id": 113,
+ "name": "FunctionCall",
+ "src": "1562:28:2"
+ }
+ ],
+ "id": 114,
+ "name": "ExpressionStatement",
+ "src": "1562:28:2"
+ },
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "74727565",
+ "subdenomination": null,
+ "token": "true",
+ "type": "bool",
+ "value": "true"
+ },
+ "id": 115,
+ "name": "Literal",
+ "src": "1611:4:2"
+ }
+ ],
+ "id": 116,
+ "name": "Return",
+ "src": "1604:11:2"
+ }
+ ],
+ "id": 117,
+ "name": "Block",
+ "src": "1364:262:2"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "66616c7365",
+ "subdenomination": null,
+ "token": "false",
+ "type": "bool",
+ "value": "false"
+ },
+ "id": 118,
+ "name": "Literal",
+ "src": "1653:5:2"
+ }
+ ],
+ "id": 119,
+ "name": "Return",
+ "src": "1646:12:2"
+ }
+ ],
+ "id": 120,
+ "name": "Block",
+ "src": "1632:37:2"
+ }
+ ],
+ "id": 121,
+ "name": "IfStatement",
+ "src": "1234:435:2"
+ }
+ ],
+ "id": 122,
+ "name": "Block",
+ "src": "1171:504:2"
+ }
+ ],
+ "id": 123,
+ "name": "FunctionDefinition",
+ "src": "1066:609:2"
+ }
+ ],
+ "id": 124,
+ "name": "ContractDefinition",
+ "src": "686:991:2"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ },
+ "2.0.0/tokens/ZRXToken/ZRXToken.sol": {
+ "id": 3,
+ "legacyAST": {
+ "children": [
+ {
+ "attributes": {
+ "literals": [
+ "solidity",
+ "0.4",
+ ".11"
+ ]
+ },
+ "id": 1,
+ "name": "PragmaDirective",
+ "src": "580:23:3"
+ },
+ {
+ "attributes": {
+ "file": "../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol"
+ },
+ "id": 3,
+ "name": "ImportDirective",
+ "src": "650:142:3"
+ },
+ {
+ "attributes": {
+ "fullyImplemented": true,
+ "isLibrary": false,
+ "linearizedBaseContracts": [
+ 31,
+ 124,
+ 322,
+ 397
+ ],
+ "name": "ZRXToken"
+ },
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "name": "UnlimitedAllowanceToken"
+ },
+ "id": 4,
+ "name": "UserDefinedTypeName",
+ "src": "816:23:3"
+ }
+ ],
+ "id": 5,
+ "name": "InheritanceSpecifier",
+ "src": "816:23:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "decimals",
+ "storageLocation": "default",
+ "type": "uint8",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint8"
+ },
+ "id": 6,
+ "name": "ElementaryTypeName",
+ "src": "891:5:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3138",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 18",
+ "value": "18"
+ },
+ "id": 7,
+ "name": "Literal",
+ "src": "924:2:3"
+ }
+ ],
+ "id": 8,
+ "name": "VariableDeclaration",
+ "src": "891:35:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "totalSupply",
+ "storageLocation": "default",
+ "type": "uint256",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "uint"
+ },
+ "id": 9,
+ "name": "ElementaryTypeName",
+ "src": "932:4:3"
+ },
+ {
+ "attributes": {
+ "operator": "**",
+ "type": "int_const 1000000000000000000000000000"
+ },
+ "children": [
+ {
+ "attributes": {
+ "hexvalue": "3130",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 10",
+ "value": "10"
+ },
+ "id": 10,
+ "name": "Literal",
+ "src": "958:2:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "3237",
+ "subdenomination": null,
+ "token": null,
+ "type": "int_const 27",
+ "value": "27"
+ },
+ "id": 11,
+ "name": "Literal",
+ "src": "962:2:3"
+ }
+ ],
+ "id": 12,
+ "name": "BinaryOperation",
+ "src": "958:6:3"
+ }
+ ],
+ "id": 13,
+ "name": "VariableDeclaration",
+ "src": "932:32:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "name",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 14,
+ "name": "ElementaryTypeName",
+ "src": "1009:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "30782050726f746f636f6c20546f6b656e",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"0x Protocol Token\"",
+ "value": "0x Protocol Token"
+ },
+ "id": 15,
+ "name": "Literal",
+ "src": "1039:19:3"
+ }
+ ],
+ "id": 16,
+ "name": "VariableDeclaration",
+ "src": "1009:49:3"
+ },
+ {
+ "attributes": {
+ "constant": true,
+ "name": "symbol",
+ "storageLocation": "default",
+ "type": "string memory",
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "attributes": {
+ "name": "string"
+ },
+ "id": 17,
+ "name": "ElementaryTypeName",
+ "src": "1064:6:3"
+ },
+ {
+ "attributes": {
+ "hexvalue": "5a5258",
+ "subdenomination": null,
+ "token": null,
+ "type": "literal_string \"ZRX\"",
+ "value": "ZRX"
+ },
+ "id": 18,
+ "name": "Literal",
+ "src": "1096:5:3"
+ }
+ ],
+ "id": 19,
+ "name": "VariableDeclaration",
+ "src": "1064:37:3"
+ },
+ {
+ "attributes": {
+ "constant": false,
+ "name": "ZRXToken",
+ "payable": false,
+ "visibility": "public"
+ },
+ "children": [
+ {
+ "children": [],
+ "id": 20,
+ "name": "ParameterList",
+ "src": "1167:2:3"
+ },
+ {
+ "children": [],
+ "id": 21,
+ "name": "ParameterList",
+ "src": "1189:0:3"
+ },
+ {
+ "children": [
+ {
+ "children": [
+ {
+ "attributes": {
+ "operator": "=",
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "uint256"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "mapping(address => uint256)",
+ "value": "balances"
+ },
+ "id": 22,
+ "name": "Identifier",
+ "src": "1199:8:3"
+ },
+ {
+ "attributes": {
+ "member_name": "sender",
+ "type": "address"
+ },
+ "children": [
+ {
+ "attributes": {
+ "type": "msg",
+ "value": "msg"
+ },
+ "id": 23,
+ "name": "Identifier",
+ "src": "1208:3:3"
+ }
+ ],
+ "id": 24,
+ "name": "MemberAccess",
+ "src": "1208:10:3"
+ }
+ ],
+ "id": 25,
+ "name": "IndexAccess",
+ "src": "1199:20:3"
+ },
+ {
+ "attributes": {
+ "type": "uint256",
+ "value": "totalSupply"
+ },
+ "id": 26,
+ "name": "Identifier",
+ "src": "1222:11:3"
+ }
+ ],
+ "id": 27,
+ "name": "Assignment",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 28,
+ "name": "ExpressionStatement",
+ "src": "1199:34:3"
+ }
+ ],
+ "id": 29,
+ "name": "Block",
+ "src": "1189:51:3"
+ }
+ ],
+ "id": 30,
+ "name": "FunctionDefinition",
+ "src": "1150:90:3"
+ }
+ ],
+ "id": 31,
+ "name": "ContractDefinition",
+ "src": "795:447:3"
+ }
+ ],
+ "name": "SourceUnit"
+ }
+ }
+ },
+ "sourceCodes": {
+ "1.0.0/ERC20Token/ERC20Token_v1.sol": "pragma solidity ^0.4.11;\n\nimport { Token_v1 as Token } from \"../Token/Token_v1.sol\";\n\ncontract ERC20Token_v1 is Token {\n\n function transfer(address _to, uint _value) returns (bool) {\n //Default assumes totalSupply can't be over max (2^256 - 1).\n if (balances[msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[msg.sender] -= _value;\n balances[_to] += _value;\n Transfer(msg.sender, _to, _value);\n return true;\n } else { return false; }\n }\n\n function transferFrom(address _from, address _to, uint _value) returns (bool) {\n if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value >= balances[_to]) {\n balances[_to] += _value;\n balances[_from] -= _value;\n allowed[_from][msg.sender] -= _value;\n Transfer(_from, _to, _value);\n return true;\n } else { return false; }\n }\n\n function balanceOf(address _owner) constant returns (uint) {\n return balances[_owner];\n }\n\n function approve(address _spender, uint _value) returns (bool) {\n allowed[msg.sender][_spender] = _value;\n Approval(msg.sender, _spender, _value);\n return true;\n }\n\n function allowance(address _owner, address _spender) constant returns (uint) {\n return allowed[_owner][_spender];\n }\n\n mapping (address => uint) balances;\n mapping (address => mapping (address => uint)) allowed;\n uint public totalSupply;\n}\n",
+ "1.0.0/Token/Token_v1.sol": "pragma solidity ^0.4.11;\n\ncontract Token_v1 {\n\n /// @return total amount of tokens\n function totalSupply() constant returns (uint supply) {}\n\n /// @param _owner The address from which the balance will be retrieved\n /// @return The balance\n function balanceOf(address _owner) constant returns (uint balance) {}\n\n /// @notice send `_value` token to `_to` from `msg.sender`\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transfer(address _to, uint _value) returns (bool success) {}\n\n /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`\n /// @param _from The address of the sender\n /// @param _to The address of the recipient\n /// @param _value The amount of token to be transferred\n /// @return Whether the transfer was successful or not\n function transferFrom(address _from, address _to, uint _value) returns (bool success) {}\n\n /// @notice `msg.sender` approves `_addr` to spend `_value` tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @param _value The amount of wei to be approved for transfer\n /// @return Whether the approval was successful or not\n function approve(address _spender, uint _value) returns (bool success) {}\n\n /// @param _owner The address of the account owning tokens\n /// @param _spender The address of the account able to transfer the tokens\n /// @return Amount of remaining tokens allowed to spent\n function allowance(address _owner, address _spender) constant returns (uint remaining) {}\n\n event Transfer(address indexed _from, address indexed _to, uint _value);\n event Approval(address indexed _owner, address indexed _spender, uint _value);\n}\n\n",
+ "1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.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 solidity ^0.4.11;\n\nimport { ERC20Token_v1 as ERC20Token } from \"../ERC20Token/ERC20Token_v1.sol\";\n\ncontract UnlimitedAllowanceToken_v1 is ERC20Token {\n\n uint constant MAX_UINT = 2**256 - 1;\n\n /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited allowance.\n /// @param _from Address to transfer from.\n /// @param _to Address to transfer to.\n /// @param _value Amount to transfer.\n /// @return Success of transfer.\n function transferFrom(address _from, address _to, uint _value)\n public\n returns (bool)\n {\n uint allowance = allowed[_from][msg.sender];\n if (balances[_from] >= _value\n && allowance >= _value\n && balances[_to] + _value >= balances[_to]\n ) {\n balances[_to] += _value;\n balances[_from] -= _value;\n if (allowance < MAX_UINT) {\n allowed[_from][msg.sender] -= _value;\n }\n Transfer(_from, _to, _value);\n return true;\n } else {\n return false;\n }\n }\n}\n",
+ "2.0.0/tokens/ZRXToken/ZRXToken.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 solidity 0.4.11;\n\n// solhint-disable-next-line max-line-length\nimport { UnlimitedAllowanceToken_v1 as UnlimitedAllowanceToken } from \"../../../1.0.0/UnlimitedAllowanceToken/UnlimitedAllowanceToken_v1.sol\";\n\n\ncontract ZRXToken is UnlimitedAllowanceToken {\n\n // solhint-disable const-name-snakecase\n uint8 constant public decimals = 18;\n uint public totalSupply = 10**27; // 1 billion tokens, 18 decimal places\n string constant public name = \"0x Protocol Token\";\n string constant public symbol = \"ZRX\";\n // solhint-enableconst-name-snakecase\n\n function ZRXToken()\n public\n {\n balances[msg.sender] = totalSupply;\n }\n}\n"
+ },
+ "sourceTreeHashHex": "0xbcce67d129fe53ddb9717b4f567b33108c41a4f4324aa47ac609037e41f5b95d",
+ "compiler": {
+ "name": "solc",
+ "version": "soljson-v0.4.11+commit.68ef5810.js",
+ "settings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+ },
+ "networks": {
+ "50": {
+ "address": "0x871dd7c2b4b25e1aa18728e9d5f2af4c4e431f5c",
+ "links": {},
+ "constructorArgs": "[]"
+ }
+ }
+} \ No newline at end of file
diff --git a/packages/migrations/compiler.json b/packages/migrations/compiler.json
new file mode 100644
index 000000000..493a73d46
--- /dev/null
+++ b/packages/migrations/compiler.json
@@ -0,0 +1,20 @@
+{
+ "contractsDir": "../contracts/src/",
+ "compilerSettings": {
+ "optimizer": {
+ "enabled": true,
+ "runs": 1000000
+ },
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+}
diff --git a/packages/migrations/package.json b/packages/migrations/package.json
new file mode 100644
index 000000000..d496393f7
--- /dev/null
+++ b/packages/migrations/package.json
@@ -0,0 +1,74 @@
+{
+ "name": "@0xproject/migrations",
+ "version": "1.0.4",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "0x smart contract migrations",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
+ "pre_build": "run-s copy_artifacts generate_contract_wrappers",
+ "copy_artifacts": "copyfiles 'artifacts/**/*' ./lib",
+ "clean": "shx rm -rf lib src/1.0.0/contract_wrappers src/2.0.0/contract_wrappers src/2.0.0-beta-testnet/contract_wrappers",
+ "lint": "tslint --project . --exclude **/src/v2/contract_wrappers/**/* --exclude **/src/v1/contract_wrappers/**/*",
+ "migrate:v1": "run-s build compile:v1 script:migrate:v1",
+ "migrate:v2": "run-s build compile:v2 script:migrate:v2",
+ "migrate:v2-beta-testnet": "run-s build compile:v2-beta-testnet script:migrate:v2-beta-testnet",
+ "script:migrate:v1": "node ./lib/migrate.js --contracts-version 1.0.0",
+ "script:migrate:v2": "node ./lib/migrate.js --contracts-version 2.0.0",
+ "script:migrate:v2-beta-testnet": "node ./lib/migrate.js --contracts-version 2.0.0-beta-testnet",
+ "generate_contract_wrappers": "run-p generate_contract_wrappers:*",
+ "generate_contract_wrappers:v1": "abi-gen --abis ${npm_package_config_abis_v1} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/1.0.0/contract_wrappers --backend ethers",
+ "generate_contract_wrappers:v2": "abi-gen --abis ${npm_package_config_abis_v2} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0/contract_wrappers --backend ethers",
+ "generate_contract_wrappers:v2-beta-testnet": "abi-gen --abis ${npm_package_config_abis_v2BetaTestnet} --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/2.0.0-beta-testnet/contract_wrappers --backend ethers",
+ "compile:v1": "sol-compiler --artifacts-dir artifacts/1.0.0 --contracts Exchange_v1,DummyERC20Token,ZRXToken,WETH9,TokenTransferProxy_v1,MultiSigWallet,MultiSigWalletWithTimeLock,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,TokenRegistry",
+ "compile:v2": "sol-compiler --artifacts-dir artifacts/2.0.0 --contracts ERC20Token,DummyERC20Token,ERC721Token,DummyERC721Token,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,ZRXToken,WETH9,IWallet,IValidator",
+ "compile:v2-beta-testnet": "sol-compiler --artifacts-dir artifacts/2.0.0-beta-testnet --contracts AssetProxyOwner,ERC20Proxy,ERC721Proxy,Exchange,Forwarder,IWallet,IValidator,ERC20Token,ERC721Token"
+ },
+ "config": {
+ "abis": {
+ "v1": "artifacts/1.0.0/@(DummyERC20Token|TokenTransferProxy_v1|Exchange_v1|TokenRegistry|MultiSigWallet|MultiSigWalletWithTimeLock|MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress|TokenRegistry|ZRXToken|WETH9).json",
+ "v2": "artifacts/2.0.0/@(ERC20Token|DummyERC20Token|ERC721Token|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|ZRXToken|WETH9|IWallet|IValidator).json",
+ "v2BetaTestnet": "artifacts/2.0.0-beta-testnet/@(ERC20Token|ERC721Token|ERC20Proxy|ERC721Proxy|Exchange|Forwarder|AssetProxyOwner|IWallet|IValidator).json"
+ }
+ },
+ "license": "Apache-2.0",
+ "devDependencies": {
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@types/yargs": "^10.0.0",
+ "copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "npm-run-all": "^4.1.2",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2",
+ "yargs": "^10.0.3"
+ },
+ "dependencies": {
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@ledgerhq/hw-app-eth": "^4.3.0",
+ "ethereum-types": "^1.0.4",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
+ },
+ "optionalDependencies": {
+ "@ledgerhq/hw-transport-node-hid": "^4.3.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/migrations/src/1.0.0/artifacts.ts b/packages/migrations/src/1.0.0/artifacts.ts
new file mode 100644
index 000000000..d0a9f735a
--- /dev/null
+++ b/packages/migrations/src/1.0.0/artifacts.ts
@@ -0,0 +1,21 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as DummyERC20Token from '../../artifacts/1.0.0/DummyERC20Token.json';
+import * as Exchange from '../../artifacts/1.0.0/Exchange_v1.json';
+import * as MultiSigWalletWithTimeLock from '../../artifacts/1.0.0/MultiSigWalletWithTimeLock.json';
+import * as MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress from '../../artifacts/1.0.0/MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress.json';
+import * as TokenRegistry from '../../artifacts/1.0.0/TokenRegistry.json';
+import * as TokenTransferProxy from '../../artifacts/1.0.0/TokenTransferProxy_v1.json';
+import * as EtherToken from '../../artifacts/1.0.0/WETH9.json';
+import * as ZRX from '../../artifacts/1.0.0/ZRXToken.json';
+
+export const artifacts = {
+ ZRX: (ZRX as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ EtherToken: (EtherToken as any) as ContractArtifact,
+ TokenRegistry: (TokenRegistry as any) as ContractArtifact,
+ TokenTransferProxy: (TokenTransferProxy as any) as ContractArtifact,
+ MultiSigWalletWithTimeLock: (MultiSigWalletWithTimeLock as any) as ContractArtifact,
+ MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress: (MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress as any) as ContractArtifact,
+};
diff --git a/packages/migrations/src/1.0.0/migration.ts b/packages/migrations/src/1.0.0/migration.ts
new file mode 100644
index 000000000..0a3c25ae1
--- /dev/null
+++ b/packages/migrations/src/1.0.0/migration.ts
@@ -0,0 +1,142 @@
+import { BigNumber, NULL_BYTES } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TxData } from 'ethereum-types';
+
+import { ArtifactWriter } from '../utils/artifact_writer';
+import { erc20TokenInfo } from '../utils/token_info';
+
+import { artifacts } from './artifacts';
+import { DummyERC20TokenContract } from './contract_wrappers/dummy_erc20_token';
+import { Exchange_v1Contract } from './contract_wrappers/exchange_v1';
+import { MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract } from './contract_wrappers/multi_sig_wallet_with_time_lock_except_remove_authorized_address';
+import { TokenRegistryContract } from './contract_wrappers/token_registry';
+import { TokenTransferProxy_v1Contract } from './contract_wrappers/tokentransferproxy_v1';
+import { WETH9Contract } from './contract_wrappers/weth9';
+import { ZRXTokenContract } from './contract_wrappers/zrx_token';
+
+/**
+ * Custom migrations should be defined in this function. This will be called with the CLI 'migrate:v1' command.
+ * Migrations could be written to run in parallel, but if you want contract addresses to be created deterministically,
+ * the migration should be written to run synchronously.
+ * @param provider Web3 provider instance.
+ * @param artifactsDir The directory with compiler artifact files.
+ * @param txDefaults Default transaction values to use when deploying contracts.
+ */
+export const runV1MigrationsAsync = async (provider: Provider, artifactsDir: string, txDefaults: Partial<TxData>) => {
+ const web3Wrapper = new Web3Wrapper(provider);
+ const networkId = await web3Wrapper.getNetworkIdAsync();
+ const artifactsWriter = new ArtifactWriter(artifactsDir, networkId);
+ const tokenTransferProxy = await TokenTransferProxy_v1Contract.deployFrom0xArtifactAsync(
+ artifacts.TokenTransferProxy,
+ provider,
+ txDefaults,
+ );
+ artifactsWriter.saveArtifact(tokenTransferProxy);
+ const zrxToken = await ZRXTokenContract.deployFrom0xArtifactAsync(artifacts.ZRX, provider, txDefaults);
+ artifactsWriter.saveArtifact(zrxToken);
+
+ const etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.EtherToken, provider, txDefaults);
+ artifactsWriter.saveArtifact(etherToken);
+ const tokenReg = await TokenRegistryContract.deployFrom0xArtifactAsync(
+ artifacts.TokenRegistry,
+ provider,
+ txDefaults,
+ );
+ artifactsWriter.saveArtifact(tokenReg);
+
+ const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
+ const owners = [accounts[0], accounts[1]];
+ const confirmationsRequired = new BigNumber(2);
+ const secondsRequired = new BigNumber(0);
+ const exchange = await Exchange_v1Contract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ zrxToken.address,
+ tokenTransferProxy.address,
+ );
+ artifactsWriter.saveArtifact(exchange);
+ const multiSig = await MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddressContract.deployFrom0xArtifactAsync(
+ artifacts.MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress,
+ provider,
+ txDefaults,
+ owners,
+ confirmationsRequired,
+ secondsRequired,
+ tokenTransferProxy.address,
+ );
+ artifactsWriter.saveArtifact(multiSig);
+
+ const owner = accounts[0];
+
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenTransferProxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, { from: owner }),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenTransferProxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: owner }),
+ );
+ const addTokenGasEstimate = await tokenReg.addToken.estimateGasAsync(
+ zrxToken.address,
+ erc20TokenInfo[0].name,
+ erc20TokenInfo[0].symbol,
+ erc20TokenInfo[0].decimals,
+ erc20TokenInfo[0].ipfsHash,
+ erc20TokenInfo[0].swarmHash,
+ { from: owner },
+ );
+ const decimals = 18;
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.addToken.sendTransactionAsync(
+ zrxToken.address,
+ '0x Protocol Token',
+ 'ZRX',
+ decimals,
+ NULL_BYTES,
+ NULL_BYTES,
+ {
+ from: owner,
+ gas: addTokenGasEstimate,
+ },
+ ),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.addToken.sendTransactionAsync(
+ etherToken.address,
+ 'Ether Token',
+ 'WETH',
+ decimals,
+ NULL_BYTES,
+ NULL_BYTES,
+ {
+ from: owner,
+ gas: addTokenGasEstimate,
+ },
+ ),
+ );
+ for (const token of erc20TokenInfo) {
+ const totalSupply = new BigNumber(100000000000000000000);
+ const dummyToken = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC20Token,
+ provider,
+ txDefaults,
+ token.name,
+ token.symbol,
+ token.decimals,
+ totalSupply,
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await tokenReg.addToken.sendTransactionAsync(
+ dummyToken.address,
+ token.name,
+ token.symbol,
+ token.decimals,
+ token.ipfsHash,
+ token.swarmHash,
+ {
+ from: owner,
+ gas: addTokenGasEstimate,
+ },
+ ),
+ );
+ }
+};
diff --git a/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts b/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts
new file mode 100644
index 000000000..c9a341eb3
--- /dev/null
+++ b/packages/migrations/src/2.0.0-beta-testnet/artifacts.ts
@@ -0,0 +1,13 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as AssetProxyOwner from '../../artifacts/2.0.0-beta-testnet/AssetProxyOwner.json';
+import * as ERC20Proxy from '../../artifacts/2.0.0-beta-testnet/ERC20Proxy.json';
+import * as ERC721Proxy from '../../artifacts/2.0.0-beta-testnet/ERC721Proxy.json';
+import * as Exchange from '../../artifacts/2.0.0-beta-testnet/Exchange.json';
+
+export const artifacts = {
+ AssetProxyOwner: (AssetProxyOwner as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ ERC20Proxy: (ERC20Proxy as any) as ContractArtifact,
+ ERC721Proxy: (ERC721Proxy as any) as ContractArtifact,
+};
diff --git a/packages/migrations/src/2.0.0-beta-testnet/migration.ts b/packages/migrations/src/2.0.0-beta-testnet/migration.ts
new file mode 100644
index 000000000..19fe5f02c
--- /dev/null
+++ b/packages/migrations/src/2.0.0-beta-testnet/migration.ts
@@ -0,0 +1,104 @@
+import { assetDataUtils } from '@0xproject/order-utils';
+import { logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TxData } from 'ethereum-types';
+
+import { ArtifactWriter } from '../utils/artifact_writer';
+
+import { constants } from '../utils/constants';
+
+import { artifacts } from './artifacts';
+import { AssetProxyOwnerContract } from './contract_wrappers/asset_proxy_owner';
+import { ERC20ProxyContract } from './contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from './contract_wrappers/erc721_proxy';
+import { ExchangeContract } from './contract_wrappers/exchange';
+
+/**
+ * Custom migrations should be defined in this function. This will be called with the CLI 'migrate:v2-beta-testnet' command.
+ * Migrations could be written to run in parallel, but if you want contract addresses to be created deterministically,
+ * the migration should be written to run synchronously.
+ * @param provider Web3 provider instance.
+ * @param artifactsDir The directory with compiler artifact files.
+ * @param txDefaults Default transaction values to use when deploying contracts.
+ */
+export const runV2TestnetMigrationsAsync = async (
+ provider: Provider,
+ artifactsDir: string,
+ txDefaults: Partial<TxData>,
+) => {
+ const web3Wrapper = new Web3Wrapper(provider);
+ const networkId = await web3Wrapper.getNetworkIdAsync();
+ const artifactsWriter = new ArtifactWriter(artifactsDir, networkId);
+
+ // Deploy AssetProxies
+ const erc20proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(artifacts.ERC20Proxy, provider, txDefaults);
+ artifactsWriter.saveArtifact(erc20proxy);
+ const erc721proxy = await ERC721ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC721Proxy,
+ provider,
+ txDefaults,
+ );
+ artifactsWriter.saveArtifact(erc721proxy);
+
+ // Deploy Exchange
+ const zrxAddressOnKovan = '0x6ff6c0ff1d68b964901f986d4c9fa3ac68346570';
+ const zrxAssetData = assetDataUtils.encodeERC20AssetData(zrxAddressOnKovan);
+ const exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ zrxAssetData,
+ );
+ artifactsWriter.saveArtifact(exchange);
+
+ let txHash;
+ // Register AssetProxies in Exchange
+ txHash = await exchange.registerAssetProxy.sendTransactionAsync(erc20proxy.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Registering ERC20Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ txHash = await exchange.registerAssetProxy.sendTransactionAsync(erc721proxy.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Registering ERC721Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ // Deploy AssetProxyOwner
+ const assetProxyOwner = await AssetProxyOwnerContract.deployFrom0xArtifactAsync(
+ artifacts.AssetProxyOwner,
+ provider,
+ txDefaults,
+ constants.ASSET_PROXY_OWNER_OWNERS,
+ [erc20proxy.address, erc721proxy.address],
+ constants.ASSET_PROXY_OWNER_CONFIRMATIONS,
+ constants.ASSET_PROXY_OWNER_TIMELOCK,
+ );
+ artifactsWriter.saveArtifact(assetProxyOwner);
+
+ // Authorize Exchange contracts to call AssetProxies
+ txHash = await erc20proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Authorizing Exchange on ERC20Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ txHash = await erc721proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Authorizing Exchange on ERC721Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ // Transfer ownership of AssetProxies and Exchange to AssetProxyOwner
+ txHash = await erc20proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Transferring ownership of ERC20Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ txHash = await erc721proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Transferring ownership of ERC721Proxy');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ txHash = await exchange.transferOwnership.sendTransactionAsync(assetProxyOwner.address);
+ logUtils.log(`transactionHash: ${txHash}`);
+ logUtils.log('Transferring ownership of Exchange');
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+};
diff --git a/packages/migrations/src/2.0.0/artifacts.ts b/packages/migrations/src/2.0.0/artifacts.ts
new file mode 100644
index 000000000..8bbd1fcd9
--- /dev/null
+++ b/packages/migrations/src/2.0.0/artifacts.ts
@@ -0,0 +1,23 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as AssetProxyOwner from '../../artifacts/2.0.0/AssetProxyOwner.json';
+import * as DummyERC20Token from '../../artifacts/2.0.0/DummyERC20Token.json';
+import * as DummyERC721Token from '../../artifacts/2.0.0/DummyERC721Token.json';
+import * as ERC20Proxy from '../../artifacts/2.0.0/ERC20Proxy.json';
+import * as ERC721Proxy from '../../artifacts/2.0.0/ERC721Proxy.json';
+import * as Exchange from '../../artifacts/2.0.0/Exchange.json';
+import * as Forwarder from '../../artifacts/2.0.0/Forwarder.json';
+import * as WETH9 from '../../artifacts/2.0.0/WETH9.json';
+import * as ZRX from '../../artifacts/2.0.0/ZRXToken.json';
+
+export const artifacts = {
+ ZRX: (ZRX as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ DummyERC721Token: (DummyERC721Token as any) as ContractArtifact,
+ AssetProxyOwner: (AssetProxyOwner as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ WETH9: (WETH9 as any) as ContractArtifact,
+ ERC20Proxy: (ERC20Proxy as any) as ContractArtifact,
+ ERC721Proxy: (ERC721Proxy as any) as ContractArtifact,
+ Forwarder: (Forwarder as any) as ContractArtifact,
+};
diff --git a/packages/migrations/src/2.0.0/migration.ts b/packages/migrations/src/2.0.0/migration.ts
new file mode 100644
index 000000000..f51c236de
--- /dev/null
+++ b/packages/migrations/src/2.0.0/migration.ts
@@ -0,0 +1,144 @@
+import { assetDataUtils } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider, TxData } from 'ethereum-types';
+
+import { ArtifactWriter } from '../utils/artifact_writer';
+import { erc20TokenInfo, erc721TokenInfo } from '../utils/token_info';
+
+import { artifacts } from './artifacts';
+import { AssetProxyOwnerContract } from './contract_wrappers/asset_proxy_owner';
+import { DummyERC20TokenContract } from './contract_wrappers/dummy_erc20_token';
+import { DummyERC721TokenContract } from './contract_wrappers/dummy_erc721_token';
+import { ERC20ProxyContract } from './contract_wrappers/erc20_proxy';
+import { ERC721ProxyContract } from './contract_wrappers/erc721_proxy';
+import { ExchangeContract } from './contract_wrappers/exchange';
+import { ForwarderContract } from './contract_wrappers/forwarder';
+import { WETH9Contract } from './contract_wrappers/weth9';
+import { ZRXTokenContract } from './contract_wrappers/zrx_token';
+
+/**
+ * Custom migrations should be defined in this function. This will be called with the CLI 'migrate:v2' command.
+ * Migrations could be written to run in parallel, but if you want contract addresses to be created deterministically,
+ * the migration should be written to run synchronously.
+ * @param provider Web3 provider instance.
+ * @param artifactsDir The directory with compiler artifact files.
+ * @param txDefaults Default transaction values to use when deploying contracts.
+ */
+export const runV2MigrationsAsync = async (provider: Provider, artifactsDir: string, txDefaults: Partial<TxData>) => {
+ const web3Wrapper = new Web3Wrapper(provider);
+ const networkId = await web3Wrapper.getNetworkIdAsync();
+ const artifactsWriter = new ArtifactWriter(artifactsDir, networkId);
+
+ // Proxies
+ const erc20proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(artifacts.ERC20Proxy, provider, txDefaults);
+ artifactsWriter.saveArtifact(erc20proxy);
+ const erc721proxy = await ERC721ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC721Proxy,
+ provider,
+ txDefaults,
+ );
+ artifactsWriter.saveArtifact(erc721proxy);
+
+ // ZRX
+ const zrxToken = await ZRXTokenContract.deployFrom0xArtifactAsync(artifacts.ZRX, provider, txDefaults);
+ artifactsWriter.saveArtifact(zrxToken);
+
+ // Ether token
+ const etherToken = await WETH9Contract.deployFrom0xArtifactAsync(artifacts.WETH9, provider, txDefaults);
+ artifactsWriter.saveArtifact(etherToken);
+
+ // Exchange
+ const exchange = await ExchangeContract.deployFrom0xArtifactAsync(
+ artifacts.Exchange,
+ provider,
+ txDefaults,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ );
+ artifactsWriter.saveArtifact(exchange);
+
+ // Multisigs
+ const accounts: string[] = await web3Wrapper.getAvailableAddressesAsync();
+ const owners = [accounts[0], accounts[1]];
+ const confirmationsRequired = new BigNumber(2);
+ const secondsRequired = new BigNumber(0);
+ const owner = accounts[0];
+
+ // AssetProxyOwner
+ const assetProxyOwner = await AssetProxyOwnerContract.deployFrom0xArtifactAsync(
+ artifacts.AssetProxyOwner,
+ provider,
+ txDefaults,
+ owners,
+ [erc20proxy.address, erc721proxy.address],
+ confirmationsRequired,
+ secondsRequired,
+ );
+ artifactsWriter.saveArtifact(assetProxyOwner);
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc20proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address, {
+ from: owner,
+ }),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721proxy.addAuthorizedAddress.sendTransactionAsync(exchange.address, {
+ from: owner,
+ }),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await erc721proxy.transferOwnership.sendTransactionAsync(assetProxyOwner.address, {
+ from: owner,
+ }),
+ );
+
+ // Register the Asset Proxies to the Exchange
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await exchange.registerAssetProxy.sendTransactionAsync(erc20proxy.address),
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(
+ await exchange.registerAssetProxy.sendTransactionAsync(erc721proxy.address),
+ );
+
+ // Dummy ERC20 tokens
+ for (const token of erc20TokenInfo) {
+ const totalSupply = new BigNumber(1000000000000000000000000000);
+ // tslint:disable-next-line:no-unused-variable
+ const dummyErc20Token = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC20Token,
+ provider,
+ txDefaults,
+ token.name,
+ token.symbol,
+ token.decimals,
+ totalSupply,
+ );
+ }
+
+ // ERC721
+ // tslint:disable-next-line:no-unused-variable
+ const cryptoKittieToken = await DummyERC721TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC721Token,
+ provider,
+ txDefaults,
+ erc721TokenInfo[0].name,
+ erc721TokenInfo[0].symbol,
+ );
+
+ // Forwarder
+ const forwarder = await ForwarderContract.deployFrom0xArtifactAsync(
+ artifacts.Forwarder,
+ provider,
+ txDefaults,
+ exchange.address,
+ etherToken.address,
+ zrxToken.address,
+ assetDataUtils.encodeERC20AssetData(zrxToken.address),
+ assetDataUtils.encodeERC20AssetData(etherToken.address),
+ );
+ artifactsWriter.saveArtifact(forwarder);
+};
diff --git a/packages/migrations/src/globals.d.ts b/packages/migrations/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/migrations/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/migrations/src/index.ts b/packages/migrations/src/index.ts
new file mode 100644
index 000000000..188f566df
--- /dev/null
+++ b/packages/migrations/src/index.ts
@@ -0,0 +1,3 @@
+export { runV1MigrationsAsync } from './1.0.0/migration';
+export { runV2MigrationsAsync } from './2.0.0/migration';
+export { runV2TestnetMigrationsAsync } from './2.0.0-beta-testnet/migration';
diff --git a/packages/migrations/src/migrate.ts b/packages/migrations/src/migrate.ts
new file mode 100644
index 000000000..c46d3580a
--- /dev/null
+++ b/packages/migrations/src/migrate.ts
@@ -0,0 +1,61 @@
+#!/usr/bin/env node
+import { devConstants, web3Factory } from '@0xproject/dev-utils';
+import { logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as yargs from 'yargs';
+
+import { runV1MigrationsAsync } from './1.0.0/migration';
+import { runV2TestnetMigrationsAsync } from './2.0.0-beta-testnet/migration';
+import { runV2MigrationsAsync } from './2.0.0/migration';
+
+import { providerFactory } from './utils/provider_factory';
+
+enum ContractVersions {
+ V1 = '1.0.0',
+ V2 = '2.0.0',
+ V2Testnet = '2.0.0-beta-testnet',
+}
+const args = yargs.argv;
+
+(async () => {
+ const contractsVersion = args.contractsVersion;
+ const artifactsDir = `artifacts/${contractsVersion}`;
+ let providerConfigs;
+ let provider: Provider;
+ let txDefaults;
+ switch (contractsVersion) {
+ case ContractVersions.V1:
+ providerConfigs = { shouldUseInProcessGanache: false };
+ provider = web3Factory.getRpcProvider(providerConfigs);
+ txDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+ await runV1MigrationsAsync(provider, artifactsDir, txDefaults);
+ break;
+ case ContractVersions.V2:
+ providerConfigs = { shouldUseInProcessGanache: false };
+ provider = web3Factory.getRpcProvider(providerConfigs);
+ txDefaults = {
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+ await runV2MigrationsAsync(provider, artifactsDir, txDefaults);
+ break;
+ case ContractVersions.V2Testnet:
+ provider = await providerFactory.getLedgerProviderAsync();
+ const web3Wrapper = new Web3Wrapper(provider);
+ const accounts = await web3Wrapper.getAvailableAddressesAsync();
+ txDefaults = {
+ from: accounts[0],
+ gas: devConstants.GAS_LIMIT,
+ };
+ await runV2TestnetMigrationsAsync(provider, artifactsDir, txDefaults);
+ break;
+ default:
+ throw new Error(`Unsupported contract version: ${contractsVersion}`);
+ }
+ process.exit(0);
+})().catch(err => {
+ logUtils.log(err);
+ process.exit(1);
+});
diff --git a/packages/migrations/src/monorepo_scripts/postpublish.ts b/packages/migrations/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/migrations/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/migrations/src/types.ts b/packages/migrations/src/types.ts
new file mode 100644
index 000000000..65f685797
--- /dev/null
+++ b/packages/migrations/src/types.ts
@@ -0,0 +1,29 @@
+import { BigNumber } from '@0xproject/utils';
+
+export interface ERC20Token {
+ address?: string;
+ name: string;
+ symbol: string;
+ decimals: BigNumber;
+ ipfsHash: string;
+ swarmHash: string;
+}
+
+export interface ERC721Token {
+ name: string;
+ symbol: string;
+}
+
+export enum ContractName {
+ TokenTransferProxy = 'TokenTransferProxy',
+ TokenRegistry = 'TokenRegistry',
+ MultiSigWalletWithTimeLock = 'MultiSigWalletWithTimeLock',
+ Exchange = 'Exchange',
+ ZRXToken = 'ZRXToken',
+ DummyToken = 'DummyToken',
+ WETH9 = 'WETH9',
+ MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress = 'MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress',
+ AccountLevels = 'AccountLevels',
+ EtherDelta = 'EtherDelta',
+ Arbitrage = 'Arbitrage',
+}
diff --git a/packages/migrations/src/utils/artifact_writer.ts b/packages/migrations/src/utils/artifact_writer.ts
new file mode 100644
index 000000000..b7522df05
--- /dev/null
+++ b/packages/migrations/src/utils/artifact_writer.ts
@@ -0,0 +1,26 @@
+import { BaseContract } from '@0xproject/base-contract';
+import { ContractArtifact } from '@0xproject/sol-compiler';
+import * as fs from 'fs';
+import * as path from 'path';
+
+export class ArtifactWriter {
+ private readonly _artifactsDir: string;
+ private readonly _networkId: number;
+ constructor(artifactsDir: string, networkId: number) {
+ this._artifactsDir = artifactsDir;
+ this._networkId = networkId;
+ }
+ // This updates the artifact file but does not update the `artifacts` module above. It will not
+ // contain the saved artifact changes.
+ public saveArtifact(contract: BaseContract): void {
+ const contractName = contract.contractName;
+ const artifactFile = path.join(this._artifactsDir, `${contractName}.json`);
+ const artifact: ContractArtifact = JSON.parse(fs.readFileSync(artifactFile).toString());
+ artifact.networks[this._networkId] = {
+ address: contract.address,
+ links: {},
+ constructorArgs: JSON.stringify(contract.constructorArgs),
+ };
+ fs.writeFileSync(artifactFile, JSON.stringify(artifact, null, '\t'));
+ }
+}
diff --git a/packages/migrations/src/utils/constants.ts b/packages/migrations/src/utils/constants.ts
new file mode 100644
index 000000000..4ae2ff833
--- /dev/null
+++ b/packages/migrations/src/utils/constants.ts
@@ -0,0 +1,16 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const constants = {
+ ASSET_PROXY_OWNER_OWNERS: [
+ '0x9df8137872ac09a8fee71d0da5c7539923fb9bf0',
+ '0xcf34d44db312d188789f43a63d11cf2bebb4da15',
+ '0x73fd50f2a6beac9cdac9fe87ef68a18edc415831',
+ ],
+ ASSET_PROXY_OWNER_TIMELOCK: new BigNumber(0),
+ ASSET_PROXY_OWNER_CONFIRMATIONS: new BigNumber(1),
+ ERC20_PROXY_ID: '0xf47261b0',
+ ERC721_PROXY_ID: '0x02571792',
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ KOVAN_RPC_URL: 'https://kovan.infura.io/',
+ KOVAN_NETWORK_ID: 42,
+};
diff --git a/packages/migrations/src/utils/provider_factory.ts b/packages/migrations/src/utils/provider_factory.ts
new file mode 100644
index 000000000..a0d4e436e
--- /dev/null
+++ b/packages/migrations/src/utils/provider_factory.ts
@@ -0,0 +1,27 @@
+import { LedgerEthereumClient, LedgerSubprovider, RPCSubprovider, Web3ProviderEngine } from '@0xproject/subproviders';
+import Eth from '@ledgerhq/hw-app-eth';
+// tslint:disable:no-implicit-dependencies
+import TransportNodeHid from '@ledgerhq/hw-transport-node-hid';
+import { Provider } from 'ethereum-types';
+
+import { constants } from './constants';
+
+async function ledgerEthereumNodeJsClientFactoryAsync(): Promise<LedgerEthereumClient> {
+ const ledgerConnection = await TransportNodeHid.create();
+ const ledgerEthClient = new Eth(ledgerConnection);
+ return ledgerEthClient;
+}
+export const providerFactory = {
+ async getLedgerProviderAsync(): Promise<Provider> {
+ const provider = new Web3ProviderEngine();
+ const ledgerWalletConfigs = {
+ networkId: constants.KOVAN_NETWORK_ID,
+ ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync,
+ };
+ const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs);
+ provider.addProvider(ledgerSubprovider);
+ provider.addProvider(new RPCSubprovider(constants.KOVAN_RPC_URL));
+ provider.start();
+ return provider;
+ },
+};
diff --git a/packages/migrations/src/utils/token_info.ts b/packages/migrations/src/utils/token_info.ts
new file mode 100644
index 000000000..7975c2174
--- /dev/null
+++ b/packages/migrations/src/utils/token_info.ts
@@ -0,0 +1,48 @@
+import { BigNumber, NULL_BYTES } from '@0xproject/utils';
+
+import { ERC20Token, ERC721Token } from '../types';
+
+export const erc20TokenInfo: ERC20Token[] = [
+ {
+ name: 'Augur Reputation Token',
+ symbol: 'REP',
+ decimals: new BigNumber(18),
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
+ },
+ {
+ name: 'Digix DAO Token',
+ symbol: 'DGD',
+ decimals: new BigNumber(18),
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
+ },
+ {
+ name: 'Golem Network Token',
+ symbol: 'GNT',
+ decimals: new BigNumber(18),
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
+ },
+ {
+ name: 'MakerDAO',
+ symbol: 'MKR',
+ decimals: new BigNumber(18),
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
+ },
+ {
+ name: 'Melon Token',
+ symbol: 'MLN',
+ decimals: new BigNumber(18),
+ ipfsHash: NULL_BYTES,
+ swarmHash: NULL_BYTES,
+ },
+];
+
+export const erc721TokenInfo: ERC721Token[] = [
+ {
+ name: 'CryptoKitties',
+ symbol: 'CK',
+ },
+];
diff --git a/packages/migrations/tsconfig.json b/packages/migrations/tsconfig.json
new file mode 100644
index 000000000..f5f4b37c2
--- /dev/null
+++ b/packages/migrations/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/migrations/tslint.json b/packages/migrations/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/migrations/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/monorepo-scripts/CHANGELOG.json b/packages/monorepo-scripts/CHANGELOG.json
index 14292755e..3b8684fab 100644
--- a/packages/monorepo-scripts/CHANGELOG.json
+++ b/packages/monorepo-scripts/CHANGELOG.json
@@ -1,7 +1,129 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532551340,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Fix git remote tag removal step & add an additional sanity assertion",
+ "pr": 803
+ },
+ {
+ "note": "Make PR numbers links on Github releases"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.2.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.2.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529081166,
+ "version": "0.2.0",
+ "changes": [
+ {
+ "note": "Add `prepublish_checks` script",
+ "pr": 650
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.1.20",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.1.19",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.1.18",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.1.17",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
- "version": "0.1.15",
+ "version": "0.1.16",
"changes": [
{
"note": "Dependencies updated"
@@ -15,7 +137,6 @@
"note": "Add postpublish utils"
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
}
]
diff --git a/packages/monorepo-scripts/CHANGELOG.md b/packages/monorepo-scripts/CHANGELOG.md
index 493201541..48b739f0e 100644
--- a/packages/monorepo-scripts/CHANGELOG.md
+++ b/packages/monorepo-scripts/CHANGELOG.md
@@ -1,14 +1,67 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
-## v0.1.15 - _April 2, 2018_
+## v1.0.5 - _August 13, 2018_
* Dependencies updated
-## v0.1.13 - _March 18, 2018_
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Fix git remote tag removal step & add an additional sanity assertion (#803)
+ * Make PR numbers links on Github releases
+
+## v0.2.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.2.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.2.0 - _June 15, 2018_
+
+ * Add `prepublish_checks` script (#650)
+
+## v0.1.20 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.1.19 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.1.18 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.1.17 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.1.16 - _April 2, 2018_
+
+ * Dependencies updated
+
+## v0.1.13 - _March 17, 2018_
* Add postpublish utils
diff --git a/packages/monorepo-scripts/README.md b/packages/monorepo-scripts/README.md
index dbdfdf135..d979e27dc 100644
--- a/packages/monorepo-scripts/README.md
+++ b/packages/monorepo-scripts/README.md
@@ -2,6 +2,14 @@
This repository contains a few helpful scripts for working with this mono repo.
+#### Scripts
+
+**`yarn deps_versions`**: Since we are a Yarn workspaces monorepo, shared dependencies between packages in the monorepo get hoisted to a top-level `node_modules` directory. If two packages use different versions of the same dependency however, both get installed. To avoid having many versions of a dependency installed, we try to keep dependency versions the same across packages in the monorepo. This script will list any dependencies for which we have multiple versions installed. We can then go through them and try to consolidate to a single version where possible.
+
+**`yarn find_unused_deps`**: Sometimes we accidentally leave dependencies listed in `package.json` that are no longer being used. This script finds potential dependencies that might no longer be in use. Please verify that it is no longer in use before removing, the `depcheck` package we use under-the-hood doesn't handle some TS quirks perfectly.
+
+**`yarn test:publish`**: Execute a test-run of the publish script. This dry run won't actually publish, nor will it commit/push anything to Github.
+
## Usage
#### Dependency versions
@@ -16,11 +24,11 @@ This will list out any dependencies that differ in versions between packages.
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -36,14 +44,16 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=@0xproject/monorepo-scripts yarn build
```
-or
+Or continuously rebuild on change:
```bash
-yarn build:watch
+PKG=@0xproject/monorepo-scripts yarn watch
```
### Clean
@@ -57,3 +67,9 @@ yarn clean
```bash
yarn lint
```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/monorepo-scripts/package.json b/packages/monorepo-scripts/package.json
index c453517a1..4d92ed495 100644
--- a/packages/monorepo-scripts/package.json
+++ b/packages/monorepo-scripts/package.json
@@ -1,19 +1,23 @@
{
"name": "@0xproject/monorepo-scripts",
- "version": "0.1.15",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Helper scripts for the monorepo",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "lint": "tslint --project . 'src/**/*.ts'",
- "clean": "shx rm -rf lib",
+ "watch_without_deps": "tsc -w",
"build": "tsc",
+ "lint": "tslint --project .",
+ "clean": "shx rm -rf lib",
"test:publish": "run-s build script:publish",
- "convert_changelogs": "run-s build script:convert_changelogs",
+ "find_unused_deps": "run-s build script:find_unused_deps",
"script:deps_versions": "node ./lib/deps_versions.js",
+ "script:prepublish_checks": "node ./lib/prepublish_checks.js",
"script:publish": "IS_DRY_RUN=true node ./lib/publish.js",
- "script:convert_changelogs": "node ./lib/convert_changelogs.js",
+ "script:find_unused_deps": "node ./lib/find_unused_dependencies.js"
},
"repository": {
"type": "git",
@@ -24,28 +28,37 @@
"url": "https://github.com/0xProject/0x-monorepo/issues"
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/monorepo-scripts/README.md",
- "comment": "// We purposefully use an older version of tslint-config here to avoid creating an import cycle",
"devDependencies": {
- "@0xproject/tslint-config": "0.4.8",
"@types/glob": "^5.0.33",
+ "@types/mkdirp": "^0.5.2",
"@types/node": "^8.0.53",
+ "@types/opn": "^5.1.0",
"@types/rimraf": "^2.0.2",
- "lerna-get-packages": "^1.0.0",
+ "@types/semver": "5.5.0",
+ "depcheck": "^0.6.9",
+ "make-promises-safe": "^1.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
+ "@lerna/batch-packages": "^3.0.0-beta.18",
+ "@types/depcheck": "^0.6.0",
"async-child-process": "^1.1.1",
"chalk": "^2.3.0",
"es6-promisify": "^5.0.0",
"glob": "^7.1.2",
- "lodash": "^4.17.4",
+ "isomorphic-fetch": "2.2.1",
+ "lodash": "^4.17.5",
+ "mkdirp": "^0.5.1",
"moment": "2.21.0",
+ "opn": "^5.3.0",
"promisify-child-process": "^1.0.5",
+ "prompt": "^1.0.0",
"publish-release": "0xproject/publish-release",
"rimraf": "^2.6.2",
+ "semver": "5.5.0",
"semver-diff": "^2.1.0",
"semver-sort": "0.0.4"
},
diff --git a/packages/monorepo-scripts/src/constants.ts b/packages/monorepo-scripts/src/constants.ts
index 74387a159..e5d3348bd 100644
--- a/packages/monorepo-scripts/src/constants.ts
+++ b/packages/monorepo-scripts/src/constants.ts
@@ -2,4 +2,7 @@ import * as path from 'path';
export const constants = {
monorepoRootPath: path.join(__dirname, '../../..'),
+ stagingWebsite: 'http://staging-0xproject.s3-website-us-east-1.amazonaws.com',
+ lernaExecutable: path.join('node_modules', '@0x-lerna-fork', 'lerna', 'cli.js'),
+ githubPersonalAccessToken: process.env.GITHUB_PERSONAL_ACCESS_TOKEN_0X_JS,
};
diff --git a/packages/monorepo-scripts/src/convert_changelogs.ts b/packages/monorepo-scripts/src/convert_changelogs.ts
deleted file mode 100644
index b5be14ed8..000000000
--- a/packages/monorepo-scripts/src/convert_changelogs.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-#!/usr/bin/env node
-/**
- * TEMPORARY SCRIPT
- * This script exists to migrate the legacy CHANGELOG.md to the canonical CHANGELOG.md
- * TODO: Remove after migration is successful and committed.
- */
-
-import * as fs from 'fs';
-import lernaGetPackages = require('lerna-get-packages');
-import * as _ from 'lodash';
-import * as moment from 'moment';
-import * as path from 'path';
-import { exec as execAsync } from 'promisify-child-process';
-
-import { constants } from './constants';
-import { Changelog, Changes, UpdatedPackage } from './types';
-import { utils } from './utils';
-
-const HEADER_PRAGMA = '##';
-
-(async () => {
- const allLernaPackages = lernaGetPackages(constants.monorepoRootPath);
- const publicLernaPackages = _.filter(allLernaPackages, pkg => !pkg.package.private);
- for (const lernaPackage of publicLernaPackages) {
- const changelogMdIfExists = getChangelogMdIfExists(lernaPackage.package.name, lernaPackage.location);
- if (_.isUndefined(changelogMdIfExists)) {
- throw new Error(`${lernaPackage.package.name} should have CHANGELOG.md b/c it's public. Add one.`);
- }
-
- const lines = changelogMdIfExists.split('\n');
- const changelogs: Changelog[] = [];
- let changelog: Changelog = {
- version: '',
- changes: [],
- };
- /**
- * Example MD entry:
- * ## v0.3.1 - _March 18, 2018_
- *
- * * Add TS types for `yargs` (#400)
- */
- for (const line of lines) {
- if (_.startsWith(line, `${HEADER_PRAGMA} `)) {
- let version = line.substr(4).split(' - ')[0];
- if (version === '0.x.x') {
- version = utils.getNextPatchVersion(lernaPackage.package.version);
- }
- const dateStr = line.split('_')[1];
- let date;
- if (!_.includes(dateStr, 'TBD')) {
- date = moment(dateStr, 'MMMM D, YYYY');
- }
- changelog = {
- version,
- changes: [],
- };
- if (!_.isUndefined(date)) {
- changelog.timestamp = date.unix();
- }
- if (!_.includes(dateStr, 'TBD')) {
- changelog.isPublished = true;
- }
- changelogs.push(changelog);
- } else if (_.includes(line, '* ')) {
- const note = line.split('* ')[1].split(' (#')[0];
- const prChunk = line.split(' (#')[1];
- let pr;
- if (!_.isUndefined(prChunk)) {
- pr = prChunk.split(')')[0];
- }
- const changes: Changes = {
- note,
- };
- if (!_.isUndefined(pr)) {
- changes.pr = _.parseInt(pr);
- }
- changelog.changes.push(changes);
- }
- }
- const changelogJSON = JSON.stringify(changelogs, null, 4);
- const changelogJSONPath = `${lernaPackage.location}/CHANGELOG.json`;
- fs.writeFileSync(changelogJSONPath, changelogJSON);
- await utils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
- }
-})().catch(err => {
- utils.log(err.stdout);
- process.exit(1);
-});
-
-function getChangelogMdIfExists(packageName: string, location: string): string | undefined {
- const changelogPath = path.join(location, 'CHANGELOG.md');
- let changelogMd: string;
- try {
- changelogMd = fs.readFileSync(changelogPath, 'utf-8');
- return changelogMd;
- } catch (err) {
- return undefined;
- }
-}
diff --git a/packages/monorepo-scripts/src/deps_versions.ts b/packages/monorepo-scripts/src/deps_versions.ts
index 07292a160..1053906b7 100644
--- a/packages/monorepo-scripts/src/deps_versions.ts
+++ b/packages/monorepo-scripts/src/deps_versions.ts
@@ -5,7 +5,7 @@ import * as fs from 'fs';
import { sync as globSync } from 'glob';
import * as _ from 'lodash';
-import { utils } from './utils';
+import { utils } from './utils/utils';
interface Dependencies {
[depName: string]: string;
@@ -19,6 +19,7 @@ interface VersionsByDependency {
const PACKAGE_JSON_GLOB = '../*/package.json';
+// tslint:disable:no-unused-variable
function getDependencies(path: string): Dependencies {
const file = fs.readFileSync(path).toString();
const parsed = JSON.parse(file);
@@ -52,3 +53,4 @@ _.map(versionsByDependency, (versions: Versions, depName: string) => {
});
}
});
+// tslint:disable:no-unused-variable
diff --git a/packages/monorepo-scripts/src/find_unused_dependencies.ts b/packages/monorepo-scripts/src/find_unused_dependencies.ts
new file mode 100644
index 000000000..4bb4b7dc5
--- /dev/null
+++ b/packages/monorepo-scripts/src/find_unused_dependencies.ts
@@ -0,0 +1,34 @@
+#!/usr/bin/env node
+
+import * as depcheckAsync from 'depcheck';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { utils } from './utils/utils';
+
+// For some reason, `depcheck` hangs on some packages. Add them here.
+const IGNORE_PACKAGES = ['@0xproject/sol-compiler'];
+
+(async () => {
+ utils.log('*** NOTE: Not all deps listed here are actually not required. ***');
+ utils.log("*** `depcheck` isn't perfect so double check before actually removing any. ***\n");
+ const packages = utils.getPackages(constants.monorepoRootPath);
+ for (const pkg of packages) {
+ if (_.includes(IGNORE_PACKAGES, pkg.packageJson.name)) {
+ continue; // skip
+ }
+ utils.log(`Checking ${pkg.packageJson.name} for unused deps. This might take a while...`);
+
+ const configs = {};
+ const { dependencies } = await depcheckAsync(pkg.location, configs);
+ if (!_.isEmpty(dependencies)) {
+ _.each(dependencies, dep => {
+ utils.log(dep);
+ });
+ }
+ utils.log('\n');
+ }
+})().catch(err => {
+ utils.log(err);
+ process.exit(1);
+});
diff --git a/packages/monorepo-scripts/src/globals.d.ts b/packages/monorepo-scripts/src/globals.d.ts
index c5898d0f5..2b25802ee 100644
--- a/packages/monorepo-scripts/src/globals.d.ts
+++ b/packages/monorepo-scripts/src/globals.d.ts
@@ -3,27 +3,15 @@ declare module 'publish-release';
declare module 'es6-promisify';
declare module 'semver-diff';
+declare module 'prompt' {
+ const start: () => void;
+ const get: (promptMessages: string[], callback: (err: Error, result: string) => void) => void;
+}
+
// semver-sort declarations
declare module 'semver-sort' {
const desc: (versions: string[]) => string[];
}
-declare interface LernaPackage {
- location: string;
- package: {
- private?: boolean;
- version: string;
- name: string;
- main?: string;
- config?: {
- additionalTsTypings?: string[];
- };
- };
-}
-declare function lernaGetPackages(path: string): LernaPackage[];
-// lerna-get-packages declarations
-declare module 'lerna-get-packages' {
- export = lernaGetPackages;
-}
-
declare module 'promisify-child-process';
+declare module '@lerna/batch-packages';
diff --git a/packages/monorepo-scripts/src/postpublish_utils.ts b/packages/monorepo-scripts/src/postpublish_utils.ts
index 236b54379..8e445a045 100644
--- a/packages/monorepo-scripts/src/postpublish_utils.ts
+++ b/packages/monorepo-scripts/src/postpublish_utils.ts
@@ -4,13 +4,12 @@ import * as fs from 'fs';
import * as _ from 'lodash';
import * as path from 'path';
import * as publishRelease from 'publish-release';
-import semverSort = require('semver-sort');
import { constants } from './constants';
-import { utils } from './utils';
+import { configs } from './utils/configs';
+import { utils } from './utils/utils';
const publishReleaseAsync = promisify(publishRelease);
-const githubPersonalAccessToken = process.env.GITHUB_PERSONAL_ACCESS_TOKEN_0X_JS;
const generatedDocsDirectoryName = 'generated_docs';
export interface PostpublishConfigs {
@@ -36,7 +35,7 @@ export const postpublishUtils = {
throw new Error('version field required in package.json. Cannot publish release notes to Github.');
}
const postpublishConfig = _.get(packageJSON, 'config.postpublish', {});
- const configs: PostpublishConfigs = {
+ const postpublishConfigs: PostpublishConfigs = {
cwd,
packageName: packageJSON.name,
version: packageJSON.version,
@@ -50,54 +49,56 @@ export const postpublishUtils = {
s3StagingBucketPath: _.get(postpublishConfig, 'docPublishConfigs.s3StagingBucketPath'),
},
};
- return configs;
+ return postpublishConfigs;
},
async runAsync(packageJSON: any, tsConfigJSON: any, cwd: string): Promise<void> {
- const configs = this.generateConfig(packageJSON, tsConfigJSON, cwd);
- const release = await this.publishReleaseNotesAsync(
- configs.cwd,
- configs.packageName,
- configs.version,
- configs.assets,
+ if (configs.IS_LOCAL_PUBLISH) {
+ return;
+ }
+ const postpublishConfigs = postpublishUtils.generateConfig(packageJSON, tsConfigJSON, cwd);
+ await postpublishUtils.publishReleaseNotesAsync(
+ postpublishConfigs.packageName,
+ postpublishConfigs.version,
+ postpublishConfigs.assets,
);
if (
- !_.isUndefined(configs.docPublishConfigs.s3BucketPath) ||
- !_.isUndefined(configs.docPublishConfigs.s3StagingBucketPath)
+ !_.isUndefined(postpublishConfigs.docPublishConfigs.s3BucketPath) ||
+ !_.isUndefined(postpublishConfigs.docPublishConfigs.s3StagingBucketPath)
) {
utils.log('POSTPUBLISH: Release successful, generating docs...');
await postpublishUtils.generateAndUploadDocsAsync(
- configs.cwd,
- configs.docPublishConfigs.fileIncludes,
- configs.version,
- configs.docPublishConfigs.s3BucketPath,
+ postpublishConfigs.cwd,
+ postpublishConfigs.docPublishConfigs.fileIncludes,
+ postpublishConfigs.version,
+ postpublishConfigs.docPublishConfigs.s3BucketPath,
);
} else {
utils.log(`POSTPUBLISH: No S3Bucket config found for ${packageJSON.name}. Skipping doc JSON generation.`);
}
},
- async publishDocsToStagingAsync(packageJSON: any, tsConfigJSON: any, cwd: string) {
- const configs = this.generateConfig(packageJSON, tsConfigJSON, cwd);
- if (_.isUndefined(configs.docPublishConfigs.s3StagingBucketPath)) {
+ async publishDocsToStagingAsync(packageJSON: any, tsConfigJSON: any, cwd: string): Promise<void> {
+ const postpublishConfigs = postpublishUtils.generateConfig(packageJSON, tsConfigJSON, cwd);
+ if (_.isUndefined(postpublishConfigs.docPublishConfigs.s3StagingBucketPath)) {
utils.log('config.postpublish.docPublishConfigs.s3StagingBucketPath entry in package.json not found!');
return;
}
utils.log('POSTPUBLISH: Generating docs...');
await postpublishUtils.generateAndUploadDocsAsync(
- configs.cwd,
- configs.docPublishConfigs.fileIncludes,
- configs.version,
- configs.docPublishConfigs.s3StagingBucketPath,
+ postpublishConfigs.cwd,
+ postpublishConfigs.docPublishConfigs.fileIncludes,
+ postpublishConfigs.version,
+ postpublishConfigs.docPublishConfigs.s3StagingBucketPath,
);
},
- async publishReleaseNotesAsync(cwd: string, packageName: string, version: string, assets: string[]): Promise<void> {
- const notes = this.getReleaseNotes(packageName);
- const releaseName = this.getReleaseName(packageName, version);
- const tag = this.getTag(packageName, version);
- const finalAssets = this.adjustAssetPaths(cwd, assets);
+ async publishReleaseNotesAsync(packageName: string, version: string, assets: string[]): Promise<void> {
+ const notes = postpublishUtils.getReleaseNotes(packageName, version);
+ const releaseName = postpublishUtils.getReleaseName(packageName, version);
+ const tag = postpublishUtils.getTag(packageName, version);
+ postpublishUtils.adjustAssetPaths(assets);
utils.log('POSTPUBLISH: Releasing ', releaseName, '...');
- const result = await publishReleaseAsync({
- token: githubPersonalAccessToken,
+ await publishReleaseAsync({
+ token: constants.githubPersonalAccessToken,
owner: '0xProject',
repo: '0x-monorepo',
tag,
@@ -109,9 +110,8 @@ export const postpublishUtils = {
reuseDraftOnly: false,
assets,
});
- this.updateChangelogIsPublished(packageName);
},
- getReleaseNotes(packageName: string) {
+ getReleaseNotes(packageName: string, version: string): string {
const packageNameWithNamespace = packageName.replace('@0xproject/', '');
const changelogJSONPath = path.join(
constants.monorepoRootPath,
@@ -122,45 +122,34 @@ export const postpublishUtils = {
const changelogJSON = fs.readFileSync(changelogJSONPath, 'utf-8');
const changelogs = JSON.parse(changelogJSON);
const latestLog = changelogs[0];
- if (_.isUndefined(latestLog.isPublished)) {
- let notes = '';
- _.each(latestLog.changes, change => {
- notes += `* ${change.note}`;
- if (change.pr) {
- notes += ` (${change.pr})`;
- }
- notes += `\n`;
- });
- return notes;
+ // We sanity check that the version for the changelog notes we are about to publish to Github
+ // correspond to the new version of the package.
+ if (version !== latestLog.version) {
+ throw new Error('Expected CHANGELOG.json latest entry version to coincide with published version.');
}
- return 'N/A';
- },
- updateChangelogIsPublished(packageName: string) {
- const packageNameWithNamespace = packageName.replace('@0xproject/', '');
- const changelogJSONPath = path.join(
- constants.monorepoRootPath,
- 'packages',
- packageNameWithNamespace,
- 'CHANGELOG.json',
- );
- const changelogJSON = fs.readFileSync(changelogJSONPath, 'utf-8');
- const changelogs = JSON.parse(changelogJSON);
- const latestLog = changelogs[0];
- latestLog.isPublished = true;
- changelogs[0] = latestLog;
- fs.writeFileSync(changelogJSONPath, JSON.stringify(changelogs, null, '\t'));
+ let notes = '';
+ _.each(latestLog.changes, change => {
+ notes += `* ${change.note}`;
+ if (change.pr) {
+ notes += ` (#${change.pr})`;
+ }
+ notes += `\n`;
+ });
+ return notes;
},
- getTag(packageName: string, version: string) {
+ getTag(packageName: string, version: string): string {
return `${packageName}@${version}`;
},
getReleaseName(subPackageName: string, version: string): string {
const releaseName = `${subPackageName} v${version}`;
return releaseName;
},
- adjustAssetPaths(cwd: string, assets: string[]) {
+ // Asset paths should described from the monorepo root. This method prefixes
+ // the supplied path with the absolute path to the monorepo root.
+ adjustAssetPaths(assets: string[]): string[] {
const finalAssets: string[] = [];
_.each(assets, (asset: string) => {
- finalAssets.push(`${cwd}/${asset}`);
+ finalAssets.push(`${constants.monorepoRootPath}/${asset}`);
});
return finalAssets;
},
@@ -173,14 +162,20 @@ export const postpublishUtils = {
// HACK: tsconfig.json needs wildcard directory endings as `/**/*`
// but TypeDoc needs it as `/**` in order to pick up files at the root
if (_.endsWith(includePath, '/**/*')) {
+ // tslint:disable-next-line:custom-no-magic-numbers
includePath = includePath.slice(0, -2);
}
return includePath;
});
return fileIncludesAdjusted;
},
- async generateAndUploadDocsAsync(cwd: string, fileIncludes: string[], version: string, S3BucketPath: string) {
- const fileIncludesAdjusted = this.adjustFileIncludePaths(fileIncludes, cwd);
+ async generateAndUploadDocsAsync(
+ cwd: string,
+ fileIncludes: string[],
+ version: string,
+ S3BucketPath: string,
+ ): Promise<void> {
+ const fileIncludesAdjusted = postpublishUtils.adjustFileIncludePaths(fileIncludes, cwd);
const projectFiles = fileIncludesAdjusted.join(' ');
const jsonFilePath = `${cwd}/${generatedDocsDirectoryName}/index.json`;
const result = await execAsync(
diff --git a/packages/monorepo-scripts/src/prepublish_checks.ts b/packages/monorepo-scripts/src/prepublish_checks.ts
new file mode 100644
index 000000000..683c26094
--- /dev/null
+++ b/packages/monorepo-scripts/src/prepublish_checks.ts
@@ -0,0 +1,189 @@
+import * as _ from 'lodash';
+import { exec as execAsync } from 'promisify-child-process';
+import semver = require('semver');
+import semverSort = require('semver-sort');
+
+import { constants } from './constants';
+import { Package } from './types';
+import { changelogUtils } from './utils/changelog_utils';
+import { npmUtils } from './utils/npm_utils';
+import { utils } from './utils/utils';
+
+async function prepublishChecksAsync(): Promise<void> {
+ const shouldIncludePrivate = false;
+ const updatedPublicPackages = await utils.getUpdatedPackagesAsync(shouldIncludePrivate);
+
+ await checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(updatedPublicPackages);
+ await checkChangelogFormatAsync(updatedPublicPackages);
+ await checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages);
+ await checkPublishRequiredSetupAsync();
+}
+
+async function checkGitTagsForNextVersionAndDeleteIfExistAsync(updatedPublicPackages: Package[]): Promise<void> {
+ const packageNames = _.map(updatedPublicPackages, pkg => pkg.packageJson.name);
+ const localGitTags = await utils.getLocalGitTagsAsync();
+ const localTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, localGitTags);
+
+ const remoteGitTags = await utils.getRemoteGitTagsAsync();
+ const remoteTagVersionsByPackageName = await utils.getGitTagsByPackageNameAsync(packageNames, remoteGitTags);
+
+ for (const pkg of updatedPublicPackages) {
+ const currentVersion = pkg.packageJson.version;
+ const packageName = pkg.packageJson.name;
+ const packageLocation = pkg.location;
+ const nextVersion = await utils.getNextPackageVersionAsync(currentVersion, packageName, packageLocation);
+
+ const remoteTagVersions = remoteTagVersionsByPackageName[packageName];
+ if (_.includes(remoteTagVersions, nextVersion)) {
+ const tagName = `:refs/tags/${packageName}@${nextVersion}`;
+ await utils.removeRemoteTagAsync(tagName);
+ }
+
+ const localTagVersions = localTagVersionsByPackageName[packageName];
+ if (_.includes(localTagVersions, nextVersion)) {
+ const tagName = `${packageName}@${nextVersion}`;
+ await utils.removeLocalTagAsync(tagName);
+ }
+ }
+}
+
+async function checkCurrentVersionMatchesLatestPublishedNPMPackageAsync(
+ updatedPublicPackages: Package[],
+): Promise<void> {
+ utils.log('Check package versions against npm registry...');
+ const versionMismatches = [];
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ const packageVersion = pkg.packageJson.version;
+ const packageRegistryJsonIfExists = await npmUtils.getPackageRegistryJsonIfExistsAsync(packageName);
+ if (_.isUndefined(packageRegistryJsonIfExists)) {
+ continue; // noop for packages not yet published to NPM
+ }
+ const allVersionsIncludingUnpublished = npmUtils.getPreviouslyPublishedVersions(packageRegistryJsonIfExists);
+ const sortedVersions = semverSort.desc(allVersionsIncludingUnpublished);
+ const latestNPMVersion = sortedVersions[0];
+ if (packageVersion !== latestNPMVersion) {
+ versionMismatches.push({
+ packageJsonVersion: packageVersion,
+ npmVersion: latestNPMVersion,
+ packageName,
+ });
+ }
+ }
+ if (!_.isEmpty(versionMismatches)) {
+ utils.log(`Found version mismatches between package.json and NPM published versions (might be unpublished).`);
+ _.each(versionMismatches, versionMismatch => {
+ utils.log(
+ `${versionMismatch.packageName}: ${versionMismatch.packageJsonVersion} package.json, ${
+ versionMismatch.npmVersion
+ } on NPM`,
+ );
+ });
+ throw new Error(`Please fix the above package.json/NPM inconsistencies.`);
+ }
+}
+
+async function checkChangelogFormatAsync(updatedPublicPackages: Package[]): Promise<void> {
+ utils.log('Check CHANGELOGs for inconsistencies...');
+ const changeLogInconsistencies = [];
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, pkg.location);
+
+ const currentVersion = pkg.packageJson.version;
+ if (!_.isEmpty(changelog)) {
+ const lastEntry = changelog[0];
+ const doesLastEntryHaveTimestamp = !_.isUndefined(lastEntry.timestamp);
+ if (semver.lt(lastEntry.version, currentVersion)) {
+ changeLogInconsistencies.push({
+ packageJsonVersion: currentVersion,
+ changelogVersion: lastEntry.version,
+ packageName,
+ });
+ } else if (semver.gt(lastEntry.version, currentVersion) && doesLastEntryHaveTimestamp) {
+ // Remove incorrectly added timestamp
+ delete changelog[0].timestamp;
+ // Save updated CHANGELOG.json
+ await changelogUtils.writeChangelogJsonFileAsync(pkg.location, changelog);
+ utils.log(`${packageName}: Removed timestamp from latest CHANGELOG.json entry.`);
+ }
+ }
+ }
+ if (!_.isEmpty(changeLogInconsistencies)) {
+ utils.log(`CHANGELOG versions cannot below package.json versions:`);
+ _.each(changeLogInconsistencies, inconsistency => {
+ utils.log(
+ `${inconsistency.packageName}: ${inconsistency.packageJsonVersion} package.json, ${
+ inconsistency.changelogVersion
+ } CHANGELOG.json`,
+ );
+ });
+ throw new Error('Fix the above inconsistencies to continue.');
+ }
+}
+
+async function checkPublishRequiredSetupAsync(): Promise<void> {
+ // check to see if logged into npm before publishing
+ try {
+ // HACK: for some reason on some setups, the `npm whoami` will not recognize a logged-in user
+ // unless run with `sudo` (i.e Fabio's NVM setup) but is fine for others (Jacob's NVM setup).
+ utils.log('Checking that the user is logged in on npm...');
+ await execAsync(`sudo npm whoami`);
+ } catch (err) {
+ throw new Error('You must be logged into npm in the commandline to publish. Run `npm login` and try again.');
+ }
+
+ // Check to see if Git personal token setup
+ if (_.isUndefined(constants.githubPersonalAccessToken)) {
+ throw new Error(
+ 'You must have a Github personal access token set to an envVar named `GITHUB_PERSONAL_ACCESS_TOKEN_0X_JS`. Add it then try again.',
+ );
+ }
+
+ // Check Yarn version is 1.X
+ utils.log('Checking the yarn version...');
+ const result = await execAsync(`yarn --version`);
+ const version = result.stdout;
+ const versionSegments = version.split('.');
+ const majorVersion = _.parseInt(versionSegments[0]);
+ if (majorVersion < 1) {
+ throw new Error('Your yarn version must be v1.x or higher. Upgrade yarn and try again.');
+ }
+
+ // Check that `aws` commandline tool is installed
+ try {
+ utils.log('Checking that aws CLI tool is installed...');
+ await execAsync(`aws help`);
+ } catch (err) {
+ throw new Error('You must have `awscli` commandline tool installed. Install it and try again.');
+ }
+
+ // Check that `aws` credentials are setup
+ try {
+ utils.log('Checking that aws credentials are configured...');
+ await execAsync(`aws sts get-caller-identity`);
+ } catch (err) {
+ throw new Error('You must setup your AWS credentials by running `aws configure`. Do this and try again.');
+ }
+
+ utils.log('Checking that git branch is up to date with upstream...');
+ await execAsync('git fetch');
+ const res = await execAsync('git status -bs'); // s - short format, b - branch info
+ /**
+ * Possible outcomes
+ * ## branch_name...origin/branch_name [behind n]
+ * ## branch_name...origin/branch_name [ahead n]
+ * ## branch_name...origin/branch_name
+ */
+ const gitShortStatusHeader = res.stdout.split('\n')[0];
+ if (gitShortStatusHeader.includes('behind')) {
+ throw new Error('Your branch is behind upstream. Please pull before publishing.');
+ } else if (gitShortStatusHeader.includes('ahead')) {
+ throw new Error('Your branch is ahead of upstream. Please push before publishing.');
+ }
+}
+
+prepublishChecksAsync().catch(err => {
+ utils.log(err.message);
+ process.exit(1);
+});
diff --git a/packages/monorepo-scripts/src/publish.ts b/packages/monorepo-scripts/src/publish.ts
index d749ec630..6ff0c9bef 100644
--- a/packages/monorepo-scripts/src/publish.ts
+++ b/packages/monorepo-scripts/src/publish.ts
@@ -1,217 +1,214 @@
#!/usr/bin/env node
-import * as fs from 'fs';
-import lernaGetPackages = require('lerna-get-packages');
+import * as promisify from 'es6-promisify';
import * as _ from 'lodash';
import * as moment from 'moment';
-import * as path from 'path';
-import { exec as execAsync, spawn } from 'promisify-child-process';
-import semverDiff = require('semver-diff');
+import opn = require('opn');
+import { exec as execAsync } from 'promisify-child-process';
+import * as prompt from 'prompt';
+import semver = require('semver');
import semverSort = require('semver-sort');
import { constants } from './constants';
-import { Changelog, Changes, SemVerIndex, UpdatedPackage } from './types';
-import { utils } from './utils';
+import { Package, PackageToNextVersion, VersionChangelog } from './types';
+import { changelogUtils } from './utils/changelog_utils';
+import { configs } from './utils/configs';
+import { utils } from './utils/utils';
-const IS_DRY_RUN = process.env.IS_DRY_RUN === 'true';
+const DOC_GEN_COMMAND = 'docs:json';
+const NPM_NAMESPACE = '@0xproject/';
const TODAYS_TIMESTAMP = moment().unix();
-const LERNA_EXECUTABLE = './node_modules/lerna/bin/lerna.js';
-const semverNameToIndex: { [semver: string]: number } = {
- patch: SemVerIndex.Patch,
- minor: SemVerIndex.Minor,
- major: SemVerIndex.Major,
+const packageNameToWebsitePath: { [name: string]: string } = {
+ '0x.js': '0xjs',
+ 'web3-wrapper': 'web3_wrapper',
+ contracts: 'contracts',
+ connect: 'connect',
+ 'json-schemas': 'json-schemas',
+ 'sol-compiler': 'sol-compiler',
+ 'sol-cov': 'sol-cov',
+ subproviders: 'subproviders',
+ 'order-utils': 'order-utils',
+ 'ethereum-types': 'ethereum-types',
};
+async function confirmAsync(message: string): Promise<void> {
+ prompt.start();
+ const result = await promisify(prompt.get)([message]);
+ const didConfirm = result[message] === 'y';
+ if (!didConfirm) {
+ utils.log('Publish process aborted.');
+ process.exit(0);
+ }
+}
+
(async () => {
- const updatedPublicPackages = await getPublicLernaUpdatedPackagesAsync();
- const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name);
+ // Fetch public, updated Lerna packages
+ const shouldIncludePrivate = true;
+ const allUpdatedPackages = await utils.getUpdatedPackagesAsync(shouldIncludePrivate);
+
+ if (!configs.IS_LOCAL_PUBLISH) {
+ await confirmAsync(
+ 'THIS IS NOT A TEST PUBLISH! You are about to publish one or more packages to npm. Are you sure you want to continue? (y/n)',
+ );
+ await confirmDocPagesRenderAsync(allUpdatedPackages);
+ }
+
+ // Update CHANGELOGs
+ const updatedPublicPackages = _.filter(allUpdatedPackages, pkg => !pkg.packageJson.private);
+ const updatedPublicPackageNames = _.map(updatedPublicPackages, pkg => pkg.packageJson.name);
+ utils.log(`Will update CHANGELOGs and publish: \n${updatedPublicPackageNames.join('\n')}\n`);
+ const packageToNextVersion = await updateChangeLogsAsync(updatedPublicPackages);
+
+ const updatedPrivatePackages = _.filter(allUpdatedPackages, pkg => pkg.packageJson.private);
+ _.each(updatedPrivatePackages, pkg => {
+ const currentVersion = pkg.packageJson.version;
+ const packageName = pkg.packageJson.name;
+ const nextPatchVersionIfValid = semver.inc(currentVersion, 'patch');
+ if (!_.isNull(nextPatchVersionIfValid)) {
+ packageToNextVersion[packageName] = nextPatchVersionIfValid;
+ } else {
+ throw new Error(`Encountered invalid semver version: ${currentVersion} for package: ${packageName}`);
+ }
+ });
+
+ // Push changelog changes to Github
+ if (!configs.IS_LOCAL_PUBLISH) {
+ await pushChangelogsToGithubAsync();
+ }
+
+ // Call LernaPublish
+ utils.log('Version updates to apply:');
+ _.each(packageToNextVersion, (versionChange: string, packageName: string) => {
+ utils.log(`${packageName} -> ${versionChange}`);
+ });
+ utils.log(`Calling 'lerna publish'...`);
+ await lernaPublishAsync(packageToNextVersion);
+})().catch(err => {
+ utils.log(err);
+ process.exit(1);
+});
+
+async function confirmDocPagesRenderAsync(packages: Package[]): Promise<void> {
+ // push docs to staging
+ utils.log("Upload all docJson's to S3 staging...");
+ await execAsync(`yarn stage_docs`, { cwd: constants.monorepoRootPath });
- const allLernaPackages = lernaGetPackages(constants.monorepoRootPath);
- const updatedPublicLernaPackages = _.filter(allLernaPackages, pkg => {
- return _.includes(updatedPackageNames, pkg.package.name);
+ // deploy website to staging
+ utils.log('Deploy website to staging...');
+ const pathToWebsite = `${constants.monorepoRootPath}/packages/website`;
+ await execAsync(`yarn deploy_staging`, { cwd: pathToWebsite });
+
+ const packagesWithDocs = _.filter(packages, pkg => {
+ const scriptsIfExists = pkg.packageJson.scripts;
+ if (_.isUndefined(scriptsIfExists)) {
+ throw new Error('Found a public package without any scripts in package.json');
+ }
+ return !_.isUndefined(scriptsIfExists[DOC_GEN_COMMAND]);
});
- const updatedPublicLernaPackageNames = _.map(updatedPublicLernaPackages, pkg => pkg.package.name);
- utils.log(`Will update CHANGELOGs and publish: \n${updatedPublicLernaPackageNames.join('\n')}\n`);
-
- const packageToVersionChange: { [name: string]: string } = {};
- for (const lernaPackage of updatedPublicLernaPackages) {
- const packageName = lernaPackage.package.name;
- const changelogJSONPath = path.join(lernaPackage.location, 'CHANGELOG.json');
- const changelogJSON = getChangelogJSONOrCreateIfMissing(lernaPackage.package.name, changelogJSONPath);
- let changelogs: Changelog[];
- try {
- changelogs = JSON.parse(changelogJSON);
- } catch (err) {
+ _.each(packagesWithDocs, pkg => {
+ const name = pkg.packageJson.name;
+ const nameWithoutPrefix = _.startsWith(name, NPM_NAMESPACE) ? name.split('@0xproject/')[1] : name;
+ const docSegmentIfExists = packageNameToWebsitePath[nameWithoutPrefix];
+ if (_.isUndefined(docSegmentIfExists)) {
throw new Error(
- `${lernaPackage.package.name}'s CHANGELOG.json contains invalid JSON. Please fix and try again.`,
+ `Found package '${name}' with doc commands but no corresponding docSegment in monorepo_scripts
+package.ts. Please add an entry for it and try again.`,
);
}
+ const link = `${constants.stagingWebsite}/docs/${docSegmentIfExists}`;
+ // tslint:disable-next-line:no-floating-promises
+ opn(link);
+ });
+
+ await confirmAsync('Do all the doc pages render properly? (y/n)');
+}
+
+async function pushChangelogsToGithubAsync(): Promise<void> {
+ await execAsync(`git add . --all`, { cwd: constants.monorepoRootPath });
+ await execAsync(`git commit -m "Updated CHANGELOGS"`, { cwd: constants.monorepoRootPath });
+ await execAsync(`git push`, { cwd: constants.monorepoRootPath });
+ utils.log(`Pushed CHANGELOG updates to Github`);
+}
- const currentVersion = lernaPackage.package.version;
- const shouldAddNewEntry = shouldAddNewChangelogEntry(changelogs);
+async function updateChangeLogsAsync(updatedPublicPackages: Package[]): Promise<PackageToNextVersion> {
+ const packageToNextVersion: PackageToNextVersion = {};
+ for (const pkg of updatedPublicPackages) {
+ const packageName = pkg.packageJson.name;
+ let changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, pkg.location);
+
+ const currentVersion = pkg.packageJson.version;
+ const shouldAddNewEntry = changelogUtils.shouldAddNewChangelogEntry(
+ pkg.packageJson.name,
+ currentVersion,
+ changelog,
+ );
if (shouldAddNewEntry) {
// Create a new entry for a patch version with generic changelog entry.
- const nextPatchVersion = utils.getNextPatchVersion(currentVersion);
- const newChangelogEntry: Changelog = {
+ const nextPatchVersionIfValid = semver.inc(currentVersion, 'patch');
+ if (_.isNull(nextPatchVersionIfValid)) {
+ throw new Error(`Encountered invalid semver version: ${currentVersion} for package: ${packageName}`);
+ }
+ const newChangelogEntry: VersionChangelog = {
timestamp: TODAYS_TIMESTAMP,
- version: nextPatchVersion,
+ version: nextPatchVersionIfValid,
changes: [
{
note: 'Dependencies updated',
},
],
};
- changelogs = [newChangelogEntry, ...changelogs];
- packageToVersionChange[packageName] = semverDiff(currentVersion, nextPatchVersion);
+ changelog = [newChangelogEntry, ...changelog];
+ packageToNextVersion[packageName] = nextPatchVersionIfValid;
} else {
// Update existing entry with timestamp
- const lastEntry = changelogs[0];
+ const lastEntry = changelog[0];
if (_.isUndefined(lastEntry.timestamp)) {
lastEntry.timestamp = TODAYS_TIMESTAMP;
}
// Check version number is correct.
const proposedNextVersion = lastEntry.version;
lastEntry.version = updateVersionNumberIfNeeded(currentVersion, proposedNextVersion);
- changelogs[0] = lastEntry;
- packageToVersionChange[packageName] = semverDiff(currentVersion, lastEntry.version);
+ changelog[0] = lastEntry;
+ packageToNextVersion[packageName] = lastEntry.version;
}
// Save updated CHANGELOG.json
- fs.writeFileSync(changelogJSONPath, JSON.stringify(changelogs, null, 4));
- await utils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
+ await changelogUtils.writeChangelogJsonFileAsync(pkg.location, changelog);
utils.log(`${packageName}: Updated CHANGELOG.json`);
// Generate updated CHANGELOG.md
- const changelogMd = generateChangelogMd(changelogs);
- const changelogMdPath = path.join(lernaPackage.location, 'CHANGELOG.md');
- fs.writeFileSync(changelogMdPath, changelogMd);
- await utils.prettifyAsync(changelogMdPath, constants.monorepoRootPath);
+ const changelogMd = changelogUtils.generateChangelogMd(changelog);
+ await changelogUtils.writeChangelogMdFileAsync(pkg.location, changelogMd);
utils.log(`${packageName}: Updated CHANGELOG.md`);
}
- if (!IS_DRY_RUN) {
- await execAsync(`git add . --all`, { cwd: constants.monorepoRootPath });
- await execAsync(`git commit -m "Updated CHANGELOGS"`, { cwd: constants.monorepoRootPath });
- await execAsync(`git push`, { cwd: constants.monorepoRootPath });
- utils.log(`Pushed CHANGELOG updates to Github`);
- }
-
- utils.log('Version updates to apply:');
- _.each(packageToVersionChange, (versionChange: string, packageName: string) => {
- utils.log(`${packageName} -> ${versionChange}`);
- });
- utils.log(`Calling 'lerna publish'...`);
- await lernaPublishAsync(packageToVersionChange);
-})().catch(err => {
- utils.log(err);
- process.exit(1);
-});
-
-async function lernaPublishAsync(packageToVersionChange: { [name: string]: string }) {
- // HACK: Lerna publish does not provide a way to specify multiple package versions via
- // flags so instead we need to interact with their interactive prompt interface.
- const child = spawn('lerna', ['publish', '--registry=https://registry.npmjs.org/'], {
- cwd: constants.monorepoRootPath,
- });
- let shouldPrintOutput = false;
- child.stdout.on('data', (data: Buffer) => {
- const output = data.toString('utf8');
- if (shouldPrintOutput) {
- utils.log(output);
- }
- const isVersionPrompt = _.includes(output, 'Select a new version');
- if (isVersionPrompt) {
- const outputStripLeft = output.split('new version for ')[1];
- const packageName = outputStripLeft.split(' ')[0];
- let versionChange = packageToVersionChange[packageName];
- const isPrivatePackage = _.isUndefined(versionChange);
- if (isPrivatePackage) {
- versionChange = 'patch'; // Always patch updates to private packages.
- }
- const semVerIndex = semverNameToIndex[versionChange];
- child.stdin.write(`${semVerIndex}\n`);
- }
- const isFinalPrompt = _.includes(output, 'Are you sure you want to publish the above changes?');
- if (isFinalPrompt && !IS_DRY_RUN) {
- child.stdin.write(`y\n`);
- // After confirmations, we want to print the output to watch the `lerna publish` command
- shouldPrintOutput = true;
- } else if (isFinalPrompt && IS_DRY_RUN) {
- utils.log(
- `Submitted all versions to Lerna but since this is a dry run, did not confirm. You need to CTRL-C to exit.`,
- );
- }
- });
+ return packageToNextVersion;
}
-async function getPublicLernaUpdatedPackagesAsync(): Promise<UpdatedPackage[]> {
- const result = await execAsync(`${LERNA_EXECUTABLE} updated --json`, { cwd: constants.monorepoRootPath });
- const updatedPackages = JSON.parse(result.stdout);
- const updatedPublicPackages = _.filter(updatedPackages, updatedPackage => !updatedPackage.private);
- return updatedPublicPackages;
+async function lernaPublishAsync(packageToNextVersion: { [name: string]: string }): Promise<void> {
+ const packageVersionString = _.map(packageToNextVersion, (nextVersion: string, packageName: string) => {
+ return `${packageName}@${nextVersion}`;
+ }).join(',');
+ let lernaPublishCmd = `node ${constants.lernaExecutable} publish --cdVersions=${packageVersionString} --registry=${
+ configs.NPM_REGISTRY_URL
+ } --yes`;
+ if (configs.IS_LOCAL_PUBLISH) {
+ lernaPublishCmd += ` --skip-git`;
+ }
+ utils.log('Lerna is publishing...');
+ await execAsync(lernaPublishCmd, { cwd: constants.monorepoRootPath });
}
-function updateVersionNumberIfNeeded(currentVersion: string, proposedNextVersion: string) {
+function updateVersionNumberIfNeeded(currentVersion: string, proposedNextVersion: string): string {
+ const updatedVersionIfValid = semver.inc(currentVersion, 'patch');
+ if (_.isNull(updatedVersionIfValid)) {
+ throw new Error(`Encountered invalid semver: ${currentVersion}`);
+ }
if (proposedNextVersion === currentVersion) {
- return utils.getNextPatchVersion(currentVersion);
+ return updatedVersionIfValid;
}
const sortedVersions = semverSort.desc([proposedNextVersion, currentVersion]);
if (sortedVersions[0] !== proposedNextVersion) {
- return utils.getNextPatchVersion(currentVersion);
+ return updatedVersionIfValid;
}
return proposedNextVersion;
}
-
-function getChangelogJSONOrCreateIfMissing(packageName: string, changelogPath: string): string {
- let changelogJSON: string;
- try {
- changelogJSON = fs.readFileSync(changelogPath, 'utf-8');
- return changelogJSON;
- } catch (err) {
- // If none exists, create new, empty one.
- const emptyChangelogJSON = JSON.stringify([], null, 4);
- fs.writeFileSync(changelogPath, emptyChangelogJSON);
- return emptyChangelogJSON;
- }
-}
-
-function shouldAddNewChangelogEntry(changelogs: Changelog[]): boolean {
- if (_.isEmpty(changelogs)) {
- return true;
- }
- const lastEntry = changelogs[0];
- return !!lastEntry.isPublished;
-}
-
-function generateChangelogMd(changelogs: Changelog[]): string {
- let changelogMd = `<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
-Edit the package's CHANGELOG.json file only.
--->
-
-CHANGELOG
- `;
-
- _.each(changelogs, changelog => {
- if (_.isUndefined(changelog.timestamp)) {
- throw new Error(
- 'All CHANGELOG.json entries must be updated to include a timestamp before generating their MD version',
- );
- }
- const date = moment(`${changelog.timestamp}`, 'X').format('MMMM D, YYYY');
- const title = `\n## v${changelog.version} - _${date}_\n\n`;
- changelogMd += title;
-
- let changes = '';
- _.each(changelog.changes, change => {
- let line = ` * ${change.note}`;
- if (!_.isUndefined(change.pr)) {
- line += ` (#${change.pr})`;
- }
- line += '\n';
- changes += line;
- });
- changelogMd += `${changes}`;
- });
-
- return changelogMd;
-}
diff --git a/packages/monorepo-scripts/src/test_installation.ts b/packages/monorepo-scripts/src/test_installation.ts
index 195b64b2a..87c4ad1d7 100644
--- a/packages/monorepo-scripts/src/test_installation.ts
+++ b/packages/monorepo-scripts/src/test_installation.ts
@@ -1,58 +1,150 @@
#!/usr/bin/env node
import * as fs from 'fs';
-import lernaGetPackages = require('lerna-get-packages');
import * as _ from 'lodash';
+import * as mkdirp from 'mkdirp';
import * as path from 'path';
import { exec as execAsync } from 'promisify-child-process';
import * as rimraf from 'rimraf';
+import { promisify } from 'util';
-import { utils } from './utils';
+import { Package } from './types';
+import { utils } from './utils/utils';
+
+// Packages might not be runnable if they are command-line tools or only run in browsers.
+const UNRUNNABLE_PACKAGES = [
+ '@0xproject/abi-gen',
+ '@0xproject/sra-report',
+ '@0xproject/react-shared',
+ '@0xproject/react-docs',
+];
+
+const mkdirpAsync = promisify(mkdirp);
+const rimrafAsync = promisify(rimraf);
+const writeFileAsync = promisify(fs.writeFile);
+
+interface PackageErr {
+ packageName: string;
+ error: ExecError;
+}
+
+interface ExecError {
+ message: string;
+ stack: string;
+ stderr: string;
+ stdout: string;
+}
+
+// returns the index for the given package name.
+function findPackageIndex(packages: Package[], packageName: string): number {
+ return _.findIndex(packages, pkg => pkg.packageJson.name === packageName);
+}
+
+function logIfDefined(x: any): void {
+ if (!_.isUndefined(x)) {
+ utils.log(x);
+ }
+}
(async () => {
+ const IS_LOCAL_PUBLISH = process.env.IS_LOCAL_PUBLISH === 'true';
+ const registry = IS_LOCAL_PUBLISH ? 'http://localhost:4873/' : 'https://registry.npmjs.org/';
const monorepoRootPath = path.join(__dirname, '../../..');
- const lernaPackages = lernaGetPackages(monorepoRootPath);
+ const packages = utils.getPackages(monorepoRootPath);
const installablePackages = _.filter(
- lernaPackages,
- lernaPackage =>
- !lernaPackage.package.private &&
- !_.isUndefined(lernaPackage.package.main) &&
- lernaPackage.package.main.endsWith('.js'),
+ packages,
+ pkg => !pkg.packageJson.private && !_.isUndefined(pkg.packageJson.main) && pkg.packageJson.main.endsWith('.js'),
);
- for (const installableLernaPackage of installablePackages) {
- const packagePath = installableLernaPackage.location;
- const packageName = installableLernaPackage.package.name;
- utils.log(`Testing ${packageName}`);
- let result = await execAsync('npm pack', { cwd: packagePath });
- const packedPackageFileName = result.stdout.trim();
- const testDirectory = path.join(monorepoRootPath, '../test-env');
- fs.mkdirSync(testDirectory);
- result = await execAsync('yarn init --yes', { cwd: testDirectory });
- utils.log(`Installing ${packedPackageFileName}`);
- result = await execAsync(`yarn add ${packagePath}/${packedPackageFileName}`, { cwd: testDirectory });
- const indexFilePath = path.join(testDirectory, 'index.ts');
- fs.writeFileSync(indexFilePath, `import * as Package from '${packageName}'`);
- const tsConfig = {
- compilerOptions: {
- typeRoots: ['node_modules/@0xproject/typescript-typings/types', 'node_modules/@types'],
- module: 'commonjs',
- target: 'es5',
- lib: ['es2017', 'dom'],
- declaration: true,
- noImplicitReturns: true,
- pretty: true,
- strict: true,
- },
- include: ['index.ts'],
- };
- const tsconfigFilePath = path.join(testDirectory, 'tsconfig.json');
- fs.writeFileSync(tsconfigFilePath, JSON.stringify(tsConfig, null, 4));
- utils.log(`Compiling ${packageName}`);
- await execAsync('../node_modules/typescript/bin/tsc', { cwd: testDirectory });
- utils.log(`Successfully compiled with ${packageName} as a dependency`);
- rimraf.sync(testDirectory);
+ utils.log('Testing packages:');
+ _.map(installablePackages, pkg => utils.log(`* ${pkg.packageJson.name}`));
+ // Run all package tests asynchronously and push promises into an array so
+ // we can wait for all of them to resolve.
+ const promises: Array<Promise<void>> = [];
+ const errors: PackageErr[] = [];
+ for (const installablePackage of installablePackages) {
+ const packagePromise = testInstallPackageAsync(monorepoRootPath, registry, installablePackage).catch(error => {
+ errors.push({ packageName: installablePackage.packageJson.name, error });
+ });
+ promises.push(packagePromise);
+ }
+ await Promise.all(promises);
+ if (errors.length > 0) {
+ // We sort error messages according to package topology so that we can
+ // them in a more intuitive order. E.g. if package A has an error and
+ // package B imports it, the tests for both package A and package B will
+ // fail. But package B only fails because of an error in package A.
+ // Since the error in package A is the root cause, we log it first.
+ const topologicallySortedPackages = utils.getTopologicallySortedPackages(monorepoRootPath);
+ const topologicallySortedErrors = _.sortBy(errors, packageErr =>
+ findPackageIndex(topologicallySortedPackages, packageErr.packageName),
+ );
+ _.forEach(topologicallySortedErrors, packageError => {
+ utils.log(`ERROR in package ${packageError.packageName}:`);
+ logIfDefined(packageError.error.message);
+ logIfDefined(packageError.error.stderr);
+ logIfDefined(packageError.error.stdout);
+ logIfDefined(packageError.error.stack);
+ });
+ process.exit(0);
}
})().catch(err => {
- utils.log(err.stdout);
- process.exit(1);
+ utils.log(`Unexpected error: ${err.message}`);
+ process.exit(0);
});
+
+async function testInstallPackageAsync(
+ monorepoRootPath: string,
+ registry: string,
+ installablePackage: Package,
+): Promise<void> {
+ const changelogPath = path.join(installablePackage.location, 'CHANGELOG.json');
+ const lastChangelogVersion = JSON.parse(fs.readFileSync(changelogPath).toString())[0].version;
+ const packageName = installablePackage.packageJson.name;
+ utils.log(`Testing ${packageName}@${lastChangelogVersion}`);
+ const packageDirName = path.join(...(packageName + '-test').split('/'));
+ const testDirectory = path.join(
+ monorepoRootPath,
+ 'packages',
+ 'monorepo-scripts',
+ '.installation-test',
+ packageDirName,
+ );
+ await rimrafAsync(testDirectory);
+ await mkdirpAsync(testDirectory);
+ await execAsync('yarn init --yes', { cwd: testDirectory });
+ const npmrcFilePath = path.join(testDirectory, '.npmrc');
+ await writeFileAsync(npmrcFilePath, `registry=${registry}`);
+ utils.log(`Installing ${packageName}@${lastChangelogVersion}`);
+ await execAsync(`npm install --save ${packageName}@${lastChangelogVersion} --registry=${registry}`, {
+ cwd: testDirectory,
+ });
+ const indexFilePath = path.join(testDirectory, 'index.ts');
+ await writeFileAsync(indexFilePath, `import * as Package from '${packageName}';\nconsole.log(Package);\n`);
+ const tsConfig = {
+ compilerOptions: {
+ typeRoots: ['node_modules/@0xproject/typescript-typings/types', 'node_modules/@types'],
+ module: 'commonjs',
+ target: 'es5',
+ lib: ['es2017', 'dom'],
+ declaration: true,
+ noImplicitReturns: true,
+ pretty: true,
+ strict: true,
+ },
+ include: ['index.ts'],
+ };
+ const tsconfigFilePath = path.join(testDirectory, 'tsconfig.json');
+ await writeFileAsync(tsconfigFilePath, JSON.stringify(tsConfig, null, '\t'));
+ utils.log(`Compiling ${packageName}`);
+ const tscBinaryPath = path.join(monorepoRootPath, './node_modules/typescript/bin/tsc');
+ await execAsync(tscBinaryPath, { cwd: testDirectory });
+ utils.log(`Successfully compiled with ${packageName} as a dependency`);
+ const isUnrunnablePkg = _.includes(UNRUNNABLE_PACKAGES, packageName);
+ if (!isUnrunnablePkg) {
+ const transpiledIndexFilePath = path.join(testDirectory, 'index.js');
+ utils.log(`Running test script with ${packageName} imported`);
+ await execAsync(`node ${transpiledIndexFilePath}`);
+ utils.log(`Successfilly ran test script with ${packageName} imported`);
+ }
+ await rimrafAsync(testDirectory);
+}
diff --git a/packages/monorepo-scripts/src/types.ts b/packages/monorepo-scripts/src/types.ts
index 7adec202f..d9e1dfabb 100644
--- a/packages/monorepo-scripts/src/types.ts
+++ b/packages/monorepo-scripts/src/types.ts
@@ -4,21 +4,48 @@ export interface UpdatedPackage {
private: boolean;
}
-export interface Changes {
+export interface Change {
note: string;
pr?: number;
}
-export interface Changelog {
+export type Changelog = VersionChangelog[];
+
+export interface VersionChangelog {
timestamp?: number;
version: string;
- changes: Changes[];
- isPublished?: boolean;
+ changes: Change[];
+}
+
+export interface PackageToNextVersion {
+ [name: string]: string;
+}
+
+export interface PackageRegistryJson {
+ versions: {
+ [version: string]: any;
+ };
+ time: {
+ [version: string]: string;
+ };
+}
+
+export interface GitTagsByPackageName {
+ [packageName: string]: string[];
+}
+
+export interface PackageJSON {
+ private?: boolean;
+ version: string;
+ name: string;
+ main?: string;
+ scripts?: { [command: string]: string };
+ config?: {
+ additionalTsTypings?: string[];
+ };
}
-export enum SemVerIndex {
- Invalid,
- Patch,
- Minor,
- Major,
+export interface Package {
+ location: string;
+ packageJson: PackageJSON;
}
diff --git a/packages/monorepo-scripts/src/utils.ts b/packages/monorepo-scripts/src/utils.ts
deleted file mode 100644
index 9aa37e272..000000000
--- a/packages/monorepo-scripts/src/utils.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import * as _ from 'lodash';
-import { exec as execAsync, spawn } from 'promisify-child-process';
-
-export const utils = {
- log(...args: any[]): void {
- console.log(...args); // tslint:disable-line:no-console
- },
- getNextPatchVersion(currentVersion: string): string {
- const versionSegments = currentVersion.split('.');
- const patch = _.parseInt(_.last(versionSegments) as string);
- const newPatch = patch + 1;
- const newPatchVersion = `${versionSegments[0]}.${versionSegments[1]}.${newPatch}`;
- return newPatchVersion;
- },
- async prettifyAsync(filePath: string, cwd: string) {
- await execAsync(`prettier --write ${filePath} --config .prettierrc`, {
- cwd,
- });
- },
-};
diff --git a/packages/monorepo-scripts/src/utils/changelog_utils.ts b/packages/monorepo-scripts/src/utils/changelog_utils.ts
new file mode 100644
index 000000000..4781b3b7d
--- /dev/null
+++ b/packages/monorepo-scripts/src/utils/changelog_utils.ts
@@ -0,0 +1,106 @@
+import * as fs from 'fs';
+import * as _ from 'lodash';
+import * as moment from 'moment';
+import * as path from 'path';
+import { exec as execAsync } from 'promisify-child-process';
+import semver = require('semver');
+
+import { constants } from '../constants';
+import { Change, Changelog, VersionChangelog } from '../types';
+
+const CHANGELOG_MD_HEADER = `
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+`;
+
+export const changelogUtils = {
+ getChangelogMdTitle(versionChangelog: VersionChangelog): string {
+ if (_.isUndefined(versionChangelog.timestamp)) {
+ throw new Error(
+ 'All CHANGELOG.json entries must be updated to include a timestamp before generating their MD version',
+ );
+ }
+ const date = moment(`${versionChangelog.timestamp}`, 'X').format('MMMM D, YYYY');
+ const title = `\n## v${versionChangelog.version} - _${date}_\n\n`;
+ return title;
+ },
+ getChangelogMdChange(change: Change): string {
+ let line = ` * ${change.note}`;
+ if (!_.isUndefined(change.pr)) {
+ line += ` (#${change.pr})`;
+ }
+ return line;
+ },
+ generateChangelogMd(changelog: Changelog): string {
+ let changelogMd = CHANGELOG_MD_HEADER;
+ _.each(changelog, versionChangelog => {
+ const title = changelogUtils.getChangelogMdTitle(versionChangelog);
+ changelogMd += title;
+ const changelogVersionLines = _.map(
+ versionChangelog.changes,
+ changelogUtils.getChangelogMdChange.bind(changelogUtils),
+ );
+ changelogMd += `${_.join(changelogVersionLines, '\n')}`;
+ });
+
+ return changelogMd;
+ },
+ shouldAddNewChangelogEntry(packageName: string, currentVersion: string, changelog: Changelog): boolean {
+ if (_.isEmpty(changelog)) {
+ return true;
+ }
+ const lastEntry = changelog[0];
+ if (semver.lt(lastEntry.version, currentVersion)) {
+ throw new Error(
+ `Found CHANGELOG version lower then current package version. ${packageName} current: ${currentVersion}, Changelog: ${
+ lastEntry.version
+ }`,
+ );
+ }
+ const isLastEntryCurrentVersion = lastEntry.version === currentVersion;
+ return isLastEntryCurrentVersion;
+ },
+ getChangelogJSONIfExists(changelogPath: string): string | undefined {
+ try {
+ const changelogJSON = fs.readFileSync(changelogPath, 'utf-8');
+ return changelogJSON;
+ } catch (err) {
+ return undefined;
+ }
+ },
+ getChangelogOrCreateIfMissing(packageName: string, packageLocation: string): Changelog {
+ const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json');
+ let changelogJsonIfExists = changelogUtils.getChangelogJSONIfExists(changelogJSONPath);
+ if (_.isUndefined(changelogJsonIfExists)) {
+ // If none exists, create new, empty one.
+ changelogJsonIfExists = '[]';
+ fs.writeFileSync(changelogJSONPath, changelogJsonIfExists);
+ }
+ let changelog: Changelog;
+ try {
+ changelog = JSON.parse(changelogJsonIfExists);
+ } catch (err) {
+ throw new Error(`${packageName}'s CHANGELOG.json contains invalid JSON. Please fix and try again.`);
+ }
+ return changelog;
+ },
+ async writeChangelogJsonFileAsync(packageLocation: string, changelog: Changelog): Promise<void> {
+ const changelogJSONPath = path.join(packageLocation, 'CHANGELOG.json');
+ fs.writeFileSync(changelogJSONPath, JSON.stringify(changelog, null, '\t'));
+ await changelogUtils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
+ },
+ async writeChangelogMdFileAsync(packageLocation: string, changelogMdString: string): Promise<void> {
+ const changelogMarkdownPath = path.join(packageLocation, 'CHANGELOG.md');
+ fs.writeFileSync(changelogMarkdownPath, changelogMdString);
+ await changelogUtils.prettifyAsync(changelogMarkdownPath, constants.monorepoRootPath);
+ },
+ async prettifyAsync(filePath: string, cwd: string): Promise<void> {
+ await execAsync(`prettier --write ${filePath} --config .prettierrc`, {
+ cwd,
+ });
+ },
+};
diff --git a/packages/monorepo-scripts/src/utils/configs.ts b/packages/monorepo-scripts/src/utils/configs.ts
new file mode 100644
index 000000000..e579bdb7c
--- /dev/null
+++ b/packages/monorepo-scripts/src/utils/configs.ts
@@ -0,0 +1,8 @@
+const IS_LOCAL_PUBLISH = process.env.IS_LOCAL_PUBLISH === 'true';
+const LOCAL_NPM_REGISTRY_URL = 'http://localhost:4873';
+const REMOTE_NPM_REGISTRY_URL = 'https://registry.npmjs.org';
+
+export const configs = {
+ IS_LOCAL_PUBLISH,
+ NPM_REGISTRY_URL: IS_LOCAL_PUBLISH ? LOCAL_NPM_REGISTRY_URL : REMOTE_NPM_REGISTRY_URL,
+};
diff --git a/packages/monorepo-scripts/src/utils/npm_utils.ts b/packages/monorepo-scripts/src/utils/npm_utils.ts
new file mode 100644
index 000000000..363e31fbb
--- /dev/null
+++ b/packages/monorepo-scripts/src/utils/npm_utils.ts
@@ -0,0 +1,29 @@
+import 'isomorphic-fetch';
+import * as _ from 'lodash';
+
+import { PackageRegistryJson } from '../types';
+
+import { configs } from './configs';
+
+const SUCCESS_STATUS = 200;
+const NOT_FOUND_STATUS = 404;
+
+export const npmUtils = {
+ async getPackageRegistryJsonIfExistsAsync(packageName: string): Promise<PackageRegistryJson | undefined> {
+ const url = `${configs.NPM_REGISTRY_URL}/${packageName}`;
+ const response = await fetch(url);
+
+ if (response.status === NOT_FOUND_STATUS) {
+ return undefined;
+ } else if (response.status !== SUCCESS_STATUS) {
+ throw new Error(`Request to ${url} failed. Check your internet connection and that npm registry is up.`);
+ }
+ const packageRegistryJson = await response.json();
+ return packageRegistryJson;
+ },
+ getPreviouslyPublishedVersions(packageRegistryJson: PackageRegistryJson): string[] {
+ const timeWithOnlyVersions = _.omit(packageRegistryJson.time, ['modified', 'created']);
+ const versions = _.keys(timeWithOnlyVersions);
+ return versions;
+ },
+};
diff --git a/packages/monorepo-scripts/src/utils/utils.ts b/packages/monorepo-scripts/src/utils/utils.ts
new file mode 100644
index 000000000..26ac801bd
--- /dev/null
+++ b/packages/monorepo-scripts/src/utils/utils.ts
@@ -0,0 +1,167 @@
+import batchPackages = require('@lerna/batch-packages');
+import * as fs from 'fs';
+import * as _ from 'lodash';
+import { exec as execAsync } from 'promisify-child-process';
+import semver = require('semver');
+
+import { constants } from '../constants';
+import { GitTagsByPackageName, Package, PackageJSON, UpdatedPackage } from '../types';
+
+import { changelogUtils } from './changelog_utils';
+
+export const utils = {
+ log(...args: any[]): void {
+ console.log(...args); // tslint:disable-line:no-console
+ },
+ getTopologicallySortedPackages(rootDir: string): Package[] {
+ const packages = utils.getPackages(rootDir);
+ const batchedPackages: PackageJSON[] = _.flatten(batchPackages(_.map(packages, pkg => pkg.packageJson), false));
+ const topsortedPackages: Package[] = _.map(
+ batchedPackages,
+ (pkg: PackageJSON) => _.find(packages, pkg1 => pkg1.packageJson.name === pkg.name) as Package,
+ );
+ return topsortedPackages;
+ },
+ getPackages(rootDir: string): Package[] {
+ const rootPackageJsonString = fs.readFileSync(`${rootDir}/package.json`, 'utf8');
+ const rootPackageJson = JSON.parse(rootPackageJsonString);
+ if (_.isUndefined(rootPackageJson.workspaces)) {
+ throw new Error(`Did not find 'workspaces' key in root package.json`);
+ }
+ const packages = [];
+ for (const workspace of rootPackageJson.workspaces) {
+ // HACK: Remove allowed wildcards from workspace entries.
+ // This might be entirely comprehensive.
+ const workspacePath = workspace.replace('*', '').replace('**/*', '');
+ const subpackageNames = fs.readdirSync(`${rootDir}/${workspacePath}`);
+ for (const subpackageName of subpackageNames) {
+ if (_.startsWith(subpackageName, '.')) {
+ continue;
+ }
+ const pathToPackageJson = `${rootDir}/${workspacePath}${subpackageName}`;
+ try {
+ const packageJsonString = fs.readFileSync(`${pathToPackageJson}/package.json`, 'utf8');
+ const packageJson = JSON.parse(packageJsonString);
+ const pkg = {
+ location: pathToPackageJson,
+ packageJson,
+ };
+ packages.push(pkg);
+ } catch (err) {
+ utils.log(`Couldn't find a 'package.json' for ${subpackageName}. Skipping.`);
+ }
+ }
+ }
+ return packages;
+ },
+ async getUpdatedPackagesAsync(shouldIncludePrivate: boolean): Promise<Package[]> {
+ const updatedPublicPackages = await utils.getLernaUpdatedPackagesAsync(shouldIncludePrivate);
+ const updatedPackageNames = _.map(updatedPublicPackages, pkg => pkg.name);
+
+ const allPackages = utils.getPackages(constants.monorepoRootPath);
+ const updatedPackages = _.filter(allPackages, pkg => {
+ return _.includes(updatedPackageNames, pkg.packageJson.name);
+ });
+ return updatedPackages;
+ },
+ async getLernaUpdatedPackagesAsync(shouldIncludePrivate: boolean): Promise<UpdatedPackage[]> {
+ const result = await execAsync(`${constants.lernaExecutable} updated --json`, {
+ cwd: constants.monorepoRootPath,
+ });
+ const updatedPackages = JSON.parse(result.stdout);
+ if (!shouldIncludePrivate) {
+ const updatedPublicPackages = _.filter(updatedPackages, updatedPackage => !updatedPackage.private);
+ return updatedPublicPackages;
+ }
+ return updatedPackages;
+ },
+ async getNextPackageVersionAsync(
+ currentVersion: string,
+ packageName: string,
+ packageLocation: string,
+ ): Promise<string> {
+ let nextVersionIfValid;
+ const changelog = changelogUtils.getChangelogOrCreateIfMissing(packageName, packageLocation);
+ if (_.isEmpty(changelog)) {
+ nextVersionIfValid = semver.inc(currentVersion, 'patch');
+ }
+ const lastEntry = changelog[0];
+ if (semver.gt(currentVersion, lastEntry.version)) {
+ throw new Error(`Package.json version cannot be greater then last CHANGELOG entry. Check: ${packageName}`);
+ }
+ nextVersionIfValid = semver.eq(lastEntry.version, currentVersion)
+ ? semver.inc(currentVersion, 'patch')
+ : lastEntry.version;
+ if (_.isNull(nextVersionIfValid)) {
+ throw new Error(`Encountered invalid semver: ${currentVersion} associated with ${packageName}`);
+ }
+ return nextVersionIfValid;
+ },
+ async getRemoteGitTagsAsync(): Promise<string[]> {
+ const result = await execAsync(`git ls-remote --tags`, {
+ cwd: constants.monorepoRootPath,
+ });
+ const tagsString = result.stdout;
+ const tagOutputs: string[] = tagsString.split('\n');
+ const tags = _.compact(
+ _.map(tagOutputs, tagOutput => {
+ const tag = tagOutput.split('refs/tags/')[1];
+ // Tags with `^{}` are duplicateous so we ignore them
+ // Source: https://stackoverflow.com/questions/15472107/when-listing-git-ls-remote-why-theres-after-the-tag-name
+ if (_.endsWith(tag, '^{}')) {
+ return undefined;
+ }
+ return tag;
+ }),
+ );
+ return tags;
+ },
+ async getLocalGitTagsAsync(): Promise<string[]> {
+ const result = await execAsync(`git tag`, {
+ cwd: constants.monorepoRootPath,
+ });
+ const tagsString = result.stdout;
+ const tags = tagsString.split('\n');
+ return tags;
+ },
+ async getGitTagsByPackageNameAsync(packageNames: string[], gitTags: string[]): Promise<GitTagsByPackageName> {
+ const tagVersionByPackageName: GitTagsByPackageName = {};
+ _.each(gitTags, tag => {
+ const packageNameIfExists = _.find(packageNames, name => {
+ return _.includes(tag, `${name}@`);
+ });
+ if (_.isUndefined(packageNameIfExists)) {
+ return; // ignore tags not related to a package we care about.
+ }
+ const splitTag = tag.split(`${packageNameIfExists}@`);
+ if (splitTag.length !== 2) {
+ throw new Error(`Unexpected tag name found: ${tag}`);
+ }
+ const version = splitTag[1];
+ (tagVersionByPackageName[packageNameIfExists] || (tagVersionByPackageName[packageNameIfExists] = [])).push(
+ version,
+ );
+ });
+ return tagVersionByPackageName;
+ },
+ async removeLocalTagAsync(tagName: string): Promise<void> {
+ try {
+ await execAsync(`git tag -d ${tagName}`, {
+ cwd: constants.monorepoRootPath,
+ });
+ } catch (err) {
+ throw new Error(`Failed to delete local git tag. Got err: ${err}`);
+ }
+ utils.log(`Removed local tag: ${tagName}`);
+ },
+ async removeRemoteTagAsync(tagName: string): Promise<void> {
+ try {
+ await execAsync(`git push origin ${tagName}`, {
+ cwd: constants.monorepoRootPath,
+ });
+ } catch (err) {
+ throw new Error(`Failed to delete remote git tag. Got err: ${err}`);
+ }
+ utils.log(`Removed remote tag: ${tagName}`);
+ },
+};
diff --git a/packages/monorepo-scripts/tsconfig.json b/packages/monorepo-scripts/tsconfig.json
index 5ec2db5e0..332d3a5e1 100644
--- a/packages/monorepo-scripts/tsconfig.json
+++ b/packages/monorepo-scripts/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "typeRoots": ["node_modules/@types"],
+ "typeRoots": ["../../node_modules/@types", "node_modules/@types"],
"outDir": "lib"
},
"include": ["./src/**/*"]
diff --git a/packages/monorepo-scripts/tslint.json b/packages/monorepo-scripts/tslint.json
index ffaefe83a..d67c2e490 100644
--- a/packages/monorepo-scripts/tslint.json
+++ b/packages/monorepo-scripts/tslint.json
@@ -1,3 +1,3 @@
{
- "extends": ["@0xproject/tslint-config"]
+ "extends": ["../tslint-config"]
}
diff --git a/packages/order-utils/.npmignore b/packages/order-utils/.npmignore
new file mode 100644
index 000000000..89302c908
--- /dev/null
+++ b/packages/order-utils/.npmignore
@@ -0,0 +1,7 @@
+.*
+yarn-error.log
+/scripts/
+/generated_docs/
+/src/
+tsconfig.json
+/lib/monorepo_scripts/
diff --git a/packages/order-utils/CHANGELOG.json b/packages/order-utils/CHANGELOG.json
new file mode 100644
index 000000000..a81eb077d
--- /dev/null
+++ b/packages/order-utils/CHANGELOG.json
@@ -0,0 +1,153 @@
+[
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "pr": 914,
+ "note":
+ "Update ecSignOrderHashAsync to return signature string with signature type byte. Removes messagePrefixOpts."
+ },
+ {
+ "note":
+ "Added a synchronous `createOrder` method in `orderFactory`, updated public interfaces to support some optional parameters",
+ "pr": 936
+ },
+ {
+ "note": "Added marketUtils",
+ "pr": 937
+ },
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532357734
+ },
+ {
+ "version": "1.0.0-rc.2",
+ "changes": [
+ {
+ "note":
+ "Upgrade ethereumjs-abi dep including a fix so that addresses starting with 0 are properly decoded by `decodeERC20AssetData`"
+ }
+ ],
+ "timestamp": 1532357734
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Refactor to work with V2 of 0x protocol",
+ "pr": 636
+ },
+ {
+ "note": "Export parseECSignature method",
+ "pr": 684
+ },
+ {
+ "note": "Handle Typed Arrays when hashing data",
+ "pr": 894
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note":
+ "Add orderStateUtils, a module for computing order state needed to decide if an order is still valid"
+ }
+ ],
+ "timestamp": 1527008794
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525453812,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ }
+]
diff --git a/packages/order-utils/CHANGELOG.md b/packages/order-utils/CHANGELOG.md
new file mode 100644
index 000000000..0df2a6a75
--- /dev/null
+++ b/packages/order-utils/CHANGELOG.md
@@ -0,0 +1,67 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.1-rc.3 - _August 13, 2018_
+
+ * Update ecSignOrderHashAsync to return signature string with signature type byte. Removes messagePrefixOpts. (#914)
+ * Added a synchronous `createOrder` method in `orderFactory`, updated public interfaces to support some optional parameters (#936)
+ * Added marketUtils (#937)
+ * Dependencies updated
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.2 - _July 23, 2018_
+
+ * Upgrade ethereumjs-abi dep including a fix so that addresses starting with 0 are properly decoded by `decodeERC20AssetData`
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Refactor to work with V2 of 0x protocol (#636)
+ * Export parseECSignature method (#684)
+ * Handle Typed Arrays when hashing data (#894)
+
+## v0.0.9 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.8 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.6 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.0.5 - _May 22, 2018_
+
+ * Add orderStateUtils, a module for computing order state needed to decide if an order is still valid
+
+## v0.0.4 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.3 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.2 - _May 4, 2018_
+
+ * Dependencies updated
diff --git a/packages/order-utils/README.md b/packages/order-utils/README.md
new file mode 100644
index 000000000..33df1d4b0
--- /dev/null
+++ b/packages/order-utils/README.md
@@ -0,0 +1,65 @@
+## @0xproject/order-utils
+
+0x order-related utilities for those developing on top of 0x protocol.
+
+### Read the [Documentation](https://0xproject.com/docs/order-utils).
+
+## Installation
+
+```bash
+yarn add @0xproject/order-utils
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/order-utils yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/order-utils yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
diff --git a/packages/order-utils/coverage/.gitkeep b/packages/order-utils/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/order-utils/coverage/.gitkeep
diff --git a/packages/order-utils/package.json b/packages/order-utils/package.json
new file mode 100644
index 000000000..fa8f3563e
--- /dev/null
+++ b/packages/order-utils/package.json
@@ -0,0 +1,95 @@
+{
+ "name": "@0xproject/order-utils",
+ "version": "1.0.1-rc.3",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "0x order utils",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "run-s pre_build transpile copy_monorepo_scripts",
+ "pre_build": "run-s update_artifacts_v2_beta update_artifacts_v2 generate_contract_wrappers",
+ "transpile": "tsc",
+ "copy_monorepo_scripts": "copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "generate_contract_wrappers": "abi-gen --abis 'lib/src/artifacts/@(Exchange|IWallet|IValidator|DummyERC20Token|ERC20Proxy|ERC20Token).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
+ "update_artifacts_v2_beta": "for i in ${npm_package_config_contracts_v2_beta}; do copyfiles -u 4 ../migrations/artifacts/2.0.0-beta-testnet/$i.json lib/src/artifacts; done;",
+ "update_artifacts_v2": "for i in ${npm_package_config_contracts_v2}; do copyfiles -u 4 ../migrations/artifacts/2.0.0/$i.json lib/src/artifacts; done;",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
+ "test:circleci": "yarn test:coverage",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "clean": "shx rm -rf lib scripts lib/src/artifacts src/generated_contract_wrappers",
+ "lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
+ "docs:stage": "node scripts/stage_docs.js",
+ "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
+ "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
+ },
+ "config": {
+ "contracts_v2_beta": "IWallet IValidator Exchange ERC20Proxy ERC20Token",
+ "contracts_v2": "DummyERC20Token",
+ "postpublish": {
+ "docPublishConfigs": {
+ "extraFileIncludes": [
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
+ ],
+ "s3BucketPath": "s3://doc-jsons/order-utils/",
+ "s3StagingBucketPath": "s3://staging-doc-jsons/order-utils/"
+ }
+ }
+ },
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/order-utils/README.md",
+ "devDependencies": {
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/bn.js": "^4.11.0",
+ "@types/lodash": "4.14.104",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "chai-bignumber": "^2.0.1",
+ "copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
+ "npm-run-all": "^4.1.2",
+ "shx": "^0.2.2",
+ "sinon": "^4.0.0",
+ "tslint": "5.11.0",
+ "typedoc": "0xProject/typedoc",
+ "typescript": "2.9.2"
+ },
+ "dependencies": {
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@types/node": "^8.0.53",
+ "bn.js": "^4.11.8",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-abi": "0.6.5",
+ "ethereumjs-util": "^5.1.1",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_fetcher.ts b/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_fetcher.ts
new file mode 100644
index 000000000..b2760d98e
--- /dev/null
+++ b/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_fetcher.ts
@@ -0,0 +1,6 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractBalanceAndProxyAllowanceFetcher {
+ public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>;
+ public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>;
+}
diff --git a/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts b/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts
new file mode 100644
index 000000000..38e08b7fe
--- /dev/null
+++ b/packages/order-utils/src/abstract/abstract_balance_and_proxy_allowance_lazy_store.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractBalanceAndProxyAllowanceLazyStore {
+ public abstract async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber>;
+ public abstract async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber>;
+ public abstract setBalance(assetData: string, userAddress: string, balance: BigNumber): void;
+ public abstract deleteBalance(assetData: string, userAddress: string): void;
+ public abstract setProxyAllowance(assetData: string, userAddress: string, proxyAllowance: BigNumber): void;
+ public abstract deleteProxyAllowance(assetData: string, userAddress: string): void;
+ public abstract deleteAll(): void;
+}
diff --git a/packages/order-utils/src/abstract/abstract_order_filled_cancelled_fetcher.ts b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_fetcher.ts
new file mode 100644
index 000000000..865ea4e43
--- /dev/null
+++ b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_fetcher.ts
@@ -0,0 +1,7 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractOrderFilledCancelledFetcher {
+ public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>;
+ public abstract async isOrderCancelledAsync(orderHash: string): Promise<boolean>;
+ public abstract getZRXAssetData(): string;
+}
diff --git a/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts
new file mode 100644
index 000000000..617bcb224
--- /dev/null
+++ b/packages/order-utils/src/abstract/abstract_order_filled_cancelled_lazy_store.ts
@@ -0,0 +1,12 @@
+import { BigNumber } from '@0xproject/utils';
+
+export abstract class AbstractOrderFilledCancelledLazyStore {
+ public abstract async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber>;
+ public abstract async getIsCancelledAsync(orderHash: string): Promise<boolean>;
+ public abstract setFilledTakerAmount(orderHash: string, balance: BigNumber): void;
+ public abstract deleteFilledTakerAmount(orderHash: string): void;
+ public abstract setIsCancelled(orderHash: string, isCancelled: boolean): void;
+ public abstract deleteIsCancelled(orderHash: string): void;
+ public abstract deleteAll(): void;
+ public abstract getZRXAssetData(): string;
+}
diff --git a/packages/order-utils/src/artifacts.ts b/packages/order-utils/src/artifacts.ts
new file mode 100644
index 000000000..3d2d1e953
--- /dev/null
+++ b/packages/order-utils/src/artifacts.ts
@@ -0,0 +1,14 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as DummyERC20Token from './artifacts/DummyERC20Token.json';
+import * as ERC20Proxy from './artifacts/ERC20Proxy.json';
+import * as Exchange from './artifacts/Exchange.json';
+import * as IValidator from './artifacts/IValidator.json';
+import * as IWallet from './artifacts/IWallet.json';
+export const artifacts = {
+ ERC20Proxy: (ERC20Proxy as any) as ContractArtifact,
+ DummyERC20Token: (DummyERC20Token as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ IWallet: (IWallet as any) as ContractArtifact,
+ IValidator: (IValidator as any) as ContractArtifact,
+};
diff --git a/packages/order-utils/src/assert.ts b/packages/order-utils/src/assert.ts
new file mode 100644
index 000000000..f8db7ac63
--- /dev/null
+++ b/packages/order-utils/src/assert.ts
@@ -0,0 +1,37 @@
+import { assert as sharedAssert } from '@0xproject/assert';
+// HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here
+// tslint:disable:no-unused-variable
+import { Schema } from '@0xproject/json-schemas';
+import { ECSignature, SignatureType } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+// tslint:enable:no-unused-variable
+import * as _ from 'lodash';
+
+import { utils } from './utils';
+
+export const assert = {
+ ...sharedAssert,
+ async isSenderAddressAsync(
+ variableName: string,
+ senderAddressHex: string,
+ web3Wrapper: Web3Wrapper,
+ ): Promise<void> {
+ sharedAssert.isETHAddressHex(variableName, senderAddressHex);
+ const isSenderAddressAvailable = await web3Wrapper.isSenderAddressAvailableAsync(senderAddressHex);
+ sharedAssert.assert(
+ isSenderAddressAvailable,
+ `Specified ${variableName} ${senderAddressHex} isn't available through the supplied web3 provider`,
+ );
+ },
+ isOneOfExpectedSignatureTypes(signature: string, signatureTypes: SignatureType[]): void {
+ sharedAssert.isHexString('signature', signature);
+ const signatureTypeIndexIfExists = utils.getSignatureTypeIndexIfExists(signature);
+ const isExpectedSignatureType = _.includes(signatureTypes, signatureTypeIndexIfExists);
+ if (!isExpectedSignatureType) {
+ throw new Error(
+ `Unexpected signatureType: ${signatureTypeIndexIfExists}. Valid signature types: ${signatureTypes}`,
+ );
+ }
+ },
+};
diff --git a/packages/order-utils/src/asset_data_utils.ts b/packages/order-utils/src/asset_data_utils.ts
new file mode 100644
index 000000000..0c0b59548
--- /dev/null
+++ b/packages/order-utils/src/asset_data_utils.ts
@@ -0,0 +1,139 @@
+import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import ethAbi = require('ethereumjs-abi');
+import ethUtil = require('ethereumjs-util');
+
+import { constants } from './constants';
+
+export const assetDataUtils = {
+ /**
+ * Encodes an ERC20 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC20 token address to encode
+ * @return The hex encoded assetData string
+ */
+ encodeERC20AssetData(tokenAddress: string): string {
+ return ethUtil.bufferToHex(ethAbi.simpleEncode('ERC20Token(address)', tokenAddress));
+ },
+ /**
+ * Decodes an ERC20 assetData hex string into it's corresponding ERC20 tokenAddress & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress & assetProxyId
+ */
+ decodeERC20AssetData(assetData: string): ERC20AssetData {
+ const data = ethUtil.toBuffer(assetData);
+ if (data.byteLength < constants.ERC20_ASSET_DATA_BYTE_LENGTH) {
+ throw new Error(
+ `Could not decode ERC20 Proxy Data. Expected length of encoded data to be at least ${
+ constants.ERC20_ASSET_DATA_BYTE_LENGTH
+ }. Got ${data.byteLength}`,
+ );
+ }
+ const assetProxyId = ethUtil.bufferToHex(data.slice(0, constants.SELECTOR_LENGTH));
+ if (assetProxyId !== AssetProxyId.ERC20) {
+ throw new Error(
+ `Could not decode ERC20 Proxy Data. Expected Asset Proxy Id to be ERC20 (${
+ AssetProxyId.ERC20
+ }), but got ${assetProxyId}`,
+ );
+ }
+ const [tokenAddress] = ethAbi.rawDecode(['address'], data.slice(constants.SELECTOR_LENGTH));
+ return {
+ assetProxyId,
+ tokenAddress: ethUtil.addHexPrefix(tokenAddress),
+ };
+ },
+ /**
+ * Encodes an ERC721 token address into a hex encoded assetData string, usable in the makerAssetData or
+ * takerAssetData fields in a 0x order.
+ * @param tokenAddress The ERC721 token address to encode
+ * @param tokenId The ERC721 tokenId to encode
+ * @return The hex encoded assetData string
+ */
+ encodeERC721AssetData(tokenAddress: string, tokenId: BigNumber): string {
+ // TODO: Pass `tokendId` as a BigNumber.
+ return ethUtil.bufferToHex(
+ ethAbi.simpleEncode(
+ 'ERC721Token(address,uint256)',
+ tokenAddress,
+ `0x${tokenId.toString(constants.BASE_16)}`,
+ ),
+ );
+ },
+ /**
+ * Decodes an ERC721 assetData hex string into it's corresponding ERC721 tokenAddress, tokenId & assetProxyId
+ * @param assetData Hex encoded assetData string to decode
+ * @return An object containing the decoded tokenAddress, tokenId & assetProxyId
+ */
+ decodeERC721AssetData(assetData: string): ERC721AssetData {
+ const data = ethUtil.toBuffer(assetData);
+ if (data.byteLength < constants.ERC721_ASSET_DATA_MINIMUM_BYTE_LENGTH) {
+ throw new Error(
+ `Could not decode ERC721 Asset Data. Expected length of encoded data to be at least ${
+ constants.ERC721_ASSET_DATA_MINIMUM_BYTE_LENGTH
+ }. Got ${data.byteLength}`,
+ );
+ }
+ const assetProxyId = ethUtil.bufferToHex(data.slice(0, constants.SELECTOR_LENGTH));
+ if (assetProxyId !== AssetProxyId.ERC721) {
+ throw new Error(
+ `Could not decode ERC721 Asset Data. Expected Asset Proxy Id to be ERC721 (${
+ AssetProxyId.ERC721
+ }), but got ${assetProxyId}`,
+ );
+ }
+ const [tokenAddress, tokenId] = ethAbi.rawDecode(['address', 'uint256'], data.slice(constants.SELECTOR_LENGTH));
+ return {
+ assetProxyId,
+ tokenAddress: ethUtil.addHexPrefix(tokenAddress),
+ tokenId: new BigNumber(tokenId.toString()),
+ };
+ },
+ /**
+ * Decode and return the assetProxyId from the assetData
+ * @param assetData Hex encoded assetData string to decode
+ * @return The assetProxyId
+ */
+ decodeAssetProxyId(assetData: string): AssetProxyId {
+ const encodedAssetData = ethUtil.toBuffer(assetData);
+ if (encodedAssetData.byteLength < constants.SELECTOR_LENGTH) {
+ throw new Error(
+ `Could not decode assetData. Expected length of encoded data to be at least 4. Got ${
+ encodedAssetData.byteLength
+ }`,
+ );
+ }
+ const encodedAssetProxyId = encodedAssetData.slice(0, constants.SELECTOR_LENGTH);
+ const assetProxyId = decodeAssetProxyId(encodedAssetProxyId);
+ return assetProxyId;
+ },
+ /**
+ * Decode any assetData into it's corresponding assetData object
+ * @param assetData Hex encoded assetData string to decode
+ * @return Either a ERC20 or ERC721 assetData object
+ */
+ decodeAssetDataOrThrow(assetData: string): ERC20AssetData | ERC721AssetData {
+ const assetProxyId = assetDataUtils.decodeAssetProxyId(assetData);
+ switch (assetProxyId) {
+ case AssetProxyId.ERC20:
+ const erc20AssetData = assetDataUtils.decodeERC20AssetData(assetData);
+ return erc20AssetData;
+ case AssetProxyId.ERC721:
+ const erc721AssetData = assetDataUtils.decodeERC721AssetData(assetData);
+ return erc721AssetData;
+ default:
+ throw new Error(`Unrecognized asset proxy id: ${assetProxyId}`);
+ }
+ },
+};
+
+function decodeAssetProxyId(encodedAssetProxyId: Buffer): AssetProxyId {
+ const hexString = ethUtil.bufferToHex(encodedAssetProxyId);
+ if (hexString === AssetProxyId.ERC20) {
+ return AssetProxyId.ERC20;
+ }
+ if (hexString === AssetProxyId.ERC721) {
+ return AssetProxyId.ERC721;
+ }
+ throw new Error(`Invalid ProxyId: ${hexString}`);
+}
diff --git a/packages/order-utils/src/constants.ts b/packages/order-utils/src/constants.ts
new file mode 100644
index 000000000..c23578c20
--- /dev/null
+++ b/packages/order-utils/src/constants.ts
@@ -0,0 +1,16 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const constants = {
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ NULL_BYTES: '0x',
+ // tslint:disable-next-line:custom-no-magic-numbers
+ UNLIMITED_ALLOWANCE_IN_BASE_UNITS: new BigNumber(2).pow(256).minus(1),
+ TESTRPC_NETWORK_ID: 50,
+ ADDRESS_LENGTH: 20,
+ ERC20_ASSET_DATA_BYTE_LENGTH: 36,
+ ERC721_ASSET_DATA_MINIMUM_BYTE_LENGTH: 53,
+ SELECTOR_LENGTH: 4,
+ BASE_16: 16,
+ INFINITE_TIMESTAMP_SEC: new BigNumber(2524604400), // Close to infinite
+ ZERO_AMOUNT: new BigNumber(0),
+};
diff --git a/packages/order-utils/src/crypto.ts b/packages/order-utils/src/crypto.ts
new file mode 100644
index 000000000..0f1504a72
--- /dev/null
+++ b/packages/order-utils/src/crypto.ts
@@ -0,0 +1,46 @@
+import BN = require('bn.js');
+import ABI = require('ethereumjs-abi');
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+
+export const crypto = {
+ /**
+ * We convert types from JS to Solidity as follows:
+ * BigNumber -> uint256
+ * number -> uint8
+ * string -> string
+ * boolean -> bool
+ * valid Ethereum address -> address
+ */
+ solSHA3(args: any[]): Buffer {
+ return crypto._solHash(args, ABI.soliditySHA3);
+ },
+ solSHA256(args: any[]): Buffer {
+ return crypto._solHash(args, ABI.soliditySHA256);
+ },
+ _solHash(args: any[], hashFunction: (types: string[], values: any[]) => Buffer): Buffer {
+ const argTypes: string[] = [];
+ _.each(args, (arg, i) => {
+ const isNumber = _.isFinite(arg);
+ if (isNumber) {
+ argTypes.push('uint8');
+ } else if (arg.isBigNumber) {
+ argTypes.push('uint256');
+ const base = 10;
+ args[i] = new BN(arg.toString(base), base);
+ } else if (ethUtil.isValidAddress(arg)) {
+ argTypes.push('address');
+ } else if (_.isString(arg)) {
+ argTypes.push('string');
+ } else if (_.isBuffer(arg) || _.isTypedArray(arg)) {
+ argTypes.push('bytes');
+ } else if (_.isBoolean(arg)) {
+ argTypes.push('bool');
+ } else {
+ throw new Error(`Unable to guess arg type: ${arg}`);
+ }
+ });
+ const hash = hashFunction(argTypes, args);
+ return hash;
+ },
+};
diff --git a/packages/order-utils/src/eip712_utils.ts b/packages/order-utils/src/eip712_utils.ts
new file mode 100644
index 000000000..2594e6d6d
--- /dev/null
+++ b/packages/order-utils/src/eip712_utils.ts
@@ -0,0 +1,93 @@
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+
+import { crypto } from './crypto';
+import { EIP712Schema, EIP712Types } from './types';
+
+const EIP191_PREFIX = '\x19\x01';
+const EIP712_DOMAIN_NAME = '0x Protocol';
+const EIP712_DOMAIN_VERSION = '2';
+const EIP712_VALUE_LENGTH = 32;
+
+const EIP712_DOMAIN_SCHEMA: EIP712Schema = {
+ name: 'EIP712Domain',
+ parameters: [
+ { name: 'name', type: EIP712Types.String },
+ { name: 'version', type: EIP712Types.String },
+ { name: 'verifyingContract', type: EIP712Types.Address },
+ ],
+};
+
+export const EIP712Utils = {
+ /**
+ * Compiles the EIP712Schema and returns the hash of the schema.
+ * @param schema The EIP712 schema.
+ * @return The hash of the compiled schema
+ */
+ compileSchema(schema: EIP712Schema): Buffer {
+ const eip712Schema = EIP712Utils._encodeType(schema);
+ const eip712SchemaHashBuffer = crypto.solSHA3([eip712Schema]);
+ return eip712SchemaHashBuffer;
+ },
+ /**
+ * Merges the EIP712 hash of a struct with the DomainSeparator for 0x v2.
+ * @param hashStruct the EIP712 hash of a struct
+ * @param contractAddress the exchange contract address
+ * @return The hash of an EIP712 message with domain separator prefixed
+ */
+ createEIP712Message(hashStruct: Buffer, contractAddress: string): Buffer {
+ const domainSeparatorHashBuffer = EIP712Utils._getDomainSeparatorHashBuffer(contractAddress);
+ const messageBuff = crypto.solSHA3([EIP191_PREFIX, domainSeparatorHashBuffer, hashStruct]);
+ return messageBuff;
+ },
+ pad32Address(address: string): Buffer {
+ const addressBuffer = ethUtil.toBuffer(address);
+ const addressPadded = EIP712Utils.pad32Buffer(addressBuffer);
+ return addressPadded;
+ },
+ pad32Buffer(buffer: Buffer): Buffer {
+ const bufferPadded = ethUtil.setLengthLeft(buffer, EIP712_VALUE_LENGTH);
+ return bufferPadded;
+ },
+ _getDomainSeparatorSchemaBuffer(): Buffer {
+ return EIP712Utils.compileSchema(EIP712_DOMAIN_SCHEMA);
+ },
+ _getDomainSeparatorHashBuffer(exchangeAddress: string): Buffer {
+ const domainSeparatorSchemaBuffer = EIP712Utils._getDomainSeparatorSchemaBuffer();
+ const encodedData = EIP712Utils._encodeData(EIP712_DOMAIN_SCHEMA, {
+ name: EIP712_DOMAIN_NAME,
+ version: EIP712_DOMAIN_VERSION,
+ verifyingContract: exchangeAddress,
+ });
+ const domainSeparatorHashBuff2 = crypto.solSHA3([domainSeparatorSchemaBuffer, ...encodedData]);
+ return domainSeparatorHashBuff2;
+ },
+ _encodeType(schema: EIP712Schema): string {
+ const namedTypes = _.map(schema.parameters, ({ name, type }) => `${type} ${name}`);
+ const namedTypesJoined = namedTypes.join(',');
+ const encodedType = `${schema.name}(${namedTypesJoined})`;
+ return encodedType;
+ },
+ _encodeData(schema: EIP712Schema, data: { [key: string]: any }): any {
+ const encodedValues = [];
+ for (const parameter of schema.parameters) {
+ const value = data[parameter.name];
+ if (parameter.type === EIP712Types.String || parameter.type === EIP712Types.Bytes) {
+ encodedValues.push(crypto.solSHA3([ethUtil.toBuffer(value)]));
+ } else if (parameter.type === EIP712Types.Uint256) {
+ encodedValues.push(value);
+ } else if (parameter.type === EIP712Types.Address) {
+ encodedValues.push(EIP712Utils.pad32Address(value));
+ } else {
+ throw new Error(`Unable to encode ${parameter.type}`);
+ }
+ }
+ return encodedValues;
+ },
+ structHash(schema: EIP712Schema, data: { [key: string]: any }): Buffer {
+ const encodedData = EIP712Utils._encodeData(schema, data);
+ const schemaHash = EIP712Utils.compileSchema(schema);
+ const hashBuffer = crypto.solSHA3([schemaHash, ...encodedData]);
+ return hashBuffer;
+ },
+};
diff --git a/packages/order-utils/src/exchange_transfer_simulator.ts b/packages/order-utils/src/exchange_transfer_simulator.ts
new file mode 100644
index 000000000..c3a4f9c2a
--- /dev/null
+++ b/packages/order-utils/src/exchange_transfer_simulator.ts
@@ -0,0 +1,116 @@
+import { ExchangeContractErrs } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { AbstractBalanceAndProxyAllowanceLazyStore } from './abstract/abstract_balance_and_proxy_allowance_lazy_store';
+import { constants } from './constants';
+import { TradeSide, TransferType } from './types';
+
+enum FailureReason {
+ Balance = 'balance',
+ ProxyAllowance = 'proxyAllowance',
+}
+
+const ERR_MSG_MAPPING = {
+ [FailureReason.Balance]: {
+ [TradeSide.Maker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerBalance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeBalance,
+ },
+ [TradeSide.Taker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerBalance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeBalance,
+ },
+ },
+ [FailureReason.ProxyAllowance]: {
+ [TradeSide.Maker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientMakerAllowance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientMakerFeeAllowance,
+ },
+ [TradeSide.Taker]: {
+ [TransferType.Trade]: ExchangeContractErrs.InsufficientTakerAllowance,
+ [TransferType.Fee]: ExchangeContractErrs.InsufficientTakerFeeAllowance,
+ },
+ },
+};
+
+export class ExchangeTransferSimulator {
+ private readonly _store: AbstractBalanceAndProxyAllowanceLazyStore;
+ private static _throwValidationError(
+ failureReason: FailureReason,
+ tradeSide: TradeSide,
+ transferType: TransferType,
+ ): never {
+ const errMsg = ERR_MSG_MAPPING[failureReason][tradeSide][transferType];
+ throw new Error(errMsg);
+ }
+ constructor(store: AbstractBalanceAndProxyAllowanceLazyStore) {
+ this._store = store;
+ }
+ /**
+ * Simulates transferFrom call performed by a proxy
+ * @param assetData Data of the asset being transferred. Includes
+ * it's identifying information and assetType,
+ * e.g address for ERC20, address & tokenId for ERC721
+ * @param from Owner of the transferred tokens
+ * @param to Recipient of the transferred tokens
+ * @param amountInBaseUnits The amount of tokens being transferred
+ * @param tradeSide Is Maker/Taker transferring
+ * @param transferType Is it a fee payment or a value transfer
+ */
+ public async transferFromAsync(
+ assetData: string,
+ from: string,
+ to: string,
+ amountInBaseUnits: BigNumber,
+ tradeSide: TradeSide,
+ transferType: TransferType,
+ ): Promise<void> {
+ // HACK: When simulating an open order (e.g taker is NULL_ADDRESS), we don't want to adjust balances/
+ // allowances for the taker. We do however, want to increase the balance of the maker since the maker
+ // might be relying on those funds to fill subsequent orders or pay the order's fees.
+ if (from === constants.NULL_ADDRESS && tradeSide === TradeSide.Taker) {
+ await this._increaseBalanceAsync(assetData, to, amountInBaseUnits);
+ return;
+ }
+ const balance = await this._store.getBalanceAsync(assetData, from);
+ const proxyAllowance = await this._store.getProxyAllowanceAsync(assetData, from);
+ if (proxyAllowance.lessThan(amountInBaseUnits)) {
+ ExchangeTransferSimulator._throwValidationError(FailureReason.ProxyAllowance, tradeSide, transferType);
+ }
+ if (balance.lessThan(amountInBaseUnits)) {
+ ExchangeTransferSimulator._throwValidationError(FailureReason.Balance, tradeSide, transferType);
+ }
+ await this._decreaseProxyAllowanceAsync(assetData, from, amountInBaseUnits);
+ await this._decreaseBalanceAsync(assetData, from, amountInBaseUnits);
+ await this._increaseBalanceAsync(assetData, to, amountInBaseUnits);
+ }
+ private async _decreaseProxyAllowanceAsync(
+ assetData: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const proxyAllowance = await this._store.getProxyAllowanceAsync(assetData, userAddress);
+ // HACK: This code assumes that all tokens with an UNLIMITED_ALLOWANCE_IN_BASE_UNITS set,
+ // are UnlimitedAllowanceTokens. This is however not true, it just so happens that all
+ // DummyERC20Tokens we use in tests are.
+ if (!proxyAllowance.eq(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS)) {
+ this._store.setProxyAllowance(assetData, userAddress, proxyAllowance.minus(amountInBaseUnits));
+ }
+ }
+ private async _increaseBalanceAsync(
+ assetData: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const balance = await this._store.getBalanceAsync(assetData, userAddress);
+ this._store.setBalance(assetData, userAddress, balance.plus(amountInBaseUnits));
+ }
+ private async _decreaseBalanceAsync(
+ assetData: string,
+ userAddress: string,
+ amountInBaseUnits: BigNumber,
+ ): Promise<void> {
+ const balance = await this._store.getBalanceAsync(assetData, userAddress);
+ this._store.setBalance(assetData, userAddress, balance.minus(amountInBaseUnits));
+ }
+}
diff --git a/packages/order-utils/src/globals.d.ts b/packages/order-utils/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/order-utils/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/order-utils/src/index.ts b/packages/order-utils/src/index.ts
new file mode 100644
index 000000000..681fbc904
--- /dev/null
+++ b/packages/order-utils/src/index.ts
@@ -0,0 +1,27 @@
+export { orderHashUtils } from './order_hash';
+export {
+ isValidSignatureAsync,
+ isValidPresignedSignatureAsync,
+ isValidWalletSignatureAsync,
+ isValidValidatorSignatureAsync,
+ isValidECSignature,
+ ecSignOrderHashAsync,
+ addSignedMessagePrefix,
+ parseECSignature,
+} from './signature_utils';
+export { orderFactory } from './order_factory';
+export { constants } from './constants';
+export { crypto } from './crypto';
+export { generatePseudoRandomSalt } from './salt';
+export { CreateOrderOpts, OrderError, EIP712Parameter, EIP712Schema, EIP712Types } from './types';
+export { AbstractBalanceAndProxyAllowanceFetcher } from './abstract/abstract_balance_and_proxy_allowance_fetcher';
+export { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher';
+export { BalanceAndProxyAllowanceLazyStore } from './store/balance_and_proxy_allowance_lazy_store';
+export { OrderFilledCancelledLazyStore } from './store/order_filled_cancelled_lazy_store';
+export { RemainingFillableCalculator } from './remaining_fillable_calculator';
+export { OrderStateUtils } from './order_state_utils';
+export { assetDataUtils } from './asset_data_utils';
+export { EIP712Utils } from './eip712_utils';
+export { OrderValidationUtils } from './order_validation_utils';
+export { ExchangeTransferSimulator } from './exchange_transfer_simulator';
+export { marketUtils } from './market_utils';
diff --git a/packages/order-utils/src/market_utils.ts b/packages/order-utils/src/market_utils.ts
new file mode 100644
index 000000000..681059ddf
--- /dev/null
+++ b/packages/order-utils/src/market_utils.ts
@@ -0,0 +1,133 @@
+import { schemas } from '@0xproject/json-schemas';
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { assert } from './assert';
+import { constants } from './constants';
+
+export const marketUtils = {
+ /**
+ * Takes an array of orders and returns a subset of those orders that has enough makerAssetAmount (taking into account on-chain balances,
+ * allowances, and partial fills) in order to fill the input makerAssetFillAmount plus slippageBufferAmount. Iterates from first order to last.
+ * Sort the input by ascending rate in order to get the subset of orders that will cost the least ETH.
+ * @param signedOrders An array of objects that conform to the SignedOrder interface. All orders should specify the same makerAsset.
+ * All orders should specify WETH as the takerAsset.
+ * @param remainingFillableMakerAssetAmounts An array of BigNumbers corresponding to the signedOrders parameter.
+ * You can use OrderStateUtils @0xproject/order-utils to perform blockchain lookups
+ * for these values.
+ * @param makerAssetFillAmount The amount of makerAsset desired to be filled.
+ * @param slippageBufferAmount An additional amount of makerAsset to be covered by the result in case of trade collisions or partial fills.
+ * @return Resulting orders and remaining fill amount that could not be covered by the input.
+ */
+ findOrdersThatCoverMakerAssetFillAmount(
+ signedOrders: SignedOrder[],
+ remainingFillableMakerAssetAmounts: BigNumber[],
+ makerAssetFillAmount: BigNumber,
+ slippageBufferAmount: BigNumber = constants.ZERO_AMOUNT,
+ ): { resultOrders: SignedOrder[]; remainingFillAmount: BigNumber } {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ _.forEach(remainingFillableMakerAssetAmounts, (amount, index) =>
+ assert.isValidBaseUnitAmount(`remainingFillableMakerAssetAmount[${index}]`, amount),
+ );
+ assert.isValidBaseUnitAmount('makerAssetFillAmount', makerAssetFillAmount);
+ assert.isValidBaseUnitAmount('slippageBufferAmount', slippageBufferAmount);
+ assert.assert(
+ signedOrders.length === remainingFillableMakerAssetAmounts.length,
+ 'Expected signedOrders.length to equal remainingFillableMakerAssetAmounts.length',
+ );
+ // calculate total amount of makerAsset needed to be filled
+ const totalFillAmount = makerAssetFillAmount.plus(slippageBufferAmount);
+ // iterate through the signedOrders input from left to right until we have enough makerAsset to fill totalFillAmount
+ const result = _.reduce(
+ signedOrders,
+ ({ resultOrders, remainingFillAmount }, order, index) => {
+ if (remainingFillAmount.lessThanOrEqualTo(constants.ZERO_AMOUNT)) {
+ return { resultOrders, remainingFillAmount: constants.ZERO_AMOUNT };
+ } else {
+ const makerAssetAmountAvailable = remainingFillableMakerAssetAmounts[index];
+ // if there is no makerAssetAmountAvailable do not append order to resultOrders
+ // if we have exceeded the total amount we want to fill set remainingFillAmount to 0
+ return {
+ resultOrders: makerAssetAmountAvailable.gt(constants.ZERO_AMOUNT)
+ ? _.concat(resultOrders, order)
+ : resultOrders,
+ remainingFillAmount: BigNumber.max(
+ constants.ZERO_AMOUNT,
+ remainingFillAmount.minus(makerAssetAmountAvailable),
+ ),
+ };
+ }
+ },
+ { resultOrders: [] as SignedOrder[], remainingFillAmount: totalFillAmount },
+ );
+ return result;
+ },
+ /**
+ * Takes an array of orders and an array of feeOrders. Returns a subset of the feeOrders that has enough ZRX (taking into account
+ * on-chain balances, allowances, and partial fills) in order to fill the takerFees required by signedOrders plus a
+ * slippageBufferAmount. Iterates from first feeOrder to last. Sort the feeOrders by ascending rate in order to get the subset of
+ * feeOrders that will cost the least ETH.
+ * @param signedOrders An array of objects that conform to the SignedOrder interface. All orders should specify ZRX as
+ * the makerAsset and WETH as the takerAsset.
+ * @param remainingFillableMakerAssetAmounts An array of BigNumbers corresponding to the signedOrders parameter.
+ * You can use OrderStateUtils @0xproject/order-utils to perform blockchain lookups
+ * for these values.
+ * @param signedFeeOrders An array of objects that conform to the SignedOrder interface. All orders should specify ZRX as
+ * the makerAsset and WETH as the takerAsset.
+ * @param remainingFillableFeeAmounts An array of BigNumbers corresponding to the signedFeeOrders parameter.
+ * You can use OrderStateUtils @0xproject/order-utils to perform blockchain lookups
+ * for these values.
+ * @param slippageBufferAmount An additional amount of fee to be covered by the result in case of trade collisions or partial fills.
+ * @return Resulting orders and remaining fee amount that could not be covered by the input.
+ */
+ findFeeOrdersThatCoverFeesForTargetOrders(
+ signedOrders: SignedOrder[],
+ remainingFillableMakerAssetAmounts: BigNumber[],
+ signedFeeOrders: SignedOrder[],
+ remainingFillableFeeAmounts: BigNumber[],
+ slippageBufferAmount: BigNumber = constants.ZERO_AMOUNT,
+ ): { resultOrders: SignedOrder[]; remainingFeeAmount: BigNumber } {
+ assert.doesConformToSchema('signedOrders', signedOrders, schemas.signedOrdersSchema);
+ _.forEach(remainingFillableMakerAssetAmounts, (amount, index) =>
+ assert.isValidBaseUnitAmount(`remainingFillableMakerAssetAmount[${index}]`, amount),
+ );
+ assert.doesConformToSchema('signedFeeOrders', signedFeeOrders, schemas.signedOrdersSchema);
+ _.forEach(remainingFillableFeeAmounts, (amount, index) =>
+ assert.isValidBaseUnitAmount(`remainingFillableFeeAmounts[${index}]`, amount),
+ );
+ assert.isValidBaseUnitAmount('slippageBufferAmount', slippageBufferAmount);
+ assert.assert(
+ signedOrders.length === remainingFillableMakerAssetAmounts.length,
+ 'Expected signedOrders.length to equal remainingFillableMakerAssetAmounts.length',
+ );
+ assert.assert(
+ signedOrders.length === remainingFillableMakerAssetAmounts.length,
+ 'Expected signedFeeOrders.length to equal remainingFillableFeeAmounts.length',
+ );
+ // calculate total amount of ZRX needed to fill signedOrders
+ const totalFeeAmount = _.reduce(
+ signedOrders,
+ (accFees, order, index) => {
+ const makerAssetAmountAvailable = remainingFillableMakerAssetAmounts[index];
+ const feeToFillMakerAssetAmountAvailable = makerAssetAmountAvailable
+ .mul(order.takerFee)
+ .div(order.makerAssetAmount);
+ return accFees.plus(feeToFillMakerAssetAmountAvailable);
+ },
+ constants.ZERO_AMOUNT,
+ );
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ signedFeeOrders,
+ remainingFillableFeeAmounts,
+ totalFeeAmount,
+ slippageBufferAmount,
+ );
+ return {
+ resultOrders,
+ remainingFeeAmount: remainingFillAmount,
+ };
+ // TODO: add more orders here to cover rounding
+ // https://github.com/0xProject/0x-protocol-specification/blob/master/v2/forwarding-contract-specification.md#over-buying-zrx
+ },
+};
diff --git a/packages/order-utils/src/monorepo_scripts/postpublish.ts b/packages/order-utils/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/order-utils/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/order-utils/src/monorepo_scripts/stage_docs.ts b/packages/order-utils/src/monorepo_scripts/stage_docs.ts
new file mode 100644
index 000000000..e732ac8eb
--- /dev/null
+++ b/packages/order-utils/src/monorepo_scripts/stage_docs.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/order-utils/src/order_factory.ts b/packages/order-utils/src/order_factory.ts
new file mode 100644
index 000000000..4a6f3924b
--- /dev/null
+++ b/packages/order-utils/src/order_factory.ts
@@ -0,0 +1,85 @@
+import { Order, SignedOrder, SignerType } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { orderHashUtils } from './order_hash';
+import { generatePseudoRandomSalt } from './salt';
+import { ecSignOrderHashAsync } from './signature_utils';
+import { CreateOrderOpts } from './types';
+
+export const orderFactory = {
+ createOrder(
+ makerAddress: string,
+ makerAssetAmount: BigNumber,
+ makerAssetData: string,
+ takerAssetAmount: BigNumber,
+ takerAssetData: string,
+ exchangeAddress: string,
+ createOrderOpts: CreateOrderOpts = generateDefaultCreateOrderOpts(),
+ ): Order {
+ const defaultCreateOrderOpts = generateDefaultCreateOrderOpts();
+ const order = {
+ makerAddress,
+ makerAssetAmount,
+ takerAssetAmount,
+ makerAssetData,
+ takerAssetData,
+ exchangeAddress,
+ takerAddress: createOrderOpts.takerAddress || defaultCreateOrderOpts.takerAddress,
+ senderAddress: createOrderOpts.senderAddress || defaultCreateOrderOpts.senderAddress,
+ makerFee: createOrderOpts.makerFee || defaultCreateOrderOpts.makerFee,
+ takerFee: createOrderOpts.takerFee || defaultCreateOrderOpts.takerFee,
+ feeRecipientAddress: createOrderOpts.feeRecipientAddress || defaultCreateOrderOpts.feeRecipientAddress,
+ salt: createOrderOpts.salt || defaultCreateOrderOpts.salt,
+ expirationTimeSeconds:
+ createOrderOpts.expirationTimeSeconds || defaultCreateOrderOpts.expirationTimeSeconds,
+ };
+ return order;
+ },
+ async createSignedOrderAsync(
+ provider: Provider,
+ makerAddress: string,
+ makerAssetAmount: BigNumber,
+ makerAssetData: string,
+ takerAssetAmount: BigNumber,
+ takerAssetData: string,
+ exchangeAddress: string,
+ createOrderOpts?: CreateOrderOpts,
+ ): Promise<SignedOrder> {
+ const order = orderFactory.createOrder(
+ makerAddress,
+ makerAssetAmount,
+ makerAssetData,
+ takerAssetAmount,
+ takerAssetData,
+ exchangeAddress,
+ createOrderOpts,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(order);
+ const signature = await ecSignOrderHashAsync(provider, orderHash, makerAddress, SignerType.Default);
+ const signedOrder: SignedOrder = _.assign(order, { signature });
+ return signedOrder;
+ },
+};
+
+function generateDefaultCreateOrderOpts(): {
+ takerAddress: string;
+ senderAddress: string;
+ makerFee: BigNumber;
+ takerFee: BigNumber;
+ feeRecipientAddress: string;
+ salt: BigNumber;
+ expirationTimeSeconds: BigNumber;
+} {
+ return {
+ takerAddress: constants.NULL_ADDRESS,
+ senderAddress: constants.NULL_ADDRESS,
+ makerFee: constants.ZERO_AMOUNT,
+ takerFee: constants.ZERO_AMOUNT,
+ feeRecipientAddress: constants.NULL_ADDRESS,
+ salt: generatePseudoRandomSalt(),
+ expirationTimeSeconds: constants.INFINITE_TIMESTAMP_SEC,
+ };
+}
diff --git a/packages/order-utils/src/order_hash.ts b/packages/order-utils/src/order_hash.ts
new file mode 100644
index 000000000..54c500653
--- /dev/null
+++ b/packages/order-utils/src/order_hash.ts
@@ -0,0 +1,79 @@
+import { schemas, SchemaValidator } from '@0xproject/json-schemas';
+import { Order, SignedOrder } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { assert } from './assert';
+import { EIP712Utils } from './eip712_utils';
+import { EIP712Schema, EIP712Types } from './types';
+
+const INVALID_TAKER_FORMAT = 'instance.takerAddress is not of a type(s) string';
+
+const EIP712_ORDER_SCHEMA: EIP712Schema = {
+ name: 'Order',
+ parameters: [
+ { name: 'makerAddress', type: EIP712Types.Address },
+ { name: 'takerAddress', type: EIP712Types.Address },
+ { name: 'feeRecipientAddress', type: EIP712Types.Address },
+ { name: 'senderAddress', type: EIP712Types.Address },
+ { name: 'makerAssetAmount', type: EIP712Types.Uint256 },
+ { name: 'takerAssetAmount', type: EIP712Types.Uint256 },
+ { name: 'makerFee', type: EIP712Types.Uint256 },
+ { name: 'takerFee', type: EIP712Types.Uint256 },
+ { name: 'expirationTimeSeconds', type: EIP712Types.Uint256 },
+ { name: 'salt', type: EIP712Types.Uint256 },
+ { name: 'makerAssetData', type: EIP712Types.Bytes },
+ { name: 'takerAssetData', type: EIP712Types.Bytes },
+ ],
+};
+
+export const orderHashUtils = {
+ /**
+ * Checks if the supplied hex encoded order hash is valid.
+ * Note: Valid means it has the expected format, not that an order with the orderHash exists.
+ * Use this method when processing orderHashes submitted as user input.
+ * @param orderHash Hex encoded orderHash.
+ * @return Whether the supplied orderHash has the expected format.
+ */
+ isValidOrderHash(orderHash: string): boolean {
+ // Since this method can be called to check if any arbitrary string conforms to an orderHash's
+ // format, we only assert that we were indeed passed a string.
+ assert.isString('orderHash', orderHash);
+ const schemaValidator = new SchemaValidator();
+ const isValid = schemaValidator.validate(orderHash, schemas.orderHashSchema).valid;
+ return isValid;
+ },
+ /**
+ * Computes the orderHash for a supplied order.
+ * @param order An object that conforms to the Order or SignedOrder interface definitions.
+ * @return The resulting orderHash from hashing the supplied order.
+ */
+ getOrderHashHex(order: SignedOrder | Order): string {
+ try {
+ assert.doesConformToSchema('order', order, schemas.orderSchema, [schemas.hexSchema]);
+ } catch (error) {
+ if (_.includes(error.message, INVALID_TAKER_FORMAT)) {
+ const errMsg =
+ 'Order taker must be of type string. If you want anyone to be able to fill an order - pass ZeroEx.NULL_ADDRESS';
+ throw new Error(errMsg);
+ }
+ throw error;
+ }
+
+ const orderHashBuff = orderHashUtils.getOrderHashBuffer(order);
+ const orderHashHex = `0x${orderHashBuff.toString('hex')}`;
+ return orderHashHex;
+ },
+ /**
+ * Computes the orderHash for a supplied order and returns it as a Buffer
+ * @param order An object that conforms to the Order or SignedOrder interface definitions.
+ * @return The resulting orderHash from hashing the supplied order as a Buffer
+ */
+ getOrderHashBuffer(order: SignedOrder | Order): Buffer {
+ const orderParamsHashBuff = EIP712Utils.structHash(EIP712_ORDER_SCHEMA, order);
+ const orderHashBuff = EIP712Utils.createEIP712Message(orderParamsHashBuff, order.exchangeAddress);
+ return orderHashBuff;
+ },
+ _getOrderSchemaBuffer(): Buffer {
+ return EIP712Utils.compileSchema(EIP712_ORDER_SCHEMA);
+ },
+};
diff --git a/packages/order-utils/src/order_state_utils.ts b/packages/order-utils/src/order_state_utils.ts
new file mode 100644
index 000000000..189bf4180
--- /dev/null
+++ b/packages/order-utils/src/order_state_utils.ts
@@ -0,0 +1,284 @@
+import {
+ ExchangeContractErrs,
+ OrderRelevantState,
+ OrderState,
+ OrderStateInvalid,
+ OrderStateValid,
+ SignedOrder,
+} from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+import { AbstractBalanceAndProxyAllowanceFetcher } from './abstract/abstract_balance_and_proxy_allowance_fetcher';
+import { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher';
+import { orderHashUtils } from './order_hash';
+import { RemainingFillableCalculator } from './remaining_fillable_calculator';
+import { utils } from './utils';
+
+interface SidedOrderRelevantState {
+ isMakerSide: boolean;
+ traderBalance: BigNumber;
+ traderProxyAllowance: BigNumber;
+ traderFeeBalance: BigNumber;
+ traderFeeProxyAllowance: BigNumber;
+ filledTakerAssetAmount: BigNumber;
+ remainingFillableAssetAmount: BigNumber;
+}
+
+const ACCEPTABLE_RELATIVE_ROUNDING_ERROR = 0.0001;
+
+export class OrderStateUtils {
+ private readonly _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ private static _validateIfOrderIsValid(
+ signedOrder: SignedOrder,
+ sidedOrderRelevantState: SidedOrderRelevantState,
+ ): void {
+ const isMakerSide = sidedOrderRelevantState.isMakerSide;
+ const availableTakerAssetAmount = signedOrder.takerAssetAmount.minus(
+ sidedOrderRelevantState.filledTakerAssetAmount,
+ );
+ if (availableTakerAssetAmount.eq(0)) {
+ throw new Error(ExchangeContractErrs.OrderRemainingFillAmountZero);
+ }
+
+ if (sidedOrderRelevantState.traderBalance.eq(0)) {
+ throw new Error(
+ isMakerSide
+ ? ExchangeContractErrs.InsufficientMakerBalance
+ : ExchangeContractErrs.InsufficientTakerBalance,
+ );
+ }
+ if (sidedOrderRelevantState.traderProxyAllowance.eq(0)) {
+ throw new Error(
+ isMakerSide
+ ? ExchangeContractErrs.InsufficientMakerAllowance
+ : ExchangeContractErrs.InsufficientTakerAllowance,
+ );
+ }
+ if (!signedOrder.makerFee.eq(0)) {
+ if (sidedOrderRelevantState.traderFeeBalance.eq(0)) {
+ throw new Error(
+ isMakerSide
+ ? ExchangeContractErrs.InsufficientMakerFeeBalance
+ : ExchangeContractErrs.InsufficientTakerFeeBalance,
+ );
+ }
+ if (sidedOrderRelevantState.traderFeeProxyAllowance.eq(0)) {
+ throw new Error(
+ isMakerSide
+ ? ExchangeContractErrs.InsufficientMakerFeeAllowance
+ : ExchangeContractErrs.InsufficientTakerFeeAllowance,
+ );
+ }
+ }
+
+ let minFillableTakerAssetAmountWithinNoRoundingErrorRange;
+ if (isMakerSide) {
+ minFillableTakerAssetAmountWithinNoRoundingErrorRange = signedOrder.takerAssetAmount
+ .dividedBy(ACCEPTABLE_RELATIVE_ROUNDING_ERROR)
+ .dividedBy(signedOrder.makerAssetAmount);
+ } else {
+ minFillableTakerAssetAmountWithinNoRoundingErrorRange = signedOrder.makerAssetAmount
+ .dividedBy(ACCEPTABLE_RELATIVE_ROUNDING_ERROR)
+ .dividedBy(signedOrder.takerAssetAmount);
+ }
+
+ if (
+ sidedOrderRelevantState.remainingFillableAssetAmount.lessThan(
+ minFillableTakerAssetAmountWithinNoRoundingErrorRange,
+ )
+ ) {
+ throw new Error(ExchangeContractErrs.OrderFillRoundingError);
+ }
+ }
+ constructor(
+ balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher,
+ orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher,
+ ) {
+ this._balanceAndProxyAllowanceFetcher = balanceAndProxyAllowanceFetcher;
+ this._orderFilledCancelledFetcher = orderFilledCancelledFetcher;
+ }
+ public async getOpenOrderStateAsync(signedOrder: SignedOrder): Promise<OrderState> {
+ const orderRelevantState = await this.getOpenOrderRelevantStateAsync(signedOrder);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const sidedOrderRelevantState = {
+ isMakerSide: true,
+ traderBalance: orderRelevantState.makerBalance,
+ traderProxyAllowance: orderRelevantState.makerProxyAllowance,
+ traderFeeBalance: orderRelevantState.makerFeeBalance,
+ traderFeeProxyAllowance: orderRelevantState.makerFeeProxyAllowance,
+ filledTakerAssetAmount: orderRelevantState.filledTakerAssetAmount,
+ remainingFillableAssetAmount: orderRelevantState.remainingFillableMakerAssetAmount,
+ };
+ try {
+ OrderStateUtils._validateIfOrderIsValid(signedOrder, sidedOrderRelevantState);
+ const orderState: OrderStateValid = {
+ isValid: true,
+ orderHash,
+ orderRelevantState,
+ };
+ return orderState;
+ } catch (err) {
+ const orderState: OrderStateInvalid = {
+ isValid: false,
+ orderHash,
+ error: err.message,
+ };
+ return orderState;
+ }
+ }
+ public async getOpenOrderRelevantStateAsync(signedOrder: SignedOrder): Promise<OrderRelevantState> {
+ const isMaker = true;
+ const sidedOrderRelevantState = await this._getSidedOrderRelevantStateAsync(
+ isMaker,
+ signedOrder,
+ signedOrder.takerAddress,
+ );
+ const remainingFillableTakerAssetAmount = sidedOrderRelevantState.remainingFillableAssetAmount
+ .times(signedOrder.takerAssetAmount)
+ .dividedToIntegerBy(signedOrder.makerAssetAmount);
+
+ const orderRelevantState = {
+ makerBalance: sidedOrderRelevantState.traderBalance,
+ makerProxyAllowance: sidedOrderRelevantState.traderProxyAllowance,
+ makerFeeBalance: sidedOrderRelevantState.traderFeeBalance,
+ makerFeeProxyAllowance: sidedOrderRelevantState.traderFeeProxyAllowance,
+ filledTakerAssetAmount: sidedOrderRelevantState.filledTakerAssetAmount,
+ remainingFillableMakerAssetAmount: sidedOrderRelevantState.remainingFillableAssetAmount,
+ remainingFillableTakerAssetAmount,
+ };
+ return orderRelevantState;
+ }
+ public async getMaxFillableTakerAssetAmountAsync(
+ signedOrder: SignedOrder,
+ takerAddress: string,
+ ): Promise<BigNumber> {
+ // Get max fillable amount for an order, considering the makers ability to fill
+ let isMaker = true;
+ const orderRelevantMakerState = await this._getSidedOrderRelevantStateAsync(
+ isMaker,
+ signedOrder,
+ signedOrder.takerAddress,
+ );
+ const remainingFillableTakerAssetAmountGivenMakersStatus = signedOrder.makerAssetAmount.eq(0)
+ ? new BigNumber(0)
+ : utils.getPartialAmount(
+ orderRelevantMakerState.remainingFillableAssetAmount,
+ signedOrder.makerAssetAmount,
+ signedOrder.takerAssetAmount,
+ );
+
+ // Get max fillable amount for an order, considering the takers ability to fill
+ isMaker = false;
+ const orderRelevantTakerState = await this._getSidedOrderRelevantStateAsync(isMaker, signedOrder, takerAddress);
+ const remainingFillableTakerAssetAmountGivenTakersStatus = orderRelevantTakerState.remainingFillableAssetAmount;
+
+ // The min of these two in the actualy max fillable by either party
+ const fillableTakerAssetAmount = BigNumber.min([
+ remainingFillableTakerAssetAmountGivenMakersStatus,
+ remainingFillableTakerAssetAmountGivenTakersStatus,
+ ]);
+
+ return fillableTakerAssetAmount;
+ }
+ public async getMaxFillableTakerAssetAmountForFailingOrderAsync(
+ signedOrder: SignedOrder,
+ takerAddress: string,
+ ): Promise<BigNumber> {
+ // Get min of taker balance & allowance
+ const takerAssetBalanceOfTaker = await this._balanceAndProxyAllowanceFetcher.getBalanceAsync(
+ signedOrder.takerAssetData,
+ takerAddress,
+ );
+ const takerAssetAllowanceOfTaker = await this._balanceAndProxyAllowanceFetcher.getProxyAllowanceAsync(
+ signedOrder.takerAssetData,
+ takerAddress,
+ );
+ const minTakerAssetAmount = BigNumber.min([takerAssetBalanceOfTaker, takerAssetAllowanceOfTaker]);
+
+ // get remainingFillAmount
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const filledTakerAssetAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ const remainingFillTakerAssetAmount = signedOrder.takerAssetAmount.minus(filledTakerAssetAmount);
+
+ if (minTakerAssetAmount.gte(remainingFillTakerAssetAmount)) {
+ return remainingFillTakerAssetAmount;
+ } else {
+ return minTakerAssetAmount;
+ }
+ }
+ private async _getSidedOrderRelevantStateAsync(
+ isMakerSide: boolean,
+ signedOrder: SignedOrder,
+ takerAddress: string,
+ ): Promise<SidedOrderRelevantState> {
+ let traderAddress;
+ let assetData;
+ let assetAmount;
+ let feeAmount;
+ if (isMakerSide) {
+ traderAddress = signedOrder.makerAddress;
+ assetData = signedOrder.makerAssetData;
+ assetAmount = signedOrder.makerAssetAmount;
+ feeAmount = signedOrder.makerFee;
+ } else {
+ traderAddress = takerAddress;
+ assetData = signedOrder.takerAssetData;
+ assetAmount = signedOrder.takerAssetAmount;
+ feeAmount = signedOrder.takerFee;
+ }
+ const zrxAssetData = this._orderFilledCancelledFetcher.getZRXAssetData();
+ const isAssetZRX = assetData === zrxAssetData;
+
+ const traderBalance = await this._balanceAndProxyAllowanceFetcher.getBalanceAsync(assetData, traderAddress);
+ const traderProxyAllowance = await this._balanceAndProxyAllowanceFetcher.getProxyAllowanceAsync(
+ assetData,
+ traderAddress,
+ );
+ const traderFeeBalance = await this._balanceAndProxyAllowanceFetcher.getBalanceAsync(
+ zrxAssetData,
+ traderAddress,
+ );
+ const traderFeeProxyAllowance = await this._balanceAndProxyAllowanceFetcher.getProxyAllowanceAsync(
+ zrxAssetData,
+ traderAddress,
+ );
+
+ const transferrableTraderAssetAmount = BigNumber.min([traderProxyAllowance, traderBalance]);
+ const transferrableFeeAssetAmount = BigNumber.min([traderFeeProxyAllowance, traderFeeBalance]);
+
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const filledTakerAssetAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ const totalMakerAssetAmount = signedOrder.makerAssetAmount;
+ const totalTakerAssetAmount = signedOrder.takerAssetAmount;
+ const isOrderCancelled = await this._orderFilledCancelledFetcher.isOrderCancelledAsync(orderHash);
+ const remainingTakerAssetAmount = isOrderCancelled
+ ? new BigNumber(0)
+ : totalTakerAssetAmount.minus(filledTakerAssetAmount);
+ const remainingMakerAssetAmount = remainingTakerAssetAmount.eq(0)
+ ? new BigNumber(0)
+ : remainingTakerAssetAmount.times(totalMakerAssetAmount).dividedToIntegerBy(totalTakerAssetAmount);
+ const remainingAssetAmount = isMakerSide ? remainingMakerAssetAmount : remainingTakerAssetAmount;
+
+ const remainingFillableCalculator = new RemainingFillableCalculator(
+ feeAmount,
+ assetAmount,
+ isAssetZRX,
+ transferrableTraderAssetAmount,
+ transferrableFeeAssetAmount,
+ remainingAssetAmount,
+ );
+ const remainingFillableAssetAmount = remainingFillableCalculator.computeRemainingFillable();
+
+ const sidedOrderRelevantState = {
+ isMakerSide,
+ traderBalance,
+ traderProxyAllowance,
+ traderFeeBalance,
+ traderFeeProxyAllowance,
+ filledTakerAssetAmount,
+ remainingFillableAssetAmount,
+ };
+ return sidedOrderRelevantState;
+ }
+}
diff --git a/packages/order-utils/src/order_validation_utils.ts b/packages/order-utils/src/order_validation_utils.ts
new file mode 100644
index 000000000..67d747081
--- /dev/null
+++ b/packages/order-utils/src/order_validation_utils.ts
@@ -0,0 +1,210 @@
+import { RevertReason, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { OrderError, TradeSide, TransferType } from './types';
+
+import { AbstractOrderFilledCancelledFetcher } from './abstract/abstract_order_filled_cancelled_fetcher';
+import { constants } from './constants';
+import { ExchangeTransferSimulator } from './exchange_transfer_simulator';
+import { orderHashUtils } from './order_hash';
+import { isValidSignatureAsync } from './signature_utils';
+import { utils } from './utils';
+
+export class OrderValidationUtils {
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ public static isRoundingError(numerator: BigNumber, denominator: BigNumber, target: BigNumber): boolean {
+ // Solidity's mulmod() in JS
+ // Source: https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#mathematical-and-cryptographic-functions
+ if (denominator.eq(0)) {
+ throw new Error('denominator cannot be 0');
+ }
+ const remainder = target.mul(numerator).mod(denominator);
+ if (remainder.eq(0)) {
+ return false; // no rounding error
+ }
+
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const errPercentageTimes1000000 = remainder.mul(1000000).div(numerator.mul(target));
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const isError = errPercentageTimes1000000.gt(1000);
+ return isError;
+ }
+ public static async validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
+ exchangeTradeEmulator: ExchangeTransferSimulator,
+ signedOrder: SignedOrder,
+ fillTakerAssetAmount: BigNumber,
+ senderAddress: string,
+ zrxAssetData: string,
+ ): Promise<void> {
+ try {
+ const fillMakerTokenAmount = utils.getPartialAmount(
+ fillTakerAssetAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerAssetAmount,
+ );
+ await exchangeTradeEmulator.transferFromAsync(
+ signedOrder.makerAssetData,
+ signedOrder.makerAddress,
+ senderAddress,
+ fillMakerTokenAmount,
+ TradeSide.Maker,
+ TransferType.Trade,
+ );
+ await exchangeTradeEmulator.transferFromAsync(
+ signedOrder.takerAssetData,
+ senderAddress,
+ signedOrder.makerAddress,
+ fillTakerAssetAmount,
+ TradeSide.Taker,
+ TransferType.Trade,
+ );
+ const makerFeeAmount = utils.getPartialAmount(
+ fillTakerAssetAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerFee,
+ );
+ await exchangeTradeEmulator.transferFromAsync(
+ zrxAssetData,
+ signedOrder.makerAddress,
+ signedOrder.feeRecipientAddress,
+ makerFeeAmount,
+ TradeSide.Maker,
+ TransferType.Fee,
+ );
+ const takerFeeAmount = utils.getPartialAmount(
+ fillTakerAssetAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.takerFee,
+ );
+ await exchangeTradeEmulator.transferFromAsync(
+ zrxAssetData,
+ senderAddress,
+ signedOrder.feeRecipientAddress,
+ takerFeeAmount,
+ TradeSide.Taker,
+ TransferType.Fee,
+ );
+ } catch (err) {
+ throw new Error(RevertReason.TransferFailed);
+ }
+ }
+ private static _validateRemainingFillAmountNotZeroOrThrow(
+ takerAssetAmount: BigNumber,
+ filledTakerTokenAmount: BigNumber,
+ ): void {
+ if (takerAssetAmount.eq(filledTakerTokenAmount)) {
+ throw new Error(RevertReason.OrderUnfillable);
+ }
+ }
+ private static _validateOrderNotExpiredOrThrow(expirationTimeSeconds: BigNumber): void {
+ const currentUnixTimestampSec = utils.getCurrentUnixTimestampSec();
+ if (expirationTimeSeconds.lessThan(currentUnixTimestampSec)) {
+ throw new Error(RevertReason.OrderUnfillable);
+ }
+ }
+ constructor(orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher) {
+ this._orderFilledCancelledFetcher = orderFilledCancelledFetcher;
+ }
+ public async validateOrderFillableOrThrowAsync(
+ exchangeTradeEmulator: ExchangeTransferSimulator,
+ signedOrder: SignedOrder,
+ zrxAssetData: string,
+ expectedFillTakerTokenAmount?: BigNumber,
+ ): Promise<void> {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const filledTakerTokenAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ OrderValidationUtils._validateRemainingFillAmountNotZeroOrThrow(
+ signedOrder.takerAssetAmount,
+ filledTakerTokenAmount,
+ );
+ OrderValidationUtils._validateOrderNotExpiredOrThrow(signedOrder.expirationTimeSeconds);
+ let fillTakerAssetAmount = signedOrder.takerAssetAmount.minus(filledTakerTokenAmount);
+ if (!_.isUndefined(expectedFillTakerTokenAmount)) {
+ fillTakerAssetAmount = expectedFillTakerTokenAmount;
+ }
+ await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
+ exchangeTradeEmulator,
+ signedOrder,
+ fillTakerAssetAmount,
+ signedOrder.takerAddress,
+ zrxAssetData,
+ );
+ }
+ public async validateFillOrderThrowIfInvalidAsync(
+ exchangeTradeEmulator: ExchangeTransferSimulator,
+ provider: Provider,
+ signedOrder: SignedOrder,
+ fillTakerAssetAmount: BigNumber,
+ takerAddress: string,
+ zrxAssetData: string,
+ ): Promise<BigNumber> {
+ if (signedOrder.makerAssetAmount.eq(0) || signedOrder.takerAssetAmount.eq(0)) {
+ throw new Error(RevertReason.OrderUnfillable);
+ }
+ if (fillTakerAssetAmount.eq(0)) {
+ throw new Error(RevertReason.InvalidTakerAmount);
+ }
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const isValid = await isValidSignatureAsync(
+ provider,
+ orderHash,
+ signedOrder.signature,
+ signedOrder.makerAddress,
+ );
+ if (!isValid) {
+ throw new Error(OrderError.InvalidSignature);
+ }
+ const filledTakerTokenAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ OrderValidationUtils._validateRemainingFillAmountNotZeroOrThrow(
+ signedOrder.takerAssetAmount,
+ filledTakerTokenAmount,
+ );
+ if (signedOrder.takerAddress !== constants.NULL_ADDRESS && signedOrder.takerAddress !== takerAddress) {
+ throw new Error(RevertReason.InvalidTaker);
+ }
+ OrderValidationUtils._validateOrderNotExpiredOrThrow(signedOrder.expirationTimeSeconds);
+ const remainingTakerTokenAmount = signedOrder.takerAssetAmount.minus(filledTakerTokenAmount);
+ const desiredFillTakerTokenAmount = remainingTakerTokenAmount.lessThan(fillTakerAssetAmount)
+ ? remainingTakerTokenAmount
+ : fillTakerAssetAmount;
+ await OrderValidationUtils.validateFillOrderBalancesAllowancesThrowIfInvalidAsync(
+ exchangeTradeEmulator,
+ signedOrder,
+ desiredFillTakerTokenAmount,
+ takerAddress,
+ zrxAssetData,
+ );
+
+ const wouldRoundingErrorOccur = OrderValidationUtils.isRoundingError(
+ desiredFillTakerTokenAmount,
+ signedOrder.takerAssetAmount,
+ signedOrder.makerAssetAmount,
+ );
+ if (wouldRoundingErrorOccur) {
+ throw new Error(RevertReason.RoundingError);
+ }
+ return filledTakerTokenAmount;
+ }
+ public async validateFillOrKillOrderThrowIfInvalidAsync(
+ exchangeTradeEmulator: ExchangeTransferSimulator,
+ provider: Provider,
+ signedOrder: SignedOrder,
+ fillTakerAssetAmount: BigNumber,
+ takerAddress: string,
+ zrxAssetData: string,
+ ): Promise<void> {
+ const filledTakerTokenAmount = await this.validateFillOrderThrowIfInvalidAsync(
+ exchangeTradeEmulator,
+ provider,
+ signedOrder,
+ fillTakerAssetAmount,
+ takerAddress,
+ zrxAssetData,
+ );
+ if (filledTakerTokenAmount !== fillTakerAssetAmount) {
+ throw new Error(RevertReason.OrderUnfillable);
+ }
+ }
+}
diff --git a/packages/order-utils/src/remaining_fillable_calculator.ts b/packages/order-utils/src/remaining_fillable_calculator.ts
new file mode 100644
index 000000000..7022aa979
--- /dev/null
+++ b/packages/order-utils/src/remaining_fillable_calculator.ts
@@ -0,0 +1,86 @@
+import { BigNumber } from '@0xproject/utils';
+
+export class RemainingFillableCalculator {
+ private readonly _isTraderAssetZRX: boolean;
+ // Transferrable Amount is the minimum of Approval and Balance
+ private readonly _transferrableAssetAmount: BigNumber;
+ private readonly _transferrableFeeAmount: BigNumber;
+ private readonly _remainingOrderAssetAmount: BigNumber;
+ private readonly _remainingOrderFeeAmount: BigNumber;
+ private readonly _orderFee: BigNumber;
+ private readonly _orderAssetAmount: BigNumber;
+ constructor(
+ orderFee: BigNumber,
+ orderAssetAmount: BigNumber,
+ isTraderAssetZRX: boolean,
+ transferrableAssetAmount: BigNumber,
+ transferrableFeeAmount: BigNumber,
+ remainingOrderAssetAmount: BigNumber,
+ ) {
+ this._orderFee = orderFee;
+ this._orderAssetAmount = orderAssetAmount;
+ this._isTraderAssetZRX = isTraderAssetZRX;
+ this._transferrableAssetAmount = transferrableAssetAmount;
+ this._transferrableFeeAmount = transferrableFeeAmount;
+ this._remainingOrderAssetAmount = remainingOrderAssetAmount;
+ this._remainingOrderFeeAmount = orderAssetAmount.eq(0)
+ ? new BigNumber(0)
+ : remainingOrderAssetAmount.times(orderFee).dividedToIntegerBy(orderAssetAmount);
+ }
+ public computeRemainingFillable(): BigNumber {
+ if (this._hasSufficientFundsForFeeAndTransferAmount()) {
+ return this._remainingOrderAssetAmount;
+ }
+ if (this._orderFee.isZero()) {
+ return BigNumber.min(this._remainingOrderAssetAmount, this._transferrableAssetAmount);
+ }
+ return this._calculatePartiallyFillableAssetAmount();
+ }
+ private _hasSufficientFundsForFeeAndTransferAmount(): boolean {
+ if (this._isTraderAssetZRX) {
+ const totalZRXTransferAmountRequired = this._remainingOrderAssetAmount.plus(this._remainingOrderFeeAmount);
+ const hasSufficientFunds = this._transferrableAssetAmount.greaterThanOrEqualTo(
+ totalZRXTransferAmountRequired,
+ );
+ return hasSufficientFunds;
+ } else {
+ const hasSufficientFundsForTransferAmount = this._transferrableAssetAmount.greaterThanOrEqualTo(
+ this._remainingOrderAssetAmount,
+ );
+ const hasSufficientFundsForFeeAmount = this._transferrableFeeAmount.greaterThanOrEqualTo(
+ this._remainingOrderFeeAmount,
+ );
+ const hasSufficientFunds = hasSufficientFundsForTransferAmount && hasSufficientFundsForFeeAmount;
+ return hasSufficientFunds;
+ }
+ }
+ private _calculatePartiallyFillableAssetAmount(): BigNumber {
+ // Given an order for 200 wei for 2 ZRXwei fee, find 100 wei for 1 ZRXwei. Order ratio is then 100:1
+ const orderToFeeRatio = this._orderAssetAmount.dividedBy(this._orderFee);
+ // The number of times the trader (maker or taker) can fill the order, if each fill only required the transfer of a single
+ // baseUnit of fee tokens.
+ // Given 2 ZRXwei, the maximum amount of times trader can fill this order, in terms of fees, is 2
+ const fillableTimesInFeeBaseUnits = BigNumber.min(this._transferrableFeeAmount, this._remainingOrderFeeAmount);
+ // The number of times the trader can fill the order, given the traders asset Balance
+ // Assuming a balance of 150 wei, and an orderToFeeRatio of 100:1, trader can fill this order 1 time.
+ let fillableTimesInAssetUnits = this._transferrableAssetAmount.dividedBy(orderToFeeRatio);
+ if (this._isTraderAssetZRX) {
+ // If ZRX is the trader asset, the Fee and the trader fill amount need to be removed from the same pool;
+ // 200 ZRXwei for 2ZRXwei fee can only be filled once (need 202 ZRXwei)
+ const totalZRXTokenPooled = this._transferrableAssetAmount;
+ // The purchasing power here is less as the tokens are taken from the same Pool
+ // For every one number of fills, we have to take an extra ZRX out of the pool
+ fillableTimesInAssetUnits = totalZRXTokenPooled.dividedBy(orderToFeeRatio.plus(new BigNumber(1)));
+ }
+ // When Ratio is not fully divisible there can be remainders which cannot be represented, so they are floored.
+ // This can result in a RoundingError being thrown by the Exchange Contract.
+ const partiallyFillableAssetAmount = fillableTimesInAssetUnits
+ .times(this._orderAssetAmount)
+ .dividedToIntegerBy(this._orderFee);
+ const partiallyFillableFeeAmount = fillableTimesInFeeBaseUnits
+ .times(this._orderAssetAmount)
+ .dividedToIntegerBy(this._orderFee);
+ const partiallyFillableAmount = BigNumber.min(partiallyFillableAssetAmount, partiallyFillableFeeAmount);
+ return partiallyFillableAmount;
+ }
+}
diff --git a/packages/order-utils/src/salt.ts b/packages/order-utils/src/salt.ts
new file mode 100644
index 000000000..90a4197c0
--- /dev/null
+++ b/packages/order-utils/src/salt.ts
@@ -0,0 +1,18 @@
+import { BigNumber } from '@0xproject/utils';
+
+const MAX_DIGITS_IN_UNSIGNED_256_INT = 78;
+
+/**
+ * Generates a pseudo-random 256-bit salt.
+ * The salt can be included in a 0x order, ensuring that the order generates a unique orderHash
+ * and will not collide with other outstanding orders that are identical in all other parameters.
+ * @return A pseudo-random 256-bit number that can be used as a salt.
+ */
+export function generatePseudoRandomSalt(): BigNumber {
+ // BigNumber.random returns a pseudo-random number between 0 & 1 with a passed in number of decimal places.
+ // Source: https://mikemcl.github.io/bignumber.js/#random
+ const randomNumber = BigNumber.random(MAX_DIGITS_IN_UNSIGNED_256_INT);
+ const factor = new BigNumber(10).pow(MAX_DIGITS_IN_UNSIGNED_256_INT - 1);
+ const salt = randomNumber.times(factor).round();
+ return salt;
+}
diff --git a/packages/order-utils/src/signature_utils.ts b/packages/order-utils/src/signature_utils.ts
new file mode 100644
index 000000000..870aef2ed
--- /dev/null
+++ b/packages/order-utils/src/signature_utils.ts
@@ -0,0 +1,388 @@
+import { schemas } from '@0xproject/json-schemas';
+import { ECSignature, SignatureType, SignerType, ValidatorSignature } from '@0xproject/types';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+import * as ethUtil from 'ethereumjs-util';
+import * as _ from 'lodash';
+
+import { artifacts } from './artifacts';
+import { assert } from './assert';
+import { ExchangeContract } from './generated_contract_wrappers/exchange';
+import { IValidatorContract } from './generated_contract_wrappers/i_validator';
+import { IWalletContract } from './generated_contract_wrappers/i_wallet';
+import { OrderError } from './types';
+import { utils } from './utils';
+
+/**
+ * Verifies that the provided signature is valid according to the 0x Protocol smart contracts
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature A hex encoded 0x Protocol signature made up of: [TypeSpecificData][SignatureType].
+ * E.g [vrs][SignatureType.EIP712]
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the signature is valid for the supplied signerAddress and data.
+ */
+export async function isValidSignatureAsync(
+ provider: Provider,
+ data: string,
+ signature: string,
+ signerAddress: string,
+): Promise<boolean> {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('data', data);
+ assert.isHexString('signature', signature);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ const signatureTypeIndexIfExists = utils.getSignatureTypeIndexIfExists(signature);
+ if (_.isUndefined(signatureTypeIndexIfExists)) {
+ throw new Error(`Unrecognized signatureType in signature: ${signature}`);
+ }
+
+ switch (signatureTypeIndexIfExists) {
+ case SignatureType.Illegal:
+ case SignatureType.Invalid:
+ return false;
+
+ case SignatureType.EIP712: {
+ const ecSignature = parseECSignature(signature);
+ return isValidECSignature(data, ecSignature, signerAddress);
+ }
+
+ case SignatureType.EthSign: {
+ const ecSignature = parseECSignature(signature);
+ const prefixedMessageHex = addSignedMessagePrefix(data, SignerType.Default);
+ return isValidECSignature(prefixedMessageHex, ecSignature, signerAddress);
+ }
+
+ case SignatureType.Caller:
+ // HACK: We currently do not "validate" the caller signature type.
+ // It can only be validated during Exchange contract execution.
+ throw new Error('Caller signature type cannot be validated off-chain');
+
+ case SignatureType.Wallet: {
+ const isValid = await isValidWalletSignatureAsync(provider, data, signature, signerAddress);
+ return isValid;
+ }
+
+ case SignatureType.Validator: {
+ const isValid = await isValidValidatorSignatureAsync(provider, data, signature, signerAddress);
+ return isValid;
+ }
+
+ case SignatureType.PreSigned: {
+ return isValidPresignedSignatureAsync(provider, data, signerAddress);
+ }
+
+ case SignatureType.Trezor: {
+ const prefixedMessageHex = addSignedMessagePrefix(data, SignerType.Trezor);
+ const ecSignature = parseECSignature(signature);
+ return isValidECSignature(prefixedMessageHex, ecSignature, signerAddress);
+ }
+
+ default:
+ throw new Error(`Unhandled SignatureType: ${signatureTypeIndexIfExists}`);
+ }
+}
+
+/**
+ * Verifies that the provided presigned signature is valid according to the 0x Protocol smart contracts
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature A hex encoded presigned 0x Protocol signature made up of: [SignatureType.Presigned]
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the data was preSigned by the supplied signerAddress.
+ */
+export async function isValidPresignedSignatureAsync(
+ provider: Provider,
+ data: string,
+ signerAddress: string,
+): Promise<boolean> {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('data', data);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ const exchangeContract = new ExchangeContract(artifacts.Exchange.compilerOutput.abi, signerAddress, provider);
+ const isValid = await exchangeContract.preSigned.callAsync(data, signerAddress);
+ return isValid;
+}
+
+/**
+ * Verifies that the provided wallet signature is valid according to the 0x Protocol smart contracts
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature A hex encoded presigned 0x Protocol signature made up of: [SignatureType.Presigned]
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the data was preSigned by the supplied signerAddress.
+ */
+export async function isValidWalletSignatureAsync(
+ provider: Provider,
+ data: string,
+ signature: string,
+ signerAddress: string,
+): Promise<boolean> {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('data', data);
+ assert.isHexString('signature', signature);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const signatureWithoutType = signature.slice(-2);
+ const walletContract = new IWalletContract(artifacts.IWallet.compilerOutput.abi, signerAddress, provider);
+ const isValid = await walletContract.isValidSignature.callAsync(data, signatureWithoutType);
+ return isValid;
+}
+
+/**
+ * Verifies that the provided validator signature is valid according to the 0x Protocol smart contracts
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature A hex encoded presigned 0x Protocol signature made up of: [SignatureType.Presigned]
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the data was preSigned by the supplied signerAddress.
+ */
+export async function isValidValidatorSignatureAsync(
+ provider: Provider,
+ data: string,
+ signature: string,
+ signerAddress: string,
+): Promise<boolean> {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('data', data);
+ assert.isHexString('signature', signature);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ const validatorSignature = parseValidatorSignature(signature);
+ const exchangeContract = new ExchangeContract(artifacts.Exchange.compilerOutput.abi, signerAddress, provider);
+ const isValidatorApproved = await exchangeContract.allowedValidators.callAsync(
+ signerAddress,
+ validatorSignature.validatorAddress,
+ );
+ if (!isValidatorApproved) {
+ throw new Error(`Validator ${validatorSignature.validatorAddress} was not pre-approved by ${signerAddress}.`);
+ }
+
+ const validatorContract = new IValidatorContract(artifacts.IValidator.compilerOutput.abi, signerAddress, provider);
+ const isValid = await validatorContract.isValidSignature.callAsync(
+ data,
+ signerAddress,
+ validatorSignature.signature,
+ );
+ return isValid;
+}
+
+/**
+ * Checks if the supplied elliptic curve signature corresponds to signing `data` with
+ * the private key corresponding to `signerAddress`
+ * @param data The hex encoded data signed by the supplied signature.
+ * @param signature An object containing the elliptic curve signature parameters.
+ * @param signerAddress The hex encoded address that signed the data, producing the supplied signature.
+ * @return Whether the ECSignature is valid.
+ */
+export function isValidECSignature(data: string, signature: ECSignature, signerAddress: string): boolean {
+ assert.isHexString('data', data);
+ assert.doesConformToSchema('signature', signature, schemas.ecSignatureSchema);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+
+ const msgHashBuff = ethUtil.toBuffer(data);
+ try {
+ const pubKey = ethUtil.ecrecover(
+ msgHashBuff,
+ signature.v,
+ ethUtil.toBuffer(signature.r),
+ ethUtil.toBuffer(signature.s),
+ );
+ const retrievedAddress = ethUtil.bufferToHex(ethUtil.pubToAddress(pubKey));
+ return retrievedAddress === signerAddress;
+ } catch (err) {
+ return false;
+ }
+}
+
+/**
+ * Signs an orderHash and returns it's elliptic curve signature and signature type.
+ * This method currently supports TestRPC, Geth and Parity above and below V1.6.6
+ * @param orderHash Hex encoded orderHash to sign.
+ * @param signerAddress The hex encoded Ethereum address you wish to sign it with. This address
+ * must be available via the Provider supplied to 0x.js.
+ * @param signerType Different signers add/require different prefixes to be prepended to the message being signed.
+ * Since we cannot know ahead of time which signer you are using, you must supply a SignerType.
+ * @return A hex encoded string containing the Elliptic curve signature generated by signing the orderHash and the Signature Type.
+ */
+export async function ecSignOrderHashAsync(
+ provider: Provider,
+ orderHash: string,
+ signerAddress: string,
+ signerType: SignerType,
+): Promise<string> {
+ assert.isWeb3Provider('provider', provider);
+ assert.isHexString('orderHash', orderHash);
+ assert.isETHAddressHex('signerAddress', signerAddress);
+ const web3Wrapper = new Web3Wrapper(provider);
+ await assert.isSenderAddressAsync('signerAddress', signerAddress, web3Wrapper);
+ const normalizedSignerAddress = signerAddress.toLowerCase();
+
+ let msgHashHex = orderHash;
+ const prefixedMsgHashHex = addSignedMessagePrefix(orderHash, signerType);
+ // Metamask incorrectly implements eth_sign and does not prefix the message as per the spec
+ // Source: https://github.com/MetaMask/metamask-extension/commit/a9d36860bec424dcee8db043d3e7da6a5ff5672e
+ if (signerType === SignerType.Metamask) {
+ msgHashHex = prefixedMsgHashHex;
+ }
+ const signature = await web3Wrapper.signMessageAsync(normalizedSignerAddress, msgHashHex);
+
+ // HACK: There is no consensus on whether the signatureHex string should be formatted as
+ // v + r + s OR r + s + v, and different clients (even different versions of the same client)
+ // return the signature params in different orders. In order to support all client implementations,
+ // we parse the signature in both ways, and evaluate if either one is a valid signature.
+ // r + s + v is the most prevalent format from eth_sign, so we attempt this first.
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const validVParamValues = [27, 28];
+ const ecSignatureRSV = parseSignatureHexAsRSV(signature);
+ if (_.includes(validVParamValues, ecSignatureRSV.v)) {
+ const isValidRSVSignature = isValidECSignature(prefixedMsgHashHex, ecSignatureRSV, normalizedSignerAddress);
+ if (isValidRSVSignature) {
+ const convertedSignatureHex = convertECSignatureToSignatureHex(ecSignatureRSV, signerType);
+ return convertedSignatureHex;
+ }
+ }
+ const ecSignatureVRS = parseSignatureHexAsVRS(signature);
+ if (_.includes(validVParamValues, ecSignatureVRS.v)) {
+ const isValidVRSSignature = isValidECSignature(prefixedMsgHashHex, ecSignatureVRS, normalizedSignerAddress);
+ if (isValidVRSSignature) {
+ const convertedSignatureHex = convertECSignatureToSignatureHex(ecSignatureVRS, signerType);
+ return convertedSignatureHex;
+ }
+ }
+
+ throw new Error(OrderError.InvalidSignature);
+}
+/**
+ * Combines ECSignature with V,R,S and the relevant signature type for use in 0x protocol
+ * @param ecSignature The ECSignature of the signed data
+ * @param signerType The SignerType of the signed data
+ * @return Hex encoded string of signature (v,r,s) with Signature Type
+ */
+export function convertECSignatureToSignatureHex(ecSignature: ECSignature, signerType: SignerType): string {
+ const signatureBuffer = Buffer.concat([
+ ethUtil.toBuffer(ecSignature.v),
+ ethUtil.toBuffer(ecSignature.r),
+ ethUtil.toBuffer(ecSignature.s),
+ ]);
+ const signatureHex = `0x${signatureBuffer.toString('hex')}`;
+ let signatureType;
+ switch (signerType) {
+ case SignerType.Metamask:
+ case SignerType.Ledger:
+ case SignerType.Default: {
+ signatureType = SignatureType.EthSign;
+ break;
+ }
+ case SignerType.Trezor: {
+ signatureType = SignatureType.Trezor;
+ break;
+ }
+ default:
+ throw new Error(`Unrecognized SignerType: ${signerType}`);
+ }
+ const signatureWithType = convertToSignatureWithType(signatureHex, signatureType);
+ return signatureWithType;
+}
+/**
+ * Combines the signature proof and the Signature Type.
+ * @param signature The hex encoded signature proof
+ * @param signatureType The signature type, i.e EthSign, Trezor, Wallet etc.
+ * @return Hex encoded string of signature proof with Signature Type
+ */
+export function convertToSignatureWithType(signature: string, signatureType: SignatureType): string {
+ const signatureBuffer = Buffer.concat([ethUtil.toBuffer(signature), ethUtil.toBuffer(signatureType)]);
+ const signatureHex = `0x${signatureBuffer.toString('hex')}`;
+ return signatureHex;
+}
+/**
+ * Adds the relevant prefix to the message being signed.
+ * @param message Message to sign
+ * @param signerType The type of message prefix to add for a given SignerType. Different signers expect
+ * specific message prefixes.
+ * @return Prefixed message
+ */
+export function addSignedMessagePrefix(message: string, signerType: SignerType = SignerType.Default): string {
+ assert.isString('message', message);
+ assert.doesBelongToStringEnum('signerType', signerType, SignerType);
+ switch (signerType) {
+ case SignerType.Metamask:
+ case SignerType.Ledger:
+ case SignerType.Default: {
+ const msgBuff = ethUtil.toBuffer(message);
+ const prefixedMsgBuff = ethUtil.hashPersonalMessage(msgBuff);
+ const prefixedMsgHex = ethUtil.bufferToHex(prefixedMsgBuff);
+ return prefixedMsgHex;
+ }
+ case SignerType.Trezor: {
+ const msgBuff = ethUtil.toBuffer(message);
+ const prefixedMsgBuff = hashTrezorPersonalMessage(msgBuff);
+ const prefixedMsgHex = ethUtil.bufferToHex(prefixedMsgBuff);
+ return prefixedMsgHex;
+ }
+ default:
+ throw new Error(`Unrecognized SignerType: ${signerType}`);
+ }
+}
+
+/**
+ * Parse a 0x protocol hex-encoded signature string into it's ECSignature components
+ * @param signature A hex encoded ecSignature 0x Protocol signature
+ * @return An ECSignature object with r,s,v parameters
+ */
+export function parseECSignature(signature: string): ECSignature {
+ assert.isHexString('signature', signature);
+ const ecSignatureTypes = [SignatureType.EthSign, SignatureType.EIP712, SignatureType.Trezor];
+ assert.isOneOfExpectedSignatureTypes(signature, ecSignatureTypes);
+
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const vrsHex = signature.slice(0, -2);
+ const ecSignature = parseSignatureHexAsVRS(vrsHex);
+
+ return ecSignature;
+}
+
+function hashTrezorPersonalMessage(message: Buffer): Buffer {
+ const prefix = ethUtil.toBuffer('\x19Ethereum Signed Message:\n' + String.fromCharCode(message.byteLength));
+ return ethUtil.sha3(Buffer.concat([prefix, message]));
+}
+
+function parseValidatorSignature(signature: string): ValidatorSignature {
+ assert.isOneOfExpectedSignatureTypes(signature, [SignatureType.Validator]);
+ // tslint:disable:custom-no-magic-numbers
+ const validatorSignature = {
+ validatorAddress: signature.slice(-22, -2),
+ signature: signature.slice(0, -22),
+ };
+ // tslint:enable:custom-no-magic-numbers
+ return validatorSignature;
+}
+
+function parseSignatureHexAsVRS(signatureHex: string): ECSignature {
+ const signatureBuffer = ethUtil.toBuffer(signatureHex);
+ let v = signatureBuffer[0];
+ // HACK: Sometimes v is returned as [0, 1] and sometimes as [27, 28]
+ // If it is returned as [0, 1], add 27 to both so it becomes [27, 28]
+ const lowestValidV = 27;
+ const isProperlyFormattedV = v >= lowestValidV;
+ if (!isProperlyFormattedV) {
+ v += lowestValidV;
+ }
+ // signatureBuffer contains vrs
+ const vEndIndex = 1;
+ const rsIndex = 33;
+ const r = signatureBuffer.slice(vEndIndex, rsIndex);
+ const sEndIndex = 65;
+ const s = signatureBuffer.slice(rsIndex, sEndIndex);
+ const ecSignature: ECSignature = {
+ v,
+ r: ethUtil.bufferToHex(r),
+ s: ethUtil.bufferToHex(s),
+ };
+ return ecSignature;
+}
+
+function parseSignatureHexAsRSV(signatureHex: string): ECSignature {
+ const { v, r, s } = ethUtil.fromRpcSig(signatureHex);
+ const ecSignature: ECSignature = {
+ v,
+ r: ethUtil.bufferToHex(r),
+ s: ethUtil.bufferToHex(s),
+ };
+ return ecSignature;
+}
diff --git a/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts b/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts
new file mode 100644
index 000000000..5a2c1d7ff
--- /dev/null
+++ b/packages/order-utils/src/store/balance_and_proxy_allowance_lazy_store.ts
@@ -0,0 +1,97 @@
+import { AssetProxyId } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { AbstractBalanceAndProxyAllowanceFetcher } from '../abstract/abstract_balance_and_proxy_allowance_fetcher';
+import { AbstractBalanceAndProxyAllowanceLazyStore } from '../abstract/abstract_balance_and_proxy_allowance_lazy_store';
+import { assetDataUtils } from '../asset_data_utils';
+
+/**
+ * Copy on read store for balances/proxyAllowances of tokens/accounts
+ */
+export class BalanceAndProxyAllowanceLazyStore implements AbstractBalanceAndProxyAllowanceLazyStore {
+ private readonly _balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher;
+ private _balance: {
+ [assetData: string]: {
+ [userAddress: string]: BigNumber;
+ };
+ };
+ private _proxyAllowance: {
+ [assetData: string]: {
+ [userAddress: string]: BigNumber;
+ };
+ };
+ constructor(balanceAndProxyAllowanceFetcher: AbstractBalanceAndProxyAllowanceFetcher) {
+ this._balanceAndProxyAllowanceFetcher = balanceAndProxyAllowanceFetcher;
+ this._balance = {};
+ this._proxyAllowance = {};
+ }
+ public async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ if (_.isUndefined(this._balance[assetData]) || _.isUndefined(this._balance[assetData][userAddress])) {
+ const balance = await this._balanceAndProxyAllowanceFetcher.getBalanceAsync(assetData, userAddress);
+ this.setBalance(assetData, userAddress, balance);
+ }
+ const cachedBalance = this._balance[assetData][userAddress];
+ return cachedBalance;
+ }
+ public setBalance(assetData: string, userAddress: string, balance: BigNumber): void {
+ if (_.isUndefined(this._balance[assetData])) {
+ this._balance[assetData] = {};
+ }
+ this._balance[assetData][userAddress] = balance;
+ }
+ public deleteBalance(assetData: string, userAddress: string): void {
+ if (!_.isUndefined(this._balance[assetData])) {
+ delete this._balance[assetData][userAddress];
+ if (_.isEmpty(this._balance[assetData])) {
+ delete this._balance[assetData];
+ }
+ }
+ }
+ public async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ if (
+ _.isUndefined(this._proxyAllowance[assetData]) ||
+ _.isUndefined(this._proxyAllowance[assetData][userAddress])
+ ) {
+ const proxyAllowance = await this._balanceAndProxyAllowanceFetcher.getProxyAllowanceAsync(
+ assetData,
+ userAddress,
+ );
+ this.setProxyAllowance(assetData, userAddress, proxyAllowance);
+ }
+ const cachedProxyAllowance = this._proxyAllowance[assetData][userAddress];
+ return cachedProxyAllowance;
+ }
+ public setProxyAllowance(assetData: string, userAddress: string, proxyAllowance: BigNumber): void {
+ if (_.isUndefined(this._proxyAllowance[assetData])) {
+ this._proxyAllowance[assetData] = {};
+ }
+ this._proxyAllowance[assetData][userAddress] = proxyAllowance;
+ }
+ public deleteProxyAllowance(assetData: string, userAddress: string): void {
+ if (!_.isUndefined(this._proxyAllowance[assetData])) {
+ delete this._proxyAllowance[assetData][userAddress];
+ if (_.isEmpty(this._proxyAllowance[assetData])) {
+ delete this._proxyAllowance[assetData];
+ }
+ }
+ }
+ public deleteAllERC721ProxyAllowance(tokenAddress: string, userAddress: string): void {
+ for (const assetData in this._proxyAllowance) {
+ if (this._proxyAllowance.hasOwnProperty(assetData)) {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (
+ decodedAssetData.assetProxyId === AssetProxyId.ERC721 &&
+ decodedAssetData.tokenAddress === tokenAddress &&
+ !_.isUndefined(this._proxyAllowance[assetData][userAddress])
+ ) {
+ delete this._proxyAllowance[assetData][userAddress];
+ }
+ }
+ }
+ }
+ public deleteAll(): void {
+ this._balance = {};
+ this._proxyAllowance = {};
+ }
+}
diff --git a/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts b/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts
new file mode 100644
index 000000000..336c6d0ba
--- /dev/null
+++ b/packages/order-utils/src/store/order_filled_cancelled_lazy_store.ts
@@ -0,0 +1,65 @@
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { AbstractOrderFilledCancelledFetcher } from '../abstract/abstract_order_filled_cancelled_fetcher';
+import { AbstractOrderFilledCancelledLazyStore } from '../abstract/abstract_order_filled_cancelled_lazy_store';
+
+/**
+ * Copy on read store for balances/proxyAllowances of tokens/accounts
+ */
+export class OrderFilledCancelledLazyStore implements AbstractOrderFilledCancelledLazyStore {
+ private readonly _orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher;
+ private _filledTakerAmount: {
+ [orderHash: string]: BigNumber;
+ };
+ private _isCancelled: {
+ [orderHash: string]: boolean;
+ };
+ constructor(orderFilledCancelledFetcher: AbstractOrderFilledCancelledFetcher) {
+ this._orderFilledCancelledFetcher = orderFilledCancelledFetcher;
+ this._filledTakerAmount = {};
+ this._isCancelled = {};
+ }
+ public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
+ if (_.isUndefined(this._filledTakerAmount[orderHash])) {
+ const filledTakerAmount = await this._orderFilledCancelledFetcher.getFilledTakerAmountAsync(orderHash);
+ this.setFilledTakerAmount(orderHash, filledTakerAmount);
+ }
+ const cachedFilledTakerAmount = this._filledTakerAmount[orderHash];
+ return cachedFilledTakerAmount;
+ }
+ public setFilledTakerAmount(orderHash: string, filledTakerAmount: BigNumber): void {
+ this._filledTakerAmount[orderHash] = filledTakerAmount;
+ }
+ public deleteFilledTakerAmount(orderHash: string): void {
+ delete this._filledTakerAmount[orderHash];
+ }
+ public async getIsCancelledAsync(orderHash: string): Promise<boolean> {
+ if (_.isUndefined(this._isCancelled[orderHash])) {
+ const isCancelled = await this._orderFilledCancelledFetcher.isOrderCancelledAsync(orderHash);
+ this.setIsCancelled(orderHash, isCancelled);
+ }
+ const cachedIsCancelled = this._isCancelled[orderHash]; // tslint:disable-line:boolean-naming
+ return cachedIsCancelled;
+ }
+ public setIsCancelled(orderHash: string, isCancelled: boolean): void {
+ this._isCancelled[orderHash] = isCancelled;
+ }
+ public deleteIsCancelled(orderHash: string): void {
+ delete this._isCancelled[orderHash];
+ }
+ public deleteAll(): void {
+ this.deleteAllFilled();
+ this.deleteAllIsCancelled();
+ }
+ public deleteAllIsCancelled(): void {
+ this._isCancelled = {};
+ }
+ public deleteAllFilled(): void {
+ this._filledTakerAmount = {};
+ }
+ public getZRXAssetData(): string {
+ const zrxAssetData = this._orderFilledCancelledFetcher.getZRXAssetData();
+ return zrxAssetData;
+ }
+}
diff --git a/packages/order-utils/src/types.ts b/packages/order-utils/src/types.ts
new file mode 100644
index 000000000..1fbd8cf7b
--- /dev/null
+++ b/packages/order-utils/src/types.ts
@@ -0,0 +1,43 @@
+import { BigNumber } from '@0xproject/utils';
+
+export enum OrderError {
+ InvalidSignature = 'INVALID_SIGNATURE',
+}
+
+export enum TradeSide {
+ Maker = 'maker',
+ Taker = 'taker',
+}
+
+export enum TransferType {
+ Trade = 'trade',
+ Fee = 'fee',
+}
+
+export interface EIP712Parameter {
+ name: string;
+ type: EIP712Types;
+}
+
+export interface EIP712Schema {
+ name: string;
+ parameters: EIP712Parameter[];
+}
+
+export enum EIP712Types {
+ Address = 'address',
+ Bytes = 'bytes',
+ Bytes32 = 'bytes32',
+ String = 'string',
+ Uint256 = 'uint256',
+}
+
+export interface CreateOrderOpts {
+ takerAddress?: string;
+ senderAddress?: string;
+ makerFee?: BigNumber;
+ takerFee?: BigNumber;
+ feeRecipientAddress?: string;
+ salt?: BigNumber;
+ expirationTimeSeconds?: BigNumber;
+}
diff --git a/packages/order-utils/src/utils.ts b/packages/order-utils/src/utils.ts
new file mode 100644
index 000000000..7aaaf0609
--- /dev/null
+++ b/packages/order-utils/src/utils.ts
@@ -0,0 +1,22 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const utils = {
+ getSignatureTypeIndexIfExists(signature: string): number {
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const signatureTypeHex = signature.slice(-2);
+ const base = 16;
+ const signatureTypeInt = parseInt(signatureTypeHex, base);
+ return signatureTypeInt;
+ },
+ getCurrentUnixTimestampSec(): BigNumber {
+ const milisecondsInSecond = 1000;
+ return new BigNumber(Date.now() / milisecondsInSecond).round();
+ },
+ getPartialAmount(numerator: BigNumber, denominator: BigNumber, target: BigNumber): BigNumber {
+ const fillMakerTokenAmount = numerator
+ .mul(target)
+ .div(denominator)
+ .round(0);
+ return fillMakerTokenAmount;
+ },
+};
diff --git a/packages/order-utils/test/assert_test.ts b/packages/order-utils/test/assert_test.ts
new file mode 100644
index 000000000..631971787
--- /dev/null
+++ b/packages/order-utils/test/assert_test.ts
@@ -0,0 +1,34 @@
+import * as chai from 'chai';
+import 'mocha';
+
+import { assert } from '../src/assert';
+
+import { chaiSetup } from './utils/chai_setup';
+import { web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('Assertion library', () => {
+ describe('#isSenderAddressHexAsync', () => {
+ it('throws when address is invalid', async () => {
+ const address = '0xdeadbeef';
+ const varName = 'address';
+ return expect(assert.isSenderAddressAsync(varName, address, web3Wrapper)).to.be.rejectedWith(
+ `Expected ${varName} to be of type ETHAddressHex, encountered: ${address}`,
+ );
+ });
+ it('throws when address is unavailable', async () => {
+ const validUnrelatedAddress = '0x8b0292b11a196601eddce54b665cafeca0347d42';
+ const varName = 'address';
+ return expect(assert.isSenderAddressAsync(varName, validUnrelatedAddress, web3Wrapper)).to.be.rejectedWith(
+ `Specified ${varName} ${validUnrelatedAddress} isn't available through the supplied web3 provider`,
+ );
+ });
+ it("doesn't throw if address is available", async () => {
+ const availableAddress = (await web3Wrapper.getAvailableAddressesAsync())[0];
+ const varName = 'address';
+ return expect(assert.isSenderAddressAsync(varName, availableAddress, web3Wrapper)).to.become(undefined);
+ });
+ });
+});
diff --git a/packages/order-utils/test/exchange_transfer_simulator_test.ts b/packages/order-utils/test/exchange_transfer_simulator_test.ts
new file mode 100644
index 000000000..f5c18cdb9
--- /dev/null
+++ b/packages/order-utils/test/exchange_transfer_simulator_test.ts
@@ -0,0 +1,176 @@
+import { BlockchainLifecycle, devConstants } from '@0xproject/dev-utils';
+import { ExchangeContractErrs } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+
+import { artifacts } from '../src/artifacts';
+import { assetDataUtils } from '../src/asset_data_utils';
+import { constants } from '../src/constants';
+import { ExchangeTransferSimulator } from '../src/exchange_transfer_simulator';
+import { DummyERC20TokenContract } from '../src/generated_contract_wrappers/dummy_erc20_token';
+import { ERC20ProxyContract } from '../src/generated_contract_wrappers/erc20_proxy';
+import { ERC20TokenContract } from '../src/generated_contract_wrappers/erc20_token';
+import { BalanceAndProxyAllowanceLazyStore } from '../src/store/balance_and_proxy_allowance_lazy_store';
+import { TradeSide, TransferType } from '../src/types';
+
+import { chaiSetup } from './utils/chai_setup';
+import { SimpleERC20BalanceAndProxyAllowanceFetcher } from './utils/simple_erc20_balance_and_proxy_allowance_fetcher';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('ExchangeTransferSimulator', async () => {
+ const transferAmount = new BigNumber(5);
+ let userAddresses: string[];
+ let dummyERC20Token: DummyERC20TokenContract;
+ let coinbase: string;
+ let sender: string;
+ let recipient: string;
+ let exampleAssetData: string;
+ let exchangeTransferSimulator: ExchangeTransferSimulator;
+ let txHash: string;
+ let erc20ProxyAddress: string;
+ before(async function(): Promise<void> {
+ const mochaTestTimeoutMs = 20000;
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
+
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ [coinbase, sender, recipient] = userAddresses;
+
+ const txDefaults = {
+ gas: devConstants.GAS_LIMIT,
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+
+ const erc20Proxy = await ERC20ProxyContract.deployFrom0xArtifactAsync(
+ artifacts.ERC20Proxy,
+ provider,
+ txDefaults,
+ );
+ erc20ProxyAddress = erc20Proxy.address;
+
+ const totalSupply = new BigNumber(100000000000000000000);
+ const name = 'Test';
+ const symbol = 'TST';
+ const decimals = new BigNumber(18);
+ // tslint:disable-next-line:no-unused-variable
+ dummyERC20Token = await DummyERC20TokenContract.deployFrom0xArtifactAsync(
+ artifacts.DummyERC20Token,
+ provider,
+ txDefaults,
+ name,
+ symbol,
+ decimals,
+ totalSupply,
+ );
+
+ exampleAssetData = assetDataUtils.encodeERC20AssetData(dummyERC20Token.address);
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#transferFromAsync', function(): void {
+ // HACK: For some reason these tests need a slightly longer timeout
+ const mochaTestTimeoutMs = 3000;
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
+ beforeEach(() => {
+ const simpleERC20BalanceAndProxyAllowanceFetcher = new SimpleERC20BalanceAndProxyAllowanceFetcher(
+ (dummyERC20Token as any) as ERC20TokenContract,
+ erc20ProxyAddress,
+ );
+ const balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
+ simpleERC20BalanceAndProxyAllowanceFetcher,
+ );
+ exchangeTransferSimulator = new ExchangeTransferSimulator(balanceAndProxyAllowanceLazyStore);
+ });
+ it("throws if the user doesn't have enough allowance", async () => {
+ return expect(
+ exchangeTransferSimulator.transferFromAsync(
+ exampleAssetData,
+ sender,
+ recipient,
+ transferAmount,
+ TradeSide.Taker,
+ TransferType.Trade,
+ ),
+ ).to.be.rejectedWith(ExchangeContractErrs.InsufficientTakerAllowance);
+ });
+ it("throws if the user doesn't have enough balance", async () => {
+ txHash = await dummyERC20Token.approve.sendTransactionAsync(erc20ProxyAddress, transferAmount, {
+ from: sender,
+ });
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ return expect(
+ exchangeTransferSimulator.transferFromAsync(
+ exampleAssetData,
+ sender,
+ recipient,
+ transferAmount,
+ TradeSide.Maker,
+ TransferType.Trade,
+ ),
+ ).to.be.rejectedWith(ExchangeContractErrs.InsufficientMakerBalance);
+ });
+ it('updates balances and proxyAllowance after transfer', async () => {
+ txHash = await dummyERC20Token.transfer.sendTransactionAsync(sender, transferAmount, {
+ from: coinbase,
+ });
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ txHash = await dummyERC20Token.approve.sendTransactionAsync(erc20ProxyAddress, transferAmount, {
+ from: sender,
+ });
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+
+ await exchangeTransferSimulator.transferFromAsync(
+ exampleAssetData,
+ sender,
+ recipient,
+ transferAmount,
+ TradeSide.Taker,
+ TransferType.Trade,
+ );
+ const store = (exchangeTransferSimulator as any)._store;
+ const senderBalance = await store.getBalanceAsync(exampleAssetData, sender);
+ const recipientBalance = await store.getBalanceAsync(exampleAssetData, recipient);
+ const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleAssetData, sender);
+ expect(senderBalance).to.be.bignumber.equal(0);
+ expect(recipientBalance).to.be.bignumber.equal(transferAmount);
+ expect(senderProxyAllowance).to.be.bignumber.equal(0);
+ });
+ it("doesn't update proxyAllowance after transfer if unlimited", async () => {
+ txHash = await dummyERC20Token.transfer.sendTransactionAsync(sender, transferAmount, {
+ from: coinbase,
+ });
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ txHash = await dummyERC20Token.approve.sendTransactionAsync(
+ erc20ProxyAddress,
+ constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS,
+ {
+ from: sender,
+ },
+ );
+ await web3Wrapper.awaitTransactionSuccessAsync(txHash);
+ await exchangeTransferSimulator.transferFromAsync(
+ exampleAssetData,
+ sender,
+ recipient,
+ transferAmount,
+ TradeSide.Taker,
+ TransferType.Trade,
+ );
+ const store = (exchangeTransferSimulator as any)._store;
+ const senderBalance = await store.getBalanceAsync(exampleAssetData, sender);
+ const recipientBalance = await store.getBalanceAsync(exampleAssetData, recipient);
+ const senderProxyAllowance = await store.getProxyAllowanceAsync(exampleAssetData, sender);
+ expect(senderBalance).to.be.bignumber.equal(0);
+ expect(recipientBalance).to.be.bignumber.equal(transferAmount);
+ expect(senderProxyAllowance).to.be.bignumber.equal(constants.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ });
+ });
+});
diff --git a/packages/order-utils/test/market_utils_test.ts b/packages/order-utils/test/market_utils_test.ts
new file mode 100644
index 000000000..21c0a4802
--- /dev/null
+++ b/packages/order-utils/test/market_utils_test.ts
@@ -0,0 +1,280 @@
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import 'mocha';
+
+import { constants, marketUtils } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+import { testOrderFactory } from './utils/test_order_factory';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+// tslint:disable: no-unused-expression
+describe('marketUtils', () => {
+ describe('#findOrdersThatCoverMakerAssetFillAmount', () => {
+ describe('no orders', () => {
+ it('returns empty and unchanged remainingFillAmount', async () => {
+ const fillAmount = new BigNumber(10);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ [],
+ [],
+ fillAmount,
+ );
+ expect(resultOrders).to.be.empty;
+ expect(remainingFillAmount).to.be.bignumber.equal(fillAmount);
+ });
+ });
+ describe('orders are completely fillable', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ const makerAssetAmount = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that equal the makerAssetAmount
+ const remainingFillableMakerAssetAmounts = [makerAssetAmount, makerAssetAmount, makerAssetAmount];
+ it('returns input orders and zero remainingFillAmount when input exactly matches requested fill amount', async () => {
+ // try to fill 20 units of makerAsset
+ // include 10 units of slippageBufferAmount
+ const fillAmount = new BigNumber(20);
+ const slippageBufferAmount = new BigNumber(10);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ slippageBufferAmount,
+ );
+ expect(resultOrders).to.be.deep.equal(inputOrders);
+ expect(remainingFillAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('returns input orders and zero remainingFillAmount when input has more than requested fill amount', async () => {
+ // try to fill 15 units of makerAsset
+ // include 10 units of slippageBufferAmount
+ const fillAmount = new BigNumber(15);
+ const slippageBufferAmount = new BigNumber(10);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ slippageBufferAmount,
+ );
+ expect(resultOrders).to.be.deep.equal(inputOrders);
+ expect(remainingFillAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('returns input orders and non-zero remainingFillAmount when input has less than requested fill amount', async () => {
+ // try to fill 30 units of makerAsset
+ // include 5 units of slippageBufferAmount
+ const fillAmount = new BigNumber(30);
+ const slippageBufferAmount = new BigNumber(5);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ slippageBufferAmount,
+ );
+ expect(resultOrders).to.be.deep.equal(inputOrders);
+ expect(remainingFillAmount).to.be.bignumber.equal(new BigNumber(5));
+ });
+ it('returns first order and zero remainingFillAmount when requested fill amount is exactly covered by the first order', async () => {
+ // try to fill 10 units of makerAsset
+ const fillAmount = new BigNumber(10);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ );
+ expect(resultOrders).to.be.deep.equal([inputOrders[0]]);
+ expect(remainingFillAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ it('returns first two orders and zero remainingFillAmount when requested fill amount is over covered by the first two order', async () => {
+ // try to fill 15 units of makerAsset
+ const fillAmount = new BigNumber(15);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ );
+ expect(resultOrders).to.be.deep.equal([inputOrders[0], inputOrders[1]]);
+ expect(remainingFillAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('orders are partially fillable', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ const makerAssetAmount = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that cover different partial fill scenarios
+ // 1. order is completely filled already
+ // 2. order is partially fillable
+ // 3. order is completely fillable
+ const remainingFillableMakerAssetAmounts = [constants.ZERO_AMOUNT, new BigNumber(5), makerAssetAmount];
+ it('returns last two orders and non-zero remainingFillAmount when trying to fill original makerAssetAmounts', async () => {
+ // try to fill 30 units of makerAsset
+ const fillAmount = new BigNumber(30);
+ const { resultOrders, remainingFillAmount } = marketUtils.findOrdersThatCoverMakerAssetFillAmount(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ fillAmount,
+ );
+ expect(resultOrders).to.be.deep.equal([inputOrders[1], inputOrders[2]]);
+ expect(remainingFillAmount).to.be.bignumber.equal(new BigNumber(15));
+ });
+ });
+ });
+ describe('#findFeeOrdersThatCoverFeesForTargetOrders', () => {
+ // generate three signed fee orders each with 10 units of ZRX, 30 total
+ const zrxAmount = new BigNumber(10);
+ const inputFeeOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount: zrxAmount,
+ },
+ 3,
+ );
+ // generate remainingFillableFeeAmounts that equal the zrxAmount
+ const remainingFillableFeeAmounts = [zrxAmount, zrxAmount, zrxAmount];
+ describe('no target orders', () => {
+ it('returns empty and zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ [],
+ [],
+ inputFeeOrders,
+ remainingFillableFeeAmounts,
+ );
+ expect(resultOrders).to.be.empty;
+ expect(remainingFeeAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('no fee orders', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ // each signed order requires 10 units of takerFee
+ const makerAssetAmount = new BigNumber(10);
+ const takerFee = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ takerFee,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that equal the makerAssetAmount
+ const remainingFillableMakerAssetAmounts = [makerAssetAmount, makerAssetAmount, makerAssetAmount];
+ it('returns empty and non-zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ [],
+ [],
+ );
+ expect(resultOrders).to.be.empty;
+ expect(remainingFeeAmount).to.be.bignumber.equal(new BigNumber(30));
+ });
+ });
+ describe('target orders have no fees', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ const makerAssetAmount = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that equal the makerAssetAmount
+ const remainingFillableMakerAssetAmounts = [makerAssetAmount, makerAssetAmount, makerAssetAmount];
+ it('returns empty and zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ inputFeeOrders,
+ remainingFillableFeeAmounts,
+ );
+ expect(resultOrders).to.be.empty;
+ expect(remainingFeeAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('target orders require fees and are completely fillable', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ // each signed order requires 10 units of takerFee
+ const makerAssetAmount = new BigNumber(10);
+ const takerFee = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ takerFee,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that equal the makerAssetAmount
+ const remainingFillableMakerAssetAmounts = [makerAssetAmount, makerAssetAmount, makerAssetAmount];
+ it('returns input fee orders and zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ inputFeeOrders,
+ remainingFillableFeeAmounts,
+ );
+ expect(resultOrders).to.be.deep.equal(inputFeeOrders);
+ expect(remainingFeeAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('target orders require fees and are partially fillable', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ // each signed order requires 10 units of takerFee
+ const makerAssetAmount = new BigNumber(10);
+ const takerFee = new BigNumber(10);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ takerFee,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that cover different partial fill scenarios
+ // 1. order is completely filled already
+ // 2. order is partially fillable
+ // 3. order is completely fillable
+ const remainingFillableMakerAssetAmounts = [constants.ZERO_AMOUNT, new BigNumber(5), makerAssetAmount];
+ it('returns first two input fee orders and zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ inputFeeOrders,
+ remainingFillableFeeAmounts,
+ );
+ expect(resultOrders).to.be.deep.equal([inputFeeOrders[0], inputFeeOrders[1]]);
+ expect(remainingFeeAmount).to.be.bignumber.equal(constants.ZERO_AMOUNT);
+ });
+ });
+ describe('target orders require more fees than available', () => {
+ // generate three signed orders each with 10 units of makerAsset, 30 total
+ // each signed order requires 20 units of takerFee
+ const makerAssetAmount = new BigNumber(10);
+ const takerFee = new BigNumber(20);
+ const inputOrders = testOrderFactory.generateTestSignedOrders(
+ {
+ makerAssetAmount,
+ takerFee,
+ },
+ 3,
+ );
+ // generate remainingFillableMakerAssetAmounts that equal the makerAssetAmount
+ const remainingFillableMakerAssetAmounts = [makerAssetAmount, makerAssetAmount, makerAssetAmount];
+ it('returns input fee orders and non-zero remainingFeeAmount', async () => {
+ const { resultOrders, remainingFeeAmount } = marketUtils.findFeeOrdersThatCoverFeesForTargetOrders(
+ inputOrders,
+ remainingFillableMakerAssetAmounts,
+ inputFeeOrders,
+ remainingFillableFeeAmounts,
+ );
+ expect(resultOrders).to.be.deep.equal(inputFeeOrders);
+ expect(remainingFeeAmount).to.be.bignumber.equal(new BigNumber(30));
+ });
+ });
+ });
+});
diff --git a/packages/order-utils/test/order_hash_test.ts b/packages/order-utils/test/order_hash_test.ts
new file mode 100644
index 000000000..0a6be83d0
--- /dev/null
+++ b/packages/order-utils/test/order_hash_test.ts
@@ -0,0 +1,61 @@
+import { Order } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import 'mocha';
+
+import { constants, orderHashUtils } from '../src';
+
+import { chaiSetup } from './utils/chai_setup';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('Order hashing', () => {
+ describe('#getOrderHashHex', () => {
+ const expectedOrderHash = '0x434c6b41e2fb6dfcfe1b45c4492fb03700798e9c1afc6f801ba6203f948c1fa7';
+ const fakeExchangeContractAddress = '0x1dc4c1cefef38a777b15aa20260a54e584b16c48';
+ const order: Order = {
+ makerAddress: constants.NULL_ADDRESS,
+ takerAddress: constants.NULL_ADDRESS,
+ senderAddress: constants.NULL_ADDRESS,
+ feeRecipientAddress: constants.NULL_ADDRESS,
+ makerAssetData: constants.NULL_ADDRESS,
+ takerAssetData: constants.NULL_ADDRESS,
+ exchangeAddress: fakeExchangeContractAddress,
+ salt: new BigNumber(0),
+ makerFee: new BigNumber(0),
+ takerFee: new BigNumber(0),
+ makerAssetAmount: new BigNumber(0),
+ takerAssetAmount: new BigNumber(0),
+ expirationTimeSeconds: new BigNumber(0),
+ };
+ it('calculates the order hash', async () => {
+ const orderHash = orderHashUtils.getOrderHashHex(order);
+ expect(orderHash).to.be.equal(expectedOrderHash);
+ });
+ it('throws a readable error message if taker format is invalid', async () => {
+ const orderWithInvalidtakerFormat = {
+ ...order,
+ takerAddress: (null as any) as string,
+ };
+ const expectedErrorMessage =
+ 'Order taker must be of type string. If you want anyone to be able to fill an order - pass ZeroEx.NULL_ADDRESS';
+ expect(() => orderHashUtils.getOrderHashHex(orderWithInvalidtakerFormat)).to.throw(expectedErrorMessage);
+ });
+ });
+ describe('#isValidOrderHash', () => {
+ it('returns false if the value is not a hex string', () => {
+ const isValid = orderHashUtils.isValidOrderHash('not a hex');
+ expect(isValid).to.be.false();
+ });
+ it('returns false if the length is wrong', () => {
+ const isValid = orderHashUtils.isValidOrderHash('0xdeadbeef');
+ expect(isValid).to.be.false();
+ });
+ it('returns true if order hash is correct', () => {
+ const orderHashLength = 65;
+ const isValid = orderHashUtils.isValidOrderHash('0x' + Array(orderHashLength).join('0'));
+ expect(isValid).to.be.true();
+ });
+ });
+});
diff --git a/packages/order-utils/test/order_validation_utils_test.ts b/packages/order-utils/test/order_validation_utils_test.ts
new file mode 100644
index 000000000..d3ff867d7
--- /dev/null
+++ b/packages/order-utils/test/order_validation_utils_test.ts
@@ -0,0 +1,70 @@
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import 'mocha';
+
+import { OrderValidationUtils } from '../src/order_validation_utils';
+
+import { chaiSetup } from './utils/chai_setup';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('OrderValidationUtils', () => {
+ describe('#isRoundingError', () => {
+ it('should return false if there is a rounding error of 0.1%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(999);
+ const target = new BigNumber(50);
+ // rounding error = ((20*50/999) - floor(20*50/999)) / (20*50/999) = 0.1%
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+
+ it('should return false if there is a rounding of 0.09%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(9991);
+ const target = new BigNumber(500);
+ // rounding error = ((20*500/9991) - floor(20*500/9991)) / (20*500/9991) = 0.09%
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+
+ it('should return true if there is a rounding error of 0.11%', async () => {
+ const numerator = new BigNumber(20);
+ const denominator = new BigNumber(9989);
+ const target = new BigNumber(500);
+ // rounding error = ((20*500/9989) - floor(20*500/9989)) / (20*500/9989) = 0.011%
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.true();
+ });
+
+ it('should return true if there is a rounding error > 0.1%', async () => {
+ const numerator = new BigNumber(3);
+ const denominator = new BigNumber(7);
+ const target = new BigNumber(10);
+ // rounding error = ((3*10/7) - floor(3*10/7)) / (3*10/7) = 6.67%
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.true();
+ });
+
+ it('should return false when there is no rounding error', async () => {
+ const numerator = new BigNumber(1);
+ const denominator = new BigNumber(2);
+ const target = new BigNumber(10);
+
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+
+ it('should return false when there is rounding error <= 0.1%', async () => {
+ // randomly generated numbers
+ const numerator = new BigNumber(76564);
+ const denominator = new BigNumber(676373677);
+ const target = new BigNumber(105762562);
+ // rounding error = ((76564*105762562/676373677) - floor(76564*105762562/676373677)) /
+ // (76564*105762562/676373677) = 0.0007%
+ const isRoundingError = OrderValidationUtils.isRoundingError(numerator, denominator, target);
+ expect(isRoundingError).to.be.false();
+ });
+ });
+});
diff --git a/packages/order-utils/test/remaining_fillable_calculator_test.ts b/packages/order-utils/test/remaining_fillable_calculator_test.ts
new file mode 100644
index 000000000..a5a3b7fc6
--- /dev/null
+++ b/packages/order-utils/test/remaining_fillable_calculator_test.ts
@@ -0,0 +1,246 @@
+import { SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import 'mocha';
+
+import { RemainingFillableCalculator } from '../src/remaining_fillable_calculator';
+
+import { chaiSetup } from './utils/chai_setup';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('RemainingFillableCalculator', () => {
+ let calculator: RemainingFillableCalculator;
+ let signedOrder: SignedOrder;
+ let transferrableMakeAssetAmount: BigNumber;
+ let transferrableMakerFeeTokenAmount: BigNumber;
+ let remainingMakeAssetAmount: BigNumber;
+ let makerAmount: BigNumber;
+ let takerAmount: BigNumber;
+ let makerFeeAmount: BigNumber;
+ let isMakeAssetZRX: boolean;
+ const makerAssetData: string = '0x1';
+ const takerAssetData: string = '0x2';
+ const decimals: number = 4;
+ const zero: BigNumber = new BigNumber(0);
+ const zeroAddress = '0x0';
+ const signature: string =
+ '0x1B61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace225403';
+ beforeEach(async () => {
+ [makerAmount, takerAmount, makerFeeAmount] = [
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(50), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(1), decimals),
+ ];
+ [transferrableMakeAssetAmount, transferrableMakerFeeTokenAmount] = [
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(50), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals),
+ ];
+ });
+ function buildSignedOrder(): SignedOrder {
+ return {
+ signature,
+ exchangeAddress: zeroAddress,
+ feeRecipientAddress: zeroAddress,
+ senderAddress: zeroAddress,
+ makerAddress: zeroAddress,
+ takerAddress: zeroAddress,
+ makerFee: makerFeeAmount,
+ takerFee: zero,
+ makerAssetAmount: makerAmount,
+ takerAssetAmount: takerAmount,
+ makerAssetData,
+ takerAssetData,
+ salt: zero,
+ expirationTimeSeconds: zero,
+ };
+ }
+ describe('Maker token is NOT ZRX', () => {
+ before(async () => {
+ isMakeAssetZRX = false;
+ });
+ it('calculates the correct amount when unfilled and funds available', () => {
+ signedOrder = buildSignedOrder();
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(remainingMakeAssetAmount);
+ });
+ it('calculates the correct amount when partially filled and funds available', () => {
+ signedOrder = buildSignedOrder();
+ remainingMakeAssetAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), decimals);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(remainingMakeAssetAmount);
+ });
+ it('calculates the amount to be 0 when all fee funds are transferred', () => {
+ signedOrder = buildSignedOrder();
+ transferrableMakerFeeTokenAmount = zero;
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(zero);
+ });
+ it('calculates the correct amount when balance is less than remaining fillable', () => {
+ signedOrder = buildSignedOrder();
+ const partiallyFilledAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount.minus(partiallyFilledAmount);
+ transferrableMakeAssetAmount = remainingMakeAssetAmount.minus(partiallyFilledAmount);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(transferrableMakeAssetAmount);
+ });
+ describe('Order to Fee Ratio is < 1', () => {
+ beforeEach(async () => {
+ [makerAmount, takerAmount, makerFeeAmount] = [
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(3), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(6), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(6), decimals),
+ ];
+ });
+ it('calculates the correct amount when funds unavailable', () => {
+ signedOrder = buildSignedOrder();
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ const transferredAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ transferrableMakeAssetAmount = remainingMakeAssetAmount.minus(transferredAmount);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(transferrableMakeAssetAmount);
+ });
+ });
+ describe('Ratio is not evenly divisble', () => {
+ beforeEach(async () => {
+ [makerAmount, takerAmount, makerFeeAmount] = [
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(3), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(7), decimals),
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(7), decimals),
+ ];
+ });
+ it('calculates the correct amount when funds unavailable', () => {
+ signedOrder = buildSignedOrder();
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ const transferredAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ transferrableMakeAssetAmount = remainingMakeAssetAmount.minus(transferredAmount);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ const calculatedFillableAmount = calculator.computeRemainingFillable();
+ expect(calculatedFillableAmount.lessThanOrEqualTo(transferrableMakeAssetAmount)).to.be.true();
+ expect(calculatedFillableAmount).to.be.bignumber.greaterThan(new BigNumber(0));
+ const orderToFeeRatio = signedOrder.makerAssetAmount.dividedBy(signedOrder.makerFee);
+ const calculatedFeeAmount = calculatedFillableAmount.dividedBy(orderToFeeRatio);
+ expect(calculatedFeeAmount).to.be.bignumber.lessThan(transferrableMakerFeeTokenAmount);
+ });
+ });
+ });
+ describe('Maker Token is ZRX', () => {
+ before(async () => {
+ isMakeAssetZRX = true;
+ });
+ it('calculates the correct amount when unfilled and funds available', () => {
+ signedOrder = buildSignedOrder();
+ transferrableMakeAssetAmount = makerAmount.plus(makerFeeAmount);
+ transferrableMakerFeeTokenAmount = transferrableMakeAssetAmount;
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(remainingMakeAssetAmount);
+ });
+ it('calculates the correct amount when partially filled and funds available', () => {
+ signedOrder = buildSignedOrder();
+ remainingMakeAssetAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), decimals);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(remainingMakeAssetAmount);
+ });
+ it('calculates the amount to be 0 when all fee funds are transferred', () => {
+ signedOrder = buildSignedOrder();
+ transferrableMakeAssetAmount = zero;
+ transferrableMakerFeeTokenAmount = zero;
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount;
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ expect(calculator.computeRemainingFillable()).to.be.bignumber.equal(zero);
+ });
+ it('calculates the correct amount when balance is less than remaining fillable', () => {
+ signedOrder = buildSignedOrder();
+ const partiallyFilledAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ remainingMakeAssetAmount = signedOrder.makerAssetAmount.minus(partiallyFilledAmount);
+ transferrableMakeAssetAmount = remainingMakeAssetAmount.minus(partiallyFilledAmount);
+ transferrableMakerFeeTokenAmount = transferrableMakeAssetAmount;
+
+ const orderToFeeRatio = signedOrder.makerAssetAmount.dividedToIntegerBy(signedOrder.makerFee);
+ const expectedFillableAmount = new BigNumber(450980);
+ calculator = new RemainingFillableCalculator(
+ signedOrder.makerFee,
+ signedOrder.makerAssetAmount,
+ isMakeAssetZRX,
+ transferrableMakeAssetAmount,
+ transferrableMakerFeeTokenAmount,
+ remainingMakeAssetAmount,
+ );
+ const calculatedFillableAmount = calculator.computeRemainingFillable();
+ const numberOfFillsInRatio = calculatedFillableAmount.dividedToIntegerBy(orderToFeeRatio);
+ const calculatedFillableAmountPlusFees = calculatedFillableAmount.plus(numberOfFillsInRatio);
+ expect(calculatedFillableAmountPlusFees).to.be.bignumber.lessThan(transferrableMakeAssetAmount);
+ expect(calculatedFillableAmountPlusFees).to.be.bignumber.lessThan(remainingMakeAssetAmount);
+ expect(calculatedFillableAmount).to.be.bignumber.equal(expectedFillableAmount);
+ expect(numberOfFillsInRatio.decimalPlaces()).to.be.equal(0);
+ });
+ });
+});
diff --git a/packages/order-utils/test/signature_utils_test.ts b/packages/order-utils/test/signature_utils_test.ts
new file mode 100644
index 000000000..a25d2afd6
--- /dev/null
+++ b/packages/order-utils/test/signature_utils_test.ts
@@ -0,0 +1,253 @@
+import { SignerType } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import { JSONRPCErrorCallback, JSONRPCRequestPayload } from 'ethereum-types';
+import * as _ from 'lodash';
+import 'mocha';
+import * as Sinon from 'sinon';
+
+import { ecSignOrderHashAsync, generatePseudoRandomSalt } from '../src';
+import { convertECSignatureToSignatureHex, isValidECSignature, isValidSignatureAsync } from '../src/signature_utils';
+
+import { chaiSetup } from './utils/chai_setup';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('Signature utils', () => {
+ describe('#isValidSignature', () => {
+ let dataHex = '0x6927e990021d23b1eb7b8789f6a6feaf98fe104bb0cf8259421b79f9a34222b0';
+ const ethSignSignature =
+ '0x1B61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace225403';
+ let address = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
+
+ it("should return false if the data doesn't pertain to the signature & address", async () => {
+ const bytes32Zeros = '0x0000000000000000000000000000000000000000000000000000000000000000';
+ expect(await isValidSignatureAsync(provider, bytes32Zeros, ethSignSignature, address)).to.be.false();
+ });
+ it("should return false if the address doesn't pertain to the signature & data", async () => {
+ const validUnrelatedAddress = '0x8b0292b11a196601ed2ce54b665cafeca0347d42';
+ expect(
+ await isValidSignatureAsync(provider, dataHex, ethSignSignature, validUnrelatedAddress),
+ ).to.be.false();
+ });
+ it("should return false if the signature doesn't pertain to the dataHex & address", async () => {
+ const signatureArray = ethSignSignature.split('');
+ // tslint:disable-next-line:custom-no-magic-numbers
+ signatureArray[5] = 'C'; // V = 28, instead of 27
+ const wrongSignature = signatureArray.join('');
+ expect(await isValidSignatureAsync(provider, dataHex, wrongSignature, address)).to.be.false();
+ });
+
+ it('should throw if signatureType is invalid', () => {
+ const signatureArray = ethSignSignature.split('');
+ signatureArray[3] = '9'; // SignatureType w/ index 9 doesn't exist
+ const signatureWithInvalidType = signatureArray.join('');
+ expect(isValidSignatureAsync(provider, dataHex, signatureWithInvalidType, address)).to.be.rejected();
+ });
+
+ it('should return true for a valid Ecrecover (EthSign) signature', async () => {
+ const isValidSignatureLocal = await isValidSignatureAsync(provider, dataHex, ethSignSignature, address);
+ expect(isValidSignatureLocal).to.be.true();
+ });
+
+ it('should return true for a valid EIP712 signature', async () => {
+ dataHex = '0xa1d7403bcbbcd75ec233cfd6584ff8dabed677d0e9bb32c2bea94e9dd8a109da';
+ address = '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb';
+ const eip712Signature =
+ '0x1bdde07aac4bf12c12ddbb155919c43eba4146a2cfcf904a862950dbebe332554c6674975603eb5a4eaf8fd7f2e06350267e5b36cda9851a89f8bb49fe2fc9afe202';
+ const isValidSignatureLocal = await isValidSignatureAsync(provider, dataHex, eip712Signature, address);
+ expect(isValidSignatureLocal).to.be.true();
+ });
+
+ it('should return true for a valid Trezor signature', async () => {
+ dataHex = '0xd0d994e31c88f33fd8a572552a70ed339de579e5ba49ee1d17cc978bbe1cdd21';
+ address = '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb';
+ const trezorSignature =
+ '0x1ce4760660e6495b5ae6723087bea073b3a99ce98ea81fdf00c240279c010e63d05b87bc34c4d67d4776e8d5aeb023a67484f4eaf0fd353b40893e5101e845cd9908';
+ const isValidSignatureLocal = await isValidSignatureAsync(provider, dataHex, trezorSignature, address);
+ expect(isValidSignatureLocal).to.be.true();
+ });
+ });
+ describe('#isValidECSignature', () => {
+ const signature = {
+ v: 27,
+ r: '0xaca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d64393',
+ s: '0x46b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf2',
+ };
+ const data = '0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad';
+ const address = '0x0e5cb767cce09a7f3ca594df118aa519be5e2b5a';
+
+ it("should return false if the data doesn't pertain to the signature & address", async () => {
+ expect(isValidECSignature('0x0', signature, address)).to.be.false();
+ });
+ it("should return false if the address doesn't pertain to the signature & data", async () => {
+ const validUnrelatedAddress = '0x8b0292b11a196601ed2ce54b665cafeca0347d42';
+ expect(isValidECSignature(data, signature, validUnrelatedAddress)).to.be.false();
+ });
+ it("should return false if the signature doesn't pertain to the data & address", async () => {
+ const wrongSignature = _.assign({}, signature, { v: 28 });
+ expect(isValidECSignature(data, wrongSignature, address)).to.be.false();
+ });
+ it('should return true if the signature does pertain to the data & address', async () => {
+ const isValidSignatureLocal = isValidECSignature(data, signature, address);
+ expect(isValidSignatureLocal).to.be.true();
+ });
+ });
+ describe('#generateSalt', () => {
+ it('generates different salts', () => {
+ const isEqual = generatePseudoRandomSalt().eq(generatePseudoRandomSalt());
+ expect(isEqual).to.be.false();
+ });
+ it('generates salt in range [0..2^256)', () => {
+ const salt = generatePseudoRandomSalt();
+ expect(salt.greaterThanOrEqualTo(0)).to.be.true();
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const twoPow256 = new BigNumber(2).pow(256);
+ expect(salt.lessThan(twoPow256)).to.be.true();
+ });
+ });
+ describe('#ecSignOrderHashAsync', () => {
+ let stubs: Sinon.SinonStub[] = [];
+ let makerAddress: string;
+ before(async () => {
+ const availableAddreses = await web3Wrapper.getAvailableAddressesAsync();
+ makerAddress = availableAddreses[0];
+ });
+ afterEach(() => {
+ // clean up any stubs after the test has completed
+ _.each(stubs, s => s.restore());
+ stubs = [];
+ });
+ it('Should return the correct Signature', async () => {
+ const orderHash = '0x6927e990021d23b1eb7b8789f6a6feaf98fe104bb0cf8259421b79f9a34222b0';
+ const expectedSignature =
+ '0x1b61a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc3340349190569279751135161d22529dc25add4f6069af05be04cacbda2ace225403';
+ const ecSignature = await ecSignOrderHashAsync(provider, orderHash, makerAddress, SignerType.Default);
+ expect(ecSignature).to.equal(expectedSignature);
+ });
+ it('should return the correct Signature for signatureHex concatenated as R + S + V', async () => {
+ const orderHash = '0x34decbedc118904df65f379a175bb39ca18209d6ce41d5ed549d54e6e0a95004';
+ const expectedSignature =
+ '0x1b117902c86dfb95fe0d1badd983ee166ad259b27acb220174cbb4460d872871137feabdfe76e05924b484789f79af4ee7fa29ec006cedce1bbf369320d034e10b03';
+
+ const fakeProvider = {
+ async sendAsync(payload: JSONRPCRequestPayload, callback: JSONRPCErrorCallback): Promise<void> {
+ if (payload.method === 'eth_sign') {
+ const [address, message] = payload.params;
+ expect(message).to.equal(orderHash);
+ const signature = await web3Wrapper.signMessageAsync(address, message);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ const rsvHex = `0x${signature.substr(130)}${signature.substr(2, 128)}`;
+ callback(null, {
+ id: 42,
+ jsonrpc: '2.0',
+ result: rsvHex,
+ });
+ } else {
+ callback(null, { id: 42, jsonrpc: '2.0', result: [makerAddress] });
+ }
+ },
+ };
+ const ecSignature = await ecSignOrderHashAsync(fakeProvider, orderHash, makerAddress, SignerType.Default);
+ expect(ecSignature).to.equal(expectedSignature);
+ });
+ it('should return the correct Signature for signatureHex concatenated as V + R + S', async () => {
+ const orderHash = '0x34decbedc118904df65f379a175bb39ca18209d6ce41d5ed549d54e6e0a95004';
+ const expectedSignature =
+ '0x1b117902c86dfb95fe0d1badd983ee166ad259b27acb220174cbb4460d872871137feabdfe76e05924b484789f79af4ee7fa29ec006cedce1bbf369320d034e10b03';
+ const fakeProvider = {
+ async sendAsync(payload: JSONRPCRequestPayload, callback: JSONRPCErrorCallback): Promise<void> {
+ if (payload.method === 'eth_sign') {
+ const [address, message] = payload.params;
+ const signature = await web3Wrapper.signMessageAsync(address, message);
+ callback(null, {
+ id: 42,
+ jsonrpc: '2.0',
+ result: signature,
+ });
+ } else {
+ callback(null, { id: 42, jsonrpc: '2.0', result: [makerAddress] });
+ }
+ },
+ };
+
+ const ecSignature = await ecSignOrderHashAsync(fakeProvider, orderHash, makerAddress, SignerType.Default);
+ expect(ecSignature).to.equal(expectedSignature);
+ });
+ // Note this is due to a bug in Metamask where it does not prefix before signing, this is a known issue and is to be fixed in the future
+ // Source: https://github.com/MetaMask/metamask-extension/commit/a9d36860bec424dcee8db043d3e7da6a5ff5672e
+ it('should receive a payload modified with a prefix when Metamask is SignerType', async () => {
+ const orderHash = '0x34decbedc118904df65f379a175bb39ca18209d6ce41d5ed549d54e6e0a95004';
+ const orderHashPrefixed = '0xae70f31d26096291aa681b26cb7574563956221d0b4213631e1ef9df675d4cba';
+ const expectedSignature =
+ '0x1b117902c86dfb95fe0d1badd983ee166ad259b27acb220174cbb4460d872871137feabdfe76e05924b484789f79af4ee7fa29ec006cedce1bbf369320d034e10b03';
+ // Generated from a MM eth_sign request from 0x5409ed021d9299bf6814279a6a1411a7e866a631 signing 0xae70f31d26096291aa681b26cb7574563956221d0b4213631e1ef9df675d4cba
+ const metamaskSignature =
+ '0x117902c86dfb95fe0d1badd983ee166ad259b27acb220174cbb4460d872871137feabdfe76e05924b484789f79af4ee7fa29ec006cedce1bbf369320d034e10b1b';
+ const fakeProvider = {
+ async sendAsync(payload: JSONRPCRequestPayload, callback: JSONRPCErrorCallback): Promise<void> {
+ if (payload.method === 'eth_sign') {
+ const [, message] = payload.params;
+ expect(message).to.equal(orderHashPrefixed);
+ callback(null, {
+ id: 42,
+ jsonrpc: '2.0',
+ result: metamaskSignature,
+ });
+ } else {
+ callback(null, { id: 42, jsonrpc: '2.0', result: [makerAddress] });
+ }
+ },
+ };
+
+ const ecSignature = await ecSignOrderHashAsync(fakeProvider, orderHash, makerAddress, SignerType.Metamask);
+ expect(ecSignature).to.equal(expectedSignature);
+ });
+ it('should return a valid signature', async () => {
+ const orderHash = '0x34decbedc118904df65f379a175bb39ca18209d6ce41d5ed549d54e6e0a95004';
+ const ecSignature = await ecSignOrderHashAsync(provider, orderHash, makerAddress, SignerType.Default);
+
+ const isValidSignature = await isValidSignatureAsync(provider, orderHash, ecSignature, makerAddress);
+ expect(isValidSignature).to.be.true();
+ });
+ });
+ describe('#convertECSignatureToSignatureHex', () => {
+ const ecSignature: ECSignature = {
+ v: 27,
+ r: '0xaca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d64393',
+ s: '0x46b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf2',
+ };
+ it('should concatenate v,r,s and append the Trezor signature type', async () => {
+ const expectedSignatureWithSignatureType =
+ '0x1baca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d6439346b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf208';
+ const signatureWithSignatureType = convertECSignatureToSignatureHex(ecSignature, SignerType.Trezor);
+ expect(signatureWithSignatureType).to.equal(expectedSignatureWithSignatureType);
+ });
+ it('should concatenate v,r,s and append the EthSign signature type when SignerType is Default', async () => {
+ const expectedSignatureWithSignatureType =
+ '0x1baca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d6439346b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf203';
+ const signatureWithSignatureType = convertECSignatureToSignatureHex(ecSignature, SignerType.Default);
+ expect(signatureWithSignatureType).to.equal(expectedSignatureWithSignatureType);
+ });
+ it('should concatenate v,r,s and append the EthSign signature type when SignerType is Ledger', async () => {
+ const expectedSignatureWithSignatureType =
+ '0x1baca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d6439346b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf203';
+ const signatureWithSignatureType = convertECSignatureToSignatureHex(ecSignature, SignerType.Ledger);
+ expect(signatureWithSignatureType).to.equal(expectedSignatureWithSignatureType);
+ });
+ it('should concatenate v,r,s and append the EthSign signature type when SignerType is Metamask', async () => {
+ const expectedSignatureWithSignatureType =
+ '0x1baca7da997ad177f040240cdccf6905b71ab16b74434388c3a72f34fd25d6439346b2bac274ff29b48b3ea6e2d04c1336eaceafda3c53ab483fc3ff12fac3ebf203';
+ const signatureWithSignatureType = convertECSignatureToSignatureHex(ecSignature, SignerType.Metamask);
+ expect(signatureWithSignatureType).to.equal(expectedSignatureWithSignatureType);
+ });
+ it('should throw if the SignerType is invalid', async () => {
+ const expectedMessage = 'Unrecognized SignerType: INVALID_SIGNER';
+ expect(() => convertECSignatureToSignatureHex(ecSignature, 'INVALID_SIGNER' as SignerType)).to.throw(
+ expectedMessage,
+ );
+ });
+ });
+});
diff --git a/packages/order-utils/test/utils/chai_setup.ts b/packages/order-utils/test/utils/chai_setup.ts
new file mode 100644
index 000000000..1a8733093
--- /dev/null
+++ b/packages/order-utils/test/utils/chai_setup.ts
@@ -0,0 +1,13 @@
+import * as chai from 'chai';
+import chaiAsPromised = require('chai-as-promised');
+import ChaiBigNumber = require('chai-bignumber');
+import * as dirtyChai from 'dirty-chai';
+
+export const chaiSetup = {
+ configure(): void {
+ chai.config.includeStack = true;
+ chai.use(ChaiBigNumber());
+ chai.use(dirtyChai);
+ chai.use(chaiAsPromised);
+ },
+};
diff --git a/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts b/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts
new file mode 100644
index 000000000..279a5c0db
--- /dev/null
+++ b/packages/order-utils/test/utils/simple_erc20_balance_and_proxy_allowance_fetcher.ts
@@ -0,0 +1,26 @@
+import { BigNumber } from '@0xproject/utils';
+
+import { AbstractBalanceAndProxyAllowanceFetcher } from '../../src/abstract/abstract_balance_and_proxy_allowance_fetcher';
+
+import { ERC20TokenContract } from '../../src/generated_contract_wrappers/erc20_token';
+
+export class SimpleERC20BalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
+ private readonly _erc20TokenContract: ERC20TokenContract;
+ private readonly _erc20ProxyAddress: string;
+ constructor(erc20TokenWrapper: ERC20TokenContract, erc20ProxyAddress: string) {
+ this._erc20TokenContract = erc20TokenWrapper;
+ this._erc20ProxyAddress = erc20ProxyAddress;
+ }
+ public async getBalanceAsync(_assetData: string, userAddress: string): Promise<BigNumber> {
+ // HACK: We cheat and don't pass in the assetData since it's always the same token used
+ // in our tests.
+ const balance = await this._erc20TokenContract.balanceOf.callAsync(userAddress);
+ return balance;
+ }
+ public async getProxyAllowanceAsync(_assetData: string, userAddress: string): Promise<BigNumber> {
+ // HACK: We cheat and don't pass in the assetData since it's always the same token used
+ // in our tests.
+ const proxyAllowance = await this._erc20TokenContract.allowance.callAsync(userAddress, this._erc20ProxyAddress);
+ return proxyAllowance;
+ }
+}
diff --git a/packages/order-utils/test/utils/test_order_factory.ts b/packages/order-utils/test/utils/test_order_factory.ts
new file mode 100644
index 000000000..75dc6f1f2
--- /dev/null
+++ b/packages/order-utils/test/utils/test_order_factory.ts
@@ -0,0 +1,32 @@
+import { Order, SignedOrder } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { constants, orderFactory } from '../../src';
+
+const BASE_TEST_ORDER: Order = orderFactory.createOrder(
+ constants.NULL_ADDRESS,
+ constants.ZERO_AMOUNT,
+ constants.NULL_ADDRESS,
+ constants.ZERO_AMOUNT,
+ constants.NULL_ADDRESS,
+ constants.NULL_ADDRESS,
+);
+const BASE_TEST_SIGNED_ORDER: SignedOrder = {
+ ...BASE_TEST_ORDER,
+ signature: constants.NULL_BYTES,
+};
+
+export const testOrderFactory = {
+ generateTestSignedOrder(partialOrder: Partial<SignedOrder>): SignedOrder {
+ return transformObject(BASE_TEST_SIGNED_ORDER, partialOrder);
+ },
+ generateTestSignedOrders(partialOrder: Partial<SignedOrder>, numOrders: number): SignedOrder[] {
+ const baseTestOrders = _.map(_.range(numOrders), () => BASE_TEST_SIGNED_ORDER);
+ return _.map(baseTestOrders, order => transformObject(order, partialOrder));
+ },
+};
+
+function transformObject<T>(input: T, transformation: Partial<T>): T {
+ const copy = _.cloneDeep(input);
+ return _.assign(copy, transformation);
+}
diff --git a/packages/order-utils/test/utils/web3_wrapper.ts b/packages/order-utils/test/utils/web3_wrapper.ts
new file mode 100644
index 000000000..ab801fa7f
--- /dev/null
+++ b/packages/order-utils/test/utils/web3_wrapper.ts
@@ -0,0 +1,8 @@
+import { web3Factory } from '@0xproject/dev-utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+
+const provider: Provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+const web3Wrapper = new Web3Wrapper(provider);
+
+export { provider, web3Wrapper };
diff --git a/packages/order-utils/tsconfig.json b/packages/order-utils/tsconfig.json
new file mode 100644
index 000000000..8b4cd47a2
--- /dev/null
+++ b/packages/order-utils/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["src/**/*", "test/**/*"]
+}
diff --git a/packages/order-utils/tslint.json b/packages/order-utils/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/order-utils/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/order-watcher/.npmignore b/packages/order-watcher/.npmignore
new file mode 100644
index 000000000..c5be1b302
--- /dev/null
+++ b/packages/order-watcher/.npmignore
@@ -0,0 +1,10 @@
+.*
+tsconfig.json
+webpack.config.js
+yarn-error.log
+test/
+/src/
+/_bundles/
+/generated_docs/
+/scripts/
+/lib/src/monorepo_scripts/
diff --git a/packages/order-watcher/CHANGELOG.json b/packages/order-watcher/CHANGELOG.json
new file mode 100644
index 000000000..6a365f314
--- /dev/null
+++ b/packages/order-watcher/CHANGELOG.json
@@ -0,0 +1,134 @@
+[
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Fixed bug caused by importing non-existent dep"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Add support for ERC721 event watching and Exchange V2 events",
+ "pr": 887
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Switch out simple getLogs polling with ethereumjs-blockstream",
+ "pr": 825
+ },
+ {
+ "note": "Do not stop subscription if error is encountered",
+ "pr": 825
+ },
+ {
+ "note": "Fixed a bug that caused the incorrect block to be fetched via JSON-RPC within Blockstream",
+ "pr": 875
+ },
+ {
+ "note": "Remove stateLayer config from OrderWatcher. It now always operates on the latest block",
+ "pr": 875
+ }
+ ],
+ "timestamp": 1531149657
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617805,
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617227,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527008794,
+ "version": "0.0.1",
+ "changes": [
+ {
+ "note": "Moved OrderWatcher out of 0x.js package",
+ "pr": 579
+ }
+ ]
+ }
+]
diff --git a/packages/order-watcher/CHANGELOG.md b/packages/order-watcher/CHANGELOG.md
new file mode 100644
index 000000000..bb92f2850
--- /dev/null
+++ b/packages/order-watcher/CHANGELOG.md
@@ -0,0 +1,61 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.1-rc.3 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Fixed bug caused by importing non-existent dep
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Add support for ERC721 event watching and Exchange V2 events (#887)
+
+## v0.0.8 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _July 9, 2018_
+
+ * Switch out simple getLogs polling with ethereumjs-blockstream (#825)
+ * Do not stop subscription if error is encountered (#825)
+ * Fixed a bug that caused the incorrect block to be fetched via JSON-RPC within Blockstream (#875)
+ * Remove stateLayer config from OrderWatcher. It now always operates on the latest block (#875)
+
+## v0.0.6 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.5 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.0.4 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.0.3 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.0.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.1 - _May 22, 2018_
+
+ * Moved OrderWatcher out of 0x.js package (#579)
diff --git a/packages/order-watcher/README.md b/packages/order-watcher/README.md
new file mode 100644
index 000000000..de64a70e7
--- /dev/null
+++ b/packages/order-watcher/README.md
@@ -0,0 +1,79 @@
+## OrderWatcher
+
+An order watcher daemon that watches for order validity.
+
+#### Read the wiki [article](https://0xproject.com/wiki#0x-OrderWatcher).
+
+## Installation
+
+**Install**
+
+```bash
+npm install @0xproject/order-watcher --save
+```
+
+**Import**
+
+```javascript
+import { OrderWatcher } from '@0xproject/order-watcher';
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+## Contributing
+
+We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/order-watcher yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/order-watcher yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/order-watcher/coverage/.gitkeep b/packages/order-watcher/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/order-watcher/coverage/.gitkeep
diff --git a/packages/order-watcher/package.json b/packages/order-watcher/package.json
new file mode 100644
index 000000000..ba4fed358
--- /dev/null
+++ b/packages/order-watcher/package.json
@@ -0,0 +1,92 @@
+{
+ "name": "@0xproject/order-watcher",
+ "version": "1.0.1-rc.3",
+ "description": "An order watcher daemon that watches for order validity",
+ "keywords": [
+ "0x",
+ "0xproject",
+ "ethereum",
+ "exchange",
+ "orderbook"
+ ],
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "pre_build": "run-s update_artifacts copy_artifacts generate_contract_wrappers",
+ "lint": "tslint --project . --exclude **/src/generated_contract_wrappers/**/*",
+ "generate_contract_wrappers": "abi-gen --abis 'src/artifacts/@(Exchange|Token|TokenTransferProxy|EtherToken).json' --template ../contract_templates/contract.handlebars --partials '../contract_templates/partials/**/*.handlebars' --output src/generated_contract_wrappers --backend ethers",
+ "test:circleci": "run-s test:coverage",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "copy_artifacts": "copyfiles -u 2 './src/artifacts/**/*.json' ./lib/src/artifacts",
+ "update_artifacts": "for i in ${npm_package_config_contracts_v2_beta}; do copyfiles -u 4 ../migrations/artifacts/2.0.0-beta-testnet/$i.json src/artifacts; done;",
+ "clean": "shx rm -rf _bundles lib test_temp scripts test/artifacts src/generated_contract_wrappers",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js lib/test/global_hooks.js --timeout 10000 --bail --exit",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js"
+ },
+ "config": {
+ "contracts_v2_beta": "Exchange WETH9 ERC20Token ERC721Token"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo"
+ },
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "devDependencies": {
+ "@0xproject/abi-gen": "^1.0.5",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/migrations": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/bintrees": "^1.0.2",
+ "@types/lodash": "4.14.104",
+ "@types/mocha": "^2.2.42",
+ "@types/node": "^8.0.53",
+ "@types/sinon": "^2.2.2",
+ "awesome-typescript-loader": "^3.1.3",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "chai-bignumber": "^2.0.1",
+ "copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "json-loader": "^0.5.4",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
+ "npm-run-all": "^4.1.2",
+ "nyc": "^11.0.1",
+ "opn-cli": "^3.1.0",
+ "shx": "^0.2.2",
+ "sinon": "^4.0.0",
+ "source-map-support": "^0.5.0",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
+ },
+ "dependencies": {
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/base-contract": "^2.0.0-rc.1",
+ "@0xproject/contract-wrappers": "^1.0.1-rc.3",
+ "@0xproject/fill-scenarios": "^1.0.1-rc.3",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/order-utils": "^1.0.1-rc.3",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "bintrees": "^1.0.2",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-blockstream": "5.0.0",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/order-watcher/src/artifacts.ts b/packages/order-watcher/src/artifacts.ts
new file mode 100644
index 000000000..d47e619c2
--- /dev/null
+++ b/packages/order-watcher/src/artifacts.ts
@@ -0,0 +1,13 @@
+import { ContractArtifact } from '@0xproject/sol-compiler';
+
+import * as ERC20Token from './artifacts/ERC20Token.json';
+import * as ERC721Token from './artifacts/ERC721Token.json';
+import * as Exchange from './artifacts/Exchange.json';
+import * as WETH9 from './artifacts/WETH9.json';
+
+export const artifacts = {
+ ERC20Token: (ERC20Token as any) as ContractArtifact,
+ ERC721Token: (ERC721Token as any) as ContractArtifact,
+ Exchange: (Exchange as any) as ContractArtifact,
+ EtherToken: (WETH9 as any) as ContractArtifact,
+};
diff --git a/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts b/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts
new file mode 100644
index 000000000..a1de22a5e
--- /dev/null
+++ b/packages/order-watcher/src/fetchers/asset_balance_and_proxy_allowance_fetcher.ts
@@ -0,0 +1,74 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { BlockParamLiteral, ERC20TokenWrapper, ERC721TokenWrapper } from '@0xproject/contract-wrappers';
+import { AbstractBalanceAndProxyAllowanceFetcher, assetDataUtils } from '@0xproject/order-utils';
+import { AssetProxyId, ERC20AssetData, ERC721AssetData } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+
+export class AssetBalanceAndProxyAllowanceFetcher implements AbstractBalanceAndProxyAllowanceFetcher {
+ private readonly _erc20Token: ERC20TokenWrapper;
+ private readonly _erc721Token: ERC721TokenWrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ constructor(erc20Token: ERC20TokenWrapper, erc721Token: ERC721TokenWrapper, stateLayer: BlockParamLiteral) {
+ this._erc20Token = erc20Token;
+ this._erc721Token = erc721Token;
+ this._stateLayer = stateLayer;
+ }
+ public async getBalanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const decodedERC20AssetData = decodedAssetData as ERC20AssetData;
+ const balance = await this._erc20Token.getBalanceAsync(decodedERC20AssetData.tokenAddress, userAddress, {
+ defaultBlock: this._stateLayer,
+ });
+ return balance;
+ } else {
+ const decodedERC721AssetData = decodedAssetData as ERC721AssetData;
+ const tokenOwner = await this._erc721Token.getOwnerOfAsync(
+ decodedERC721AssetData.tokenAddress,
+ decodedERC721AssetData.tokenId,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ const balance = tokenOwner === userAddress ? new BigNumber(1) : new BigNumber(0);
+ return balance;
+ }
+ }
+ public async getProxyAllowanceAsync(assetData: string, userAddress: string): Promise<BigNumber> {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ const decodedERC20AssetData = decodedAssetData as ERC20AssetData;
+ const proxyAllowance = await this._erc20Token.getProxyAllowanceAsync(
+ decodedERC20AssetData.tokenAddress,
+ userAddress,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ return proxyAllowance;
+ } else {
+ const decodedERC721AssetData = decodedAssetData as ERC721AssetData;
+
+ const isApprovedForAll = await this._erc721Token.isProxyApprovedForAllAsync(
+ decodedERC721AssetData.tokenAddress,
+ userAddress,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ if (isApprovedForAll) {
+ return new BigNumber(this._erc20Token.UNLIMITED_ALLOWANCE_IN_BASE_UNITS);
+ } else {
+ const isApproved = await this._erc721Token.isProxyApprovedAsync(
+ decodedERC721AssetData.tokenAddress,
+ decodedERC721AssetData.tokenId,
+ {
+ defaultBlock: this._stateLayer,
+ },
+ );
+ const proxyAllowance = isApproved ? new BigNumber(1) : new BigNumber(0);
+ return proxyAllowance;
+ }
+ }
+ }
+}
diff --git a/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts b/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts
new file mode 100644
index 000000000..bfad1a48c
--- /dev/null
+++ b/packages/order-watcher/src/fetchers/order_filled_cancelled_fetcher.ts
@@ -0,0 +1,27 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { BlockParamLiteral, ExchangeWrapper } from '@0xproject/contract-wrappers';
+import { AbstractOrderFilledCancelledFetcher } from '@0xproject/order-utils';
+import { BigNumber } from '@0xproject/utils';
+
+export class OrderFilledCancelledFetcher implements AbstractOrderFilledCancelledFetcher {
+ private readonly _exchange: ExchangeWrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ constructor(exchange: ExchangeWrapper, stateLayer: BlockParamLiteral) {
+ this._exchange = exchange;
+ this._stateLayer = stateLayer;
+ }
+ public async getFilledTakerAmountAsync(orderHash: string): Promise<BigNumber> {
+ const filledTakerAmount = this._exchange.getFilledTakerAssetAmountAsync(orderHash, {
+ defaultBlock: this._stateLayer,
+ });
+ return filledTakerAmount;
+ }
+ public async isOrderCancelledAsync(orderHash: string): Promise<boolean> {
+ const isCancelled = await this._exchange.isCancelledAsync(orderHash);
+ return isCancelled;
+ }
+ public getZRXAssetData(): string {
+ const zrxAssetData = this._exchange.getZRXAssetData();
+ return zrxAssetData;
+ }
+}
diff --git a/packages/order-watcher/src/globals.d.ts b/packages/order-watcher/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/order-watcher/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/order-watcher/src/index.ts b/packages/order-watcher/src/index.ts
new file mode 100644
index 000000000..5f84554c8
--- /dev/null
+++ b/packages/order-watcher/src/index.ts
@@ -0,0 +1,8 @@
+export { OrderWatcher } from './order_watcher/order_watcher';
+
+export { OrderStateValid, OrderStateInvalid, OrderState } from '@0xproject/types';
+
+export { OnOrderStateChangeCallback, OrderWatcherConfig } from './types';
+
+export { Order, SignedOrder } from '@0xproject/types';
+export { BlockParamLiteral, BlockParam, Provider } from 'ethereum-types';
diff --git a/packages/order-watcher/src/monorepo_scripts/postpublish.ts b/packages/order-watcher/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/order-watcher/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts b/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts
new file mode 100644
index 000000000..e13663c7a
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/collision_resistant_abi_decoder.ts
@@ -0,0 +1,54 @@
+import { AbiDecoder } from '@0xproject/utils';
+import { ContractAbi, DecodedLogArgs, LogEntry, LogWithDecodedArgs, RawLog } from 'ethereum-types';
+
+const TOKEN_TYPE_COLLISION = `Token can't be marked as ERC20 and ERC721 at the same time`;
+
+/**
+ * ERC20 and ERC721 have some events with different args but colliding signature.
+ * For exmaple:
+ * Transfer(_from address, _to address, _value uint256)
+ * Transfer(_from address, _to address, _tokenId uint256)
+ * Both have the signature:
+ * Transfer(address,address,uint256)
+ *
+ * In order to correctly decode those events we need to know the token type by address in advance.
+ * You can pass it by calling `this.addERC20Token(address)` or `this.addERC721Token(address)`
+ */
+export class CollisionResistanceAbiDecoder {
+ private readonly _erc20AbiDecoder: AbiDecoder;
+ private readonly _erc721AbiDecoder: AbiDecoder;
+ private readonly _restAbiDecoder: AbiDecoder;
+ private readonly _knownERC20Tokens = new Set();
+ private readonly _knownERC721Tokens = new Set();
+ constructor(erc20Abi: ContractAbi, erc721Abi: ContractAbi, abis: ContractAbi[]) {
+ this._erc20AbiDecoder = new AbiDecoder([erc20Abi]);
+ this._erc721AbiDecoder = new AbiDecoder([erc721Abi]);
+ this._restAbiDecoder = new AbiDecoder(abis);
+ }
+ public tryToDecodeLogOrNoop<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
+ if (this._knownERC20Tokens.has(log.address)) {
+ const maybeDecodedERC20Log = this._erc20AbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedERC20Log;
+ } else if (this._knownERC721Tokens.has(log.address)) {
+ const maybeDecodedERC721Log = this._erc721AbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedERC721Log;
+ } else {
+ const maybeDecodedLog = this._restAbiDecoder.tryToDecodeLogOrNoop(log);
+ return maybeDecodedLog;
+ }
+ }
+ // Hints the ABI decoder that a particular token address is ERC20 and events from it should be decoded as ERC20 events
+ public addERC20Token(address: string): void {
+ if (this._knownERC721Tokens.has(address)) {
+ throw new Error(TOKEN_TYPE_COLLISION);
+ }
+ this._knownERC20Tokens.add(address);
+ }
+ // Hints the ABI decoder that a particular token address is ERC721 and events from it should be decoded as ERC721 events
+ public addERC721Token(address: string): void {
+ if (this._knownERC20Tokens.has(address)) {
+ throw new Error(TOKEN_TYPE_COLLISION);
+ }
+ this._knownERC721Tokens.add(address);
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts b/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts
new file mode 100644
index 000000000..cc70bd5d7
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/dependent_order_hashes_tracker.ts
@@ -0,0 +1,230 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { AssetProxyId, ERC20AssetData, ERC721AssetData, SignedOrder } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+export interface OrderHashesByMakerAddress {
+ [makerAddress: string]: Set<string>;
+}
+
+export interface OrderHashesByERC20ByMakerAddress {
+ [makerAddress: string]: {
+ [erc20TokenAddress: string]: Set<string>;
+ };
+}
+
+export interface OrderHashesByERC721AddressByTokenIdByMakerAddress {
+ [makerAddress: string]: {
+ [erc721TokenAddress: string]: {
+ // Ideally erc721TokenId should be a BigNumber, but it's not a valid index type so we just convert it to a string before using it as an index
+ [erc721TokenId: string]: Set<string>;
+ };
+ };
+}
+
+/**
+ */
+export class DependentOrderHashesTracker {
+ private readonly _zrxTokenAddress: string;
+ // `_orderHashesByMakerAddress` is redundant and could be generated from
+ // `_orderHashesByERC20ByMakerAddress` and `_orderHashesByERC721AddressByTokenIdByMakerAddress`
+ // on the fly by merging all the entries together but it's more complex and computationally heavy.
+ // We might change that in future if we're move memory-constrained.
+ private readonly _orderHashesByMakerAddress: OrderHashesByMakerAddress = {};
+ private readonly _orderHashesByERC20ByMakerAddress: OrderHashesByERC20ByMakerAddress = {};
+ private readonly _orderHashesByERC721AddressByTokenIdByMakerAddress: OrderHashesByERC721AddressByTokenIdByMakerAddress = {};
+ constructor(zrxTokenAddress: string) {
+ this._zrxTokenAddress = zrxTokenAddress;
+ }
+ public getDependentOrderHashesByERC721ByMaker(makerAddress: string, tokenAddress: string): string[] {
+ const orderHashSets = _.values(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress],
+ );
+ const orderHashList = _.reduce(
+ orderHashSets,
+ (accumulator, orderHashSet) => [...accumulator, ...orderHashSet],
+ [] as string[],
+ );
+ const uniqueOrderHashList = _.uniq(orderHashList);
+ return uniqueOrderHashList;
+ }
+ public getDependentOrderHashesByMaker(makerAddress: string): string[] {
+ const dependentOrderHashes = Array.from(this._orderHashesByMakerAddress[makerAddress]);
+ return dependentOrderHashes;
+ }
+ public getDependentOrderHashesByAssetDataByMaker(makerAddress: string, assetData: string): string[] {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ const dependentOrderHashes =
+ decodedAssetData.assetProxyId === AssetProxyId.ERC20
+ ? this._getDependentOrderHashesByERC20AssetData(makerAddress, assetData)
+ : this._getDependentOrderHashesByERC721AssetData(makerAddress, assetData);
+ return dependentOrderHashes;
+ }
+ public addToDependentOrderHashes(signedOrder: SignedOrder): void {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(signedOrder.makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._addToERC20DependentOrderHashes(signedOrder, (decodedMakerAssetData as ERC20AssetData).tokenAddress);
+ } else {
+ this._addToERC721DependentOrderHashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC721AssetData).tokenAddress,
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ this._addToERC20DependentOrderHashes(signedOrder, this._zrxTokenAddress);
+ this._addToMakerDependentOrderHashes(signedOrder);
+ }
+ public removeFromDependentOrderHashes(signedOrder: SignedOrder): void {
+ const decodedMakerAssetData = assetDataUtils.decodeAssetDataOrThrow(signedOrder.makerAssetData);
+ if (decodedMakerAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._removeFromERC20DependentOrderhashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC20AssetData).tokenAddress,
+ );
+ } else {
+ this._removeFromERC721DependentOrderhashes(
+ signedOrder,
+ (decodedMakerAssetData as ERC721AssetData).tokenAddress,
+ (decodedMakerAssetData as ERC721AssetData).tokenId,
+ );
+ }
+ this._removeFromERC20DependentOrderhashes(signedOrder, this._zrxTokenAddress);
+ this._removeFromMakerDependentOrderhashes(signedOrder);
+ }
+ private _getDependentOrderHashesByERC20AssetData(makerAddress: string, erc20AssetData: string): string[] {
+ const tokenAddress = assetDataUtils.decodeERC20AssetData(erc20AssetData).tokenAddress;
+ let dependentOrderHashes: string[] = [];
+ if (
+ !_.isUndefined(this._orderHashesByERC20ByMakerAddress[makerAddress]) &&
+ !_.isUndefined(this._orderHashesByERC20ByMakerAddress[makerAddress][tokenAddress])
+ ) {
+ dependentOrderHashes = Array.from(this._orderHashesByERC20ByMakerAddress[makerAddress][tokenAddress]);
+ }
+ return dependentOrderHashes;
+ }
+ private _getDependentOrderHashesByERC721AssetData(makerAddress: string, erc721AssetData: string): string[] {
+ const tokenAddress = assetDataUtils.decodeERC721AssetData(erc721AssetData).tokenAddress;
+ const tokenId = assetDataUtils.decodeERC721AssetData(erc721AssetData).tokenId;
+ let dependentOrderHashes: string[] = [];
+ if (
+ !_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress]) &&
+ !_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress]) &&
+ !_.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress][tokenId.toString()],
+ )
+ ) {
+ dependentOrderHashes = Array.from(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[makerAddress][tokenAddress][tokenId.toString()],
+ );
+ }
+ return dependentOrderHashes;
+ }
+ private _addToERC20DependentOrderHashes(signedOrder: SignedOrder, erc20TokenAddress: string): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress] = {};
+ }
+ if (_.isUndefined(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress])) {
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress] = new Set();
+ }
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress].add(orderHash);
+ }
+ private _addToERC721DependentOrderHashes(
+ signedOrder: SignedOrder,
+ erc721TokenAddress: string,
+ tokenId: BigNumber,
+ ): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress] = {};
+ }
+
+ if (
+ _.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress],
+ )
+ ) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress] = {};
+ }
+
+ if (
+ _.isUndefined(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ],
+ )
+ ) {
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ] = new Set();
+ }
+
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ].add(orderHash);
+ }
+ private _addToMakerDependentOrderHashes(signedOrder: SignedOrder): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ if (_.isUndefined(this._orderHashesByMakerAddress[signedOrder.makerAddress])) {
+ this._orderHashesByMakerAddress[signedOrder.makerAddress] = new Set();
+ }
+ this._orderHashesByMakerAddress[signedOrder.makerAddress].add(orderHash);
+ }
+ private _removeFromERC20DependentOrderhashes(signedOrder: SignedOrder, erc20TokenAddress: string): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress].delete(orderHash);
+
+ if (_.isEmpty(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress])) {
+ delete this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][erc20TokenAddress];
+ }
+
+ if (_.isEmpty(this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByERC20ByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+ private _removeFromERC721DependentOrderhashes(
+ signedOrder: SignedOrder,
+ erc721TokenAddress: string,
+ tokenId: BigNumber,
+ ): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ].delete(orderHash);
+
+ if (
+ _.isEmpty(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress][
+ tokenId.toString()
+ ],
+ )
+ ) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][
+ erc721TokenAddress
+ ][tokenId.toString()];
+ }
+
+ if (
+ _.isEmpty(
+ this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][erc721TokenAddress],
+ )
+ ) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress][
+ erc721TokenAddress
+ ];
+ }
+
+ if (_.isEmpty(this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByERC721AddressByTokenIdByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+ private _removeFromMakerDependentOrderhashes(signedOrder: SignedOrder): void {
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ this._orderHashesByMakerAddress[signedOrder.makerAddress].delete(orderHash);
+
+ if (_.isEmpty(this._orderHashesByMakerAddress[signedOrder.makerAddress])) {
+ delete this._orderHashesByMakerAddress[signedOrder.makerAddress];
+ }
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/event_watcher.ts b/packages/order-watcher/src/order_watcher/event_watcher.ts
new file mode 100644
index 000000000..9509c75de
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/event_watcher.ts
@@ -0,0 +1,130 @@
+import { intervalUtils, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { BlockParamLiteral, LogEntry, Provider } from 'ethereum-types';
+import { Block, BlockAndLogStreamer, Log } from 'ethereumjs-blockstream';
+import * as _ from 'lodash';
+
+import { EventWatcherCallback, OrderWatcherError } from '../types';
+import { assert } from '../utils/assert';
+
+const DEFAULT_EVENT_POLLING_INTERVAL_MS = 200;
+
+enum LogEventState {
+ Removed,
+ Added,
+}
+
+/**
+ * The EventWatcher watches for blockchain events at the specified block confirmation
+ * depth.
+ */
+export class EventWatcher {
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _stateLayer: BlockParamLiteral;
+ private readonly _isVerbose: boolean;
+ private _blockAndLogStreamerIfExists: BlockAndLogStreamer<Block, Log> | undefined;
+ private _blockAndLogStreamIntervalIfExists?: NodeJS.Timer;
+ private _onLogAddedSubscriptionToken: string | undefined;
+ private _onLogRemovedSubscriptionToken: string | undefined;
+ private readonly _pollingIntervalMs: number;
+ constructor(
+ provider: Provider,
+ pollingIntervalIfExistsMs: undefined | number,
+ stateLayer: BlockParamLiteral,
+ isVerbose: boolean,
+ ) {
+ this._isVerbose = isVerbose;
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._stateLayer = stateLayer;
+ this._pollingIntervalMs = _.isUndefined(pollingIntervalIfExistsMs)
+ ? DEFAULT_EVENT_POLLING_INTERVAL_MS
+ : pollingIntervalIfExistsMs;
+ this._blockAndLogStreamerIfExists = undefined;
+ this._blockAndLogStreamIntervalIfExists = undefined;
+ this._onLogAddedSubscriptionToken = undefined;
+ this._onLogRemovedSubscriptionToken = undefined;
+ }
+ public subscribe(callback: EventWatcherCallback): void {
+ assert.isFunction('callback', callback);
+ if (!_.isUndefined(this._blockAndLogStreamIntervalIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionAlreadyPresent);
+ }
+ this._startBlockAndLogStream(callback);
+ }
+ public unsubscribe(): void {
+ if (_.isUndefined(this._blockAndLogStreamIntervalIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionNotFound);
+ }
+ this._stopBlockAndLogStream();
+ }
+ private _startBlockAndLogStream(callback: EventWatcherCallback): void {
+ if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionAlreadyPresent);
+ }
+ this._blockAndLogStreamerIfExists = new BlockAndLogStreamer(
+ this._web3Wrapper.getBlockAsync.bind(this._web3Wrapper),
+ this._web3Wrapper.getLogsAsync.bind(this._web3Wrapper),
+ this._onBlockAndLogStreamerError.bind(this),
+ );
+ const catchAllLogFilter = {};
+ this._blockAndLogStreamerIfExists.addLogFilter(catchAllLogFilter);
+ this._blockAndLogStreamIntervalIfExists = intervalUtils.setAsyncExcludingInterval(
+ this._reconcileBlockAsync.bind(this),
+ this._pollingIntervalMs,
+ this._onBlockAndLogStreamerError.bind(this),
+ );
+ let isRemoved = false;
+ this._onLogAddedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogAdded(
+ this._onLogStateChangedAsync.bind(this, callback, isRemoved),
+ );
+ isRemoved = true;
+ this._onLogRemovedSubscriptionToken = this._blockAndLogStreamerIfExists.subscribeToOnLogRemoved(
+ this._onLogStateChangedAsync.bind(this, callback, isRemoved),
+ );
+ }
+ private _stopBlockAndLogStream(): void {
+ if (_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionNotFound);
+ }
+ this._blockAndLogStreamerIfExists.unsubscribeFromOnLogAdded(this._onLogAddedSubscriptionToken as string);
+ this._blockAndLogStreamerIfExists.unsubscribeFromOnLogRemoved(this._onLogRemovedSubscriptionToken as string);
+ intervalUtils.clearAsyncExcludingInterval(this._blockAndLogStreamIntervalIfExists as NodeJS.Timer);
+ delete this._blockAndLogStreamerIfExists;
+ delete this._blockAndLogStreamIntervalIfExists;
+ }
+ private async _onLogStateChangedAsync(
+ callback: EventWatcherCallback,
+ isRemoved: boolean,
+ log: LogEntry,
+ ): Promise<void> {
+ await this._emitDifferencesAsync(log, isRemoved ? LogEventState.Removed : LogEventState.Added, callback);
+ }
+ private async _reconcileBlockAsync(): Promise<void> {
+ const latestBlock = await this._web3Wrapper.getBlockAsync(this._stateLayer);
+ // We need to coerce to Block type cause Web3.Block includes types for mempool blocks
+ if (!_.isUndefined(this._blockAndLogStreamerIfExists)) {
+ // If we clear the interval while fetching the block - this._blockAndLogStreamer will be undefined
+ await this._blockAndLogStreamerIfExists.reconcileNewBlock((latestBlock as any) as Block);
+ }
+ }
+ private async _emitDifferencesAsync(
+ log: LogEntry,
+ logEventState: LogEventState,
+ callback: EventWatcherCallback,
+ ): Promise<void> {
+ const logEvent = {
+ removed: logEventState === LogEventState.Removed,
+ ...log,
+ };
+ if (!_.isUndefined(this._blockAndLogStreamIntervalIfExists)) {
+ callback(null, logEvent);
+ }
+ }
+ private _onBlockAndLogStreamerError(err: Error): void {
+ // Since Blockstream errors are all recoverable, we simply log them if the verbose
+ // config is passed in.
+ if (this._isVerbose) {
+ logUtils.warn(err);
+ }
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/expiration_watcher.ts b/packages/order-watcher/src/order_watcher/expiration_watcher.ts
new file mode 100644
index 000000000..6eadf14c7
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/expiration_watcher.ts
@@ -0,0 +1,89 @@
+import { BigNumber, intervalUtils } from '@0xproject/utils';
+import { RBTree } from 'bintrees';
+import * as _ from 'lodash';
+
+import { OrderWatcherError } from '../types';
+import { utils } from '../utils/utils';
+
+const DEFAULT_EXPIRATION_MARGIN_MS = 0;
+const DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS = 50;
+
+/**
+ * This class includes the functionality to detect expired orders.
+ * It stores them in a min heap by expiration time and checks for expired ones every `orderExpirationCheckingIntervalMs`
+ */
+export class ExpirationWatcher {
+ private readonly _orderHashByExpirationRBTree: RBTree<string>;
+ private readonly _expiration: { [orderHash: string]: BigNumber } = {};
+ private readonly _orderExpirationCheckingIntervalMs: number;
+ private readonly _expirationMarginMs: number;
+ private _orderExpirationCheckingIntervalIdIfExists?: NodeJS.Timer;
+ constructor(expirationMarginIfExistsMs?: number, orderExpirationCheckingIntervalIfExistsMs?: number) {
+ this._orderExpirationCheckingIntervalMs =
+ orderExpirationCheckingIntervalIfExistsMs || DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS;
+ this._expirationMarginMs = expirationMarginIfExistsMs || DEFAULT_EXPIRATION_MARGIN_MS;
+ this._orderExpirationCheckingIntervalMs =
+ expirationMarginIfExistsMs || DEFAULT_ORDER_EXPIRATION_CHECKING_INTERVAL_MS;
+ const comparator = (lhsOrderHash: string, rhsOrderHash: string) => {
+ const lhsExpiration = this._expiration[lhsOrderHash].toNumber();
+ const rhsExpiration = this._expiration[rhsOrderHash].toNumber();
+ if (lhsExpiration !== rhsExpiration) {
+ return lhsExpiration - rhsExpiration;
+ } else {
+ // HACK: If two orders have identical expirations, the order in which they are emitted by the
+ // ExpirationWatcher does not matter, so we emit them in alphabetical order by orderHash.
+ return lhsOrderHash.localeCompare(rhsOrderHash);
+ }
+ };
+ this._orderHashByExpirationRBTree = new RBTree(comparator);
+ }
+ public subscribe(callback: (orderHash: string) => void): void {
+ if (!_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionAlreadyPresent);
+ }
+ this._orderExpirationCheckingIntervalIdIfExists = intervalUtils.setInterval(
+ this._pruneExpiredOrders.bind(this, callback),
+ this._orderExpirationCheckingIntervalMs,
+ _.noop.bind(_), // _pruneExpiredOrders never throws
+ );
+ }
+ public unsubscribe(): void {
+ if (_.isUndefined(this._orderExpirationCheckingIntervalIdIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionNotFound);
+ }
+ intervalUtils.clearInterval(this._orderExpirationCheckingIntervalIdIfExists);
+ delete this._orderExpirationCheckingIntervalIdIfExists;
+ }
+ public addOrder(orderHash: string, expirationUnixTimestampMs: BigNumber): void {
+ this._expiration[orderHash] = expirationUnixTimestampMs;
+ this._orderHashByExpirationRBTree.insert(orderHash);
+ }
+ public removeOrder(orderHash: string): void {
+ if (_.isUndefined(this._expiration[orderHash])) {
+ return; // noop since order already removed
+ }
+ this._orderHashByExpirationRBTree.remove(orderHash);
+ delete this._expiration[orderHash];
+ }
+ private _pruneExpiredOrders(callback: (orderHash: string) => void): void {
+ const currentUnixTimestampMs = utils.getCurrentUnixTimestampMs();
+ while (true) {
+ const hasNoTrackedOrders = this._orderHashByExpirationRBTree.size === 0;
+ if (hasNoTrackedOrders) {
+ break;
+ }
+ const nextOrderHashToExpire = this._orderHashByExpirationRBTree.min();
+ const hasNoExpiredOrders = this._expiration[nextOrderHashToExpire].greaterThan(
+ currentUnixTimestampMs.plus(this._expirationMarginMs),
+ );
+ const isSubscriptionActive = _.isUndefined(this._orderExpirationCheckingIntervalIdIfExists);
+ if (hasNoExpiredOrders || isSubscriptionActive) {
+ break;
+ }
+ const orderHash = this._orderHashByExpirationRBTree.min();
+ this._orderHashByExpirationRBTree.remove(orderHash);
+ delete this._expiration[orderHash];
+ callback(orderHash);
+ }
+ }
+}
diff --git a/packages/order-watcher/src/order_watcher/order_watcher.ts b/packages/order-watcher/src/order_watcher/order_watcher.ts
new file mode 100644
index 000000000..e2d6fc270
--- /dev/null
+++ b/packages/order-watcher/src/order_watcher/order_watcher.ts
@@ -0,0 +1,433 @@
+// tslint:disable:no-unnecessary-type-assertion
+import {
+ ContractWrappers,
+ ERC20TokenApprovalEventArgs,
+ ERC20TokenEventArgs,
+ ERC20TokenEvents,
+ ERC20TokenTransferEventArgs,
+ ERC721TokenApprovalEventArgs,
+ ERC721TokenApprovalForAllEventArgs,
+ ERC721TokenEventArgs,
+ ERC721TokenEvents,
+ ERC721TokenTransferEventArgs,
+ ExchangeCancelEventArgs,
+ ExchangeCancelUpToEventArgs,
+ ExchangeEventArgs,
+ ExchangeEvents,
+ ExchangeFillEventArgs,
+ WETH9DepositEventArgs,
+ WETH9EventArgs,
+ WETH9Events,
+ WETH9WithdrawalEventArgs,
+} from '@0xproject/contract-wrappers';
+import { schemas } from '@0xproject/json-schemas';
+import {
+ assetDataUtils,
+ BalanceAndProxyAllowanceLazyStore,
+ OrderFilledCancelledLazyStore,
+ orderHashUtils,
+ OrderStateUtils,
+} from '@0xproject/order-utils';
+import { AssetProxyId, ExchangeContractErrs, OrderState, SignedOrder } from '@0xproject/types';
+import { errorUtils, intervalUtils } from '@0xproject/utils';
+import { BlockParamLiteral, LogEntryEvent, LogWithDecodedArgs, Provider } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { artifacts } from '../artifacts';
+import { AssetBalanceAndProxyAllowanceFetcher } from '../fetchers/asset_balance_and_proxy_allowance_fetcher';
+import { OrderFilledCancelledFetcher } from '../fetchers/order_filled_cancelled_fetcher';
+import { orderWatcherPartialConfigSchema } from '../schemas/order_watcher_partial_config_schema';
+import { OnOrderStateChangeCallback, OrderWatcherConfig, OrderWatcherError } from '../types';
+import { assert } from '../utils/assert';
+
+import { CollisionResistanceAbiDecoder } from './collision_resistant_abi_decoder';
+import { DependentOrderHashesTracker } from './dependent_order_hashes_tracker';
+import { EventWatcher } from './event_watcher';
+import { ExpirationWatcher } from './expiration_watcher';
+
+const MILLISECONDS_IN_A_SECOND = 1000;
+
+type ContractEventArgs = WETH9EventArgs | ExchangeEventArgs | ERC20TokenEventArgs | ERC721TokenEventArgs;
+
+interface OrderByOrderHash {
+ [orderHash: string]: SignedOrder;
+}
+
+interface OrderStateByOrderHash {
+ [orderHash: string]: OrderState;
+}
+
+const DEFAULT_ORDER_WATCHER_CONFIG: OrderWatcherConfig = {
+ orderExpirationCheckingIntervalMs: 50,
+ eventPollingIntervalMs: 200,
+ expirationMarginMs: 0,
+ // tslint:disable-next-line:custom-no-magic-numbers
+ cleanupJobIntervalMs: 1000 * 60 * 60, // 1h
+ isVerbose: true,
+};
+const STATE_LAYER = BlockParamLiteral.Latest;
+
+/**
+ * This class includes all the functionality related to watching a set of orders
+ * for potential changes in order validity/fillability. The orderWatcher notifies
+ * the subscriber of these changes so that a final decision can be made on whether
+ * the order should be deemed invalid.
+ */
+export class OrderWatcher {
+ private readonly _dependentOrderHashesTracker: DependentOrderHashesTracker;
+ private readonly _orderStateByOrderHashCache: OrderStateByOrderHash = {};
+ private readonly _orderByOrderHash: OrderByOrderHash = {};
+ private readonly _eventWatcher: EventWatcher;
+ private readonly _provider: Provider;
+ private readonly _collisionResistantAbiDecoder: CollisionResistanceAbiDecoder;
+ private readonly _expirationWatcher: ExpirationWatcher;
+ private readonly _orderStateUtils: OrderStateUtils;
+ private readonly _orderFilledCancelledLazyStore: OrderFilledCancelledLazyStore;
+ private readonly _balanceAndProxyAllowanceLazyStore: BalanceAndProxyAllowanceLazyStore;
+ private readonly _cleanupJobInterval: number;
+ private _cleanupJobIntervalIdIfExists?: NodeJS.Timer;
+ private _callbackIfExists?: OnOrderStateChangeCallback;
+ constructor(
+ provider: Provider,
+ networkId: number,
+ partialConfig: Partial<OrderWatcherConfig> = DEFAULT_ORDER_WATCHER_CONFIG,
+ ) {
+ assert.isWeb3Provider('provider', provider);
+ assert.isNumber('networkId', networkId);
+ assert.doesConformToSchema('partialConfig', partialConfig, orderWatcherPartialConfigSchema);
+ const config = {
+ ...DEFAULT_ORDER_WATCHER_CONFIG,
+ ...partialConfig,
+ };
+
+ this._provider = provider;
+ this._collisionResistantAbiDecoder = new CollisionResistanceAbiDecoder(
+ artifacts.ERC20Token.compilerOutput.abi,
+ artifacts.ERC721Token.compilerOutput.abi,
+ [artifacts.EtherToken.compilerOutput.abi, artifacts.Exchange.compilerOutput.abi],
+ );
+ const contractWrappers = new ContractWrappers(provider, { networkId });
+ this._eventWatcher = new EventWatcher(provider, config.eventPollingIntervalMs, STATE_LAYER, config.isVerbose);
+ const balanceAndProxyAllowanceFetcher = new AssetBalanceAndProxyAllowanceFetcher(
+ contractWrappers.erc20Token,
+ contractWrappers.erc721Token,
+ STATE_LAYER,
+ );
+ this._balanceAndProxyAllowanceLazyStore = new BalanceAndProxyAllowanceLazyStore(
+ balanceAndProxyAllowanceFetcher,
+ );
+ const orderFilledCancelledFetcher = new OrderFilledCancelledFetcher(contractWrappers.exchange, STATE_LAYER);
+ this._orderFilledCancelledLazyStore = new OrderFilledCancelledLazyStore(orderFilledCancelledFetcher);
+ this._orderStateUtils = new OrderStateUtils(balanceAndProxyAllowanceFetcher, orderFilledCancelledFetcher);
+ const expirationMarginIfExistsMs = _.isUndefined(config) ? undefined : config.expirationMarginMs;
+ this._expirationWatcher = new ExpirationWatcher(
+ expirationMarginIfExistsMs,
+ config.orderExpirationCheckingIntervalMs,
+ );
+ this._cleanupJobInterval = config.cleanupJobIntervalMs;
+ const zrxTokenAddress = assetDataUtils.decodeERC20AssetData(orderFilledCancelledFetcher.getZRXAssetData())
+ .tokenAddress;
+ this._dependentOrderHashesTracker = new DependentOrderHashesTracker(zrxTokenAddress);
+ }
+ /**
+ * Add an order to the orderWatcher. Before the order is added, it's
+ * signature is verified.
+ * @param signedOrder The order you wish to start watching.
+ */
+ public async addOrderAsync(signedOrder: SignedOrder): Promise<void> {
+ assert.doesConformToSchema('signedOrder', signedOrder, schemas.signedOrderSchema);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await assert.isValidSignatureAsync(this._provider, orderHash, signedOrder.signature, signedOrder.makerAddress);
+
+ const expirationUnixTimestampMs = signedOrder.expirationTimeSeconds.times(MILLISECONDS_IN_A_SECOND);
+ this._expirationWatcher.addOrder(orderHash, expirationUnixTimestampMs);
+
+ this._orderByOrderHash[orderHash] = signedOrder;
+ this._dependentOrderHashesTracker.addToDependentOrderHashes(signedOrder);
+
+ const orderAssetDatas = [signedOrder.makerAssetData, signedOrder.takerAssetData];
+ _.each(orderAssetDatas, assetData => {
+ const decodedAssetData = assetDataUtils.decodeAssetDataOrThrow(assetData);
+ if (decodedAssetData.assetProxyId === AssetProxyId.ERC20) {
+ this._collisionResistantAbiDecoder.addERC20Token(decodedAssetData.tokenAddress);
+ } else if (decodedAssetData.assetProxyId === AssetProxyId.ERC721) {
+ this._collisionResistantAbiDecoder.addERC721Token(decodedAssetData.tokenAddress);
+ }
+ });
+ }
+ /**
+ * Removes an order from the orderWatcher
+ * @param orderHash The orderHash of the order you wish to stop watching.
+ */
+ public removeOrder(orderHash: string): void {
+ assert.doesConformToSchema('orderHash', orderHash, schemas.orderHashSchema);
+ const signedOrder = this._orderByOrderHash[orderHash];
+ if (_.isUndefined(signedOrder)) {
+ return; // noop
+ }
+ this._dependentOrderHashesTracker.removeFromDependentOrderHashes(signedOrder);
+ delete this._orderByOrderHash[orderHash];
+ this._expirationWatcher.removeOrder(orderHash);
+ delete this._orderStateByOrderHashCache[orderHash];
+ }
+ /**
+ * Starts an orderWatcher subscription. The callback will be called every time a watched order's
+ * backing blockchain state has changed. This is a call-to-action for the caller to re-validate the order.
+ * @param callback Receives the orderHash of the order that should be re-validated, together
+ * with all the order-relevant blockchain state needed to re-validate the order.
+ */
+ public subscribe(callback: OnOrderStateChangeCallback): void {
+ assert.isFunction('callback', callback);
+ if (!_.isUndefined(this._callbackIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionAlreadyPresent);
+ }
+ this._callbackIfExists = callback;
+ this._eventWatcher.subscribe(this._onEventWatcherCallbackAsync.bind(this));
+ this._expirationWatcher.subscribe(this._onOrderExpired.bind(this));
+ this._cleanupJobIntervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
+ this._cleanupAsync.bind(this),
+ this._cleanupJobInterval,
+ (err: Error) => {
+ this.unsubscribe();
+ callback(err);
+ },
+ );
+ }
+ /**
+ * Ends an orderWatcher subscription.
+ */
+ public unsubscribe(): void {
+ if (_.isUndefined(this._callbackIfExists) || _.isUndefined(this._cleanupJobIntervalIdIfExists)) {
+ throw new Error(OrderWatcherError.SubscriptionNotFound);
+ }
+ this._balanceAndProxyAllowanceLazyStore.deleteAll();
+ this._orderFilledCancelledLazyStore.deleteAll();
+ delete this._callbackIfExists;
+ this._eventWatcher.unsubscribe();
+ this._expirationWatcher.unsubscribe();
+ intervalUtils.clearAsyncExcludingInterval(this._cleanupJobIntervalIdIfExists);
+ }
+ private async _cleanupAsync(): Promise<void> {
+ for (const orderHash of _.keys(this._orderByOrderHash)) {
+ this._cleanupOrderRelatedState(orderHash);
+ await this._emitRevalidateOrdersAsync([orderHash]);
+ }
+ }
+ private _cleanupOrderRelatedState(orderHash: string): void {
+ const signedOrder = this._orderByOrderHash[orderHash];
+
+ this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(orderHash);
+ this._orderFilledCancelledLazyStore.deleteIsCancelled(orderHash);
+
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.makerAssetData, signedOrder.makerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(
+ signedOrder.makerAssetData,
+ signedOrder.makerAddress,
+ );
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(signedOrder.takerAssetData, signedOrder.takerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(
+ signedOrder.takerAssetData,
+ signedOrder.takerAddress,
+ );
+
+ const zrxAssetData = this._orderFilledCancelledLazyStore.getZRXAssetData();
+ if (!signedOrder.makerFee.isZero()) {
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxAssetData, signedOrder.makerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxAssetData, signedOrder.makerAddress);
+ }
+ if (!signedOrder.takerFee.isZero()) {
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(zrxAssetData, signedOrder.takerAddress);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(zrxAssetData, signedOrder.takerAddress);
+ }
+ }
+ private _onOrderExpired(orderHash: string): void {
+ const orderState: OrderState = {
+ isValid: false,
+ orderHash,
+ error: ExchangeContractErrs.OrderFillExpired,
+ };
+ if (!_.isUndefined(this._orderByOrderHash[orderHash])) {
+ this.removeOrder(orderHash);
+ if (!_.isUndefined(this._callbackIfExists)) {
+ this._callbackIfExists(null, orderState);
+ }
+ }
+ }
+ private async _onEventWatcherCallbackAsync(err: Error | null, logIfExists?: LogEntryEvent): Promise<void> {
+ if (!_.isNull(err)) {
+ if (!_.isUndefined(this._callbackIfExists)) {
+ this._callbackIfExists(err);
+ }
+ return;
+ }
+ const maybeDecodedLog = this._collisionResistantAbiDecoder.tryToDecodeLogOrNoop<ContractEventArgs>(
+ // At this moment we are sure that no error occured and log is defined.
+ logIfExists as LogEntryEvent,
+ );
+ const isLogDecoded = !_.isUndefined(((maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>).event);
+ if (!isLogDecoded) {
+ return; // noop
+ }
+ const decodedLog = (maybeDecodedLog as any) as LogWithDecodedArgs<ContractEventArgs>;
+ switch (decodedLog.event) {
+ case ERC20TokenEvents.Approval:
+ case ERC721TokenEvents.Approval: {
+ // ERC20 and ERC721 Transfer events have the same name so we need to distinguish them by args
+ if (!_.isUndefined(decodedLog.args._value)) {
+ // ERC20
+ // Invalidate cache
+ const args = decodedLog.args as ERC20TokenApprovalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ } else {
+ // ERC721
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenApprovalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC721AssetData(decodedLog.address, args._tokenId);
+ this._balanceAndProxyAllowanceLazyStore.deleteProxyAllowance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+ }
+ case ERC20TokenEvents.Transfer:
+ case ERC721TokenEvents.Transfer: {
+ // ERC20 and ERC721 Transfer events have the same name so we need to distinguish them by args
+ if (!_.isUndefined(decodedLog.args._value)) {
+ // ERC20
+ // Invalidate cache
+ const args = decodedLog.args as ERC20TokenTransferEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._from);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._to);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._from,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ } else {
+ // ERC721
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenTransferEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC721AssetData(decodedLog.address, args._tokenId);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._from);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._to);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._from,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+ }
+ case ERC721TokenEvents.ApprovalForAll: {
+ // Invalidate cache
+ const args = decodedLog.args as ERC721TokenApprovalForAllEventArgs;
+ const tokenAddress = decodedLog.address;
+ this._balanceAndProxyAllowanceLazyStore.deleteAllERC721ProxyAllowance(tokenAddress, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByERC721ByMaker(
+ args._owner,
+ tokenAddress,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+ case WETH9Events.Deposit: {
+ // Invalidate cache
+ const args = decodedLog.args as WETH9DepositEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+ case WETH9Events.Withdrawal: {
+ // Invalidate cache
+ const args = decodedLog.args as WETH9WithdrawalEventArgs;
+ const tokenAssetData = assetDataUtils.encodeERC20AssetData(decodedLog.address);
+ this._balanceAndProxyAllowanceLazyStore.deleteBalance(tokenAssetData, args._owner);
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByAssetDataByMaker(
+ args._owner,
+ tokenAssetData,
+ );
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+ case ExchangeEvents.Fill: {
+ // Invalidate cache
+ const args = decodedLog.args as ExchangeFillEventArgs;
+ this._orderFilledCancelledLazyStore.deleteFilledTakerAmount(args.orderHash);
+ // Revalidate orders
+ const orderHash = args.orderHash;
+ const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
+ if (isOrderWatched) {
+ await this._emitRevalidateOrdersAsync([orderHash]);
+ }
+ break;
+ }
+ case ExchangeEvents.Cancel: {
+ // Invalidate cache
+ const args = decodedLog.args as ExchangeCancelEventArgs;
+ this._orderFilledCancelledLazyStore.deleteIsCancelled(args.orderHash);
+ // Revalidate orders
+ const orderHash = args.orderHash;
+ const isOrderWatched = !_.isUndefined(this._orderByOrderHash[orderHash]);
+ if (isOrderWatched) {
+ await this._emitRevalidateOrdersAsync([orderHash]);
+ }
+ break;
+ }
+ case ExchangeEvents.CancelUpTo: {
+ // TODO(logvinov): Do it smarter and actually look at the salt and order epoch
+ // Invalidate cache
+ const args = decodedLog.args as ExchangeCancelUpToEventArgs;
+ this._orderFilledCancelledLazyStore.deleteAllIsCancelled();
+ // Revalidate orders
+ const orderHashes = this._dependentOrderHashesTracker.getDependentOrderHashesByMaker(args.makerAddress);
+ await this._emitRevalidateOrdersAsync(orderHashes);
+ break;
+ }
+
+ default:
+ throw errorUtils.spawnSwitchErr('decodedLog.event', decodedLog.event);
+ }
+ }
+ private async _emitRevalidateOrdersAsync(orderHashes: string[]): Promise<void> {
+ for (const orderHash of orderHashes) {
+ const signedOrder = this._orderByOrderHash[orderHash];
+ // Most of these calls will never reach the network because the data is fetched from stores
+ // and only updated when cache is invalidated
+ const orderState = await this._orderStateUtils.getOpenOrderStateAsync(signedOrder);
+ if (_.isUndefined(this._callbackIfExists)) {
+ break; // Unsubscribe was called
+ }
+ if (_.isEqual(orderState, this._orderStateByOrderHashCache[orderHash])) {
+ // Actual order state didn't change
+ continue;
+ } else {
+ this._orderStateByOrderHashCache[orderHash] = orderState;
+ }
+ this._callbackIfExists(null, orderState);
+ }
+ }
+}
diff --git a/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts b/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts
new file mode 100644
index 000000000..8bfced063
--- /dev/null
+++ b/packages/order-watcher/src/schemas/order_watcher_partial_config_schema.ts
@@ -0,0 +1,13 @@
+export const orderWatcherPartialConfigSchema = {
+ id: '/OrderWatcherPartialConfigSchema',
+ properties: {
+ stateLayer: { $ref: '/blockParamSchema' },
+ orderExpirationCheckingIntervalMs: { type: 'number' },
+ eventPollingIntervalMs: { type: 'number' },
+ expirationMarginMs: { type: 'number' },
+ cleanupJobIntervalMs: { type: 'number' },
+ isVerbose: { type: 'boolean' },
+ },
+ type: 'object',
+ required: [],
+};
diff --git a/packages/order-watcher/src/types.ts b/packages/order-watcher/src/types.ts
new file mode 100644
index 000000000..27d892985
--- /dev/null
+++ b/packages/order-watcher/src/types.ts
@@ -0,0 +1,33 @@
+import { OrderState } from '@0xproject/types';
+import { LogEntryEvent } from 'ethereum-types';
+
+export enum OrderWatcherError {
+ SubscriptionAlreadyPresent = 'SUBSCRIPTION_ALREADY_PRESENT',
+ SubscriptionNotFound = 'SUBSCRIPTION_NOT_FOUND',
+}
+
+export type EventWatcherCallback = (err: null | Error, log?: LogEntryEvent) => void;
+
+/**
+ * orderExpirationCheckingIntervalMs: How often to check for expired orders. Default=50.
+ * eventPollingIntervalMs: How often to poll the Ethereum node for new events. Default=200.
+ * expirationMarginMs: Amount of time before order expiry that you'd like to be notified
+ * of an orders expiration. Default=0.
+ * cleanupJobIntervalMs: How often to run a cleanup job which revalidates all the orders. Default=1hr.
+ * isVerbose: Weather the order watcher should be verbose. Default=true.
+ */
+export interface OrderWatcherConfig {
+ orderExpirationCheckingIntervalMs: number;
+ eventPollingIntervalMs: number;
+ expirationMarginMs: number;
+ cleanupJobIntervalMs: number;
+ isVerbose: boolean;
+}
+
+export type OnOrderStateChangeCallback = (err: Error | null, orderState?: OrderState) => void;
+
+export enum InternalOrderWatcherError {
+ NoAbiDecoder = 'NO_ABI_DECODER',
+ ZrxNotInTokenRegistry = 'ZRX_NOT_IN_TOKEN_REGISTRY',
+ WethNotInTokenRegistry = 'WETH_NOT_IN_TOKEN_REGISTRY',
+}
diff --git a/packages/order-watcher/src/utils/assert.ts b/packages/order-watcher/src/utils/assert.ts
new file mode 100644
index 000000000..a891a60d2
--- /dev/null
+++ b/packages/order-watcher/src/utils/assert.ts
@@ -0,0 +1,23 @@
+import { assert as sharedAssert } from '@0xproject/assert';
+// HACK: We need those two unused imports because they're actually used by sharedAssert which gets injected here
+// tslint:disable:no-unused-variable
+import { Schema } from '@0xproject/json-schemas';
+import { ECSignature } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+// tslint:enable:no-unused-variable
+import { Provider } from 'ethereum-types';
+
+import { isValidSignatureAsync } from '@0xproject/order-utils';
+
+export const assert = {
+ ...sharedAssert,
+ async isValidSignatureAsync(
+ provider: Provider,
+ orderHash: string,
+ signature: string,
+ signerAddress: string,
+ ): Promise<void> {
+ const isValid = await isValidSignatureAsync(provider, orderHash, signature, signerAddress);
+ assert.assert(isValid, `Expected order with hash '${orderHash}' to have a valid signature`);
+ },
+};
diff --git a/packages/order-watcher/src/utils/utils.ts b/packages/order-watcher/src/utils/utils.ts
new file mode 100644
index 000000000..087fc635e
--- /dev/null
+++ b/packages/order-watcher/src/utils/utils.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const utils = {
+ getCurrentUnixTimestampSec(): BigNumber {
+ const milisecondsInASecond = 1000;
+ return new BigNumber(Date.now() / milisecondsInASecond).round();
+ },
+ getCurrentUnixTimestampMs(): BigNumber {
+ return new BigNumber(Date.now());
+ },
+};
diff --git a/packages/order-watcher/test/expiration_watcher_test.ts b/packages/order-watcher/test/expiration_watcher_test.ts
new file mode 100644
index 000000000..ea9923487
--- /dev/null
+++ b/packages/order-watcher/test/expiration_watcher_test.ts
@@ -0,0 +1,206 @@
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { tokenUtils } from '@0xproject/contract-wrappers/lib/test/utils/token_utils';
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { FillScenarios } from '@0xproject/fill-scenarios';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import { DoneCallback } from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+import 'mocha';
+import * as Sinon from 'sinon';
+
+import { ExpirationWatcher } from '../src/order_watcher/expiration_watcher';
+import { utils } from '../src/utils/utils';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+const MILISECONDS_IN_SECOND = 1000;
+
+describe('ExpirationWatcher', () => {
+ const config = {
+ networkId: constants.TESTRPC_NETWORK_ID,
+ };
+ const contractWrappers = new ContractWrappers(provider, config);
+ let userAddresses: string[];
+ let zrxTokenAddress: string;
+ let fillScenarios: FillScenarios;
+ const exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ let makerAssetData: string;
+ let takerAssetData: string;
+ let coinbase: string;
+ let makerAddress: string;
+ let takerAddress: string;
+ let feeRecipient: string;
+ const fillableAmount = new BigNumber(5);
+ let currentUnixTimestampSec: BigNumber;
+ let timer: Sinon.SinonFakeTimers;
+ let expirationWatcher: ExpirationWatcher;
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
+ [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
+ const [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ const sinonTimerConfig = { shouldAdvanceTime: true } as any;
+ // This constructor has incorrect types
+ timer = Sinon.useFakeTimers(sinonTimerConfig);
+ currentUnixTimestampSec = utils.getCurrentUnixTimestampSec();
+ expirationWatcher = new ExpirationWatcher();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ timer.restore();
+ expirationWatcher.unsubscribe();
+ });
+ it('correctly emits events when order expires', (done: DoneCallback) => {
+ (async () => {
+ const orderLifetimeSec = 60;
+ const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
+ const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ expirationUnixTimestampSec,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expirationWatcher.addOrder(orderHash, signedOrder.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done)((hash: string) => {
+ expect(hash).to.be.equal(orderHash);
+ expect(utils.getCurrentUnixTimestampSec()).to.be.bignumber.gte(expirationUnixTimestampSec);
+ });
+ expirationWatcher.subscribe(callbackAsync);
+ timer.tick(orderLifetimeSec * MILISECONDS_IN_SECOND);
+ })().catch(done);
+ });
+ it("doesn't emit events before order expires", (done: DoneCallback) => {
+ (async () => {
+ const orderLifetimeSec = 60;
+ const expirationUnixTimestampSec = currentUnixTimestampSec.plus(orderLifetimeSec);
+ const signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ expirationUnixTimestampSec,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ expirationWatcher.addOrder(orderHash, signedOrder.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done)(async (_hash: string) => {
+ done(new Error('Emitted expiration went before the order actually expired'));
+ });
+ expirationWatcher.subscribe(callbackAsync);
+ const notEnoughTime = orderLifetimeSec - 1;
+ timer.tick(notEnoughTime * MILISECONDS_IN_SECOND);
+ done();
+ })().catch(done);
+ });
+ it('emits events in correct order', (done: DoneCallback) => {
+ (async () => {
+ const order1Lifetime = 60;
+ const order2Lifetime = 120;
+ const order1ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order1Lifetime);
+ const order2ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order2Lifetime);
+ const signedOrder1 = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ order1ExpirationUnixTimestampSec,
+ );
+ const signedOrder2 = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ order2ExpirationUnixTimestampSec,
+ );
+ const orderHash1 = orderHashUtils.getOrderHashHex(signedOrder1);
+ const orderHash2 = orderHashUtils.getOrderHashHex(signedOrder2);
+ expirationWatcher.addOrder(orderHash2, signedOrder2.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ expirationWatcher.addOrder(orderHash1, signedOrder1.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ const expirationOrder = [orderHash1, orderHash2];
+ const expectToBeCalledOnce = false;
+ const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done, expectToBeCalledOnce)(
+ (hash: string) => {
+ const orderHash = expirationOrder.shift();
+ expect(hash).to.be.equal(orderHash);
+ if (_.isEmpty(expirationOrder)) {
+ done();
+ }
+ },
+ );
+ expirationWatcher.subscribe(callbackAsync);
+ timer.tick(order2Lifetime * MILISECONDS_IN_SECOND);
+ })().catch(done);
+ });
+ it('emits events in correct order when expirations are equal', (done: DoneCallback) => {
+ (async () => {
+ const order1Lifetime = 60;
+ const order2Lifetime = 60;
+ const order1ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order1Lifetime);
+ const order2ExpirationUnixTimestampSec = currentUnixTimestampSec.plus(order2Lifetime);
+ const signedOrder1 = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ order1ExpirationUnixTimestampSec,
+ );
+ const signedOrder2 = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ order2ExpirationUnixTimestampSec,
+ );
+ const orderHash1 = orderHashUtils.getOrderHashHex(signedOrder1);
+ const orderHash2 = orderHashUtils.getOrderHashHex(signedOrder2);
+ expirationWatcher.addOrder(orderHash1, signedOrder1.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ expirationWatcher.addOrder(orderHash2, signedOrder2.expirationTimeSeconds.times(MILISECONDS_IN_SECOND));
+ const expirationOrder = orderHash1 < orderHash2 ? [orderHash1, orderHash2] : [orderHash2, orderHash1];
+ const expectToBeCalledOnce = false;
+ const callbackAsync = callbackErrorReporter.reportNoErrorCallbackErrors(done, expectToBeCalledOnce)(
+ (hash: string) => {
+ const orderHash = expirationOrder.shift();
+ expect(hash).to.be.equal(orderHash);
+ if (_.isEmpty(expirationOrder)) {
+ done();
+ }
+ },
+ );
+ expirationWatcher.subscribe(callbackAsync);
+ timer.tick(order2Lifetime * MILISECONDS_IN_SECOND);
+ })().catch(done);
+ });
+});
diff --git a/packages/order-watcher/test/global_hooks.ts b/packages/order-watcher/test/global_hooks.ts
new file mode 100644
index 000000000..f64f1df78
--- /dev/null
+++ b/packages/order-watcher/test/global_hooks.ts
@@ -0,0 +1,17 @@
+import { devConstants } from '@0xproject/dev-utils';
+import { runV2MigrationsAsync } from '@0xproject/migrations';
+
+import { provider } from './utils/web3_wrapper';
+
+before('migrate contracts', async function(): Promise<void> {
+ // HACK: Since the migrations take longer then our global mocha timeout limit
+ // we manually increase it for this before hook.
+ const mochaTestTimeoutMs = 25000;
+ this.timeout(mochaTestTimeoutMs); // tslint:disable-line:no-invalid-this
+ const txDefaults = {
+ gas: devConstants.GAS_LIMIT,
+ from: devConstants.TESTRPC_FIRST_ADDRESS,
+ };
+ const artifactsDir = `../migrations/artifacts/2.0.0`;
+ await runV2MigrationsAsync(provider, artifactsDir, txDefaults);
+});
diff --git a/packages/order-watcher/test/order_watcher_test.ts b/packages/order-watcher/test/order_watcher_test.ts
new file mode 100644
index 000000000..00962bed0
--- /dev/null
+++ b/packages/order-watcher/test/order_watcher_test.ts
@@ -0,0 +1,634 @@
+// tslint:disable:no-unnecessary-type-assertion
+import { ContractWrappers } from '@0xproject/contract-wrappers';
+import { tokenUtils } from '@0xproject/contract-wrappers/lib/test/utils/token_utils';
+import { BlockchainLifecycle, callbackErrorReporter } from '@0xproject/dev-utils';
+import { FillScenarios } from '@0xproject/fill-scenarios';
+import { assetDataUtils, orderHashUtils } from '@0xproject/order-utils';
+import {
+ DoneCallback,
+ ExchangeContractErrs,
+ OrderState,
+ OrderStateInvalid,
+ OrderStateValid,
+ SignedOrder,
+} from '@0xproject/types';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as chai from 'chai';
+import * as _ from 'lodash';
+import 'mocha';
+
+import {
+ DependentOrderHashesTracker,
+ OrderHashesByERC20ByMakerAddress,
+} from '../src/order_watcher/dependent_order_hashes_tracker';
+import { OrderWatcher } from '../src/order_watcher/order_watcher';
+import { OrderWatcherError } from '../src/types';
+
+import { chaiSetup } from './utils/chai_setup';
+import { constants } from './utils/constants';
+import { provider, web3Wrapper } from './utils/web3_wrapper';
+
+const TIMEOUT_MS = 150;
+
+chaiSetup.configure();
+const expect = chai.expect;
+const blockchainLifecycle = new BlockchainLifecycle(web3Wrapper);
+
+describe('OrderWatcher', () => {
+ const networkId = constants.TESTRPC_NETWORK_ID;
+ const config = { networkId };
+ const contractWrappers = new ContractWrappers(provider, config);
+ let fillScenarios: FillScenarios;
+ let userAddresses: string[];
+ let zrxTokenAddress: string;
+ let exchangeContractAddress: string;
+ let makerAssetData: string;
+ let takerAssetData: string;
+ let makerTokenAddress: string;
+ let takerTokenAddress: string;
+ let makerAddress: string;
+ let takerAddress: string;
+ let coinbase: string;
+ let feeRecipient: string;
+ let signedOrder: SignedOrder;
+ let orderWatcher: OrderWatcher;
+ const decimals = constants.ZRX_DECIMALS;
+ const fillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals);
+ before(async () => {
+ await blockchainLifecycle.startAsync();
+ userAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ zrxTokenAddress = tokenUtils.getProtocolTokenAddress();
+ exchangeContractAddress = contractWrappers.exchange.getContractAddress();
+ fillScenarios = new FillScenarios(
+ provider,
+ userAddresses,
+ zrxTokenAddress,
+ exchangeContractAddress,
+ contractWrappers.erc20Proxy.getContractAddress(),
+ contractWrappers.erc721Proxy.getContractAddress(),
+ );
+ [coinbase, makerAddress, takerAddress, feeRecipient] = userAddresses;
+ [makerTokenAddress, takerTokenAddress] = tokenUtils.getDummyERC20TokenAddresses();
+ [makerAssetData, takerAssetData] = [
+ assetDataUtils.encodeERC20AssetData(makerTokenAddress),
+ assetDataUtils.encodeERC20AssetData(takerTokenAddress),
+ ];
+ const orderWatcherConfig = {};
+ orderWatcher = new OrderWatcher(provider, networkId, orderWatcherConfig);
+ });
+ after(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ beforeEach(async () => {
+ await blockchainLifecycle.startAsync();
+ });
+ afterEach(async () => {
+ await blockchainLifecycle.revertAsync();
+ });
+ describe('#removeOrder', async () => {
+ it('should successfully remove existing order', async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ expect((orderWatcher as any)._orderByOrderHash).to.include({
+ [orderHash]: signedOrder,
+ });
+ const dependentOrderHashesTracker = (orderWatcher as any)
+ ._dependentOrderHashesTracker as DependentOrderHashesTracker;
+ let orderHashesByERC20ByMakerAddress: OrderHashesByERC20ByMakerAddress = (dependentOrderHashesTracker as any)
+ ._orderHashesByERC20ByMakerAddress;
+ expect(orderHashesByERC20ByMakerAddress[signedOrder.makerAddress][makerTokenAddress]).to.have.keys(
+ orderHash,
+ );
+ orderWatcher.removeOrder(orderHash);
+ expect((orderWatcher as any)._orderByOrderHash).to.not.include({
+ [orderHash]: signedOrder,
+ });
+ orderHashesByERC20ByMakerAddress = (dependentOrderHashesTracker as any)._orderHashesByERC20ByMakerAddress;
+ expect(orderHashesByERC20ByMakerAddress[signedOrder.makerAddress]).to.be.undefined();
+ });
+ it('should no-op when removing a non-existing order', async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ const nonExistentOrderHash = `0x${orderHash
+ .substr(2)
+ .split('')
+ .reverse()
+ .join('')}`;
+ orderWatcher.removeOrder(nonExistentOrderHash);
+ });
+ });
+ describe('#subscribe', async () => {
+ afterEach(async () => {
+ orderWatcher.unsubscribe();
+ });
+ it('should fail when trying to subscribe twice', async () => {
+ orderWatcher.subscribe(_.noop.bind(_));
+ expect(() => orderWatcher.subscribe(_.noop.bind(_))).to.throw(OrderWatcherError.SubscriptionAlreadyPresent);
+ });
+ });
+ describe('tests with cleanup', async () => {
+ afterEach(async () => {
+ orderWatcher.unsubscribe();
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ orderWatcher.removeOrder(orderHash);
+ });
+ it('should emit orderStateInvalid when makerAddress allowance set to 0 for watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ new BigNumber(0),
+ );
+ })().catch(done);
+ });
+ it('should not emit an orderState event when irrelevant Transfer event received', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((_orderState: OrderState) => {
+ throw new Error('OrderState callback fired for irrelevant order');
+ });
+ orderWatcher.subscribe(callback);
+ const notTheMaker = userAddresses[0];
+ const anyRecipient = takerAddress;
+ const transferAmount = new BigNumber(2);
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ notTheMaker,
+ anyRecipient,
+ transferAmount,
+ );
+ setTimeout(() => {
+ done();
+ }, TIMEOUT_MS);
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when makerAddress moves balance backing watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
+ });
+ orderWatcher.subscribe(callback);
+ const anyRecipient = takerAddress;
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(makerTokenAddress, makerAddress);
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
+ anyRecipient,
+ makerBalance,
+ );
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when watched order fully filled', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderRemainingFillAmountZero);
+ });
+ orderWatcher.subscribe(callback);
+
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillableAmount, takerAddress);
+ })().catch(done);
+ });
+ it('should emit orderStateValid when watched order partially filled', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(makerTokenAddress, makerAddress);
+ const fillAmountInBaseUnits = new BigNumber(2);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.true();
+ const validOrderState = orderState as OrderStateValid;
+ expect(validOrderState.orderHash).to.be.equal(orderHash);
+ const orderRelevantState = validOrderState.orderRelevantState;
+ const remainingMakerBalance = makerBalance.sub(fillAmountInBaseUnits);
+ const remainingFillable = fillableAmount.minus(fillAmountInBaseUnits);
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ remainingFillable,
+ );
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
+ remainingFillable,
+ );
+ expect(orderRelevantState.makerBalance).to.be.bignumber.equal(remainingMakerBalance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillAmountInBaseUnits, takerAddress);
+ })().catch(done);
+ });
+ it('should trigger the callback when orders backing ZRX allowance changes', (done: DoneCallback) => {
+ (async () => {
+ const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
+ signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ takerAddress,
+ );
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)();
+ await orderWatcher.addOrderAsync(signedOrder);
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ zrxTokenAddress,
+ makerAddress,
+ new BigNumber(0),
+ );
+ })().catch(done);
+ });
+ describe('remainingFillable(M|T)akerTokenAmount', () => {
+ it('should calculate correct remaining fillable', (done: DoneCallback) => {
+ (async () => {
+ const takerFillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(10), decimals);
+ const makerFillableAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(20), decimals);
+ signedOrder = await fillScenarios.createAsymmetricFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ makerFillableAmount,
+ takerFillableAmount,
+ );
+ const fillAmountInBaseUnits = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.true();
+ const validOrderState = orderState as OrderStateValid;
+ expect(validOrderState.orderHash).to.be.equal(orderHash);
+ const orderRelevantState = validOrderState.orderRelevantState;
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(16), decimals),
+ );
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(8), decimals),
+ );
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.exchange.fillOrderAsync(signedOrder, fillAmountInBaseUnits, takerAddress);
+ })().catch(done);
+ });
+ it('should equal approved amount when approved amount is lowest', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+
+ const changedMakerApprovalAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(3), decimals);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ const validOrderState = orderState as OrderStateValid;
+ const orderRelevantState = validOrderState.orderRelevantState;
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ changedMakerApprovalAmount,
+ );
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
+ changedMakerApprovalAmount,
+ );
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ changedMakerApprovalAmount,
+ );
+ })().catch(done);
+ });
+ it('should equal balance amount when balance amount is lowest', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+
+ const makerBalance = await contractWrappers.erc20Token.getBalanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ );
+
+ const remainingAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(1), decimals);
+ const transferAmount = makerBalance.sub(remainingAmount);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.true();
+ const validOrderState = orderState as OrderStateValid;
+ const orderRelevantState = validOrderState.orderRelevantState;
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ remainingAmount,
+ );
+ expect(orderRelevantState.remainingFillableTakerAssetAmount).to.be.bignumber.equal(
+ remainingAmount,
+ );
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
+ constants.NULL_ADDRESS,
+ transferAmount,
+ );
+ })().catch(done);
+ });
+ it('should equal ratio amount when fee balance is lowered', (done: DoneCallback) => {
+ (async () => {
+ const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
+ const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(5), decimals);
+ signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ feeRecipient,
+ );
+
+ const remainingFeeAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(3), decimals);
+
+ const remainingTokenAmount = Web3Wrapper.toBaseUnitAmount(new BigNumber(4), decimals);
+ const transferTokenAmount = makerFee.sub(remainingTokenAmount);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ const validOrderState = orderState as OrderStateValid;
+ const orderRelevantState = validOrderState.orderRelevantState;
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ remainingFeeAmount,
+ );
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ zrxTokenAddress,
+ makerAddress,
+ remainingFeeAmount,
+ );
+ await contractWrappers.erc20Token.transferAsync(
+ makerTokenAddress,
+ makerAddress,
+ constants.NULL_ADDRESS,
+ transferTokenAmount,
+ );
+ })().catch(done);
+ });
+ it('should calculate full amount when all available and non-divisible', (done: DoneCallback) => {
+ (async () => {
+ const takerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(0), decimals);
+ const makerFee = Web3Wrapper.toBaseUnitAmount(new BigNumber(2), decimals);
+ signedOrder = await fillScenarios.createFillableSignedOrderWithFeesAsync(
+ makerAssetData,
+ takerAssetData,
+ makerFee,
+ takerFee,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ feeRecipient,
+ );
+
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ const validOrderState = orderState as OrderStateValid;
+ const orderRelevantState = validOrderState.orderRelevantState;
+ expect(orderRelevantState.remainingFillableMakerAssetAmount).to.be.bignumber.equal(
+ fillableAmount,
+ );
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc20Token.setProxyAllowanceAsync(
+ makerTokenAddress,
+ makerAddress,
+ Web3Wrapper.toBaseUnitAmount(new BigNumber(100), decimals),
+ );
+ })().catch(done);
+ });
+ });
+ it('should emit orderStateInvalid when watched order cancelled', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.exchange.cancelOrderAsync(signedOrder);
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when within rounding error range', (done: DoneCallback) => {
+ (async () => {
+ const remainingFillableAmountInBaseUnits = new BigNumber(100);
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerAssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableAmount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.OrderFillRoundingError);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.exchange.fillOrderAsync(
+ signedOrder,
+ fillableAmount.minus(remainingFillableAmountInBaseUnits),
+ takerAddress,
+ );
+ })().catch(done);
+ });
+ describe('erc721', () => {
+ let makerErc721AssetData: string;
+ let makerErc721TokenAddress: string;
+ const tokenId = new BigNumber(42);
+ [makerErc721TokenAddress] = tokenUtils.getDummyERC721TokenAddresses();
+ makerErc721AssetData = assetDataUtils.encodeERC721AssetData(makerErc721TokenAddress, tokenId);
+ const fillableErc721Amount = new BigNumber(1);
+ it('should emit orderStateInvalid when maker allowance set to 0 for watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc721Token.setApprovalAsync(
+ makerErc721TokenAddress,
+ constants.NULL_ADDRESS,
+ tokenId,
+ );
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when maker allowance for all set to 0 for watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ await contractWrappers.erc721Token.setApprovalAsync(
+ makerErc721TokenAddress,
+ constants.NULL_ADDRESS,
+ tokenId,
+ );
+ let isApproved = true;
+ await contractWrappers.erc721Token.setProxyApprovalForAllAsync(
+ makerErc721TokenAddress,
+ makerAddress,
+ isApproved,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerAllowance);
+ });
+ orderWatcher.subscribe(callback);
+ isApproved = false;
+ await contractWrappers.erc721Token.setProxyApprovalForAllAsync(
+ makerErc721TokenAddress,
+ makerAddress,
+ isApproved,
+ );
+ })().catch(done);
+ });
+ it('should emit orderStateInvalid when maker moves NFT backing watched order', (done: DoneCallback) => {
+ (async () => {
+ signedOrder = await fillScenarios.createFillableSignedOrderAsync(
+ makerErc721AssetData,
+ takerAssetData,
+ makerAddress,
+ takerAddress,
+ fillableErc721Amount,
+ );
+ const orderHash = orderHashUtils.getOrderHashHex(signedOrder);
+ await orderWatcher.addOrderAsync(signedOrder);
+ const callback = callbackErrorReporter.reportNodeCallbackErrors(done)((orderState: OrderState) => {
+ expect(orderState.isValid).to.be.false();
+ const invalidOrderState = orderState as OrderStateInvalid;
+ expect(invalidOrderState.orderHash).to.be.equal(orderHash);
+ expect(invalidOrderState.error).to.be.equal(ExchangeContractErrs.InsufficientMakerBalance);
+ });
+ orderWatcher.subscribe(callback);
+ await contractWrappers.erc721Token.transferFromAsync(
+ makerErc721TokenAddress,
+ coinbase,
+ makerAddress,
+ tokenId,
+ );
+ })().catch(done);
+ });
+ });
+ });
+}); // tslint:disable:max-file-line-count
diff --git a/packages/order-watcher/test/utils/chai_setup.ts b/packages/order-watcher/test/utils/chai_setup.ts
new file mode 100644
index 000000000..1a8733093
--- /dev/null
+++ b/packages/order-watcher/test/utils/chai_setup.ts
@@ -0,0 +1,13 @@
+import * as chai from 'chai';
+import chaiAsPromised = require('chai-as-promised');
+import ChaiBigNumber = require('chai-bignumber');
+import * as dirtyChai from 'dirty-chai';
+
+export const chaiSetup = {
+ configure(): void {
+ chai.config.includeStack = true;
+ chai.use(ChaiBigNumber());
+ chai.use(dirtyChai);
+ chai.use(chaiAsPromised);
+ },
+};
diff --git a/packages/order-watcher/test/utils/constants.ts b/packages/order-watcher/test/utils/constants.ts
new file mode 100644
index 000000000..78037647c
--- /dev/null
+++ b/packages/order-watcher/test/utils/constants.ts
@@ -0,0 +1,5 @@
+export const constants = {
+ NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
+ TESTRPC_NETWORK_ID: 50,
+ ZRX_DECIMALS: 18,
+};
diff --git a/packages/order-watcher/test/utils/token_utils.ts b/packages/order-watcher/test/utils/token_utils.ts
new file mode 100644
index 000000000..f91b3797f
--- /dev/null
+++ b/packages/order-watcher/test/utils/token_utils.ts
@@ -0,0 +1,34 @@
+import { Token } from '@0xproject/types';
+import * as _ from 'lodash';
+
+import { InternalOrderWatcherError } from '../../src/types';
+
+const PROTOCOL_TOKEN_SYMBOL = 'ZRX';
+const WETH_TOKEN_SYMBOL = 'WETH';
+
+export class TokenUtils {
+ private readonly _tokens: Token[];
+ constructor(tokens: Token[]) {
+ this._tokens = tokens;
+ }
+ public getProtocolTokenOrThrow(): Token {
+ const zrxToken = _.find(this._tokens, { symbol: PROTOCOL_TOKEN_SYMBOL });
+ if (_.isUndefined(zrxToken)) {
+ throw new Error(InternalOrderWatcherError.ZrxNotInTokenRegistry);
+ }
+ return zrxToken;
+ }
+ public getWethTokenOrThrow(): Token {
+ const wethToken = _.find(this._tokens, { symbol: WETH_TOKEN_SYMBOL });
+ if (_.isUndefined(wethToken)) {
+ throw new Error(InternalOrderWatcherError.WethNotInTokenRegistry);
+ }
+ return wethToken;
+ }
+ public getDummyTokens(): Token[] {
+ const dummyTokens = _.filter(this._tokens, token => {
+ return !_.includes([PROTOCOL_TOKEN_SYMBOL, WETH_TOKEN_SYMBOL], token.symbol);
+ });
+ return dummyTokens;
+ }
+}
diff --git a/packages/order-watcher/test/utils/web3_wrapper.ts b/packages/order-watcher/test/utils/web3_wrapper.ts
new file mode 100644
index 000000000..ab801fa7f
--- /dev/null
+++ b/packages/order-watcher/test/utils/web3_wrapper.ts
@@ -0,0 +1,8 @@
+import { web3Factory } from '@0xproject/dev-utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
+
+const provider: Provider = web3Factory.getRpcProvider({ shouldUseInProcessGanache: true });
+const web3Wrapper = new Web3Wrapper(provider);
+
+export { provider, web3Wrapper };
diff --git a/packages/order-watcher/tsconfig.json b/packages/order-watcher/tsconfig.json
new file mode 100644
index 000000000..e35816553
--- /dev/null
+++ b/packages/order-watcher/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["./src/**/*", "./test/**/*"]
+}
diff --git a/packages/order-watcher/tslint.json b/packages/order-watcher/tslint.json
new file mode 100644
index 000000000..059573ce7
--- /dev/null
+++ b/packages/order-watcher/tslint.json
@@ -0,0 +1,6 @@
+{
+ "rules": {
+ "prefer-readonly": true
+ },
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/react-docs-example/README.md b/packages/react-docs-example/README.md
index 7b2547b20..c7dfcd3aa 100644
--- a/packages/react-docs-example/README.md
+++ b/packages/react-docs-example/README.md
@@ -20,10 +20,22 @@ Then install dependencies
yarn install
```
-#### Start the dev server
+### Initial setup
+
+The **first** time you work with this package, you must build **all** packages within the monorepo. This is because packages that depend on other packages located inside this monorepo are symlinked when run from **within** the monorepo. This allows you to make changes across multiple packages without first publishing dependent packages to NPM. To build all packages, run the following from the monorepo root directory:
+
+```bash
+PKG=0x.js yarn build
+```
+
+Note: If you move this package out of the monorepo, it will work without this step. Make sure you copy it out on the `master` branch since the `development` version might rely on not-yet published changes to other packages.
+
+### Run dev server
+
+The the `react-docs-example` root directory, run:
```bash
-yarn dev
+PKG=0x.js yarn watch
```
### Deploy Example to S3 bucket
@@ -38,8 +50,22 @@ yarn deploy_example
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/react-docs-example yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/react-docs-example yarn watch
+```
+
+### Clean
+
```bash
-yarn build
+yarn clean
```
### Lint
diff --git a/packages/react-docs-example/package.json b/packages/react-docs-example/package.json
index 7da01d01d..1701e6adb 100644
--- a/packages/react-docs-example/package.json
+++ b/packages/react-docs-example/package.json
@@ -1,13 +1,16 @@
{
"private": true,
"name": "@0xproject/react-docs-example",
- "version": "0.0.5",
+ "version": "0.0.20",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "An example app using react-docs",
"scripts": {
- "lint": "tslint --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
+ "lint": "tslint --project .",
"build": "tsc",
"build:example": "NODE_ENV=production webpack",
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"clean": "shx rm -rf lib; shx rm -f public/bundle*",
"dev": "webpack-dev-server --open",
"deploy_example": "npm run build:example; aws s3 sync ./public/. s3://react-docs-example --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers"
@@ -23,11 +26,11 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
- "@types/react": "^16.0.34",
+ "@types/react": "16.3.13",
"@types/react-dom": "^16.0.3",
"@types/react-tap-event-plugin": "0.0.30",
"awesome-typescript-loader": "^3.1.3",
@@ -36,19 +39,20 @@
"json-loader": "^0.5.4",
"less": "^2.7.2",
"less-loader": "^2.2.3",
+ "make-promises-safe": "^1.1.0",
"raw-loader": "^0.5.1",
"shx": "^0.2.2",
"source-map-loader": "^0.2.3",
"style-loader": "^0.20.2",
"tslint": "^5.9.1",
- "typescript": "2.7.1",
+ "typescript": "2.9.2",
"webpack": "^3.11.0",
"webpack-dev-server": "^2.11.1"
},
"dependencies": {
- "@0xproject/react-docs": "^0.0.5",
+ "@0xproject/react-docs": "^1.0.5",
"basscss": "^8.0.3",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"material-ui": "^0.17.1",
"react": "15.6.1",
"react-dom": "15.6.1",
diff --git a/packages/react-docs-example/ts/docs.tsx b/packages/react-docs-example/ts/docs.tsx
index eef331813..bb605806f 100644
--- a/packages/react-docs-example/ts/docs.tsx
+++ b/packages/react-docs-example/ts/docs.tsx
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import {
@@ -15,7 +14,7 @@ import * as v0TypeDocJson from './json/0.1.12.json';
import * as v2TypeDocJson from './json/0.2.0.json';
// tslint:disable-next-line:no-implicit-dependencies no-var-requires
-const IntroMarkdown = require('md/introduction');
+const IntroMarkdownV1 = require('md/introduction');
const docSections = {
introduction: 'introduction',
@@ -33,8 +32,10 @@ const docsInfoConfig: DocsInfoConfig = {
web3Wrapper: [docSections.web3Wrapper],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.web3Wrapper]: ['"web3-wrapper/src/index"'],
@@ -94,10 +95,7 @@ export class Docs extends React.Component<DocsProps, DocsState> {
docAgnosticFormat: docsInfo.convertToDocAgnosticFormat(v2TypeDocJson),
};
}
- public render() {
- const menuSubsectionsBySection = _.isUndefined(this.state.docAgnosticFormat)
- ? {}
- : docsInfo.getMenuSubsectionsBySection(this.state.docAgnosticFormat);
+ public render(): React.ReactNode {
return (
<Documentation
selectedVersion={this.state.selectedVersion}
@@ -109,14 +107,14 @@ export class Docs extends React.Component<DocsProps, DocsState> {
/>
);
}
- private _onVersionSelected(semver: string) {
+ private _onVersionSelected(semver: string): void {
const selectedDocJSON = versionToDocJSON[semver];
this.setState({
selectedVersion: semver,
docAgnosticFormat: docsInfo.convertToDocAgnosticFormat(selectedDocJSON as TypeDocNode),
});
}
- private _getSourceUrl() {
+ private _getSourceUrl(): string {
const sourceUrl = `${docsInfoConfig.packageUrl}/blob/@0xproject/web3-wrapper@${
this.state.selectedVersion
}/packages`;
diff --git a/packages/react-docs-example/yarn.lock b/packages/react-docs-example/yarn.lock
deleted file mode 100644
index 0251ad5d6..000000000
--- a/packages/react-docs-example/yarn.lock
+++ /dev/null
@@ -1,5100 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@0xproject/react-docs@^0.0.1":
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/@0xproject/react-docs/-/react-docs-0.0.1.tgz#329d85be3c66d8a877dca7860c586b60c671ef7d"
- dependencies:
- "@0xproject/react-shared" "^0.0.1"
- basscss "^8.0.3"
- compare-versions "^3.0.1"
- lodash "^4.17.4"
- material-ui "^0.17.1"
- react "15.6.1"
- react-dom "15.6.1"
- react-markdown "^3.2.2"
- react-scroll "^1.5.2"
- react-tap-event-plugin "^2.0.1"
- react-tooltip "^3.2.7"
-
-"@0xproject/react-shared@^0.0.1":
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/@0xproject/react-shared/-/react-shared-0.0.1.tgz#1eb702d996a5cb3b937052b4d69c6ec9d7d23e66"
- dependencies:
- basscss "^8.0.3"
- is-mobile "^0.2.2"
- lodash "^4.17.4"
- material-ui "^0.17.1"
- react "15.6.1"
- react-dom "15.6.1"
- react-highlight "0xproject/react-highlight"
- react-markdown "^3.2.2"
- react-scroll "^1.5.2"
- react-tap-event-plugin "^2.0.1"
-
-"@0xproject/tslint-config@^0.4.9":
- version "0.4.10"
- resolved "https://registry.yarnpkg.com/@0xproject/tslint-config/-/tslint-config-0.4.10.tgz#ced5b0a907dfac65bd5372471ed094bf5478a88b"
- dependencies:
- lodash "^4.17.4"
- tslint "5.8.0"
- tslint-eslint-rules "^4.1.1"
- tslint-react "^3.2.0"
-
-"@types/lodash@^4.14.86":
- version "4.14.104"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.104.tgz#53ee2357fa2e6e68379341d92eb2ecea4b11bb80"
-
-"@types/material-ui@0.18.0":
- version "0.18.0"
- resolved "https://registry.yarnpkg.com/@types/material-ui/-/material-ui-0.18.0.tgz#f3abc5431df8faa4592233c6c5377f2843eb807f"
- dependencies:
- "@types/react" "*"
- "@types/react-addons-linked-state-mixin" "*"
-
-"@types/node@^8.0.53":
- version "8.9.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976"
-
-"@types/react-addons-linked-state-mixin@*":
- version "0.14.19"
- resolved "https://registry.yarnpkg.com/@types/react-addons-linked-state-mixin/-/react-addons-linked-state-mixin-0.14.19.tgz#7ef00a5618a089da4a99e1f58c9aa4c1781d46d5"
- dependencies:
- "@types/react" "*"
-
-"@types/react-dom@^0.14.23":
- version "0.14.23"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-0.14.23.tgz#cecfcfad754b4c2765fe5d29b81b301889ad6c2e"
- dependencies:
- "@types/react" "*"
-
-"@types/react-scroll@0.0.31":
- version "0.0.31"
- resolved "https://registry.yarnpkg.com/@types/react-scroll/-/react-scroll-0.0.31.tgz#1bb26bfd9f595da6403c2f13c2f9a3ed4d2929fa"
- dependencies:
- "@types/react" "*"
-
-"@types/react-tap-event-plugin@0.0.30":
- version "0.0.30"
- resolved "https://registry.yarnpkg.com/@types/react-tap-event-plugin/-/react-tap-event-plugin-0.0.30.tgz#123f35080412f489b6770c5a65c159ff96654cb5"
-
-"@types/react@*":
- version "16.0.40"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.40.tgz#caabc2296886f40b67f6fc80f0f3464476461df9"
-
-"@types/react@^15.0.15":
- version "15.6.14"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-15.6.14.tgz#fe176209b9de3514f9782fa41a239bffd26a3b56"
-
-abbrev@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
-
-accepts@~1.3.4:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
- dependencies:
- mime-types "~2.1.18"
- negotiator "0.6.1"
-
-acorn-dynamic-import@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
- dependencies:
- acorn "^4.0.3"
-
-acorn@^4.0.3:
- version "4.0.13"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
-
-acorn@^5.0.0:
- version "5.5.3"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
-
-ajv-keywords@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
-
-ajv@^4.9.1:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
- dependencies:
- co "^4.6.0"
- json-stable-stringify "^1.0.1"
-
-ajv@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.1.tgz#28a6abc493a2abe0fb4c8507acaedb43fa550671"
- dependencies:
- fast-deep-equal "^1.0.0"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.3.0"
-
-align-text@^0.1.1, align-text@^0.1.3:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
- dependencies:
- kind-of "^3.0.2"
- longest "^1.0.1"
- repeat-string "^1.5.2"
-
-alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
-
-ansi-html@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
-
-ansi-regex@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-
-ansi-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
-
-ansi-styles@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- dependencies:
- color-convert "^1.9.0"
-
-anymatch@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
- dependencies:
- micromatch "^3.1.4"
- normalize-path "^2.1.1"
-
-aproba@^1.0.3:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
-
-are-we-there-yet@~1.1.2:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
- dependencies:
- delegates "^1.0.0"
- readable-stream "^2.0.6"
-
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- dependencies:
- sprintf-js "~1.0.2"
-
-arr-diff@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
- dependencies:
- arr-flatten "^1.0.1"
-
-arr-diff@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
-
-arr-flatten@^1.0.1, arr-flatten@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
-
-arr-union@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
-
-array-find-index@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
-
-array-flatten@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
-
-array-flatten@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
-
-array-includes@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.7.0"
-
-array-union@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
- dependencies:
- array-uniq "^1.0.1"
-
-array-uniq@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
-
-array-unique@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-
-array-unique@^0.3.2:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
-
-asap@~2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
-
-asn1.js@^4.0.0:
- version "4.10.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
- dependencies:
- bn.js "^4.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-asn1@~0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
-
-assert-plus@1.0.0, assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
-
-assert-plus@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
-
-assert@^1.1.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
- dependencies:
- util "0.10.3"
-
-assign-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
-
-async-each@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
-
-async@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-
-async@^2.1.2, async@^2.5.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4"
- dependencies:
- lodash "^4.14.0"
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
-
-atob@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
-
-autoprefixer@^6.3.1:
- version "6.7.7"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
- dependencies:
- browserslist "^1.7.6"
- caniuse-db "^1.0.30000634"
- normalize-range "^0.1.2"
- num2fraction "^1.2.2"
- postcss "^5.2.16"
- postcss-value-parser "^3.2.3"
-
-awesome-typescript-loader@^3.1.3:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/awesome-typescript-loader/-/awesome-typescript-loader-3.5.0.tgz#4d4d10cba7a04ed433dfa0334250846fb11a1a5a"
- dependencies:
- chalk "^2.3.1"
- enhanced-resolve "3.3.0"
- loader-utils "^1.1.0"
- lodash "^4.17.4"
- micromatch "^3.0.3"
- mkdirp "^0.5.1"
- source-map-support "^0.5.3"
-
-aws-sign2@~0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
-
-aws4@^1.2.1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
-
-babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
- dependencies:
- chalk "^1.1.3"
- esutils "^2.0.2"
- js-tokens "^3.0.2"
-
-babel-runtime@^6.20.0, babel-runtime@^6.23.0:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
- dependencies:
- core-js "^2.4.0"
- regenerator-runtime "^0.11.0"
-
-bail@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764"
-
-balanced-match@^0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
-
-balanced-match@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
-
-base64-js@^1.0.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801"
-
-base@^0.11.1:
- version "0.11.2"
- resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
- dependencies:
- cache-base "^1.0.1"
- class-utils "^0.3.5"
- component-emitter "^1.2.1"
- define-property "^1.0.0"
- isobject "^3.0.1"
- mixin-deep "^1.2.0"
- pascalcase "^0.1.1"
-
-basscss-align@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/basscss-align/-/basscss-align-1.0.2.tgz#294aa689d6f99da86e4af4c5c2892870855c1c37"
-
-basscss-border@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/basscss-border/-/basscss-border-4.0.2.tgz#14b4506329b90cb14abe5f4d3473e9fe9202df2e"
-
-basscss-flexbox@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/basscss-flexbox/-/basscss-flexbox-1.0.2.tgz#0f85e8c50618c023c5cff1227e6b3538fc0d9a32"
-
-basscss-grid@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/basscss-grid/-/basscss-grid-2.0.0.tgz#6f4c3198e786a38529f8362bc3b3bce5254c1369"
-
-basscss-hide@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/basscss-hide/-/basscss-hide-1.0.1.tgz#34bc138bba867c6c49ab8682a610ef495e47d750"
-
-basscss-layout@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/basscss-layout/-/basscss-layout-3.1.0.tgz#f9f392e480da66657d9fe5de9ca4c07c579c3a4e"
-
-basscss-margin@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/basscss-margin/-/basscss-margin-1.0.8.tgz#f9845a6eabc806b4ddcd956a461ac90a43d7e283"
-
-basscss-padding@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/basscss-padding/-/basscss-padding-1.1.3.tgz#69db799414e6dd58bed83776952cc299e2e6874e"
-
-basscss-position@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/basscss-position/-/basscss-position-2.0.3.tgz#467180a1f8f386e9072ed8d08294d2a6e0ba4305"
-
-basscss-type-scale@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/basscss-type-scale/-/basscss-type-scale-1.0.5.tgz#23bf5e41c9d142c8061cf9829ccf23e9b3258ec7"
-
-basscss-typography@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/basscss-typography/-/basscss-typography-3.0.4.tgz#ec946a2bad8dd1af97be9ea108ad4bb7be932464"
-
-basscss@^8.0.3:
- version "8.0.4"
- resolved "https://registry.yarnpkg.com/basscss/-/basscss-8.0.4.tgz#b371a2ce25aeb9b322302f37f4e425753dd29ae1"
- dependencies:
- basscss-align "^1.0.2"
- basscss-border "^4.0.2"
- basscss-flexbox "^1.0.2"
- basscss-grid "^2.0.0"
- basscss-hide "^1.0.1"
- basscss-layout "^3.1.0"
- basscss-margin "^1.0.8"
- basscss-padding "^1.1.3"
- basscss-position "^2.0.3"
- basscss-type-scale "^1.0.5"
- basscss-typography "^3.0.4"
-
-batch@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
-
-bcrypt-pbkdf@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
- dependencies:
- tweetnacl "^0.14.3"
-
-big.js@^3.1.3:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
-
-binary-extensions@^1.0.0:
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
-
-block-stream@*:
- version "0.0.9"
- resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
- dependencies:
- inherits "~2.0.0"
-
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
- version "4.11.8"
- resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
-
-body-parser@1.18.2:
- version "1.18.2"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
- dependencies:
- bytes "3.0.0"
- content-type "~1.0.4"
- debug "2.6.9"
- depd "~1.1.1"
- http-errors "~1.6.2"
- iconv-lite "0.4.19"
- on-finished "~2.3.0"
- qs "6.5.1"
- raw-body "2.3.2"
- type-is "~1.6.15"
-
-bonjour@^3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
- dependencies:
- array-flatten "^2.1.0"
- deep-equal "^1.0.1"
- dns-equal "^1.0.0"
- dns-txt "^2.0.2"
- multicast-dns "^6.0.1"
- multicast-dns-service-types "^1.1.0"
-
-boom@2.x.x:
- version "2.10.1"
- resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
- dependencies:
- hoek "2.x.x"
-
-bowser@^1.7.3:
- version "1.9.2"
- resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.2.tgz#d66fc868ca5f4ba895bee1363c343fe7b37d3394"
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-braces@^1.8.2:
- version "1.8.5"
- resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
- dependencies:
- expand-range "^1.8.1"
- preserve "^0.2.0"
- repeat-element "^1.1.2"
-
-braces@^2.3.0, braces@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
- dependencies:
- arr-flatten "^1.1.0"
- array-unique "^0.3.2"
- define-property "^1.0.0"
- extend-shallow "^2.0.1"
- fill-range "^4.0.0"
- isobject "^3.0.1"
- kind-of "^6.0.2"
- repeat-element "^1.1.2"
- snapdragon "^0.8.1"
- snapdragon-node "^2.0.1"
- split-string "^3.0.2"
- to-regex "^3.0.1"
-
-brorand@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
-
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
- dependencies:
- buffer-xor "^1.0.3"
- cipher-base "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.3"
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-browserify-cipher@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
- dependencies:
- browserify-aes "^1.0.4"
- browserify-des "^1.0.0"
- evp_bytestokey "^1.0.0"
-
-browserify-des@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
- dependencies:
- cipher-base "^1.0.1"
- des.js "^1.0.0"
- inherits "^2.0.1"
-
-browserify-rsa@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
- dependencies:
- bn.js "^4.1.0"
- randombytes "^2.0.1"
-
-browserify-sign@^4.0.0:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
- dependencies:
- bn.js "^4.1.1"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.2"
- elliptic "^6.0.0"
- inherits "^2.0.1"
- parse-asn1 "^5.0.0"
-
-browserify-zlib@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
- dependencies:
- pako "~1.0.5"
-
-browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
- version "1.7.7"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
- dependencies:
- caniuse-db "^1.0.30000639"
- electron-to-chromium "^1.2.7"
-
-buffer-indexof@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
-
-buffer-xor@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
-
-buffer@^4.3.0:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
- dependencies:
- base64-js "^1.0.2"
- ieee754 "^1.1.4"
- isarray "^1.0.0"
-
-builtin-modules@^1.0.0, builtin-modules@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
-
-builtin-status-codes@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
-
-bytes@3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
-
-cache-base@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
- dependencies:
- collection-visit "^1.0.0"
- component-emitter "^1.2.1"
- get-value "^2.0.6"
- has-value "^1.0.0"
- isobject "^3.0.1"
- set-value "^2.0.0"
- to-object-path "^0.3.0"
- union-value "^1.0.0"
- unset-value "^1.0.0"
-
-camelcase-keys@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
- dependencies:
- camelcase "^2.0.0"
- map-obj "^1.0.0"
-
-camelcase@^1.0.2:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-
-camelcase@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
-
-camelcase@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
-
-camelcase@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
-
-caniuse-api@^1.5.2:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
- dependencies:
- browserslist "^1.3.6"
- caniuse-db "^1.0.30000529"
- lodash.memoize "^4.1.2"
- lodash.uniq "^4.5.0"
-
-caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
- version "1.0.30000813"
- resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000813.tgz#e0a1c603f8880ad787b2a35652b2733f32a5e29a"
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
-
-center-align@^0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
- dependencies:
- align-text "^0.1.3"
- lazy-cache "^1.0.3"
-
-chain-function@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
-
-chalk@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
- dependencies:
- ansi-styles "^2.2.1"
- escape-string-regexp "^1.0.2"
- has-ansi "^2.0.0"
- strip-ansi "^3.0.0"
- supports-color "^2.0.0"
-
-chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-change-emitter@^0.1.2:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
-
-character-entities-legacy@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f"
-
-character-entities@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca"
-
-character-reference-invalid@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc"
-
-chokidar@^2.0.0, chokidar@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7"
- dependencies:
- anymatch "^2.0.0"
- async-each "^1.0.0"
- braces "^2.3.0"
- glob-parent "^3.1.0"
- inherits "^2.0.1"
- is-binary-path "^1.0.0"
- is-glob "^4.0.0"
- normalize-path "^2.1.1"
- path-is-absolute "^1.0.0"
- readdirp "^2.0.0"
- upath "^1.0.0"
- optionalDependencies:
- fsevents "^1.0.0"
-
-cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-clap@^1.0.9:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
- dependencies:
- chalk "^1.1.3"
-
-class-utils@^0.3.5:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
- dependencies:
- arr-union "^3.1.0"
- define-property "^0.2.5"
- isobject "^3.0.0"
- static-extend "^0.1.1"
-
-classnames@^2.2.5:
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
-
-cliui@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
- dependencies:
- center-align "^0.1.1"
- right-align "^0.1.1"
- wordwrap "0.0.2"
-
-cliui@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wrap-ansi "^2.0.0"
-
-clone@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f"
-
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
-
-coa@~1.0.1:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
- dependencies:
- q "^1.1.2"
-
-code-point-at@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
-
-collapse-white-space@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c"
-
-collection-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
- dependencies:
- map-visit "^1.0.0"
- object-visit "^1.0.0"
-
-color-convert@^1.3.0, color-convert@^1.9.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed"
- dependencies:
- color-name "^1.1.1"
-
-color-name@^1.0.0, color-name@^1.1.1:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
-
-color-string@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
- dependencies:
- color-name "^1.0.0"
-
-color@^0.11.0:
- version "0.11.4"
- resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
- dependencies:
- clone "^1.0.2"
- color-convert "^1.3.0"
- color-string "^0.3.0"
-
-colormin@^1.0.5:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
- dependencies:
- color "^0.11.0"
- css-color-names "0.0.4"
- has "^1.0.1"
-
-colors@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
-
-combined-stream@^1.0.5, combined-stream@~1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
- dependencies:
- delayed-stream "~1.0.0"
-
-commander@^2.12.1, commander@^2.9.0:
- version "2.15.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322"
-
-compare-versions@^3.0.1:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5"
-
-component-emitter@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
-
-compressible@~2.0.13:
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9"
- dependencies:
- mime-db ">= 1.33.0 < 2"
-
-compression@^1.5.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69"
- dependencies:
- accepts "~1.3.4"
- bytes "3.0.0"
- compressible "~2.0.13"
- debug "2.6.9"
- on-headers "~1.0.1"
- safe-buffer "5.1.1"
- vary "~1.1.2"
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-
-connect-history-api-fallback@^1.3.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
-
-console-browserify@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
- dependencies:
- date-now "^0.1.4"
-
-console-control-strings@^1.0.0, console-control-strings@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
-
-constants-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
-
-content-disposition@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
-
-content-type@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
-
-cookie-signature@1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
-
-cookie@0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
-
-copy-descriptor@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
-
-core-js@^1.0.0:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
-
-core-js@^2.4.0:
- version "2.5.3"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
-
-core-util-is@1.0.2, core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
-
-create-ecdh@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
- dependencies:
- bn.js "^4.1.0"
- elliptic "^6.0.0"
-
-create-hash@^1.1.0, create-hash@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
- dependencies:
- cipher-base "^1.0.1"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- sha.js "^2.4.0"
-
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
- dependencies:
- cipher-base "^1.0.3"
- create-hash "^1.1.0"
- inherits "^2.0.1"
- ripemd160 "^2.0.0"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-create-react-class@^15.6.0:
- version "15.6.3"
- resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
- dependencies:
- fbjs "^0.8.9"
- loose-envify "^1.3.1"
- object-assign "^4.1.1"
-
-cross-spawn@^5.0.1:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
- dependencies:
- lru-cache "^4.0.1"
- shebang-command "^1.2.0"
- which "^1.2.9"
-
-cryptiles@2.x.x:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
- dependencies:
- boom "2.x.x"
-
-crypto-browserify@^3.11.0:
- version "3.12.0"
- resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
- dependencies:
- browserify-cipher "^1.0.0"
- browserify-sign "^4.0.0"
- create-ecdh "^4.0.0"
- create-hash "^1.1.0"
- create-hmac "^1.1.0"
- diffie-hellman "^5.0.0"
- inherits "^2.0.1"
- pbkdf2 "^3.0.3"
- public-encrypt "^4.0.0"
- randombytes "^2.0.0"
- randomfill "^1.0.3"
-
-css-color-names@0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
-
-css-in-js-utils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz#5af1dd70f4b06b331f48d22a3d86e0786c0b9435"
- dependencies:
- hyphenate-style-name "^1.0.2"
-
-css-loader@^0.28.9:
- version "0.28.10"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.10.tgz#40282e79230f7bcb4e483efa631d670b735ebf42"
- dependencies:
- babel-code-frame "^6.26.0"
- css-selector-tokenizer "^0.7.0"
- cssnano "^3.10.0"
- icss-utils "^2.1.0"
- loader-utils "^1.0.2"
- lodash.camelcase "^4.3.0"
- object-assign "^4.1.1"
- postcss "^5.0.6"
- postcss-modules-extract-imports "^1.2.0"
- postcss-modules-local-by-default "^1.2.0"
- postcss-modules-scope "^1.1.0"
- postcss-modules-values "^1.3.0"
- postcss-value-parser "^3.3.0"
- source-list-map "^2.0.0"
-
-css-selector-tokenizer@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
- dependencies:
- cssesc "^0.1.0"
- fastparse "^1.1.1"
- regexpu-core "^1.0.0"
-
-cssesc@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
-
-cssnano@^3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
- dependencies:
- autoprefixer "^6.3.1"
- decamelize "^1.1.2"
- defined "^1.0.0"
- has "^1.0.1"
- object-assign "^4.0.1"
- postcss "^5.0.14"
- postcss-calc "^5.2.0"
- postcss-colormin "^2.1.8"
- postcss-convert-values "^2.3.4"
- postcss-discard-comments "^2.0.4"
- postcss-discard-duplicates "^2.0.1"
- postcss-discard-empty "^2.0.1"
- postcss-discard-overridden "^0.1.1"
- postcss-discard-unused "^2.2.1"
- postcss-filter-plugins "^2.0.0"
- postcss-merge-idents "^2.1.5"
- postcss-merge-longhand "^2.0.1"
- postcss-merge-rules "^2.0.3"
- postcss-minify-font-values "^1.0.2"
- postcss-minify-gradients "^1.0.1"
- postcss-minify-params "^1.0.4"
- postcss-minify-selectors "^2.0.4"
- postcss-normalize-charset "^1.1.0"
- postcss-normalize-url "^3.0.7"
- postcss-ordered-values "^2.1.0"
- postcss-reduce-idents "^2.2.2"
- postcss-reduce-initial "^1.0.0"
- postcss-reduce-transforms "^1.0.3"
- postcss-svgo "^2.1.1"
- postcss-unique-selectors "^2.0.2"
- postcss-value-parser "^3.2.3"
- postcss-zindex "^2.0.1"
-
-csso@~2.3.1:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
- dependencies:
- clap "^1.0.9"
- source-map "^0.5.3"
-
-currently-unhandled@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
- dependencies:
- array-find-index "^1.0.1"
-
-d@1:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
- dependencies:
- es5-ext "^0.10.9"
-
-dashdash@^1.12.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- dependencies:
- assert-plus "^1.0.0"
-
-date-now@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
-
-debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- dependencies:
- ms "2.0.0"
-
-debug@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- dependencies:
- ms "2.0.0"
-
-decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-
-decode-uri-component@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
-
-deep-equal@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
-
-deep-extend@~0.4.0:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
-
-define-properties@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
- dependencies:
- foreach "^2.0.5"
- object-keys "^1.0.8"
-
-define-property@^0.2.5:
- version "0.2.5"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
- dependencies:
- is-descriptor "^0.1.0"
-
-define-property@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
- dependencies:
- is-descriptor "^1.0.0"
-
-define-property@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
- dependencies:
- is-descriptor "^1.0.2"
- isobject "^3.0.1"
-
-defined@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
-
-del@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
- dependencies:
- globby "^6.1.0"
- is-path-cwd "^1.0.0"
- is-path-in-cwd "^1.0.0"
- p-map "^1.1.1"
- pify "^3.0.0"
- rimraf "^2.2.8"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
-
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
-
-depd@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
-
-depd@~1.1.1:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
-
-des.js@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
- dependencies:
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
-
-destroy@~1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
-
-detect-libc@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
-
-detect-node@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
-
-diff@^3.2.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
-
-diffie-hellman@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
- dependencies:
- bn.js "^4.1.0"
- miller-rabin "^4.0.0"
- randombytes "^2.0.0"
-
-dns-equal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
-
-dns-packet@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
- dependencies:
- ip "^1.1.0"
- safe-buffer "^5.0.1"
-
-dns-txt@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
- dependencies:
- buffer-indexof "^1.0.0"
-
-doctrine@^0.7.2:
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523"
- dependencies:
- esutils "^1.1.6"
- isarray "0.0.1"
-
-dom-helpers@^3.2.0:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
-
-domain-browser@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
-
-ecc-jsbn@~0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
- dependencies:
- jsbn "~0.1.0"
-
-ee-first@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
-
-electron-to-chromium@^1.2.7:
- version "1.3.36"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz#0eabf71a9ebea9013fb1cc35a390e068624f27e8"
-
-elliptic@^6.0.0:
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
- dependencies:
- bn.js "^4.4.0"
- brorand "^1.0.1"
- hash.js "^1.0.0"
- hmac-drbg "^1.0.0"
- inherits "^2.0.1"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.0"
-
-emojis-list@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
-
-encodeurl@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
-
-encoding@^0.1.11:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
- dependencies:
- iconv-lite "~0.4.13"
-
-enhanced-resolve@3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz#950964ecc7f0332a42321b673b38dc8ff15535b3"
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.4.0"
- object-assign "^4.0.1"
- tapable "^0.2.5"
-
-enhanced-resolve@^3.4.0:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
- dependencies:
- graceful-fs "^4.1.2"
- memory-fs "^0.4.0"
- object-assign "^4.0.1"
- tapable "^0.2.7"
-
-errno@^0.1.1, errno@^0.1.3:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
- dependencies:
- prr "~1.0.1"
-
-error-ex@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
- dependencies:
- is-arrayish "^0.2.1"
-
-es-abstract@^1.7.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864"
- dependencies:
- es-to-primitive "^1.1.1"
- function-bind "^1.1.1"
- has "^1.0.1"
- is-callable "^1.1.3"
- is-regex "^1.0.4"
-
-es-to-primitive@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
- dependencies:
- is-callable "^1.1.1"
- is-date-object "^1.0.1"
- is-symbol "^1.0.1"
-
-es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
- version "0.10.39"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87"
- dependencies:
- es6-iterator "~2.0.3"
- es6-symbol "~3.1.1"
-
-es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
- dependencies:
- d "1"
- es5-ext "^0.10.35"
- es6-symbol "^3.1.1"
-
-es6-map@^0.1.3:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
- dependencies:
- d "1"
- es5-ext "~0.10.14"
- es6-iterator "~2.0.1"
- es6-set "~0.1.5"
- es6-symbol "~3.1.1"
- event-emitter "~0.3.5"
-
-es6-object-assign@^1.0.3:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
-
-es6-set@~0.1.5:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
- dependencies:
- d "1"
- es5-ext "~0.10.14"
- es6-iterator "~2.0.1"
- es6-symbol "3.1.1"
- event-emitter "~0.3.5"
-
-es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-es6-weak-map@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
- dependencies:
- d "1"
- es5-ext "^0.10.14"
- es6-iterator "^2.0.1"
- es6-symbol "^3.1.1"
-
-escape-html@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-
-escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
-
-escope@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
- dependencies:
- es6-map "^0.1.3"
- es6-weak-map "^2.0.1"
- esrecurse "^4.1.0"
- estraverse "^4.1.1"
-
-esprima@^2.6.0:
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
-
-esprima@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
-
-esrecurse@^4.1.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
- dependencies:
- estraverse "^4.1.0"
-
-estraverse@^4.1.0, estraverse@^4.1.1:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
-
-esutils@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375"
-
-esutils@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-
-etag@~1.8.1:
- version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
-
-event-emitter@~0.3.5:
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
- dependencies:
- d "1"
- es5-ext "~0.10.14"
-
-eventemitter3@1.x.x:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
-
-events@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
-
-eventsource@0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
- dependencies:
- original ">=0.0.5"
-
-evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
- dependencies:
- md5.js "^1.3.4"
- safe-buffer "^5.1.1"
-
-execa@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
- dependencies:
- cross-spawn "^5.0.1"
- get-stream "^3.0.0"
- is-stream "^1.1.0"
- npm-run-path "^2.0.0"
- p-finally "^1.0.0"
- signal-exit "^3.0.0"
- strip-eof "^1.0.0"
-
-expand-brackets@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
- dependencies:
- is-posix-bracket "^0.1.0"
-
-expand-brackets@^2.1.4:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
- dependencies:
- debug "^2.3.3"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- posix-character-classes "^0.1.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-expand-range@^1.8.1:
- version "1.8.2"
- resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
- dependencies:
- fill-range "^2.1.0"
-
-express@^4.16.2:
- version "4.16.2"
- resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
- dependencies:
- accepts "~1.3.4"
- array-flatten "1.1.1"
- body-parser "1.18.2"
- content-disposition "0.5.2"
- content-type "~1.0.4"
- cookie "0.3.1"
- cookie-signature "1.0.6"
- debug "2.6.9"
- depd "~1.1.1"
- encodeurl "~1.0.1"
- escape-html "~1.0.3"
- etag "~1.8.1"
- finalhandler "1.1.0"
- fresh "0.5.2"
- merge-descriptors "1.0.1"
- methods "~1.1.2"
- on-finished "~2.3.0"
- parseurl "~1.3.2"
- path-to-regexp "0.1.7"
- proxy-addr "~2.0.2"
- qs "6.5.1"
- range-parser "~1.2.0"
- safe-buffer "5.1.1"
- send "0.16.1"
- serve-static "1.13.1"
- setprototypeof "1.1.0"
- statuses "~1.3.1"
- type-is "~1.6.15"
- utils-merge "1.0.1"
- vary "~1.1.2"
-
-extend-shallow@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
- dependencies:
- is-extendable "^0.1.0"
-
-extend-shallow@^3.0.0, extend-shallow@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
- dependencies:
- assign-symbols "^1.0.0"
- is-extendable "^1.0.1"
-
-extend@^3.0.0, extend@~3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
-
-extglob@^0.3.1:
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
- dependencies:
- is-extglob "^1.0.0"
-
-extglob@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
- dependencies:
- array-unique "^0.3.2"
- define-property "^1.0.0"
- expand-brackets "^2.1.4"
- extend-shallow "^2.0.1"
- fragment-cache "^0.2.1"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-extsprintf@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
-
-extsprintf@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
-
-fast-deep-equal@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
-
-fast-json-stable-stringify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
-
-fastparse@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
-
-faye-websocket@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
- dependencies:
- websocket-driver ">=0.5.1"
-
-faye-websocket@~0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
- dependencies:
- websocket-driver ">=0.5.1"
-
-fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.6, fbjs@^0.8.9:
- version "0.8.16"
- resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
- dependencies:
- core-js "^1.0.0"
- isomorphic-fetch "^2.1.1"
- loose-envify "^1.0.0"
- object-assign "^4.1.0"
- promise "^7.1.1"
- setimmediate "^1.0.5"
- ua-parser-js "^0.7.9"
-
-filename-regex@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
-
-fill-range@^2.1.0:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
- dependencies:
- is-number "^2.1.0"
- isobject "^2.0.0"
- randomatic "^1.1.3"
- repeat-element "^1.1.2"
- repeat-string "^1.5.2"
-
-fill-range@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
- dependencies:
- extend-shallow "^2.0.1"
- is-number "^3.0.0"
- repeat-string "^1.6.1"
- to-regex-range "^2.1.0"
-
-finalhandler@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
- dependencies:
- debug "2.6.9"
- encodeurl "~1.0.1"
- escape-html "~1.0.3"
- on-finished "~2.3.0"
- parseurl "~1.3.2"
- statuses "~1.3.1"
- unpipe "~1.0.0"
-
-find-up@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
- dependencies:
- path-exists "^2.0.0"
- pinkie-promise "^2.0.0"
-
-find-up@^2.0.0, find-up@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
- dependencies:
- locate-path "^2.0.0"
-
-flatten@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
-
-for-in@^1.0.1, for-in@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-
-for-own@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
- dependencies:
- for-in "^1.0.1"
-
-foreach@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
-
-forever-agent@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
-
-form-data@~2.1.1:
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.5"
- mime-types "^2.1.12"
-
-forwarded@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
-
-fragment-cache@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
- dependencies:
- map-cache "^0.2.2"
-
-fresh@0.5.2:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
-
-fsevents@^1.0.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
- dependencies:
- nan "^2.3.0"
- node-pre-gyp "^0.6.39"
-
-fstream-ignore@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
- dependencies:
- fstream "^1.0.0"
- inherits "2"
- minimatch "^3.0.0"
-
-fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
- dependencies:
- graceful-fs "^4.1.2"
- inherits "~2.0.0"
- mkdirp ">=0.5 0"
- rimraf "2"
-
-function-bind@^1.0.2, function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
-
-gauge@~2.7.3:
- version "2.7.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
- dependencies:
- aproba "^1.0.3"
- console-control-strings "^1.0.0"
- has-unicode "^2.0.0"
- object-assign "^4.1.0"
- signal-exit "^3.0.0"
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
- wide-align "^1.1.0"
-
-get-caller-file@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
-
-get-stdin@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
-
-get-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
-
-get-value@^2.0.3, get-value@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
-
-getpass@^0.1.1:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- dependencies:
- assert-plus "^1.0.0"
-
-glob-base@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
- dependencies:
- glob-parent "^2.0.0"
- is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
- dependencies:
- is-glob "^2.0.0"
-
-glob-parent@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
- dependencies:
- is-glob "^3.1.0"
- path-dirname "^1.0.0"
-
-glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-globby@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
- dependencies:
- array-union "^1.0.1"
- glob "^7.0.3"
- object-assign "^4.0.1"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-graceful-fs@^4.1.2:
- version "4.1.11"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
-
-handle-thing@^1.2.5:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
-
-har-schema@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
-
-har-validator@~4.2.1:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
- dependencies:
- ajv "^4.9.1"
- har-schema "^1.0.5"
-
-has-ansi@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
- dependencies:
- ansi-regex "^2.0.0"
-
-has-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
-
-has-flag@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
-
-has-unicode@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
-
-has-value@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
- dependencies:
- get-value "^2.0.3"
- has-values "^0.1.4"
- isobject "^2.0.0"
-
-has-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
- dependencies:
- get-value "^2.0.6"
- has-values "^1.0.0"
- isobject "^3.0.0"
-
-has-values@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
-
-has-values@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
- dependencies:
- is-number "^3.0.0"
- kind-of "^4.0.0"
-
-has@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
- dependencies:
- function-bind "^1.0.2"
-
-hash-base@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
- dependencies:
- inherits "^2.0.1"
-
-hash-base@^3.0.0:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-hash.js@^1.0.0, hash.js@^1.0.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
- dependencies:
- inherits "^2.0.3"
- minimalistic-assert "^1.0.0"
-
-hawk@3.1.3, hawk@~3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
- dependencies:
- boom "2.x.x"
- cryptiles "2.x.x"
- hoek "2.x.x"
- sntp "1.x.x"
-
-highlight.js@^9.11.0:
- version "9.12.0"
- resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
-
-highlightjs-solidity@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-1.0.6.tgz#59394d8a2c57013580d5bfbb62f7df98386ae7ac"
-
-hmac-drbg@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
- dependencies:
- hash.js "^1.0.3"
- minimalistic-assert "^1.0.0"
- minimalistic-crypto-utils "^1.0.1"
-
-hoek@2.x.x:
- version "2.16.3"
- resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
-
-hoist-non-react-statics@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
-
-hosted-git-info@^2.1.4:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
-
-hpack.js@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
- dependencies:
- inherits "^2.0.1"
- obuf "^1.0.0"
- readable-stream "^2.0.1"
- wbuf "^1.1.0"
-
-html-comment-regex@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
-
-html-entities@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
-
-http-deceiver@^1.2.7:
- version "1.2.7"
- resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
-
-http-errors@1.6.2, http-errors@~1.6.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
- dependencies:
- depd "1.1.1"
- inherits "2.0.3"
- setprototypeof "1.0.3"
- statuses ">= 1.3.1 < 2"
-
-http-parser-js@>=0.4.0:
- version "0.4.11"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.11.tgz#5b720849c650903c27e521633d94696ee95f3529"
-
-http-proxy-middleware@~0.17.4:
- version "0.17.4"
- resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
- dependencies:
- http-proxy "^1.16.2"
- is-glob "^3.1.0"
- lodash "^4.17.2"
- micromatch "^2.3.11"
-
-http-proxy@^1.16.2:
- version "1.16.2"
- resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
- dependencies:
- eventemitter3 "1.x.x"
- requires-port "1.x.x"
-
-http-signature@~1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
- dependencies:
- assert-plus "^0.2.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
-https-browserify@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
-
-hyphenate-style-name@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
-
-iconv-lite@0.4.19, iconv-lite@~0.4.13:
- version "0.4.19"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-
-icss-replace-symbols@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
-
-icss-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
- dependencies:
- postcss "^6.0.1"
-
-ieee754@^1.1.4:
- version "1.1.8"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
-
-image-size@~0.5.0:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
-
-import-local@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
- dependencies:
- pkg-dir "^2.0.0"
- resolve-cwd "^2.0.0"
-
-indent-string@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
- dependencies:
- repeating "^2.0.0"
-
-indexes-of@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
-
-indexof@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-
-inherits@2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
-
-ini@~1.3.0:
- version "1.3.5"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
-
-inline-style-prefixer@^3.0.2:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534"
- dependencies:
- bowser "^1.7.3"
- css-in-js-utils "^2.0.0"
-
-internal-ip@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
- dependencies:
- meow "^3.3.0"
-
-interpret@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
-
-invert-kv@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
-
-ip@^1.1.0, ip@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
-
-ipaddr.js@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b"
-
-is-absolute-url@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
-
-is-accessor-descriptor@^0.1.6:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
- dependencies:
- kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
- dependencies:
- kind-of "^6.0.0"
-
-is-alphabetical@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08"
-
-is-alphanumerical@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b"
- dependencies:
- is-alphabetical "^1.0.0"
- is-decimal "^1.0.0"
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
-
-is-binary-path@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
- dependencies:
- binary-extensions "^1.0.0"
-
-is-buffer@^1.1.4, is-buffer@^1.1.5:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
-
-is-builtin-module@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
- dependencies:
- builtin-modules "^1.0.0"
-
-is-callable@^1.1.1, is-callable@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
-
-is-data-descriptor@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
- dependencies:
- kind-of "^3.0.2"
-
-is-data-descriptor@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
- dependencies:
- kind-of "^6.0.0"
-
-is-date-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
-
-is-decimal@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82"
-
-is-descriptor@^0.1.0:
- version "0.1.6"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
- dependencies:
- is-accessor-descriptor "^0.1.6"
- is-data-descriptor "^0.1.4"
- kind-of "^5.0.0"
-
-is-descriptor@^1.0.0, is-descriptor@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
- dependencies:
- is-accessor-descriptor "^1.0.0"
- is-data-descriptor "^1.0.0"
- kind-of "^6.0.2"
-
-is-dotfile@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
-
-is-equal-shallow@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
- dependencies:
- is-primitive "^2.0.0"
-
-is-extendable@^0.1.0, is-extendable@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-
-is-extendable@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
- dependencies:
- is-plain-object "^2.0.4"
-
-is-extglob@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-
-is-extglob@^2.1.0, is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
-
-is-finite@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
- dependencies:
- number-is-nan "^1.0.0"
-
-is-fullwidth-code-point@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
-
-is-glob@^2.0.0, is-glob@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
- dependencies:
- is-extglob "^1.0.0"
-
-is-glob@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
- dependencies:
- is-extglob "^2.1.0"
-
-is-glob@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
- dependencies:
- is-extglob "^2.1.1"
-
-is-hexadecimal@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69"
-
-is-mobile@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-0.2.2.tgz#0e2e006d99ed2c2155b761df80f2a3619ae2ad9f"
-
-is-number@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
- dependencies:
- kind-of "^3.0.2"
-
-is-number@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
- dependencies:
- kind-of "^3.0.2"
-
-is-number@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
-
-is-odd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24"
- dependencies:
- is-number "^4.0.0"
-
-is-path-cwd@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
-
-is-path-in-cwd@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
- dependencies:
- is-path-inside "^1.0.0"
-
-is-path-inside@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
- dependencies:
- path-is-inside "^1.0.1"
-
-is-plain-obj@^1.0.0, is-plain-obj@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
-
-is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
- dependencies:
- isobject "^3.0.1"
-
-is-posix-bracket@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
-
-is-primitive@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
-
-is-regex@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
- dependencies:
- has "^1.0.1"
-
-is-stream@^1.0.1, is-stream@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
-
-is-svg@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
- dependencies:
- html-comment-regex "^1.1.0"
-
-is-symbol@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
-
-is-typedarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-
-is-utf8@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
-
-is-whitespace-character@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b"
-
-is-windows@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
-
-is-word-character@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb"
-
-is-wsl@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
-
-isarray@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-
-isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-
-isobject@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
- dependencies:
- isarray "1.0.0"
-
-isobject@^3.0.0, isobject@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
-
-isomorphic-fetch@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
- dependencies:
- node-fetch "^1.0.1"
- whatwg-fetch ">=0.10.0"
-
-isstream@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
-
-js-base64@^2.1.9:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582"
-
-js-tokens@^3.0.0, js-tokens@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-
-js-yaml@^3.7.0:
- version "3.11.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-js-yaml@~3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
- dependencies:
- argparse "^1.0.7"
- esprima "^2.6.0"
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-
-json-loader@^0.5.4:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
-
-json-schema-traverse@^0.3.0:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
-
-json-schema@0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
-
-json-stable-stringify@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
- dependencies:
- jsonify "~0.0.0"
-
-json-stringify-safe@~5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
-
-json3@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
-
-json5@^0.5.0, json5@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
-
-jsonify@~0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-
-jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.2.3"
- verror "1.10.0"
-
-keycode@^2.1.8:
- version "2.1.9"
- resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa"
-
-killable@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b"
-
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
- dependencies:
- is-buffer "^1.1.5"
-
-kind-of@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
-
-kind-of@^6.0.0, kind-of@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
-
-lazy-cache@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
-
-lazy-cache@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
- dependencies:
- set-getter "^0.1.0"
-
-lcid@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
- dependencies:
- invert-kv "^1.0.0"
-
-less-loader@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-2.2.3.tgz#b6d8f8139c8493df09d992a93a00734b08f84528"
- dependencies:
- loader-utils "^0.2.5"
-
-less@^2.7.2:
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/less/-/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b"
- optionalDependencies:
- errno "^0.1.1"
- graceful-fs "^4.1.2"
- image-size "~0.5.0"
- mime "^1.2.11"
- mkdirp "^0.5.0"
- promise "^7.1.1"
- request "2.81.0"
- source-map "^0.5.3"
-
-load-json-file@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
- strip-bom "^2.0.0"
-
-load-json-file@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
- dependencies:
- graceful-fs "^4.1.2"
- parse-json "^2.2.0"
- pify "^2.0.0"
- strip-bom "^3.0.0"
-
-loader-runner@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
-
-loader-utils@^0.2.5, loader-utils@~0.2.2:
- version "0.2.17"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
- dependencies:
- big.js "^3.1.3"
- emojis-list "^2.0.0"
- json5 "^0.5.0"
- object-assign "^4.0.1"
-
-loader-utils@^1.0.2, loader-utils@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
- dependencies:
- big.js "^3.1.3"
- emojis-list "^2.0.0"
- json5 "^0.5.0"
-
-locate-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
- dependencies:
- p-locate "^2.0.0"
- path-exists "^3.0.0"
-
-lodash.camelcase@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
-
-lodash.memoize@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
-
-lodash.merge@^4.6.0:
- version "4.6.1"
- resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
-
-lodash.throttle@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
-
-lodash.uniq@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-
-lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4:
- version "4.17.5"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
-
-loglevel@^1.4.1:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
-
-longest@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
-
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
- dependencies:
- js-tokens "^3.0.0"
-
-loud-rejection@^1.0.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
- dependencies:
- currently-unhandled "^0.4.1"
- signal-exit "^3.0.0"
-
-lru-cache@^4.0.1:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f"
- dependencies:
- pseudomap "^1.0.2"
- yallist "^2.1.2"
-
-macaddress@^0.2.8:
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
-
-map-cache@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
-
-map-obj@^1.0.0, map-obj@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
-
-map-visit@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
- dependencies:
- object-visit "^1.0.0"
-
-markdown-escapes@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518"
-
-material-ui@^0.17.1:
- version "0.17.4"
- resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.17.4.tgz#193999ecb49c3ec15ae0abb4e90fdf9a7bd343e0"
- dependencies:
- babel-runtime "^6.23.0"
- inline-style-prefixer "^3.0.2"
- keycode "^2.1.8"
- lodash.merge "^4.6.0"
- lodash.throttle "^4.1.1"
- prop-types "^15.5.7"
- react-addons-create-fragment "^15.4.0"
- react-addons-transition-group "^15.4.0"
- react-event-listener "^0.4.5"
- recompose "^0.23.0"
- simple-assign "^0.1.0"
- warning "^3.0.0"
-
-math-expression-evaluator@^1.2.14:
- version "1.2.17"
- resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
-
-md5.js@^1.3.4:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
- dependencies:
- hash-base "^3.0.0"
- inherits "^2.0.1"
-
-media-typer@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
-
-mem@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
- dependencies:
- mimic-fn "^1.0.0"
-
-memory-fs@^0.4.0, memory-fs@~0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
- dependencies:
- errno "^0.1.3"
- readable-stream "^2.0.1"
-
-meow@^3.3.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
- dependencies:
- camelcase-keys "^2.0.0"
- decamelize "^1.1.2"
- loud-rejection "^1.0.0"
- map-obj "^1.0.1"
- minimist "^1.1.3"
- normalize-package-data "^2.3.4"
- object-assign "^4.0.1"
- read-pkg-up "^1.0.1"
- redent "^1.0.0"
- trim-newlines "^1.0.0"
-
-merge-descriptors@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
-
-methods@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
-
-micromatch@^2.3.11:
- version "2.3.11"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
- dependencies:
- arr-diff "^2.0.0"
- array-unique "^0.2.1"
- braces "^1.8.2"
- expand-brackets "^0.1.4"
- extglob "^0.3.1"
- filename-regex "^2.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.1"
- kind-of "^3.0.2"
- normalize-path "^2.0.1"
- object.omit "^2.0.0"
- parse-glob "^3.0.4"
- regex-cache "^0.4.2"
-
-micromatch@^3.0.3, micromatch@^3.1.4:
- version "3.1.9"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89"
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- braces "^2.3.1"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- extglob "^2.0.4"
- fragment-cache "^0.2.1"
- kind-of "^6.0.2"
- nanomatch "^1.2.9"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-miller-rabin@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
- dependencies:
- bn.js "^4.0.0"
- brorand "^1.0.1"
-
-"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0:
- version "1.33.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
-
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7:
- version "2.1.18"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
- dependencies:
- mime-db "~1.33.0"
-
-mime@1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
-
-mime@^1.2.11, mime@^1.5.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
-
-mimic-fn@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
-
-minimalistic-assert@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
-
-minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
-
-minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-
-minimist@^1.1.3, minimist@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
-
-mixin-deep@^1.2.0:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
- dependencies:
- for-in "^1.0.2"
- is-extendable "^1.0.1"
-
-mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- dependencies:
- minimist "0.0.8"
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
-
-multicast-dns-service-types@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
-
-multicast-dns@^6.0.1:
- version "6.2.3"
- resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
- dependencies:
- dns-packet "^1.3.1"
- thunky "^1.0.2"
-
-nan@^2.3.0:
- version "2.9.2"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866"
-
-nanomatch@^1.2.9:
- version "1.2.9"
- resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2"
- dependencies:
- arr-diff "^4.0.0"
- array-unique "^0.3.2"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- fragment-cache "^0.2.1"
- is-odd "^2.0.0"
- is-windows "^1.0.2"
- kind-of "^6.0.2"
- object.pick "^1.3.0"
- regex-not "^1.0.0"
- snapdragon "^0.8.1"
- to-regex "^3.0.1"
-
-negotiator@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
-
-neo-async@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f"
-
-node-fetch@^1.0.1:
- version "1.7.3"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
- dependencies:
- encoding "^0.1.11"
- is-stream "^1.0.1"
-
-node-forge@0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300"
-
-node-libs-browser@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
- dependencies:
- assert "^1.1.1"
- browserify-zlib "^0.2.0"
- buffer "^4.3.0"
- console-browserify "^1.1.0"
- constants-browserify "^1.0.0"
- crypto-browserify "^3.11.0"
- domain-browser "^1.1.1"
- events "^1.0.0"
- https-browserify "^1.0.0"
- os-browserify "^0.3.0"
- path-browserify "0.0.0"
- process "^0.11.10"
- punycode "^1.2.4"
- querystring-es3 "^0.2.0"
- readable-stream "^2.3.3"
- stream-browserify "^2.0.1"
- stream-http "^2.7.2"
- string_decoder "^1.0.0"
- timers-browserify "^2.0.4"
- tty-browserify "0.0.0"
- url "^0.11.0"
- util "^0.10.3"
- vm-browserify "0.0.4"
-
-node-pre-gyp@^0.6.39:
- version "0.6.39"
- resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
- dependencies:
- detect-libc "^1.0.2"
- hawk "3.1.3"
- mkdirp "^0.5.1"
- nopt "^4.0.1"
- npmlog "^4.0.2"
- rc "^1.1.7"
- request "2.81.0"
- rimraf "^2.6.1"
- semver "^5.3.0"
- tar "^2.2.1"
- tar-pack "^3.4.0"
-
-nopt@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
-normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
- dependencies:
- hosted-git-info "^2.1.4"
- is-builtin-module "^1.0.0"
- semver "2 || 3 || 4 || 5"
- validate-npm-package-license "^3.0.1"
-
-normalize-path@^2.0.1, normalize-path@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
- dependencies:
- remove-trailing-separator "^1.0.1"
-
-normalize-range@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
-
-normalize-url@^1.4.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
- dependencies:
- object-assign "^4.0.1"
- prepend-http "^1.0.0"
- query-string "^4.1.0"
- sort-keys "^1.0.0"
-
-npm-run-path@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
- dependencies:
- path-key "^2.0.0"
-
-npmlog@^4.0.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
- dependencies:
- are-we-there-yet "~1.1.2"
- console-control-strings "~1.1.0"
- gauge "~2.7.3"
- set-blocking "~2.0.0"
-
-num2fraction@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
-
-number-is-nan@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
-
-oauth-sign@~0.8.1:
- version "0.8.2"
- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
-
-object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
-
-object-copy@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
- dependencies:
- copy-descriptor "^0.1.0"
- define-property "^0.2.5"
- kind-of "^3.0.3"
-
-object-keys@^1.0.8:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
-
-object-visit@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
- dependencies:
- isobject "^3.0.0"
-
-object.omit@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
- dependencies:
- for-own "^0.1.4"
- is-extendable "^0.1.1"
-
-object.pick@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
- dependencies:
- isobject "^3.0.1"
-
-obuf@^1.0.0, obuf@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e"
-
-on-finished@~2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
- dependencies:
- ee-first "1.1.1"
-
-on-headers@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
-
-once@^1.3.0, once@^1.3.3:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- dependencies:
- wrappy "1"
-
-opn@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225"
- dependencies:
- is-wsl "^1.1.0"
-
-original@>=0.0.5:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b"
- dependencies:
- url-parse "1.0.x"
-
-os-browserify@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
-
-os-homedir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-
-os-locale@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
- dependencies:
- lcid "^1.0.0"
-
-os-locale@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
- dependencies:
- execa "^0.7.0"
- lcid "^1.0.0"
- mem "^1.1.0"
-
-os-tmpdir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-
-osenv@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.0"
-
-p-finally@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
-
-p-limit@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c"
- dependencies:
- p-try "^1.0.0"
-
-p-locate@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
- dependencies:
- p-limit "^1.1.0"
-
-p-map@^1.1.1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-
-p-try@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
-
-pako@~1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
-
-parse-asn1@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
- dependencies:
- asn1.js "^4.0.0"
- browserify-aes "^1.0.0"
- create-hash "^1.1.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
-
-parse-entities@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
- dependencies:
- character-entities "^1.0.0"
- character-entities-legacy "^1.0.0"
- character-reference-invalid "^1.0.0"
- is-alphanumerical "^1.0.0"
- is-decimal "^1.0.0"
- is-hexadecimal "^1.0.0"
-
-parse-glob@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
- dependencies:
- glob-base "^0.3.0"
- is-dotfile "^1.0.0"
- is-extglob "^1.0.0"
- is-glob "^2.0.0"
-
-parse-json@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
- dependencies:
- error-ex "^1.2.0"
-
-parseurl@~1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
-
-pascalcase@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
-
-path-browserify@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
-
-path-dirname@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
-
-path-exists@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
- dependencies:
- pinkie-promise "^2.0.0"
-
-path-exists@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-
-path-is-inside@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
-
-path-key@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
-
-path-parse@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
-
-path-to-regexp@0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
-
-path-type@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
- dependencies:
- graceful-fs "^4.1.2"
- pify "^2.0.0"
- pinkie-promise "^2.0.0"
-
-path-type@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
- dependencies:
- pify "^2.0.0"
-
-pbkdf2@^3.0.3:
- version "3.0.14"
- resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
- dependencies:
- create-hash "^1.1.2"
- create-hmac "^1.1.4"
- ripemd160 "^2.0.1"
- safe-buffer "^5.0.1"
- sha.js "^2.4.8"
-
-performance-now@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
-
-pify@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
-
-pinkie-promise@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
- dependencies:
- pinkie "^2.0.0"
-
-pinkie@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
-
-pkg-dir@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
- dependencies:
- find-up "^2.1.0"
-
-portfinder@^1.0.9:
- version "1.0.13"
- resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
- dependencies:
- async "^1.5.2"
- debug "^2.2.0"
- mkdirp "0.5.x"
-
-posix-character-classes@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
-
-postcss-calc@^5.2.0:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
- dependencies:
- postcss "^5.0.2"
- postcss-message-helpers "^2.0.0"
- reduce-css-calc "^1.2.6"
-
-postcss-colormin@^2.1.8:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
- dependencies:
- colormin "^1.0.5"
- postcss "^5.0.13"
- postcss-value-parser "^3.2.3"
-
-postcss-convert-values@^2.3.4:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
- dependencies:
- postcss "^5.0.11"
- postcss-value-parser "^3.1.2"
-
-postcss-discard-comments@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
- dependencies:
- postcss "^5.0.14"
-
-postcss-discard-duplicates@^2.0.1:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
- dependencies:
- postcss "^5.0.4"
-
-postcss-discard-empty@^2.0.1:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
- dependencies:
- postcss "^5.0.14"
-
-postcss-discard-overridden@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
- dependencies:
- postcss "^5.0.16"
-
-postcss-discard-unused@^2.2.1:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
- dependencies:
- postcss "^5.0.14"
- uniqs "^2.0.0"
-
-postcss-filter-plugins@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
- dependencies:
- postcss "^5.0.4"
- uniqid "^4.0.0"
-
-postcss-merge-idents@^2.1.5:
- version "2.1.7"
- resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
- dependencies:
- has "^1.0.1"
- postcss "^5.0.10"
- postcss-value-parser "^3.1.1"
-
-postcss-merge-longhand@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
- dependencies:
- postcss "^5.0.4"
-
-postcss-merge-rules@^2.0.3:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
- dependencies:
- browserslist "^1.5.2"
- caniuse-api "^1.5.2"
- postcss "^5.0.4"
- postcss-selector-parser "^2.2.2"
- vendors "^1.0.0"
-
-postcss-message-helpers@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
-
-postcss-minify-font-values@^1.0.2:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
- dependencies:
- object-assign "^4.0.1"
- postcss "^5.0.4"
- postcss-value-parser "^3.0.2"
-
-postcss-minify-gradients@^1.0.1:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
- dependencies:
- postcss "^5.0.12"
- postcss-value-parser "^3.3.0"
-
-postcss-minify-params@^1.0.4:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
- dependencies:
- alphanum-sort "^1.0.1"
- postcss "^5.0.2"
- postcss-value-parser "^3.0.2"
- uniqs "^2.0.0"
-
-postcss-minify-selectors@^2.0.4:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
- dependencies:
- alphanum-sort "^1.0.2"
- has "^1.0.1"
- postcss "^5.0.14"
- postcss-selector-parser "^2.0.0"
-
-postcss-modules-extract-imports@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
- dependencies:
- postcss "^6.0.1"
-
-postcss-modules-local-by-default@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
- dependencies:
- css-selector-tokenizer "^0.7.0"
- postcss "^6.0.1"
-
-postcss-modules-scope@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
- dependencies:
- css-selector-tokenizer "^0.7.0"
- postcss "^6.0.1"
-
-postcss-modules-values@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
- dependencies:
- icss-replace-symbols "^1.1.0"
- postcss "^6.0.1"
-
-postcss-normalize-charset@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
- dependencies:
- postcss "^5.0.5"
-
-postcss-normalize-url@^3.0.7:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
- dependencies:
- is-absolute-url "^2.0.0"
- normalize-url "^1.4.0"
- postcss "^5.0.14"
- postcss-value-parser "^3.2.3"
-
-postcss-ordered-values@^2.1.0:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
- dependencies:
- postcss "^5.0.4"
- postcss-value-parser "^3.0.1"
-
-postcss-reduce-idents@^2.2.2:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
- dependencies:
- postcss "^5.0.4"
- postcss-value-parser "^3.0.2"
-
-postcss-reduce-initial@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
- dependencies:
- postcss "^5.0.4"
-
-postcss-reduce-transforms@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
- dependencies:
- has "^1.0.1"
- postcss "^5.0.8"
- postcss-value-parser "^3.0.1"
-
-postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
- dependencies:
- flatten "^1.0.2"
- indexes-of "^1.0.1"
- uniq "^1.0.1"
-
-postcss-svgo@^2.1.1:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
- dependencies:
- is-svg "^2.0.0"
- postcss "^5.0.14"
- postcss-value-parser "^3.2.3"
- svgo "^0.7.0"
-
-postcss-unique-selectors@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
- dependencies:
- alphanum-sort "^1.0.1"
- postcss "^5.0.4"
- uniqs "^2.0.0"
-
-postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
-
-postcss-zindex@^2.0.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
- dependencies:
- has "^1.0.1"
- postcss "^5.0.4"
- uniqs "^2.0.0"
-
-postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
- version "5.2.18"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
- dependencies:
- chalk "^1.1.3"
- js-base64 "^2.1.9"
- source-map "^0.5.6"
- supports-color "^3.2.3"
-
-postcss@^6.0.1:
- version "6.0.19"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555"
- dependencies:
- chalk "^2.3.1"
- source-map "^0.6.1"
- supports-color "^5.2.0"
-
-prepend-http@^1.0.0:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
-
-preserve@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-
-process-nextick-args@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
-
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
-
-promise@^7.1.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
- dependencies:
- asap "~2.0.3"
-
-prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
- version "15.6.1"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
- dependencies:
- fbjs "^0.8.16"
- loose-envify "^1.3.1"
- object-assign "^4.1.1"
-
-proxy-addr@~2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
- dependencies:
- forwarded "~0.1.2"
- ipaddr.js "1.6.0"
-
-prr@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
-
-pseudomap@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
-
-public-encrypt@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
- dependencies:
- bn.js "^4.1.0"
- browserify-rsa "^4.0.0"
- create-hash "^1.1.0"
- parse-asn1 "^5.0.0"
- randombytes "^2.0.1"
-
-punycode@1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
-
-punycode@^1.2.4, punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
-
-q@^1.1.2:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
-
-qs@6.5.1:
- version "6.5.1"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
-
-qs@~6.4.0:
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
-
-query-string@^4.1.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
- dependencies:
- object-assign "^4.1.0"
- strict-uri-encode "^1.0.0"
-
-querystring-es3@^0.2.0:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
-
-querystring@0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
-
-querystringify@0.0.x:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c"
-
-querystringify@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb"
-
-randomatic@^1.1.3:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
- dependencies:
- is-number "^3.0.0"
- kind-of "^4.0.0"
-
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
- dependencies:
- safe-buffer "^5.1.0"
-
-randomfill@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
- dependencies:
- randombytes "^2.0.5"
- safe-buffer "^5.1.0"
-
-range-parser@^1.0.3, range-parser@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
-
-raw-body@2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
- dependencies:
- bytes "3.0.0"
- http-errors "1.6.2"
- iconv-lite "0.4.19"
- unpipe "1.0.0"
-
-raw-loader@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
-
-rc@^1.1.7:
- version "1.2.5"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd"
- dependencies:
- deep-extend "~0.4.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-react-addons-create-fragment@^15.4.0:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8"
- dependencies:
- fbjs "^0.8.4"
- loose-envify "^1.3.1"
- object-assign "^4.1.0"
-
-react-addons-transition-group@^15.4.0:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react-addons-transition-group/-/react-addons-transition-group-15.6.2.tgz#8baebc2ae91ccdbf245fe29c9fd3d36f8b471923"
- dependencies:
- react-transition-group "^1.2.0"
-
-react-dom@15.6.1:
- version "15.6.1"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.1.tgz#2cb0ed4191038e53c209eb3a79a23e2a4cf99470"
- dependencies:
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-react-dom@^15.5.4:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
- dependencies:
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-react-event-listener@^0.4.5:
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.4.5.tgz#e3e895a0970cf14ee8f890113af68197abf3d0b1"
- dependencies:
- babel-runtime "^6.20.0"
- fbjs "^0.8.4"
- prop-types "^15.5.4"
- warning "^3.0.0"
-
-react-highlight@0xproject/react-highlight:
- version "0.10.0"
- resolved "https://codeload.github.com/0xproject/react-highlight/tar.gz/83bbb4a09801abd341e2b9041cd884885a4a2098"
- dependencies:
- highlight.js "^9.11.0"
- highlightjs-solidity "^1.0.5"
- react "^15.5.4"
- react-dom "^15.5.4"
-
-react-markdown@^3.2.2:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.3.0.tgz#a87cdd822aa9302d6add9687961dd1a82a45d02e"
- dependencies:
- prop-types "^15.6.1"
- remark-parse "^5.0.0"
- unified "^6.1.5"
- unist-util-visit "^1.3.0"
- xtend "^4.0.1"
-
-react-scroll@^1.5.2:
- version "1.7.7"
- resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.7.7.tgz#948c40c9a189b62bf4a53ee0fd50e5d89d37260a"
- dependencies:
- lodash.throttle "^4.1.1"
- prop-types "^15.5.8"
-
-react-tap-event-plugin@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz#316beb3bc6556e29ec869a7293e89c826a9074d2"
- dependencies:
- fbjs "^0.8.6"
-
-react-tooltip@^3.2.7:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-3.4.0.tgz#037f38f797c3e6b1b58d2534ccc8c2c76af4f52d"
- dependencies:
- classnames "^2.2.5"
- prop-types "^15.6.0"
-
-react-transition-group@^1.2.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6"
- dependencies:
- chain-function "^1.0.0"
- dom-helpers "^3.2.0"
- loose-envify "^1.3.1"
- prop-types "^15.5.6"
- warning "^3.0.0"
-
-react@15.6.1:
- version "15.6.1"
- resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df"
- dependencies:
- create-react-class "^15.6.0"
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-react@^15.5.4:
- version "15.6.2"
- resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
- dependencies:
- create-react-class "^15.6.0"
- fbjs "^0.8.9"
- loose-envify "^1.1.0"
- object-assign "^4.1.0"
- prop-types "^15.5.10"
-
-read-pkg-up@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
- dependencies:
- find-up "^1.0.0"
- read-pkg "^1.0.0"
-
-read-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
- dependencies:
- find-up "^2.0.0"
- read-pkg "^2.0.0"
-
-read-pkg@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
- dependencies:
- load-json-file "^1.0.0"
- normalize-package-data "^2.3.2"
- path-type "^1.0.0"
-
-read-pkg@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
- dependencies:
- load-json-file "^2.0.0"
- normalize-package-data "^2.3.2"
- path-type "^2.0.0"
-
-readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.9, readable-stream@^2.3.3:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d"
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.0.3"
- util-deprecate "~1.0.1"
-
-readdirp@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
- dependencies:
- graceful-fs "^4.1.2"
- minimatch "^3.0.2"
- readable-stream "^2.0.2"
- set-immediate-shim "^1.0.1"
-
-rechoir@^0.6.2:
- version "0.6.2"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
- dependencies:
- resolve "^1.1.6"
-
-recompose@^0.23.0:
- version "0.23.5"
- resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.23.5.tgz#72ac8261246bec378235d187467d02a721e8b1de"
- dependencies:
- change-emitter "^0.1.2"
- fbjs "^0.8.1"
- hoist-non-react-statics "^1.0.0"
- symbol-observable "^1.0.4"
-
-redent@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
- dependencies:
- indent-string "^2.1.0"
- strip-indent "^1.0.1"
-
-reduce-css-calc@^1.2.6:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
- dependencies:
- balanced-match "^0.4.2"
- math-expression-evaluator "^1.2.14"
- reduce-function-call "^1.0.1"
-
-reduce-function-call@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
- dependencies:
- balanced-match "^0.4.2"
-
-regenerate@^1.2.1:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
-
-regenerator-runtime@^0.11.0:
- version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
-
-regex-cache@^0.4.2:
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
- dependencies:
- is-equal-shallow "^0.1.3"
-
-regex-not@^1.0.0, regex-not@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
- dependencies:
- extend-shallow "^3.0.2"
- safe-regex "^1.1.0"
-
-regexpu-core@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
- dependencies:
- regenerate "^1.2.1"
- regjsgen "^0.2.0"
- regjsparser "^0.1.4"
-
-regjsgen@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-
-regjsparser@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
- dependencies:
- jsesc "~0.5.0"
-
-remark-parse@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
- dependencies:
- collapse-white-space "^1.0.2"
- is-alphabetical "^1.0.0"
- is-decimal "^1.0.0"
- is-whitespace-character "^1.0.0"
- is-word-character "^1.0.0"
- markdown-escapes "^1.0.0"
- parse-entities "^1.1.0"
- repeat-string "^1.5.4"
- state-toggle "^1.0.0"
- trim "0.0.1"
- trim-trailing-lines "^1.0.0"
- unherit "^1.0.4"
- unist-util-remove-position "^1.0.0"
- vfile-location "^2.0.0"
- xtend "^4.0.1"
-
-remove-trailing-separator@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
-
-repeat-element@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
-
-repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-
-repeating@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
- dependencies:
- is-finite "^1.0.0"
-
-replace-ext@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
-
-request@2.81.0:
- version "2.81.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
- dependencies:
- aws-sign2 "~0.6.0"
- aws4 "^1.2.1"
- caseless "~0.12.0"
- combined-stream "~1.0.5"
- extend "~3.0.0"
- forever-agent "~0.6.1"
- form-data "~2.1.1"
- har-validator "~4.2.1"
- hawk "~3.1.3"
- http-signature "~1.1.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.7"
- oauth-sign "~0.8.1"
- performance-now "^0.2.0"
- qs "~6.4.0"
- safe-buffer "^5.0.1"
- stringstream "~0.0.4"
- tough-cookie "~2.3.0"
- tunnel-agent "^0.6.0"
- uuid "^3.0.0"
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
-
-require-main-filename@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
-
-requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
-
-resolve-cwd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
- dependencies:
- resolve-from "^3.0.0"
-
-resolve-from@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
-
-resolve-url@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
-
-resolve@^1.1.6, resolve@^1.3.2:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
- dependencies:
- path-parse "^1.0.5"
-
-ret@~0.1.10:
- version "0.1.15"
- resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
-
-right-align@^0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
- dependencies:
- align-text "^0.1.1"
-
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
- dependencies:
- glob "^7.0.5"
-
-ripemd160@^2.0.0, ripemd160@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
- dependencies:
- hash-base "^2.0.0"
- inherits "^2.0.1"
-
-safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
-
-safe-regex@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
- dependencies:
- ret "~0.1.10"
-
-sax@~1.2.1:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
-
-schema-utils@^0.4.3:
- version "0.4.5"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
- dependencies:
- ajv "^6.1.0"
- ajv-keywords "^3.1.0"
-
-select-hose@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
-
-selfsigned@^1.9.1:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758"
- dependencies:
- node-forge "0.7.1"
-
-"semver@2 || 3 || 4 || 5", semver@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
-
-send@0.16.1:
- version "0.16.1"
- resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
- dependencies:
- debug "2.6.9"
- depd "~1.1.1"
- destroy "~1.0.4"
- encodeurl "~1.0.1"
- escape-html "~1.0.3"
- etag "~1.8.1"
- fresh "0.5.2"
- http-errors "~1.6.2"
- mime "1.4.1"
- ms "2.0.0"
- on-finished "~2.3.0"
- range-parser "~1.2.0"
- statuses "~1.3.1"
-
-serve-index@^1.7.2:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
- dependencies:
- accepts "~1.3.4"
- batch "0.6.1"
- debug "2.6.9"
- escape-html "~1.0.3"
- http-errors "~1.6.2"
- mime-types "~2.1.17"
- parseurl "~1.3.2"
-
-serve-static@1.13.1:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
- dependencies:
- encodeurl "~1.0.1"
- escape-html "~1.0.3"
- parseurl "~1.3.2"
- send "0.16.1"
-
-set-blocking@^2.0.0, set-blocking@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
-
-set-getter@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
- dependencies:
- to-object-path "^0.3.0"
-
-set-immediate-shim@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
-
-set-value@^0.4.3:
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
- dependencies:
- extend-shallow "^2.0.1"
- is-extendable "^0.1.1"
- is-plain-object "^2.0.1"
- to-object-path "^0.3.0"
-
-set-value@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
- dependencies:
- extend-shallow "^2.0.1"
- is-extendable "^0.1.1"
- is-plain-object "^2.0.3"
- split-string "^3.0.1"
-
-setimmediate@^1.0.4, setimmediate@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
-
-setprototypeof@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
-
-setprototypeof@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
-
-sha.js@^2.4.0, sha.js@^2.4.8:
- version "2.4.10"
- resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b"
- dependencies:
- inherits "^2.0.1"
- safe-buffer "^5.0.1"
-
-shebang-command@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
- dependencies:
- shebang-regex "^1.0.0"
-
-shebang-regex@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
-
-shelljs@^0.7.3:
- version "0.7.8"
- resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
- dependencies:
- glob "^7.0.0"
- interpret "^1.0.0"
- rechoir "^0.6.2"
-
-shx@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/shx/-/shx-0.2.2.tgz#0a304d020b0edf1306ad81570e80f0346df58a39"
- dependencies:
- es6-object-assign "^1.0.3"
- minimist "^1.2.0"
- shelljs "^0.7.3"
-
-signal-exit@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
-
-simple-assign@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/simple-assign/-/simple-assign-0.1.0.tgz#17fd3066a5f3d7738f50321bb0f14ca281cc4baa"
-
-snapdragon-node@^2.0.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
- dependencies:
- define-property "^1.0.0"
- isobject "^3.0.0"
- snapdragon-util "^3.0.1"
-
-snapdragon-util@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
- dependencies:
- kind-of "^3.2.0"
-
-snapdragon@^0.8.1:
- version "0.8.1"
- resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370"
- dependencies:
- base "^0.11.1"
- debug "^2.2.0"
- define-property "^0.2.5"
- extend-shallow "^2.0.1"
- map-cache "^0.2.2"
- source-map "^0.5.6"
- source-map-resolve "^0.5.0"
- use "^2.0.0"
-
-sntp@1.x.x:
- version "1.0.9"
- resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
- dependencies:
- hoek "2.x.x"
-
-sockjs-client@1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12"
- dependencies:
- debug "^2.6.6"
- eventsource "0.1.6"
- faye-websocket "~0.11.0"
- inherits "^2.0.1"
- json3 "^3.3.2"
- url-parse "^1.1.8"
-
-sockjs@0.3.19:
- version "0.3.19"
- resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
- dependencies:
- faye-websocket "^0.10.0"
- uuid "^3.0.1"
-
-sort-keys@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
- dependencies:
- is-plain-obj "^1.0.0"
-
-source-list-map@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
-
-source-map-loader@^0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.3.tgz#d4b0c8cd47d54edce3e6bfa0f523f452b5b0e521"
- dependencies:
- async "^2.5.0"
- loader-utils "~0.2.2"
- source-map "~0.6.1"
-
-source-map-resolve@^0.5.0:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a"
- dependencies:
- atob "^2.0.0"
- decode-uri-component "^0.2.0"
- resolve-url "^0.2.1"
- source-map-url "^0.4.0"
- urix "^0.1.0"
-
-source-map-support@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76"
- dependencies:
- source-map "^0.6.0"
-
-source-map-url@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
-
-source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
-
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
-
-spdx-correct@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
- dependencies:
- spdx-expression-parse "^3.0.0"
- spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
-
-spdx-expression-parse@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
- dependencies:
- spdx-exceptions "^2.1.0"
- spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
-
-spdy-transport@^2.0.18:
- version "2.0.20"
- resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d"
- dependencies:
- debug "^2.6.8"
- detect-node "^2.0.3"
- hpack.js "^2.1.6"
- obuf "^1.1.1"
- readable-stream "^2.2.9"
- safe-buffer "^5.0.1"
- wbuf "^1.7.2"
-
-spdy@^3.4.1:
- version "3.4.7"
- resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
- dependencies:
- debug "^2.6.8"
- handle-thing "^1.2.5"
- http-deceiver "^1.2.7"
- safe-buffer "^5.0.1"
- select-hose "^2.0.0"
- spdy-transport "^2.0.18"
-
-split-string@^3.0.1, split-string@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
- dependencies:
- extend-shallow "^3.0.0"
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
-
-sshpk@^1.7.0:
- version "1.13.1"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
- dependencies:
- asn1 "~0.2.3"
- assert-plus "^1.0.0"
- dashdash "^1.12.0"
- getpass "^0.1.1"
- optionalDependencies:
- bcrypt-pbkdf "^1.0.0"
- ecc-jsbn "~0.1.1"
- jsbn "~0.1.0"
- tweetnacl "~0.14.0"
-
-state-toggle@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425"
-
-static-extend@^0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
- dependencies:
- define-property "^0.2.5"
- object-copy "^0.1.0"
-
-"statuses@>= 1.3.1 < 2":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
-
-statuses@~1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
-
-stream-browserify@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
- dependencies:
- inherits "~2.0.1"
- readable-stream "^2.0.2"
-
-stream-http@^2.7.2:
- version "2.8.0"
- resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10"
- dependencies:
- builtin-status-codes "^3.0.0"
- inherits "^2.0.1"
- readable-stream "^2.3.3"
- to-arraybuffer "^1.0.0"
- xtend "^4.0.0"
-
-strict-uri-encode@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
-
-string-width@^1.0.1, string-width@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
- dependencies:
- code-point-at "^1.0.0"
- is-fullwidth-code-point "^1.0.0"
- strip-ansi "^3.0.0"
-
-string-width@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
- dependencies:
- is-fullwidth-code-point "^2.0.0"
- strip-ansi "^4.0.0"
-
-string_decoder@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403"
- dependencies:
- safe-buffer "~5.1.0"
-
-string_decoder@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
- dependencies:
- safe-buffer "~5.1.0"
-
-stringstream@~0.0.4:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
-
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
- dependencies:
- ansi-regex "^2.0.0"
-
-strip-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
- dependencies:
- ansi-regex "^3.0.0"
-
-strip-bom@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
- dependencies:
- is-utf8 "^0.2.0"
-
-strip-bom@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
-
-strip-eof@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
-
-strip-indent@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
- dependencies:
- get-stdin "^4.0.1"
-
-strip-json-comments@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
-
-style-loader@^0.20.2:
- version "0.20.2"
- resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.2.tgz#851b373c187890331776e9cde359eea9c95ecd00"
- dependencies:
- loader-utils "^1.1.0"
- schema-utils "^0.4.3"
-
-supports-color@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-
-supports-color@^3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
- dependencies:
- has-flag "^1.0.0"
-
-supports-color@^4.2.1:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
- dependencies:
- has-flag "^2.0.0"
-
-supports-color@^5.1.0, supports-color@^5.2.0, supports-color@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
- dependencies:
- has-flag "^3.0.0"
-
-svgo@^0.7.0:
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
- dependencies:
- coa "~1.0.1"
- colors "~1.1.2"
- csso "~2.3.1"
- js-yaml "~3.7.0"
- mkdirp "~0.5.1"
- sax "~1.2.1"
- whet.extend "~0.9.9"
-
-symbol-observable@^1.0.4:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
-
-tapable@^0.2.5, tapable@^0.2.7:
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
-
-tar-pack@^3.4.0:
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
- dependencies:
- debug "^2.2.0"
- fstream "^1.0.10"
- fstream-ignore "^1.0.5"
- once "^1.3.3"
- readable-stream "^2.1.4"
- rimraf "^2.5.1"
- tar "^2.2.1"
- uid-number "^0.0.6"
-
-tar@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
- dependencies:
- block-stream "*"
- fstream "^1.0.2"
- inherits "2"
-
-thunky@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371"
-
-time-stamp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
-
-timers-browserify@^2.0.4:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
- dependencies:
- setimmediate "^1.0.4"
-
-to-arraybuffer@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
-
-to-object-path@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
- dependencies:
- kind-of "^3.0.2"
-
-to-regex-range@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
- dependencies:
- is-number "^3.0.0"
- repeat-string "^1.6.1"
-
-to-regex@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
- dependencies:
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- regex-not "^1.0.2"
- safe-regex "^1.1.0"
-
-tough-cookie@~2.3.0:
- version "2.3.4"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
- dependencies:
- punycode "^1.4.1"
-
-trim-newlines@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
-
-trim-trailing-lines@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684"
-
-trim@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
-
-trough@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86"
-
-tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
-
-tslint-eslint-rules@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba"
- dependencies:
- doctrine "^0.7.2"
- tslib "^1.0.0"
- tsutils "^1.4.0"
-
-tslint-react@^3.2.0:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/tslint-react/-/tslint-react-3.5.1.tgz#a5ca48034bf583fb63b42763bb89fa23062d5390"
- dependencies:
- tsutils "^2.13.1"
-
-tslint@5.8.0:
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13"
- dependencies:
- babel-code-frame "^6.22.0"
- builtin-modules "^1.1.1"
- chalk "^2.1.0"
- commander "^2.9.0"
- diff "^3.2.0"
- glob "^7.1.1"
- minimatch "^3.0.4"
- resolve "^1.3.2"
- semver "^5.3.0"
- tslib "^1.7.1"
- tsutils "^2.12.1"
-
-tslint@^5.9.1:
- version "5.9.1"
- resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.9.1.tgz#1255f87a3ff57eb0b0e1f0e610a8b4748046c9ae"
- dependencies:
- babel-code-frame "^6.22.0"
- builtin-modules "^1.1.1"
- chalk "^2.3.0"
- commander "^2.12.1"
- diff "^3.2.0"
- glob "^7.1.1"
- js-yaml "^3.7.0"
- minimatch "^3.0.4"
- resolve "^1.3.2"
- semver "^5.3.0"
- tslib "^1.8.0"
- tsutils "^2.12.1"
-
-tsutils@^1.4.0:
- version "1.9.1"
- resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0"
-
-tsutils@^2.12.1, tsutils@^2.13.1:
- version "2.22.2"
- resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.22.2.tgz#0b9f3d87aa3eb95bd32d26ce2b88aa329a657951"
- dependencies:
- tslib "^1.8.1"
-
-tty-browserify@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
-
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- dependencies:
- safe-buffer "^5.0.1"
-
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
-
-type-is@~1.6.15:
- version "1.6.16"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
- dependencies:
- media-typer "0.3.0"
- mime-types "~2.1.18"
-
-typescript@2.7.1:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.1.tgz#bb3682c2c791ac90e7c6210b26478a8da085c359"
-
-ua-parser-js@^0.7.9:
- version "0.7.17"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
-
-uglify-js@^2.8.29:
- version "2.8.29"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
- dependencies:
- source-map "~0.5.1"
- yargs "~3.10.0"
- optionalDependencies:
- uglify-to-browserify "~1.0.0"
-
-uglify-to-browserify@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
-
-uglifyjs-webpack-plugin@^0.4.6:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
- dependencies:
- source-map "^0.5.6"
- uglify-js "^2.8.29"
- webpack-sources "^1.0.1"
-
-uid-number@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
-
-unherit@^1.0.4:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d"
- dependencies:
- inherits "^2.0.1"
- xtend "^4.0.1"
-
-unified@^6.1.5:
- version "6.1.6"
- resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1"
- dependencies:
- bail "^1.0.0"
- extend "^3.0.0"
- is-plain-obj "^1.1.0"
- trough "^1.0.0"
- vfile "^2.0.0"
- x-is-function "^1.0.4"
- x-is-string "^0.1.0"
-
-union-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
- dependencies:
- arr-union "^3.1.0"
- get-value "^2.0.6"
- is-extendable "^0.1.1"
- set-value "^0.4.3"
-
-uniq@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
-
-uniqid@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
- dependencies:
- macaddress "^0.2.8"
-
-uniqs@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
-
-unist-util-is@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b"
-
-unist-util-remove-position@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb"
- dependencies:
- unist-util-visit "^1.1.0"
-
-unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c"
-
-unist-util-visit@^1.1.0, unist-util-visit@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444"
- dependencies:
- unist-util-is "^2.1.1"
-
-unpipe@1.0.0, unpipe@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
-
-unset-value@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
- dependencies:
- has-value "^0.3.1"
- isobject "^3.0.0"
-
-upath@^1.0.0:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
-
-urix@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
-
-url-parse@1.0.x:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b"
- dependencies:
- querystringify "0.0.x"
- requires-port "1.0.x"
-
-url-parse@^1.1.8:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
- dependencies:
- querystringify "~1.0.0"
- requires-port "~1.0.0"
-
-url@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
- dependencies:
- punycode "1.3.2"
- querystring "0.2.0"
-
-use@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"
- dependencies:
- define-property "^0.2.5"
- isobject "^3.0.0"
- lazy-cache "^2.0.2"
-
-util-deprecate@~1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
-
-util@0.10.3, util@^0.10.3:
- version "0.10.3"
- resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
- dependencies:
- inherits "2.0.1"
-
-utils-merge@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
-
-uuid@^3.0.0, uuid@^3.0.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
-
-validate-npm-package-license@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
- dependencies:
- spdx-correct "^3.0.0"
- spdx-expression-parse "^3.0.0"
-
-vary@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
-
-vendors@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-vfile-location@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255"
-
-vfile-message@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359"
- dependencies:
- unist-util-stringify-position "^1.1.1"
-
-vfile@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a"
- dependencies:
- is-buffer "^1.1.4"
- replace-ext "1.0.0"
- unist-util-stringify-position "^1.0.0"
- vfile-message "^1.0.0"
-
-vm-browserify@0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
- dependencies:
- indexof "0.0.1"
-
-warning@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
- dependencies:
- loose-envify "^1.0.0"
-
-watchpack@^1.4.0:
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed"
- dependencies:
- chokidar "^2.0.2"
- graceful-fs "^4.1.2"
- neo-async "^2.5.0"
-
-wbuf@^1.1.0, wbuf@^1.7.2:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe"
- dependencies:
- minimalistic-assert "^1.0.0"
-
-webpack-dev-middleware@1.12.2:
- version "1.12.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
- dependencies:
- memory-fs "~0.4.1"
- mime "^1.5.0"
- path-is-absolute "^1.0.0"
- range-parser "^1.0.3"
- time-stamp "^2.0.0"
-
-webpack-dev-server@^2.11.1:
- version "2.11.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz#1f4f4c78bf1895378f376815910812daf79a216f"
- dependencies:
- ansi-html "0.0.7"
- array-includes "^3.0.3"
- bonjour "^3.5.0"
- chokidar "^2.0.0"
- compression "^1.5.2"
- connect-history-api-fallback "^1.3.0"
- debug "^3.1.0"
- del "^3.0.0"
- express "^4.16.2"
- html-entities "^1.2.0"
- http-proxy-middleware "~0.17.4"
- import-local "^1.0.0"
- internal-ip "1.2.0"
- ip "^1.1.5"
- killable "^1.0.0"
- loglevel "^1.4.1"
- opn "^5.1.0"
- portfinder "^1.0.9"
- selfsigned "^1.9.1"
- serve-index "^1.7.2"
- sockjs "0.3.19"
- sockjs-client "1.1.4"
- spdy "^3.4.1"
- strip-ansi "^3.0.0"
- supports-color "^5.1.0"
- webpack-dev-middleware "1.12.2"
- yargs "6.6.0"
-
-webpack-sources@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
- dependencies:
- source-list-map "^2.0.0"
- source-map "~0.6.1"
-
-webpack@^3.11.0:
- version "3.11.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
- dependencies:
- acorn "^5.0.0"
- acorn-dynamic-import "^2.0.0"
- ajv "^6.1.0"
- ajv-keywords "^3.1.0"
- async "^2.1.2"
- enhanced-resolve "^3.4.0"
- escope "^3.6.0"
- interpret "^1.0.0"
- json-loader "^0.5.4"
- json5 "^0.5.1"
- loader-runner "^2.3.0"
- loader-utils "^1.1.0"
- memory-fs "~0.4.1"
- mkdirp "~0.5.0"
- node-libs-browser "^2.0.0"
- source-map "^0.5.3"
- supports-color "^4.2.1"
- tapable "^0.2.7"
- uglifyjs-webpack-plugin "^0.4.6"
- watchpack "^1.4.0"
- webpack-sources "^1.0.1"
- yargs "^8.0.2"
-
-websocket-driver@>=0.5.1:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
- dependencies:
- http-parser-js ">=0.4.0"
- websocket-extensions ">=0.1.1"
-
-websocket-extensions@>=0.1.1:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
-
-whatwg-fetch@>=0.10.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
-
-whet.extend@~0.9.9:
- version "0.9.9"
- resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
-
-which-module@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
-
-which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
-
-which@^1.2.9:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
- dependencies:
- string-width "^1.0.2"
-
-window-size@0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
-
-wordwrap@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
-
-wrap-ansi@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
- dependencies:
- string-width "^1.0.1"
- strip-ansi "^3.0.1"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
-
-x-is-function@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"
-
-x-is-string@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
-
-xtend@^4.0.0, xtend@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
-
-y18n@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
-
-yallist@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
-
-yargs-parser@^4.2.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
- dependencies:
- camelcase "^3.0.0"
-
-yargs-parser@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
- dependencies:
- camelcase "^4.1.0"
-
-yargs@6.6.0:
- version "6.6.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
- dependencies:
- camelcase "^3.0.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^1.4.0"
- read-pkg-up "^1.0.1"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^1.0.2"
- which-module "^1.0.0"
- y18n "^3.2.1"
- yargs-parser "^4.2.0"
-
-yargs@^8.0.2:
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
- dependencies:
- camelcase "^4.1.0"
- cliui "^3.2.0"
- decamelize "^1.1.1"
- get-caller-file "^1.0.1"
- os-locale "^2.0.0"
- read-pkg-up "^2.0.0"
- require-directory "^2.1.1"
- require-main-filename "^1.0.1"
- set-blocking "^2.0.0"
- string-width "^2.0.0"
- which-module "^2.0.0"
- y18n "^3.2.1"
- yargs-parser "^7.0.0"
-
-yargs@~3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
- dependencies:
- camelcase "^1.0.2"
- cliui "^2.1.0"
- decamelize "^1.0.0"
- window-size "0.1.0"
diff --git a/packages/react-docs/CHANGELOG.json b/packages/react-docs/CHANGELOG.json
index 5131bdbe4..2b83b7fae 100644
--- a/packages/react-docs/CHANGELOG.json
+++ b/packages/react-docs/CHANGELOG.json
@@ -1,5 +1,177 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.17",
+ "changes": [
+ {
+ "note": "Nest MD files under versions so that you can update them for future versions",
+ "pr": 844
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.0.16",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.0.15",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.13",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.0.12",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525466747,
+ "version": "0.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Added support for rendering default param values",
+ "pr": 519
+ },
+ {
+ "note": "Added support for rendering nested function types within interface types",
+ "pr": 519
+ },
+ {
+ "note": "Improve type comment rendering",
+ "pr": 535
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.0.5",
"changes": [
{
@@ -22,8 +194,7 @@
"pr": 465
}
],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
},
{
"version": "0.0.3",
@@ -33,8 +204,7 @@
"Move TS typings from devDependencies to dependencies since they are needed by the package user."
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.0.2",
@@ -47,7 +217,6 @@
"pr": 452
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
}
]
diff --git a/packages/react-docs/CHANGELOG.md b/packages/react-docs/CHANGELOG.md
index c9d2680ea..38d2451dd 100644
--- a/packages/react-docs/CHANGELOG.md
+++ b/packages/react-docs/CHANGELOG.md
@@ -1,10 +1,84 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.17 - _July 18, 2018_
+
+ * Nest MD files under versions so that you can update them for future versions (#844)
+
+## v0.0.16 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.15 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.0.14 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.13 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.0.12 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.11 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.10 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.9 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.8 - _April 18, 2018_
+
+ * Added support for rendering default param values (#519)
+ * Added support for rendering nested function types within interface types (#519)
+ * Improve type comment rendering (#535)
+
+## v0.0.7 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.0.6 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.0.5 - _April 2, 2018_
* Handle `reflection` type rendering so that anonymous function type declarations render properly (#465)
@@ -12,11 +86,11 @@ CHANGELOG
* Rename `MethodBlock` to `SignatureBlock` since it is not used to render method and function signature blocks. (#465)
* Add support for documenting exported functions. (#465)
-## v0.0.3 - _March 18, 2018_
+## v0.0.3 - _March 17, 2018_
* Move TS typings from devDependencies to dependencies since they are needed by the package user.
-## v0.0.2 - _March 18, 2018_
+## v0.0.2 - _March 17, 2018_
* Move example out into a separate sub-package
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
diff --git a/packages/react-docs/README.md b/packages/react-docs/README.md
index 9be370f10..c0efc4a0b 100644
--- a/packages/react-docs/README.md
+++ b/packages/react-docs/README.md
@@ -51,11 +51,11 @@ Feel free to contribute to these improvements!
## Contributing
-We strongly encourage the community to help us make improvements. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -71,8 +71,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/react-docs yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/react-docs yarn watch
+```
+
+### Clean
+
```bash
-yarn build
+yarn clean
```
### Lint
diff --git a/packages/react-docs/package.json b/packages/react-docs/package.json
index 15e6a10d5..e24ed8e6f 100644
--- a/packages/react-docs/package.json
+++ b/packages/react-docs/package.json
@@ -1,13 +1,16 @@
{
"name": "@0xproject/react-docs",
- "version": "0.0.5",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "React documentation component for rendering TypeDoc & Doxity generated JSON",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "lint": "tslint --project . 'src/**/*.ts' 'src/**/*.tsx'",
+ "lint": "tslint --project .",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"clean": "shx rm -rf lib scripts",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
@@ -22,34 +25,35 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/dev-utils": "^0.3.3",
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/compare-versions": "^3.0.0",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
"tslint": "^5.9.1",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/react-shared": "^0.1.0",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/react-shared": "^1.0.6",
+ "@0xproject/utils": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
- "@types/react": "^16.0.34",
- "@types/react-dom": "^16.0.3",
+ "@types/react": "*",
+ "@types/react-dom": "*",
"@types/react-scroll": "0.0.31",
- "@types/react-tap-event-plugin": "0.0.30",
"basscss": "^8.0.3",
"compare-versions": "^3.0.1",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"material-ui": "^0.17.1",
"react": "15.6.1",
"react-dom": "15.6.1",
"react-markdown": "^3.2.2",
"react-scroll": "^1.5.2",
- "react-tap-event-plugin": "^2.0.1",
- "react-tooltip": "^3.2.7"
+ "react-tooltip": "^3.2.7",
+ "semver": "5.5.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/react-docs/src/components/badge.tsx b/packages/react-docs/src/components/badge.tsx
index b342f2dca..d34f8a0fc 100644
--- a/packages/react-docs/src/components/badge.tsx
+++ b/packages/react-docs/src/components/badge.tsx
@@ -1,5 +1,4 @@
import { Styles } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
const styles: Styles = {
@@ -31,7 +30,7 @@ export class Badge extends React.Component<BadgeProps, BadgeState> {
isHovering: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const badgeStyle = {
...styles.badge,
backgroundColor: this.props.backgroundColor,
@@ -48,7 +47,7 @@ export class Badge extends React.Component<BadgeProps, BadgeState> {
</div>
);
}
- private _setHoverState(isHovering: boolean) {
+ private _setHoverState(isHovering: boolean): void {
this.setState({
isHovering,
});
diff --git a/packages/react-docs/src/components/comment.tsx b/packages/react-docs/src/components/comment.tsx
index 0d63d4d31..c3687c510 100644
--- a/packages/react-docs/src/components/comment.tsx
+++ b/packages/react-docs/src/components/comment.tsx
@@ -1,5 +1,4 @@
import { MarkdownCodeBlock } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
import * as ReactMarkdown from 'react-markdown';
diff --git a/packages/react-docs/src/components/custom_enum.tsx b/packages/react-docs/src/components/custom_enum.tsx
index 1fe55eedc..c4252d9e2 100644
--- a/packages/react-docs/src/components/custom_enum.tsx
+++ b/packages/react-docs/src/components/custom_enum.tsx
@@ -3,7 +3,6 @@ import * as _ from 'lodash';
import * as React from 'react';
import { CustomType } from '../types';
-import { utils } from '../utils/utils';
const STRING_ENUM_CODE_PREFIX = ' strEnum(';
@@ -14,7 +13,7 @@ export interface CustomEnumProps {
// This component renders custom string enums that was a work-around for versions of
// TypeScript <2.4.0 that did not support them natively. We keep it around to support
// older versions of 0x.js <0.9.0
-export function CustomEnum(props: CustomEnumProps) {
+export const CustomEnum = (props: CustomEnumProps) => {
const type = props.type;
if (!_.startsWith(type.defaultValue, STRING_ENUM_CODE_PREFIX)) {
logUtils.log('We do not yet support `Variable` types that are not strEnums');
@@ -31,4 +30,4 @@ export function CustomEnum(props: CustomEnumProps) {
{`}`}
</span>
);
-}
+};
diff --git a/packages/react-docs/src/components/documentation.tsx b/packages/react-docs/src/components/documentation.tsx
index 14fe175cf..ff33220d2 100644
--- a/packages/react-docs/src/components/documentation.tsx
+++ b/packages/react-docs/src/components/documentation.tsx
@@ -3,7 +3,6 @@ import {
constants as sharedConstants,
EtherscanLinkSuffixes,
MarkdownSection,
- MenuSubsectionsBySection,
NestedSidebarMenu,
Networks,
SectionHeader,
@@ -13,13 +12,12 @@ import {
import * as _ from 'lodash';
import CircularProgress from 'material-ui/CircularProgress';
import * as React from 'react';
-import { scroller } from 'react-scroll';
+import * as semver from 'semver';
import { DocsInfo } from '../docs_info';
import {
AddressByContractName,
DocAgnosticFormat,
- DoxityDocObj,
Event,
Property,
SolidityMethod,
@@ -29,7 +27,6 @@ import {
TypescriptMethod,
} from '../types';
import { constants } from '../utils/constants';
-import { utils } from '../utils/utils';
import { Badge } from './badge';
import { Comment } from './comment';
@@ -71,19 +68,19 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
isHoveringSidebar: false,
};
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.addEventListener('hashchange', this._onHashChanged.bind(this), false);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
window.removeEventListener('hashchange', this._onHashChanged.bind(this), false);
}
- public componentDidUpdate(prevProps: DocumentationProps, prevState: DocumentationState) {
+ public componentDidUpdate(prevProps: DocumentationProps, _prevState: DocumentationState): void {
if (!_.isEqual(prevProps.docAgnosticFormat, this.props.docAgnosticFormat)) {
const hash = window.location.hash.slice(1);
sharedUtils.scrollToHash(hash, sharedConstants.SCROLL_CONTAINER_ID);
}
}
- public render() {
+ public render(): React.ReactNode {
const styles: Styles = {
mainContainers: {
position: 'absolute',
@@ -91,7 +88,7 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
left: 0,
bottom: 0,
right: 0,
- overflowZ: 'hidden',
+ overflowX: 'hidden',
overflowY: 'scroll',
minHeight: `calc(100vh - ${this.props.topBarHeight}px)`,
WebkitOverflowScrolling: 'touch',
@@ -157,7 +154,7 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
</div>
);
}
- private _renderLoading(mainContainersStyles: React.CSSProperties) {
+ private _renderLoading(mainContainersStyles: React.CSSProperties): React.ReactNode {
return (
<div className="col col-12" style={mainContainersStyles}>
<div
@@ -184,7 +181,20 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
return renderedSections;
}
private _renderSection(typeDefinitionByName: TypeDefinitionByName, sectionName: string): React.ReactNode {
- const markdownFileIfExists = this.props.docsInfo.sectionNameToMarkdown[sectionName];
+ const markdownVersions = _.keys(this.props.docsInfo.sectionNameToMarkdownByVersion);
+ const eligibleVersions = _.filter(markdownVersions, mdVersion => {
+ return semver.lte(mdVersion, this.props.selectedVersion);
+ });
+ if (_.isEmpty(eligibleVersions)) {
+ throw new Error(
+ `No eligible markdown sections found for ${this.props.docsInfo.displayName} version ${
+ this.props.selectedVersion
+ }.`,
+ );
+ }
+ const sortedEligibleVersions = eligibleVersions.sort(semver.rcompare.bind(semver));
+ const closestVersion = sortedEligibleVersions[0];
+ const markdownFileIfExists = this.props.docsInfo.sectionNameToMarkdownByVersion[closestVersion][sectionName];
if (!_.isUndefined(markdownFileIfExists)) {
return (
<MarkdownSection
@@ -289,7 +299,7 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
</div>
);
}
- private _renderNetworkBadgesIfExists(sectionName: string) {
+ private _renderNetworkBadgesIfExists(sectionName: string): React.ReactNode {
if (this.props.docsInfo.type !== SupportedDocJson.Doxity) {
return null;
}
@@ -337,7 +347,7 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
return (
<div key={`property-${property.name}-${property.type.name}`} className="pb3">
<code className={`hljs ${constants.TYPE_TO_SYNTAX[this.props.docsInfo.type]}`}>
- {property.name}:
+ {property.name}:{' '}
<Type type={property.type} sectionName={sectionName} docsInfo={this.props.docsInfo} />
</code>
{property.source && (
@@ -368,17 +378,17 @@ export class Documentation extends React.Component<DocumentationProps, Documenta
/>
);
}
- private _onSidebarHover(event: React.FormEvent<HTMLInputElement>) {
+ private _onSidebarHover(_event: React.FormEvent<HTMLInputElement>): void {
this.setState({
isHoveringSidebar: true,
});
}
- private _onSidebarHoverOff() {
+ private _onSidebarHoverOff(): void {
this.setState({
isHoveringSidebar: false,
});
}
- private _onHashChanged(event: any) {
+ private _onHashChanged(_event: any): void {
const hash = window.location.hash.slice(1);
sharedUtils.scrollToHash(hash, sharedConstants.SCROLL_CONTAINER_ID);
}
diff --git a/packages/react-docs/src/components/enum.tsx b/packages/react-docs/src/components/enum.tsx
index 37f82f26e..dee866790 100644
--- a/packages/react-docs/src/components/enum.tsx
+++ b/packages/react-docs/src/components/enum.tsx
@@ -7,8 +7,8 @@ export interface EnumProps {
values: EnumValue[];
}
-export function Enum(props: EnumProps) {
- const values = _.map(props.values, (value, i) => {
+export const Enum = (props: EnumProps) => {
+ const values = _.map(props.values, value => {
const defaultValueIfAny = !_.isUndefined(value.defaultValue) ? ` = ${value.defaultValue}` : '';
return `\n\t${value.name}${defaultValueIfAny},`;
});
@@ -20,4 +20,4 @@ export function Enum(props: EnumProps) {
{`}`}
</span>
);
-}
+};
diff --git a/packages/react-docs/src/components/event_definition.tsx b/packages/react-docs/src/components/event_definition.tsx
index 67729ac87..b4dc729a9 100644
--- a/packages/react-docs/src/components/event_definition.tsx
+++ b/packages/react-docs/src/components/event_definition.tsx
@@ -24,7 +24,7 @@ export class EventDefinition extends React.Component<EventDefinitionProps, Event
shouldShowAnchor: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const event = this.props.event;
const id = `${this.props.sectionName}-${event.name}`;
return (
@@ -49,7 +49,7 @@ export class EventDefinition extends React.Component<EventDefinitionProps, Event
</div>
);
}
- private _renderEventCode() {
+ private _renderEventCode(): React.ReactNode {
const indexed = <span style={{ color: colors.green }}> indexed</span>;
const eventArgs = _.map(this.props.event.eventArgs, (eventArg: EventArg) => {
const type = (
@@ -76,7 +76,7 @@ export class EventDefinition extends React.Component<EventDefinitionProps, Event
</span>
);
}
- private _setAnchorVisibility(shouldShowAnchor: boolean) {
+ private _setAnchorVisibility(shouldShowAnchor: boolean): void {
this.setState({
shouldShowAnchor,
});
diff --git a/packages/react-docs/src/components/interface.tsx b/packages/react-docs/src/components/interface.tsx
index 541e164e3..a881c7fec 100644
--- a/packages/react-docs/src/components/interface.tsx
+++ b/packages/react-docs/src/components/interface.tsx
@@ -13,13 +13,13 @@ export interface InterfaceProps {
docsInfo: DocsInfo;
}
-export function Interface(props: InterfaceProps) {
+export const Interface = (props: InterfaceProps) => {
const type = props.type;
const properties = _.map(type.children, property => {
return (
<span key={`property-${property.name}-${property.type}-${type.name}`}>
{property.name}:{' '}
- {property.type.typeDocType !== TypeDocTypes.Reflection ? (
+ {property.type && property.type.typeDocType !== TypeDocTypes.Reflection ? (
<Type type={property.type} sectionName={props.sectionName} docsInfo={props.docsInfo} />
) : (
<Signature
@@ -27,7 +27,6 @@ export function Interface(props: InterfaceProps) {
returnType={property.type.method.returnType}
parameters={property.type.method.parameters}
typeParameter={property.type.method.typeParameter}
- callPath={property.type.method.callPath}
sectionName={props.sectionName}
shouldHideMethodName={true}
shouldUseArrowSyntax={true}
@@ -64,4 +63,4 @@ export function Interface(props: InterfaceProps) {
{`}`}
</span>
);
-}
+};
diff --git a/packages/react-docs/src/components/signature.tsx b/packages/react-docs/src/components/signature.tsx
index 83fb1e246..77e9cc909 100644
--- a/packages/react-docs/src/components/signature.tsx
+++ b/packages/react-docs/src/components/signature.tsx
@@ -1,6 +1,5 @@
import * as _ from 'lodash';
import * as React from 'react';
-import * as ReactDOM from 'react-dom';
import { DocsInfo } from '../docs_info';
import { Parameter, Type as TypeDef, TypeDefinitionByName, TypeParameter } from '../types';
@@ -88,9 +87,10 @@ function renderParameters(
docsInfo: DocsInfo,
sectionName: string,
typeDefinitionByName?: TypeDefinitionByName,
-) {
+): React.ReactNode[] {
const params = _.map(parameters, (p: Parameter) => {
const isOptional = p.isOptional;
+ const hasDefaultValue = !_.isUndefined(p.defaultValue);
const type = (
<Type
type={p.type}
@@ -103,6 +103,7 @@ function renderParameters(
<span key={`param-${p.type}-${p.name}`}>
{p.name}
{isOptional && '?'}: {type}
+ {hasDefaultValue && ` = ${p.defaultValue}`}
</span>
);
});
@@ -114,7 +115,7 @@ function renderTypeParameter(
docsInfo: DocsInfo,
sectionName: string,
typeDefinitionByName?: TypeDefinitionByName,
-) {
+): React.ReactNode {
const typeParam = (
<span>
{`<${typeParameter.name} extends `}
diff --git a/packages/react-docs/src/components/signature_block.tsx b/packages/react-docs/src/components/signature_block.tsx
index 6475d3995..9e5198e16 100644
--- a/packages/react-docs/src/components/signature_block.tsx
+++ b/packages/react-docs/src/components/signature_block.tsx
@@ -42,7 +42,7 @@ export class SignatureBlock extends React.Component<SignatureBlockProps, Signatu
shouldShowAnchor: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const method = this.props.method;
if (typeDocUtils.isPrivateOrProtectedProperty(method.name)) {
return null;
@@ -111,14 +111,14 @@ export class SignatureBlock extends React.Component<SignatureBlockProps, Signatu
</div>
);
}
- private _renderChip(text: string) {
+ private _renderChip(text: string): React.ReactNode {
return (
<div className="p1 mr1" style={styles.chip}>
{text}
</div>
);
}
- private _renderParameterDescriptions(parameters: Parameter[]) {
+ private _renderParameterDescriptions(parameters: Parameter[]): React.ReactNode {
const descriptions = _.map(parameters, parameter => {
const isOptional = parameter.isOptional;
return (
@@ -146,7 +146,7 @@ export class SignatureBlock extends React.Component<SignatureBlockProps, Signatu
});
return descriptions;
}
- private _setAnchorVisibility(shouldShowAnchor: boolean) {
+ private _setAnchorVisibility(shouldShowAnchor: boolean): void {
this.setState({
shouldShowAnchor,
});
diff --git a/packages/react-docs/src/components/source_link.tsx b/packages/react-docs/src/components/source_link.tsx
index 89956a507..c60435ea6 100644
--- a/packages/react-docs/src/components/source_link.tsx
+++ b/packages/react-docs/src/components/source_link.tsx
@@ -1,5 +1,4 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
import { Source } from '../types';
@@ -10,7 +9,7 @@ export interface SourceLinkProps {
version: string;
}
-export function SourceLink(props: SourceLinkProps) {
+export const SourceLink = (props: SourceLinkProps) => {
const src = props.source;
const sourceCodeUrl = `${props.sourceUrl}/${src.fileName}#L${src.line}`;
return (
@@ -20,4 +19,4 @@ export function SourceLink(props: SourceLinkProps) {
</a>
</div>
);
-}
+};
diff --git a/packages/react-docs/src/components/type.tsx b/packages/react-docs/src/components/type.tsx
index fd4562ce3..e453349ef 100644
--- a/packages/react-docs/src/components/type.tsx
+++ b/packages/react-docs/src/components/type.tsx
@@ -1,4 +1,5 @@
import { colors, constants as sharedConstants, utils as sharedUtils } from '@0xproject/react-shared';
+import { errorUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import * as React from 'react';
import { Link as ScrollLink } from 'react-scroll';
@@ -6,22 +7,10 @@ import * as ReactTooltip from 'react-tooltip';
import { DocsInfo } from '../docs_info';
import { Type as TypeDef, TypeDefinitionByName, TypeDocTypes } from '../types';
-import { constants } from '../utils/constants';
-import { utils } from '../utils/utils';
import { Signature } from './signature';
import { TypeDefinition } from './type_definition';
-const typeToSection: { [typeName: string]: string } = {
- ExchangeWrapper: 'exchange',
- TokenWrapper: 'token',
- TokenRegistryWrapper: 'tokenRegistry',
- EtherTokenWrapper: 'etherToken',
- ProxyWrapper: 'proxy',
- TokenTransferProxyWrapper: 'proxy',
- OrderStateWatcher: 'orderWatcher',
-};
-
export interface TypeProps {
type: TypeDef;
docsInfo: DocsInfo;
@@ -109,7 +98,6 @@ export function Type(props: TypeProps): any {
returnType={type.method.returnType}
parameters={type.method.parameters}
typeParameter={type.method.typeParameter}
- callPath={type.method.callPath}
sectionName={props.sectionName}
shouldHideMethodName={true}
shouldUseArrowSyntax={true}
@@ -141,7 +129,7 @@ export function Type(props: TypeProps): any {
break;
default:
- throw utils.spawnSwitchErr('type.typeDocType', type.typeDocType);
+ throw errorUtils.spawnSwitchErr('type.typeDocType', type.typeDocType);
}
// HACK: Normalize BigNumber to simply BigNumber. For some reason the type
// name is unpredictably one or the other.
diff --git a/packages/react-docs/src/components/type_definition.tsx b/packages/react-docs/src/components/type_definition.tsx
index 7a1c86da5..c4bd7359a 100644
--- a/packages/react-docs/src/components/type_definition.tsx
+++ b/packages/react-docs/src/components/type_definition.tsx
@@ -1,11 +1,11 @@
import { AnchorTitle, colors, HeaderSizes } from '@0xproject/react-shared';
+import { errorUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import * as React from 'react';
import { DocsInfo } from '../docs_info';
import { CustomType, CustomTypeChild, KindString, TypeDocTypes } from '../types';
import { constants } from '../utils/constants';
-import { utils } from '../utils/utils';
import { Comment } from './comment';
import { CustomEnum } from './custom_enum';
@@ -35,7 +35,7 @@ export class TypeDefinition extends React.Component<TypeDefinitionProps, TypeDef
shouldShowAnchor: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const customType = this.props.customType;
if (!this.props.docsInfo.isPublicType(customType.name)) {
return null; // no-op
@@ -96,7 +96,7 @@ export class TypeDefinition extends React.Component<TypeDefinitionProps, TypeDef
break;
default:
- throw utils.spawnSwitchErr('type.kindString', customType.kindString);
+ throw errorUtils.spawnSwitchErr('type.kindString', customType.kindString);
}
const typeDefinitionAnchorId = `${this.props.sectionName}-${customType.name}`;
@@ -122,14 +122,55 @@ export class TypeDefinition extends React.Component<TypeDefinitionProps, TypeDef
</pre>
</div>
<div style={{ maxWidth: 620 }}>
- {customType.comment && <Comment comment={customType.comment} className="py2" />}
+ {customType.comment && (
+ <Comment comment={this._formatComment(customType.comment)} className="py2" />
+ )}
</div>
</div>
);
}
- private _setAnchorVisibility(shouldShowAnchor: boolean) {
+ private _setAnchorVisibility(shouldShowAnchor: boolean): void {
this.setState({
shouldShowAnchor,
});
}
+ /**
+ * Type definition comments usually describe the type as a whole or the individual
+ * properties within the type. Since TypeDoc just treats these comments simply as
+ * one paragraph, we do some additional formatting so that we can display individual
+ * property comments on their own lines.
+ * E.g:
+ * Interface SomeConfig
+ * {
+ * networkId: number,
+ * derivationPath: string,
+ * }
+ * networkId: The ethereum networkId to set as the chainId from EIP155
+ * derivationPath: Initial derivation path to use e.g 44'/60'/0'
+ *
+ * Each property description should be on a new line.
+ */
+ private _formatComment(text: string): string {
+ const NEW_LINE_REGEX = /(\r\n|\n|\r)/gm;
+ const sanitizedText = text.replace(NEW_LINE_REGEX, ' ');
+ const PROPERTY_DESCRIPTION_DIVIDER = ':';
+ if (!_.includes(sanitizedText, PROPERTY_DESCRIPTION_DIVIDER)) {
+ return sanitizedText;
+ }
+ const segments = sanitizedText.split(PROPERTY_DESCRIPTION_DIVIDER);
+ _.each(segments, (s: string, i: number) => {
+ if (i === 0) {
+ segments[i] = `**${s}**`;
+ return;
+ } else if (i === segments.length - 1) {
+ return;
+ }
+ const words = s.split(' ');
+ const property = words[words.length - 1];
+ words[words.length - 1] = `\n\n**${property}**`;
+ segments[i] = words.join(' ');
+ });
+ const final = segments.join(PROPERTY_DESCRIPTION_DIVIDER);
+ return final;
+ }
}
diff --git a/packages/react-docs/src/docs_info.ts b/packages/react-docs/src/docs_info.ts
index 0030568a1..b37942da6 100644
--- a/packages/react-docs/src/docs_info.ts
+++ b/packages/react-docs/src/docs_info.ts
@@ -9,8 +9,10 @@ import {
DocsInfoTypeConfigs,
DocsMenu,
DoxityDocObj,
+ SectionNameToMarkdownByVersion,
SectionsMap,
SupportedDocJson,
+ TypeDefinitionByName,
TypeDocNode,
} from './types';
import { doxityUtils } from './utils/doxity_utils';
@@ -23,17 +25,17 @@ export class DocsInfo {
public packageUrl: string;
public menu: DocsMenu;
public sections: SectionsMap;
- public sectionNameToMarkdown: { [sectionName: string]: string };
+ public sectionNameToMarkdownByVersion: SectionNameToMarkdownByVersion;
public contractsByVersionByNetworkId?: ContractsByVersionByNetworkId;
public typeConfigs: DocsInfoTypeConfigs;
- private _docsInfo: DocsInfoConfig;
+ private readonly _docsInfo: DocsInfoConfig;
constructor(config: DocsInfoConfig) {
this.id = config.id;
this.type = config.type;
this.displayName = config.displayName;
this.packageUrl = config.packageUrl;
this.sections = config.sections;
- this.sectionNameToMarkdown = config.sectionNameToMarkdown;
+ this.sectionNameToMarkdownByVersion = config.sectionNameToMarkdownByVersion;
this.contractsByVersionByNetworkId = config.contractsByVersionByNetworkId;
this.typeConfigs = config.typeConfigs;
this._docsInfo = config;
@@ -63,8 +65,8 @@ export class DocsInfo {
finalMenu.contracts = _.filter(finalMenu.contracts, (contractName: string) => {
const versionIntroducedIfExists = this._docsInfo.menuSubsectionToVersionWhenIntroduced[contractName];
if (!_.isUndefined(versionIntroducedIfExists)) {
- const existsInSelectedVersion = compareVersions(selectedVersion, versionIntroducedIfExists) >= 0;
- return existsInSelectedVersion;
+ const doesExistInSelectedVersion = compareVersions(selectedVersion, versionIntroducedIfExists) >= 0;
+ return doesExistInSelectedVersion;
} else {
return true;
}
@@ -104,13 +106,13 @@ export class DocsInfo {
});
return menuSubsectionsBySection;
}
- public getTypeDefinitionsByName(docAgnosticFormat: DocAgnosticFormat) {
+ public getTypeDefinitionsByName(docAgnosticFormat: DocAgnosticFormat): { [name: string]: TypeDefinitionByName } {
if (_.isUndefined(this.sections.types)) {
return {};
}
const typeDocSection = docAgnosticFormat[this.sections.types];
- const typeDefinitionByName = _.keyBy(typeDocSection.types, 'name');
+ const typeDefinitionByName = _.keyBy(typeDocSection.types, 'name') as any;
return typeDefinitionByName;
}
public isVisibleConstructor(sectionName: string): boolean {
diff --git a/packages/react-docs/src/globals.d.ts b/packages/react-docs/src/globals.d.ts
index c7cd53854..94e63a32d 100644
--- a/packages/react-docs/src/globals.d.ts
+++ b/packages/react-docs/src/globals.d.ts
@@ -1,11 +1,3 @@
-declare module 'react-tooltip';
-
-// compare-version declarations
-declare function compareVersions(firstVersion: string, secondVersion: string): number;
-declare module 'compare-versions' {
- export = compareVersions;
-}
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/react-docs/src/types.ts b/packages/react-docs/src/types.ts
index 2a300c164..cbc774c2e 100644
--- a/packages/react-docs/src/types.ts
+++ b/packages/react-docs/src/types.ts
@@ -1,3 +1,7 @@
+export interface SectionNameToMarkdownByVersion {
+ [version: string]: { [sectionName: string]: string };
+}
+
export interface DocsInfoConfig {
id: string;
type: SupportedDocJson;
@@ -5,7 +9,7 @@ export interface DocsInfoConfig {
packageUrl: string;
menu: DocsMenu;
sections: SectionsMap;
- sectionNameToMarkdown: { [sectionName: string]: string };
+ sectionNameToMarkdownByVersion: SectionNameToMarkdownByVersion;
visibleConstructors: string[];
sectionNameToModulePath?: { [sectionName: string]: string[] };
menuSubsectionToVersionWhenIntroduced?: { [sectionName: string]: string };
@@ -94,6 +98,7 @@ export enum KindString {
Method = 'Method',
Interface = 'Interface',
TypeAlias = 'Type alias',
+ ObjectLiteral = 'Object literal',
Variable = 'Variable',
Function = 'Function',
Enumeration = 'Enumeration',
@@ -140,6 +145,7 @@ export interface Parameter {
comment: string;
isOptional: boolean;
type: Type;
+ defaultValue?: string;
}
export interface TypeParameter {
diff --git a/packages/react-docs/src/utils/doxity_utils.ts b/packages/react-docs/src/utils/doxity_utils.ts
index 1b91690e0..6815daa0c 100644
--- a/packages/react-docs/src/utils/doxity_utils.ts
+++ b/packages/react-docs/src/utils/doxity_utils.ts
@@ -31,8 +31,8 @@ export const doxityUtils = {
comment: doxityConstructor.details,
returnComment: doxityConstructor.return,
callPath: '',
- parameters: this._convertParameters(doxityConstructor.inputs),
- returnType: this._convertType(doxityContractObj.name),
+ parameters: doxityUtils._convertParameters(doxityConstructor.inputs),
+ returnType: doxityUtils._convertType(doxityContractObj.name),
};
constructors.push(constructor);
}
@@ -40,7 +40,7 @@ export const doxityUtils = {
const doxityMethods: DoxityAbiDoc[] = _.filter<DoxityAbiDoc>(
doxityContractObj.abiDocs,
(abiDoc: DoxityAbiDoc) => {
- return this._isMethod(abiDoc);
+ return doxityUtils._isMethod(abiDoc);
},
);
const methods: SolidityMethod[] = _.map<DoxityAbiDoc, SolidityMethod>(
@@ -52,10 +52,10 @@ export const doxityUtils = {
// no-op. It's already undefined
} else if (outputs.length === 1) {
const outputsType = outputs[0].type;
- returnTypeIfExists = this._convertType(outputsType);
+ returnTypeIfExists = doxityUtils._convertType(outputsType);
} else {
const outputsType = `[${_.map(outputs, output => output.type).join(', ')}]`;
- returnTypeIfExists = this._convertType(outputsType);
+ returnTypeIfExists = doxityUtils._convertType(outputsType);
}
// For ZRXToken, we want to convert it to zrxToken, rather then simply zRXToken
const callPath =
@@ -70,7 +70,7 @@ export const doxityUtils = {
comment: doxityMethod.details,
returnComment: doxityMethod.return,
callPath,
- parameters: this._convertParameters(doxityMethod.inputs),
+ parameters: doxityUtils._convertParameters(doxityMethod.inputs),
returnType: returnTypeIfExists,
};
return method;
@@ -80,7 +80,7 @@ export const doxityUtils = {
const doxityProperties: DoxityAbiDoc[] = _.filter<DoxityAbiDoc>(
doxityContractObj.abiDocs,
(abiDoc: DoxityAbiDoc) => {
- return this._isProperty(abiDoc);
+ return doxityUtils._isProperty(abiDoc);
},
);
const properties = _.map<DoxityAbiDoc, Property>(doxityProperties, (doxityProperty: DoxityAbiDoc) => {
@@ -92,7 +92,7 @@ export const doxityUtils = {
}
const property = {
name: doxityProperty.name,
- type: this._convertType(typeName),
+ type: doxityUtils._convertType(typeName),
comment: doxityProperty.details,
};
return property;
@@ -105,7 +105,7 @@ export const doxityUtils = {
const events = _.map(doxityEvents, doxityEvent => {
const event = {
name: doxityEvent.name,
- eventArgs: this._convertEventArgs(doxityEvent.inputs),
+ eventArgs: doxityUtils._convertEventArgs(doxityEvent.inputs),
};
return event;
});
@@ -129,7 +129,7 @@ export const doxityUtils = {
name: input.name,
comment: input.description,
isOptional: false,
- type: this._convertType(input.type),
+ type: doxityUtils._convertType(input.type),
};
return parameter;
});
@@ -142,7 +142,7 @@ export const doxityUtils = {
};
return type;
},
- _isMethod(abiDoc: DoxityAbiDoc) {
+ _isMethod(abiDoc: DoxityAbiDoc): boolean {
if (abiDoc.type !== AbiTypes.Function) {
return false;
}
@@ -152,7 +152,7 @@ export const doxityUtils = {
const isMethod = hasNamedOutputIfExists && !isNameAllCaps;
return isMethod;
},
- _isProperty(abiDoc: DoxityAbiDoc) {
+ _isProperty(abiDoc: DoxityAbiDoc): boolean {
if (abiDoc.type !== AbiTypes.Function) {
return false;
}
@@ -167,7 +167,7 @@ export const doxityUtils = {
const eventArg = {
isIndexed: input.indexed,
name: input.name,
- type: this._convertType(input.type),
+ type: doxityUtils._convertType(input.type),
};
return eventArg;
});
diff --git a/packages/react-docs/src/utils/typedoc_utils.ts b/packages/react-docs/src/utils/typedoc_utils.ts
index 02f5b4049..a6d938e94 100644
--- a/packages/react-docs/src/utils/typedoc_utils.ts
+++ b/packages/react-docs/src/utils/typedoc_utils.ts
@@ -1,3 +1,4 @@
+import { errorUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import { DocsInfo } from '../docs_info';
@@ -14,11 +15,11 @@ import {
Type,
TypeDocNode,
TypeDocType,
+ TypeDocTypes,
TypeParameter,
TypescriptFunction,
TypescriptMethod,
} from '../types';
-import { utils } from '../utils/utils';
export const typeDocUtils = {
isType(entity: TypeDocNode): boolean {
@@ -92,10 +93,16 @@ export const typeDocUtils = {
throw new Error('`react-docs` only supports projects with 1 exported class per file');
}
const isClassExport = packageDefinitionWithMergedChildren.children[0].kindString === KindString.Class;
+ const isObjectLiteralExport =
+ packageDefinitionWithMergedChildren.children[0].kindString === KindString.ObjectLiteral;
if (isClassExport) {
entities = packageDefinitionWithMergedChildren.children[0].children;
const commentObj = packageDefinitionWithMergedChildren.children[0].comment;
packageComment = !_.isUndefined(commentObj) ? commentObj.shortText : packageComment;
+ } else if (isObjectLiteralExport) {
+ entities = packageDefinitionWithMergedChildren.children[0].children;
+ const commentObj = packageDefinitionWithMergedChildren.children[0].comment;
+ packageComment = !_.isUndefined(commentObj) ? commentObj.shortText : packageComment;
} else {
entities = packageDefinitionWithMergedChildren.children;
}
@@ -106,7 +113,7 @@ export const typeDocUtils = {
});
return docAgnosticFormat;
},
- _convertEntitiesToDocSection(entities: TypeDocNode[], docsInfo: DocsInfo, sectionName: string) {
+ _convertEntitiesToDocSection(entities: TypeDocNode[], docsInfo: DocsInfo, sectionName: string): DocSection {
const docSection: DocSection = {
comment: '',
constructors: [],
@@ -190,7 +197,7 @@ export const typeDocUtils = {
break;
default:
- throw utils.spawnSwitchErr('kindString', entity.kindString);
+ throw errorUtils.spawnSwitchErr('kindString', entity.kindString);
}
});
return docSection;
@@ -221,9 +228,16 @@ export const typeDocUtils = {
const childrenIfExist = !_.isUndefined(entity.children)
? _.map(entity.children, (child: TypeDocNode) => {
- const childTypeIfExists = !_.isUndefined(child.type)
+ let childTypeIfExists = !_.isUndefined(child.type)
? typeDocUtils._convertType(child.type, sections, sectionName, docId)
: undefined;
+ if (child.kindString === KindString.Method) {
+ childTypeIfExists = {
+ name: child.name,
+ typeDocType: TypeDocTypes.Reflection,
+ method: typeDocUtils._convertMethod(child, isConstructor, sections, sectionName, docId),
+ };
+ }
const c: CustomTypeChild = {
name: child.name,
type: childTypeIfExists,
@@ -387,6 +401,7 @@ export const typeDocUtils = {
name: entity.name,
comment,
isOptional,
+ defaultValue: entity.defaultValue,
type,
};
return parameter;
diff --git a/packages/react-docs/src/utils/utils.ts b/packages/react-docs/src/utils/utils.ts
deleted file mode 100644
index f8c1fefff..000000000
--- a/packages/react-docs/src/utils/utils.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const utils = {
- spawnSwitchErr(name: string, value: any) {
- return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
- },
-};
diff --git a/packages/react-docs/tslint.json b/packages/react-docs/tslint.json
index ee918e360..c78434416 100644
--- a/packages/react-docs/tslint.json
+++ b/packages/react-docs/tslint.json
@@ -3,6 +3,7 @@
"rules": {
"no-object-literal-type-assertion": false,
"completed-docs": false,
- "prefer-function-over-method": false
+ "prefer-function-over-method": false,
+ "custom-no-magic-numbers": false
}
}
diff --git a/packages/react-shared/CHANGELOG.json b/packages/react-shared/CHANGELOG.json
index 248b740bc..1268bcc7b 100644
--- a/packages/react-shared/CHANGELOG.json
+++ b/packages/react-shared/CHANGELOG.json
@@ -1,5 +1,158 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532551340,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.2.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.2.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.2.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.2.0",
+ "changes": [
+ {
+ "note": "Removed portal specific colors"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.1.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525466747,
+ "version": "0.1.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.1.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.1.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.1.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.1.0",
"changes": [
{
@@ -13,7 +166,6 @@
"note": "Reorganized colors and added new ones"
}
],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
}
]
diff --git a/packages/react-shared/CHANGELOG.md b/packages/react-shared/CHANGELOG.md
index 36e8097a8..cfbaf6c70 100644
--- a/packages/react-shared/CHANGELOG.md
+++ b/packages/react-shared/CHANGELOG.md
@@ -1,10 +1,78 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.6 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.5 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.2.3 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.2.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.2.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.2.0 - _May 4, 2018_
+
+ * Removed portal specific colors
+
+## v0.1.6 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.1.5 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.1.4 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.1.3 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.1.2 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.1.1 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.1.0 - _April 2, 2018_
* Added new colors (#468)
diff --git a/packages/react-shared/README.md b/packages/react-shared/README.md
index 9165cf78d..88e6f18ae 100644
--- a/packages/react-shared/README.md
+++ b/packages/react-shared/README.md
@@ -18,11 +18,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -38,18 +38,26 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=@0xproject/react-shared yarn build
```
-### Lint
+Or continuously rebuild on change:
```bash
-yarn lint
+PKG=@0xproject/react-shared yarn watch
```
-### Run Tests
+### Clean
```bash
-yarn test
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
```
diff --git a/packages/react-shared/package.json b/packages/react-shared/package.json
index 3a6d6a24e..9761c246e 100644
--- a/packages/react-shared/package.json
+++ b/packages/react-shared/package.json
@@ -1,13 +1,16 @@
{
"name": "@0xproject/react-shared",
- "version": "0.1.0",
+ "version": "1.0.6",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x shared react components",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "lint": "tslint --project . 'src/**/*.ts' 'src/**/*.tsx'",
+ "lint": "tslint --project .",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"clean": "shx rm -rf lib scripts",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
@@ -22,24 +25,26 @@
"url": "https://github.com/0xProject/0x-monorepo.git"
},
"devDependencies": {
- "@0xproject/dev-utils": "^0.3.3",
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
"tslint": "^5.9.1",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"dependencies": {
+ "@types/is-mobile": "0.3.0",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
- "@types/react": "^16.0.34",
- "@types/react-dom": "^16.0.3",
+ "@types/react": "*",
+ "@types/react-dom": "*",
"@types/react-scroll": "0.0.31",
"basscss": "^8.0.3",
"is-mobile": "^0.2.2",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"material-ui": "^0.17.1",
"react": "15.6.1",
"react-dom": "15.6.1",
diff --git a/packages/react-shared/src/components/anchor_title.tsx b/packages/react-shared/src/components/anchor_title.tsx
index f44354097..473b994bf 100644
--- a/packages/react-shared/src/components/anchor_title.tsx
+++ b/packages/react-shared/src/components/anchor_title.tsx
@@ -27,12 +27,6 @@ const styles: Styles = {
transform: 'rotate(45deg)',
cursor: 'pointer',
},
- headers: {
- WebkitMarginStart: 0,
- WebkitMarginEnd: 0,
- fontWeight: 'bold',
- display: 'block',
- },
h1: {
fontSize: '1.8em',
},
@@ -52,13 +46,24 @@ export class AnchorTitle extends React.Component<AnchorTitleProps, AnchorTitleSt
isHovering: false,
};
}
- public render() {
+ public render(): React.ReactNode {
let opacity = 0;
if (this.props.shouldShowAnchor) {
opacity = this.state.isHovering ? 0.6 : 1;
}
return (
- <div className="relative flex" style={{ ...styles[this.props.headerSize], ...styles.headers }}>
+ <div
+ className="relative flex"
+ style={
+ {
+ ...styles[this.props.headerSize],
+ fontWeight: 'bold',
+ display: 'block',
+ WebkitMarginStart: 0,
+ WebkitMarginEnd: 0,
+ } as any
+ }
+ >
<div className="inline-block" style={{ paddingRight: 4 }}>
{this.props.title}
</div>
@@ -79,7 +84,7 @@ export class AnchorTitle extends React.Component<AnchorTitleProps, AnchorTitleSt
</div>
);
}
- private _setHoverState(isHovering: boolean) {
+ private _setHoverState(isHovering: boolean): void {
this.setState({
isHovering,
});
diff --git a/packages/react-shared/src/components/markdown_code_block.tsx b/packages/react-shared/src/components/markdown_code_block.tsx
index 2070bb8e1..3b28424cd 100644
--- a/packages/react-shared/src/components/markdown_code_block.tsx
+++ b/packages/react-shared/src/components/markdown_code_block.tsx
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import * as HighLight from 'react-highlight';
@@ -12,10 +11,10 @@ export interface MarkdownCodeBlockState {}
export class MarkdownCodeBlock extends React.Component<MarkdownCodeBlockProps, MarkdownCodeBlockState> {
// Re-rendering a codeblock causes any use selection to become de-selected. This is annoying when trying
// to copy-paste code examples. We therefore noop re-renders on this component if it's props haven't changed.
- public shouldComponentUpdate(nextProps: MarkdownCodeBlockProps, nextState: MarkdownCodeBlockState) {
+ public shouldComponentUpdate(nextProps: MarkdownCodeBlockProps, _nextState: MarkdownCodeBlockState): boolean {
return nextProps.value !== this.props.value || nextProps.language !== this.props.language;
}
- public render() {
+ public render(): React.ReactNode {
return (
<span style={{ fontSize: 14 }}>
<HighLight className={this.props.language || 'javascript'}>{this.props.value}</HighLight>
diff --git a/packages/react-shared/src/components/markdown_link_block.tsx b/packages/react-shared/src/components/markdown_link_block.tsx
index 8f5862249..f083a91cf 100644
--- a/packages/react-shared/src/components/markdown_link_block.tsx
+++ b/packages/react-shared/src/components/markdown_link_block.tsx
@@ -13,10 +13,10 @@ export interface MarkdownLinkBlockState {}
export class MarkdownLinkBlock extends React.Component<MarkdownLinkBlockProps, MarkdownLinkBlockState> {
// Re-rendering a linkBlock causes it to remain unclickable.
// We therefore noop re-renders on this component if it's props haven't changed.
- public shouldComponentUpdate(nextProps: MarkdownLinkBlockProps, nextState: MarkdownLinkBlockState) {
+ public shouldComponentUpdate(nextProps: MarkdownLinkBlockProps, _nextState: MarkdownLinkBlockState): boolean {
return nextProps.href !== this.props.href;
}
- public render() {
+ public render(): React.ReactNode {
const href = this.props.href;
const isLinkToSection = _.startsWith(href, '#');
// If protocol is http or https, we can open in a new tab, otherwise don't for security reasons
@@ -39,7 +39,7 @@ export class MarkdownLinkBlock extends React.Component<MarkdownLinkBlockProps, M
return <a href={href}>{this.props.children}</a>;
}
}
- private _onHashUrlClick(href: string) {
+ private _onHashUrlClick(href: string): void {
const hash = href.split('#')[1];
utils.scrollToHash(hash, constants.SCROLL_CONTAINER_ID);
utils.setUrlHash(hash);
diff --git a/packages/react-shared/src/components/markdown_section.tsx b/packages/react-shared/src/components/markdown_section.tsx
index 449e8a045..3b65b3075 100644
--- a/packages/react-shared/src/components/markdown_section.tsx
+++ b/packages/react-shared/src/components/markdown_section.tsx
@@ -1,5 +1,4 @@
import * as _ from 'lodash';
-import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react';
import * as ReactMarkdown from 'react-markdown';
import { Element as ScrollElement } from 'react-scroll';
@@ -39,7 +38,7 @@ export class MarkdownSection extends React.Component<MarkdownSectionProps, Markd
shouldShowAnchor: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const { sectionName, markdownContent, headerSize, githubLink } = this.props as PropsWithDefaults;
const id = utils.getIdFromName(sectionName);
@@ -87,7 +86,7 @@ export class MarkdownSection extends React.Component<MarkdownSectionProps, Markd
</div>
);
}
- private _setAnchorVisibility(shouldShowAnchor: boolean) {
+ private _setAnchorVisibility(shouldShowAnchor: boolean): void {
this.setState({
shouldShowAnchor,
});
diff --git a/packages/react-shared/src/components/nested_sidebar_menu.tsx b/packages/react-shared/src/components/nested_sidebar_menu.tsx
index f49d6fcf7..aa00d5985 100644
--- a/packages/react-shared/src/components/nested_sidebar_menu.tsx
+++ b/packages/react-shared/src/components/nested_sidebar_menu.tsx
@@ -41,12 +41,13 @@ const styles: Styles = {
export class NestedSidebarMenu extends React.Component<NestedSidebarMenuProps, NestedSidebarMenuState> {
public static defaultProps: Partial<NestedSidebarMenuProps> = {
shouldDisplaySectionHeaders: true,
- onMenuItemClick: _.noop,
+ onMenuItemClick: _.noop.bind(_),
};
- public render() {
+ public render(): React.ReactNode {
const navigation = _.map(this.props.topLevelMenu, (menuItems: string[], sectionName: string) => {
const finalSectionName = utils.convertDashesToSpaces(sectionName);
if (this.props.shouldDisplaySectionHeaders) {
+ // tslint:disable-next-line:no-unused-variable
const id = utils.getIdFromName(sectionName);
return (
<div key={`section-${sectionName}`} className="py1" style={{ color: colors.grey800 }}>
diff --git a/packages/react-shared/src/components/section_header.tsx b/packages/react-shared/src/components/section_header.tsx
index 0224c2127..137b63765 100644
--- a/packages/react-shared/src/components/section_header.tsx
+++ b/packages/react-shared/src/components/section_header.tsx
@@ -32,8 +32,8 @@ export class SectionHeader extends React.Component<SectionHeaderProps, SectionHe
shouldShowAnchor: false,
};
}
- public render() {
- const { sectionName, headerSize } = this.props as PropsWithDefaults;
+ public render(): React.ReactNode {
+ const { headerSize } = this.props as PropsWithDefaults;
const finalSectionName = utils.convertDashesToSpaces(this.props.sectionName);
const id = utils.getIdFromName(finalSectionName);
@@ -65,7 +65,7 @@ export class SectionHeader extends React.Component<SectionHeaderProps, SectionHe
</div>
);
}
- private _setAnchorVisibility(shouldShowAnchor: boolean) {
+ private _setAnchorVisibility(shouldShowAnchor: boolean): void {
this.setState({
shouldShowAnchor,
});
diff --git a/packages/react-shared/src/components/version_drop_down.tsx b/packages/react-shared/src/components/version_drop_down.tsx
index d9e49b205..e41590957 100644
--- a/packages/react-shared/src/components/version_drop_down.tsx
+++ b/packages/react-shared/src/components/version_drop_down.tsx
@@ -3,8 +3,6 @@ import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';
import * as React from 'react';
-import { utils } from '../utils/utils';
-
export interface VersionDropDownProps {
selectedVersion: string;
versions: string[];
@@ -14,7 +12,7 @@ export interface VersionDropDownProps {
export interface VersionDropDownState {}
export class VersionDropDown extends React.Component<VersionDropDownProps, VersionDropDownState> {
- public render() {
+ public render(): React.ReactNode {
return (
<div className="mx-auto" style={{ width: 120 }}>
<DropDownMenu
@@ -27,13 +25,13 @@ export class VersionDropDown extends React.Component<VersionDropDownProps, Versi
</div>
);
}
- private _renderDropDownItems() {
+ private _renderDropDownItems(): React.ReactNode[] {
const items = _.map(this.props.versions, version => {
return <MenuItem key={version} value={version} primaryText={`v${version}`} />;
});
return items;
}
- private _updateSelectedVersion(e: any, index: number, semver: string) {
+ private _updateSelectedVersion(_e: any, _index: number, semver: string): void {
this.props.onVersionSelected(semver);
}
}
diff --git a/packages/react-shared/src/globals.d.ts b/packages/react-shared/src/globals.d.ts
index 525563e23..94e63a32d 100644
--- a/packages/react-shared/src/globals.d.ts
+++ b/packages/react-shared/src/globals.d.ts
@@ -1,11 +1,3 @@
-declare module 'react-highlight';
-
-// is-mobile declarations
-declare function isMobile(): boolean;
-declare module 'is-mobile' {
- export = isMobile;
-}
-
declare module '*.json' {
const json: any;
/* tslint:disable */
diff --git a/packages/react-shared/src/utils/colors.ts b/packages/react-shared/src/utils/colors.ts
index 7613414ae..7d047a50e 100644
--- a/packages/react-shared/src/utils/colors.ts
+++ b/packages/react-shared/src/utils/colors.ts
@@ -22,12 +22,12 @@ const baseColors = {
heroGrey: '#404040',
projectsGrey: '#343333',
darkestGrey: '#272727',
- dharmaDarkGrey: '#252525',
lightBlue: '#60A4F4',
lightBlueA700: '#0091EA',
linkBlue: '#1D5CDE',
mediumBlue: '#488AEA',
darkBlue: '#4D5481',
+ lightTurquois: '#aefcdc',
turquois: '#058789',
lightPurple: '#A81CA6',
purple: '#690596',
@@ -47,20 +47,7 @@ const baseColors = {
darkYellow: '#caca03',
};
-const appColors = {
- // wallet specific colors
- walletBoxShadow: 'rgba(56, 59, 137, 0.2)',
- walletBorder: '#ededee',
- walletDefaultItemBackground: '#fbfbfc',
- walletFocusedItemBackground: '#f0f1f4',
- allowanceToggleShadow: 'rgba(0, 0, 0, 0)',
- allowanceToggleOffTrack: '#adadad',
- allowanceToggleOnTrack: baseColors.mediumBlue,
- wrapEtherConfirmationButton: baseColors.mediumBlue,
-};
-
export const colors = {
...materialUiColors,
...baseColors,
- ...appColors,
};
diff --git a/packages/react-shared/src/utils/utils.ts b/packages/react-shared/src/utils/utils.ts
index 1538dd087..93c7e9f7b 100644
--- a/packages/react-shared/src/utils/utils.ts
+++ b/packages/react-shared/src/utils/utils.ts
@@ -7,7 +7,7 @@ import { EtherscanLinkSuffixes, Networks } from '../types';
import { constants } from './constants';
export const utils = {
- setUrlHash(anchorId: string) {
+ setUrlHash(anchorId: string): void {
window.location.hash = anchorId;
},
scrollToHash(hash: string, containerId: string): void {
@@ -26,11 +26,11 @@ export const utils = {
const isUserOnMobile = isMobile();
return isUserOnMobile;
},
- getIdFromName(name: string) {
+ getIdFromName(name: string): string {
const id = name.replace(/ /g, '-');
return id;
},
- convertDashesToSpaces(text: string) {
+ convertDashesToSpaces(text: string): string {
return text.replace(/-/g, ' ');
},
getEtherScanLinkIfExists(
diff --git a/packages/react-shared/tslint.json b/packages/react-shared/tslint.json
index ee918e360..c78434416 100644
--- a/packages/react-shared/tslint.json
+++ b/packages/react-shared/tslint.json
@@ -3,6 +3,7 @@
"rules": {
"no-object-literal-type-assertion": false,
"completed-docs": false,
- "prefer-function-over-method": false
+ "prefer-function-over-method": false,
+ "custom-no-magic-numbers": false
}
}
diff --git a/packages/deployer/.npmignore b/packages/sol-compiler/.npmignore
index 44df80fad..44df80fad 100644
--- a/packages/deployer/.npmignore
+++ b/packages/sol-compiler/.npmignore
diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json
new file mode 100644
index 000000000..a351839a4
--- /dev/null
+++ b/packages/sol-compiler/CHANGELOG.json
@@ -0,0 +1,260 @@
+[
+ {
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.5.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.5.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.5.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.5.1",
+ "changes": [
+ {
+ "note": "Make `opts` constructor parameter optional",
+ "pr": 621
+ },
+ {
+ "note": "Add schema validation for compiler configuration",
+ "pr": 621
+ }
+ ],
+ "timestamp": 1527009133
+ },
+ {
+ "version": "0.5.0",
+ "changes": [
+ {
+ "note": "Properly export the executable binary",
+ "pr": 588
+ },
+ {
+ "note": "Add the ability to define a specific solidity version",
+ "pr": 589
+ }
+ ],
+ "timestamp": 1527009133
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.4.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.4.2",
+ "changes": [
+ {
+ "note": "Add support for solidity 0.4.23",
+ "pr": 545
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.4.1",
+ "changes": [
+ {
+ "note": "Add support for solidity 0.4.22",
+ "pr": 531
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "version": "0.4.0",
+ "changes": [
+ {
+ "note": "Changed the config key `web3Provider` to `provider` to be consistent with other tools",
+ "pr": 501
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "version": "0.3.5",
+ "changes": [
+ {
+ "note": "Don't try to write contract artifact if an error occured",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
+ "version": "0.3.4",
+ "changes": [
+ {
+ "note": "Create solc_bin directory if does not exist before attempting to compile",
+ "pr": 491
+ }
+ ],
+ "timestamp": 1522658513
+ },
+ {
+ "version": "0.3.1",
+ "changes": [
+ {
+ "note": "Add TS types for `yargs`"
+ }
+ ],
+ "timestamp": 1521298800
+ },
+ {
+ "version": "0.3.0",
+ "changes": [
+ {
+ "note": "Add support for Solidity 0.4.20 and 0.4.21"
+ },
+ {
+ "note": "Replace `jsonrpcPort` config with `jsonrpcUrl`",
+ "pr": 426
+ },
+ {
+ "note": "Replace `jsonrpc-port` CLI option with `jsonrpc-url`",
+ "pr": 426
+ },
+ {
+ "note": "Export the `Compiler`",
+ "pr": 426
+ },
+ {
+ "note": "Load solc from remote source instead of having it locally",
+ "pr": 426
+ },
+ {
+ "note":
+ "Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts",
+ "pr": 426
+ },
+ {
+ "note": "Remove 0x-specific `migrate` command",
+ "pr": 426
+ },
+ {
+ "note":
+ "Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core",
+ "pr": 426
+ },
+ {
+ "note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
+ "pr": 452
+ },
+ {
+ "note": "Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error."
+ }
+ ],
+ "timestamp": 1521298800
+ },
+ {
+ "version": "0.2.0",
+ "changes": [
+ {
+ "note": "Check dependencies when determining if contracts should be recompiled",
+ "pr": 408
+ },
+ {
+ "note":
+ "Improve an error message for when deployer is supplied with an incorrect number of constructor arguments",
+ "pr": 419
+ }
+ ],
+ "timestamp": 1520089200
+ },
+ {
+ "version": "0.1.0",
+ "changes": [
+ {
+ "note": "Add the ability to pass in specific contracts to compile in CLI",
+ "pr": 400
+ }
+ ],
+ "timestamp": 1518706800
+ },
+ {
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
+ "pr": 389
+ }
+ ],
+ "timestamp": 1518102000
+ }
+]
diff --git a/packages/sol-compiler/CHANGELOG.md b/packages/sol-compiler/CHANGELOG.md
new file mode 100644
index 000000000..ee9eadeaa
--- /dev/null
+++ b/packages/sol-compiler/CHANGELOG.md
@@ -0,0 +1,106 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.5.4 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.5.3 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.5.2 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.5.1 - _May 22, 2018_
+
+ * Make `opts` constructor parameter optional (#621)
+ * Add schema validation for compiler configuration (#621)
+
+## v0.5.0 - _May 22, 2018_
+
+ * Properly export the executable binary (#588)
+ * Add the ability to define a specific solidity version (#589)
+
+## v0.4.3 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.4.2 - _May 4, 2018_
+
+ * Add support for solidity 0.4.23 (#545)
+
+## v0.4.1 - _April 18, 2018_
+
+ * Add support for solidity 0.4.22 (#531)
+
+## v0.4.0 - _April 11, 2018_
+
+ * Changed the config key `web3Provider` to `provider` to be consistent with other tools (#501)
+
+## v0.3.5 - _April 2, 2018_
+
+ * Don't try to write contract artifact if an error occured (#485)
+
+## v0.3.4 - _April 2, 2018_
+
+ * Create solc_bin directory if does not exist before attempting to compile (#491)
+
+## v0.3.1 - _March 17, 2018_
+
+ * Add TS types for `yargs`
+
+## v0.3.0 - _March 17, 2018_
+
+ * Add support for Solidity 0.4.20 and 0.4.21
+ * Replace `jsonrpcPort` config with `jsonrpcUrl` (#426)
+ * Replace `jsonrpc-port` CLI option with `jsonrpc-url` (#426)
+ * Export the `Compiler` (#426)
+ * Load solc from remote source instead of having it locally (#426)
+ * Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts (#426)
+ * Remove 0x-specific `migrate` command (#426)
+ * Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core (#426)
+ * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
+ * Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error.
+
+## v0.2.0 - _March 3, 2018_
+
+ * Check dependencies when determining if contracts should be recompiled (#408)
+ * Improve an error message for when deployer is supplied with an incorrect number of constructor arguments (#419)
+
+## v0.1.0 - _February 15, 2018_
+
+ * Add the ability to pass in specific contracts to compile in CLI (#400)
+
+## v0.0.8 - _February 8, 2018_
+
+ * Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
diff --git a/packages/sol-compiler/README.md b/packages/sol-compiler/README.md
new file mode 100644
index 000000000..3a6ca130b
--- /dev/null
+++ b/packages/sol-compiler/README.md
@@ -0,0 +1,97 @@
+## @0xproject/sol-compiler
+
+Sol-compiler is a wrapper around [solc-js](https://www.npmjs.com/package/solc) that adds:
+
+* Smart re-compilation: Only recompiles when smart contracts have changed
+* Ability to compile an entire project instead of only individual `.sol` files
+* Compilation using the Solidity version specified at the top of each individual `.sol` file
+* Proper parsing of Solidity version ranges
+* Support for the standard [input description](https://solidity.readthedocs.io/en/develop/using-the-compiler.html#input-description) for what information you'd like added to the resulting `artifacts` file (i.e 100% configurable artifacts content).
+
+### Read the [Documentation](https://0xproject.com/docs/sol-compiler).
+
+## Installation
+
+#### CLI Installation
+
+```bash
+yarn global add @0xproject/sol-compiler
+```
+
+#### API Installation
+
+```bash
+yarn add @0xproject/sol-compiler
+```
+
+If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
+
+```json
+"compilerOptions": {
+ "typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
+}
+```
+
+**Import**
+
+```typescript
+import { Compiler } from '@0xproject/sol-compiler';
+```
+
+or
+
+```javascript
+var Compiler = require('@0xproject/sol-compiler').Compiler;
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/sol-compiler yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/sol-compiler yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/sol-compiler/bin/sol-compiler.js b/packages/sol-compiler/bin/sol-compiler.js
new file mode 100755
index 000000000..0e5b69af0
--- /dev/null
+++ b/packages/sol-compiler/bin/sol-compiler.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../lib/src/cli.js')
diff --git a/packages/sol-compiler/coverage/.gitkeep b/packages/sol-compiler/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/sol-compiler/coverage/.gitkeep
diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json
new file mode 100644
index 000000000..7cb07e970
--- /dev/null
+++ b/packages/sol-compiler/package.json
@@ -0,0 +1,102 @@
+{
+ "name": "@0xproject/sol-compiler",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "Solidity compiler wrapper and artifactor",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "pre_build": "run-s update_contract_fixtures",
+ "update_contract_fixtures": "copyfiles 'test/fixtures/contracts/**/*' ./lib",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s build test",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/*_test.js --bail --exit",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "clean": "shx rm -rf lib scripts",
+ "migrate": "npm run build; node lib/src/cli.js migrate",
+ "lint": "tslint --project .",
+ "test:circleci": "yarn test:coverage",
+ "docs:stage": "node scripts/stage_docs.js",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js",
+ "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
+ "upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
+ },
+ "config": {
+ "postpublish": {
+ "assets": [],
+ "docPublishConfigs": {
+ "extraFileIncludes": [
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
+ ],
+ "s3BucketPath": "s3://doc-jsons/sol-compiler/",
+ "s3StagingBucketPath": "s3://staging-doc-jsons/sol-compiler/"
+ }
+ }
+ },
+ "bin": {
+ "sol-compiler": "bin/sol-compiler.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "author": "Amir Bandeali",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-compiler/README.md",
+ "devDependencies": {
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/mkdirp": "^0.5.2",
+ "@types/require-from-string": "^1.2.0",
+ "@types/semver": "^5.5.0",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
+ "npm-run-all": "^4.1.2",
+ "nyc": "^11.0.1",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typedoc": "0xProject/typedoc",
+ "types-bn": "^0.0.1",
+ "typescript": "2.9.2",
+ "web3-typescript-typings": "^0.10.2",
+ "zeppelin-solidity": "1.8.0"
+ },
+ "dependencies": {
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/sol-resolver": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@types/yargs": "^11.0.0",
+ "chalk": "^2.3.0",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-util": "^5.1.1",
+ "lodash": "^4.17.5",
+ "mkdirp": "^0.5.1",
+ "require-from-string": "^2.0.1",
+ "semver": "5.5.0",
+ "solc": "^0.4.23",
+ "source-map-support": "^0.5.0",
+ "web3-eth-abi": "^1.0.0-beta.24",
+ "yargs": "^10.0.3"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/sol-compiler/solc_bin/.gitkeep b/packages/sol-compiler/solc_bin/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/sol-compiler/solc_bin/.gitkeep
diff --git a/packages/sol-compiler/src/cli.ts b/packages/sol-compiler/src/cli.ts
new file mode 100644
index 000000000..83dadc7ca
--- /dev/null
+++ b/packages/sol-compiler/src/cli.ts
@@ -0,0 +1,44 @@
+#!/usr/bin/env node
+// We need the above pragma since this script will be run as a command-line tool.
+
+import { logUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+import 'source-map-support/register';
+import * as yargs from 'yargs';
+
+import { Compiler } from './compiler';
+
+const DEFAULT_CONTRACTS_LIST = '*';
+const SEPARATOR = ',';
+
+(async () => {
+ const argv = yargs
+ .option('contracts-dir', {
+ type: 'string',
+ description: 'path of contracts directory to compile',
+ })
+ .option('artifacts-dir', {
+ type: 'string',
+ description: 'path to write contracts artifacts to',
+ })
+ .option('contracts', {
+ type: 'string',
+ description: 'comma separated list of contracts to compile',
+ })
+ .help().argv;
+ const contracts = _.isUndefined(argv.contracts)
+ ? undefined
+ : argv.contracts === DEFAULT_CONTRACTS_LIST
+ ? DEFAULT_CONTRACTS_LIST
+ : argv.contracts.split(SEPARATOR);
+ const opts = {
+ contractsDir: argv.contractsDir,
+ artifactsDir: argv.artifactsDir,
+ contracts,
+ };
+ const compiler = new Compiler(opts);
+ await compiler.compileAsync();
+})().catch(err => {
+ logUtils.log(err);
+ process.exit(1);
+});
diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts
new file mode 100644
index 000000000..3620a3ec1
--- /dev/null
+++ b/packages/sol-compiler/src/compiler.ts
@@ -0,0 +1,273 @@
+import { assert } from '@0xproject/assert';
+import {
+ FallthroughResolver,
+ FSResolver,
+ NameResolver,
+ NPMResolver,
+ RelativeFSResolver,
+ Resolver,
+ URLResolver,
+} from '@0xproject/sol-resolver';
+import { fetchAsync, logUtils } from '@0xproject/utils';
+import chalk from 'chalk';
+import * as ethUtil from 'ethereumjs-util';
+import * as fs from 'fs';
+import * as _ from 'lodash';
+import * as path from 'path';
+import * as requireFromString from 'require-from-string';
+import * as semver from 'semver';
+import solc = require('solc');
+
+import { compilerOptionsSchema } from './schemas/compiler_options_schema';
+import { binPaths } from './solc/bin_paths';
+import {
+ createDirIfDoesNotExistAsync,
+ getContractArtifactIfExistsAsync,
+ getNormalizedErrMsg,
+ parseDependencies,
+ parseSolidityVersionRange,
+} from './utils/compiler';
+import { constants } from './utils/constants';
+import { fsWrapper } from './utils/fs_wrapper';
+import { CompilerOptions, ContractArtifact, ContractVersionData } from './utils/types';
+import { utils } from './utils/utils';
+
+type TYPE_ALL_FILES_IDENTIFIER = '*';
+const ALL_CONTRACTS_IDENTIFIER = '*';
+const ALL_FILES_IDENTIFIER = '*';
+const SOLC_BIN_DIR = path.join(__dirname, '..', '..', 'solc_bin');
+const DEFAULT_CONTRACTS_DIR = path.resolve('contracts');
+const DEFAULT_ARTIFACTS_DIR = path.resolve('artifacts');
+// Solc compiler settings cannot be configured from the commandline.
+// If you need this configured, please create a `compiler.json` config file
+// with your desired configurations.
+const DEFAULT_COMPILER_SETTINGS: solc.CompilerSettings = {
+ optimizer: {
+ enabled: false,
+ },
+ outputSelection: {
+ [ALL_FILES_IDENTIFIER]: {
+ [ALL_CONTRACTS_IDENTIFIER]: ['abi', 'evm.bytecode.object'],
+ },
+ },
+};
+const CONFIG_FILE = 'compiler.json';
+
+/**
+ * The Compiler facilitates compiling Solidity smart contracts and saves the results
+ * to artifact files.
+ */
+export class Compiler {
+ private readonly _resolver: Resolver;
+ private readonly _nameResolver: NameResolver;
+ private readonly _contractsDir: string;
+ private readonly _compilerSettings: solc.CompilerSettings;
+ private readonly _artifactsDir: string;
+ private readonly _solcVersionIfExists: string | undefined;
+ private readonly _specifiedContracts: string[] | TYPE_ALL_FILES_IDENTIFIER;
+ /**
+ * Instantiates a new instance of the Compiler class.
+ * @return An instance of the Compiler class.
+ */
+ constructor(opts?: CompilerOptions) {
+ assert.doesConformToSchema('opts', opts, compilerOptionsSchema);
+ // TODO: Look for config file in parent directories if not found in current directory
+ const config: CompilerOptions = fs.existsSync(CONFIG_FILE)
+ ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString())
+ : {};
+ const passedOpts = opts || {};
+ assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema);
+ this._contractsDir = passedOpts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR;
+ this._solcVersionIfExists = passedOpts.solcVersion || config.solcVersion;
+ this._compilerSettings = passedOpts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS;
+ this._artifactsDir = passedOpts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR;
+ this._specifiedContracts = passedOpts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER;
+ this._nameResolver = new NameResolver(path.resolve(this._contractsDir));
+ const resolver = new FallthroughResolver();
+ resolver.appendResolver(new URLResolver());
+ const packagePath = path.resolve('');
+ resolver.appendResolver(new NPMResolver(packagePath));
+ resolver.appendResolver(new RelativeFSResolver(this._contractsDir));
+ resolver.appendResolver(new FSResolver());
+ resolver.appendResolver(this._nameResolver);
+ this._resolver = resolver;
+ }
+ /**
+ * Compiles selected Solidity files found in `contractsDir` and writes JSON artifacts to `artifactsDir`.
+ */
+ public async compileAsync(): Promise<void> {
+ await createDirIfDoesNotExistAsync(this._artifactsDir);
+ await createDirIfDoesNotExistAsync(SOLC_BIN_DIR);
+ let contractNamesToCompile: string[] = [];
+ if (this._specifiedContracts === ALL_CONTRACTS_IDENTIFIER) {
+ const allContracts = this._nameResolver.getAll();
+ contractNamesToCompile = _.map(allContracts, contractSource =>
+ path.basename(contractSource.path, constants.SOLIDITY_FILE_EXTENSION),
+ );
+ } else {
+ contractNamesToCompile = this._specifiedContracts;
+ }
+ for (const contractNameToCompile of contractNamesToCompile) {
+ await this._compileContractAsync(contractNameToCompile);
+ }
+ }
+ /**
+ * Compiles contract and saves artifact to artifactsDir.
+ * @param fileName Name of contract with '.sol' extension.
+ */
+ private async _compileContractAsync(contractName: string): Promise<void> {
+ const contractSource = this._resolver.resolve(contractName);
+ const absoluteContractPath = path.join(this._contractsDir, contractSource.path);
+ const currentArtifactIfExists = await getContractArtifactIfExistsAsync(this._artifactsDir, contractName);
+ const sourceTreeHashHex = `0x${this._getSourceTreeHash(absoluteContractPath).toString('hex')}`;
+ let shouldCompile = false;
+ if (_.isUndefined(currentArtifactIfExists)) {
+ shouldCompile = true;
+ } else {
+ const currentArtifact = currentArtifactIfExists as ContractArtifact;
+ const isUserOnLatestVersion = currentArtifact.schemaVersion === constants.LATEST_ARTIFACT_VERSION;
+ const didCompilerSettingsChange = !_.isEqual(currentArtifact.compiler.settings, this._compilerSettings);
+ const didSourceChange = currentArtifact.sourceTreeHashHex !== sourceTreeHashHex;
+ shouldCompile = !isUserOnLatestVersion || didCompilerSettingsChange || didSourceChange;
+ }
+ if (!shouldCompile) {
+ return;
+ }
+ let solcVersion = this._solcVersionIfExists;
+ if (_.isUndefined(solcVersion)) {
+ const solcVersionRange = parseSolidityVersionRange(contractSource.source);
+ const availableCompilerVersions = _.keys(binPaths);
+ solcVersion = semver.maxSatisfying(availableCompilerVersions, solcVersionRange);
+ }
+ const fullSolcVersion = binPaths[solcVersion];
+ const compilerBinFilename = path.join(SOLC_BIN_DIR, fullSolcVersion);
+ let solcjs: string;
+ const isCompilerAvailableLocally = fs.existsSync(compilerBinFilename);
+ if (isCompilerAvailableLocally) {
+ solcjs = fs.readFileSync(compilerBinFilename).toString();
+ } else {
+ logUtils.log(`Downloading ${fullSolcVersion}...`);
+ const url = `${constants.BASE_COMPILER_URL}${fullSolcVersion}`;
+ const response = await fetchAsync(url);
+ const SUCCESS_STATUS = 200;
+ if (response.status !== SUCCESS_STATUS) {
+ throw new Error(`Failed to load ${fullSolcVersion}`);
+ }
+ solcjs = await response.text();
+ fs.writeFileSync(compilerBinFilename, solcjs);
+ }
+ const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename));
+
+ logUtils.log(`Compiling ${contractName} with Solidity v${solcVersion}...`);
+ const standardInput: solc.StandardInput = {
+ language: 'Solidity',
+ sources: {
+ [contractSource.path]: {
+ content: contractSource.source,
+ },
+ },
+ settings: this._compilerSettings,
+ };
+ const compiled: solc.StandardOutput = JSON.parse(
+ solcInstance.compileStandardWrapper(JSON.stringify(standardInput), importPath => {
+ const sourceCodeIfExists = this._resolver.resolve(importPath);
+ return { contents: sourceCodeIfExists.source };
+ }),
+ );
+
+ if (!_.isUndefined(compiled.errors)) {
+ const SOLIDITY_WARNING = 'warning';
+ const errors = _.filter(compiled.errors, entry => entry.severity !== SOLIDITY_WARNING);
+ const warnings = _.filter(compiled.errors, entry => entry.severity === SOLIDITY_WARNING);
+ if (!_.isEmpty(errors)) {
+ errors.forEach(error => {
+ const normalizedErrMsg = getNormalizedErrMsg(error.formattedMessage || error.message);
+ logUtils.log(chalk.red(normalizedErrMsg));
+ });
+ process.exit(1);
+ } else {
+ warnings.forEach(warning => {
+ const normalizedWarningMsg = getNormalizedErrMsg(warning.formattedMessage || warning.message);
+ logUtils.log(chalk.yellow(normalizedWarningMsg));
+ });
+ }
+ }
+ const compiledData = compiled.contracts[contractSource.path][contractName];
+ if (_.isUndefined(compiledData)) {
+ throw new Error(
+ `Contract ${contractName} not found in ${
+ contractSource.path
+ }. Please make sure your contract has the same name as it's file name`,
+ );
+ }
+ if (!_.isUndefined(compiledData.evm)) {
+ if (!_.isUndefined(compiledData.evm.bytecode) && !_.isUndefined(compiledData.evm.bytecode.object)) {
+ compiledData.evm.bytecode.object = ethUtil.addHexPrefix(compiledData.evm.bytecode.object);
+ }
+ if (
+ !_.isUndefined(compiledData.evm.deployedBytecode) &&
+ !_.isUndefined(compiledData.evm.deployedBytecode.object)
+ ) {
+ compiledData.evm.deployedBytecode.object = ethUtil.addHexPrefix(
+ compiledData.evm.deployedBytecode.object,
+ );
+ }
+ }
+
+ const sourceCodes = _.mapValues(
+ compiled.sources,
+ (_1, sourceFilePath) => this._resolver.resolve(sourceFilePath).source,
+ );
+ const contractVersion: ContractVersionData = {
+ compilerOutput: compiledData,
+ sources: compiled.sources,
+ sourceCodes,
+ sourceTreeHashHex,
+ compiler: {
+ name: 'solc',
+ version: fullSolcVersion,
+ settings: this._compilerSettings,
+ },
+ };
+
+ let newArtifact: ContractArtifact;
+ if (!_.isUndefined(currentArtifactIfExists)) {
+ const currentArtifact = currentArtifactIfExists as ContractArtifact;
+ newArtifact = {
+ ...currentArtifact,
+ ...contractVersion,
+ };
+ } else {
+ newArtifact = {
+ schemaVersion: constants.LATEST_ARTIFACT_VERSION,
+ contractName,
+ ...contractVersion,
+ networks: {},
+ };
+ }
+
+ const artifactString = utils.stringifyWithFormatting(newArtifact);
+ const currentArtifactPath = `${this._artifactsDir}/${contractName}.json`;
+ await fsWrapper.writeFileAsync(currentArtifactPath, artifactString);
+ logUtils.log(`${contractName} artifact saved!`);
+ }
+ /**
+ * Gets the source tree hash for a file and its dependencies.
+ * @param fileName Name of contract file.
+ */
+ private _getSourceTreeHash(importPath: string): Buffer {
+ const contractSource = this._resolver.resolve(importPath);
+ const dependencies = parseDependencies(contractSource);
+ const sourceHash = ethUtil.sha3(contractSource.source);
+ if (dependencies.length === 0) {
+ return sourceHash;
+ } else {
+ const dependencySourceTreeHashes = _.map(dependencies, (dependency: string) =>
+ this._getSourceTreeHash(dependency),
+ );
+ const sourceTreeHashesBuffer = Buffer.concat([sourceHash, ...dependencySourceTreeHashes]);
+ const sourceTreeHash = ethUtil.sha3(sourceTreeHashesBuffer);
+ return sourceTreeHash;
+ }
+ }
+}
diff --git a/packages/sol-compiler/src/globals.d.ts b/packages/sol-compiler/src/globals.d.ts
new file mode 100644
index 000000000..94e63a32d
--- /dev/null
+++ b/packages/sol-compiler/src/globals.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/sol-compiler/src/index.ts b/packages/sol-compiler/src/index.ts
new file mode 100644
index 000000000..15c166992
--- /dev/null
+++ b/packages/sol-compiler/src/index.ts
@@ -0,0 +1,3 @@
+export { Compiler } from './compiler';
+export { CompilerOptions } from './utils/types';
+export { ContractArtifact, ContractNetworks } from './utils/types';
diff --git a/packages/sol-compiler/src/monorepo_scripts/postpublish.ts b/packages/sol-compiler/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/sol-compiler/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/sol-compiler/src/monorepo_scripts/stage_docs.ts b/packages/sol-compiler/src/monorepo_scripts/stage_docs.ts
new file mode 100644
index 000000000..e732ac8eb
--- /dev/null
+++ b/packages/sol-compiler/src/monorepo_scripts/stage_docs.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.publishDocsToStagingAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/sol-compiler/src/schemas/compiler_options_schema.ts b/packages/sol-compiler/src/schemas/compiler_options_schema.ts
new file mode 100644
index 000000000..d4d1b6017
--- /dev/null
+++ b/packages/sol-compiler/src/schemas/compiler_options_schema.ts
@@ -0,0 +1,26 @@
+export const compilerOptionsSchema = {
+ id: '/CompilerOptions',
+ properties: {
+ contractsDir: { type: 'string' },
+ artifactsDir: { type: 'string' },
+ solcVersion: { type: 'string', pattern: '^\\d+.\\d+.\\d+$' },
+ compilerSettings: { type: 'object' },
+ contracts: {
+ oneOf: [
+ {
+ type: 'string',
+ pattern: '^\\*$',
+ },
+ {
+ type: 'array',
+ items: {
+ type: 'string',
+ },
+ },
+ ],
+ },
+ },
+ type: 'object',
+ required: [],
+ additionalProperties: false,
+};
diff --git a/packages/sol-compiler/src/solc/bin_paths.ts b/packages/sol-compiler/src/solc/bin_paths.ts
new file mode 100644
index 000000000..a75255dc6
--- /dev/null
+++ b/packages/sol-compiler/src/solc/bin_paths.ts
@@ -0,0 +1,21 @@
+export interface BinaryPaths {
+ [key: string]: string;
+}
+
+export const binPaths: BinaryPaths = {
+ '0.4.10': 'soljson-v0.4.10+commit.f0d539ae.js',
+ '0.4.11': 'soljson-v0.4.11+commit.68ef5810.js',
+ '0.4.12': 'soljson-v0.4.12+commit.194ff033.js',
+ '0.4.13': 'soljson-v0.4.13+commit.fb4cb1a.js',
+ '0.4.14': 'soljson-v0.4.14+commit.c2215d46.js',
+ '0.4.15': 'soljson-v0.4.15+commit.bbb8e64f.js',
+ '0.4.16': 'soljson-v0.4.16+commit.d7661dd9.js',
+ '0.4.17': 'soljson-v0.4.17+commit.bdeb9e52.js',
+ '0.4.18': 'soljson-v0.4.18+commit.9cf6e910.js',
+ '0.4.19': 'soljson-v0.4.19+commit.c4cbbb05.js',
+ '0.4.20': 'soljson-v0.4.20+commit.3155dd80.js',
+ '0.4.21': 'soljson-v0.4.21+commit.dfe3193c.js',
+ '0.4.22': 'soljson-v0.4.22+commit.4cb486ee.js',
+ '0.4.23': 'soljson-v0.4.23+commit.124ca40d.js',
+ '0.4.24': 'soljson-v0.4.24+commit.e67f0147.js',
+};
diff --git a/packages/sol-compiler/src/utils/compiler.ts b/packages/sol-compiler/src/utils/compiler.ts
new file mode 100644
index 000000000..968fcc5b2
--- /dev/null
+++ b/packages/sol-compiler/src/utils/compiler.ts
@@ -0,0 +1,108 @@
+import { ContractSource } from '@0xproject/sol-resolver';
+import { logUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+import * as path from 'path';
+
+import { fsWrapper } from './fs_wrapper';
+import { ContractArtifact } from './types';
+
+/**
+ * Gets contract data on network or returns if an artifact does not exist.
+ * @param artifactsDir Path to the artifacts directory.
+ * @param contractName Name of contract.
+ * @return Contract data on network or undefined.
+ */
+export async function getContractArtifactIfExistsAsync(
+ artifactsDir: string,
+ contractName: string,
+): Promise<ContractArtifact | void> {
+ let contractArtifact;
+ const currentArtifactPath = `${artifactsDir}/${contractName}.json`;
+ try {
+ const opts = {
+ encoding: 'utf8',
+ };
+ const contractArtifactString = await fsWrapper.readFileAsync(currentArtifactPath, opts);
+ contractArtifact = JSON.parse(contractArtifactString);
+ return contractArtifact;
+ } catch (err) {
+ logUtils.log(`Artifact for ${contractName} does not exist`);
+ return undefined;
+ }
+}
+
+/**
+ * Creates a directory if it does not already exist.
+ * @param artifactsDir Path to the directory.
+ */
+export async function createDirIfDoesNotExistAsync(dirPath: string): Promise<void> {
+ if (!fsWrapper.doesPathExistSync(dirPath)) {
+ logUtils.log(`Creating directory at ${dirPath}...`);
+ await fsWrapper.mkdirpAsync(dirPath);
+ }
+}
+
+/**
+ * Searches Solidity source code for compiler version range.
+ * @param source Source code of contract.
+ * @return Solc compiler version range.
+ */
+export function parseSolidityVersionRange(source: string): string {
+ const SOLIDITY_VERSION_RANGE_REGEX = /pragma\s+solidity\s+(.*);/;
+ const solcVersionRangeMatch = source.match(SOLIDITY_VERSION_RANGE_REGEX);
+ if (_.isNull(solcVersionRangeMatch)) {
+ throw new Error('Could not find Solidity version range in source');
+ }
+ const solcVersionRange = solcVersionRangeMatch[1];
+ return solcVersionRange;
+}
+
+/**
+ * Normalizes the path found in the error message. If it cannot be normalized
+ * the original error message is returned.
+ * Example: converts 'base/Token.sol:6:46: Warning: Unused local variable'
+ * to 'Token.sol:6:46: Warning: Unused local variable'
+ * This is used to prevent logging the same error multiple times.
+ * @param errMsg An error message from the compiled output.
+ * @return The error message with directories truncated from the contract path.
+ */
+export function getNormalizedErrMsg(errMsg: string): string {
+ const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/;
+ const errPathMatch = errMsg.match(SOLIDITY_FILE_EXTENSION_REGEX);
+ if (_.isNull(errPathMatch)) {
+ // This can occur if solidity outputs a general warning, e.g
+ // Warning: This is a pre-release compiler version, please do not use it in production.
+ return errMsg;
+ }
+ const errPath = errPathMatch[0];
+ const baseContract = path.basename(errPath);
+ const normalizedErrMsg = errMsg.replace(errPath, baseContract);
+ return normalizedErrMsg;
+}
+
+/**
+ * Parses the contract source code and extracts the dendencies
+ * @param source Contract source code
+ * @return List of dependendencies
+ */
+export function parseDependencies(contractSource: ContractSource): string[] {
+ // TODO: Use a proper parser
+ const source = contractSource.source;
+ const IMPORT_REGEX = /(import\s)/;
+ const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
+ const dependencies: string[] = [];
+ const lines = source.split('\n');
+ _.forEach(lines, line => {
+ if (!_.isNull(line.match(IMPORT_REGEX))) {
+ const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
+ if (!_.isNull(dependencyMatch)) {
+ let dependencyPath = dependencyMatch[1];
+ if (dependencyPath.startsWith('.')) {
+ dependencyPath = path.join(path.dirname(contractSource.path), dependencyPath);
+ }
+ dependencies.push(dependencyPath);
+ }
+ }
+ });
+ return dependencies;
+}
diff --git a/packages/sol-compiler/src/utils/constants.ts b/packages/sol-compiler/src/utils/constants.ts
new file mode 100644
index 000000000..df2ddb3b2
--- /dev/null
+++ b/packages/sol-compiler/src/utils/constants.ts
@@ -0,0 +1,5 @@
+export const constants = {
+ SOLIDITY_FILE_EXTENSION: '.sol',
+ BASE_COMPILER_URL: 'https://ethereum.github.io/solc-bin/bin/',
+ LATEST_ARTIFACT_VERSION: '2.0.0',
+};
diff --git a/packages/sol-compiler/src/utils/encoder.ts b/packages/sol-compiler/src/utils/encoder.ts
new file mode 100644
index 000000000..0f2d75691
--- /dev/null
+++ b/packages/sol-compiler/src/utils/encoder.ts
@@ -0,0 +1,18 @@
+import { AbiDefinition, AbiType, ContractAbi, DataItem } from 'ethereum-types';
+import * as _ from 'lodash';
+import * as web3Abi from 'web3-eth-abi';
+
+export const encoder = {
+ encodeConstructorArgsFromAbi(args: any[], abi: ContractAbi): string {
+ const constructorTypes: string[] = [];
+ _.each(abi, (element: AbiDefinition) => {
+ if (element.type === AbiType.Constructor) {
+ _.each(element.inputs, (input: DataItem) => {
+ constructorTypes.push(input.type);
+ });
+ }
+ });
+ const encodedParameters = web3Abi.encodeParameters(constructorTypes, args);
+ return encodedParameters;
+ },
+};
diff --git a/packages/sol-compiler/src/utils/fs_wrapper.ts b/packages/sol-compiler/src/utils/fs_wrapper.ts
new file mode 100644
index 000000000..cc7b06175
--- /dev/null
+++ b/packages/sol-compiler/src/utils/fs_wrapper.ts
@@ -0,0 +1,13 @@
+import { promisify } from '@0xproject/utils';
+import * as fs from 'fs';
+import * as mkdirp from 'mkdirp';
+
+export const fsWrapper = {
+ readdirAsync: promisify<string[]>(fs.readdir),
+ readFileAsync: promisify<string>(fs.readFile),
+ writeFileAsync: promisify<undefined>(fs.writeFile),
+ mkdirpAsync: promisify<undefined>(mkdirp),
+ doesPathExistSync: fs.existsSync,
+ rmdirSync: fs.rmdirSync,
+ removeFileAsync: promisify<undefined>(fs.unlink),
+};
diff --git a/packages/sol-compiler/src/utils/types.ts b/packages/sol-compiler/src/utils/types.ts
new file mode 100644
index 000000000..4321a2235
--- /dev/null
+++ b/packages/sol-compiler/src/utils/types.ts
@@ -0,0 +1,77 @@
+import * as solc from 'solc';
+
+export enum AbiType {
+ Function = 'function',
+ Constructor = 'constructor',
+ Event = 'event',
+ Fallback = 'fallback',
+}
+
+export interface ContractArtifact extends ContractVersionData {
+ schemaVersion: string;
+ contractName: string;
+ networks: ContractNetworks;
+}
+
+export interface ContractVersionData {
+ compiler: {
+ name: 'solc';
+ version: string;
+ settings: solc.CompilerSettings;
+ };
+ sources: {
+ [sourceName: string]: {
+ id: number;
+ };
+ };
+ sourceCodes: {
+ [sourceName: string]: string;
+ };
+ sourceTreeHashHex: string;
+ compilerOutput: solc.StandardContractOutput;
+}
+
+export interface ContractNetworks {
+ [networkId: number]: ContractNetworkData;
+}
+
+export interface ContractNetworkData {
+ address: string;
+ links: {
+ [linkName: string]: string;
+ };
+ constructorArgs: string;
+}
+
+export interface SolcErrors {
+ [key: string]: boolean;
+}
+
+export interface CompilerOptions {
+ contractsDir?: string;
+ artifactsDir?: string;
+ compilerSettings?: solc.CompilerSettings;
+ contracts?: string[] | '*';
+ solcVersion?: string;
+}
+
+export interface ContractSourceData {
+ [contractName: string]: ContractSpecificSourceData;
+}
+
+export interface ContractSpecificSourceData {
+ solcVersionRange: string;
+ sourceHash: Buffer;
+ sourceTreeHash: Buffer;
+}
+
+export interface Token {
+ address?: string;
+ name: string;
+ symbol: string;
+ decimals: number;
+ ipfsHash: string;
+ swarmHash: string;
+}
+
+export type DoneCallback = (err?: Error) => void;
diff --git a/packages/sol-compiler/src/utils/utils.ts b/packages/sol-compiler/src/utils/utils.ts
new file mode 100644
index 000000000..4f2de2caa
--- /dev/null
+++ b/packages/sol-compiler/src/utils/utils.ts
@@ -0,0 +1,6 @@
+export const utils = {
+ stringifyWithFormatting(obj: any): string {
+ const stringifiedObj = JSON.stringify(obj, null, '\t');
+ return stringifiedObj;
+ },
+};
diff --git a/packages/sol-compiler/test/compiler_test.ts b/packages/sol-compiler/test/compiler_test.ts
new file mode 100644
index 000000000..c9e141ee9
--- /dev/null
+++ b/packages/sol-compiler/test/compiler_test.ts
@@ -0,0 +1,50 @@
+import { DoneCallback } from '@0xproject/types';
+import * as chai from 'chai';
+import 'mocha';
+
+import { Compiler } from '../src/compiler';
+import { fsWrapper } from '../src/utils/fs_wrapper';
+import { CompilerOptions, ContractArtifact } from '../src/utils/types';
+
+import { exchange_binary } from './fixtures/exchange_bin';
+import { constants } from './util/constants';
+
+const expect = chai.expect;
+
+describe('#Compiler', function(): void {
+ this.timeout(constants.timeoutMs); // tslint:disable-line:no-invalid-this
+ const artifactsDir = `${__dirname}/fixtures/artifacts`;
+ const contractsDir = `${__dirname}/fixtures/contracts`;
+ const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
+ const compilerOpts: CompilerOptions = {
+ artifactsDir,
+ contractsDir,
+ contracts: constants.contracts,
+ };
+ const compiler = new Compiler(compilerOpts);
+ beforeEach((done: DoneCallback) => {
+ (async () => {
+ if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
+ await fsWrapper.removeFileAsync(exchangeArtifactPath);
+ }
+ await compiler.compileAsync();
+ done();
+ })().catch(done);
+ });
+ it('should create an Exchange artifact with the correct unlinked binary', async () => {
+ const opts = {
+ encoding: 'utf8',
+ };
+ const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
+ const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
+ // The last 43 bytes of the binaries are metadata which may not be equivalent
+ const metadataByteLength = 43;
+ const metadataHexLength = metadataByteLength * 2;
+ const unlinkedBinaryWithoutMetadata = exchangeArtifact.compilerOutput.evm.bytecode.object.slice(
+ 2,
+ -metadataHexLength,
+ );
+ const exchangeBinaryWithoutMetadata = exchange_binary.slice(0, -metadataHexLength);
+ expect(unlinkedBinaryWithoutMetadata).to.equal(exchangeBinaryWithoutMetadata);
+ });
+});
diff --git a/packages/sol-compiler/test/compiler_utils_test.ts b/packages/sol-compiler/test/compiler_utils_test.ts
new file mode 100644
index 000000000..4fe7b994e
--- /dev/null
+++ b/packages/sol-compiler/test/compiler_utils_test.ts
@@ -0,0 +1,83 @@
+import * as chai from 'chai';
+import * as dirtyChai from 'dirty-chai';
+import * as _ from 'lodash';
+import 'mocha';
+
+import {
+ createDirIfDoesNotExistAsync,
+ getNormalizedErrMsg,
+ parseDependencies,
+ parseSolidityVersionRange,
+} from '../src/utils/compiler';
+import { fsWrapper } from '../src/utils/fs_wrapper';
+
+chai.use(dirtyChai);
+const expect = chai.expect;
+
+describe('Compiler utils', () => {
+ describe('#getNormalizedErrorMessage', () => {
+ it('normalizes the error message', () => {
+ const errMsg = 'base/Token.sol:6:46: Warning: Unused local variable';
+ const normalizedErrMsg = getNormalizedErrMsg(errMsg);
+ expect(normalizedErrMsg).to.be.equal('Token.sol:6:46: Warning: Unused local variable');
+ });
+ });
+ describe('#createDirIfDoesNotExistAsync', () => {
+ it('creates artifacts dir', async () => {
+ const artifactsDir = `${__dirname}/artifacts`;
+ expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
+ await createDirIfDoesNotExistAsync(artifactsDir);
+ expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.true();
+ fsWrapper.rmdirSync(artifactsDir);
+ expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
+ });
+ });
+ describe('#parseSolidityVersionRange', () => {
+ it('correctly parses the version range', () => {
+ expect(parseSolidityVersionRange('pragma solidity ^0.0.1;')).to.be.equal('^0.0.1');
+ expect(parseSolidityVersionRange('\npragma solidity 0.0.1;')).to.be.equal('0.0.1');
+ expect(parseSolidityVersionRange('pragma solidity <=1.0.1;')).to.be.equal('<=1.0.1');
+ expect(parseSolidityVersionRange('pragma solidity ~1.0.1;')).to.be.equal('~1.0.1');
+ });
+ // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
+ it.skip('correctly parses the version range with comments', () => {
+ expect(parseSolidityVersionRange('// pragma solidity ~1.0.1;\npragma solidity ~1.0.2;')).to.be.equal(
+ '~1.0.2',
+ );
+ });
+ });
+ describe('#parseDependencies', () => {
+ it('correctly parses Exchange dependencies', async () => {
+ const path = `${__dirname}/fixtures/contracts/Exchange.sol`;
+ const source = await fsWrapper.readFileAsync(path, {
+ encoding: 'utf8',
+ });
+ const dependencies = parseDependencies({ source, path });
+ const expectedDependencies = [
+ 'zeppelin-solidity/contracts/token/ERC20/ERC20.sol',
+ 'packages/sol-compiler/lib/test/fixtures/contracts/TokenTransferProxy.sol',
+ 'packages/sol-compiler/lib/test/fixtures/contracts/base/SafeMath.sol',
+ ];
+ _.each(expectedDependencies, expectedDepdency => {
+ const foundDependency = _.find(dependencies, dependency => _.endsWith(dependency, expectedDepdency));
+ expect(foundDependency, `${expectedDepdency} not found`).to.not.be.undefined();
+ });
+ });
+ it('correctly parses TokenTransferProxy dependencies', async () => {
+ const path = `${__dirname}/fixtures/contracts/TokenTransferProxy.sol`;
+ const source = await fsWrapper.readFileAsync(path, {
+ encoding: 'utf8',
+ });
+ expect(parseDependencies({ source, path })).to.be.deep.equal([
+ 'zeppelin-solidity/contracts/ownership/Ownable.sol',
+ 'zeppelin-solidity/contracts/token/ERC20/ERC20.sol',
+ ]);
+ });
+ // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
+ it.skip('correctly parses commented out dependencies', async () => {
+ const path = '';
+ const source = `// import "./TokenTransferProxy.sol";`;
+ expect(parseDependencies({ path, source })).to.be.deep.equal([]);
+ });
+ });
+});
diff --git a/packages/sol-compiler/test/fixtures/contracts/Exchange.sol b/packages/sol-compiler/test/fixtures/contracts/Exchange.sol
new file mode 100644
index 000000000..e3725335b
--- /dev/null
+++ b/packages/sol-compiler/test/fixtures/contracts/Exchange.sol
@@ -0,0 +1,603 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.14;
+
+import {ERC20 as Token} from "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
+
+import "./TokenTransferProxy.sol";
+import "./base/SafeMath.sol";
+
+/// @title Exchange - Facilitates exchange of ERC20 tokens.
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract Exchange is SafeMath {
+
+ // Error Codes
+ enum Errors {
+ ORDER_EXPIRED, // Order has already expired
+ ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
+ ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
+ INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
+ }
+
+ string constant public VERSION = "1.0.0";
+ uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas
+
+ address public ZRX_TOKEN_CONTRACT;
+ address public TOKEN_TRANSFER_PROXY_CONTRACT;
+
+ // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
+ mapping (bytes32 => uint) public filled;
+ mapping (bytes32 => uint) public cancelled;
+
+ event LogFill(
+ address indexed maker,
+ address taker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint filledMakerTokenAmount,
+ uint filledTakerTokenAmount,
+ uint paidMakerFee,
+ uint paidTakerFee,
+ bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
+ bytes32 orderHash
+ );
+
+ event LogCancel(
+ address indexed maker,
+ address indexed feeRecipient,
+ address makerToken,
+ address takerToken,
+ uint cancelledMakerTokenAmount,
+ uint cancelledTakerTokenAmount,
+ bytes32 indexed tokens,
+ bytes32 orderHash
+ );
+
+ event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
+
+ struct Order {
+ address maker;
+ address taker;
+ address makerToken;
+ address takerToken;
+ address feeRecipient;
+ uint makerTokenAmount;
+ uint takerTokenAmount;
+ uint makerFee;
+ uint takerFee;
+ uint expirationTimestampInSec;
+ bytes32 orderHash;
+ }
+
+ function Exchange(address _zrxToken, address _tokenTransferProxy) {
+ ZRX_TOKEN_CONTRACT = _zrxToken;
+ TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
+ }
+
+ /*
+ * Core exchange functions
+ */
+
+ /// @dev Fills the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Total amount of takerToken filled in trade.
+ function fillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ returns (uint filledTakerTokenAmount)
+ {
+ Order memory order = Order({
+ maker: orderAddresses[0],
+ taker: orderAddresses[1],
+ makerToken: orderAddresses[2],
+ takerToken: orderAddresses[3],
+ feeRecipient: orderAddresses[4],
+ makerTokenAmount: orderValues[0],
+ takerTokenAmount: orderValues[1],
+ makerFee: orderValues[2],
+ takerFee: orderValues[3],
+ expirationTimestampInSec: orderValues[4],
+ orderHash: getOrderHash(orderAddresses, orderValues)
+ });
+
+ require(order.taker == address(0) || order.taker == msg.sender);
+ require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);
+ require(isValidSignature(
+ order.maker,
+ order.orderHash,
+ v,
+ r,
+ s
+ ));
+
+ if (block.timestamp >= order.expirationTimestampInSec) {
+ LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
+ return 0;
+ }
+
+ uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
+ filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
+ if (filledTakerTokenAmount == 0) {
+ LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
+ return 0;
+ }
+
+ if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
+ LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
+ return 0;
+ }
+
+ if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
+ LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
+ return 0;
+ }
+
+ uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
+ uint paidMakerFee;
+ uint paidTakerFee;
+ filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
+ require(transferViaTokenTransferProxy(
+ order.makerToken,
+ order.maker,
+ msg.sender,
+ filledMakerTokenAmount
+ ));
+ require(transferViaTokenTransferProxy(
+ order.takerToken,
+ msg.sender,
+ order.maker,
+ filledTakerTokenAmount
+ ));
+ if (order.feeRecipient != address(0)) {
+ if (order.makerFee > 0) {
+ paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
+ require(transferViaTokenTransferProxy(
+ ZRX_TOKEN_CONTRACT,
+ order.maker,
+ order.feeRecipient,
+ paidMakerFee
+ ));
+ }
+ if (order.takerFee > 0) {
+ paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
+ require(transferViaTokenTransferProxy(
+ ZRX_TOKEN_CONTRACT,
+ msg.sender,
+ order.feeRecipient,
+ paidTakerFee
+ ));
+ }
+ }
+
+ LogFill(
+ order.maker,
+ msg.sender,
+ order.feeRecipient,
+ order.makerToken,
+ order.takerToken,
+ filledMakerTokenAmount,
+ filledTakerTokenAmount,
+ paidMakerFee,
+ paidTakerFee,
+ keccak256(order.makerToken, order.takerToken),
+ order.orderHash
+ );
+ return filledTakerTokenAmount;
+ }
+
+ /// @dev Cancels the input order.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
+ /// @return Amount of takerToken cancelled.
+ function cancelOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint cancelTakerTokenAmount)
+ public
+ returns (uint)
+ {
+ Order memory order = Order({
+ maker: orderAddresses[0],
+ taker: orderAddresses[1],
+ makerToken: orderAddresses[2],
+ takerToken: orderAddresses[3],
+ feeRecipient: orderAddresses[4],
+ makerTokenAmount: orderValues[0],
+ takerTokenAmount: orderValues[1],
+ makerFee: orderValues[2],
+ takerFee: orderValues[3],
+ expirationTimestampInSec: orderValues[4],
+ orderHash: getOrderHash(orderAddresses, orderValues)
+ });
+
+ require(order.maker == msg.sender);
+ require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);
+
+ if (block.timestamp >= order.expirationTimestampInSec) {
+ LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
+ return 0;
+ }
+
+ uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
+ uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
+ if (cancelledTakerTokenAmount == 0) {
+ LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
+ return 0;
+ }
+
+ cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);
+
+ LogCancel(
+ order.maker,
+ order.feeRecipient,
+ order.makerToken,
+ order.takerToken,
+ getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
+ cancelledTakerTokenAmount,
+ keccak256(order.makerToken, order.takerToken),
+ order.orderHash
+ );
+ return cancelledTakerTokenAmount;
+ }
+
+ /*
+ * Wrapper functions
+ */
+
+ /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ function fillOrKillOrder(
+ address[5] orderAddresses,
+ uint[6] orderValues,
+ uint fillTakerTokenAmount,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ {
+ require(fillOrder(
+ orderAddresses,
+ orderValues,
+ fillTakerTokenAmount,
+ false,
+ v,
+ r,
+ s
+ ) == fillTakerTokenAmount);
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ fillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ fillTakerTokenAmounts[i],
+ shouldThrowOnInsufficientBalanceOrAllowance,
+ v[i],
+ r[i],
+ s[i]
+ );
+ }
+ }
+
+ /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ function batchFillOrKillOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] fillTakerTokenAmounts,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ fillOrKillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ fillTakerTokenAmounts[i],
+ v[i],
+ r[i],
+ s[i]
+ );
+ }
+ }
+
+ /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
+ /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
+ /// @param v Array ECDSA signature v parameters.
+ /// @param r Array of ECDSA signature r parameters.
+ /// @param s Array of ECDSA signature s parameters.
+ /// @return Total amount of fillTakerTokenAmount filled in orders.
+ function fillOrdersUpTo(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint fillTakerTokenAmount,
+ bool shouldThrowOnInsufficientBalanceOrAllowance,
+ uint8[] v,
+ bytes32[] r,
+ bytes32[] s)
+ public
+ returns (uint)
+ {
+ uint filledTakerTokenAmount = 0;
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
+ filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
+ orderAddresses[i],
+ orderValues[i],
+ safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
+ shouldThrowOnInsufficientBalanceOrAllowance,
+ v[i],
+ r[i],
+ s[i]
+ ));
+ if (filledTakerTokenAmount == fillTakerTokenAmount) break;
+ }
+ return filledTakerTokenAmount;
+ }
+
+ /// @dev Synchronously cancels multiple orders in a single transaction.
+ /// @param orderAddresses Array of address arrays containing individual order addresses.
+ /// @param orderValues Array of uint arrays containing individual order values.
+ /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
+ function batchCancelOrders(
+ address[5][] orderAddresses,
+ uint[6][] orderValues,
+ uint[] cancelTakerTokenAmounts)
+ public
+ {
+ for (uint i = 0; i < orderAddresses.length; i++) {
+ cancelOrder(
+ orderAddresses[i],
+ orderValues[i],
+ cancelTakerTokenAmounts[i]
+ );
+ }
+ }
+
+ /*
+ * Constant public functions
+ */
+
+ /// @dev Calculates Keccak-256 hash of order with specified parameters.
+ /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
+ /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
+ /// @return Keccak-256 hash of order.
+ function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
+ public
+ constant
+ returns (bytes32)
+ {
+ return keccak256(
+ address(this),
+ orderAddresses[0], // maker
+ orderAddresses[1], // taker
+ orderAddresses[2], // makerToken
+ orderAddresses[3], // takerToken
+ orderAddresses[4], // feeRecipient
+ orderValues[0], // makerTokenAmount
+ orderValues[1], // takerTokenAmount
+ orderValues[2], // makerFee
+ orderValues[3], // takerFee
+ orderValues[4], // expirationTimestampInSec
+ orderValues[5] // salt
+ );
+ }
+
+ /// @dev Verifies that an order signature is valid.
+ /// @param signer address of signer.
+ /// @param hash Signed Keccak-256 hash.
+ /// @param v ECDSA signature parameter v.
+ /// @param r ECDSA signature parameters r.
+ /// @param s ECDSA signature parameters s.
+ /// @return Validity of order signature.
+ function isValidSignature(
+ address signer,
+ bytes32 hash,
+ uint8 v,
+ bytes32 r,
+ bytes32 s)
+ public
+ constant
+ returns (bool)
+ {
+ return signer == ecrecover(
+ keccak256("\x19Ethereum Signed Message:\n32", hash),
+ v,
+ r,
+ s
+ );
+ }
+
+ /// @dev Checks if rounding error > 0.1%.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to multiply with numerator/denominator.
+ /// @return Rounding error is present.
+ function isRoundingError(uint numerator, uint denominator, uint target)
+ public
+ constant
+ returns (bool)
+ {
+ uint remainder = mulmod(target, numerator, denominator);
+ if (remainder == 0) return false; // No rounding error.
+
+ uint errPercentageTimes1000000 = safeDiv(
+ safeMul(remainder, 1000000),
+ safeMul(numerator, target)
+ );
+ return errPercentageTimes1000000 > 1000;
+ }
+
+ /// @dev Calculates partial value given a numerator and denominator.
+ /// @param numerator Numerator.
+ /// @param denominator Denominator.
+ /// @param target Value to calculate partial of.
+ /// @return Partial value of target.
+ function getPartialAmount(uint numerator, uint denominator, uint target)
+ public
+ constant
+ returns (uint)
+ {
+ return safeDiv(safeMul(numerator, target), denominator);
+ }
+
+ /// @dev Calculates the sum of values already filled and cancelled for a given order.
+ /// @param orderHash The Keccak-256 hash of the given order.
+ /// @return Sum of values already filled and cancelled.
+ function getUnavailableTakerTokenAmount(bytes32 orderHash)
+ public
+ constant
+ returns (uint)
+ {
+ return safeAdd(filled[orderHash], cancelled[orderHash]);
+ }
+
+
+ /*
+ * Internal functions
+ */
+
+ /// @dev Transfers a token using TokenTransferProxy transferFrom function.
+ /// @param token Address of token to transferFrom.
+ /// @param from Address transfering token.
+ /// @param to Address receiving token.
+ /// @param value Amount of token to transfer.
+ /// @return Success of token transfer.
+ function transferViaTokenTransferProxy(
+ address token,
+ address from,
+ address to,
+ uint value)
+ internal
+ returns (bool)
+ {
+ return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
+ }
+
+ /// @dev Checks if any order transfers will fail.
+ /// @param order Order struct of params that will be checked.
+ /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
+ /// @return Predicted result of transfers.
+ function isTransferable(Order order, uint fillTakerTokenAmount)
+ internal
+ constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
+ returns (bool)
+ {
+ address taker = msg.sender;
+ uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
+
+ if (order.feeRecipient != address(0)) {
+ bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
+ bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
+ uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
+ uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
+ uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
+ uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;
+
+ if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
+ || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
+ || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
+ || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
+ ) return false;
+
+ if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
+ || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
+ ) return false;
+ if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
+ || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
+ ) return false;
+ } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
+ || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
+ || getBalance(order.takerToken, taker) < fillTakerTokenAmount
+ || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
+ ) return false;
+
+ return true;
+ }
+
+ /// @dev Get token balance of an address.
+ /// @param token Address of token.
+ /// @param owner Address of owner.
+ /// @return Token balance of owner.
+ function getBalance(address token, address owner)
+ internal
+ constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
+ returns (uint)
+ {
+ return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
+ }
+
+ /// @dev Get allowance of token given to TokenTransferProxy by an address.
+ /// @param token Address of token.
+ /// @param owner Address of owner.
+ /// @return Allowance of token given to TokenTransferProxy by owner.
+ function getAllowance(address token, address owner)
+ internal
+ constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
+ returns (uint)
+ {
+ return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
+ }
+}
diff --git a/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol b/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol
new file mode 100644
index 000000000..44570d459
--- /dev/null
+++ b/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol
@@ -0,0 +1,115 @@
+/*
+
+ Copyright 2018 ZeroEx Intl.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+*/
+
+pragma solidity ^0.4.14;
+
+import { Ownable } from "zeppelin-solidity/contracts/ownership/Ownable.sol";
+import { ERC20 as Token } from "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
+
+/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
+/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
+contract TokenTransferProxy is Ownable {
+
+ /// @dev Only authorized addresses can invoke functions with this modifier.
+ modifier onlyAuthorized {
+ require(authorized[msg.sender]);
+ _;
+ }
+
+ modifier targetAuthorized(address target) {
+ require(authorized[target]);
+ _;
+ }
+
+ modifier targetNotAuthorized(address target) {
+ require(!authorized[target]);
+ _;
+ }
+
+ mapping (address => bool) public authorized;
+ address[] public authorities;
+
+ event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
+ event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
+
+ /*
+ * Public functions
+ */
+
+ /// @dev Authorizes an address.
+ /// @param target Address to authorize.
+ function addAuthorizedAddress(address target)
+ public
+ onlyOwner
+ targetNotAuthorized(target)
+ {
+ authorized[target] = true;
+ authorities.push(target);
+ LogAuthorizedAddressAdded(target, msg.sender);
+ }
+
+ /// @dev Removes authorizion of an address.
+ /// @param target Address to remove authorization from.
+ function removeAuthorizedAddress(address target)
+ public
+ onlyOwner
+ targetAuthorized(target)
+ {
+ delete authorized[target];
+ for (uint i = 0; i < authorities.length; i++) {
+ if (authorities[i] == target) {
+ authorities[i] = authorities[authorities.length - 1];
+ authorities.length -= 1;
+ break;
+ }
+ }
+ LogAuthorizedAddressRemoved(target, msg.sender);
+ }
+
+ /// @dev Calls into ERC20 Token contract, invoking transferFrom.
+ /// @param token Address of token to transfer.
+ /// @param from Address to transfer token from.
+ /// @param to Address to transfer token to.
+ /// @param value Amount of token to transfer.
+ /// @return Success of transfer.
+ function transferFrom(
+ address token,
+ address from,
+ address to,
+ uint value)
+ public
+ onlyAuthorized
+ returns (bool)
+ {
+ return Token(token).transferFrom(from, to, value);
+ }
+
+ /*
+ * Public constant functions
+ */
+
+ /// @dev Gets all authorized addresses.
+ /// @return Array of authorized addresses.
+ function getAuthorizedAddresses()
+ public
+ constant
+ returns (address[])
+ {
+ return authorities;
+ }
+}
diff --git a/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol b/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol
new file mode 100644
index 000000000..92ce11cde
--- /dev/null
+++ b/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol
@@ -0,0 +1,41 @@
+pragma solidity ^0.4.14;
+
+contract SafeMath {
+ function safeMul(uint a, uint b) internal constant returns (uint256) {
+ uint c = a * b;
+ assert(a == 0 || c / a == b);
+ return c;
+ }
+
+ function safeDiv(uint a, uint b) internal constant returns (uint256) {
+ uint c = a / b;
+ return c;
+ }
+
+ function safeSub(uint a, uint b) internal constant returns (uint256) {
+ assert(b <= a);
+ return a - b;
+ }
+
+ function safeAdd(uint a, uint b) internal constant returns (uint256) {
+ uint c = a + b;
+ assert(c >= a);
+ return c;
+ }
+
+ function max64(uint64 a, uint64 b) internal constant returns (uint64) {
+ return a >= b ? a : b;
+ }
+
+ function min64(uint64 a, uint64 b) internal constant returns (uint64) {
+ return a < b ? a : b;
+ }
+
+ function max256(uint256 a, uint256 b) internal constant returns (uint256) {
+ return a >= b ? a : b;
+ }
+
+ function min256(uint256 a, uint256 b) internal constant returns (uint256) {
+ return a < b ? a : b;
+ }
+}
diff --git a/packages/sol-compiler/test/fixtures/contracts/base/Token.sol b/packages/sol-compiler/test/fixtures/contracts/base/Token.sol
new file mode 100644
index 000000000..483010d7d
--- /dev/null
+++ b/packages/sol-compiler/test/fixtures/contracts/base/Token.sol
@@ -0,0 +1,38 @@
+pragma solidity ^0.4.14;
+
+contract Token {
+
+ /// @return total amount of tokens
+ function totalSupply() constant returns (uint supply) {}
+
+ /// @param _owner The address from which the balance will be retrieved
+ /// @return The balance
+ function balanceOf(address _owner) constant returns (uint balance) {}
+
+ /// @notice send `_value` token to `_to` from `msg.sender`
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return Whether the transfer was successful or not
+ function transfer(address _to, uint _value) returns (bool success) {}
+
+ /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
+ /// @param _from The address of the sender
+ /// @param _to The address of the recipient
+ /// @param _value The amount of token to be transferred
+ /// @return Whether the transfer was successful or not
+ function transferFrom(address _from, address _to, uint _value) returns (bool success) {}
+
+ /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @param _value The amount of wei to be approved for transfer
+ /// @return Whether the approval was successful or not
+ function approve(address _spender, uint _value) returns (bool success) {}
+
+ /// @param _owner The address of the account owning tokens
+ /// @param _spender The address of the account able to transfer the tokens
+ /// @return Amount of remaining tokens allowed to spent
+ function allowance(address _owner, address _spender) constant returns (uint remaining) {}
+
+ event Transfer(address indexed _from, address indexed _to, uint _value);
+ event Approval(address indexed _owner, address indexed _spender, uint _value);
+}
diff --git a/packages/sol-compiler/test/fixtures/exchange_bin.ts b/packages/sol-compiler/test/fixtures/exchange_bin.ts
new file mode 100644
index 000000000..914e76bf5
--- /dev/null
+++ b/packages/sol-compiler/test/fixtures/exchange_bin.ts
@@ -0,0 +1,4 @@
+export const constructor_args =
+ '0x000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4980000000000000000000000008da0d80f5007ef1e431dd2127178d224e32c2ef4';
+export const exchange_binary =
+ '608060405234801561001057600080fd5b50604051604080612d998339810180604052810190808051906020019092919080519060200190929190505050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612cca806100cf6000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806314df96ee14610101578063288cdc911461015a5780632ac126221461019f578063363349be146101e4578063394c21e7146103f85780633b30ba59146104975780634f150787146104ee578063741bcc931461071b5780637e9abb50146107cf5780638163681e1461081457806398024a8b146108a6578063add1cbc5146108fb578063b7b2c7d614610952578063baa0181d14610b8b578063bc61394a14610cef578063cfc4d0ec14610dc3578063f06bbf7514610e60578063ffa1ad7414610e93575b600080fd5b34801561010d57600080fd5b50610140600480360381019080803590602001909291908035906020019092919080359060200190929190505050610f23565b604051808215151515815260200191505060405180910390f35b34801561016657600080fd5b506101896004803603810190808035600019169060200190929190505050610f7b565b6040518082815260200191505060405180910390f35b3480156101ab57600080fd5b506101ce6004803603810190808035600019169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b3480156101f057600080fd5b506103e260048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561027257848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061022d565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156102f157848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906102ac565b5050505050919291929080359060200190929190803515159060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610fab565b6040518082815260200191505060405180910390f35b34801561040457600080fd5b506104816004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190505050611110565b6040518082815260200191505060405180910390f35b3480156104a357600080fd5b506104ac6115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104fa57600080fd5b5061071960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561057c57848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610537565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156105fb57848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906105b6565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061161d565b005b34801561072757600080fd5b506107cd6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506116da565b005b3480156107db57600080fd5b506107fe60048036038101908080356000191690602001909291905050506116ff565b6040518082815260200191505060405180910390f35b34801561082057600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611748565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108e5600480360381019080803590602001909291908035906020019092919080359060200190929190505050611849565b6040518082815260200191505060405180910390f35b34801561090757600080fd5b50610910611867565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b50610b8960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156109e057848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061099b565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610a5f57848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610a1a565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061188d565b005b348015610b9757600080fd5b50610ced60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c1957848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610bd4565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c9857848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610c53565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061194d565b005b348015610cfb57600080fd5b50610dad6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803515159060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506119c0565b6040518082815260200191505060405180910390f35b348015610dcf57600080fd5b50610e426004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c00190600680602002604051908101604052809291908260066020028082843782019150505050509192919290505050612160565b60405180826000191660001916815260200191505060405180910390f35b348015610e6c57600080fd5b50610e7561240b565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610e9f57600080fd5b50610ea8612411565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ee8578082015181840152602081019050610ecd565b50505050905090810190601f168015610f155780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600080600084801515610f3257fe5b86850991506000821415610f495760009250610f72565b610f68610f5983620f424061244a565b610f63888761244a565b61247d565b90506103e8811192505b50509392505050565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b6000806000809150600090505b895181101561110057896000815181101515610fd057fe5b906020019060200201516003600581101515610fe857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168a8281518110151561101157fe5b90602001906020020151600360058110151561102957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1614151561105057600080fd5b6110e4826110df8c8481518110151561106557fe5b906020019060200201518c8581518110151561107d57fe5b906020019060200201516110918d88612498565b8c8c888151811015156110a057fe5b906020019060200201518c898151811015156110b857fe5b906020019060200201518c8a8151811015156110d057fe5b906020019060200201516119c0565b6124b1565b9150878214156110f357611100565b8080600101915050610fb8565b8192505050979650505050505050565b600061111a612bd2565b6000806101606040519081016040528088600060058110151561113957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600160058110151561116857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600260058110151561119757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860036005811015156111c657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860046005811015156111f557fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200187600060068110151561122457fe5b6020020151815260200187600160068110151561123d57fe5b6020020151815260200187600260068110151561125657fe5b6020020151815260200187600360068110151561126f57fe5b6020020151815260200187600460068110151561128857fe5b6020020151815260200161129c8989612160565b6000191681525092503373ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161415156112e357600080fd5b60008360a001511180156112fb575060008360c00151115b80156113075750600085115b151561131257600080fd5b8261012001514210151561136f57826101400151600019166000600381111561133757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61138a8360c001516113858561014001516116ff565b612498565b915061139685836124cf565b905060008114156113f05782610140015160001916600160038111156113b857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61141a600360008561014001516000191660001916815260200190815260200160002054826124b1565b60036000856101400151600019166000191681526020019081526020016000208190555082604001518360600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916836080015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff167f67d66f160bc93d925d05dae1794c90d2d6d6688b29b84ff069398a9b0458713186604001518760600151611552878a60c001518b60a00151611849565b878a6101400151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182600019166000191681526020019550505050505060405180910390a48093505b5050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b86518110156116d1576116c4878281518110151561163d57fe5b90602001906020020151878381518110151561165557fe5b90602001906020020151878481518110151561166d57fe5b90602001906020020151878581518110151561168557fe5b90602001906020020151878681518110151561169d57fe5b9060200190602002015187878151811015156116b557fe5b906020019060200201516116da565b8080600101915050611623565b50505050505050565b836116eb87878760008888886119c0565b1415156116f757600080fd5b505050505050565b600061174160026000846000191660001916815260200190815260200160002054600360008560001916600019168152602001908152602001600020546124b1565b9050919050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015611806573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600061185e611858858461244a565b8461247d565b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b87518110156119435761193588828151811015156118ad57fe5b9060200190602002015188838151811015156118c557fe5b9060200190602002015188848151811015156118dd57fe5b906020019060200201518888868151811015156118f657fe5b90602001906020020151888781518110151561190e57fe5b90602001906020020151888881518110151561192657fe5b906020019060200201516119c0565b508080600101915050611893565b5050505050505050565b60008090505b83518110156119ba576119ac848281518110151561196d57fe5b90602001906020020151848381518110151561198557fe5b90602001906020020151848481518110151561199d57fe5b90602001906020020151611110565b508080600101915050611953565b50505050565b60006119ca612bd2565b600080600080610160604051908101604052808e60006005811015156119ec57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6001600581101515611a1b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6002600581101515611a4a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6003600581101515611a7957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6004600581101515611aa857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018d6000600681101515611ad757fe5b602002015181526020018d6001600681101515611af057fe5b602002015181526020018d6002600681101515611b0957fe5b602002015181526020018d6003600681101515611b2257fe5b602002015181526020018d6004600681101515611b3b57fe5b60200201518152602001611b4f8f8f612160565b600019168152509450600073ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161480611bc657503373ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16145b1515611bd157600080fd5b60008560a00151118015611be9575060008560c00151115b8015611bf5575060008b115b1515611c0057600080fd5b611c1685600001518661014001518b8b8b611748565b1515611c2157600080fd5b84610120015142101515611c7e578461014001516000191660006003811115611c4657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611c998560c00151611c948761014001516116ff565b612498565b9350611ca58b856124cf565b95506000861415611cff578461014001516000191660016003811115611cc757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611d12868660c001518760a00151610f23565b15611d66578461014001516000191660026003811115611d2e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b89158015611d7b5750611d7985876124e8565b155b15611dce5784610140015160001916600380811115611d9657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611de1868660c001518760a00151611849565b9250611e0d600260008761014001516000191660001916815260200190815260200160002054876124b1565b600260008761014001516000191660001916815260200190815260200160002081905550611e45856040015186600001513386612838565b1515611e5057600080fd5b611e64856060015133876000015189612838565b1515611e6f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff16141515611f6e5760008560e001511115611f0c57611ec9868660c001518760e00151611849565b9150611f006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151876080015185612838565b1515611f0b57600080fd5b5b60008561010001511115611f6d57611f2e868660c00151876101000151611849565b9050611f616000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633876080015184612838565b1515611f6c57600080fd5b5b5b84604001518560600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916856080015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182600019166000191681526020019850505050505050505060405180910390a48595505b5050505050979650505050505050565b60003083600060058110151561217257fe5b602002015184600160058110151561218657fe5b602002015185600260058110151561219a57fe5b60200201518660036005811015156121ae57fe5b60200201518760046005811015156121c257fe5b60200201518760006006811015156121d657fe5b60200201518860016006811015156121ea57fe5b60200201518960026006811015156121fe57fe5b60200201518a600360068110151561221257fe5b60200201518b600460068110151561222657fe5b60200201518c600560068110151561223a57fe5b6020020151604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018781526020018681526020018581526020018481526020018381526020018281526020019c505050505050505050505050506040518091039020905092915050565b61138781565b6040805190810160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808284029050600084148061246b575082848281151561246857fe5b04145b151561247357fe5b8091505092915050565b600080828481151561248b57fe5b0490508091505092915050565b60008282111515156124a657fe5b818303905092915050565b60008082840190508381101515156124c557fe5b8091505092915050565b60008183106124de57816124e0565b825b905092915050565b600080600080600080600080600033975061250c8a8c60c001518d60a00151611849565b9650600073ffffffffffffffffffffffffffffffffffffffff168b6080015173ffffffffffffffffffffffffffffffffffffffff161415156127b9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6040015173ffffffffffffffffffffffffffffffffffffffff161495506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6060015173ffffffffffffffffffffffffffffffffffffffff161494506126078a8c60c001518d60e00151611849565b935061261d8a8c60c001518d6101000151611849565b92508561262a5783612635565b61263487856124b1565b5b915084612642578261264d565b61264c8a846124b1565b5b90508161267f6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d600001516129ac565b10806126b85750816126b66000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60000151612a94565b105b806126ec5750806126ea6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a6129ac565b105b8061272057508061271e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612a94565b105b1561272e576000985061282a565b8515801561276757508661274a8c604001518d600001516129ac565b10806127665750866127648c604001518d60000151612a94565b105b5b15612775576000985061282a565b841580156127a657508961278d8c606001518a6129ac565b10806127a55750896127a38c606001518a612a94565b105b5b156127b4576000985061282a565b612825565b866127cc8c604001518d600001516129ac565b10806127e85750866127e68c604001518d60000151612a94565b105b806127ff5750896127fd8c606001518a6129ac565b105b806128165750896128148c606001518a612a94565b105b15612824576000985061282a565b5b600198505b505050505050505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15801561296757600080fd5b505af115801561297b573d6000803e3d6000fd5b505050506040513d602081101561299157600080fd5b81019080805190602001909291905050509050949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a0823161138761ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b158015612a5057600080fd5b5087f1158015612a64573d6000803e3d6000fd5b50505050506040513d6020811015612a7b57600080fd5b8101908080519060200190929190505050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61138761ffff1684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b158015612b8e57600080fd5b5087f1158015612ba2573d6000803e3d6000fd5b50505050506040513d6020811015612bb957600080fd5b8101908080519060200190929190505050905092915050565b61016060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815250905600a165627a7a72305820f91599ebd80f85632ef190bb5e1a738e7288d68a2cf9dcc6b579d76b892dcf6f0029';
diff --git a/packages/sol-compiler/test/util/constants.ts b/packages/sol-compiler/test/util/constants.ts
new file mode 100644
index 000000000..88d6db550
--- /dev/null
+++ b/packages/sol-compiler/test/util/constants.ts
@@ -0,0 +1,11 @@
+import { BigNumber } from '@0xproject/utils';
+
+export const constants = {
+ networkId: 0,
+ optimizerEnabled: false,
+ gasPrice: new BigNumber(20000000000),
+ timeoutMs: 30000,
+ zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4',
+ contracts: '*' as '*',
+};
diff --git a/packages/sol-compiler/test/util/provider.ts b/packages/sol-compiler/test/util/provider.ts
new file mode 100644
index 000000000..cc372b2eb
--- /dev/null
+++ b/packages/sol-compiler/test/util/provider.ts
@@ -0,0 +1,7 @@
+import { web3Factory } from '@0xproject/dev-utils';
+import { Provider } from 'ethereum-types';
+
+const providerConfigs = { shouldUseInProcessGanache: true };
+const provider: Provider = web3Factory.getRpcProvider(providerConfigs);
+
+export { provider };
diff --git a/packages/sol-compiler/tsconfig.json b/packages/sol-compiler/tsconfig.json
new file mode 100644
index 000000000..63cbc75c3
--- /dev/null
+++ b/packages/sol-compiler/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib",
+ "strictFunctionTypes": false
+ },
+ "include": ["./src/**/*", "./test/**/*"]
+}
diff --git a/packages/sol-compiler/tslint.json b/packages/sol-compiler/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/sol-compiler/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/sol-cov/CHANGELOG.json b/packages/sol-cov/CHANGELOG.json
index 1e5abb5a0..5f6b1685b 100644
--- a/packages/sol-cov/CHANGELOG.json
+++ b/packages/sol-cov/CHANGELOG.json
@@ -1,12 +1,233 @@
[
{
+ "version": "2.0.0",
+ "changes": [
+ {
+ "note":
+ "Fix a bug when eth_call coverage was not computed because of silent schema validation failures",
+ "pr": 938
+ },
+ {
+ "note": "Make `TruffleArtifactAdapter` read the `truffle.js` config for `solc` settings",
+ "pr": 938
+ },
+ {
+ "note":
+ "Change the first param of `TruffleArtifactAdapter` to be the `projectRoot` instead of `sourcesDir`",
+ "pr": 938
+ },
+ {
+ "note":
+ "Throw a helpful error message if truffle artifacts were generated with a different solc version than the one passed in",
+ "pr": 938
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note":
+ "Add artifact adapter as a parameter for `CoverageSubprovider`. Export `AbstractArtifactAdapter`",
+ "pr": 589
+ },
+ {
+ "note": "Implement `SolCompilerArtifactAdapter` and `TruffleArtifactAdapter`",
+ "pr": 589
+ },
+ {
+ "note": "Properly parse multi-level traces",
+ "pr": 589
+ },
+ {
+ "note": "Add support for solidity libraries",
+ "pr": 589
+ },
+ {
+ "note": "Fixed a bug causing `RegExp` to crash if contract code is longer that 32767 characters",
+ "pr": 675
+ },
+ {
+ "note": "Fixed a bug caused by Geth debug trace depth being 1indexed",
+ "pr": 675
+ },
+ {
+ "note": "Fixed a bug when the tool crashed on empty traces",
+ "pr": 675
+ },
+ {
+ "note": "Use `BlockchainLifecycle` to support reverts on Geth",
+ "pr": 675
+ },
+ {
+ "note": "Add `ProfilerSubprovider` as a hacky way to profile code using coverage tools",
+ "pr": 675
+ },
+ {
+ "note": "Collect traces from `estimate_gas` calls",
+ "pr": 675
+ },
+ {
+ "note": "Fix a race condition caused by not awaiting the transaction before getting a trace",
+ "pr": 675
+ },
+ {
+ "note": "Add `start`/`stop` functionality to `CoverageSubprovider` and `ProfilerSubprovider`",
+ "pr": 675
+ },
+ {
+ "note": "Skip interface artifacts with a warning instead of failing",
+ "pr": 675
+ },
+ {
+ "note": "Fix `solcVersion` regex in parameter validation",
+ "pr": 690
+ },
+ {
+ "note":
+ "Fix a bug when in `TruffleArtifactsAdapter` causing it to throw if `compiler.json` is not there",
+ "pr": 690
+ },
+ {
+ "note": "HUGE perf improvements",
+ "pr": 690
+ },
+ {
+ "note": "Create `RevertTraceSubprovider` which prints a stack trace when a `REVERT` is detected",
+ "pr": 705
+ },
+ {
+ "note": "Add source code snippets to stack traces printed by `RevertTraceSubprovider`",
+ "pr": 725
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.1.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.1.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.1.0",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527009134,
+ "version": "0.0.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.0.5",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
}
]
diff --git a/packages/sol-cov/CHANGELOG.md b/packages/sol-cov/CHANGELOG.md
index eee2bd7d9..d7bdb9614 100644
--- a/packages/sol-cov/CHANGELOG.md
+++ b/packages/sol-cov/CHANGELOG.md
@@ -1,10 +1,90 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v2.0.0 - _August 13, 2018_
+
+ * Fix a bug when eth_call coverage was not computed because of silent schema validation failures (#938)
+ * Make `TruffleArtifactAdapter` read the `truffle.js` config for `solc` settings (#938)
+ * Change the first param of `TruffleArtifactAdapter` to be the `projectRoot` instead of `sourcesDir` (#938)
+ * Throw a helpful error message if truffle artifacts were generated with a different solc version than the one passed in (#938)
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Add artifact adapter as a parameter for `CoverageSubprovider`. Export `AbstractArtifactAdapter` (#589)
+ * Implement `SolCompilerArtifactAdapter` and `TruffleArtifactAdapter` (#589)
+ * Properly parse multi-level traces (#589)
+ * Add support for solidity libraries (#589)
+ * Fixed a bug causing `RegExp` to crash if contract code is longer that 32767 characters (#675)
+ * Fixed a bug caused by Geth debug trace depth being 1indexed (#675)
+ * Fixed a bug when the tool crashed on empty traces (#675)
+ * Use `BlockchainLifecycle` to support reverts on Geth (#675)
+ * Add `ProfilerSubprovider` as a hacky way to profile code using coverage tools (#675)
+ * Collect traces from `estimate_gas` calls (#675)
+ * Fix a race condition caused by not awaiting the transaction before getting a trace (#675)
+ * Add `start`/`stop` functionality to `CoverageSubprovider` and `ProfilerSubprovider` (#675)
+ * Skip interface artifacts with a warning instead of failing (#675)
+ * Fix `solcVersion` regex in parameter validation (#690)
+ * Fix a bug when in `TruffleArtifactsAdapter` causing it to throw if `compiler.json` is not there (#690)
+ * HUGE perf improvements (#690)
+ * Create `RevertTraceSubprovider` which prints a stack trace when a `REVERT` is detected (#705)
+ * Add source code snippets to stack traces printed by `RevertTraceSubprovider` (#725)
+
+## v0.1.3 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.1.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.1.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.1.0 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.0.11 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.10 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.9 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.8 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.0.6 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.0.5 - _April 2, 2018_
* Dependencies updated
diff --git a/packages/sol-cov/README.md b/packages/sol-cov/README.md
index 5591b9731..0a63ac06e 100644
--- a/packages/sol-cov/README.md
+++ b/packages/sol-cov/README.md
@@ -2,7 +2,7 @@
A Solidity code coverage tool.
-### Read the [Documentation](0xproject.com/docs/sol-cov).
+### Read the [Documentation](https://0xproject.com/docs/sol-cov).
## Installation
@@ -24,11 +24,11 @@ var CoverageSubprovider = require('@0xproject/sol-cov').CoverageSubprovider;
## Contributing
-We strongly encourage the community to help us make improvements. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -42,8 +42,34 @@ Then install dependencies
yarn install
```
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/sol-cov yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/sol-cov yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
### Lint
```bash
yarn lint
```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/sol-cov/compiler.json b/packages/sol-cov/compiler.json
new file mode 100644
index 000000000..a6a0c6d3a
--- /dev/null
+++ b/packages/sol-cov/compiler.json
@@ -0,0 +1,18 @@
+{
+ "contracts": ["SimpleStorage"],
+ "contractsDir": "test/fixtures/contracts",
+ "artifactsDir": "test/fixtures/artifacts",
+ "compilerSettings": {
+ "outputSelection": {
+ "*": {
+ "*": [
+ "abi",
+ "evm.bytecode.object",
+ "evm.bytecode.sourceMap",
+ "evm.deployedBytecode.object",
+ "evm.deployedBytecode.sourceMap"
+ ]
+ }
+ }
+ }
+}
diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json
index 2942a2ac0..4c3000360 100644
--- a/packages/sol-cov/package.json
+++ b/packages/sol-cov/package.json
@@ -1,21 +1,28 @@
{
"name": "@0xproject/sol-cov",
- "version": "0.0.5",
+ "version": "2.0.0",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Generate coverage reports for Solidity code",
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "lint": "tslint --project . 'src/**/*.ts'",
- "test": "run-s clean build run_mocha",
+ "watch_without_deps": "yarn pre_build && tsc -w",
+ "build": "yarn pre_build && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "pre_build": "run-s copy_test_fixtures",
+ "lint": "tslint --project .",
+ "test": "run-s compile_test run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"test:circleci": "yarn test:coverage",
- "run_mocha": "mocha lib/test/**/*_test.js",
- "clean": "shx rm -rf lib scripts",
- "build": "copyfiles 'test/fixtures/**/*' ./lib && tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
+ "clean": "shx rm -rf lib scripts test/fixtures/artifacts src/artifacts",
+ "copy_test_fixtures": "copyfiles 'test/fixtures/**/*' ./lib",
+ "compile_test": "sol-compiler compile",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
@@ -24,7 +31,9 @@
"assets": [],
"docPublishConfigs": {
"extraFileIncludes": [
- "../subproviders/src/types.ts"
+ "../subproviders/src/types.ts",
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
],
"s3BucketPath": "s3://doc-jsons/sol-cov/",
"s3StagingBucketPath": "s3://staging-doc-jsons/sol-cov/"
@@ -41,36 +50,46 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/sol-cov/README.md",
"dependencies": {
- "@0xproject/subproviders": "^0.8.3",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
+ "@types/solidity-parser-antlr": "^0.2.1",
+ "ethereum-types": "^1.0.4",
"ethereumjs-util": "^5.1.1",
"glob": "^7.1.2",
"istanbul": "^0.4.5",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
+ "loglevel": "^1.6.1",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.6.2",
"semaphore-async-await": "^1.5.1",
- "solidity-coverage": "^0.4.10",
- "solidity-parser-antlr": "^0.2.7",
- "solidity-parser-sc": "^0.4.4"
+ "solidity-parser-antlr": "^0.2.12"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/istanbul": "^0.4.29",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/istanbul": "^0.4.30",
+ "@types/loglevel": "^1.5.3",
+ "@types/mkdirp": "^0.5.1",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
+ "@types/rimraf": "^2.0.2",
+ "@types/solidity-parser-antlr": "^0.2.1",
"chai": "^4.0.1",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
"sinon": "^4.0.0",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts
new file mode 100644
index 000000000..fcc6562ad
--- /dev/null
+++ b/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts
@@ -0,0 +1,5 @@
+import { ContractData } from '../types';
+
+export abstract class AbstractArtifactAdapter {
+ public abstract async collectContractsDataAsync(): Promise<ContractData[]>;
+}
diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts
new file mode 100644
index 000000000..8e03bf7fd
--- /dev/null
+++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts
@@ -0,0 +1,56 @@
+import { CompilerOptions, ContractArtifact } from '@0xproject/sol-compiler';
+import { logUtils } from '@0xproject/utils';
+import * as fs from 'fs';
+import * as glob from 'glob';
+import * as _ from 'lodash';
+import * as path from 'path';
+
+import { ContractData } from '../types';
+
+import { AbstractArtifactAdapter } from './abstract_artifact_adapter';
+
+const CONFIG_FILE = 'compiler.json';
+
+export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter {
+ private readonly _artifactsPath: string;
+ private readonly _sourcesPath: string;
+ constructor(artifactsPath?: string, sourcesPath?: string) {
+ super();
+ const config: CompilerOptions = fs.existsSync(CONFIG_FILE)
+ ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString())
+ : {};
+ if (_.isUndefined(artifactsPath) && _.isUndefined(config.artifactsDir)) {
+ throw new Error(`artifactsDir not found in ${CONFIG_FILE}`);
+ }
+ this._artifactsPath = (artifactsPath || config.artifactsDir) as string;
+ if (_.isUndefined(sourcesPath) && _.isUndefined(config.contractsDir)) {
+ throw new Error(`contractsDir not found in ${CONFIG_FILE}`);
+ }
+ this._sourcesPath = (sourcesPath || config.contractsDir) as string;
+ }
+ public async collectContractsDataAsync(): Promise<ContractData[]> {
+ const artifactsGlob = `${this._artifactsPath}/**/*.json`;
+ const artifactFileNames = glob.sync(artifactsGlob, { absolute: true });
+ const contractsData: ContractData[] = [];
+ for (const artifactFileName of artifactFileNames) {
+ const artifact: ContractArtifact = JSON.parse(fs.readFileSync(artifactFileName).toString());
+ if (_.isUndefined(artifact.compilerOutput.evm)) {
+ logUtils.warn(`${artifactFileName} doesn't contain bytecode. Skipping...`);
+ continue;
+ }
+ let sources = _.keys(artifact.sources);
+ sources = _.map(sources, relativeFilePath => path.resolve(this._sourcesPath, relativeFilePath));
+ const sourceCodes = _.map(sources, (source: string) => fs.readFileSync(source).toString());
+ const contractData = {
+ sourceCodes,
+ sources,
+ bytecode: artifact.compilerOutput.evm.bytecode.object,
+ sourceMap: artifact.compilerOutput.evm.bytecode.sourceMap,
+ runtimeBytecode: artifact.compilerOutput.evm.deployedBytecode.object,
+ sourceMapRuntime: artifact.compilerOutput.evm.deployedBytecode.sourceMap,
+ };
+ contractsData.push(contractData);
+ }
+ return contractsData;
+ }
+}
diff --git a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
new file mode 100644
index 000000000..2706435cc
--- /dev/null
+++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
@@ -0,0 +1,83 @@
+import { Compiler, CompilerOptions } from '@0xproject/sol-compiler';
+import * as fs from 'fs';
+import * as glob from 'glob';
+import * as path from 'path';
+
+import { ContractData } from '../types';
+
+import { AbstractArtifactAdapter } from './abstract_artifact_adapter';
+import { SolCompilerArtifactAdapter } from './sol_compiler_artifact_adapter';
+
+const DEFAULT_TRUFFLE_ARTIFACTS_DIR = './build/contracts';
+
+interface TruffleConfig {
+ solc?: any;
+ contracts_build_directory?: string;
+}
+
+export class TruffleArtifactAdapter extends AbstractArtifactAdapter {
+ private readonly _solcVersion: string;
+ private readonly _projectRoot: string;
+ constructor(projectRoot: string, solcVersion: string) {
+ super();
+ this._solcVersion = solcVersion;
+ this._projectRoot = projectRoot;
+ }
+ public async collectContractsDataAsync(): Promise<ContractData[]> {
+ const artifactsDir = '.0x-artifacts';
+ const contractsDir = path.join(this._projectRoot, 'contracts');
+ const truffleConfig = this._getTruffleConfig();
+ const solcConfig = truffleConfig.solc || {};
+ const truffleArtifactsDirectory = truffleConfig.contracts_build_directory || DEFAULT_TRUFFLE_ARTIFACTS_DIR;
+ this._assertSolidityVersionIsCorrect(truffleArtifactsDirectory);
+ const compilerOptions: CompilerOptions = {
+ contractsDir,
+ artifactsDir,
+ compilerSettings: {
+ ...solcConfig,
+ outputSelection: {
+ ['*']: {
+ ['*']: ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'],
+ },
+ },
+ },
+ contracts: '*',
+ solcVersion: this._solcVersion,
+ };
+ const compiler = new Compiler(compilerOptions);
+ await compiler.compileAsync();
+ const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);
+ const contractsDataFrom0xArtifacts = await solCompilerArtifactAdapter.collectContractsDataAsync();
+ return contractsDataFrom0xArtifacts;
+ }
+ private _getTruffleConfig(): TruffleConfig {
+ const truffleConfigFileShort = path.resolve(path.join(this._projectRoot, 'truffle.js'));
+ const truffleConfigFileLong = path.resolve(path.join(this._projectRoot, 'truffle-config.js'));
+ if (fs.existsSync(truffleConfigFileShort)) {
+ const truffleConfig = require(truffleConfigFileShort);
+ return truffleConfig;
+ } else if (fs.existsSync(truffleConfigFileLong)) {
+ const truffleConfig = require(truffleConfigFileLong);
+ return truffleConfig;
+ } else {
+ throw new Error(
+ `Neither ${truffleConfigFileShort} nor ${truffleConfigFileLong} exists. Make sure the project root is correct`,
+ );
+ }
+ }
+ private _assertSolidityVersionIsCorrect(truffleArtifactsDirectory: string): void {
+ const artifactsGlob = `${truffleArtifactsDirectory}/**/*.json`;
+ const artifactFileNames = glob.sync(artifactsGlob, { absolute: true });
+ for (const artifactFileName of artifactFileNames) {
+ const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString());
+ const compilerVersion = artifact.compiler.version;
+ if (!compilerVersion.startsWith(this._solcVersion)) {
+ throw new Error(
+ `${artifact.contractName} was compiled with solidity ${compilerVersion} but specified version is ${
+ this._solcVersion
+ } making it impossible for sol-cov to process traces`,
+ );
+ }
+ }
+ }
+}
diff --git a/packages/sol-cov/src/ast_visitor.ts b/packages/sol-cov/src/ast_visitor.ts
index 88309d3eb..e55cdf6ec 100644
--- a/packages/sol-cov/src/ast_visitor.ts
+++ b/packages/sol-cov/src/ast_visitor.ts
@@ -18,13 +18,18 @@ enum BranchType {
export class ASTVisitor {
private _entryId = 0;
- private _fnMap: FnMap = {};
- private _branchMap: BranchMap = {};
- private _modifiersStatementIds: number[] = [];
- private _statementMap: StatementMap = {};
- private _locationByOffset: LocationByOffset;
- constructor(locationByOffset: LocationByOffset) {
+ private readonly _fnMap: FnMap = {};
+ private readonly _branchMap: BranchMap = {};
+ private readonly _modifiersStatementIds: number[] = [];
+ private readonly _statementMap: StatementMap = {};
+ private readonly _locationByOffset: LocationByOffset;
+ private readonly _ignoreRangesBeginningAt: number[];
+ // keep track of contract/function ranges that are to be ignored
+ // so we can also ignore any children nodes within the contract/function
+ private readonly _ignoreRangesWithin: Array<[number, number]> = [];
+ constructor(locationByOffset: LocationByOffset, ignoreRangesBeginningAt: number[] = []) {
this._locationByOffset = locationByOffset;
+ this._ignoreRangesBeginningAt = ignoreRangesBeginningAt;
}
public getCollectedCoverageEntries(): CoverageEntriesDescription {
const coverageEntriesDescription = {
@@ -42,6 +47,11 @@ export class ASTVisitor {
public FunctionDefinition(ast: Parser.FunctionDefinition): void {
this._visitFunctionLikeDefinition(ast);
}
+ public ContractDefinition(ast: Parser.ContractDefinition): void {
+ if (this._shouldIgnoreExpression(ast)) {
+ this._ignoreRangesWithin.push(ast.range as [number, number]);
+ }
+ }
public ModifierDefinition(ast: Parser.ModifierDefinition): void {
this._visitFunctionLikeDefinition(ast);
}
@@ -57,6 +67,9 @@ export class ASTVisitor {
public ContinueStatement(ast: Parser.ContinueStatement): void {
this._visitStatement(ast);
}
+ public EmitStatement(ast: any /* TODO: Parser.EmitStatement */): void {
+ this._visitStatement(ast);
+ }
public VariableDeclarationStatement(ast: Parser.VariableDeclarationStatement): void {
this._visitStatement(ast);
}
@@ -93,6 +106,9 @@ export class ASTVisitor {
public ModifierInvocation(ast: Parser.ModifierInvocation): void {
const BUILTIN_MODIFIERS = ['public', 'view', 'payable', 'external', 'internal', 'pure', 'constant'];
if (!_.includes(BUILTIN_MODIFIERS, ast.name)) {
+ if (this._shouldIgnoreExpression(ast)) {
+ return;
+ }
this._modifiersStatementIds.push(this._entryId);
this._visitStatement(ast);
}
@@ -103,6 +119,9 @@ export class ASTVisitor {
right: Parser.ASTNode,
type: BranchType,
): void {
+ if (this._shouldIgnoreExpression(ast)) {
+ return;
+ }
this._branchMap[this._entryId++] = {
line: this._getExpressionRange(ast).start.line,
type,
@@ -110,18 +129,34 @@ export class ASTVisitor {
};
}
private _visitStatement(ast: Parser.ASTNode): void {
+ if (this._shouldIgnoreExpression(ast)) {
+ return;
+ }
this._statementMap[this._entryId++] = this._getExpressionRange(ast);
}
private _getExpressionRange(ast: Parser.ASTNode): SingleFileSourceRange {
- const start = this._locationByOffset[ast.range[0]];
- const end = this._locationByOffset[ast.range[1] + 1];
+ const astRange = ast.range as [number, number];
+ const start = this._locationByOffset[astRange[0]];
+ const end = this._locationByOffset[astRange[1] + 1];
const range = {
start,
end,
};
return range;
}
+ private _shouldIgnoreExpression(ast: Parser.ASTNode): boolean {
+ const [astStart, astEnd] = ast.range as [number, number];
+ const isRangeIgnored = _.some(
+ this._ignoreRangesWithin,
+ ([rangeStart, rangeEnd]: [number, number]) => astStart >= rangeStart && astEnd <= rangeEnd,
+ );
+ return this._ignoreRangesBeginningAt.includes(astStart) || isRangeIgnored;
+ }
private _visitFunctionLikeDefinition(ast: Parser.ModifierDefinition | Parser.FunctionDefinition): void {
+ if (this._shouldIgnoreExpression(ast)) {
+ this._ignoreRangesWithin.push(ast.range as [number, number]);
+ return;
+ }
const loc = this._getExpressionRange(ast);
this._fnMap[this._entryId++] = {
name: ast.name,
diff --git a/packages/sol-cov/src/collect_contract_data.ts b/packages/sol-cov/src/collect_contract_data.ts
deleted file mode 100644
index a0ce2640f..000000000
--- a/packages/sol-cov/src/collect_contract_data.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as fs from 'fs';
-import * as glob from 'glob';
-import * as _ from 'lodash';
-import * as path from 'path';
-
-import { ContractData } from './types';
-
-export const collectContractsData = (artifactsPath: string, sourcesPath: string, networkId: number) => {
- const sourcesGlob = `${sourcesPath}/**/*.sol`;
- const sourceFileNames = glob.sync(sourcesGlob, { absolute: true });
- const contractsDataIfExists: Array<ContractData | {}> = _.map(sourceFileNames, sourceFileName => {
- const baseName = path.basename(sourceFileName, '.sol');
- const artifactFileName = path.join(artifactsPath, `${baseName}.json`);
- if (!fs.existsSync(artifactFileName)) {
- // If the contract isn't directly compiled, but is imported as the part of the other contract - we don't
- // have an artifact for it and therefore can't do anything useful with it
- return {};
- }
- const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString());
- const sources = _.map(artifact.networks[networkId].sources, source => {
- const includedFileName = glob.sync(`${sourcesPath}/**/${source}`, { absolute: true })[0];
- return includedFileName;
- });
- const sourceCodes = _.map(sources, source => {
- const includedSourceCode = fs.readFileSync(source).toString();
- return includedSourceCode;
- });
- if (_.isUndefined(artifact.networks[networkId])) {
- throw new Error(`No ${baseName} artifacts found for networkId ${networkId}`);
- }
- const contractData = {
- baseName,
- sourceCodes,
- sources,
- sourceMap: artifact.networks[networkId].source_map,
- sourceMapRuntime: artifact.networks[networkId].source_map_runtime,
- runtimeBytecode: artifact.networks[networkId].runtime_bytecode,
- bytecode: artifact.networks[networkId].bytecode,
- };
- return contractData;
- });
- const contractsData = _.filter(contractsDataIfExists, contractData => !_.isEmpty(contractData)) as ContractData[];
- return contractsData;
-};
diff --git a/packages/sol-cov/src/collect_coverage_entries.ts b/packages/sol-cov/src/collect_coverage_entries.ts
index 97218616c..bdbcd613e 100644
--- a/packages/sol-cov/src/collect_coverage_entries.ts
+++ b/packages/sol-cov/src/collect_coverage_entries.ts
@@ -1,24 +1,41 @@
import * as ethUtil from 'ethereumjs-util';
-import * as fs from 'fs';
import * as _ from 'lodash';
-import * as path from 'path';
import * as parser from 'solidity-parser-antlr';
import { ASTVisitor, CoverageEntriesDescription } from './ast_visitor';
import { getLocationByOffset } from './source_maps';
+const IGNORE_RE = /\/\*\s*solcov\s+ignore\s+next\s*\*\/\s*/gm;
+
// Parsing source code for each transaction/code is slow and therefore we cache it
const coverageEntriesBySourceHash: { [sourceHash: string]: CoverageEntriesDescription } = {};
export const collectCoverageEntries = (contractSource: string) => {
const sourceHash = ethUtil.sha3(contractSource).toString('hex');
- if (_.isUndefined(coverageEntriesBySourceHash[sourceHash])) {
+ if (_.isUndefined(coverageEntriesBySourceHash[sourceHash]) && !_.isUndefined(contractSource)) {
const ast = parser.parse(contractSource, { range: true });
const locationByOffset = getLocationByOffset(contractSource);
- const visitor = new ASTVisitor(locationByOffset);
+ const ignoreRangesBegingingAt = gatherRangesToIgnore(contractSource);
+ const visitor = new ASTVisitor(locationByOffset, ignoreRangesBegingingAt);
parser.visit(ast, visitor);
coverageEntriesBySourceHash[sourceHash] = visitor.getCollectedCoverageEntries();
}
const coverageEntriesDescription = coverageEntriesBySourceHash[sourceHash];
return coverageEntriesDescription;
};
+
+// Gather the start index of all code blocks preceeded by "/* solcov ignore next */"
+function gatherRangesToIgnore(contractSource: string): number[] {
+ const ignoreRangesStart = [];
+
+ let match;
+ do {
+ match = IGNORE_RE.exec(contractSource);
+ if (match) {
+ const matchLen = match[0].length;
+ ignoreRangesStart.push(match.index + matchLen);
+ }
+ } while (match);
+
+ return ignoreRangesStart;
+}
diff --git a/packages/sol-cov/src/constants.ts b/packages/sol-cov/src/constants.ts
index 64d2228a3..34d62b537 100644
--- a/packages/sol-cov/src/constants.ts
+++ b/packages/sol-cov/src/constants.ts
@@ -1,6 +1,6 @@
// tslint:disable:number-literal-format
export const constants = {
- NEW_CONTRACT: 'NEW_CONTRACT',
+ NEW_CONTRACT: 'NEW_CONTRACT' as 'NEW_CONTRACT',
PUSH1: 0x60,
PUSH2: 0x61,
PUSH32: 0x7f,
diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts
deleted file mode 100644
index 230ccc3c9..000000000
--- a/packages/sol-cov/src/coverage_manager.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-import * as fs from 'fs';
-import { Collector } from 'istanbul';
-import * as _ from 'lodash';
-import * as path from 'path';
-
-import { collectContractsData } from './collect_contract_data';
-import { collectCoverageEntries } from './collect_coverage_entries';
-import { constants } from './constants';
-import { parseSourceMap } from './source_maps';
-import {
- BranchCoverage,
- BranchDescription,
- BranchMap,
- ContractData,
- Coverage,
- FnMap,
- FunctionCoverage,
- FunctionDescription,
- LineColumn,
- SingleFileSourceRange,
- SourceRange,
- StatementCoverage,
- StatementDescription,
- StatementMap,
- TraceInfo,
- TraceInfoExistingContract,
- TraceInfoNewContract,
-} from './types';
-import { utils } from './utils';
-
-export class CoverageManager {
- private _traceInfos: TraceInfo[] = [];
- private _contractsData: ContractData[] = [];
- private _getContractCodeAsync: (address: string) => Promise<string>;
- private static _getSingleFileCoverageForTrace(
- contractData: ContractData,
- coveredPcs: number[],
- pcToSourceRange: { [programCounter: number]: SourceRange },
- fileIndex: number,
- ): Coverage {
- const fileName = contractData.sources[fileIndex];
- const coverageEntriesDescription = collectCoverageEntries(contractData.sourceCodes[fileIndex]);
- let sourceRanges = _.map(coveredPcs, coveredPc => pcToSourceRange[coveredPc]);
- sourceRanges = _.compact(sourceRanges); // Some PC's don't map to a source range and we just ignore them.
- // By default lodash does a shallow object comparasion. We JSON.stringify them and compare as strings.
- sourceRanges = _.uniqBy(sourceRanges, s => JSON.stringify(s)); // We don't care if one PC was covered multiple times within a single transaction
- sourceRanges = _.filter(sourceRanges, sourceRange => sourceRange.fileName === fileName);
- const branchCoverage: BranchCoverage = {};
- const branchIds = _.keys(coverageEntriesDescription.branchMap);
- for (const branchId of branchIds) {
- const branchDescription = coverageEntriesDescription.branchMap[branchId];
- const isCoveredByBranchIndex = _.map(branchDescription.locations, location =>
- _.some(sourceRanges, range => utils.isRangeInside(range.location, location)),
- );
- branchCoverage[branchId] = isCoveredByBranchIndex;
- }
- const statementCoverage: StatementCoverage = {};
- const statementIds = _.keys(coverageEntriesDescription.statementMap);
- for (const statementId of statementIds) {
- const statementDescription = coverageEntriesDescription.statementMap[statementId];
- const isCovered = _.some(sourceRanges, range => utils.isRangeInside(range.location, statementDescription));
- statementCoverage[statementId] = isCovered;
- }
- const functionCoverage: FunctionCoverage = {};
- const functionIds = _.keys(coverageEntriesDescription.fnMap);
- for (const fnId of functionIds) {
- const functionDescription = coverageEntriesDescription.fnMap[fnId];
- const isCovered = _.some(sourceRanges, range =>
- utils.isRangeInside(range.location, functionDescription.loc),
- );
- functionCoverage[fnId] = isCovered;
- }
- // HACK: Solidity doesn't emit any opcodes that map back to modifiers with no args, that's why we map back to the
- // function range and check if there is any covered statement within that range.
- for (const modifierStatementId of coverageEntriesDescription.modifiersStatementIds) {
- if (statementCoverage[modifierStatementId]) {
- // Already detected as covered
- continue;
- }
- const modifierDescription = coverageEntriesDescription.statementMap[modifierStatementId];
- const enclosingFunction = _.find(coverageEntriesDescription.fnMap, functionDescription =>
- utils.isRangeInside(modifierDescription, functionDescription.loc),
- ) as FunctionDescription;
- const isModifierCovered = _.some(
- coverageEntriesDescription.statementMap,
- (statementDescription: StatementDescription, statementId: number) => {
- const isInsideTheModifierEnclosingFunction = utils.isRangeInside(
- statementDescription,
- enclosingFunction.loc,
- );
- const isCovered = statementCoverage[statementId];
- return isInsideTheModifierEnclosingFunction && isCovered;
- },
- );
- statementCoverage[modifierStatementId] = isModifierCovered;
- }
- const partialCoverage = {
- [contractData.sources[fileIndex]]: {
- ...coverageEntriesDescription,
- l: {}, // It's able to derive it from statement coverage
- path: fileName,
- f: functionCoverage,
- s: statementCoverage,
- b: branchCoverage,
- },
- };
- return partialCoverage;
- }
- constructor(
- artifactsPath: string,
- sourcesPath: string,
- networkId: number,
- getContractCodeAsync: (address: string) => Promise<string>,
- ) {
- this._getContractCodeAsync = getContractCodeAsync;
- this._contractsData = collectContractsData(artifactsPath, sourcesPath, networkId);
- }
- public appendTraceInfo(traceInfo: TraceInfo): void {
- this._traceInfos.push(traceInfo);
- }
- public async writeCoverageAsync(): Promise<void> {
- const finalCoverage = await this._computeCoverageAsync();
- const jsonReplacer: null = null;
- const numberOfJsonSpaces = 4;
- const stringifiedCoverage = JSON.stringify(finalCoverage, jsonReplacer, numberOfJsonSpaces);
- fs.writeFileSync('coverage/coverage.json', stringifiedCoverage);
- }
- private async _computeCoverageAsync(): Promise<Coverage> {
- const collector = new Collector();
- for (const traceInfo of this._traceInfos) {
- if (traceInfo.address !== constants.NEW_CONTRACT) {
- // Runtime transaction
- const runtimeBytecode = (traceInfo as TraceInfoExistingContract).runtimeBytecode;
- const contractData = _.find(this._contractsData, { runtimeBytecode }) as ContractData;
- if (_.isUndefined(contractData)) {
- throw new Error(`Transaction to an unknown address: ${traceInfo.address}`);
- }
- const bytecodeHex = contractData.runtimeBytecode.slice(2);
- const sourceMap = contractData.sourceMapRuntime;
- const pcToSourceRange = parseSourceMap(
- contractData.sourceCodes,
- sourceMap,
- bytecodeHex,
- contractData.sources,
- );
- for (let fileIndex = 0; fileIndex < contractData.sources.length; fileIndex++) {
- const singleFileCoverageForTrace = CoverageManager._getSingleFileCoverageForTrace(
- contractData,
- traceInfo.coveredPcs,
- pcToSourceRange,
- fileIndex,
- );
- collector.add(singleFileCoverageForTrace);
- }
- } else {
- // Contract creation transaction
- const bytecode = (traceInfo as TraceInfoNewContract).bytecode;
- const contractData = _.find(this._contractsData, contractDataCandidate =>
- bytecode.startsWith(contractDataCandidate.bytecode),
- ) as ContractData;
- if (_.isUndefined(contractData)) {
- throw new Error(`Unknown contract creation transaction`);
- }
- const bytecodeHex = contractData.bytecode.slice(2);
- const sourceMap = contractData.sourceMap;
- const pcToSourceRange = parseSourceMap(
- contractData.sourceCodes,
- sourceMap,
- bytecodeHex,
- contractData.sources,
- );
- for (let fileIndex = 0; fileIndex < contractData.sources.length; fileIndex++) {
- const singleFileCoverageForTrace = CoverageManager._getSingleFileCoverageForTrace(
- contractData,
- traceInfo.coveredPcs,
- pcToSourceRange,
- fileIndex,
- );
- collector.add(singleFileCoverageForTrace);
- }
- }
- }
- // TODO: Remove any cast as soon as https://github.com/DefinitelyTyped/DefinitelyTyped/pull/24233 gets merged
- return (collector as any).getFinalCoverage();
- }
-}
diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts
index 1c80dca7b..9667e891c 100644
--- a/packages/sol-cov/src/coverage_subprovider.ts
+++ b/packages/sol-cov/src/coverage_subprovider.ts
@@ -1,184 +1,146 @@
-import { Callback, ErrorCallback, NextCallback, Subprovider } from '@0xproject/subproviders';
-import { BlockParam, CallData, JSONRPCRequestPayload, TransactionTrace, TxData } from '@0xproject/types';
-import { promisify } from '@0xproject/utils';
import * as _ from 'lodash';
-import { Lock } from 'semaphore-async-await';
-import { constants } from './constants';
-import { CoverageManager } from './coverage_manager';
-import { TraceInfoExistingContract, TraceInfoNewContract } from './types';
-
-interface MaybeFakeTxData extends TxData {
- isFakeTransaction?: boolean;
-}
-
-// Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way.
-// On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot.
-// That allows us to avoid influencing test behaviour.
+import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter';
+import { collectCoverageEntries } from './collect_coverage_entries';
+import { SingleFileSubtraceHandler, TraceCollector } from './trace_collector';
+import { TraceInfoSubprovider } from './trace_info_subprovider';
+import {
+ BranchCoverage,
+ ContractData,
+ Coverage,
+ FunctionCoverage,
+ FunctionDescription,
+ SourceRange,
+ StatementCoverage,
+ StatementDescription,
+ Subtrace,
+ TraceInfo,
+} from './types';
+import { utils } from './utils';
/**
* This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
- * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC.
+ * It's used to compute your code coverage while running solidity tests.
*/
-export class CoverageSubprovider extends Subprovider {
- // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise
- private _lock: Lock;
- private _coverageManager: CoverageManager;
- private _defaultFromAddress: string;
+export class CoverageSubprovider extends TraceInfoSubprovider {
+ private readonly _coverageCollector: TraceCollector;
/**
* Instantiates a CoverageSubprovider instance
- * @param artifactsPath Path to the smart contract artifacts
- * @param sourcesPath Path to the smart contract source files
- * @param networkId network id
+ * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
* @param defaultFromAddress default from address to use when sending transactions
+ * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them
*/
- constructor(artifactsPath: string, sourcesPath: string, networkId: number, defaultFromAddress: string) {
- super();
- this._lock = new Lock();
- this._defaultFromAddress = defaultFromAddress;
- this._coverageManager = new CoverageManager(
- artifactsPath,
- sourcesPath,
- networkId,
- this._getContractCodeAsync.bind(this),
- );
+ constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, isVerbose: boolean = true) {
+ const traceCollectionSubproviderConfig = {
+ shouldCollectTransactionTraces: true,
+ shouldCollectGasEstimateTraces: true,
+ shouldCollectCallTraces: true,
+ };
+ super(defaultFromAddress, traceCollectionSubproviderConfig);
+ this._coverageCollector = new TraceCollector(artifactAdapter, isVerbose, coverageHandler);
+ }
+ protected async _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> {
+ await this._coverageCollector.computeSingleTraceCoverageAsync(traceInfo);
}
/**
* Write the test coverage results to a file in Istanbul format.
*/
public async writeCoverageAsync(): Promise<void> {
- await this._coverageManager.writeCoverageAsync();
+ await this._coverageCollector.writeOutputAsync();
}
- /**
- * This method conforms to the web3-provider-engine interface.
- * It is called internally by the ProviderEngine when it is this subproviders
- * turn to handle a JSON RPC request.
- * @param payload JSON RPC payload
- * @param next Callback to call if this subprovider decides not to handle the request
- * @param end Callback to call if subprovider handled the request and wants to pass back the request.
- */
- // tslint:disable-next-line:prefer-function-over-method
- public handleRequest(payload: JSONRPCRequestPayload, next: NextCallback, end: ErrorCallback) {
- switch (payload.method) {
- case 'eth_sendTransaction':
- const txData = payload.params[0];
- next(this._onTransactionSentAsync.bind(this, txData));
- return;
+}
- case 'eth_call':
- const callData = payload.params[0];
- const blockNumber = payload.params[1];
- next(this._onCallExecutedAsync.bind(this, callData, blockNumber));
- return;
+/**
+ * Computed partial coverage for a single file & subtrace.
+ * @param contractData Contract metadata (source, srcMap, bytecode)
+ * @param subtrace A subset of a transcation/call trace that was executed within that contract
+ * @param pcToSourceRange A mapping from program counters to source ranges
+ * @param fileIndex Index of a file to compute coverage for
+ * @return Partial istanbul coverage for that file & subtrace
+ */
+export const coverageHandler: SingleFileSubtraceHandler = (
+ contractData: ContractData,
+ subtrace: Subtrace,
+ pcToSourceRange: { [programCounter: number]: SourceRange },
+ fileIndex: number,
+): Coverage => {
+ const absoluteFileName = contractData.sources[fileIndex];
+ const coverageEntriesDescription = collectCoverageEntries(contractData.sourceCodes[fileIndex]);
- default:
- next();
- return;
- }
+ // if the source wasn't provided for the fileIndex, we can't cover the file
+ if (_.isUndefined(coverageEntriesDescription)) {
+ return {};
}
- private async _onTransactionSentAsync(
- txData: MaybeFakeTxData,
- err: Error | null,
- txHash: string | undefined,
- cb: Callback,
- ): Promise<void> {
- if (!txData.isFakeTransaction) {
- // This transaction is a usual ttransaction. Not a call executed as one.
- // And we don't want it to be executed within a snapshotting period
- await this._lock.acquire();
- }
- if (_.isNull(err)) {
- const toAddress = _.isUndefined(txData.to) || txData.to === '0x0' ? constants.NEW_CONTRACT : txData.to;
- await this._recordTxTraceAsync(toAddress, txData.data, txHash as string);
- } else {
- const payload = {
- method: 'eth_getBlockByNumber',
- params: ['latest', true],
- };
- const jsonRPCResponsePayload = await this.emitPayloadAsync(payload);
- const transactions = jsonRPCResponsePayload.result.transactions;
- for (const transaction of transactions) {
- const toAddress = _.isUndefined(txData.to) || txData.to === '0x0' ? constants.NEW_CONTRACT : txData.to;
- await this._recordTxTraceAsync(toAddress, transaction.data, transaction.hash);
- }
- }
- if (!txData.isFakeTransaction) {
- // This transaction is a usual ttransaction. Not a call executed as one.
- // And we don't want it to be executed within a snapshotting period
- this._lock.release();
- }
- cb();
+
+ let sourceRanges = _.map(subtrace, structLog => pcToSourceRange[structLog.pc]);
+ sourceRanges = _.compact(sourceRanges); // Some PC's don't map to a source range and we just ignore them.
+ // By default lodash does a shallow object comparasion. We JSON.stringify them and compare as strings.
+ sourceRanges = _.uniqBy(sourceRanges, s => JSON.stringify(s)); // We don't care if one PC was covered multiple times within a single transaction
+ sourceRanges = _.filter(sourceRanges, sourceRange => sourceRange.fileName === absoluteFileName);
+ const branchCoverage: BranchCoverage = {};
+ const branchIds = _.keys(coverageEntriesDescription.branchMap);
+ for (const branchId of branchIds) {
+ const branchDescription = coverageEntriesDescription.branchMap[branchId];
+ const isBranchCoveredByBranchIndex = _.map(branchDescription.locations, location => {
+ const isBranchCovered = _.some(sourceRanges, range => utils.isRangeInside(range.location, location));
+ const timesBranchCovered = Number(isBranchCovered);
+ return timesBranchCovered;
+ });
+ branchCoverage[branchId] = isBranchCoveredByBranchIndex;
}
- private async _onCallExecutedAsync(
- callData: Partial<CallData>,
- blockNumber: BlockParam,
- err: Error | null,
- callResult: string,
- cb: Callback,
- ): Promise<void> {
- await this._recordCallTraceAsync(callData, blockNumber);
- cb();
+ const statementCoverage: StatementCoverage = {};
+ const statementIds = _.keys(coverageEntriesDescription.statementMap);
+ for (const statementId of statementIds) {
+ const statementDescription = coverageEntriesDescription.statementMap[statementId];
+ const isStatementCovered = _.some(sourceRanges, range =>
+ utils.isRangeInside(range.location, statementDescription),
+ );
+ const timesStatementCovered = Number(isStatementCovered);
+ statementCoverage[statementId] = timesStatementCovered;
}
- private async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> {
- let payload = {
- method: 'debug_traceTransaction',
- params: [txHash, { disableMemory: true, disableStack: true, disableStorage: true }], // TODO For now testrpc just ignores those parameters https://github.com/trufflesuite/ganache-cli/issues/489
- };
- const jsonRPCResponsePayload = await this.emitPayloadAsync(payload);
- const trace: TransactionTrace = jsonRPCResponsePayload.result;
- const coveredPcs = _.map(trace.structLogs, log => log.pc);
- if (address === constants.NEW_CONTRACT) {
- const traceInfo: TraceInfoNewContract = {
- coveredPcs,
- txHash,
- address: address as 'NEW_CONTRACT',
- bytecode: data as string,
- };
- this._coverageManager.appendTraceInfo(traceInfo);
- } else {
- payload = { method: 'eth_getCode', params: [address, 'latest'] };
- const runtimeBytecode = (await this.emitPayloadAsync(payload)).result;
- const traceInfo: TraceInfoExistingContract = {
- coveredPcs,
- txHash,
- address,
- runtimeBytecode,
- };
- this._coverageManager.appendTraceInfo(traceInfo);
- }
+ const functionCoverage: FunctionCoverage = {};
+ const functionIds = _.keys(coverageEntriesDescription.fnMap);
+ for (const fnId of functionIds) {
+ const functionDescription = coverageEntriesDescription.fnMap[fnId];
+ const isFunctionCovered = _.some(sourceRanges, range =>
+ utils.isRangeInside(range.location, functionDescription.loc),
+ );
+ const timesFunctionCovered = Number(isFunctionCovered);
+ functionCoverage[fnId] = timesFunctionCovered;
}
- private async _recordCallTraceAsync(callData: Partial<CallData>, blockNumber: BlockParam): Promise<void> {
- // We don't want other transactions to be exeucted during snashotting period, that's why we lock the
- // transaction execution for all transactions except our fake ones.
- await this._lock.acquire();
- const snapshotId = Number((await this.emitPayloadAsync({ method: 'evm_snapshot' })).result);
- const fakeTxData: MaybeFakeTxData = {
- isFakeTransaction: true, // This transaction (and only it) is allowed to come through when the lock is locked
- ...callData,
- from: callData.from || this._defaultFromAddress,
- };
- try {
- await this.emitPayloadAsync({
- method: 'eth_sendTransaction',
- params: [fakeTxData],
- });
- } catch (err) {
- // Even if this transaction failed - we've already recorded it's trace.
- }
- const jsonRPCResponse = await this.emitPayloadAsync({ method: 'evm_revert', params: [snapshotId] });
- this._lock.release();
- const didRevert = jsonRPCResponse.result;
- if (!didRevert) {
- throw new Error('Failed to revert the snapshot');
+ // HACK: Solidity doesn't emit any opcodes that map back to modifiers with no args, that's why we map back to the
+ // function range and check if there is any covered statement within that range.
+ for (const modifierStatementId of coverageEntriesDescription.modifiersStatementIds) {
+ if (statementCoverage[modifierStatementId]) {
+ // Already detected as covered
+ continue;
}
+ const modifierDescription = coverageEntriesDescription.statementMap[modifierStatementId];
+ const enclosingFunction = _.find(coverageEntriesDescription.fnMap, functionDescription =>
+ utils.isRangeInside(modifierDescription, functionDescription.loc),
+ ) as FunctionDescription;
+ const isModifierCovered = _.some(
+ coverageEntriesDescription.statementMap,
+ (statementDescription: StatementDescription, statementId: number) => {
+ const isInsideTheModifierEnclosingFunction = utils.isRangeInside(
+ statementDescription,
+ enclosingFunction.loc,
+ );
+ const isCovered = statementCoverage[statementId];
+ return isInsideTheModifierEnclosingFunction && isCovered;
+ },
+ );
+ const timesModifierCovered = Number(isModifierCovered);
+ statementCoverage[modifierStatementId] = timesModifierCovered;
}
- private async _getContractCodeAsync(address: string): Promise<string> {
- const payload = {
- method: 'eth_getCode',
- params: [address, 'latest'],
- };
- const jsonRPCResponsePayload = await this.emitPayloadAsync(payload);
- const contractCode: string = jsonRPCResponsePayload.result;
- return contractCode;
- }
-}
+ const partialCoverage = {
+ [absoluteFileName]: {
+ ...coverageEntriesDescription,
+ path: absoluteFileName,
+ f: functionCoverage,
+ s: statementCoverage,
+ b: branchCoverage,
+ },
+ };
+ return partialCoverage;
+};
diff --git a/packages/sol-cov/src/get_source_range_snippet.ts b/packages/sol-cov/src/get_source_range_snippet.ts
new file mode 100644
index 000000000..bea17beae
--- /dev/null
+++ b/packages/sol-cov/src/get_source_range_snippet.ts
@@ -0,0 +1,180 @@
+import * as ethUtil from 'ethereumjs-util';
+import * as _ from 'lodash';
+import * as Parser from 'solidity-parser-antlr';
+
+import { SingleFileSourceRange, SourceRange, SourceSnippet } from './types';
+import { utils } from './utils';
+
+interface ASTInfo {
+ type: string;
+ node: Parser.ASTNode;
+ name: string | null;
+ range?: SingleFileSourceRange;
+}
+
+// Parsing source code for each transaction/code is slow and therefore we cache it
+const parsedSourceByHash: { [sourceHash: string]: Parser.ASTNode } = {};
+
+export function getSourceRangeSnippet(sourceRange: SourceRange, sourceCode: string): SourceSnippet | null {
+ const sourceHash = ethUtil.sha3(sourceCode).toString('hex');
+ if (_.isUndefined(parsedSourceByHash[sourceHash])) {
+ parsedSourceByHash[sourceHash] = Parser.parse(sourceCode, { loc: true });
+ }
+ const astNode = parsedSourceByHash[sourceHash];
+ const visitor = new ASTInfoVisitor();
+ Parser.visit(astNode, visitor);
+ const astInfo = visitor.getASTInfoForRange(sourceRange);
+ if (astInfo === null) {
+ return null;
+ }
+ const sourceCodeInRange = utils.getRange(sourceCode, sourceRange.location);
+ return {
+ ...astInfo,
+ range: astInfo.range as SingleFileSourceRange,
+ source: sourceCodeInRange,
+ fileName: sourceRange.fileName,
+ };
+}
+
+// A visitor which collects ASTInfo for most nodes in the AST.
+class ASTInfoVisitor {
+ private readonly _astInfos: ASTInfo[] = [];
+ public getASTInfoForRange(sourceRange: SourceRange): ASTInfo | null {
+ // HACK(albrow): Sometimes the source range doesn't exactly match that
+ // of astInfo. To work around that we try with a +/-1 offset on
+ // end.column. If nothing matches even with the offset, we return null.
+ const offset = {
+ start: {
+ line: 0,
+ column: 0,
+ },
+ end: {
+ line: 0,
+ column: 0,
+ },
+ };
+ let astInfo = this._getASTInfoForRange(sourceRange, offset);
+ if (astInfo !== null) {
+ return astInfo;
+ }
+ offset.end.column += 1;
+ astInfo = this._getASTInfoForRange(sourceRange, offset);
+ if (astInfo !== null) {
+ return astInfo;
+ }
+ offset.end.column -= 2;
+ astInfo = this._getASTInfoForRange(sourceRange, offset);
+ if (astInfo !== null) {
+ return astInfo;
+ }
+ return null;
+ }
+ public ContractDefinition(ast: Parser.ContractDefinition): void {
+ this._visitContractDefinition(ast);
+ }
+ public IfStatement(ast: Parser.IfStatement): void {
+ this._visitStatement(ast);
+ }
+ public FunctionDefinition(ast: Parser.FunctionDefinition): void {
+ this._visitFunctionLikeDefinition(ast);
+ }
+ public ModifierDefinition(ast: Parser.ModifierDefinition): void {
+ this._visitFunctionLikeDefinition(ast);
+ }
+ public ForStatement(ast: Parser.ForStatement): void {
+ this._visitStatement(ast);
+ }
+ public ReturnStatement(ast: Parser.ReturnStatement): void {
+ this._visitStatement(ast);
+ }
+ public BreakStatement(ast: Parser.BreakStatement): void {
+ this._visitStatement(ast);
+ }
+ public ContinueStatement(ast: Parser.ContinueStatement): void {
+ this._visitStatement(ast);
+ }
+ public EmitStatement(ast: any /* TODO: Parser.EmitStatement */): void {
+ this._visitStatement(ast);
+ }
+ public VariableDeclarationStatement(ast: Parser.VariableDeclarationStatement): void {
+ this._visitStatement(ast);
+ }
+ public Statement(ast: Parser.Statement): void {
+ this._visitStatement(ast);
+ }
+ public WhileStatement(ast: Parser.WhileStatement): void {
+ this._visitStatement(ast);
+ }
+ public SimpleStatement(ast: Parser.SimpleStatement): void {
+ this._visitStatement(ast);
+ }
+ public ThrowStatement(ast: Parser.ThrowStatement): void {
+ this._visitStatement(ast);
+ }
+ public DoWhileStatement(ast: Parser.DoWhileStatement): void {
+ this._visitStatement(ast);
+ }
+ public ExpressionStatement(ast: Parser.ExpressionStatement): void {
+ this._visitStatement(ast.expression);
+ }
+ public InlineAssemblyStatement(ast: Parser.InlineAssemblyStatement): void {
+ this._visitStatement(ast);
+ }
+ public ModifierInvocation(ast: Parser.ModifierInvocation): void {
+ const BUILTIN_MODIFIERS = ['public', 'view', 'payable', 'external', 'internal', 'pure', 'constant'];
+ if (!_.includes(BUILTIN_MODIFIERS, ast.name)) {
+ this._visitStatement(ast);
+ }
+ }
+ private _visitStatement(ast: Parser.ASTNode): void {
+ this._astInfos.push({
+ type: ast.type,
+ node: ast,
+ name: null,
+ range: ast.loc,
+ });
+ }
+ private _visitFunctionLikeDefinition(ast: Parser.ModifierDefinition | Parser.FunctionDefinition): void {
+ this._astInfos.push({
+ type: ast.type,
+ node: ast,
+ name: ast.name,
+ range: ast.loc,
+ });
+ }
+ private _visitContractDefinition(ast: Parser.ContractDefinition): void {
+ this._astInfos.push({
+ type: ast.type,
+ node: ast,
+ name: ast.name,
+ range: ast.loc,
+ });
+ }
+ private _getASTInfoForRange(sourceRange: SourceRange, offset: SingleFileSourceRange): ASTInfo | null {
+ const offsetSourceRange = {
+ ...sourceRange,
+ location: {
+ start: {
+ line: sourceRange.location.start.line + offset.start.line,
+ column: sourceRange.location.start.column + offset.start.column,
+ },
+ end: {
+ line: sourceRange.location.end.line + offset.end.line,
+ column: sourceRange.location.end.column + offset.end.column,
+ },
+ },
+ };
+ for (const astInfo of this._astInfos) {
+ const astInfoRange = astInfo.range as SingleFileSourceRange;
+ if (
+ astInfoRange.start.column === offsetSourceRange.location.start.column &&
+ astInfoRange.start.line === offsetSourceRange.location.start.line &&
+ astInfoRange.end.column === offsetSourceRange.location.end.column &&
+ astInfoRange.end.line === offsetSourceRange.location.end.line
+ ) {
+ return astInfo;
+ }
+ }
+ return null;
+ }
+}
diff --git a/packages/sol-cov/src/globals.d.ts b/packages/sol-cov/src/globals.d.ts
index 0ee0f394c..e799b3529 100644
--- a/packages/sol-cov/src/globals.d.ts
+++ b/packages/sol-cov/src/globals.d.ts
@@ -1,5 +1,3 @@
-declare module 'dirty-chai';
-
// tslint:disable:completed-docs
declare module '*.json' {
const json: any;
@@ -7,318 +5,3 @@ declare module '*.json' {
export default json;
/* tslint:enable */
}
-
-declare module 'solidity-parser-antlr' {
- export interface BaseASTNode {
- range: [number, number];
- }
- export interface SourceUnit extends BaseASTNode {}
- export interface PragmaDirective extends BaseASTNode {}
- export interface PragmaName extends BaseASTNode {}
- export interface PragmaValue extends BaseASTNode {}
- export interface Version extends BaseASTNode {}
- export interface VersionOperator extends BaseASTNode {}
- export interface VersionConstraint extends BaseASTNode {}
- export interface ImportDeclaration extends BaseASTNode {}
- export interface ImportDirective extends BaseASTNode {}
- export interface ContractDefinition extends BaseASTNode {}
- export interface InheritanceSpecifier extends BaseASTNode {}
- export interface ContractPart extends BaseASTNode {}
- export interface StateVariableDeclaration extends BaseASTNode {
- variables: VariableDeclaration[];
- }
- export interface UsingForDeclaration extends BaseASTNode {}
- export interface StructDefinition extends BaseASTNode {}
- export interface ModifierDefinition extends BaseASTNode {
- name: string;
- }
- export interface ModifierInvocation extends BaseASTNode {
- name: string;
- }
- export interface FunctionDefinition extends BaseASTNode {
- name: string;
- }
- export interface ReturnParameters extends BaseASTNode {}
- export interface ModifierList extends BaseASTNode {}
- export interface EventDefinition extends BaseASTNode {}
- export interface EnumValue extends BaseASTNode {}
- export interface EnumDefinition extends BaseASTNode {}
- export interface ParameterList extends BaseASTNode {}
- export interface Parameter extends BaseASTNode {}
- export interface EventParameterList extends BaseASTNode {}
- export interface EventParameter extends BaseASTNode {}
- export interface FunctionTypeParameterList extends BaseASTNode {}
- export interface FunctionTypeParameter extends BaseASTNode {}
- export interface VariableDeclaration extends BaseASTNode {
- visibility: 'public' | 'private';
- isStateVar: boolean;
- }
- export interface TypeName extends BaseASTNode {}
- export interface UserDefinedTypeName extends BaseASTNode {}
- export interface Mapping extends BaseASTNode {}
- export interface FunctionTypeName extends BaseASTNode {}
- export interface StorageLocation extends BaseASTNode {}
- export interface StateMutability extends BaseASTNode {}
- export interface Block extends BaseASTNode {}
- export interface Statement extends BaseASTNode {}
- export interface ExpressionStatement extends BaseASTNode {
- expression: ASTNode;
- }
- export interface IfStatement extends BaseASTNode {
- trueBody: ASTNode;
- falseBody: ASTNode;
- }
- export interface WhileStatement extends BaseASTNode {}
- export interface SimpleStatement extends BaseASTNode {}
- export interface ForStatement extends BaseASTNode {}
- export interface InlineAssemblyStatement extends BaseASTNode {}
- export interface DoWhileStatement extends BaseASTNode {}
- export interface ContinueStatement extends BaseASTNode {}
- export interface BreakStatement extends BaseASTNode {}
- export interface ReturnStatement extends BaseASTNode {}
- export interface ThrowStatement extends BaseASTNode {}
- export interface VariableDeclarationStatement extends BaseASTNode {}
- export interface IdentifierList extends BaseASTNode {}
- export interface ElementaryTypeName extends BaseASTNode {}
- export interface Expression extends BaseASTNode {}
- export interface PrimaryExpression extends BaseASTNode {}
- export interface ExpressionList extends BaseASTNode {}
- export interface NameValueList extends BaseASTNode {}
- export interface NameValue extends BaseASTNode {}
- export interface FunctionCallArguments extends BaseASTNode {}
- export interface AssemblyBlock extends BaseASTNode {}
- export interface AssemblyItem extends BaseASTNode {}
- export interface AssemblyExpression extends BaseASTNode {}
- export interface AssemblyCall extends BaseASTNode {}
- export interface AssemblyLocalDefinition extends BaseASTNode {}
- export interface AssemblyAssignment extends BaseASTNode {}
- export interface AssemblyIdentifierOrList extends BaseASTNode {}
- export interface AssemblyIdentifierList extends BaseASTNode {}
- export interface AssemblyStackAssignment extends BaseASTNode {}
- export interface LabelDefinition extends BaseASTNode {}
- export interface AssemblySwitch extends BaseASTNode {}
- export interface AssemblyCase extends BaseASTNode {}
- export interface AssemblyFunctionDefinition extends BaseASTNode {}
- export interface AssemblyFunctionReturns extends BaseASTNode {}
- export interface AssemblyFor extends BaseASTNode {}
- export interface AssemblyIf extends BaseASTNode {}
- export interface AssemblyLiteral extends BaseASTNode {}
- export interface SubAssembly extends BaseASTNode {}
- export interface TupleExpression extends BaseASTNode {}
- export interface ElementaryTypeNameExpression extends BaseASTNode {}
- export interface NumberLiteral extends BaseASTNode {}
- export interface Identifier extends BaseASTNode {}
- export type BinOp =
- | '+'
- | '-'
- | '*'
- | '/'
- | '**'
- | '%'
- | '<<'
- | '>>'
- | '&&'
- | '||'
- | '&'
- | '|'
- | '^'
- | '<'
- | '>'
- | '<='
- | '>='
- | '=='
- | '!='
- | '='
- | '|='
- | '^='
- | '&='
- | '<<='
- | '>>='
- | '+='
- | '-='
- | '*='
- | '/='
- | '%=';
- export interface BinaryOperation extends BaseASTNode {
- left: ASTNode;
- right: ASTNode;
- operator: BinOp;
- }
- export interface Conditional extends BaseASTNode {
- trueExpression: ASTNode;
- falseExpression: ASTNode;
- }
-
- export type ASTNode =
- | SourceUnit
- | PragmaDirective
- | PragmaName
- | PragmaValue
- | Version
- | VersionOperator
- | VersionConstraint
- | ImportDeclaration
- | ImportDirective
- | ContractDefinition
- | InheritanceSpecifier
- | ContractPart
- | StateVariableDeclaration
- | UsingForDeclaration
- | StructDefinition
- | ModifierDefinition
- | ModifierInvocation
- | FunctionDefinition
- | ReturnParameters
- | ModifierList
- | EventDefinition
- | EnumValue
- | EnumDefinition
- | ParameterList
- | Parameter
- | EventParameterList
- | EventParameter
- | FunctionTypeParameterList
- | FunctionTypeParameter
- | VariableDeclaration
- | TypeName
- | UserDefinedTypeName
- | Mapping
- | FunctionTypeName
- | StorageLocation
- | StateMutability
- | Block
- | Statement
- | ExpressionStatement
- | IfStatement
- | WhileStatement
- | SimpleStatement
- | ForStatement
- | InlineAssemblyStatement
- | DoWhileStatement
- | ContinueStatement
- | BreakStatement
- | ReturnStatement
- | ThrowStatement
- | VariableDeclarationStatement
- | IdentifierList
- | ElementaryTypeName
- | Expression
- | PrimaryExpression
- | ExpressionList
- | NameValueList
- | NameValue
- | FunctionCallArguments
- | AssemblyBlock
- | AssemblyItem
- | AssemblyExpression
- | AssemblyCall
- | AssemblyLocalDefinition
- | AssemblyAssignment
- | AssemblyIdentifierOrList
- | AssemblyIdentifierList
- | AssemblyStackAssignment
- | LabelDefinition
- | AssemblySwitch
- | AssemblyCase
- | AssemblyFunctionDefinition
- | AssemblyFunctionReturns
- | AssemblyFor
- | AssemblyIf
- | AssemblyLiteral
- | SubAssembly
- | TupleExpression
- | ElementaryTypeNameExpression
- | NumberLiteral
- | Identifier
- | BinaryOperation
- | Conditional;
- export interface Visitor {
- SourceUnit?: (node: SourceUnit) => void;
- PragmaDirective?: (node: PragmaDirective) => void;
- PragmaName?: (node: PragmaName) => void;
- PragmaValue?: (node: PragmaValue) => void;
- Version?: (node: Version) => void;
- VersionOperator?: (node: VersionOperator) => void;
- VersionConstraint?: (node: VersionConstraint) => void;
- ImportDeclaration?: (node: ImportDeclaration) => void;
- ImportDirective?: (node: ImportDirective) => void;
- ContractDefinition?: (node: ContractDefinition) => void;
- InheritanceSpecifier?: (node: InheritanceSpecifier) => void;
- ContractPart?: (node: ContractPart) => void;
- StateVariableDeclaration?: (node: StateVariableDeclaration) => void;
- UsingForDeclaration?: (node: UsingForDeclaration) => void;
- StructDefinition?: (node: StructDefinition) => void;
- ModifierDefinition?: (node: ModifierDefinition) => void;
- ModifierInvocation?: (node: ModifierInvocation) => void;
- FunctionDefinition?: (node: FunctionDefinition) => void;
- ReturnParameters?: (node: ReturnParameters) => void;
- ModifierList?: (node: ModifierList) => void;
- EventDefinition?: (node: EventDefinition) => void;
- EnumValue?: (node: EnumValue) => void;
- EnumDefinition?: (node: EnumDefinition) => void;
- ParameterList?: (node: ParameterList) => void;
- Parameter?: (node: Parameter) => void;
- EventParameterList?: (node: EventParameterList) => void;
- EventParameter?: (node: EventParameter) => void;
- FunctionTypeParameterList?: (node: FunctionTypeParameterList) => void;
- FunctionTypeParameter?: (node: FunctionTypeParameter) => void;
- VariableDeclaration?: (node: VariableDeclaration) => void;
- TypeName?: (node: TypeName) => void;
- UserDefinedTypeName?: (node: UserDefinedTypeName) => void;
- Mapping?: (node: Mapping) => void;
- FunctionTypeName?: (node: FunctionTypeName) => void;
- StorageLocation?: (node: StorageLocation) => void;
- StateMutability?: (node: StateMutability) => void;
- Block?: (node: Block) => void;
- Statement?: (node: Statement) => void;
- ExpressionStatement?: (node: ExpressionStatement) => void;
- IfStatement?: (node: IfStatement) => void;
- WhileStatement?: (node: WhileStatement) => void;
- SimpleStatement?: (node: SimpleStatement) => void;
- ForStatement?: (node: ForStatement) => void;
- InlineAssemblyStatement?: (node: InlineAssemblyStatement) => void;
- DoWhileStatement?: (node: DoWhileStatement) => void;
- ContinueStatement?: (node: ContinueStatement) => void;
- BreakStatement?: (node: BreakStatement) => void;
- ReturnStatement?: (node: ReturnStatement) => void;
- ThrowStatement?: (node: ThrowStatement) => void;
- VariableDeclarationStatement?: (node: VariableDeclarationStatement) => void;
- IdentifierList?: (node: IdentifierList) => void;
- ElementaryTypeName?: (node: ElementaryTypeName) => void;
- Expression?: (node: Expression) => void;
- PrimaryExpression?: (node: PrimaryExpression) => void;
- ExpressionList?: (node: ExpressionList) => void;
- NameValueList?: (node: NameValueList) => void;
- NameValue?: (node: NameValue) => void;
- FunctionCallArguments?: (node: FunctionCallArguments) => void;
- AssemblyBlock?: (node: AssemblyBlock) => void;
- AssemblyItem?: (node: AssemblyItem) => void;
- AssemblyExpression?: (node: AssemblyExpression) => void;
- AssemblyCall?: (node: AssemblyCall) => void;
- AssemblyLocalDefinition?: (node: AssemblyLocalDefinition) => void;
- AssemblyAssignment?: (node: AssemblyAssignment) => void;
- AssemblyIdentifierOrList?: (node: AssemblyIdentifierOrList) => void;
- AssemblyIdentifierList?: (node: AssemblyIdentifierList) => void;
- AssemblyStackAssignment?: (node: AssemblyStackAssignment) => void;
- LabelDefinition?: (node: LabelDefinition) => void;
- AssemblySwitch?: (node: AssemblySwitch) => void;
- AssemblyCase?: (node: AssemblyCase) => void;
- AssemblyFunctionDefinition?: (node: AssemblyFunctionDefinition) => void;
- AssemblyFunctionReturns?: (node: AssemblyFunctionReturns) => void;
- AssemblyFor?: (node: AssemblyFor) => void;
- AssemblyIf?: (node: AssemblyIf) => void;
- AssemblyLiteral?: (node: AssemblyLiteral) => void;
- SubAssembly?: (node: SubAssembly) => void;
- TupleExpression?: (node: TupleExpression) => void;
- ElementaryTypeNameExpression?: (node: ElementaryTypeNameExpression) => void;
- NumberLiteral?: (node: NumberLiteral) => void;
- Identifier?: (node: Identifier) => void;
- BinaryOperation?: (node: BinaryOperation) => void;
- Conditional?: (node: Conditional) => void;
- }
- export interface ParserOpts {
- range?: boolean;
- }
- export function parse(sourceCode: string, parserOpts: ParserOpts): ASTNode;
- export function visit(ast: ASTNode, visitor: Visitor): void;
-}
diff --git a/packages/sol-cov/src/index.ts b/packages/sol-cov/src/index.ts
index e5c5e5be3..003a27374 100644
--- a/packages/sol-cov/src/index.ts
+++ b/packages/sol-cov/src/index.ts
@@ -1 +1,8 @@
export { CoverageSubprovider } from './coverage_subprovider';
+// HACK: ProfilerSubprovider is a hacky way to do profiling using coverage tools. Not production ready
+export { ProfilerSubprovider } from './profiler_subprovider';
+export { RevertTraceSubprovider } from './revert_trace_subprovider';
+export { SolCompilerArtifactAdapter } from './artifact_adapters/sol_compiler_artifact_adapter';
+export { TruffleArtifactAdapter } from './artifact_adapters/truffle_artifact_adapter';
+export { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter';
+export { ContractData } from './types';
diff --git a/packages/sol-cov/src/profiler_subprovider.ts b/packages/sol-cov/src/profiler_subprovider.ts
new file mode 100644
index 000000000..ae9351f17
--- /dev/null
+++ b/packages/sol-cov/src/profiler_subprovider.ts
@@ -0,0 +1,91 @@
+import * as _ from 'lodash';
+
+import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter';
+import { collectCoverageEntries } from './collect_coverage_entries';
+import { SingleFileSubtraceHandler, TraceCollector } from './trace_collector';
+import { TraceInfoSubprovider } from './trace_info_subprovider';
+import { ContractData, Coverage, SourceRange, Subtrace, TraceInfo } from './types';
+import { utils } from './utils';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * ProfilerSubprovider is used to profile Solidity code while running tests.
+ */
+export class ProfilerSubprovider extends TraceInfoSubprovider {
+ private readonly _profilerCollector: TraceCollector;
+ /**
+ * Instantiates a ProfilerSubprovider instance
+ * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
+ * @param defaultFromAddress default from address to use when sending transactions
+ * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them
+ */
+ constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, isVerbose: boolean = true) {
+ const traceCollectionSubproviderConfig = {
+ shouldCollectTransactionTraces: true,
+ shouldCollectGasEstimateTraces: false,
+ shouldCollectCallTraces: false,
+ };
+ super(defaultFromAddress, traceCollectionSubproviderConfig);
+ this._profilerCollector = new TraceCollector(artifactAdapter, isVerbose, profilerHandler);
+ }
+ protected async _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void> {
+ await this._profilerCollector.computeSingleTraceCoverageAsync(traceInfo);
+ }
+ /**
+ * Write the test profiler results to a file in Istanbul format.
+ */
+ public async writeProfilerOutputAsync(): Promise<void> {
+ await this._profilerCollector.writeOutputAsync();
+ }
+}
+
+/**
+ * Computed partial coverage for a single file & subtrace for the purposes of
+ * gas profiling.
+ * @param contractData Contract metadata (source, srcMap, bytecode)
+ * @param subtrace A subset of a transcation/call trace that was executed within that contract
+ * @param pcToSourceRange A mapping from program counters to source ranges
+ * @param fileIndex Index of a file to compute coverage for
+ * @return Partial istanbul coverage for that file & subtrace
+ */
+export const profilerHandler: SingleFileSubtraceHandler = (
+ contractData: ContractData,
+ subtrace: Subtrace,
+ pcToSourceRange: { [programCounter: number]: SourceRange },
+ fileIndex: number,
+): Coverage => {
+ const absoluteFileName = contractData.sources[fileIndex];
+ const profilerEntriesDescription = collectCoverageEntries(contractData.sourceCodes[fileIndex]);
+ const gasConsumedByStatement: { [statementId: string]: number } = {};
+ const statementIds = _.keys(profilerEntriesDescription.statementMap);
+ for (const statementId of statementIds) {
+ const statementDescription = profilerEntriesDescription.statementMap[statementId];
+ const totalGasCost = _.sum(
+ _.map(subtrace, structLog => {
+ const sourceRange = pcToSourceRange[structLog.pc];
+ if (_.isUndefined(sourceRange)) {
+ return 0;
+ }
+ if (sourceRange.fileName !== absoluteFileName) {
+ return 0;
+ }
+ if (utils.isRangeInside(sourceRange.location, statementDescription)) {
+ return structLog.gasCost;
+ } else {
+ return 0;
+ }
+ }),
+ );
+ gasConsumedByStatement[statementId] = totalGasCost;
+ }
+ const partialProfilerOutput = {
+ [absoluteFileName]: {
+ ...profilerEntriesDescription,
+ path: absoluteFileName,
+ f: {}, // I's meaningless in profiling context
+ s: gasConsumedByStatement,
+ b: {}, // I's meaningless in profiling context
+ },
+ };
+ return partialProfilerOutput;
+};
diff --git a/packages/sol-cov/src/revert_trace.ts b/packages/sol-cov/src/revert_trace.ts
new file mode 100644
index 000000000..a78d1afa8
--- /dev/null
+++ b/packages/sol-cov/src/revert_trace.ts
@@ -0,0 +1,90 @@
+import { logUtils } from '@0xproject/utils';
+import { OpCode, StructLog } from 'ethereum-types';
+
+import * as _ from 'lodash';
+
+import { EvmCallStack } from './types';
+import { utils } from './utils';
+
+export function getRevertTrace(structLogs: StructLog[], startAddress: string): EvmCallStack {
+ const evmCallStack: EvmCallStack = [];
+ const addressStack = [startAddress];
+ if (_.isEmpty(structLogs)) {
+ return [];
+ }
+ const normalizedStructLogs = utils.normalizeStructLogs(structLogs);
+ // tslint:disable-next-line:prefer-for-of
+ for (let i = 0; i < normalizedStructLogs.length; i++) {
+ const structLog = normalizedStructLogs[i];
+ if (structLog.depth !== addressStack.length - 1) {
+ throw new Error("Malformed trace. Trace depth doesn't match call stack depth");
+ }
+ // After that check we have a guarantee that call stack is never empty
+ // If it would: callStack.length - 1 === structLog.depth === -1
+ // That means that we can always safely pop from it
+
+ if (utils.isCallLike(structLog.op)) {
+ const currentAddress = _.last(addressStack) as string;
+ const jumpAddressOffset = 1;
+ const newAddress = utils.getAddressFromStackEntry(
+ structLog.stack[structLog.stack.length - jumpAddressOffset - 1],
+ );
+
+ // Sometimes calls don't change the execution context (current address). When we do a transfer to an
+ // externally owned account - it does the call and immediately returns because there is no fallback
+ // function. We manually check if the call depth had changed to handle that case.
+ const nextStructLog = normalizedStructLogs[i + 1];
+ if (nextStructLog.depth !== structLog.depth) {
+ addressStack.push(newAddress);
+ evmCallStack.push({
+ address: currentAddress,
+ structLog,
+ });
+ }
+ } else if (utils.isEndOpcode(structLog.op) && structLog.op !== OpCode.Revert) {
+ // Just like with calls, sometimes returns/stops don't change the execution context (current address).
+ const nextStructLog = normalizedStructLogs[i + 1];
+ if (_.isUndefined(nextStructLog) || nextStructLog.depth !== structLog.depth) {
+ evmCallStack.pop();
+ addressStack.pop();
+ }
+ if (structLog.op === OpCode.SelfDestruct) {
+ // After contract execution, we look at all sub-calls to external contracts, and for each one, fetch
+ // the bytecode and compute the coverage for the call. If the contract is destroyed with a call
+ // to `selfdestruct`, we are unable to fetch it's bytecode and compute coverage.
+ // TODO: Refactor this logic to fetch the sub-called contract bytecode before the selfdestruct is called
+ // in order to handle this edge-case.
+ logUtils.warn(
+ "Detected a selfdestruct. Sol-cov currently doesn't support that scenario. We'll just skip the trace part for a destructed contract",
+ );
+ }
+ } else if (structLog.op === OpCode.Revert) {
+ evmCallStack.push({
+ address: _.last(addressStack) as string,
+ structLog,
+ });
+ return evmCallStack;
+ } else if (structLog.op === OpCode.Create) {
+ // TODO: Extract the new contract address from the stack and handle that scenario
+ logUtils.warn(
+ "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace",
+ );
+ return [];
+ } else {
+ if (structLog !== _.last(normalizedStructLogs)) {
+ const nextStructLog = normalizedStructLogs[i + 1];
+ if (nextStructLog.depth === structLog.depth) {
+ continue;
+ } else if (nextStructLog.depth === structLog.depth - 1) {
+ addressStack.pop();
+ } else {
+ throw new Error('Malformed trace. Unexpected call depth change');
+ }
+ }
+ }
+ }
+ if (evmCallStack.length !== 0) {
+ logUtils.warn('Malformed trace. Call stack non empty at the end. (probably out of gas)');
+ }
+ return [];
+}
diff --git a/packages/sol-cov/src/revert_trace_subprovider.ts b/packages/sol-cov/src/revert_trace_subprovider.ts
new file mode 100644
index 000000000..6ccf59653
--- /dev/null
+++ b/packages/sol-cov/src/revert_trace_subprovider.ts
@@ -0,0 +1,163 @@
+import { stripHexPrefix } from 'ethereumjs-util';
+import * as _ from 'lodash';
+import { getLogger, levels, Logger } from 'loglevel';
+
+import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter';
+import { constants } from './constants';
+import { getSourceRangeSnippet } from './get_source_range_snippet';
+import { getRevertTrace } from './revert_trace';
+import { parseSourceMap } from './source_maps';
+import { TraceCollectionSubprovider } from './trace_collection_subprovider';
+import { ContractData, EvmCallStack, SourceRange, SourceSnippet } from './types';
+import { utils } from './utils';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * It is used to report call stack traces whenever a revert occurs.
+ */
+export class RevertTraceSubprovider extends TraceCollectionSubprovider {
+ // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise
+ private _contractsData!: ContractData[];
+ private readonly _artifactAdapter: AbstractArtifactAdapter;
+ private readonly _logger: Logger;
+
+ /**
+ * Instantiates a RevertTraceSubprovider instance
+ * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
+ * @param defaultFromAddress default from address to use when sending transactions
+ * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them
+ */
+ constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, isVerbose: boolean = true) {
+ const traceCollectionSubproviderConfig = {
+ shouldCollectTransactionTraces: true,
+ shouldCollectGasEstimateTraces: true,
+ shouldCollectCallTraces: true,
+ };
+ super(defaultFromAddress, traceCollectionSubproviderConfig);
+ this._artifactAdapter = artifactAdapter;
+ this._logger = getLogger('sol-cov');
+ this._logger.setLevel(isVerbose ? levels.TRACE : levels.ERROR);
+ }
+ // tslint:disable-next-line:no-unused-variable
+ protected async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> {
+ await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0);
+ const trace = await this._web3Wrapper.getTransactionTraceAsync(txHash, {
+ disableMemory: true,
+ disableStack: false,
+ disableStorage: true,
+ });
+ const evmCallStack = getRevertTrace(trace.structLogs, address);
+ if (evmCallStack.length > 0) {
+ // if getRevertTrace returns a call stack it means there was a
+ // revert.
+ await this._printStackTraceAsync(evmCallStack);
+ }
+ }
+ private async _printStackTraceAsync(evmCallStack: EvmCallStack): Promise<void> {
+ const sourceSnippets: SourceSnippet[] = [];
+ if (_.isUndefined(this._contractsData)) {
+ this._contractsData = await this._artifactAdapter.collectContractsDataAsync();
+ }
+ for (const evmCallStackEntry of evmCallStack) {
+ const isContractCreation = evmCallStackEntry.address === constants.NEW_CONTRACT;
+ if (isContractCreation) {
+ this._logger.error('Contract creation not supported');
+ continue;
+ }
+ const bytecode = await this._web3Wrapper.getContractCodeAsync(evmCallStackEntry.address);
+ const contractData = utils.getContractDataIfExists(this._contractsData, bytecode);
+ if (_.isUndefined(contractData)) {
+ const errMsg = isContractCreation
+ ? `Unknown contract creation transaction`
+ : `Transaction to an unknown address: ${evmCallStackEntry.address}`;
+ this._logger.warn(errMsg);
+ continue;
+ }
+ const bytecodeHex = stripHexPrefix(bytecode);
+ const sourceMap = isContractCreation ? contractData.sourceMap : contractData.sourceMapRuntime;
+
+ const pcToSourceRange = parseSourceMap(
+ contractData.sourceCodes,
+ sourceMap,
+ bytecodeHex,
+ contractData.sources,
+ );
+ // tslint:disable-next-line:no-unnecessary-initializer
+ let sourceRange: SourceRange | undefined = undefined;
+ let pc = evmCallStackEntry.structLog.pc;
+ // Sometimes there is not a mapping for this pc (e.g. if the revert
+ // actually happens in assembly). In that case, we want to keep
+ // searching backwards by decrementing the pc until we find a
+ // mapped source range.
+ while (_.isUndefined(sourceRange) && pc > 0) {
+ sourceRange = pcToSourceRange[pc];
+ pc -= 1;
+ }
+ if (_.isUndefined(sourceRange)) {
+ this._logger.warn(
+ `could not find matching sourceRange for structLog: ${JSON.stringify(
+ _.omit(evmCallStackEntry.structLog, 'stack'),
+ )}`,
+ );
+ continue;
+ }
+
+ const fileIndex = contractData.sources.indexOf(sourceRange.fileName);
+ const sourceSnippet = getSourceRangeSnippet(sourceRange, contractData.sourceCodes[fileIndex]);
+ if (sourceSnippet !== null) {
+ sourceSnippets.push(sourceSnippet);
+ }
+ }
+ const filteredSnippets = filterSnippets(sourceSnippets);
+ if (filteredSnippets.length > 0) {
+ this._logger.error('\n\nStack trace for REVERT:\n');
+ _.forEach(_.reverse(filteredSnippets), snippet => {
+ const traceString = getStackTraceString(snippet);
+ this._logger.error(traceString);
+ });
+ this._logger.error('\n');
+ } else {
+ this._logger.error('REVERT detected but could not determine stack trace');
+ }
+ }
+}
+
+// removes duplicates and if statements
+function filterSnippets(sourceSnippets: SourceSnippet[]): SourceSnippet[] {
+ if (sourceSnippets.length === 0) {
+ return [];
+ }
+ const results: SourceSnippet[] = [sourceSnippets[0]];
+ let prev = sourceSnippets[0];
+ for (const sourceSnippet of sourceSnippets) {
+ if (sourceSnippet.type === 'IfStatement') {
+ continue;
+ } else if (sourceSnippet.source === prev.source) {
+ prev = sourceSnippet;
+ continue;
+ }
+ results.push(sourceSnippet);
+ prev = sourceSnippet;
+ }
+ return results;
+}
+
+function getStackTraceString(sourceSnippet: SourceSnippet): string {
+ let result = `${sourceSnippet.fileName}:${sourceSnippet.range.start.line}:${sourceSnippet.range.start.column}`;
+ const snippetString = getSourceSnippetString(sourceSnippet);
+ if (snippetString !== '') {
+ result += `:\n ${snippetString}`;
+ }
+ return result;
+}
+
+function getSourceSnippetString(sourceSnippet: SourceSnippet): string {
+ switch (sourceSnippet.type) {
+ case 'ContractDefinition':
+ return `contract ${sourceSnippet.name}`;
+ case 'FunctionDefinition':
+ return `function ${sourceSnippet.name}`;
+ default:
+ return `${sourceSnippet.source}`;
+ }
+}
diff --git a/packages/sol-cov/src/source_maps.ts b/packages/sol-cov/src/source_maps.ts
index 694171442..90b21dda1 100644
--- a/packages/sol-cov/src/source_maps.ts
+++ b/packages/sol-cov/src/source_maps.ts
@@ -36,12 +36,12 @@ export function parseSourceMap(
): { [programCounter: number]: SourceRange } {
const bytecode = Uint8Array.from(Buffer.from(bytecodeHex, 'hex'));
const pcToInstructionIndex: { [programCounter: number]: number } = getPcToInstructionIndexMapping(bytecode);
- const locationByOffsetByFileIndex = _.map(sourceCodes, getLocationByOffset);
+ const locationByOffsetByFileIndex = _.map(sourceCodes, s => (_.isUndefined(s) ? {} : getLocationByOffset(s)));
const entries = srcMap.split(';');
- const parsedEntries: SourceLocation[] = [];
let lastParsedEntry: SourceLocation = {} as any;
const instructionIndexToSourceRange: { [instructionIndex: number]: SourceRange } = {};
_.each(entries, (entry: string, i: number) => {
+ // tslint:disable-next-line:no-unused-variable
const [instructionIndexStrIfExists, lengthStrIfExists, fileIndexStrIfExists, jumpTypeStrIfExists] = entry.split(
':',
);
@@ -56,7 +56,7 @@ export function parseSourceMap(
length,
fileIndex,
};
- if (parsedEntry.fileIndex !== -1) {
+ if (parsedEntry.fileIndex !== -1 && !_.isUndefined(locationByOffsetByFileIndex[parsedEntry.fileIndex])) {
const sourceRange = {
location: {
start: locationByOffsetByFileIndex[parsedEntry.fileIndex][parsedEntry.offset],
diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts
new file mode 100644
index 000000000..635019fc0
--- /dev/null
+++ b/packages/sol-cov/src/trace.ts
@@ -0,0 +1,99 @@
+import { logUtils } from '@0xproject/utils';
+import { OpCode, StructLog } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { utils } from './utils';
+
+export interface TraceByContractAddress {
+ [contractAddress: string]: StructLog[];
+}
+
+export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress {
+ const traceByContractAddress: TraceByContractAddress = {};
+ let currentTraceSegment = [];
+ const addressStack = [startAddress];
+ if (_.isEmpty(structLogs)) {
+ return traceByContractAddress;
+ }
+ const normalizedStructLogs = utils.normalizeStructLogs(structLogs);
+ // tslint:disable-next-line:prefer-for-of
+ for (let i = 0; i < normalizedStructLogs.length; i++) {
+ const structLog = normalizedStructLogs[i];
+ if (structLog.depth !== addressStack.length - 1) {
+ throw new Error("Malformed trace. Trace depth doesn't match call stack depth");
+ }
+ // After that check we have a guarantee that call stack is never empty
+ // If it would: callStack.length - 1 === structLog.depth === -1
+ // That means that we can always safely pop from it
+ currentTraceSegment.push(structLog);
+
+ if (utils.isCallLike(structLog.op)) {
+ const currentAddress = _.last(addressStack) as string;
+ const jumpAddressOffset = 1;
+ const newAddress = utils.getAddressFromStackEntry(
+ structLog.stack[structLog.stack.length - jumpAddressOffset - 1],
+ );
+
+ // Sometimes calls don't change the execution context (current address). When we do a transfer to an
+ // externally owned account - it does the call and immediately returns because there is no fallback
+ // function. We manually check if the call depth had changed to handle that case.
+ const nextStructLog = normalizedStructLogs[i + 1];
+ if (nextStructLog.depth !== structLog.depth) {
+ addressStack.push(newAddress);
+ traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat(
+ currentTraceSegment,
+ );
+ currentTraceSegment = [];
+ }
+ } else if (utils.isEndOpcode(structLog.op)) {
+ const currentAddress = addressStack.pop() as string;
+ traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat(
+ currentTraceSegment,
+ );
+ currentTraceSegment = [];
+ if (structLog.op === OpCode.SelfDestruct) {
+ // After contract execution, we look at all sub-calls to external contracts, and for each one, fetch
+ // the bytecode and compute the coverage for the call. If the contract is destroyed with a call
+ // to `selfdestruct`, we are unable to fetch it's bytecode and compute coverage.
+ // TODO: Refactor this logic to fetch the sub-called contract bytecode before the selfdestruct is called
+ // in order to handle this edge-case.
+ logUtils.warn(
+ "Detected a selfdestruct. Sol-cov currently doesn't support that scenario. We'll just skip the trace part for a destructed contract",
+ );
+ }
+ } else if (structLog.op === OpCode.Create) {
+ // TODO: Extract the new contract address from the stack and handle that scenario
+ logUtils.warn(
+ "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace",
+ );
+ return traceByContractAddress;
+ } else {
+ if (structLog !== _.last(normalizedStructLogs)) {
+ const nextStructLog = normalizedStructLogs[i + 1];
+ if (nextStructLog.depth === structLog.depth) {
+ continue;
+ } else if (nextStructLog.depth === structLog.depth - 1) {
+ const currentAddress = addressStack.pop() as string;
+ traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat(
+ currentTraceSegment,
+ );
+ currentTraceSegment = [];
+ } else {
+ throw new Error('Malformed trace. Unexpected call depth change');
+ }
+ }
+ }
+ }
+ if (addressStack.length !== 0) {
+ logUtils.warn('Malformed trace. Call stack non empty at the end');
+ }
+ if (currentTraceSegment.length !== 0) {
+ const currentAddress = addressStack.pop() as string;
+ traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat(
+ currentTraceSegment,
+ );
+ currentTraceSegment = [];
+ logUtils.warn('Malformed trace. Current trace segment non empty at the end');
+ }
+ return traceByContractAddress;
+}
diff --git a/packages/sol-cov/src/trace_collection_subprovider.ts b/packages/sol-cov/src/trace_collection_subprovider.ts
new file mode 100644
index 000000000..b6486e6f7
--- /dev/null
+++ b/packages/sol-cov/src/trace_collection_subprovider.ts
@@ -0,0 +1,187 @@
+import { BlockchainLifecycle } from '@0xproject/dev-utils';
+import { Callback, ErrorCallback, NextCallback, Subprovider } from '@0xproject/subproviders';
+import { CallDataRPC, marshaller, Web3Wrapper } from '@0xproject/web3-wrapper';
+import { JSONRPCRequestPayload, Provider, TxData } from 'ethereum-types';
+import * as _ from 'lodash';
+import { Lock } from 'semaphore-async-await';
+
+import { constants } from './constants';
+import { BlockParamLiteral } from './types';
+
+interface MaybeFakeTxData extends TxData {
+ isFakeTransaction?: boolean;
+}
+
+const BLOCK_GAS_LIMIT = 6000000;
+
+export interface TraceCollectionSubproviderConfig {
+ shouldCollectTransactionTraces: boolean;
+ shouldCollectCallTraces: boolean;
+ shouldCollectGasEstimateTraces: boolean;
+}
+
+// Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way.
+// On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot.
+// That allows us to avoid influencing test behaviour.
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * It collects traces of all transactions that were sent and all calls that were executed through JSON RPC. It must
+ * be extended by implementing the _recordTxTraceAsync method which is called for every transaction.
+ */
+export abstract class TraceCollectionSubprovider extends Subprovider {
+ protected _web3Wrapper!: Web3Wrapper;
+ // Lock is used to not accept normal transactions while doing call/snapshot magic because they'll be reverted later otherwise
+ private readonly _lock = new Lock();
+ private readonly _defaultFromAddress: string;
+ private _isEnabled = true;
+ private readonly _config: TraceCollectionSubproviderConfig;
+ /**
+ * Instantiates a TraceCollectionSubprovider instance
+ * @param defaultFromAddress default from address to use when sending transactions
+ */
+ constructor(defaultFromAddress: string, config: TraceCollectionSubproviderConfig) {
+ super();
+ this._defaultFromAddress = defaultFromAddress;
+ this._config = config;
+ }
+ /**
+ * Starts trace collection
+ */
+ public start(): void {
+ this._isEnabled = true;
+ }
+ /**
+ * Stops trace collection
+ */
+ public stop(): void {
+ this._isEnabled = false;
+ }
+ /**
+ * This method conforms to the web3-provider-engine interface.
+ * It is called internally by the ProviderEngine when it is this subproviders
+ * turn to handle a JSON RPC request.
+ * @param payload JSON RPC payload
+ * @param next Callback to call if this subprovider decides not to handle the request
+ * @param end Callback to call if subprovider handled the request and wants to pass back the request.
+ */
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, next: NextCallback, _end: ErrorCallback): Promise<void> {
+ if (this._isEnabled) {
+ switch (payload.method) {
+ case 'eth_sendTransaction':
+ if (!this._config.shouldCollectTransactionTraces) {
+ next();
+ } else {
+ const txData = payload.params[0];
+ next(this._onTransactionSentAsync.bind(this, txData));
+ }
+ return;
+
+ case 'eth_call':
+ if (!this._config.shouldCollectCallTraces) {
+ next();
+ } else {
+ const callData = payload.params[0];
+ next(this._onCallOrGasEstimateExecutedAsync.bind(this, callData));
+ }
+ return;
+
+ case 'eth_estimateGas':
+ if (!this._config.shouldCollectGasEstimateTraces) {
+ next();
+ } else {
+ const estimateGasData = payload.params[0];
+ next(this._onCallOrGasEstimateExecutedAsync.bind(this, estimateGasData));
+ }
+ return;
+
+ default:
+ next();
+ return;
+ }
+ } else {
+ next();
+ return;
+ }
+ }
+ /**
+ * Set's the subprovider's engine to the ProviderEngine it is added to.
+ * This is only called within the ProviderEngine source code, do not call
+ * directly.
+ */
+ public setEngine(engine: Provider): void {
+ super.setEngine(engine);
+ this._web3Wrapper = new Web3Wrapper(engine);
+ }
+ protected abstract async _recordTxTraceAsync(
+ address: string,
+ data: string | undefined,
+ txHash: string,
+ ): Promise<void>;
+ private async _onTransactionSentAsync(
+ txData: MaybeFakeTxData,
+ err: Error | null,
+ txHash: string | undefined,
+ cb: Callback,
+ ): Promise<void> {
+ if (!txData.isFakeTransaction) {
+ // This transaction is a usual transaction. Not a call executed as one.
+ // And we don't want it to be executed within a snapshotting period
+ await this._lock.acquire();
+ }
+ const NULL_ADDRESS = '0x0';
+ if (_.isNull(err)) {
+ const toAddress =
+ _.isUndefined(txData.to) || txData.to === NULL_ADDRESS ? constants.NEW_CONTRACT : txData.to;
+ await this._recordTxTraceAsync(toAddress, txData.data, txHash as string);
+ } else {
+ const latestBlock = await this._web3Wrapper.getBlockWithTransactionDataAsync(BlockParamLiteral.Latest);
+ const transactions = latestBlock.transactions;
+ for (const transaction of transactions) {
+ const toAddress =
+ _.isUndefined(txData.to) || txData.to === NULL_ADDRESS ? constants.NEW_CONTRACT : txData.to;
+ await this._recordTxTraceAsync(toAddress, transaction.input, transaction.hash);
+ }
+ }
+ if (!txData.isFakeTransaction) {
+ // This transaction is a usual transaction. Not a call executed as one.
+ // And we don't want it to be executed within a snapshotting period
+ this._lock.release();
+ }
+ cb();
+ }
+ private async _onCallOrGasEstimateExecutedAsync(
+ callData: Partial<CallDataRPC>,
+ _err: Error | null,
+ _callResult: string,
+ cb: Callback,
+ ): Promise<void> {
+ await this._recordCallOrGasEstimateTraceAsync(callData);
+ cb();
+ }
+ private async _recordCallOrGasEstimateTraceAsync(callData: Partial<CallDataRPC>): Promise<void> {
+ // We don't want other transactions to be exeucted during snashotting period, that's why we lock the
+ // transaction execution for all transactions except our fake ones.
+ await this._lock.acquire();
+ const blockchainLifecycle = new BlockchainLifecycle(this._web3Wrapper);
+ await blockchainLifecycle.startAsync();
+ const fakeTxData = {
+ gas: BLOCK_GAS_LIMIT.toString(16), // tslint:disable-line:custom-no-magic-numbers
+ isFakeTransaction: true, // This transaction (and only it) is allowed to come through when the lock is locked
+ ...callData,
+ from: callData.from || this._defaultFromAddress,
+ };
+ try {
+ const txData = marshaller.unmarshalTxData(fakeTxData);
+ const txHash = await this._web3Wrapper.sendTransactionAsync(txData);
+ await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0);
+ } catch (err) {
+ // TODO(logvinov) Check that transaction failed and not some other exception
+ // Even if this transaction failed - we've already recorded it's trace.
+ _.noop();
+ }
+ await blockchainLifecycle.revertAsync();
+ this._lock.release();
+ }
+}
diff --git a/packages/sol-cov/src/trace_collector.ts b/packages/sol-cov/src/trace_collector.ts
new file mode 100644
index 000000000..3e2ae3516
--- /dev/null
+++ b/packages/sol-cov/src/trace_collector.ts
@@ -0,0 +1,93 @@
+import { promisify } from '@0xproject/utils';
+import { stripHexPrefix } from 'ethereumjs-util';
+import * as fs from 'fs';
+import { Collector } from 'istanbul';
+import * as _ from 'lodash';
+import { getLogger, levels, Logger } from 'loglevel';
+import * as mkdirp from 'mkdirp';
+
+import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter';
+import { constants } from './constants';
+import { parseSourceMap } from './source_maps';
+import {
+ ContractData,
+ Coverage,
+ SourceRange,
+ Subtrace,
+ TraceInfo,
+ TraceInfoExistingContract,
+ TraceInfoNewContract,
+} from './types';
+import { utils } from './utils';
+
+const mkdirpAsync = promisify<undefined>(mkdirp);
+
+export type SingleFileSubtraceHandler = (
+ contractData: ContractData,
+ subtrace: Subtrace,
+ pcToSourceRange: { [programCounter: number]: SourceRange },
+ fileIndex: number,
+) => Coverage;
+
+/**
+ * TraceCollector is used by CoverageSubprovider to compute code coverage based on collected trace data.
+ */
+export class TraceCollector {
+ private readonly _artifactAdapter: AbstractArtifactAdapter;
+ private readonly _logger: Logger;
+ private _contractsData!: ContractData[];
+ private readonly _collector = new Collector();
+ private readonly _singleFileSubtraceHandler: SingleFileSubtraceHandler;
+
+ /**
+ * Instantiates a TraceCollector instance
+ * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.)
+ * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them
+ * @param singleFileSubtraceHandler A handler function for computing partial coverage for a single file & subtrace
+ */
+ constructor(
+ artifactAdapter: AbstractArtifactAdapter,
+ isVerbose: boolean,
+ singleFileSubtraceHandler: SingleFileSubtraceHandler,
+ ) {
+ this._artifactAdapter = artifactAdapter;
+ this._logger = getLogger('sol-cov');
+ this._logger.setLevel(isVerbose ? levels.TRACE : levels.ERROR);
+ this._singleFileSubtraceHandler = singleFileSubtraceHandler;
+ }
+ public async writeOutputAsync(): Promise<void> {
+ const finalCoverage = this._collector.getFinalCoverage();
+ const stringifiedCoverage = JSON.stringify(finalCoverage, null, '\t');
+ await mkdirpAsync('coverage');
+ fs.writeFileSync('coverage/coverage.json', stringifiedCoverage);
+ }
+ public async computeSingleTraceCoverageAsync(traceInfo: TraceInfo): Promise<void> {
+ if (_.isUndefined(this._contractsData)) {
+ this._contractsData = await this._artifactAdapter.collectContractsDataAsync();
+ }
+ const isContractCreation = traceInfo.address === constants.NEW_CONTRACT;
+ const bytecode = isContractCreation
+ ? (traceInfo as TraceInfoNewContract).bytecode
+ : (traceInfo as TraceInfoExistingContract).runtimeBytecode;
+ const contractData = utils.getContractDataIfExists(this._contractsData, bytecode);
+ if (_.isUndefined(contractData)) {
+ const errMsg = isContractCreation
+ ? `Unknown contract creation transaction`
+ : `Transaction to an unknown address: ${traceInfo.address}`;
+ this._logger.warn(errMsg);
+ return;
+ }
+ const bytecodeHex = stripHexPrefix(bytecode);
+ const sourceMap = isContractCreation ? contractData.sourceMap : contractData.sourceMapRuntime;
+ const pcToSourceRange = parseSourceMap(contractData.sourceCodes, sourceMap, bytecodeHex, contractData.sources);
+ for (let fileIndex = 0; fileIndex < contractData.sources.length; fileIndex++) {
+ const singleFileCoverageForTrace = this._singleFileSubtraceHandler(
+ contractData,
+ traceInfo.subtrace,
+ pcToSourceRange,
+ fileIndex,
+ );
+ this._collector.add(singleFileCoverageForTrace);
+ }
+ }
+}
diff --git a/packages/sol-cov/src/trace_info_subprovider.ts b/packages/sol-cov/src/trace_info_subprovider.ts
new file mode 100644
index 000000000..635a68f58
--- /dev/null
+++ b/packages/sol-cov/src/trace_info_subprovider.ts
@@ -0,0 +1,59 @@
+import * as _ from 'lodash';
+
+import { constants } from './constants';
+import { getTracesByContractAddress } from './trace';
+import { TraceCollectionSubprovider } from './trace_collection_subprovider';
+import { TraceInfo, TraceInfoExistingContract, TraceInfoNewContract } from './types';
+
+// TraceInfoSubprovider is extended by subproviders which need to work with one
+// TraceInfo at a time. It has one abstract method: _handleTraceInfoAsync, which
+// is called for each TraceInfo.
+export abstract class TraceInfoSubprovider extends TraceCollectionSubprovider {
+ protected abstract _handleTraceInfoAsync(traceInfo: TraceInfo): Promise<void>;
+ protected async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise<void> {
+ await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0);
+ const trace = await this._web3Wrapper.getTransactionTraceAsync(txHash, {
+ disableMemory: true,
+ disableStack: false,
+ disableStorage: true,
+ });
+ const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address);
+ const subcallAddresses = _.keys(tracesByContractAddress);
+ if (address === constants.NEW_CONTRACT) {
+ for (const subcallAddress of subcallAddresses) {
+ let traceInfo: TraceInfoNewContract | TraceInfoExistingContract;
+ if (subcallAddress === 'NEW_CONTRACT') {
+ const traceForThatSubcall = tracesByContractAddress[subcallAddress];
+ traceInfo = {
+ subtrace: traceForThatSubcall,
+ txHash,
+ address: subcallAddress,
+ bytecode: data as string,
+ };
+ } else {
+ const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress);
+ const traceForThatSubcall = tracesByContractAddress[subcallAddress];
+ traceInfo = {
+ subtrace: traceForThatSubcall,
+ txHash,
+ address: subcallAddress,
+ runtimeBytecode,
+ };
+ }
+ await this._handleTraceInfoAsync(traceInfo);
+ }
+ } else {
+ for (const subcallAddress of subcallAddresses) {
+ const runtimeBytecode = await this._web3Wrapper.getContractCodeAsync(subcallAddress);
+ const traceForThatSubcall = tracesByContractAddress[subcallAddress];
+ const traceInfo: TraceInfoExistingContract = {
+ subtrace: traceForThatSubcall,
+ txHash,
+ address: subcallAddress,
+ runtimeBytecode,
+ };
+ await this._handleTraceInfoAsync(traceInfo);
+ }
+ }
+ }
+}
diff --git a/packages/sol-cov/src/types.ts b/packages/sol-cov/src/types.ts
index d6491100b..54ade0400 100644
--- a/packages/sol-cov/src/types.ts
+++ b/packages/sol-cov/src/types.ts
@@ -1,3 +1,6 @@
+import { StructLog } from 'ethereum-types';
+import * as Parser from 'solidity-parser-antlr';
+
export interface LineColumn {
line: number;
column: number;
@@ -45,24 +48,24 @@ export interface StatementMap {
}
export interface LineCoverage {
- [lineNo: number]: boolean;
+ [lineNo: number]: number;
}
export interface FunctionCoverage {
- [functionId: string]: boolean;
+ [functionId: string]: number;
}
export interface StatementCoverage {
- [statementId: string]: boolean;
+ [statementId: string]: number;
}
export interface BranchCoverage {
- [branchId: string]: boolean[];
+ [branchId: string]: number[];
}
export interface Coverage {
[fineName: string]: {
- l: LineCoverage;
+ l?: LineCoverage;
f: FunctionCoverage;
s: StatementCoverage;
b: BranchCoverage;
@@ -79,12 +82,14 @@ export interface ContractData {
runtimeBytecode: string;
sourceMapRuntime: string;
sourceCodes: string[];
- baseName: string;
sources: string[];
}
+// Part of the trace executed within the same context
+export type Subtrace = StructLog[];
+
export interface TraceInfoBase {
- coveredPcs: number[];
+ subtrace: Subtrace;
txHash: string;
}
@@ -99,3 +104,23 @@ export interface TraceInfoExistingContract extends TraceInfoBase {
}
export type TraceInfo = TraceInfoNewContract | TraceInfoExistingContract;
+
+export enum BlockParamLiteral {
+ Latest = 'latest',
+}
+
+export interface EvmCallStackEntry {
+ structLog: StructLog;
+ address: string;
+}
+
+export type EvmCallStack = EvmCallStackEntry[];
+
+export interface SourceSnippet {
+ source: string;
+ fileName: string;
+ type: string;
+ node: Parser.ASTNode;
+ name: string | null;
+ range: SingleFileSourceRange;
+}
diff --git a/packages/sol-cov/src/utils.ts b/packages/sol-cov/src/utils.ts
index f155043a1..b696bd463 100644
--- a/packages/sol-cov/src/utils.ts
+++ b/packages/sol-cov/src/utils.ts
@@ -1,13 +1,87 @@
-import { LineColumn, SingleFileSourceRange } from './types';
+import { addressUtils, BigNumber } from '@0xproject/utils';
+import { OpCode, StructLog } from 'ethereum-types';
+import { addHexPrefix } from 'ethereumjs-util';
+import * as _ from 'lodash';
+
+import { ContractData, LineColumn, SingleFileSourceRange } from './types';
+
+// This is the minimum length of valid contract bytecode. The Solidity compiler
+// metadata is 86 bytes. If you add the '0x' prefix, we get 88.
+const MIN_CONTRACT_BYTECODE_LENGTH = 88;
export const utils = {
compareLineColumn(lhs: LineColumn, rhs: LineColumn): number {
return lhs.line !== rhs.line ? lhs.line - rhs.line : lhs.column - rhs.column;
},
+ removeHexPrefix(hex: string): string {
+ const hexPrefix = '0x';
+ return hex.startsWith(hexPrefix) ? hex.slice(hexPrefix.length) : hex;
+ },
isRangeInside(childRange: SingleFileSourceRange, parentRange: SingleFileSourceRange): boolean {
return (
utils.compareLineColumn(parentRange.start, childRange.start) <= 0 &&
utils.compareLineColumn(childRange.end, parentRange.end) <= 0
);
},
+ bytecodeToBytecodeRegex(bytecode: string): string {
+ const bytecodeRegex = bytecode
+ // Library linking placeholder: __ConvertLib____________________________
+ .replace(/_.*_/, '.*')
+ // Last 86 characters is solidity compiler metadata that's different between compilations
+ .replace(/.{86}$/, '')
+ // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance
+ .replace(/^0x730000000000000000000000000000000000000000/, '0x73........................................');
+ // HACK: Node regexes can't be longer that 32767 characters. Contracts bytecode can. We just truncate the regexes. It's safe in practice.
+ const MAX_REGEX_LENGTH = 32767;
+ const truncatedBytecodeRegex = bytecodeRegex.slice(0, MAX_REGEX_LENGTH);
+ return truncatedBytecodeRegex;
+ },
+ getContractDataIfExists(contractsData: ContractData[], bytecode: string): ContractData | undefined {
+ if (!bytecode.startsWith('0x')) {
+ throw new Error(`0x hex prefix missing: ${bytecode}`);
+ }
+ const contractData = _.find(contractsData, contractDataCandidate => {
+ const bytecodeRegex = utils.bytecodeToBytecodeRegex(contractDataCandidate.bytecode);
+ // If the bytecode is less than the minimum length, we are probably
+ // dealing with an interface. This isn't what we're looking for.
+ if (bytecodeRegex.length < MIN_CONTRACT_BYTECODE_LENGTH) {
+ return false;
+ }
+ const runtimeBytecodeRegex = utils.bytecodeToBytecodeRegex(contractDataCandidate.runtimeBytecode);
+ if (runtimeBytecodeRegex.length < MIN_CONTRACT_BYTECODE_LENGTH) {
+ return false;
+ }
+ // We use that function to find by bytecode or runtimeBytecode. Those are quasi-random strings so
+ // collisions are practically impossible and it allows us to reuse that code
+ return !_.isNull(bytecode.match(bytecodeRegex)) || !_.isNull(bytecode.match(runtimeBytecodeRegex));
+ });
+ return contractData;
+ },
+ isCallLike(op: OpCode): boolean {
+ return _.includes([OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], op);
+ },
+ isEndOpcode(op: OpCode): boolean {
+ return _.includes([OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], op);
+ },
+ getAddressFromStackEntry(stackEntry: string): string {
+ const hexBase = 16;
+ return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(hexBase));
+ },
+ normalizeStructLogs(structLogs: StructLog[]): StructLog[] {
+ if (structLogs[0].depth === 1) {
+ // Geth uses 1-indexed depth counter whilst ganache starts from 0
+ const newStructLogs = _.map(structLogs, structLog => ({
+ ...structLog,
+ depth: structLog.depth - 1,
+ }));
+ return newStructLogs;
+ }
+ return structLogs;
+ },
+ getRange(sourceCode: string, range: SingleFileSourceRange): string {
+ const lines = sourceCode.split('\n').slice(range.start.line - 1, range.end.line);
+ lines[lines.length - 1] = lines[lines.length - 1].slice(0, range.end.column);
+ lines[0] = lines[0].slice(range.start.column);
+ return lines.join('\n');
+ },
};
diff --git a/packages/sol-cov/test/collect_contracts_data_test.ts b/packages/sol-cov/test/collect_contracts_data_test.ts
deleted file mode 100644
index e793085e3..000000000
--- a/packages/sol-cov/test/collect_contracts_data_test.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import * as chai from 'chai';
-import * as _ from 'lodash';
-import 'mocha';
-import * as path from 'path';
-
-import { collectContractsData } from '../src/collect_contract_data';
-
-const expect = chai.expect;
-
-describe('Collect contracts data', () => {
- describe('#collectContractsData', () => {
- it('correctly collects contracts data', () => {
- const artifactsPath = path.resolve(__dirname, 'fixtures/artifacts');
- const sourcesPath = path.resolve(__dirname, 'fixtures/contracts');
- const networkId = 50;
- const contractsData = collectContractsData(artifactsPath, sourcesPath, networkId);
- _.forEach(contractsData, contractData => {
- expect(contractData).to.have.keys([
- 'baseName',
- 'sourceCodes',
- 'sources',
- 'sourceMap',
- 'sourceMapRuntime',
- 'bytecode',
- 'runtimeBytecode',
- ]);
- });
- });
- });
-});
diff --git a/packages/sol-cov/test/collect_coverage_entries_test.ts b/packages/sol-cov/test/collect_coverage_entries_test.ts
index c7bc45bbf..7832ec316 100644
--- a/packages/sol-cov/test/collect_coverage_entries_test.ts
+++ b/packages/sol-cov/test/collect_coverage_entries_test.ts
@@ -5,17 +5,10 @@ import 'mocha';
import * as path from 'path';
import { collectCoverageEntries } from '../src/collect_coverage_entries';
-import { SingleFileSourceRange } from '../src/types';
+import { utils } from '../src/utils';
const expect = chai.expect;
-const getRange = (sourceCode: string, range: SingleFileSourceRange) => {
- const lines = sourceCode.split('\n').slice(range.start.line - 1, range.end.line);
- lines[lines.length - 1] = lines[lines.length - 1].slice(0, range.end.column);
- lines[0] = lines[0].slice(range.start.column);
- return lines.join('\n');
-};
-
describe('Collect coverage entries', () => {
describe('#collectCoverageEntries', () => {
it('correctly collects coverage entries for Simplest contract', () => {
@@ -39,23 +32,25 @@ describe('Collect coverage entries', () => {
const coverageEntries = collectCoverageEntries(simpleStorageContract);
const fnIds = _.keys(coverageEntries.fnMap);
expect(coverageEntries.fnMap[fnIds[0]].name).to.be.equal('set');
- expect(coverageEntries.fnMap[fnIds[0]].line).to.be.equal(3);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ expect(coverageEntries.fnMap[fnIds[0]].line).to.be.equal(5);
const setFunction = `function set(uint x) {
storedData = x;
}`;
- expect(getRange(simpleStorageContract, coverageEntries.fnMap[fnIds[0]].loc)).to.be.equal(setFunction);
+ expect(utils.getRange(simpleStorageContract, coverageEntries.fnMap[fnIds[0]].loc)).to.be.equal(setFunction);
expect(coverageEntries.fnMap[fnIds[1]].name).to.be.equal('get');
- expect(coverageEntries.fnMap[fnIds[1]].line).to.be.equal(6);
+ // tslint:disable-next-line:custom-no-magic-numbers
+ expect(coverageEntries.fnMap[fnIds[1]].line).to.be.equal(8);
const getFunction = `function get() constant returns (uint retVal) {
return storedData;
}`;
- expect(getRange(simpleStorageContract, coverageEntries.fnMap[fnIds[1]].loc)).to.be.equal(getFunction);
+ expect(utils.getRange(simpleStorageContract, coverageEntries.fnMap[fnIds[1]].loc)).to.be.equal(getFunction);
expect(coverageEntries.branchMap).to.be.deep.equal({});
const statementIds = _.keys(coverageEntries.statementMap);
- expect(getRange(simpleStorageContract, coverageEntries.statementMap[statementIds[1]])).to.be.equal(
+ expect(utils.getRange(simpleStorageContract, coverageEntries.statementMap[statementIds[1]])).to.be.equal(
'storedData = x',
);
- expect(getRange(simpleStorageContract, coverageEntries.statementMap[statementIds[3]])).to.be.equal(
+ expect(utils.getRange(simpleStorageContract, coverageEntries.statementMap[statementIds[3]])).to.be.equal(
'return storedData;',
);
expect(coverageEntries.modifiersStatementIds).to.be.deep.equal([]);
@@ -121,9 +116,40 @@ describe('Collect coverage entries', () => {
const branchDescriptions = _.values(coverageEntries.branchMap);
const branchLines = _.map(branchDescriptions, branchDescription => branchDescription.line);
+ // tslint:disable-next-line:custom-no-magic-numbers
expect(branchLines).to.be.deep.equal([94, 115, 119, 130, 151, 187]);
const branchTypes = _.map(branchDescriptions, branchDescription => branchDescription.type);
expect(branchTypes).to.be.deep.equal(['if', 'if', 'if', 'if', 'binary-expr', 'if']);
});
+
+ it('correctly ignores all coverage entries for Ignore contract', () => {
+ const solcovIgnoreContractBaseName = 'SolcovIgnore.sol';
+ const solcovIgnoreContractFileName = path.resolve(
+ __dirname,
+ 'fixtures/contracts',
+ solcovIgnoreContractBaseName,
+ );
+ const solcovIgnoreContract = fs.readFileSync(solcovIgnoreContractFileName).toString();
+ const coverageEntries = collectCoverageEntries(solcovIgnoreContract);
+ const fnIds = _.keys(coverageEntries.fnMap);
+
+ expect(fnIds.length).to.be.equal(1);
+ expect(coverageEntries.fnMap[fnIds[0]].name).to.be.equal('set');
+ // tslint:disable-next-line:custom-no-magic-numbers
+ expect(coverageEntries.fnMap[fnIds[0]].line).to.be.equal(6);
+ const setFunction = `function set(uint x) public {
+ /* solcov ignore next */
+ storedData = x;
+ }`;
+ expect(utils.getRange(solcovIgnoreContract, coverageEntries.fnMap[fnIds[0]].loc)).to.be.equal(setFunction);
+
+ expect(coverageEntries.branchMap).to.be.deep.equal({});
+ const statementIds = _.keys(coverageEntries.statementMap);
+ expect(utils.getRange(solcovIgnoreContract, coverageEntries.statementMap[statementIds[0]])).to.be.equal(
+ setFunction,
+ );
+ expect(statementIds.length).to.be.equal(1);
+ expect(coverageEntries.modifiersStatementIds.length).to.be.equal(0);
+ });
});
});
diff --git a/packages/sol-cov/test/fixtures/artifacts/SimpleStorage.json b/packages/sol-cov/test/fixtures/artifacts/SimpleStorage.json
deleted file mode 100644
index 416170ef2..000000000
--- a/packages/sol-cov/test/fixtures/artifacts/SimpleStorage.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "contract_name": "SimpleStorage",
- "networks": {
- "50": {
- "solc_version": "0.4.21",
- "keccak256": "0x18dc5b5a0e813c17e49936d2f2f7c07c51f050c09ba5e7206f17c855f23f4b6a",
- "source_tree_hash": "0x18dc5b5a0e813c17e49936d2f2f7c07c51f050c09ba5e7206f17c855f23f4b6a",
- "optimizer_enabled": 0,
- "abi": [
- {
- "constant": true,
- "inputs": [],
- "name": "storedData",
- "outputs": [
- {
- "name": "",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- },
- {
- "constant": false,
- "inputs": [
- {
- "name": "x",
- "type": "uint256"
- }
- ],
- "name": "set",
- "outputs": [],
- "payable": false,
- "stateMutability": "nonpayable",
- "type": "function"
- },
- {
- "constant": true,
- "inputs": [],
- "name": "get",
- "outputs": [
- {
- "name": "retVal",
- "type": "uint256"
- }
- ],
- "payable": false,
- "stateMutability": "view",
- "type": "function"
- }
- ],
- "bytecode":
- "0x6060604052341561000f57600080fd5b6101098061001e6000396000f3006060604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b114607e5780636d4ce63c14609e575b600080fd5b3415606257600080fd5b606860c4565b6040518082815260200191505060405180910390f35b3415608857600080fd5b609c600480803590602001909190505060ca565b005b341560a857600080fd5b60ae60d4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a723058207f743855fd0c71699620424a21a257cd197ed05032d6768eb9b874e4898f44c60029",
- "runtime_bytecode":
- "0x6060604052600436106053576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680632a1afcd914605857806360fe47b114607e5780636d4ce63c14609e575b600080fd5b3415606257600080fd5b606860c4565b6040518082815260200191505060405180910390f35b3415608857600080fd5b609c600480803590602001909190505060ca565b005b341560a857600080fd5b60ae60d4565b6040518082815260200191505060405180910390f35b60005481565b8060008190555050565b600080549050905600a165627a7a723058207f743855fd0c71699620424a21a257cd197ed05032d6768eb9b874e4898f44c60029",
- "updated_at": 1521118350895,
- "source_map": "26:196:0:-;;;;;;;;;;;;;;;;;",
- "source_map_runtime":
- "26:196:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83:52;;;;;;;;;;;;;;;;;;;;;;;;;;140:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55:22;;;;:::o;83:52::-;127:1;114:10;:14;;;;83:52;:::o;140:80::-;173:11;203:10;;196:17;;140:80;:::o",
- "sources": ["SimpleStorage.sol"]
- }
- }
-}
diff --git a/packages/sol-cov/test/fixtures/artifacts/Simplest.json b/packages/sol-cov/test/fixtures/artifacts/Simplest.json
deleted file mode 100644
index 8de60e481..000000000
--- a/packages/sol-cov/test/fixtures/artifacts/Simplest.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "contract_name": "Simplest",
- "networks": {
- "50": {
- "solc_version": "0.4.21",
- "keccak256": "0x8e7d62e19c7c7b8bf9a4a43749e111605950cc877574fb9640a1a07d1c3749f9",
- "source_tree_hash": "0x8e7d62e19c7c7b8bf9a4a43749e111605950cc877574fb9640a1a07d1c3749f9",
- "optimizer_enabled": 0,
- "abi": [],
- "bytecode":
- "0x60606040523415600e57600080fd5b603580601b6000396000f3006060604052600080fd00a165627a7a7230582097cfe05b4d18d6ffb3a8d8fab0570cf09640d3131b9677ddb9be4e9fbcb65f010029",
- "runtime_bytecode":
- "0x6060604052600080fd00a165627a7a7230582097cfe05b4d18d6ffb3a8d8fab0570cf09640d3131b9677ddb9be4e9fbcb65f010029",
- "updated_at": 1521118525393,
- "source_map": "26:21:0:-;;;;;;;;;;;;;;;;;",
- "source_map_runtime": "26:21:0:-;;;;;",
- "sources": ["Simplest.sol"]
- }
- }
-}
diff --git a/packages/sol-cov/test/fixtures/contracts/SimpleStorage.sol b/packages/sol-cov/test/fixtures/contracts/SimpleStorage.sol
index 178a52318..e4b4ac246 100644
--- a/packages/sol-cov/test/fixtures/contracts/SimpleStorage.sol
+++ b/packages/sol-cov/test/fixtures/contracts/SimpleStorage.sol
@@ -1,3 +1,5 @@
+pragma solidity ^0.4.21;
+
contract SimpleStorage {
uint public storedData;
function set(uint x) {
diff --git a/packages/sol-cov/test/fixtures/contracts/SolcovIgnore.sol b/packages/sol-cov/test/fixtures/contracts/SolcovIgnore.sol
new file mode 100644
index 000000000..a7977ffb4
--- /dev/null
+++ b/packages/sol-cov/test/fixtures/contracts/SolcovIgnore.sol
@@ -0,0 +1,22 @@
+pragma solidity ^0.4.21;
+
+contract SolcovIgnore {
+ uint public storedData;
+
+ function set(uint x) public {
+ /* solcov ignore next */
+ storedData = x;
+ }
+
+ /* solcov ignore next */
+ function get() constant public returns (uint retVal) {
+ return storedData;
+ }
+}
+
+/* solcov ignore next */
+contract Ignore {
+ function ignored() public returns (bool) {
+ return false;
+ }
+}
diff --git a/packages/sol-cov/test/instructions_test.ts b/packages/sol-cov/test/instructions_test.ts
index 195dfce2f..058053cf9 100644
--- a/packages/sol-cov/test/instructions_test.ts
+++ b/packages/sol-cov/test/instructions_test.ts
@@ -1,7 +1,5 @@
import * as chai from 'chai';
-import * as fs from 'fs';
import 'mocha';
-import * as path from 'path';
import { constants } from '../src/constants';
import { getPcToInstructionIndexMapping } from '../src/instructions';
@@ -11,6 +9,7 @@ const expect = chai.expect;
describe('instructions', () => {
describe('#getPcToInstructionIndexMapping', () => {
it('correctly maps pcs to instruction indexed', () => {
+ // tslint:disable-next-line:custom-no-magic-numbers
const bytecode = new Uint8Array([constants.PUSH1, 42, constants.PUSH2, 1, 2, constants.TIMESTAMP]);
const pcToInstruction = getPcToInstructionIndexMapping(bytecode);
const expectedPcToInstruction = { '0': 0, '2': 1, '5': 2 };
diff --git a/packages/sol-cov/test/sol_compiler_artifact_adapter_test.ts b/packages/sol-cov/test/sol_compiler_artifact_adapter_test.ts
new file mode 100644
index 000000000..9c58d2cef
--- /dev/null
+++ b/packages/sol-cov/test/sol_compiler_artifact_adapter_test.ts
@@ -0,0 +1,29 @@
+import * as chai from 'chai';
+import * as _ from 'lodash';
+import 'mocha';
+import * as path from 'path';
+
+import { SolCompilerArtifactAdapter } from '../src/artifact_adapters/sol_compiler_artifact_adapter';
+
+const expect = chai.expect;
+
+describe('SolCompilerArtifactAdapter', () => {
+ describe('#collectContractsData', () => {
+ it('correctly collects contracts data', async () => {
+ const artifactsPath = path.resolve(__dirname, 'fixtures/artifacts');
+ const sourcesPath = path.resolve(__dirname, 'fixtures/contracts');
+ const zeroExArtifactsAdapter = new SolCompilerArtifactAdapter(artifactsPath, sourcesPath);
+ const contractsData = await zeroExArtifactsAdapter.collectContractsDataAsync();
+ _.forEach(contractsData, contractData => {
+ expect(contractData).to.have.keys([
+ 'sourceCodes',
+ 'sources',
+ 'sourceMap',
+ 'sourceMapRuntime',
+ 'bytecode',
+ 'runtimeBytecode',
+ ]);
+ });
+ });
+ });
+});
diff --git a/packages/sol-cov/test/trace_test.ts b/packages/sol-cov/test/trace_test.ts
new file mode 100644
index 000000000..7a034362c
--- /dev/null
+++ b/packages/sol-cov/test/trace_test.ts
@@ -0,0 +1,55 @@
+import * as chai from 'chai';
+import { OpCode, StructLog } from 'ethereum-types';
+import * as _ from 'lodash';
+import 'mocha';
+
+import { getTracesByContractAddress } from '../src/trace';
+
+const expect = chai.expect;
+
+const DEFAULT_STRUCT_LOG: StructLog = {
+ depth: 0,
+ error: '',
+ gas: 0,
+ gasCost: 0,
+ memory: [],
+ op: OpCode.Invalid,
+ pc: 0,
+ stack: [],
+ storage: {},
+};
+
+function addDefaultStructLogFields(compactStructLog: Partial<StructLog> & { op: OpCode; depth: number }): StructLog {
+ return { ...DEFAULT_STRUCT_LOG, ...compactStructLog };
+}
+
+describe('Trace', () => {
+ describe('#getTracesByContractAddress', () => {
+ it('correctly splits trace by contract address', () => {
+ const delegateCallAddress = '0x0000000000000000000000000000000000000002';
+ const trace = [
+ {
+ op: OpCode.DelegateCall,
+ stack: [delegateCallAddress, '0x'],
+ depth: 0,
+ },
+ {
+ op: OpCode.Return,
+ depth: 1,
+ },
+ {
+ op: OpCode.Return,
+ depth: 0,
+ },
+ ];
+ const fullTrace = _.map(trace, compactStructLog => addDefaultStructLogFields(compactStructLog));
+ const startAddress = '0x0000000000000000000000000000000000000001';
+ const traceByContractAddress = getTracesByContractAddress(fullTrace, startAddress);
+ const expectedTraceByContractAddress = {
+ [startAddress]: [fullTrace[0], fullTrace[2]],
+ [delegateCallAddress]: [fullTrace[1]],
+ };
+ expect(traceByContractAddress).to.be.deep.equal(expectedTraceByContractAddress);
+ });
+ });
+});
diff --git a/packages/sol-cov/tsconfig.json b/packages/sol-cov/tsconfig.json
index 7b93af0da..e35816553 100644
--- a/packages/sol-cov/tsconfig.json
+++ b/packages/sol-cov/tsconfig.json
@@ -3,10 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": [
- "./src/**/*",
- "./test/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
+ "include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/sol-resolver/CHANGELOG.json b/packages/sol-resolver/CHANGELOG.json
new file mode 100644
index 000000000..42d4c7ed1
--- /dev/null
+++ b/packages/sol-resolver/CHANGELOG.json
@@ -0,0 +1,129 @@
+[
+ {
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Fix a bug where RelativeFSResolver would crash when trying to read a directory",
+ "pr": 909
+ },
+ {
+ "note": "Fix a bug where NpmResolver would crash when trying to read a directory",
+ "pr": 961
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Fix a bug in FsResolver where it tries to read directories as files",
+ "pr": 589
+ },
+ {
+ "note": "Fix a bug in NameResolver where it is not ignoring .sol files",
+ "pr": 589
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.0.6",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ }
+]
diff --git a/packages/sol-resolver/CHANGELOG.md b/packages/sol-resolver/CHANGELOG.md
new file mode 100644
index 000000000..1427ec3fe
--- /dev/null
+++ b/packages/sol-resolver/CHANGELOG.md
@@ -0,0 +1,60 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.5 - _August 13, 2018_
+
+ * Fix a bug where RelativeFSResolver would crash when trying to read a directory (#909)
+ * Fix a bug where NpmResolver would crash when trying to read a directory (#961)
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Fix a bug in FsResolver where it tries to read directories as files (#589)
+ * Fix a bug in NameResolver where it is not ignoring .sol files (#589)
+
+## v0.0.8 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.0.6 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.0.5 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.0.4 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.3 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.2 - _April 18, 2018_
+
+ * Dependencies updated
diff --git a/packages/sol-resolver/README.md b/packages/sol-resolver/README.md
new file mode 100644
index 000000000..8487947f0
--- /dev/null
+++ b/packages/sol-resolver/README.md
@@ -0,0 +1,67 @@
+## @0xproject/sol-resolver
+
+A Solidity import resolver used by [sol-compiler](https://github.com/0xProject/0x-monorepo/tree/development/packages/sol-compiler).
+
+## Installation
+
+```bash
+yarn add @0xproject/sol-resolver
+```
+
+**Import**
+
+```javascript
+import { Resolver } from '@0xproject/sol-resolver';
+```
+
+or
+
+```javascript
+var Resolver = require('@0xproject/sol-resolver').Resolver;
+```
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/sol-resolver yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/sol-resolver yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
diff --git a/packages/sol-resolver/package.json b/packages/sol-resolver/package.json
new file mode 100644
index 000000000..7a3c7509a
--- /dev/null
+++ b/packages/sol-resolver/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "@0xproject/sol-resolver",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "Import resolver for smart contracts dependencies",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "scripts": {
+ "watch_without_deps": "tsc -w",
+ "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "clean": "shx rm -rf lib scripts",
+ "lint": "tslint --project .",
+ "manual:postpublish": "yarn build; node ./scripts/postpublish.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/resolver/README.md",
+ "devDependencies": {
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "shx": "^0.2.2",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
+ },
+ "dependencies": {
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "lodash": "^4.17.5"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/sol-resolver/src/globals.d.ts b/packages/sol-resolver/src/globals.d.ts
new file mode 100644
index 000000000..e799b3529
--- /dev/null
+++ b/packages/sol-resolver/src/globals.d.ts
@@ -0,0 +1,7 @@
+// tslint:disable:completed-docs
+declare module '*.json' {
+ const json: any;
+ /* tslint:disable */
+ export default json;
+ /* tslint:enable */
+}
diff --git a/packages/sol-resolver/src/index.ts b/packages/sol-resolver/src/index.ts
new file mode 100644
index 000000000..a86053259
--- /dev/null
+++ b/packages/sol-resolver/src/index.ts
@@ -0,0 +1,9 @@
+export { ContractSource, ContractSources } from './types';
+export { FallthroughResolver } from './resolvers/fallthrough_resolver';
+export { URLResolver } from './resolvers/url_resolver';
+export { NPMResolver } from './resolvers/npm_resolver';
+export { FSResolver } from './resolvers/fs_resolver';
+export { RelativeFSResolver } from './resolvers/relative_fs_resolver';
+export { NameResolver } from './resolvers/name_resolver';
+export { EnumerableResolver } from './resolvers/enumerable_resolver';
+export { Resolver } from './resolvers/resolver';
diff --git a/packages/sol-resolver/src/monorepo_scripts/postpublish.ts b/packages/sol-resolver/src/monorepo_scripts/postpublish.ts
new file mode 100644
index 000000000..dcb99d0f7
--- /dev/null
+++ b/packages/sol-resolver/src/monorepo_scripts/postpublish.ts
@@ -0,0 +1,8 @@
+import { postpublishUtils } from '@0xproject/monorepo-scripts';
+
+import * as packageJSON from '../package.json';
+import * as tsConfigJSON from '../tsconfig.json';
+
+const cwd = `${__dirname}/..`;
+// tslint:disable-next-line:no-floating-promises
+postpublishUtils.runAsync(packageJSON, tsConfigJSON, cwd);
diff --git a/packages/sol-resolver/src/resolvers/enumerable_resolver.ts b/packages/sol-resolver/src/resolvers/enumerable_resolver.ts
new file mode 100644
index 000000000..0efa43e7c
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/enumerable_resolver.ts
@@ -0,0 +1,7 @@
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export abstract class EnumerableResolver extends Resolver {
+ public abstract getAll(): ContractSource[];
+}
diff --git a/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts b/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts
new file mode 100644
index 000000000..338f334f4
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/fallthrough_resolver.ts
@@ -0,0 +1,21 @@
+import * as _ from 'lodash';
+
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export class FallthroughResolver extends Resolver {
+ private readonly _resolvers: Resolver[] = [];
+ public appendResolver(resolver: Resolver): void {
+ this._resolvers.push(resolver);
+ }
+ public resolveIfExists(importPath: string): ContractSource | undefined {
+ for (const resolver of this._resolvers) {
+ const contractSourceIfExists = resolver.resolveIfExists(importPath);
+ if (!_.isUndefined(contractSourceIfExists)) {
+ return contractSourceIfExists;
+ }
+ }
+ return undefined;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/fs_resolver.ts b/packages/sol-resolver/src/resolvers/fs_resolver.ts
new file mode 100644
index 000000000..63fc3448e
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/fs_resolver.ts
@@ -0,0 +1,19 @@
+import * as fs from 'fs';
+
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export class FSResolver extends Resolver {
+ // tslint:disable-next-line:prefer-function-over-method
+ public resolveIfExists(importPath: string): ContractSource | undefined {
+ if (fs.existsSync(importPath) && fs.lstatSync(importPath).isFile()) {
+ const fileContent = fs.readFileSync(importPath).toString();
+ return {
+ source: fileContent,
+ path: importPath,
+ };
+ }
+ return undefined;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/name_resolver.ts b/packages/sol-resolver/src/resolvers/name_resolver.ts
new file mode 100644
index 000000000..d6ac6a499
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/name_resolver.ts
@@ -0,0 +1,72 @@
+import * as fs from 'fs';
+import * as path from 'path';
+
+import { ContractSource } from '../types';
+
+import { EnumerableResolver } from './enumerable_resolver';
+
+const SOLIDITY_FILE_EXTENSION = '.sol';
+
+export class NameResolver extends EnumerableResolver {
+ private readonly _contractsDir: string;
+ constructor(contractsDir: string) {
+ super();
+ this._contractsDir = contractsDir;
+ }
+ public resolveIfExists(lookupContractName: string): ContractSource | undefined {
+ let contractSource: ContractSource | undefined;
+ const onFile = (filePath: string) => {
+ const contractName = path.basename(filePath, SOLIDITY_FILE_EXTENSION);
+ if (contractName === lookupContractName) {
+ const absoluteContractPath = path.join(this._contractsDir, filePath);
+ const source = fs.readFileSync(absoluteContractPath).toString();
+ contractSource = {
+ source,
+ path: filePath,
+ };
+ return true;
+ }
+ return undefined;
+ };
+ this._traverseContractsDir(this._contractsDir, onFile);
+ return contractSource;
+ }
+ public getAll(): ContractSource[] {
+ const contractSources: ContractSource[] = [];
+ const onFile = (filePath: string) => {
+ const absoluteContractPath = path.join(this._contractsDir, filePath);
+ const source = fs.readFileSync(absoluteContractPath).toString();
+ const contractSource = {
+ source,
+ path: filePath,
+ };
+ contractSources.push(contractSource);
+ };
+ this._traverseContractsDir(this._contractsDir, onFile);
+ return contractSources;
+ }
+ // tslint:disable-next-line:prefer-function-over-method
+ private _traverseContractsDir(dirPath: string, onFile: (filePath: string) => true | void): boolean {
+ let dirContents: string[] = [];
+ try {
+ dirContents = fs.readdirSync(dirPath);
+ } catch (err) {
+ throw new Error(`No directory found at ${dirPath}`);
+ }
+ for (const fileName of dirContents) {
+ const absoluteEntryPath = path.join(dirPath, fileName);
+ const isDirectory = fs.lstatSync(absoluteEntryPath).isDirectory();
+ const entryPath = path.relative(this._contractsDir, absoluteEntryPath);
+ let isComplete;
+ if (isDirectory) {
+ isComplete = this._traverseContractsDir(absoluteEntryPath, onFile);
+ } else if (fileName.endsWith(SOLIDITY_FILE_EXTENSION)) {
+ isComplete = onFile(entryPath);
+ }
+ if (isComplete) {
+ return isComplete;
+ }
+ }
+ return false;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/npm_resolver.ts b/packages/sol-resolver/src/resolvers/npm_resolver.ts
new file mode 100644
index 000000000..a2df0dcad
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/npm_resolver.ts
@@ -0,0 +1,34 @@
+import * as fs from 'fs';
+import * as path from 'path';
+
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export class NPMResolver extends Resolver {
+ private readonly _packagePath: string;
+ constructor(packagePath: string) {
+ super();
+ this._packagePath = packagePath;
+ }
+ public resolveIfExists(importPath: string): ContractSource | undefined {
+ if (!importPath.startsWith('/')) {
+ const [packageName, ...other] = importPath.split('/');
+ const pathWithinPackage = path.join(...other);
+ let currentPath = this._packagePath;
+ const ROOT_PATH = '/';
+ while (currentPath !== ROOT_PATH) {
+ const lookupPath = path.join(currentPath, 'node_modules', packageName, pathWithinPackage);
+ if (fs.existsSync(lookupPath) && fs.lstatSync(lookupPath).isFile()) {
+ const fileContent = fs.readFileSync(lookupPath).toString();
+ return {
+ source: fileContent,
+ path: lookupPath,
+ };
+ }
+ currentPath = path.dirname(currentPath);
+ }
+ }
+ return undefined;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts b/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts
new file mode 100644
index 000000000..ed96040d3
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/relative_fs_resolver.ts
@@ -0,0 +1,26 @@
+import * as fs from 'fs';
+import * as path from 'path';
+
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export class RelativeFSResolver extends Resolver {
+ private readonly _contractsDir: string;
+ constructor(contractsDir: string) {
+ super();
+ this._contractsDir = contractsDir;
+ }
+ // tslint:disable-next-line:prefer-function-over-method
+ public resolveIfExists(importPath: string): ContractSource | undefined {
+ const filePath = path.join(this._contractsDir, importPath);
+ if (fs.existsSync(filePath) && !fs.lstatSync(filePath).isDirectory()) {
+ const fileContent = fs.readFileSync(filePath).toString();
+ return {
+ source: fileContent,
+ path: importPath,
+ };
+ }
+ return undefined;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/resolver.ts b/packages/sol-resolver/src/resolvers/resolver.ts
new file mode 100644
index 000000000..7edc9a85d
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/resolver.ts
@@ -0,0 +1,14 @@
+import * as _ from 'lodash';
+
+import { ContractSource } from '../types';
+
+export abstract class Resolver {
+ public abstract resolveIfExists(importPath: string): ContractSource | undefined;
+ public resolve(importPath: string): ContractSource {
+ const contractSourceIfExists = this.resolveIfExists(importPath);
+ if (_.isUndefined(contractSourceIfExists)) {
+ throw new Error(`Failed to resolve ${importPath}`);
+ }
+ return contractSourceIfExists;
+ }
+}
diff --git a/packages/sol-resolver/src/resolvers/url_resolver.ts b/packages/sol-resolver/src/resolvers/url_resolver.ts
new file mode 100644
index 000000000..180b0c9f6
--- /dev/null
+++ b/packages/sol-resolver/src/resolvers/url_resolver.ts
@@ -0,0 +1,21 @@
+import * as fs from 'fs';
+
+import { ContractSource } from '../types';
+
+import { Resolver } from './resolver';
+
+export class URLResolver extends Resolver {
+ // tslint:disable-next-line:prefer-function-over-method
+ public resolveIfExists(importPath: string): ContractSource | undefined {
+ const FILE_URL_PREXIF = 'file://';
+ if (importPath.startsWith(FILE_URL_PREXIF)) {
+ const filePath = importPath.substr(FILE_URL_PREXIF.length);
+ const fileContent = fs.readFileSync(filePath).toString();
+ return {
+ source: fileContent,
+ path: importPath,
+ };
+ }
+ return undefined;
+ }
+}
diff --git a/packages/sol-resolver/src/types.ts b/packages/sol-resolver/src/types.ts
new file mode 100644
index 000000000..41492622d
--- /dev/null
+++ b/packages/sol-resolver/src/types.ts
@@ -0,0 +1,8 @@
+export interface ContractSource {
+ source: string;
+ path: string;
+}
+
+export interface ContractSources {
+ [key: string]: ContractSource;
+}
diff --git a/packages/sol-resolver/tsconfig.json b/packages/sol-resolver/tsconfig.json
new file mode 100644
index 000000000..f5f4b37c2
--- /dev/null
+++ b/packages/sol-resolver/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["src/**/*"]
+}
diff --git a/packages/sol-resolver/tslint.json b/packages/sol-resolver/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/sol-resolver/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/sra-api/.discharge.json b/packages/sra-api/.discharge.json
new file mode 100644
index 000000000..df2cce0f4
--- /dev/null
+++ b/packages/sra-api/.discharge.json
@@ -0,0 +1,13 @@
+{
+ "domain": "sra-api",
+ "build_command": "yarn build-json",
+ "upload_directory": "public",
+ "index_key": "index.html",
+ "error_key": "index.html",
+ "trailing_slashes": true,
+ "cache": 3600,
+ "aws_profile": "default",
+ "aws_region": "us-east-1",
+ "cdn": false,
+ "dns_configured": true
+}
diff --git a/packages/sra-api/.npmignore b/packages/sra-api/.npmignore
new file mode 100644
index 000000000..e610180ad
--- /dev/null
+++ b/packages/sra-api/.npmignore
@@ -0,0 +1,8 @@
+.*
+yarn-error.log
+/src/
+/schemas/
+test/
+tsconfig.json
+/lib/src/monorepo_scripts/
+/public/ \ No newline at end of file
diff --git a/packages/sra-api/CHANGELOG.json b/packages/sra-api/CHANGELOG.json
new file mode 100644
index 000000000..757a859f3
--- /dev/null
+++ b/packages/sra-api/CHANGELOG.json
@@ -0,0 +1,12 @@
+[
+ {
+ "version": "1.0.1-rc.4",
+ "changes": [
+ {
+ "note": "Add inital spec for SRA v2",
+ "pr": 916
+ }
+ ],
+ "timestamp": 1534210131
+ }
+]
diff --git a/packages/sra-api/CHANGELOG.md b/packages/sra-api/CHANGELOG.md
new file mode 100644
index 000000000..ed0d4891b
--- /dev/null
+++ b/packages/sra-api/CHANGELOG.md
@@ -0,0 +1,10 @@
+<!--
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
+Edit the package's CHANGELOG.json file only.
+-->
+
+CHANGELOG
+
+## v1.0.1-rc.4 - _August 13, 2018_
+
+ * Add inital spec for SRA v2 (#916)
diff --git a/packages/sra-api/README.md b/packages/sra-api/README.md
new file mode 100644
index 000000000..dec66c498
--- /dev/null
+++ b/packages/sra-api/README.md
@@ -0,0 +1,93 @@
+## @0xproject/sra-api
+
+Contains the Standard Relayer API [OpenAPI Spec](https://github.com/OAI/OpenAPI-Specification).
+
+The package distributes both a javascript object version and a json version.
+
+A deployed [ReDoc](https://github.com/Rebilly/ReDoc) static site with the API can be found here http://sra-api.s3-website-us-east-1.amazonaws.com/.
+
+## Usage
+
+```
+import { api } from '@0xproject/sra-api';
+```
+
+## Installation
+
+```
+yarn install
+```
+
+## Development
+
+You can start a development server that will serve a [ReDoc](https://github.com/Rebilly/ReDoc) documentation instance. It uses the `api.json` file from `lib/` (you must have built at least once with `yarn build` or `yarn build-json`) that is based on the `api` object exported from `src`.
+
+```
+yarn watch_without_deps
+```
+
+The process will watch for changes, but will not hot-reload so you must refresh the page to see the changes.
+
+## Contributing
+
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
+
+Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
+
+### Install dependencies
+
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
+
+```bash
+yarn config set workspaces-experimental true
+```
+
+Then install dependencies
+
+```bash
+yarn install
+```
+
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/sra-api yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/sra-api yarn watch
+```
+
+### Static Site
+
+We also [host a static HTML version of the docs on S3](http://sra-api.s3-website-us-east-1.amazonaws.com/) for easy sharing.
+
+To build and deploy the site run
+
+```
+yarn deploy-site
+```
+
+**NOTE: On deploying the site, it will say the site is available at a non-existent URL. Please ignore and use the (now updated) URL above.**
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
+### Run Tests
+
+```bash
+yarn test
+```
diff --git a/packages/sra-api/build_scripts/buildJson.ts b/packages/sra-api/build_scripts/buildJson.ts
new file mode 100644
index 000000000..b92b5172b
--- /dev/null
+++ b/packages/sra-api/build_scripts/buildJson.ts
@@ -0,0 +1,7 @@
+import { writeFileSync } from 'fs';
+
+import { api } from '../src';
+
+const apiJson = JSON.stringify(api);
+writeFileSync('lib/api.json', apiJson);
+writeFileSync('public/api.json', apiJson);
diff --git a/packages/sra-api/package.json b/packages/sra-api/package.json
new file mode 100644
index 000000000..a4a0a7b0b
--- /dev/null
+++ b/packages/sra-api/package.json
@@ -0,0 +1,60 @@
+{
+ "name": "@0xproject/sra-api",
+ "version": "1.0.1-rc.4",
+ "engines": {
+ "node": ">=6.12"
+ },
+ "description": "Standard Relayer API Open API Spec",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
+ "scripts": {
+ "serve": "redoc-cli serve lib/api.json --watch",
+ "watch_without_deps": "run-p build-json:watch serve",
+ "lint": "tslint --project .",
+ "test": "swagger-cli validate lib/api.json",
+ "rebuild_and_test": "run-s clean build test",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "test:circleci": "yarn test:coverage",
+ "clean": "shx rm -rf lib",
+ "build": "tsc && yarn build-json",
+ "build-json": "ts-node build_scripts/buildJson.ts",
+ "build-json:watch": "chokidar 'src/**/*' -c 'yarn build-json' ",
+ "deploy-site": "discharge deploy"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/0xProject/0x-monorepo.git"
+ },
+ "author": "Francesco Agosti",
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/0xProject/0x-monorepo/issues"
+ },
+ "homepage": "https://github.com/0xProject/0x-monorepo/packages/sra-api/README.md",
+ "dependencies": {
+ "@0xproject/json-schemas": "^1.0.1-rc.4"
+ },
+ "devDependencies": {
+ "@0xproject/tslint-config": "^1.0.5",
+ "@loopback/openapi-v3-types": "^0.8.2",
+ "@types/mocha": "^2.2.42",
+ "@types/node": "^10.5.3",
+ "chai": "^4.0.1",
+ "chokidar-cli": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "discharge": "^0.7.1",
+ "mocha": "^4.0.1",
+ "npm-run-all": "^4.1.3",
+ "nyc": "^11.0.1",
+ "redoc-cli": "^0.6.1",
+ "shx": "^0.2.2",
+ "swagger-cli": "^2.1.1",
+ "ts-node": "^7.0.0",
+ "tslint": "5.11.0",
+ "typescript": "2.7.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/sra-api/public/api.json b/packages/sra-api/public/api.json
new file mode 100644
index 000000000..36b08ad1a
--- /dev/null
+++ b/packages/sra-api/public/api.json
@@ -0,0 +1 @@
+{"openapi":"3.0.0","info":{"version":"2.0.0","title":"Standard Relayer REST API","description":"# Testing\n\nUse the [sra-report](https://github.com/0xProject/0x-monorepo/tree/development/packages/sra-report) command line tool to test your API for SRA compliance.\n\n# Schemas\n\nThe [JSON schemas](http://json-schema.org/) for the API payloads and responses can be found in [@0xproject/json-schemas](https://github.com/0xProject/0x.js/tree/development/packages/json-schemas). Examples of each payload and response can be found in the library's [test suite](https://github.com/0xProject/0x.js/blob/development/packages/json-schemas/test/schema_test.ts#L1).\n\n```bash\nnpm install @0xproject/json-schemas --save\n```\n\nYou can easily validate your API's payloads and responses using the [@0xproject/json-schemas](https://github.com/0xProject/0x.js/tree/development/packages/json-schemas) package:\n\n```js\nimport {SchemaValidator, ValidatorResult, schemas} from '@0xproject/json-schemas';\n\nconst {relayerApiTokenPairsResponseSchema} = schemas;\nconst validator = new SchemaValidator();\n\nconst tokenPairsResponse = {\n ...\n};\nconst validatorResult: ValidatorResult = validator.validate(tokenPairsResponse, relayerApiTokenPairsResponseSchema);\n```\n\n# Pagination\n\nRequests that return potentially large collections should respond to the **?page** and **?perPage** parameters. For example:\n\n```bash\n$ curl https://api.example-relayer.com/v2/asset_pairs?page=3&perPage=20\n```\n\nPage numbering should be 1-indexed, not 0-indexed. If a query provides an unreasonable (ie. too high) `perPage` value, the response can return a validation error as specified in the [errors section](#section/Errors). If the query specifies a `page` that does not exist (ie. there are not enough `records`), the response should just return an empty `records` array.\n\nAll endpoints that are paginated should return a `total`, `page`, `perPage` and a `records` value in the top level of the collection. The value of `total` should be the total number of records for a given query, whereas `records` should be an array representing the response to the query for that page. `page` and `perPage`, are the same values that were specified in the request. See the note in [miscellaneous](#section/Misc.) about formatting `snake_case` vs. `lowerCamelCase`.\n\nThese requests include the [`/v2/asset_pairs`](#operation/getAssetPairs), [`/v2/orders`](#operation/getOrders), [`/v2/fee_recipients`](#operation/getFeeRecipients) and [`/v2/orderbook`](#operation/getOrderbook) endpoints.\n\n# Network Id\n\nAll requests should be able to specify a **?networkId** query param for all supported networks. For example:\n\n```bash\n$ curl https://api.example-relayer.com/v2/asset_pairs?networkId=1\n```\n\nIf the query param is not provided, it should default to **1** (mainnet).\n\nNetworks and their Ids:\n\n| Network Id | Network Name |\n| ---------- | ------------ |\n| 1 | Mainnet |\n| 42 | Kovan |\n| 3 | Ropsten |\n| 4 | Rinkeby |\n\nIf a certain network is not supported, the response should **400** as specified in the [error response](#section/Errors) section. For example:\n\n```json\n{\n \"code\": 100,\n \"reason\": \"Validation failed\",\n \"validationErrors\": [\n {\n \"field\": \"networkId\",\n \"code\": 1006,\n \"reason\": \"Network id 42 is not supported\"\n }\n ]\n}\n```\n\n# Link Header\n\nA [Link Header](https://tools.ietf.org/html/rfc5988) can be included in a response to provide clients with more context about paging\nFor example:\n\n```bash\nLink: <https://api.example-relayer.com/v2/asset_pairs?page=3&perPage=20>; rel=\"next\",\n<https://api.github.com/user/repos?page=10&perPage=20>; rel=\"last\"\n```\n\nThis `Link` response header contains one or more Hypermedia link relations.\n\nThe possible `rel` values are:\n\n| Name | Description |\n| ----- | ------------------------------------------------------------- |\n| next | The link relation for the immediate next page of results. |\n| last | The link relation for the last page of results. |\n| first | The link relation for the first page of results. |\n| prev | The link relation for the immediate previous page of results. |\n\n# Rate Limits\n\nRate limit guidance for clients can be optionally returned in the response headers:\n\n| Header Name | Description |\n| --------------------- | ---------------------------------------------------------------------------- |\n| X-RateLimit-Limit | The maximum number of requests you're permitted to make per hour. |\n| X-RateLimit-Remaining | The number of requests remaining in the current rate limit window. |\n| X-RateLimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds. |\n\nFor example:\n\n```bash\n$ curl -i https://api.example-relayer.com/v2/asset_pairs\nHTTP/1.1 200 OK\nDate: Mon, 20 Oct 2017 12:30:06 GMT\nStatus: 200 OK\nX-RateLimit-Limit: 60\nX-RateLimit-Remaining: 56\nX-RateLimit-Reset: 1372700873\n```\n\nWhen a rate limit is exceeded, a status of **429 Too Many Requests** should be returned.\n\n# Errors\n\nUnless the spec defines otherwise, errors to bad requests should respond with HTTP 4xx or status codes.\n\n## Common error codes\n\n| Code | Reason |\n| ---- | --------------------------------------- |\n| 400 | Bad Request – Invalid request format |\n| 404 | Not found |\n| 429 | Too many requests - Rate limit exceeded |\n| 500 | Internal Server Error |\n| 501 | Not Implemented |\n\n## Error reporting format\n\nFor all **400** responses, see the [error response schema](https://github.com/0xProject/0x-monorepo/blob/development/packages/json-schemas/schemas/relayer_api_error_response_schema.ts#L1).\n\n```json\n{\n \"code\": 101,\n \"reason\": \"Validation failed\",\n \"validationErrors\": [\n {\n \"field\": \"maker\",\n \"code\": 1002,\n \"reason\": \"Invalid address\"\n }\n ]\n}\n```\n\nGeneral error codes:\n\n```bash\n100 - Validation Failed\n101 - Malformed JSON\n102 - Order submission disabled\n103 - Throttled\n```\n\nValidation error codes:\n\n```bash\n1000 - Required field\n1001 - Incorrect format\n1002 - Invalid address\n1003 - Address not supported\n1004 - Value out of range\n1005 - Invalid signature or hash\n1006 - Unsupported option\n```\n\n# Asset Data Encoding\n\nAs we now support multiple [token transfer proxies](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#assetproxy), the identifier of which proxy to use for the token transfer must be encoded, along with the token information. Each proxy in 0x v2 has a unique identifier. If you're using 0x.js there will be helper methods for this [encoding](https://0xproject.com/docs/0x.js#zeroEx-encodeERC20AssetData) and [decoding](https://0xproject.com/docs/0x.js#zeroEx-decodeAssetProxyId).\n\nThe identifier for the Proxy uses a similar scheme to [ABI function selectors](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector).\n\n```js\n// ERC20 Proxy ID 0xf47261b0\nbytes4(keccak256('ERC20Token(address)'));\n// ERC721 Proxy ID 0x08e937fa\nbytes4(keccak256('ERC721Token(address,uint256)'));\n```\n\nAsset data is encoded using [ABI encoding](https://solidity.readthedocs.io/en/develop/abi-spec.html).\n\nFor example, encoding the ERC20 token contract (address: 0x1dc4c1cefef38a777b15aa20260a54e584b16c48) using the ERC20 Transfer Proxy (id: 0xf47261b0) would be:\n\n```bash\n0xf47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48\n```\n\nEncoding the ERC721 token contract (address: `0x371b13d97f4bf77d724e78c16b7dc74099f40e84`), token id (id: `99`, which hex encoded is `0x63`) and the ERC721 Transfer Proxy (id: 0x08e937fa) would be:\n\n```bash\n0x08e937fa000000000000000000000000371b13d97f4bf77d724e78c16b7dc74099f40e840000000000000000000000000000000000000000000000000000000000000063\n```\n\nFor more information see [the Asset Proxy](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#erc20proxy) section of the v2 spec and the [Ethereum ABI Spec](https://solidity.readthedocs.io/en/develop/abi-spec.html).\n\n# Meta Data in Order Responses\n\nIn v2 of the standard relayer API we added the `metaData` field. It is meant to provide a standard place for relayers to put optional, custom or non-standard fields that may of interest to the consumer of the API.\n\nA good example of such a field is `remainingTakerAssetAmount`, which is a convenience field that communicates how much of a 0x order is potentially left to be filled. Unlike the other fields in a 0x order, it is not guaranteed to be correct as it is derived from whatever mechanism the implementer (ie. the relayer) is using. While convenient for prototyping and low stakes situations, we recommend validating the value of the field by checking the state of the blockchain yourself, such as by using [Order Watcher](https://0xproject.com/wiki#0x-OrderWatcher).\n\n# Misc.\n\n* All requests and responses should be of **application/json** content type\n* All token amounts are sent in amounts of the smallest level of precision (base units). (e.g if a token has 18 decimal places, selling 1 token would show up as selling `'1000000000000000000'` units by this API).\n* All addresses are sent as lower-case (non-checksummed) Ethereum addresses with the `0x` prefix.\n* All parameters are to be written in `lowerCamelCase`.\n","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0.html"}},"paths":{"/v2/asset_pairs":{"get":{"description":"Retrieves a list of available asset pairs and the information required to trade them (in any order). Setting only `assetDataA` or `assetDataB` returns pairs filtered by that asset only.","operationId":"getAssetPairs","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}},{"name":"page","in":"query","description":"The number of the page to request in the collection.","example":3,"schema":{"type":"number"}},{"name":"perPage","in":"query","description":"The number of records to return per page.","example":10,"schema":{"type":"number"}},{"name":"assetDataA","in":"query","description":"The assetData value for the first asset in the pair.","example":"0xf47261b04c32345ced77393b3530b1eed0f346429d","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"assetDataB","in":"query","description":"The assetData value for the second asset in the pair.","example":"0x0257179264389b814a946f3e92105513705ca6b990","schema":{"$ref":"#/components/schemas/hexSchema"}}],"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"Returns a collection of available asset pairs with some meta info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiAssetDataPairsResponseSchema"},"example":{"total":43,"page":1,"perPage":100,"records":[{"assetDataA":{"minAmount":"0","maxAmount":"10000000000000000000","precision":5,"assetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d"},"assetDataB":{"minAmount":"0","maxAmount":"50000000000000000000","precision":5,"assetData":"0x0257179264389b814a946f3e92105513705ca6b990"}}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/orders":{"get":{"description":"Retrieves a list of orders given query parameters. This endpoint should be [paginated](#section/Pagination). For querying an entire orderbook snapshot, the [orderbook endpoint](#operation/getOrderbook) is recommended. If both makerAssetData and takerAssetData are specified, returned orders will be sorted by price determined by (takerTokenAmount/makerTokenAmount) in ascending order. By default, orders returned by this endpoint are unsorted.","operationId":"getOrders","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}},{"name":"page","in":"query","description":"The number of the page to request in the collection.","example":3,"schema":{"type":"number"}},{"name":"perPage","in":"query","description":"The number of records to return per page.","example":10,"schema":{"type":"number"}},{"name":"makerAssetProxyId","in":"query","description":"The maker [asset proxy id](https://0xproject.com/docs/0x.js#types-AssetProxyId) (example: \"0xf47261b0\" for ERC20, \"0x02571792\" for ERC721).","example":"0xf47261b0","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"takerAssetProxyId","in":"query","description":"The taker asset [asset proxy id](https://0xproject.com/docs/0x.js#types-AssetProxyId) (example: \"0xf47261b0\" for ERC20, \"0x02571792\" for ERC721).","example":"0x02571792","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"makerAssetAddress","in":"query","description":"The contract address for the maker asset.","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"takerAssetAddress","in":"query","description":"The contract address for the taker asset.","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"exchangeAddress","in":"query","description":"Same as exchangeAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"senderAddress","in":"query","description":"Same as senderAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"makerAssetData","in":"query","description":"Same as makerAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"takerAssetData","in":"query","description":"Same as takerAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"traderAssetData","in":"query","description":"Same as traderAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"makerAddress","in":"query","description":"Same as makerAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"traderAddress","in":"query","description":"Same as traderAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}},{"name":"feeRecipientAddress","in":"query","description":"Same as feeRecipientAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)","example":"0xe41d2489571d322189246dafa5ebde1f4699f498","schema":{"$ref":"#/components/schemas/addressSchema"}}],"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"A collection of 0x orders with meta-data as specified by query params","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiOrdersResponseSchema"},"example":{"total":984,"page":1,"perPage":100,"records":[{"order":{"makerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","takerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"10000000000000000","takerAssetAmount":"20000000000000000","makerFee":"100000000000000","takerFee":"200000000000000","expirationTimeSeconds":"1532560590","salt":"1532559225","makerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","takerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","signature":"0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"},"metaData":{}}]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/order/{orderHash}":{"get":{"description":"Retrieves the 0x order with meta info that is associated with the hash.","operationId":"getOrder","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}},{"name":"orderHash","in":"path","description":"The hash of the desired 0x order.","example":"0xd4b103c42d2512eef3fee775e097f044291615d25f5d71e0ac70dbd49d223591","schema":{"$ref":"#/components/schemas/orderHashSchema"}}],"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"The order and meta info associated with the orderHash","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiOrderSchema"},"example":{"order":{"makerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","takerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"10000000000000000","takerAssetAmount":"20000000000000000","makerFee":"100000000000000","takerFee":"200000000000000","expirationTimeSeconds":"1532560590","salt":"1532559225","makerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","takerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","signature":"0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"},"metaData":{}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/orderbook":{"get":{"description":"Retrieves the orderbook for a given asset pair. This endpoint should be [paginated](#section/Pagination). Bids will be sorted in descending order by price, and asks will be sorted in ascending order by price. Within the price sorted orders, the orders are further sorted by _taker fee price_ which is defined as the **takerFee** divided by **takerTokenAmount**. After _taker fee price_, orders are to be sorted by expiration in ascending order. The way pagination works for this endpoint is that the **page** and **perPage** query params apply to both `bids` and `asks` collections, and if `page` * `perPage` > `total` for a certain collection, the `records` for that collection should just be empty. ","operationId":"getOrderbook","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}},{"name":"page","in":"query","description":"The number of the page to request in the collection.","example":3,"schema":{"type":"number"}},{"name":"perPage","in":"query","description":"The number of records to return per page.","example":10,"schema":{"type":"number"}},{"name":"baseAssetData","in":"query","description":"assetData (makerAssetData or takerAssetData) designated as the base currency in the [currency pair calculation](https://en.wikipedia.org/wiki/Currency_pair) of price.","required":true,"example":"0xf47261b04c32345ced77393b3530b1eed0f346429d","schema":{"$ref":"#/components/schemas/hexSchema"}},{"name":"quoteAssetData","in":"query","description":"assetData (makerAssetData or takerAssetData) designated as the quote currency in the currency pair calculation of price (required).","required":true,"example":"0xf47261b04c32345ced77393b3530b1eed0f346429d","schema":{"$ref":"#/components/schemas/hexSchema"}}],"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"The sorted order book for the specified asset pair.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiOrderbookResponseSchema"},"example":{"bids":{"total":325,"page":2,"perPage":100,"records":[{"order":{"makerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","takerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"10000000000000000","takerAssetAmount":"20000000000000000","makerFee":"100000000000000","takerFee":"200000000000000","expirationTimeSeconds":"1532560590","salt":"1532559225","makerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","takerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","signature":"0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"},"metaData":{}}]},"asks":{"total":500,"page":2,"perPage":100,"records":[{"order":{"makerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","takerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"20000000000000000","takerAssetAmount":"10000000000000000","makerFee":"200000000000000","takerFee":"100000000000000","expirationTimeSeconds":"1532560590","salt":"1532559225","makerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","takerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","signature":"0x013842a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b3518891"},"metaData":{}}]}}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/order_config":{"get":{"description":"Relayers have full discretion over the orders that they are willing to host on their orderbooks (e.g what fees they charge, etc...). In order for traders to discover their requirements programmatically, they can send an incomplete order to this endpoint and receive the missing fields, specifc to that order. This gives relayers a large amount of flexibility to tailor fees to unique traders, trading pairs and volume amounts. Submit a partial order and receive information required to complete the order: `senderAddress`, `feeRecipientAddress`, `makerFee`, `takerFee`. ","operationId":"getOrderConfig","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}}],"requestBody":{"description":"The fields of a 0x order the relayer may want to decide what configuration to send back.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiOrderConfigPayloadSchema"},"example":{"makerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","takerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"10000000000000000","takerAssetAmount":"20000000000000000","makerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","takerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","expirationTimeSeconds":"1532560590"}}}},"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"The additional fields necessary in order to submit an order to the relayer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiOrderConfigResponseSchema"},"example":{"senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","makerFee":"100000000000000","takerFee":"200000000000000"}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/fee_recipients":{"get":{"description":"Retrieves a collection of all fee recipient addresses for a relayer. This endpoint should be [paginated](#section/Pagination).","operationId":"getFeeRecipients","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}},{"name":"page","in":"query","description":"The number of the page to request in the collection.","example":3,"schema":{"type":"number"}},{"name":"perPage","in":"query","description":"The number of records to return per page.","example":10,"schema":{"type":"number"}}],"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"A collection of all used fee recipient addresses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiFeeRecipientsResponseSchema"},"example":{"total":3,"page":1,"perPage":10,"records":["0x6eC92694ea172ebC430C30fa31De87620967A082","0x9e56625509c2f60af937f23b7b532600390e8c8b","0xa2b31dacf30a9c50ca473337c01d8a201ae33e32"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}},"/v2/order":{"post":{"description":"Submit a signed order to the relayer.","operationId":"postOrder","parameters":[{"name":"networkId","in":"query","description":"The id of the Ethereum network","example":42,"schema":{"type":"number"}}],"requestBody":{"description":"A valid signed 0x order based on the schema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/signedOrderSchema"},"example":{"makerAddress":"0x9e56625509c2f60af937f23b7b532600390e8c8b","takerAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","feeRecipientAddress":"0xb046140686d052fff581f63f8136cce132e857da","senderAddress":"0xa2b31dacf30a9c50ca473337c01d8a201ae33e32","makerAssetAmount":"10000000000000000","takerAssetAmount":"20000000000000000","makerFee":"100000000000000","takerFee":"200000000000000","expirationTimeSeconds":"1532560590","salt":"1532559225","makerAssetData":"0xf47261b04c32345ced77393b3530b1eed0f346429d","takerAssetData":"0x0257179264389b814a946f3e92105513705ca6b990","exchangeAddress":"0x12459c951127e0c374ff9105dda097662a027093","signature":"0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33"}}}},"responses":{"200":{"headers":{"X-Rate-Limit-Limit":{"description":"The maximum number of requests you're permitted to make per hour.","schema":{"type":"integer"}},"X-Rate-Limit-Remaining":{"description":"The number of requests remaining in the current rate limit window.","schema":{"type":"integer"}},"X-Rate-Limit-Reset":{"description":"The time at which the current rate limit window resets in UTC epoch seconds.","schema":{"type":"integer"}}},"description":"OK","content":{}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/relayerApiErrorResponseSchema"},"example":{"code":100,"reason":"Validation failed","validationErrors":[{"field":"networkId","code":1006,"reason":"Network id 42 is not supported"}]}}}},"404":{"description":"Not found"},"429":{"description":"Too many requests - Rate limit exceeded"},"500":{"description":"Internal Server Error"},"501":{"description":"Not implemented."}}}}},"components":{"schemas":{"numberSchema":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"addressSchema":{"type":"string","pattern":"^0x[0-9a-f]{40}$"},"hexSchema":{"type":"string","pattern":"^0x(([0-9a-f][0-9a-f])+)?$"},"orderHashSchema":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"orderSchema":{"properties":{"makerAddress":{"$ref":"#/components/schemas/addressSchema"},"takerAddress":{"$ref":"#/components/schemas/addressSchema"},"makerFee":{"$ref":"#/components/schemas/numberSchema"},"takerFee":{"$ref":"#/components/schemas/numberSchema"},"senderAddress":{"$ref":"#/components/schemas/addressSchema"},"makerAssetAmount":{"$ref":"#/components/schemas/numberSchema"},"takerAssetAmount":{"$ref":"#/components/schemas/numberSchema"},"makerAssetData":{"$ref":"#/components/schemas/hexSchema"},"takerAssetData":{"$ref":"#/components/schemas/hexSchema"},"salt":{"$ref":"#/components/schemas/numberSchema"},"exchangeAddress":{"$ref":"#/components/schemas/addressSchema"},"feeRecipientAddress":{"$ref":"#/components/schemas/addressSchema"},"expirationTimeSeconds":{"$ref":"#/components/schemas/numberSchema"}},"required":["makerAddress","takerAddress","makerFee","takerFee","senderAddress","makerAssetAmount","takerAssetAmount","makerAssetData","takerAssetData","salt","exchangeAddress","feeRecipientAddress","expirationTimeSeconds"],"type":"object"},"signedOrderSchema":{"allOf":[{"$ref":"#/components/schemas/orderSchema"},{"properties":{"signature":{"$ref":"#/components/schemas/hexSchema"}},"required":["signature"]}]},"signedOrdersSchema":{"type":"array","items":{"$ref":"#/components/schemas/signedOrderSchema"}},"ordersSchema":{"type":"array","items":{"$ref":"#/components/schemas/orderSchema"}},"paginatedCollectionSchema":{"type":"object","properties":{"total":{"type":"number"},"perPage":{"type":"number"},"page":{"type":"number"}},"required":["total","perPage","page"]},"relayerApiErrorResponseSchema":{"type":"object","properties":{"code":{"type":"integer","minimum":100,"maximum":103},"reason":{"type":"string"},"validationErrors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"code":{"type":"integer","minimum":1000,"maximum":1006},"reason":{"type":"string"}},"required":["field","code","reason"]}}},"required":["code","reason"]},"relayerApiFeeRecipientsResponseSchema":{"type":"object","allOf":[{"$ref":"#/components/schemas/paginatedCollectionSchema"},{"properties":{"records":{"$ref":"#/components/schemas/addressSchema"}},"required":["records"]}]},"relayerApiOrderSchema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/orderSchema"},"metaData":{"type":"object"}},"required":["order","metaData"]},"relayerApiOrdersSchema":{"type":"array","items":{"$ref":"#/components/schemas/relayerApiOrderSchema"}},"relayerApiOrderConfigPayloadSchema":{"type":"object","properties":{"makerAddress":{"$ref":"#/components/schemas/addressSchema"},"takerAddress":{"$ref":"#/components/schemas/addressSchema"},"makerAssetAmount":{"$ref":"#/components/schemas/numberSchema"},"takerAssetAmount":{"$ref":"#/components/schemas/numberSchema"},"makerAssetData":{"$ref":"#/components/schemas/hexSchema"},"takerAssetData":{"$ref":"#/components/schemas/hexSchema"},"exchangeAddress":{"$ref":"#/components/schemas/addressSchema"},"expirationTimeSeconds":{"$ref":"#/components/schemas/numberSchema"}},"required":["makerAddress","takerAddress","makerAssetAmount","takerAssetAmount","makerAssetData","takerAssetData","exchangeAddress","expirationTimeSeconds"]},"relayerApiOrderConfigResponseSchema":{"type":"object","properties":{"makerFee":{"$ref":"#/components/schemas/numberSchema"},"takerFee":{"$ref":"#/components/schemas/numberSchema"},"feeRecipientAddress":{"$ref":"#/components/schemas/addressSchema"},"senderAddress":{"$ref":"#/components/schemas/addressSchema"}},"required":["makerFee","takerFee","feeRecipientAddress","senderAddress"]},"relayerApiOrderbookResponseSchema":{"type":"object","properties":{"bids":{"$ref":"#/components/schemas/relayerApiOrdersResponseSchema"},"asks":{"$ref":"#/components/schemas/relayerApiOrdersResponseSchema"}},"required":["bids","asks"]},"relayerApiAssetDataPairsResponseSchema":{"type":"object","allOf":[{"$ref":"#/components/schemas/paginatedCollectionSchema"},{"properties":{"records":{"$ref":"#/components/schemas/relayerApiAssetDataPairsSchema"}},"required":["records"]}]},"relayerApiAssetDataTradeInfoSchema":{"type":"object","properties":{"assetData":{"$ref":"#/components/schemas/hexSchema"},"minAmount":{"$ref":"#/components/schemas/numberSchema"},"maxAmount":{"$ref":"#/components/schemas/numberSchema"},"precision":{"type":"number"}},"required":["assetData"]},"relayerApiOrdersChannelSubscribeSchema":{"type":"object","properties":{"type":{"enum":["subscribe"]},"channel":{"enum":["orders"]},"requestId":{"type":"string"},"payload":{"$ref":"#/components/schemas/relayerApiOrdersChannelSubscribePayload"}},"required":["type","channel","requestId"]},"relayerApiOrdersChannelSubscribePayload":{"type":"object","properties":{"makerAssetProxyId":{"$ref":"#/components/schemas/hexSchema"},"takerAssetProxyId":{"$ref":"#/components/schemas/hexSchema"},"networkId":{"type":"number"},"makerAssetAddress":{"$ref":"#/components/schemas/addressSchema"},"takerAssetAddress":{"$ref":"#/components/schemas/addressSchema"},"makerAssetData":{"$ref":"#/components/schemas/hexSchema"},"takerAssetData":{"$ref":"#/components/schemas/hexSchema"},"traderAssetData":{"$ref":"#/components/schemas/hexSchema"}}},"relayerApiOrdersChannelUpdateSchema":{"type":"object","properties":{"type":{"enum":["update"]},"channel":{"enum":["orders"]},"requestId":{"type":"string"},"payload":{"$ref":"#/components/schemas/relayerApiOrdersSchema"}},"required":["type","channel","requestId"]},"relayerApiOrdersResponseSchema":{"type":"object","allOf":[{"$ref":"#/components/schemas/paginatedCollectionSchema"},{"properties":{"records":{"$ref":"#/components/schemas/relayerApiOrdersSchema"}},"required":["records"]}]},"relayerApiAssetDataPairsSchema":{"type":"array","items":{"properties":{"assetDataA":{"$ref":"#/components/schemas/relayerApiAssetDataTradeInfoSchema"},"assetDataB":{"$ref":"#/components/schemas/relayerApiAssetDataTradeInfoSchema"}},"required":["assetDataA","assetDataB"],"type":"object"}}}}} \ No newline at end of file
diff --git a/packages/sra-api/public/index.html b/packages/sra-api/public/index.html
new file mode 100644
index 000000000..868047d4f
--- /dev/null
+++ b/packages/sra-api/public/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>ReDoc</title>
+ <!-- needed for adaptive design -->
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
+
+ <!--
+ ReDoc doesn't change outer page styles
+ -->
+ <style>
+ body {
+ margin: 0;
+ padding: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <redoc spec-url='http://sra-api.s3-website-us-east-1.amazonaws.com/api.json'></redoc>
+ <script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"> </script>
+ </body>
+</html> \ No newline at end of file
diff --git a/packages/sra-api/src/api.ts b/packages/sra-api/src/api.ts
new file mode 100644
index 000000000..4143a663c
--- /dev/null
+++ b/packages/sra-api/src/api.ts
@@ -0,0 +1,301 @@
+import { OpenApiSpec } from '@loopback/openapi-v3-types';
+
+import { examples } from './examples';
+import { schemas } from './json-schemas';
+import { md } from './md';
+import { generateParameters } from './parameters';
+import { generateResponses } from './responses';
+
+export const api: OpenApiSpec = {
+ openapi: '3.0.0',
+ info: {
+ version: '2.0.0',
+ title: 'Standard Relayer REST API',
+ description: md.introduction,
+ license: {
+ name: 'Apache 2.0',
+ url: 'https://www.apache.org/licenses/LICENSE-2.0.html',
+ },
+ },
+ paths: {
+ '/v2/asset_pairs': {
+ get: {
+ description:
+ 'Retrieves a list of available asset pairs and the information required to trade them (in any order). Setting only `assetDataA` or `assetDataB` returns pairs filtered by that asset only.',
+ operationId: 'getAssetPairs',
+ parameters: generateParameters(
+ [
+ {
+ name: 'assetDataA',
+ in: 'query',
+ description: 'The assetData value for the first asset in the pair.',
+ example: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'assetDataB',
+ in: 'query',
+ description: 'The assetData value for the second asset in the pair.',
+ example: '0x0257179264389b814a946f3e92105513705ca6b990',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ ],
+ true,
+ ),
+ responses: generateResponses(
+ 'relayerApiAssetDataPairsResponseSchema',
+ examples.relayerApiAssetDataPairsResponse,
+ `Returns a collection of available asset pairs with some meta info`,
+ ),
+ },
+ },
+ '/v2/orders': {
+ get: {
+ description:
+ 'Retrieves a list of orders given query parameters. This endpoint should be [paginated](#section/Pagination). For querying an entire orderbook snapshot, the [orderbook endpoint](#operation/getOrderbook) is recommended. If both makerAssetData and takerAssetData are specified, returned orders will be sorted by price determined by (takerTokenAmount/makerTokenAmount) in ascending order. By default, orders returned by this endpoint are unsorted.',
+ operationId: 'getOrders',
+ parameters: generateParameters(
+ [
+ {
+ name: 'makerAssetProxyId',
+ in: 'query',
+ description: `The maker [asset proxy id](https://0xproject.com/docs/0x.js#types-AssetProxyId) (example: "0xf47261b0" for ERC20, "0x02571792" for ERC721).`,
+ example: '0xf47261b0',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'takerAssetProxyId',
+ in: 'query',
+ description: `The taker asset [asset proxy id](https://0xproject.com/docs/0x.js#types-AssetProxyId) (example: "0xf47261b0" for ERC20, "0x02571792" for ERC721).`,
+ example: '0x02571792',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'makerAssetAddress',
+ in: 'query',
+ description: `The contract address for the maker asset.`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'takerAssetAddress',
+ in: 'query',
+ description: `The contract address for the taker asset.`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'exchangeAddress',
+ in: 'query',
+ description: `Same as exchangeAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'senderAddress',
+ in: 'query',
+ description: `Same as senderAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'makerAssetData',
+ in: 'query',
+ description: `Same as makerAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'takerAssetData',
+ in: 'query',
+ description: `Same as takerAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'traderAssetData',
+ in: 'query',
+ description: `Same as traderAssetData in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'makerAddress',
+ in: 'query',
+ description: `Same as makerAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'traderAddress',
+ in: 'query',
+ description: `Same as traderAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ {
+ name: 'feeRecipientAddress',
+ in: 'query',
+ description: `Same as feeRecipientAddress in the [0x Protocol v2 Specification](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#order-message-format)`,
+ example: '0xe41d2489571d322189246dafa5ebde1f4699f498',
+ schema: {
+ $ref: '#/components/schemas/addressSchema',
+ },
+ },
+ ],
+ true,
+ ),
+ responses: generateResponses(
+ 'relayerApiOrdersResponseSchema',
+ examples.relayerApiOrdersResponse,
+ `A collection of 0x orders with meta-data as specified by query params`,
+ ),
+ },
+ },
+ '/v2/order/{orderHash}': {
+ get: {
+ description: 'Retrieves the 0x order with meta info that is associated with the hash.',
+ operationId: 'getOrder',
+ parameters: generateParameters(
+ [
+ {
+ name: 'orderHash',
+ in: 'path',
+ description: 'The hash of the desired 0x order.',
+ example: '0xd4b103c42d2512eef3fee775e097f044291615d25f5d71e0ac70dbd49d223591',
+ schema: {
+ $ref: '#/components/schemas/orderHashSchema',
+ },
+ },
+ ],
+ false,
+ ),
+ responses: generateResponses(
+ 'relayerApiOrderSchema',
+ examples.relayerApiOrder,
+ `The order and meta info associated with the orderHash`,
+ ),
+ },
+ },
+ '/v2/orderbook': {
+ get: {
+ description: `Retrieves the orderbook for a given asset pair. This endpoint should be [paginated](#section/Pagination). Bids will be sorted in descending order by price, and asks will be sorted in ascending order by price. Within the price sorted orders, the orders are further sorted by _taker fee price_ which is defined as the **takerFee** divided by **takerTokenAmount**. After _taker fee price_, orders are to be sorted by expiration in ascending order. The way pagination works for this endpoint is that the **page** and **perPage** query params apply to both \`bids\` and \`asks\` collections, and if \`page\` * \`perPage\` > \`total\` for a certain collection, the \`records\` for that collection should just be empty. `,
+ operationId: 'getOrderbook',
+ parameters: generateParameters(
+ [
+ {
+ name: 'baseAssetData',
+ in: 'query',
+ description: `assetData (makerAssetData or takerAssetData) designated as the base currency in the [currency pair calculation](https://en.wikipedia.org/wiki/Currency_pair) of price.`,
+ required: true,
+ example: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ {
+ name: 'quoteAssetData',
+ in: 'query',
+ description: `assetData (makerAssetData or takerAssetData) designated as the quote currency in the currency pair calculation of price (required).`,
+ required: true,
+ example: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ schema: {
+ $ref: '#/components/schemas/hexSchema',
+ },
+ },
+ ],
+ true,
+ ),
+ responses: generateResponses(
+ 'relayerApiOrderbookResponseSchema',
+ examples.relayerApiOrderbookResponse,
+ `The sorted order book for the specified asset pair.`,
+ ),
+ },
+ },
+ '/v2/order_config': {
+ get: {
+ description: `Relayers have full discretion over the orders that they are willing to host on their orderbooks (e.g what fees they charge, etc...). In order for traders to discover their requirements programmatically, they can send an incomplete order to this endpoint and receive the missing fields, specifc to that order. This gives relayers a large amount of flexibility to tailor fees to unique traders, trading pairs and volume amounts. Submit a partial order and receive information required to complete the order: \`senderAddress\`, \`feeRecipientAddress\`, \`makerFee\`, \`takerFee\`. `,
+ operationId: 'getOrderConfig',
+ parameters: generateParameters([], false),
+ requestBody: {
+ description:
+ 'The fields of a 0x order the relayer may want to decide what configuration to send back.',
+ content: {
+ 'application/json': {
+ schema: {
+ $ref: '#/components/schemas/relayerApiOrderConfigPayloadSchema',
+ },
+ example: examples.relayerApiOrderConfigPayload,
+ },
+ },
+ },
+ responses: generateResponses(
+ 'relayerApiOrderConfigResponseSchema',
+ examples.relayerApiOrderConfigResponse,
+ `The additional fields necessary in order to submit an order to the relayer.`,
+ ),
+ },
+ },
+ '/v2/fee_recipients': {
+ get: {
+ description: `Retrieves a collection of all fee recipient addresses for a relayer. This endpoint should be [paginated](#section/Pagination).`,
+ operationId: 'getFeeRecipients',
+ parameters: generateParameters([], true),
+ responses: generateResponses(
+ 'relayerApiFeeRecipientsResponseSchema',
+ examples.relayerApiFeeRecipientsResponse,
+ `A collection of all used fee recipient addresses.`,
+ ),
+ },
+ },
+ '/v2/order': {
+ post: {
+ description: `Submit a signed order to the relayer.`,
+ operationId: 'postOrder',
+ parameters: generateParameters([], false),
+ requestBody: {
+ description: 'A valid signed 0x order based on the schema.',
+ content: {
+ 'application/json': {
+ schema: {
+ $ref: '#/components/schemas/signedOrderSchema',
+ },
+ example: examples.signedOrder,
+ },
+ },
+ },
+ responses: generateResponses(),
+ },
+ },
+ },
+ components: {
+ schemas,
+ },
+};
diff --git a/packages/sra-api/src/errors.ts b/packages/sra-api/src/errors.ts
new file mode 100644
index 000000000..20c35514f
--- /dev/null
+++ b/packages/sra-api/src/errors.ts
@@ -0,0 +1,24 @@
+import { examples } from './examples';
+export const errorResponses = {
+ '400': {
+ description: 'Validation error',
+ content: {
+ 'application/json': {
+ schema: { $ref: '#/components/schemas/relayerApiErrorResponseSchema' },
+ example: examples.validationError,
+ },
+ },
+ },
+ '404': {
+ description: 'Not found',
+ },
+ '429': {
+ description: 'Too many requests - Rate limit exceeded',
+ },
+ '500': {
+ description: 'Internal Server Error',
+ },
+ '501': {
+ description: 'Not implemented.',
+ },
+};
diff --git a/packages/sra-api/src/examples/errors.ts b/packages/sra-api/src/examples/errors.ts
new file mode 100644
index 000000000..81f29d81c
--- /dev/null
+++ b/packages/sra-api/src/examples/errors.ts
@@ -0,0 +1,11 @@
+export const validationError = {
+ code: 100,
+ reason: 'Validation failed',
+ validationErrors: [
+ {
+ field: 'networkId',
+ code: 1006,
+ reason: 'Network id 42 is not supported',
+ },
+ ],
+};
diff --git a/packages/sra-api/src/examples/index.ts b/packages/sra-api/src/examples/index.ts
new file mode 100644
index 000000000..dcf9b13eb
--- /dev/null
+++ b/packages/sra-api/src/examples/index.ts
@@ -0,0 +1,21 @@
+import { validationError } from './errors';
+import { relayerApiAssetDataPairsResponse } from './relayerApiAssetDataPairsResponse';
+import { relayerApiFeeRecipientsResponse } from './relayerApiFeeRecipientsResponse';
+import { relayerApiOrder } from './relayerApiOrder';
+import { relayerApiOrderbookResponse } from './relayerApiOrderbookResponse';
+import { relayerApiOrderConfigPayload } from './relayerApiOrderConfigPayload';
+import { relayerApiOrderConfigResponse } from './relayerApiOrderConfigResponse';
+import { relayerApiOrdersResponse } from './relayerApiOrdersResponse';
+import { signedOrder } from './signedOrder';
+
+export const examples = {
+ validationError,
+ relayerApiAssetDataPairsResponse,
+ relayerApiFeeRecipientsResponse,
+ relayerApiOrder,
+ relayerApiOrderbookResponse,
+ relayerApiOrderConfigPayload,
+ relayerApiOrderConfigResponse,
+ relayerApiOrdersResponse,
+ signedOrder,
+};
diff --git a/packages/sra-api/src/examples/relayerApiAssetDataPairsResponse.ts b/packages/sra-api/src/examples/relayerApiAssetDataPairsResponse.ts
new file mode 100644
index 000000000..9eead5239
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiAssetDataPairsResponse.ts
@@ -0,0 +1,21 @@
+export const relayerApiAssetDataPairsResponse = {
+ total: 43,
+ page: 1,
+ perPage: 100,
+ records: [
+ {
+ assetDataA: {
+ minAmount: '0',
+ maxAmount: '10000000000000000000',
+ precision: 5,
+ assetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ },
+ assetDataB: {
+ minAmount: '0',
+ maxAmount: '50000000000000000000',
+ precision: 5,
+ assetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ },
+ },
+ ],
+};
diff --git a/packages/sra-api/src/examples/relayerApiFeeRecipientsResponse.ts b/packages/sra-api/src/examples/relayerApiFeeRecipientsResponse.ts
new file mode 100644
index 000000000..0182af629
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiFeeRecipientsResponse.ts
@@ -0,0 +1,10 @@
+export const relayerApiFeeRecipientsResponse = {
+ total: 3,
+ page: 1,
+ perPage: 10,
+ records: [
+ '0x6eC92694ea172ebC430C30fa31De87620967A082',
+ '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ ],
+};
diff --git a/packages/sra-api/src/examples/relayerApiOrder.ts b/packages/sra-api/src/examples/relayerApiOrder.ts
new file mode 100644
index 000000000..31181d677
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrder.ts
@@ -0,0 +1,19 @@
+export const relayerApiOrder = {
+ order: {
+ makerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ takerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '10000000000000000',
+ takerAssetAmount: '20000000000000000',
+ makerFee: '100000000000000',
+ takerFee: '200000000000000',
+ expirationTimeSeconds: '1532560590',
+ salt: '1532559225',
+ makerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ takerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ signature: '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
+ },
+ metaData: {},
+};
diff --git a/packages/sra-api/src/examples/relayerApiOrderConfig b/packages/sra-api/src/examples/relayerApiOrderConfig
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrderConfig
diff --git a/packages/sra-api/src/examples/relayerApiOrderConfigPayload.ts b/packages/sra-api/src/examples/relayerApiOrderConfigPayload.ts
new file mode 100644
index 000000000..5251d5b4d
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrderConfigPayload.ts
@@ -0,0 +1,10 @@
+export const relayerApiOrderConfigPayload = {
+ makerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ takerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '10000000000000000',
+ takerAssetAmount: '20000000000000000',
+ makerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ takerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ expirationTimeSeconds: '1532560590',
+};
diff --git a/packages/sra-api/src/examples/relayerApiOrderConfigResponse.ts b/packages/sra-api/src/examples/relayerApiOrderConfigResponse.ts
new file mode 100644
index 000000000..a3c531c0a
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrderConfigResponse.ts
@@ -0,0 +1,6 @@
+export const relayerApiOrderConfigResponse = {
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ makerFee: '100000000000000',
+ takerFee: '200000000000000',
+};
diff --git a/packages/sra-api/src/examples/relayerApiOrderbookResponse.ts b/packages/sra-api/src/examples/relayerApiOrderbookResponse.ts
new file mode 100644
index 000000000..40c09eff9
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrderbookResponse.ts
@@ -0,0 +1,54 @@
+export const relayerApiOrderbookResponse = {
+ bids: {
+ total: 325,
+ page: 2,
+ perPage: 100,
+ records: [
+ {
+ order: {
+ makerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ takerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '10000000000000000',
+ takerAssetAmount: '20000000000000000',
+ makerFee: '100000000000000',
+ takerFee: '200000000000000',
+ expirationTimeSeconds: '1532560590',
+ salt: '1532559225',
+ makerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ takerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ signature: '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
+ },
+ metaData: {},
+ },
+ ],
+ },
+ asks: {
+ total: 500,
+ page: 2,
+ perPage: 100,
+ records: [
+ {
+ order: {
+ makerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ takerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '20000000000000000',
+ takerAssetAmount: '10000000000000000',
+ makerFee: '200000000000000',
+ takerFee: '100000000000000',
+ expirationTimeSeconds: '1532560590',
+ salt: '1532559225',
+ makerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ takerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ signature: '0x013842a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b3518891',
+ },
+ metaData: {},
+ },
+ ],
+ },
+};
diff --git a/packages/sra-api/src/examples/relayerApiOrdersResponse.ts b/packages/sra-api/src/examples/relayerApiOrdersResponse.ts
new file mode 100644
index 000000000..ac16e7e34
--- /dev/null
+++ b/packages/sra-api/src/examples/relayerApiOrdersResponse.ts
@@ -0,0 +1,26 @@
+export const relayerApiOrdersResponse = {
+ total: 984,
+ page: 1,
+ perPage: 100,
+ records: [
+ {
+ order: {
+ makerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ takerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '10000000000000000',
+ takerAssetAmount: '20000000000000000',
+ makerFee: '100000000000000',
+ takerFee: '200000000000000',
+ expirationTimeSeconds: '1532560590',
+ salt: '1532559225',
+ makerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ takerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ signature: '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
+ },
+ metaData: {},
+ },
+ ],
+};
diff --git a/packages/sra-api/src/examples/signedOrder.ts b/packages/sra-api/src/examples/signedOrder.ts
new file mode 100644
index 000000000..440566027
--- /dev/null
+++ b/packages/sra-api/src/examples/signedOrder.ts
@@ -0,0 +1,16 @@
+export const signedOrder = {
+ makerAddress: '0x9e56625509c2f60af937f23b7b532600390e8c8b',
+ takerAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ feeRecipientAddress: '0xb046140686d052fff581f63f8136cce132e857da',
+ senderAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32',
+ makerAssetAmount: '10000000000000000',
+ takerAssetAmount: '20000000000000000',
+ makerFee: '100000000000000',
+ takerFee: '200000000000000',
+ expirationTimeSeconds: '1532560590',
+ salt: '1532559225',
+ makerAssetData: '0xf47261b04c32345ced77393b3530b1eed0f346429d',
+ takerAssetData: '0x0257179264389b814a946f3e92105513705ca6b990',
+ exchangeAddress: '0x12459c951127e0c374ff9105dda097662a027093',
+ signature: '0x012761a3ed31b43c8780e905a260a35faefcc527be7516aa11c0256729b5b351bc33',
+};
diff --git a/packages/sra-api/src/headers.ts b/packages/sra-api/src/headers.ts
new file mode 100644
index 000000000..152254c9f
--- /dev/null
+++ b/packages/sra-api/src/headers.ts
@@ -0,0 +1,20 @@
+export const headers = {
+ 'X-Rate-Limit-Limit': {
+ description: `The maximum number of requests you're permitted to make per hour.`,
+ schema: {
+ type: 'integer',
+ },
+ },
+ 'X-Rate-Limit-Remaining': {
+ description: 'The number of requests remaining in the current rate limit window.',
+ schema: {
+ type: 'integer',
+ },
+ },
+ 'X-Rate-Limit-Reset': {
+ description: 'The time at which the current rate limit window resets in UTC epoch seconds.',
+ schema: {
+ type: 'integer',
+ },
+ },
+};
diff --git a/packages/sra-api/src/index.ts b/packages/sra-api/src/index.ts
new file mode 100644
index 000000000..4d73f3cd3
--- /dev/null
+++ b/packages/sra-api/src/index.ts
@@ -0,0 +1 @@
+export { api } from './api';
diff --git a/packages/sra-api/src/json-schemas.ts b/packages/sra-api/src/json-schemas.ts
new file mode 100644
index 000000000..173a04bfb
--- /dev/null
+++ b/packages/sra-api/src/json-schemas.ts
@@ -0,0 +1,63 @@
+import { schemas as jsonSchemas } from '@0xproject/json-schemas';
+
+// Only include schemas we actually need
+const {
+ numberSchema,
+ addressSchema,
+ hexSchema,
+ orderHashSchema,
+ orderSchema,
+ signedOrderSchema,
+ signedOrdersSchema,
+ ordersSchema,
+ paginatedCollectionSchema,
+ relayerApiErrorResponseSchema,
+ relayerApiFeeRecipientsResponseSchema,
+ relayerApiOrderSchema,
+ relayerApiOrdersSchema,
+ relayerApiOrderConfigPayloadSchema,
+ relayerApiOrderConfigResponseSchema,
+ relayerApiOrderbookResponseSchema,
+ relayerApiAssetDataPairsResponseSchema,
+ relayerApiAssetDataTradeInfoSchema,
+ relayerApiOrdersChannelSubscribeSchema,
+ relayerApiOrdersChannelSubscribePayload,
+ relayerApiOrdersChannelUpdateSchema,
+ relayerApiOrdersResponseSchema,
+ relayerApiAssetDataPairsSchema,
+} = jsonSchemas;
+
+const usedSchemas = {
+ numberSchema,
+ addressSchema,
+ hexSchema,
+ orderHashSchema,
+ orderSchema,
+ signedOrderSchema,
+ signedOrdersSchema,
+ ordersSchema,
+ paginatedCollectionSchema,
+ relayerApiErrorResponseSchema,
+ relayerApiFeeRecipientsResponseSchema,
+ relayerApiOrderSchema,
+ relayerApiOrdersSchema,
+ relayerApiOrderConfigPayloadSchema,
+ relayerApiOrderConfigResponseSchema,
+ relayerApiOrderbookResponseSchema,
+ relayerApiAssetDataPairsResponseSchema,
+ relayerApiAssetDataTradeInfoSchema,
+ relayerApiOrdersChannelSubscribeSchema,
+ relayerApiOrdersChannelSubscribePayload,
+ relayerApiOrdersChannelUpdateSchema,
+ relayerApiOrdersResponseSchema,
+ relayerApiAssetDataPairsSchema,
+};
+
+// We need to replace the `$ref`s to be OpenAPI compliant.
+const openApiSchemas = JSON.parse(
+ JSON.stringify(usedSchemas).replace(/(\/\w+)/g, match => `#/components/schemas${match}`),
+);
+// The json schema used by OpenAPI does not accept ids
+Object.keys(openApiSchemas).forEach(key => delete openApiSchemas[key].id);
+
+export const schemas = openApiSchemas;
diff --git a/packages/sra-api/src/md/index.ts b/packages/sra-api/src/md/index.ts
new file mode 100644
index 000000000..076c3c45c
--- /dev/null
+++ b/packages/sra-api/src/md/index.ts
@@ -0,0 +1,5 @@
+import { readFileSync } from 'fs';
+
+export const md = {
+ introduction: readFileSync('src/md/introduction.md').toString(),
+};
diff --git a/packages/sra-api/src/md/introduction.md b/packages/sra-api/src/md/introduction.md
new file mode 100644
index 000000000..6f733c9ab
--- /dev/null
+++ b/packages/sra-api/src/md/introduction.md
@@ -0,0 +1,214 @@
+# Testing
+
+Use the [sra-report](https://github.com/0xProject/0x-monorepo/tree/development/packages/sra-report) command line tool to test your API for SRA compliance.
+
+# Schemas
+
+The [JSON schemas](http://json-schema.org/) for the API payloads and responses can be found in [@0xproject/json-schemas](https://github.com/0xProject/0x.js/tree/development/packages/json-schemas). Examples of each payload and response can be found in the library's [test suite](https://github.com/0xProject/0x.js/blob/development/packages/json-schemas/test/schema_test.ts#L1).
+
+```bash
+npm install @0xproject/json-schemas --save
+```
+
+You can easily validate your API's payloads and responses using the [@0xproject/json-schemas](https://github.com/0xProject/0x.js/tree/development/packages/json-schemas) package:
+
+```js
+import {SchemaValidator, ValidatorResult, schemas} from '@0xproject/json-schemas';
+
+const {relayerApiTokenPairsResponseSchema} = schemas;
+const validator = new SchemaValidator();
+
+const tokenPairsResponse = {
+ ...
+};
+const validatorResult: ValidatorResult = validator.validate(tokenPairsResponse, relayerApiTokenPairsResponseSchema);
+```
+
+# Pagination
+
+Requests that return potentially large collections should respond to the **?page** and **?perPage** parameters. For example:
+
+```bash
+$ curl https://api.example-relayer.com/v2/asset_pairs?page=3&perPage=20
+```
+
+Page numbering should be 1-indexed, not 0-indexed. If a query provides an unreasonable (ie. too high) `perPage` value, the response can return a validation error as specified in the [errors section](#section/Errors). If the query specifies a `page` that does not exist (ie. there are not enough `records`), the response should just return an empty `records` array.
+
+All endpoints that are paginated should return a `total`, `page`, `perPage` and a `records` value in the top level of the collection. The value of `total` should be the total number of records for a given query, whereas `records` should be an array representing the response to the query for that page. `page` and `perPage`, are the same values that were specified in the request. See the note in [miscellaneous](#section/Misc.) about formatting `snake_case` vs. `lowerCamelCase`.
+
+These requests include the [`/v2/asset_pairs`](#operation/getAssetPairs), [`/v2/orders`](#operation/getOrders), [`/v2/fee_recipients`](#operation/getFeeRecipients) and [`/v2/orderbook`](#operation/getOrderbook) endpoints.
+
+# Network Id
+
+All requests should be able to specify a **?networkId** query param for all supported networks. For example:
+
+```bash
+$ curl https://api.example-relayer.com/v2/asset_pairs?networkId=1
+```
+
+If the query param is not provided, it should default to **1** (mainnet).
+
+Networks and their Ids:
+
+| Network Id | Network Name |
+| ---------- | ------------ |
+| 1 | Mainnet |
+| 42 | Kovan |
+| 3 | Ropsten |
+| 4 | Rinkeby |
+
+If a certain network is not supported, the response should **400** as specified in the [error response](#section/Errors) section. For example:
+
+```json
+{
+ "code": 100,
+ "reason": "Validation failed",
+ "validationErrors": [
+ {
+ "field": "networkId",
+ "code": 1006,
+ "reason": "Network id 42 is not supported"
+ }
+ ]
+}
+```
+
+# Link Header
+
+A [Link Header](https://tools.ietf.org/html/rfc5988) can be included in a response to provide clients with more context about paging
+For example:
+
+```bash
+Link: <https://api.example-relayer.com/v2/asset_pairs?page=3&perPage=20>; rel="next",
+<https://api.github.com/user/repos?page=10&perPage=20>; rel="last"
+```
+
+This `Link` response header contains one or more Hypermedia link relations.
+
+The possible `rel` values are:
+
+| Name | Description |
+| ----- | ------------------------------------------------------------- |
+| next | The link relation for the immediate next page of results. |
+| last | The link relation for the last page of results. |
+| first | The link relation for the first page of results. |
+| prev | The link relation for the immediate previous page of results. |
+
+# Rate Limits
+
+Rate limit guidance for clients can be optionally returned in the response headers:
+
+| Header Name | Description |
+| --------------------- | ---------------------------------------------------------------------------- |
+| X-RateLimit-Limit | The maximum number of requests you're permitted to make per hour. |
+| X-RateLimit-Remaining | The number of requests remaining in the current rate limit window. |
+| X-RateLimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds. |
+
+For example:
+
+```bash
+$ curl -i https://api.example-relayer.com/v2/asset_pairs
+HTTP/1.1 200 OK
+Date: Mon, 20 Oct 2017 12:30:06 GMT
+Status: 200 OK
+X-RateLimit-Limit: 60
+X-RateLimit-Remaining: 56
+X-RateLimit-Reset: 1372700873
+```
+
+When a rate limit is exceeded, a status of **429 Too Many Requests** should be returned.
+
+# Errors
+
+Unless the spec defines otherwise, errors to bad requests should respond with HTTP 4xx or status codes.
+
+## Common error codes
+
+| Code | Reason |
+| ---- | --------------------------------------- |
+| 400 | Bad Request – Invalid request format |
+| 404 | Not found |
+| 429 | Too many requests - Rate limit exceeded |
+| 500 | Internal Server Error |
+| 501 | Not Implemented |
+
+## Error reporting format
+
+For all **400** responses, see the [error response schema](https://github.com/0xProject/0x-monorepo/blob/development/packages/json-schemas/schemas/relayer_api_error_response_schema.ts#L1).
+
+```json
+{
+ "code": 101,
+ "reason": "Validation failed",
+ "validationErrors": [
+ {
+ "field": "maker",
+ "code": 1002,
+ "reason": "Invalid address"
+ }
+ ]
+}
+```
+
+General error codes:
+
+```bash
+100 - Validation Failed
+101 - Malformed JSON
+102 - Order submission disabled
+103 - Throttled
+```
+
+Validation error codes:
+
+```bash
+1000 - Required field
+1001 - Incorrect format
+1002 - Invalid address
+1003 - Address not supported
+1004 - Value out of range
+1005 - Invalid signature or hash
+1006 - Unsupported option
+```
+
+# Asset Data Encoding
+
+As we now support multiple [token transfer proxies](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#assetproxy), the identifier of which proxy to use for the token transfer must be encoded, along with the token information. Each proxy in 0x v2 has a unique identifier. If you're using 0x.js there will be helper methods for this [encoding](https://0xproject.com/docs/0x.js#zeroEx-encodeERC20AssetData) and [decoding](https://0xproject.com/docs/0x.js#zeroEx-decodeAssetProxyId).
+
+The identifier for the Proxy uses a similar scheme to [ABI function selectors](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector).
+
+```js
+// ERC20 Proxy ID 0xf47261b0
+bytes4(keccak256('ERC20Token(address)'));
+// ERC721 Proxy ID 0x08e937fa
+bytes4(keccak256('ERC721Token(address,uint256)'));
+```
+
+Asset data is encoded using [ABI encoding](https://solidity.readthedocs.io/en/develop/abi-spec.html).
+
+For example, encoding the ERC20 token contract (address: 0x1dc4c1cefef38a777b15aa20260a54e584b16c48) using the ERC20 Transfer Proxy (id: 0xf47261b0) would be:
+
+```bash
+0xf47261b00000000000000000000000001dc4c1cefef38a777b15aa20260a54e584b16c48
+```
+
+Encoding the ERC721 token contract (address: `0x371b13d97f4bf77d724e78c16b7dc74099f40e84`), token id (id: `99`, which hex encoded is `0x63`) and the ERC721 Transfer Proxy (id: 0x08e937fa) would be:
+
+```bash
+0x08e937fa000000000000000000000000371b13d97f4bf77d724e78c16b7dc74099f40e840000000000000000000000000000000000000000000000000000000000000063
+```
+
+For more information see [the Asset Proxy](https://github.com/0xProject/0x-protocol-specification/blob/master/v2/v2-specification.md#erc20proxy) section of the v2 spec and the [Ethereum ABI Spec](https://solidity.readthedocs.io/en/develop/abi-spec.html).
+
+# Meta Data in Order Responses
+
+In v2 of the standard relayer API we added the `metaData` field. It is meant to provide a standard place for relayers to put optional, custom or non-standard fields that may of interest to the consumer of the API.
+
+A good example of such a field is `remainingTakerAssetAmount`, which is a convenience field that communicates how much of a 0x order is potentially left to be filled. Unlike the other fields in a 0x order, it is not guaranteed to be correct as it is derived from whatever mechanism the implementer (ie. the relayer) is using. While convenient for prototyping and low stakes situations, we recommend validating the value of the field by checking the state of the blockchain yourself, such as by using [Order Watcher](https://0xproject.com/wiki#0x-OrderWatcher).
+
+# Misc.
+
+* All requests and responses should be of **application/json** content type
+* All token amounts are sent in amounts of the smallest level of precision (base units). (e.g if a token has 18 decimal places, selling 1 token would show up as selling `'1000000000000000000'` units by this API).
+* All addresses are sent as lower-case (non-checksummed) Ethereum addresses with the `0x` prefix.
+* All parameters are to be written in `lowerCamelCase`.
diff --git a/packages/sra-api/src/parameters.ts b/packages/sra-api/src/parameters.ts
new file mode 100644
index 000000000..10382894c
--- /dev/null
+++ b/packages/sra-api/src/parameters.ts
@@ -0,0 +1,36 @@
+import { ParameterObject } from '@loopback/openapi-v3-types';
+export const paginationParameters: ParameterObject[] = [
+ {
+ name: 'page',
+ in: 'query',
+ description: 'The number of the page to request in the collection.',
+ example: 3,
+ schema: {
+ type: 'number',
+ },
+ },
+ {
+ name: 'perPage',
+ in: 'query',
+ description: 'The number of records to return per page.',
+ example: 10,
+ schema: {
+ type: 'number',
+ },
+ },
+];
+
+export const networkdIdParameter: ParameterObject = {
+ name: 'networkId',
+ in: 'query',
+ description: 'The id of the Ethereum network',
+ example: 42,
+ schema: {
+ type: 'number',
+ },
+};
+
+export const generateParameters = (parameters: ParameterObject[], isPaginated: boolean = false): ParameterObject[] => {
+ const optionalParameters = isPaginated ? paginationParameters : [];
+ return [networkdIdParameter, ...optionalParameters, ...parameters];
+};
diff --git a/packages/sra-api/src/responses.ts b/packages/sra-api/src/responses.ts
new file mode 100644
index 000000000..cd7352058
--- /dev/null
+++ b/packages/sra-api/src/responses.ts
@@ -0,0 +1,24 @@
+import { ResponsesObject } from '@loopback/openapi-v3-types';
+
+import { errorResponses } from './errors';
+import { headers } from './headers';
+
+export const generateResponses = (schemaName?: string, example?: any, description: string = 'OK'): ResponsesObject => {
+ const responses = {
+ '200': {
+ headers,
+ description,
+ content: {},
+ },
+ ...errorResponses,
+ };
+ if (schemaName) {
+ responses['200'].content = {
+ 'application/json': {
+ schema: { $ref: `#/components/schemas/${schemaName}` },
+ example,
+ },
+ };
+ }
+ return responses;
+};
diff --git a/packages/sra-api/tsconfig.json b/packages/sra-api/tsconfig.json
new file mode 100644
index 000000000..e60028885
--- /dev/null
+++ b/packages/sra-api/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig",
+ "compilerOptions": {
+ "outDir": "lib"
+ },
+ "include": ["./src/**/*", "./test/*"]
+}
diff --git a/packages/sra-api/tslint.json b/packages/sra-api/tslint.json
new file mode 100644
index 000000000..ffaefe83a
--- /dev/null
+++ b/packages/sra-api/tslint.json
@@ -0,0 +1,3 @@
+{
+ "extends": ["@0xproject/tslint-config"]
+}
diff --git a/packages/sra-report/CHANGELOG.json b/packages/sra-report/CHANGELOG.json
index c97879278..9711d3935 100644
--- a/packages/sra-report/CHANGELOG.json
+++ b/packages/sra-report/CHANGELOG.json
@@ -1,5 +1,195 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.1.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.1.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.1.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617805,
+ "version": "0.1.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527617227,
+ "version": "0.1.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527616612,
+ "version": "0.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.1.0",
+ "changes": [
+ {
+ "note": "Properly export the executable binary",
+ "pr": 588
+ }
+ ],
+ "timestamp": 1527009133
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.0.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525453812,
+ "version": "0.0.13",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.0.12",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524079658,
+ "version": "0.0.11",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524073495,
+ "version": "0.0.10",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.0.9",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.0.8",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.0.7",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.0.6",
"changes": [
{
@@ -7,8 +197,7 @@
"pr": 451
}
],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
},
{
"version": "0.0.2",
@@ -18,13 +207,11 @@
"pr": 452
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.0.1",
"changes": [],
- "timestamp": 1520434800,
- "isPublished": true
+ "timestamp": 1520434800
}
]
diff --git a/packages/sra-report/CHANGELOG.md b/packages/sra-report/CHANGELOG.md
index 8567c2f7c..410221951 100644
--- a/packages/sra-report/CHANGELOG.md
+++ b/packages/sra-report/CHANGELOG.md
@@ -1,16 +1,100 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Dependencies updated
+
+## v0.1.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.1.5 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.1.4 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.1.3 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.1.2 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.1.1 - _May 29, 2018_
+
+ * Dependencies updated
+
+## v0.1.0 - _May 22, 2018_
+
+ * Properly export the executable binary (#588)
+
+## v0.0.14 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.13 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.12 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.0.11 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.10 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.9 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.0.8 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.0.7 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.0.6 - _April 2, 2018_
* Added postman collection unit tests (#451)
-## v0.0.2 - _March 18, 2018_
+## v0.0.2 - _March 17, 2018_
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
-## v0.0.1 - _March 8, 2018_
+## v0.0.1 - _March 7, 2018_
diff --git a/packages/sra-report/README.md b/packages/sra-report/README.md
index 299d575d8..d8df36a29 100644
--- a/packages/sra-report/README.md
+++ b/packages/sra-report/README.md
@@ -87,11 +87,11 @@ In order to provide a custom environment to the tool, perform the following step
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -107,8 +107,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/sra-report yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/sra-report yarn watch
+```
+
+### Clean
+
```bash
-yarn build
+yarn clean
```
### Lint
diff --git a/packages/sra-report/bin/sra-report.js b/packages/sra-report/bin/sra-report.js
new file mode 100755
index 000000000..8d6bdccf8
--- /dev/null
+++ b/packages/sra-report/bin/sra-report.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../lib/src/index.js')
diff --git a/packages/sra-report/coverage/.gitkeep b/packages/sra-report/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/sra-report/coverage/.gitkeep
diff --git a/packages/sra-report/package.json b/packages/sra-report/package.json
index b156e6fe5..42321359c 100644
--- a/packages/sra-report/package.json
+++ b/packages/sra-report/package.json
@@ -1,22 +1,29 @@
{
"name": "@0xproject/sra-report",
- "version": "0.0.6",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Generate reports for standard relayer API compliance",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"clean": "shx rm -rf lib scripts",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "test": "run-s clean build copy_test_environments copy_test_fixtures run_mocha",
+ "lint": "tslint --project .",
+ "test:circleci": "yarn test:coverage",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "test": "run-s copy_test_environments copy_test_fixtures run_mocha",
+ "rebuild_and_test": "run-s clean build test",
"copy_test_fixtures": "copyfiles -u 2 './test/fixtures/**/*.json' ./lib/test/fixtures",
"copy_test_environments": "copyfiles -u 2 './test/environments/**/*.json' ./lib/test/environments",
- "run_mocha": "mocha lib/test/**/*_test.js",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --exit",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"bin": {
- "sra-report": "lib/index.js"
+ "sra-report": "bin/sra-report.js"
},
"repository": {
"type": "git",
@@ -28,20 +35,21 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/sra-report/README.md",
"dependencies": {
- "0x.js": "^0.34.0",
- "@0xproject/assert": "^0.2.4",
- "@0xproject/connect": "^0.6.7",
- "@0xproject/json-schemas": "^0.7.18",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/connect": "^1.0.5",
+ "@0xproject/json-schemas": "^0.8.3",
+ "@0xproject/order-utils": "^0.0.9",
+ "@0xproject/types": "^0.8.2",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
"chalk": "^2.3.0",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"newman": "^3.9.3",
"yargs": "^10.0.3"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.48",
"@types/nock": "^9.1.2",
@@ -51,12 +59,14 @@
"chai-as-promised": "^7.1.0",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"nock": "^9.2.3",
"npm-run-all": "^4.1.2",
+ "nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/sra-report/src/globals.d.ts b/packages/sra-report/src/globals.d.ts
index 817d1534b..783b92913 100644
--- a/packages/sra-report/src/globals.d.ts
+++ b/packages/sra-report/src/globals.d.ts
@@ -1,30 +1,3 @@
-declare module 'dirty-chai';
-
-declare module 'newman' {
- export interface NewmanRunSummary {
- run: NewmanRun;
- }
- export interface NewmanRun {
- executions: NewmanRunExecution[];
- }
- export interface NewmanRunExecution {
- item: NewmanRunExecutionItem;
- assertions: NewmanRunExecutionAssertion[];
- }
- export interface NewmanRunExecutionItem {
- name: string;
- }
- export interface NewmanRunExecutionAssertion {
- assertion: string;
- error: NewmanRunExecutionAssertionError;
- }
- export interface NewmanRunExecutionAssertionError {
- message: string;
- }
- // tslint:disable-next-line:completed-docs
- export function run(options: any, callback?: (err: Error | null, summary: NewmanRunSummary) => void): void;
-}
-
declare module '*.json' {
const value: any;
export default value;
diff --git a/packages/sra-report/src/index.ts b/packages/sra-report/src/index.ts
index 9a203b654..faa904441 100644
--- a/packages/sra-report/src/index.ts
+++ b/packages/sra-report/src/index.ts
@@ -1,10 +1,8 @@
#!/usr/bin/env node
import { assert } from '@0xproject/assert';
-import { Schema, schemas } from '@0xproject/json-schemas';
-import { logUtils, promisify } from '@0xproject/utils';
+import { logUtils } from '@0xproject/utils';
import chalk from 'chalk';
import * as _ from 'lodash';
-import * as newman from 'newman';
import * as yargs from 'yargs';
import * as sraReportCollectionJSON from '../../postman_collections/sra_report.postman_collection.json';
@@ -13,7 +11,18 @@ import { postmanEnvironmentFactory } from './postman_environment_factory';
import { utils } from './utils';
const DEFAULT_NETWORK_ID = 1;
-const SUPPORTED_NETWORK_IDS = [1, 3, 4, 42];
+const networkNameToId: { [networkName: string]: number } = {
+ mainnet: 1,
+ ropsten: 3,
+ rinkeby: 4,
+ kovan: 42,
+};
+const SUPPORTED_NETWORK_IDS = [
+ networkNameToId.mainnet,
+ networkNameToId.ropsten,
+ networkNameToId.rinkeby,
+ networkNameToId.kovan,
+];
// extract command line arguments
const args = yargs
diff --git a/packages/sra-report/src/postman_environment_factory.ts b/packages/sra-report/src/postman_environment_factory.ts
index 530cacb07..3dcb97829 100644
--- a/packages/sra-report/src/postman_environment_factory.ts
+++ b/packages/sra-report/src/postman_environment_factory.ts
@@ -1,6 +1,6 @@
-import { SignedOrder, ZeroEx } from '0x.js';
import { HttpClient } from '@0xproject/connect';
import { Schema, schemas as schemasByName } from '@0xproject/json-schemas';
+import { getOrderHashHex } from '@0xproject/order-utils';
import { logUtils } from '@0xproject/utils';
import chalk from 'chalk';
import * as _ from 'lodash';
@@ -11,9 +11,29 @@ import { addresses as rinkebyAddresses } from './contract_addresses/rinkeby_addr
import { addresses as ropstenAddresses } from './contract_addresses/ropsten_addresses';
const ENVIRONMENT_NAME = 'SRA Report';
+const networkNameToId: { [networkName: string]: number } = {
+ mainnet: 1,
+ ropsten: 3,
+ rinkeby: 4,
+ kovan: 42,
+};
-interface EnvironmentValue {
+export interface EnvironmentValue {
key: string;
+ value: string;
+ enabled: true;
+ type: 'text';
+}
+
+export interface Environment {
+ name: string;
+ values: EnvironmentValue[];
+}
+
+export interface Addresses {
+ WETH: string;
+ ZRX: string;
+ EXCHANGE: string;
}
export const postmanEnvironmentFactory = {
@@ -25,7 +45,7 @@ export const postmanEnvironmentFactory = {
* - Contract addresses based on the network id for making specific queries (ex. baseTokenAddress=ZRX_address)
* - Order properties for making specific queries (ex. maker=orderMaker)
*/
- async createPostmanEnvironmentAsync(url: string, networkId: number) {
+ async createPostmanEnvironmentAsync(url: string, networkId: number): Promise<Environment> {
const orderEnvironmentValues = await createOrderEnvironmentValuesAsync(url);
const allEnvironmentValues = _.concat(
createSchemaEnvironmentValues(),
@@ -40,7 +60,7 @@ export const postmanEnvironmentFactory = {
return environment;
},
};
-function createSchemaEnvironmentValues() {
+function createSchemaEnvironmentValues(): EnvironmentValue[] {
const schemas: Schema[] = _.values(schemasByName);
const schemaEnvironmentValues = _.compact(
_.map(schemas, (schema: Schema) => {
@@ -60,7 +80,7 @@ function createSchemaEnvironmentValues() {
const result = _.concat(schemaEnvironmentValues, createEnvironmentValue('schemaKeys', JSON.stringify(schemaKeys)));
return result;
}
-function createContractAddressEnvironmentValues(networkId: number) {
+function createContractAddressEnvironmentValues(networkId: number): EnvironmentValue[] {
const contractAddresses = getContractAddresses(networkId);
return [
createEnvironmentValue('tokenContractAddress1', contractAddresses.WETH),
@@ -68,7 +88,7 @@ function createContractAddressEnvironmentValues(networkId: number) {
createEnvironmentValue('exchangeContractAddress', contractAddresses.EXCHANGE),
];
}
-async function createOrderEnvironmentValuesAsync(url: string) {
+async function createOrderEnvironmentValuesAsync(url: string): Promise<EnvironmentValue[]> {
const httpClient = new HttpClient(url);
const orders = await httpClient.getOrdersAsync();
const orderIfExists = _.head(orders);
@@ -78,7 +98,7 @@ async function createOrderEnvironmentValuesAsync(url: string) {
createEnvironmentValue('orderMaker', orderIfExists.maker),
createEnvironmentValue('orderTaker', orderIfExists.taker),
createEnvironmentValue('orderFeeRecipient', orderIfExists.feeRecipient),
- createEnvironmentValue('orderHash', ZeroEx.getOrderHashHex(orderIfExists)),
+ createEnvironmentValue('orderHash', getOrderHashHex(orderIfExists)),
];
} else {
logUtils.log(`${chalk.red(`No orders from /orders found`)}`);
@@ -91,21 +111,21 @@ async function createOrderEnvironmentValuesAsync(url: string) {
];
}
}
-function getContractAddresses(networkId: number) {
+function getContractAddresses(networkId: number): Addresses {
switch (networkId) {
- case 1:
+ case networkNameToId.mainnet:
return mainnetAddresses;
- case 3:
+ case networkNameToId.ropsten:
return ropstenAddresses;
- case 4:
+ case networkNameToId.rinkeby:
return rinkebyAddresses;
- case 42:
+ case networkNameToId.kovan:
return kovanAddresses;
default:
throw new Error('Unsupported network id');
}
}
-function convertSchemaIdToKey(schemaId: string) {
+function convertSchemaIdToKey(schemaId: string): string {
let result = schemaId;
if (_.startsWith(result, '/')) {
result = result.substr(1);
@@ -113,7 +133,8 @@ function convertSchemaIdToKey(schemaId: string) {
result = `${result}Schema`;
return result;
}
-function createEnvironmentValue(key: string, value: string) {
+
+function createEnvironmentValue(key: string, value: string): EnvironmentValue {
return {
key,
value,
diff --git a/packages/sra-report/test/test_runner.ts b/packages/sra-report/test/test_runner.ts
index bf9b923e7..8094018f2 100644
--- a/packages/sra-report/test/test_runner.ts
+++ b/packages/sra-report/test/test_runner.ts
@@ -3,7 +3,12 @@ import * as chaiAsPromised from 'chai-as-promised';
import * as dirtyChai from 'dirty-chai';
import * as _ from 'lodash';
import 'mocha';
-import { NewmanRunExecution, NewmanRunExecutionAssertion, NewmanRunSummary } from 'newman';
+import {
+ NewmanRunExecution,
+ NewmanRunExecutionAssertion,
+ NewmanRunExecutionAssertionError,
+ NewmanRunSummary,
+} from 'newman';
import * as nock from 'nock';
import * as sraReportCollectionJSON from '../../postman_collections/sra_report.postman_collection.json';
@@ -18,6 +23,7 @@ const expect = chai.expect;
const CONTENT_TYPE_ASSERTION_NAME = 'Has Content-Type header with value application/json';
const SCHEMA_ASSERTION_NAME = 'Schema is valid';
+const SUCCESS_STATUS = 200;
const baseNewmanRunOptions = {
collection: sraReportCollectionJSON,
environment: postmanEnvironmentJSON,
@@ -33,14 +39,14 @@ export const testRunner = {
nockInterceptor: nock.Interceptor,
postmanCollectionFolderName: string,
postmanCollectionRequestName: string,
- ) {
+ ): void {
const newmanRunOptions = {
...baseNewmanRunOptions,
folder: postmanCollectionFolderName,
};
describe(CONTENT_TYPE_ASSERTION_NAME, () => {
it('fails when there are no headers', async () => {
- nockInterceptor.reply(200, {});
+ nockInterceptor.reply(SUCCESS_STATUS, {});
const summary = await utils.newmanRunAsync(newmanRunOptions);
const error = findAssertionErrorIfExists(
summary,
@@ -55,7 +61,7 @@ export const testRunner = {
const headers = {
'Content-Type': 'text/html',
};
- nockInterceptor.reply(200, {}, headers);
+ nockInterceptor.reply(SUCCESS_STATUS, {}, headers);
const summary = await utils.newmanRunAsync(newmanRunOptions);
const error = findAssertionErrorIfExists(
summary,
@@ -70,7 +76,7 @@ export const testRunner = {
const headers = {
'Content-Type': 'charset=utf-8; application/json',
};
- nockInterceptor.reply(200, {}, headers);
+ nockInterceptor.reply(SUCCESS_STATUS, {}, headers);
const summary = await utils.newmanRunAsync(newmanRunOptions);
const error = findAssertionErrorIfExists(
summary,
@@ -87,14 +93,14 @@ export const testRunner = {
postmanCollectionRequestName: string,
malformedJson: object,
correctJson: object,
- ) {
+ ): void {
const newmanRunOptions = {
...baseNewmanRunOptions,
folder: postmanCollectionFolderName,
};
describe(SCHEMA_ASSERTION_NAME, () => {
it('fails when schema is invalid', async () => {
- nockInterceptor.reply(200, malformedJson);
+ nockInterceptor.reply(SUCCESS_STATUS, malformedJson);
const summary = await utils.newmanRunAsync(newmanRunOptions);
const error = findAssertionErrorIfExists(summary, postmanCollectionRequestName, SCHEMA_ASSERTION_NAME);
const errorMessage = _.get(error, 'message');
@@ -102,10 +108,9 @@ export const testRunner = {
expect(errorMessage).to.equal('expected false to be true');
});
it('passes when schema is valid', async () => {
- nockInterceptor.reply(200, correctJson);
+ nockInterceptor.reply(SUCCESS_STATUS, correctJson);
const summary = await utils.newmanRunAsync(newmanRunOptions);
const error = findAssertionErrorIfExists(summary, postmanCollectionRequestName, SCHEMA_ASSERTION_NAME);
- const errorMessage = _.get(error, 'message');
expect(error).to.be.undefined();
});
});
@@ -116,7 +121,7 @@ function findAssertionErrorIfExists(
summary: NewmanRunSummary,
postmanCollectionRequestName: string,
postmanCollectionAssertionName: string,
-) {
+): NewmanRunExecutionAssertionError | undefined {
const matchingExecutionIfExists = _.find(summary.run.executions, (execution: NewmanRunExecution) => {
return execution.item.name === postmanCollectionRequestName;
});
diff --git a/packages/subproviders/CHANGELOG.json b/packages/subproviders/CHANGELOG.json
index 464e4699d..93939066a 100644
--- a/packages/subproviders/CHANGELOG.json
+++ b/packages/subproviders/CHANGELOG.json
@@ -1,5 +1,165 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Add `RpcSubprovider` with timeout",
+ "pr": 874
+ },
+ {
+ "note": "Add `EthLightwalletSubprovider`",
+ "pr": 775
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.10.6",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.10.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.10.3",
+ "changes": [
+ {
+ "note": "Define engine type as Provider in setEngine",
+ "pr": 675
+ }
+ ]
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.10.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.10.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.10.0",
+ "changes": [
+ {
+ "note": "Upgrade web3-provider-engine to 14.0.4",
+ "pr": 555
+ },
+ {
+ "note": "Relax `to` validation in base wallet subprovider for transactions that deploy contracts",
+ "pr": 555
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.9.0",
+ "changes": [
+ {
+ "note":
+ "Refactor RedundantRPCSubprovider into RedundantSubprovider where it now accepts an array of subproviders rather then an array of RPC endpoints",
+ "pr": 500
+ },
+ {
+ "note": "Add PrivateKeySubprovider and refactor shared functionality into a base wallet subprovider",
+ "pr": 506
+ },
+ {
+ "note": "Add MnemonicWalletsubprovider, deprecating our truffle-hdwallet-provider fork",
+ "pr": 507
+ },
+ {
+ "note": "Support multiple addresses in ledger and mnemonic wallets",
+ "pr": 507
+ },
+ {
+ "note":
+ "Refactors LedgerSubprovider such that explicitly setting the `pathIndex` is no longer required. Simply set the request `from` address as desired",
+ "pr": 507
+ },
+ {
+ "note": "Renamed derivationPath to baseDerivationPath.",
+ "pr": 507
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.8.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.8.3",
"changes": [
{
@@ -11,8 +171,7 @@
"pr": 465
}
],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
},
{
"version": "0.8.0",
@@ -33,8 +192,7 @@
"note": "Ignore `ganache-core` dependency when using package in a browser environment."
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.7.0",
@@ -45,8 +203,7 @@
"pr": 437
}
],
- "timestamp": 1520434800,
- "isPublished": true
+ "timestamp": 1520434800
},
{
"version": "0.6.0",
@@ -60,8 +217,7 @@
"pr": 432
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.5.0",
@@ -71,8 +227,7 @@
"pr": 392
}
],
- "timestamp": 1518706800,
- "isPublished": true
+ "timestamp": 1518706800
},
{
"version": "0.4.1",
@@ -82,8 +237,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.4.0",
@@ -98,8 +252,7 @@
"pr": 363
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
},
{
"version": "0.3.6",
@@ -109,8 +262,7 @@
"pr": 303
}
],
- "timestamp": 1517065200,
- "isPublished": true
+ "timestamp": 1517065200
},
{
"version": "0.3.0",
@@ -119,8 +271,7 @@
"note": "Allow LedgerSubprovider to handle `eth_sign` in addition to `personal_sign` RPC requests"
}
],
- "timestamp": 1514386800,
- "isPublished": true
+ "timestamp": 1514386800
},
{
"version": "0.2.0",
@@ -130,7 +281,6 @@
"pr": 271
}
],
- "timestamp": 1513695600,
- "isPublished": true
+ "timestamp": 1513695600
}
]
diff --git a/packages/subproviders/CHANGELOG.md b/packages/subproviders/CHANGELOG.md
index 72db4aa0f..152c0027e 100644
--- a/packages/subproviders/CHANGELOG.md
+++ b/packages/subproviders/CHANGELOG.md
@@ -1,52 +1,115 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Add `RpcSubprovider` with timeout (#874)
+ * Add `EthLightwalletSubprovider` (#775)
+
+## v0.10.6 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.10.4 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.10.3 - _May 22, 2018_
+
+ * Define engine type as Provider in setEngine (#675)
+
+## v0.10.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.10.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.10.0 - _May 4, 2018_
+
+ * Upgrade web3-provider-engine to 14.0.4 (#555)
+ * Relax `to` validation in base wallet subprovider for transactions that deploy contracts (#555)
+
+## v0.9.0 - _April 11, 2018_
+
+ * Refactor RedundantRPCSubprovider into RedundantSubprovider where it now accepts an array of subproviders rather then an array of RPC endpoints (#500)
+ * Add PrivateKeySubprovider and refactor shared functionality into a base wallet subprovider (#506)
+ * Add MnemonicWalletsubprovider, deprecating our truffle-hdwallet-provider fork (#507)
+ * Support multiple addresses in ledger and mnemonic wallets (#507)
+ * Refactors LedgerSubprovider such that explicitly setting the `pathIndex` is no longer required. Simply set the request `from` address as desired (#507)
+ * Renamed derivationPath to baseDerivationPath. (#507)
+
+## v0.8.4 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.8.3 - _April 2, 2018_
* Introduce `JSONRPCRequestPayloadWithMethod` type (#465)
* Export `ErrorCallback` type. (#465)
-## v0.8.0 - _March 18, 2018_
+## v0.8.0 - _March 17, 2018_
* Export `GanacheSubprovider` and `Subprovider` (#426)
* Make all subproviders to derive from `Subprovider` (#426)
* Add types for `NextCallback`, `OnNextCompleted` (#426)
* Ignore `ganache-core` dependency when using package in a browser environment.
-## v0.7.0 - _March 8, 2018_
+## v0.7.0 - _March 7, 2018_
* Updated legerco packages. Removed node-hid package as a dependency and make it an optional dependency. It is still used in integration tests but is causing problems for users on Linux distros. (#437)
-## v0.6.0 - _March 4, 2018_
+## v0.6.0 - _March 3, 2018_
* Move web3 types from being a devDep to a dep since one cannot use this package without it (#429)
* Add `numberOfAccounts` param to `LedgerSubprovider` method `getAccountsAsync` (#432)
-## v0.5.0 - _February 16, 2018_
+## v0.5.0 - _February 15, 2018_
* Add EmptyWalletSubprovider and FakeGasEstimateSubprovider (#392)
-## v0.4.1 - _February 9, 2018_
+## v0.4.1 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.4.0 - _February 7, 2018_
+## v0.4.0 - _February 6, 2018_
* Added NonceTrackerSubprovider (#355)
* InjectedWeb3Subprovider accepts a Provider in the constructor, previously it was a Web3 object (#363)
-## v0.3.6 - _January 28, 2018_
+## v0.3.6 - _January 27, 2018_
* Return a transaction hash from `_sendTransactionAsync` (#303)
-## v0.3.0 - _December 28, 2017_
+## v0.3.0 - _December 27, 2017_
* Allow LedgerSubprovider to handle `eth_sign` in addition to `personal_sign` RPC requests
-## v0.2.0 - _December 20, 2017_
+## v0.2.0 - _December 19, 2017_
* Improve the performance of address fetching (#271)
diff --git a/packages/subproviders/README.md b/packages/subproviders/README.md
index ac92b89d2..90c9b7bbe 100644
--- a/packages/subproviders/README.md
+++ b/packages/subproviders/README.md
@@ -4,7 +4,7 @@ A few useful web3 subproviders including a LedgerSubprovider useful for adding L
We have written up a [Wiki](https://0xproject.com/wiki#Web3-Provider-Examples) article detailing some use cases of this subprovider package.
-### Read the [Documentation](0xproject.com/docs/subproviders).
+### Read the [Documentation](https://0xproject.com/docs/subproviders).
## Installation
@@ -22,11 +22,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -34,20 +34,24 @@ If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
yarn config set workspaces-experimental true
```
+Then install dependencies
+
```bash
yarn install
```
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
```bash
-yarn build
+PKG=@0xproject/subproviders yarn build
```
-or
+Or continuously rebuild on change:
```bash
-yarn build:watch
+PKG=@0xproject/subproviders yarn watch
```
### Clean
diff --git a/packages/subproviders/package.json b/packages/subproviders/package.json
index ad7746f5d..405b89db3 100644
--- a/packages/subproviders/package.json
+++ b/packages/subproviders/package.json
@@ -1,16 +1,19 @@
{
"name": "@0xproject/subproviders",
- "version": "0.8.3",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"main": "lib/src/index.js",
"types": "lib/src/index.d.ts",
"license": "Apache-2.0",
"scripts": {
- "build:watch": "tsc -w",
- "clean": "shx rm -rf lib scripts",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
- "lint": "tslint --project . 'src/**/*.ts' 'test/**/*.ts'",
- "run_mocha_unit": "mocha lib/test/unit/**/*_test.js --timeout 10000 --bail --exit",
- "run_mocha_integration": "mocha lib/test/integration/**/*_test.js --timeout 10000 --bail --exit",
+ "clean": "shx rm -rf lib scripts",
+ "lint": "tslint --project .",
+ "run_mocha_unit": "mocha --require source-map-support/register --require make-promises-safe lib/test/unit/**/*_test.js --timeout 10000 --bail --exit",
+ "run_mocha_integration": "mocha --require source-map-support/register --require make-promises-safe lib/test/integration/**/*_test.js --timeout 10000 --bail --exit",
"test": "npm run test:unit",
"test:unit:coverage": "nyc npm run test:unit --all && yarn coverage:report:lcov",
"coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
@@ -19,7 +22,7 @@
"test:unit": "run-s clean build run_mocha_unit",
"test:integration": "run-s clean build run_mocha_integration",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
@@ -28,7 +31,8 @@
"assets": [],
"docPublishConfigs": {
"extraFileIncludes": [
- "../types/src/index.ts"
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
],
"s3BucketPath": "s3://doc-jsons/subproviders/",
"s3StagingBucketPath": "s3://staging-doc-jsons/subproviders/"
@@ -36,43 +40,51 @@
}
},
"dependencies": {
- "@0xproject/assert": "^0.2.4",
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
"@ledgerhq/hw-app-eth": "^4.3.0",
"@ledgerhq/hw-transport-u2f": "^4.3.0",
+ "@types/hdkey": "^0.7.0",
+ "bip39": "^2.5.0",
"bn.js": "^4.11.8",
- "es6-promisify": "^5.0.0",
- "ethereumjs-tx": "^1.3.3",
+ "eth-lightwallet": "^3.0.1",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-tx": "^1.3.5",
"ethereumjs-util": "^5.1.1",
- "ganache-core": "0xProject/ganache-core",
+ "ganache-core": "0xProject/ganache-core#monorepo-dep",
"hdkey": "^0.7.1",
- "lodash": "^4.17.4",
+ "json-rpc-error": "2.0.0",
+ "lodash": "^4.17.5",
"semaphore-async-await": "^1.5.1",
- "web3": "^0.20.0",
- "web3-provider-engine": "^13.0.1"
+ "web3-provider-engine": "14.0.6"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@0xproject/utils": "^0.4.4",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
+ "@types/bip39": "^2.4.0",
+ "@types/bn.js": "^4.11.0",
+ "@types/ethereumjs-tx": "^1.0.0",
+ "@types/hdkey": "^0.7.0",
"@types/lodash": "4.14.104",
"@types/mocha": "^2.2.42",
"@types/node": "^8.0.53",
+ "@types/sinon": "^2.2.2",
"chai": "^4.0.1",
"chai-as-promised": "^7.1.0",
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
- "mocha": "^4.0.1",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "sinon": "^4.0.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "types-bn": "^0.0.1",
- "types-ethereumjs-util": "0xProject/types-ethereumjs-util",
- "typescript": "2.7.1",
+ "typescript": "2.9.2",
"webpack": "^3.1.0"
},
"optionalDependencies": {
diff --git a/packages/subproviders/src/globals.d.ts b/packages/subproviders/src/globals.d.ts
index ebc4efe86..94e63a32d 100644
--- a/packages/subproviders/src/globals.d.ts
+++ b/packages/subproviders/src/globals.d.ts
@@ -1,149 +1,6 @@
-declare module 'dirty-chai';
-declare module 'es6-promisify';
-
-// tslint:disable:max-classes-per-file
-// tslint:disable:class-name
-// tslint:disable:async-suffix
-// tslint:disable:completed-docs
-
-// Ethereumjs-tx declarations
-declare module 'ethereumjs-tx' {
- class EthereumTx {
- public raw: Buffer[];
- public r: Buffer;
- public s: Buffer;
- public v: Buffer;
- public nonce: Buffer;
- public serialize(): Buffer;
- public getSenderAddress(): Buffer;
- constructor(txParams: any);
- }
- export = EthereumTx;
-}
-
-// Ledgerco declarations
-interface ECSignatureString {
- v: string;
- r: string;
- s: string;
-}
-interface ECSignature {
- v: number;
- r: string;
- s: string;
-}
-
-interface LedgerTransport {
- close(): Promise<void>;
-}
-
-declare module '@ledgerhq/hw-app-eth' {
- class Eth {
- public transport: LedgerTransport;
- constructor(transport: LedgerTransport);
- public getAddress(
- path: string,
- boolDisplay?: boolean,
- boolChaincode?: boolean,
- ): Promise<{ publicKey: string; address: string; chainCode: string }>;
- public signTransaction(path: string, rawTxHex: string): Promise<ECSignatureString>;
- public getAppConfiguration(): Promise<{ arbitraryDataEnabled: number; version: string }>;
- public signPersonalMessage(path: string, messageHex: string): Promise<ECSignature>;
- }
- export default Eth;
-}
-
-declare module '@ledgerhq/hw-transport-u2f' {
- export default class TransportU2F implements LedgerTransport {
- public static create(): Promise<LedgerTransport>;
- public close(): Promise<void>;
- }
-}
-
-declare module '@ledgerhq/hw-transport-node-hid' {
- export default class TransportNodeHid implements LedgerTransport {
- public static create(): Promise<LedgerTransport>;
- public close(): Promise<void>;
- }
-}
-
-// web3-provider-engine declarations
-declare module 'web3-provider-engine/subproviders/subprovider' {
- class Subprovider {}
- export = Subprovider;
-}
-declare module 'web3-provider-engine/subproviders/rpc' {
- import { JSONRPCRequestPayload } from '@0xproject/types';
- class RpcSubprovider {
- constructor(options: { rpcUrl: string });
- public handleRequest(
- payload: JSONRPCRequestPayload,
- next: () => void,
- end: (err: Error | null, data?: any) => void,
- ): void;
- }
- export = RpcSubprovider;
-}
-declare module 'web3-provider-engine' {
- class Web3ProviderEngine {
- public on(event: string, handler: () => void): void;
- public send(payload: any): void;
- public sendAsync(payload: any, callback: (error: any, response: any) => void): void;
- public addProvider(provider: any): void;
- public start(): void;
- public stop(): void;
- }
- export = Web3ProviderEngine;
-}
-declare module 'web3-provider-engine/util/rpc-cache-utils' {
- class ProviderEngineRpcUtils {
- public static blockTagForPayload(payload: any): string | null;
- }
- export = ProviderEngineRpcUtils;
-}
-declare module 'web3-provider-engine/subproviders/fixture' {
- import { JSONRPCRequestPayload } from '@0xproject/types';
- class FixtureSubprovider {
- constructor(staticResponses: any);
- public handleRequest(
- payload: JSONRPCRequestPayload,
- next: () => void,
- end: (err: Error | null, data?: any) => void,
- ): void;
- }
- export = FixtureSubprovider;
-}
-
-// hdkey declarations
-declare module 'hdkey' {
- class HDNode {
- public publicKey: Buffer;
- public chainCode: Buffer;
- public constructor();
- public derive(path: string): HDNode;
- }
- export = HDNode;
-}
-
declare module '*.json' {
const json: any;
/* tslint:disable */
export default json;
/* tslint:enable */
}
-
-// ganache-core declarations
-declare module 'ganache-core' {
- import * as Web3 from 'web3';
- export interface GanacheOpts {
- verbose: boolean;
- logger: {
- log(msg: string): void;
- };
- port: number;
- networkId: number;
- mnemonic: string;
- }
- // tslint:disable-next-line:completed-docs
- export function provider(opts: GanacheOpts): Web3.Provider;
-}
diff --git a/packages/subproviders/src/index.ts b/packages/subproviders/src/index.ts
index 9786347e6..9d4480e59 100644
--- a/packages/subproviders/src/index.ts
+++ b/packages/subproviders/src/index.ts
@@ -1,23 +1,29 @@
import Eth from '@ledgerhq/hw-app-eth';
import TransportU2F from '@ledgerhq/hw-transport-u2f';
+export import Web3ProviderEngine = require('web3-provider-engine');
export { ECSignature } from '@0xproject/types';
import { LedgerEthereumClient } from './types';
+export { prependSubprovider } from './utils/subprovider_utils';
export { EmptyWalletSubprovider } from './subproviders/empty_wallet_subprovider';
export { FakeGasEstimateSubprovider } from './subproviders/fake_gas_estimate_subprovider';
-export { InjectedWeb3Subprovider } from './subproviders/injected_web3';
-export { RedundantRPCSubprovider } from './subproviders/redundant_rpc';
+export { SignerSubprovider } from './subproviders/signer';
+export { RedundantSubprovider } from './subproviders/redundant_subprovider';
export { LedgerSubprovider } from './subproviders/ledger';
+export { RPCSubprovider } from './subproviders/rpc_subprovider';
export { GanacheSubprovider } from './subproviders/ganache';
export { Subprovider } from './subproviders/subprovider';
export { NonceTrackerSubprovider } from './subproviders/nonce_tracker';
+export { PrivateKeyWalletSubprovider } from './subproviders/private_key_wallet';
+export { MnemonicWalletSubprovider } from './subproviders/mnemonic_wallet';
+export { EthLightwalletSubprovider } from './subproviders/eth_lightwallet_subprovider';
export {
Callback,
ErrorCallback,
NextCallback,
- LedgerWalletSubprovider,
LedgerCommunicationClient,
+ LedgerEthereumClient,
NonceSubproviderErrors,
LedgerSubproviderConfigs,
} from './types';
diff --git a/packages/subproviders/src/subproviders/base_wallet_subprovider.ts b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts
new file mode 100644
index 000000000..4342e47e9
--- /dev/null
+++ b/packages/subproviders/src/subproviders/base_wallet_subprovider.ts
@@ -0,0 +1,139 @@
+import { assert } from '@0xproject/assert';
+import { addressUtils } from '@0xproject/utils';
+import { JSONRPCRequestPayload, JSONRPCResponsePayload } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { Callback, ErrorCallback, PartialTxParams, WalletSubproviderErrors } from '../types';
+
+import { Subprovider } from './subprovider';
+
+export abstract class BaseWalletSubprovider extends Subprovider {
+ protected static _validateTxParams(txParams: PartialTxParams): void {
+ if (!_.isUndefined(txParams.to)) {
+ assert.isETHAddressHex('to', txParams.to);
+ }
+ assert.isHexString('nonce', txParams.nonce);
+ }
+ private static _validateSender(sender: string): void {
+ if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) {
+ throw new Error(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
+ }
+ }
+
+ public abstract async getAccountsAsync(): Promise<string[]>;
+ public abstract async signTransactionAsync(txParams: PartialTxParams): Promise<string>;
+ public abstract async signPersonalMessageAsync(data: string, address: string): Promise<string>;
+
+ /**
+ * This method conforms to the web3-provider-engine interface.
+ * It is called internally by the ProviderEngine when it is this subproviders
+ * turn to handle a JSON RPC request.
+ * @param payload JSON RPC payload
+ * @param next Callback to call if this subprovider decides not to handle the request
+ * @param end Callback to call if subprovider handled the request and wants to pass back the request.
+ */
+ // tslint:disable-next-line:async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback): Promise<void> {
+ let accounts;
+ let txParams;
+ switch (payload.method) {
+ case 'eth_coinbase':
+ try {
+ accounts = await this.getAccountsAsync();
+ end(null, accounts[0]);
+ } catch (err) {
+ end(err);
+ }
+ return;
+
+ case 'eth_accounts':
+ try {
+ accounts = await this.getAccountsAsync();
+ end(null, accounts);
+ } catch (err) {
+ end(err);
+ }
+ return;
+
+ case 'eth_sendTransaction':
+ txParams = payload.params[0];
+ try {
+ BaseWalletSubprovider._validateSender(txParams.from);
+ const filledParams = await this._populateMissingTxParamsAsync(txParams);
+ const signedTx = await this.signTransactionAsync(filledParams);
+ const response = await this._emitSendTransactionAsync(signedTx);
+ end(null, response.result);
+ } catch (err) {
+ end(err);
+ }
+ return;
+
+ case 'eth_signTransaction':
+ txParams = payload.params[0];
+ try {
+ const filledParams = await this._populateMissingTxParamsAsync(txParams);
+ const signedTx = await this.signTransactionAsync(filledParams);
+ const result = {
+ raw: signedTx,
+ tx: txParams,
+ };
+ end(null, result);
+ } catch (err) {
+ end(err);
+ }
+ return;
+
+ case 'eth_sign':
+ case 'personal_sign':
+ const data = payload.method === 'eth_sign' ? payload.params[1] : payload.params[0];
+ const address = payload.method === 'eth_sign' ? payload.params[0] : payload.params[1];
+ try {
+ const ecSignatureHex = await this.signPersonalMessageAsync(data, address);
+ end(null, ecSignatureHex);
+ } catch (err) {
+ end(err);
+ }
+ return;
+
+ default:
+ next();
+ return;
+ }
+ }
+ private async _emitSendTransactionAsync(signedTx: string): Promise<JSONRPCResponsePayload> {
+ const payload = {
+ method: 'eth_sendRawTransaction',
+ params: [signedTx],
+ };
+ const result = await this.emitPayloadAsync(payload);
+ return result;
+ }
+ private async _populateMissingTxParamsAsync(partialTxParams: PartialTxParams): Promise<PartialTxParams> {
+ let txParams = partialTxParams;
+ if (_.isUndefined(partialTxParams.gasPrice)) {
+ const gasPriceResult = await this.emitPayloadAsync({
+ method: 'eth_gasPrice',
+ params: [],
+ });
+ const gasPrice = gasPriceResult.result.toString();
+ txParams = { ...txParams, gasPrice };
+ }
+ if (_.isUndefined(partialTxParams.nonce)) {
+ const nonceResult = await this.emitPayloadAsync({
+ method: 'eth_getTransactionCount',
+ params: [partialTxParams.from, 'pending'],
+ });
+ const nonce = nonceResult.result;
+ txParams = { ...txParams, nonce };
+ }
+ if (_.isUndefined(partialTxParams.gas)) {
+ const gasResult = await this.emitPayloadAsync({
+ method: 'eth_estimateGas',
+ params: [partialTxParams],
+ });
+ const gas = gasResult.result.toString();
+ txParams = { ...txParams, gas };
+ }
+ return txParams;
+ }
+}
diff --git a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts
index 595ec654d..4268c67bd 100644
--- a/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts
+++ b/packages/subproviders/src/subproviders/empty_wallet_subprovider.ts
@@ -1,4 +1,4 @@
-import { JSONRPCRequestPayload } from '@0xproject/types';
+import { JSONRPCRequestPayload } from 'ethereum-types';
import { Callback, ErrorCallback } from '../types';
@@ -17,8 +17,8 @@ export class EmptyWalletSubprovider extends Subprovider {
* @param next Callback to call if this subprovider decides not to handle the request
* @param end Callback to call if subprovider handled the request and wants to pass back the request.
*/
- // tslint:disable-next-line:prefer-function-over-method
- public handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback) {
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback): Promise<void> {
switch (payload.method) {
case 'eth_accounts':
end(null, []);
diff --git a/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
new file mode 100644
index 000000000..454dae58e
--- /dev/null
+++ b/packages/subproviders/src/subproviders/eth_lightwallet_subprovider.ts
@@ -0,0 +1,68 @@
+import * as lightwallet from 'eth-lightwallet';
+
+import { PartialTxParams } from '../types';
+
+import { BaseWalletSubprovider } from './base_wallet_subprovider';
+import { PrivateKeyWalletSubprovider } from './private_key_wallet';
+
+/*
+ * This class implements the web3-provider-engine subprovider interface and forwards
+ * requests involving user accounts and signing operations to eth-lightwallet
+ *
+ * Source: https://github.com/MetaMask/provider-engine/blob/master/subproviders/subprovider.js
+ */
+export class EthLightwalletSubprovider extends BaseWalletSubprovider {
+ private readonly _keystore: lightwallet.keystore;
+ private readonly _pwDerivedKey: Uint8Array;
+ constructor(keystore: lightwallet.keystore, pwDerivedKey: Uint8Array) {
+ super();
+ this._keystore = keystore;
+ this._pwDerivedKey = pwDerivedKey;
+ }
+ /**
+ * Retrieve the accounts associated with the eth-lightwallet instance.
+ * This method is implicitly called when issuing a `eth_accounts` JSON RPC request
+ * via your providerEngine instance.
+ *
+ * @return An array of accounts
+ */
+ public async getAccountsAsync(): Promise<string[]> {
+ const accounts = this._keystore.getAddresses();
+ return accounts;
+ }
+ /**
+ * Signs a transaction with the account specificed by the `from` field in txParams.
+ * If you've added this Subprovider to your app's provider, you can simply send
+ * an `eth_sendTransaction` JSON RPC request, and this method will be called auto-magically.
+ * If you are not using this via a ProviderEngine instance, you can call it directly.
+ * @param txParams Parameters of the transaction to sign
+ * @return Signed transaction hex string
+ */
+ public async signTransactionAsync(txParams: PartialTxParams): Promise<string> {
+ // Lightwallet loses the chain id information when hex encoding the transaction
+ // this results in a different signature on certain networks. PrivateKeyWallet
+ // respects this as it uses the parameters passed in
+ let privKey = this._keystore.exportPrivateKey(txParams.from, this._pwDerivedKey);
+ const privKeyWallet = new PrivateKeyWalletSubprovider(privKey);
+ privKey = '';
+ const privKeySignature = await privKeyWallet.signTransactionAsync(txParams);
+ return privKeySignature;
+ }
+ /**
+ * Sign a personal Ethereum signed message. The signing account will be the account
+ * associated with the provided address.
+ * If you've added the MnemonicWalletSubprovider to your app's provider, you can simply send an `eth_sign`
+ * or `personal_sign` JSON RPC request, and this method will be called auto-magically.
+ * If you are not using this via a ProviderEngine instance, you can call it directly.
+ * @param data Hex string message to sign
+ * @param address Address of the account to sign with
+ * @return Signature hex string (order: rsv)
+ */
+ public async signPersonalMessageAsync(data: string, address: string): Promise<string> {
+ let privKey = this._keystore.exportPrivateKey(address, this._pwDerivedKey);
+ const privKeyWallet = new PrivateKeyWalletSubprovider(privKey);
+ privKey = '';
+ const result = privKeyWallet.signPersonalMessageAsync(data, address);
+ return result;
+ }
+}
diff --git a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
index 966c37d8a..bc1b34aba 100644
--- a/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
+++ b/packages/subproviders/src/subproviders/fake_gas_estimate_subprovider.ts
@@ -1,4 +1,4 @@
-import { JSONRPCRequestPayload } from '@0xproject/types';
+import { JSONRPCRequestPayload } from 'ethereum-types';
import { Callback, ErrorCallback } from '../types';
@@ -14,7 +14,7 @@ import { Subprovider } from './subprovider';
* It intercepts the `eth_estimateGas` JSON RPC call and always returns a constant gas amount when queried.
*/
export class FakeGasEstimateSubprovider extends Subprovider {
- private _constantGasAmount: number;
+ private readonly _constantGasAmount: number;
/**
* Instantiates an instance of the FakeGasEstimateSubprovider
* @param constantGasAmount The constant gas amount you want returned
@@ -31,8 +31,8 @@ export class FakeGasEstimateSubprovider extends Subprovider {
* @param next Callback to call if this subprovider decides not to handle the request
* @param end Callback to call if subprovider handled the request and wants to pass back the request.
*/
- // tslint:disable-next-line:prefer-function-over-method
- public handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback) {
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback): Promise<void> {
switch (payload.method) {
case 'eth_estimateGas':
end(null, this._constantGasAmount);
diff --git a/packages/subproviders/src/subproviders/ganache.ts b/packages/subproviders/src/subproviders/ganache.ts
index 785de792d..986094dba 100644
--- a/packages/subproviders/src/subproviders/ganache.ts
+++ b/packages/subproviders/src/subproviders/ganache.ts
@@ -1,6 +1,5 @@
-import { JSONRPCRequestPayload } from '@0xproject/types';
+import { JSONRPCRequestPayload, Provider } from 'ethereum-types';
import * as Ganache from 'ganache-core';
-import * as Web3 from 'web3';
import { Callback, ErrorCallback } from '../types';
@@ -11,12 +10,12 @@ import { Subprovider } from './subprovider';
* It intercepts all JSON RPC requests and relays them to an in-process ganache instance.
*/
export class GanacheSubprovider extends Subprovider {
- private _ganacheProvider: Web3.Provider;
+ private readonly _ganacheProvider: Provider;
/**
* Instantiates a GanacheSubprovider
* @param opts The desired opts with which to instantiate the Ganache provider
*/
- constructor(opts: any) {
+ constructor(opts: Ganache.GanacheOpts) {
super();
this._ganacheProvider = Ganache.provider(opts);
}
@@ -28,8 +27,8 @@ export class GanacheSubprovider extends Subprovider {
* @param next Callback to call if this subprovider decides not to handle the request
* @param end Callback to call if subprovider handled the request and wants to pass back the request.
*/
- // tslint:disable-next-line:prefer-function-over-method
- public handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback) {
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, _next: Callback, end: ErrorCallback): Promise<void> {
this._ganacheProvider.sendAsync(payload, (err: Error | null, result: any) => {
end(err, result && result.result);
});
diff --git a/packages/subproviders/src/subproviders/injected_web3.ts b/packages/subproviders/src/subproviders/injected_web3.ts
deleted file mode 100644
index edecd8bf6..000000000
--- a/packages/subproviders/src/subproviders/injected_web3.ts
+++ /dev/null
@@ -1,58 +0,0 @@
-import { JSONRPCRequestPayload } from '@0xproject/types';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-import { Callback, ErrorCallback } from '../types';
-
-import { Subprovider } from './subprovider';
-
-/**
- * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine)
- * subprovider interface. It forwards JSON RPC requests involving user accounts (getAccounts,
- * sendTransaction, etc...) to the provider instance supplied at instantiation. All other requests
- * are passed onwards for subsequent subproviders to handle.
- */
-export class InjectedWeb3Subprovider extends Subprovider {
- private _injectedWeb3: Web3;
- /**
- * Instantiates a new InjectedWeb3Subprovider
- * @param provider Web3 provider that should handle all user account related requests
- */
- constructor(provider: Web3.Provider) {
- super();
- this._injectedWeb3 = new Web3(provider);
- }
- /**
- * This method conforms to the web3-provider-engine interface.
- * It is called internally by the ProviderEngine when it is this subproviders
- * turn to handle a JSON RPC request.
- * @param payload JSON RPC payload
- * @param next Callback to call if this subprovider decides not to handle the request
- * @param end Callback to call if subprovider handled the request and wants to pass back the request.
- */
- // tslint:disable-next-line:prefer-function-over-method
- public handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback) {
- switch (payload.method) {
- case 'web3_clientVersion':
- this._injectedWeb3.version.getNode(end);
- return;
- case 'eth_accounts':
- this._injectedWeb3.eth.getAccounts(end);
- return;
-
- case 'eth_sendTransaction':
- const [txParams] = payload.params;
- this._injectedWeb3.eth.sendTransaction(txParams, end);
- return;
-
- case 'eth_sign':
- const [address, message] = payload.params;
- this._injectedWeb3.eth.sign(address, message, end);
- return;
-
- default:
- next();
- return;
- }
- }
-}
diff --git a/packages/subproviders/src/subproviders/ledger.ts b/packages/subproviders/src/subproviders/ledger.ts
index 95784a391..6ad5de2e2 100644
--- a/packages/subproviders/src/subproviders/ledger.ts
+++ b/packages/subproviders/src/subproviders/ledger.ts
@@ -1,5 +1,4 @@
import { assert } from '@0xproject/assert';
-import { JSONRPCRequestPayload } from '@0xproject/types';
import { addressUtils } from '@0xproject/utils';
import EthereumTx = require('ethereumjs-tx');
import ethUtil = require('ethereumjs-util');
@@ -8,41 +7,39 @@ import * as _ from 'lodash';
import { Lock } from 'semaphore-async-await';
import {
- Callback,
+ DerivedHDKeyInfo,
LedgerEthereumClient,
LedgerEthereumClientFactoryAsync,
LedgerSubproviderConfigs,
LedgerSubproviderErrors,
PartialTxParams,
- ResponseWithTxParams,
+ WalletSubproviderErrors,
} from '../types';
+import { walletUtils } from '../utils/wallet_utils';
-import { Subprovider } from './subprovider';
+import { BaseWalletSubprovider } from './base_wallet_subprovider';
-const DEFAULT_DERIVATION_PATH = `44'/60'/0'`;
-const DEFAULT_NUM_ADDRESSES_TO_FETCH = 10;
+const DEFAULT_BASE_DERIVATION_PATH = `44'/60'/0'`;
const ASK_FOR_ON_DEVICE_CONFIRMATION = false;
const SHOULD_GET_CHAIN_CODE = true;
+const DEFAULT_NUM_ADDRESSES_TO_FETCH = 10;
+const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
/**
* Subprovider for interfacing with a user's [Ledger Nano S](https://www.ledgerwallet.com/products/ledger-nano-s).
* This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and
* re-routes them to a Ledger device plugged into the users computer.
*/
-export class LedgerSubprovider extends Subprovider {
- private _nonceLock = new Lock();
- private _connectionLock = new Lock();
- private _networkId: number;
- private _derivationPath: string;
- private _derivationPathIndex: number;
- private _ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync;
+export class LedgerSubprovider extends BaseWalletSubprovider {
+ // tslint:disable-next-line:no-unused-variable
+ private readonly _nonceLock = new Lock();
+ private readonly _connectionLock = new Lock();
+ private readonly _networkId: number;
+ private _baseDerivationPath: string;
+ private readonly _ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync;
private _ledgerClientIfExists?: LedgerEthereumClient;
- private _shouldAlwaysAskForConfirmation: boolean;
- private static _validateSender(sender: string) {
- if (_.isUndefined(sender) || !addressUtils.isAddress(sender)) {
- throw new Error(LedgerSubproviderErrors.SenderInvalidOrNotSupplied);
- }
- }
+ private readonly _shouldAlwaysAskForConfirmation: boolean;
+ private readonly _addressSearchLimit: number;
/**
* Instantiates a LedgerSubprovider. Defaults to derivationPath set to `44'/60'/0'`.
* TestRPC/Ganache defaults to `m/44'/60'/0'/0`, so set this in the configs if desired.
@@ -53,40 +50,35 @@ export class LedgerSubprovider extends Subprovider {
super();
this._networkId = config.networkId;
this._ledgerEthereumClientFactoryAsync = config.ledgerEthereumClientFactoryAsync;
- this._derivationPath = config.derivationPath || DEFAULT_DERIVATION_PATH;
+ this._baseDerivationPath = config.baseDerivationPath || DEFAULT_BASE_DERIVATION_PATH;
this._shouldAlwaysAskForConfirmation =
!_.isUndefined(config.accountFetchingConfigs) &&
!_.isUndefined(config.accountFetchingConfigs.shouldAskForOnDeviceConfirmation)
? config.accountFetchingConfigs.shouldAskForOnDeviceConfirmation
: ASK_FOR_ON_DEVICE_CONFIRMATION;
- this._derivationPathIndex = 0;
+ this._addressSearchLimit =
+ !_.isUndefined(config.accountFetchingConfigs) &&
+ !_.isUndefined(config.accountFetchingConfigs.addressSearchLimit)
+ ? config.accountFetchingConfigs.addressSearchLimit
+ : DEFAULT_ADDRESS_SEARCH_LIMIT;
}
/**
* Retrieve the set derivation path
* @returns derivation path
*/
public getPath(): string {
- return this._derivationPath;
+ return this._baseDerivationPath;
}
/**
* Set a desired derivation path when computing the available user addresses
- * @param derivationPath The desired derivation path (e.g `44'/60'/0'`)
- */
- public setPath(derivationPath: string) {
- this._derivationPath = derivationPath;
- }
- /**
- * Set the final derivation path index. If a user wishes to sign a message with the
- * 6th address in a derivation path, before calling `signPersonalMessageAsync`, you must
- * call this method with pathIndex `6`.
- * @param pathIndex Desired derivation path index
+ * @param basDerivationPath The desired derivation path (e.g `44'/60'/0'`)
*/
- public setPathIndex(pathIndex: number) {
- this._derivationPathIndex = pathIndex;
+ public setPath(basDerivationPath: string): void {
+ this._baseDerivationPath = basDerivationPath;
}
/**
* Retrieve a users Ledger accounts. The accounts are derived from the derivationPath,
- * master public key and chainCode. Because of this, you can request as many accounts
+ * master public key and chain code. Because of this, you can request as many accounts
* as you wish and it only requires a single request to the Ledger device. This method
* is automatically called when issuing a `eth_accounts` JSON RPC request via your providerEngine
* instance.
@@ -94,65 +86,51 @@ export class LedgerSubprovider extends Subprovider {
* @return An array of accounts
*/
public async getAccountsAsync(numberOfAccounts: number = DEFAULT_NUM_ADDRESSES_TO_FETCH): Promise<string[]> {
- this._ledgerClientIfExists = await this._createLedgerClientAsync();
-
- let ledgerResponse;
- try {
- ledgerResponse = await this._ledgerClientIfExists.getAddress(
- this._derivationPath,
- this._shouldAlwaysAskForConfirmation,
- SHOULD_GET_CHAIN_CODE,
- );
- } finally {
- await this._destroyLedgerClientAsync();
- }
-
- const hdKey = new HDNode();
- hdKey.publicKey = new Buffer(ledgerResponse.publicKey, 'hex');
- hdKey.chainCode = new Buffer(ledgerResponse.chainCode, 'hex');
-
- const accounts: string[] = [];
- for (let i = 0; i < numberOfAccounts; i++) {
- const derivedHDNode = hdKey.derive(`m/${i + this._derivationPathIndex}`);
- const derivedPublicKey = derivedHDNode.publicKey;
- const shouldSanitizePublicKey = true;
- const ethereumAddressUnprefixed = ethUtil
- .publicToAddress(derivedPublicKey, shouldSanitizePublicKey)
- .toString('hex');
- const ethereumAddressPrefixed = ethUtil.addHexPrefix(ethereumAddressUnprefixed);
- accounts.push(ethereumAddressPrefixed.toLowerCase());
- }
+ const initialDerivedKeyInfo = await this._initialDerivedKeyInfoAsync();
+ const derivedKeyInfos = walletUtils.calculateDerivedHDKeyInfos(initialDerivedKeyInfo, numberOfAccounts);
+ const accounts = _.map(derivedKeyInfos, k => k.address);
return accounts;
}
/**
- * Sign a transaction with the Ledger. If you've added the LedgerSubprovider to your
- * app's provider, you can simply send an `eth_sendTransaction` JSON RPC request, and
- * this method will be called auto-magically. If you are not using this via a ProviderEngine
+ * Signs a transaction on the Ledger with the account specificed by the `from` field in txParams.
+ * If you've added the LedgerSubprovider to your app's provider, you can simply send an `eth_sendTransaction`
+ * JSON RPC request, and this method will be called auto-magically. If you are not using this via a ProviderEngine
* instance, you can call it directly.
* @param txParams Parameters of the transaction to sign
* @return Signed transaction hex string
*/
public async signTransactionAsync(txParams: PartialTxParams): Promise<string> {
+ LedgerSubprovider._validateTxParams(txParams);
+ if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) {
+ throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid);
+ }
+ const initialDerivedKeyInfo = await this._initialDerivedKeyInfoAsync();
+ const derivedKeyInfo = this._findDerivedKeyInfoForAddress(initialDerivedKeyInfo, txParams.from);
+
this._ledgerClientIfExists = await this._createLedgerClientAsync();
const tx = new EthereumTx(txParams);
// Set the EIP155 bits
- tx.raw[6] = Buffer.from([this._networkId]); // v
- tx.raw[7] = Buffer.from([]); // r
- tx.raw[8] = Buffer.from([]); // s
+ const vIndex = 6;
+ tx.raw[vIndex] = Buffer.from([this._networkId]); // v
+ const rIndex = 7;
+ tx.raw[rIndex] = Buffer.from([]); // r
+ const sIndex = 8;
+ tx.raw[sIndex] = Buffer.from([]); // s
const txHex = tx.serialize().toString('hex');
try {
- const derivationPath = this._getDerivationPath();
- const result = await this._ledgerClientIfExists.signTransaction(derivationPath, txHex);
+ const fullDerivationPath = derivedKeyInfo.derivationPath;
+ const result = await this._ledgerClientIfExists.signTransaction(fullDerivationPath, txHex);
// Store signature in transaction
tx.r = Buffer.from(result.r, 'hex');
tx.s = Buffer.from(result.s, 'hex');
tx.v = Buffer.from(result.v, 'hex');
// EIP155: v should be chain_id * 2 + {35, 36}
- const signedChainId = Math.floor((tx.v[0] - 35) / 2);
+ const eip55Constant = 35;
+ const signedChainId = Math.floor((tx.v[0] - eip55Constant) / 2);
if (signedChainId !== this._networkId) {
await this._destroyLedgerClientAsync();
const err = new Error(LedgerSubproviderErrors.TooOldLedgerFirmware);
@@ -168,25 +146,36 @@ export class LedgerSubprovider extends Subprovider {
}
}
/**
- * Sign a personal Ethereum signed message. The signing address will be to one
- * retrieved given a derivationPath and pathIndex set on the subprovider.
+ * Sign a personal Ethereum signed message. The signing account will be the account
+ * associated with the provided address.
* The Ledger adds the Ethereum signed message prefix on-device. If you've added
* the LedgerSubprovider to your app's provider, you can simply send an `eth_sign`
* or `personal_sign` JSON RPC request, and this method will be called auto-magically.
* If you are not using this via a ProviderEngine instance, you can call it directly.
- * @param data Message to sign
+ * @param data Hex string message to sign
+ * @param address Address of the account to sign with
* @return Signature hex string (order: rsv)
*/
- public async signPersonalMessageAsync(data: string): Promise<string> {
+ public async signPersonalMessageAsync(data: string, address: string): Promise<string> {
+ if (_.isUndefined(data)) {
+ throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage);
+ }
+ assert.isHexString('data', data);
+ assert.isETHAddressHex('address', address);
+ const initialDerivedKeyInfo = await this._initialDerivedKeyInfoAsync();
+ const derivedKeyInfo = this._findDerivedKeyInfoForAddress(initialDerivedKeyInfo, address);
+
this._ledgerClientIfExists = await this._createLedgerClientAsync();
try {
- const derivationPath = this._getDerivationPath();
+ const fullDerivationPath = derivedKeyInfo.derivationPath;
const result = await this._ledgerClientIfExists.signPersonalMessage(
- derivationPath,
+ fullDerivationPath,
ethUtil.stripHexPrefix(data),
);
- const v = result.v - 27;
- let vHex = v.toString(16);
+ const lowestValidV = 27;
+ const v = result.v - lowestValidV;
+ const hexBase = 16;
+ let vHex = v.toString(hexBase);
if (vHex.length < 2) {
vHex = `0${v}`;
}
@@ -198,86 +187,6 @@ export class LedgerSubprovider extends Subprovider {
throw err;
}
}
- /**
- * This method conforms to the web3-provider-engine interface.
- * It is called internally by the ProviderEngine when it is this subproviders
- * turn to handle a JSON RPC request.
- * @param payload JSON RPC payload
- * @param next Callback to call if this subprovider decides not to handle the request
- * @param end Callback to call if subprovider handled the request and wants to pass back the request.
- */
- // tslint:disable-next-line:async-suffix
- public async handleRequest(
- payload: JSONRPCRequestPayload,
- next: Callback,
- end: (err: Error | null, result?: any) => void,
- ) {
- let accounts;
- let txParams;
- switch (payload.method) {
- case 'eth_coinbase':
- try {
- accounts = await this.getAccountsAsync();
- end(null, accounts[0]);
- } catch (err) {
- end(err);
- }
- return;
-
- case 'eth_accounts':
- try {
- accounts = await this.getAccountsAsync();
- end(null, accounts);
- } catch (err) {
- end(err);
- }
- return;
-
- case 'eth_sendTransaction':
- txParams = payload.params[0];
- try {
- LedgerSubprovider._validateSender(txParams.from);
- const result = await this._sendTransactionAsync(txParams);
- end(null, result);
- } catch (err) {
- end(err);
- }
- return;
-
- case 'eth_signTransaction':
- txParams = payload.params[0];
- try {
- const result = await this._signTransactionWithoutSendingAsync(txParams);
- end(null, result);
- } catch (err) {
- end(err);
- }
- return;
-
- case 'eth_sign':
- case 'personal_sign':
- const data = payload.method === 'eth_sign' ? payload.params[1] : payload.params[0];
- try {
- if (_.isUndefined(data)) {
- throw new Error(LedgerSubproviderErrors.DataMissingForSignPersonalMessage);
- }
- assert.isHexString('data', data);
- const ecSignatureHex = await this.signPersonalMessageAsync(data);
- end(null, ecSignatureHex);
- } catch (err) {
- end(err);
- }
- return;
-
- default:
- next();
- return;
- }
- }
- private _getDerivationPath() {
- const derivationPath = `${this.getPath()}/${this._derivationPathIndex}`;
- return derivationPath;
- }
private async _createLedgerClientAsync(): Promise<LedgerEthereumClient> {
await this._connectionLock.acquire();
if (!_.isUndefined(this._ledgerClientIfExists)) {
@@ -288,7 +197,7 @@ export class LedgerSubprovider extends Subprovider {
this._connectionLock.release();
return ledgerEthereumClient;
}
- private async _destroyLedgerClientAsync() {
+ private async _destroyLedgerClientAsync(): Promise<void> {
await this._connectionLock.acquire();
if (_.isUndefined(this._ledgerClientIfExists)) {
this._connectionLock.release();
@@ -298,70 +207,41 @@ export class LedgerSubprovider extends Subprovider {
this._ledgerClientIfExists = undefined;
this._connectionLock.release();
}
- private async _sendTransactionAsync(txParams: PartialTxParams): Promise<string> {
- await this._nonceLock.acquire();
- try {
- // fill in the extras
- const filledParams = await this._populateMissingTxParamsAsync(txParams);
- // sign it
- const signedTx = await this.signTransactionAsync(filledParams);
- // emit a submit
- const payload = {
- method: 'eth_sendRawTransaction',
- params: [signedTx],
- };
- const result = await this.emitPayloadAsync(payload);
- this._nonceLock.release();
- return result.result;
- } catch (err) {
- this._nonceLock.release();
- throw err;
- }
- }
- private async _signTransactionWithoutSendingAsync(txParams: PartialTxParams): Promise<ResponseWithTxParams> {
- await this._nonceLock.acquire();
- try {
- // fill in the extras
- const filledParams = await this._populateMissingTxParamsAsync(txParams);
- // sign it
- const signedTx = await this.signTransactionAsync(filledParams);
+ private async _initialDerivedKeyInfoAsync(): Promise<DerivedHDKeyInfo> {
+ this._ledgerClientIfExists = await this._createLedgerClientAsync();
- this._nonceLock.release();
- const result = {
- raw: signedTx,
- tx: txParams,
- };
- return result;
- } catch (err) {
- this._nonceLock.release();
- throw err;
+ const parentKeyDerivationPath = `m/${this._baseDerivationPath}`;
+ let ledgerResponse;
+ try {
+ ledgerResponse = await this._ledgerClientIfExists.getAddress(
+ parentKeyDerivationPath,
+ this._shouldAlwaysAskForConfirmation,
+ SHOULD_GET_CHAIN_CODE,
+ );
+ } finally {
+ await this._destroyLedgerClientAsync();
}
+ const hdKey = new HDNode();
+ hdKey.publicKey = new Buffer(ledgerResponse.publicKey, 'hex');
+ hdKey.chainCode = new Buffer(ledgerResponse.chainCode, 'hex');
+ const address = walletUtils.addressOfHDKey(hdKey);
+ const initialDerivedKeyInfo = {
+ hdKey,
+ address,
+ derivationPath: parentKeyDerivationPath,
+ baseDerivationPath: this._baseDerivationPath,
+ };
+ return initialDerivedKeyInfo;
}
- private async _populateMissingTxParamsAsync(txParams: PartialTxParams): Promise<PartialTxParams> {
- if (_.isUndefined(txParams.gasPrice)) {
- const gasPriceResult = await this.emitPayloadAsync({
- method: 'eth_gasPrice',
- params: [],
- });
- const gasPrice = gasPriceResult.result.toString();
- txParams.gasPrice = gasPrice;
- }
- if (_.isUndefined(txParams.nonce)) {
- const nonceResult = await this.emitPayloadAsync({
- method: 'eth_getTransactionCount',
- params: [txParams.from, 'pending'],
- });
- const nonce = nonceResult.result;
- txParams.nonce = nonce;
- }
- if (_.isUndefined(txParams.gas)) {
- const gasResult = await this.emitPayloadAsync({
- method: 'eth_estimateGas',
- params: [txParams],
- });
- const gas = gasResult.result.toString();
- txParams.gas = gas;
+ private _findDerivedKeyInfoForAddress(initalHDKey: DerivedHDKeyInfo, address: string): DerivedHDKeyInfo {
+ const matchedDerivedKeyInfo = walletUtils.findDerivedKeyInfoForAddressIfExists(
+ address,
+ initalHDKey,
+ this._addressSearchLimit,
+ );
+ if (_.isUndefined(matchedDerivedKeyInfo)) {
+ throw new Error(`${WalletSubproviderErrors.AddressNotFound}: ${address}`);
}
- return txParams;
+ return matchedDerivedKeyInfo;
}
}
diff --git a/packages/subproviders/src/subproviders/mnemonic_wallet.ts b/packages/subproviders/src/subproviders/mnemonic_wallet.ts
new file mode 100644
index 000000000..1495112b6
--- /dev/null
+++ b/packages/subproviders/src/subproviders/mnemonic_wallet.ts
@@ -0,0 +1,144 @@
+import { assert } from '@0xproject/assert';
+import { addressUtils } from '@0xproject/utils';
+import * as bip39 from 'bip39';
+import HDNode = require('hdkey');
+import * as _ from 'lodash';
+
+import { DerivedHDKeyInfo, MnemonicWalletSubproviderConfigs, PartialTxParams, WalletSubproviderErrors } from '../types';
+import { walletUtils } from '../utils/wallet_utils';
+
+import { BaseWalletSubprovider } from './base_wallet_subprovider';
+import { PrivateKeyWalletSubprovider } from './private_key_wallet';
+
+const DEFAULT_BASE_DERIVATION_PATH = `44'/60'/0'/0`;
+const DEFAULT_NUM_ADDRESSES_TO_FETCH = 10;
+const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and handles
+ * all requests with accounts derived from the supplied mnemonic.
+ */
+export class MnemonicWalletSubprovider extends BaseWalletSubprovider {
+ private readonly _addressSearchLimit: number;
+ private _baseDerivationPath: string;
+ private _derivedKeyInfo: DerivedHDKeyInfo;
+ private readonly _mnemonic: string;
+
+ /**
+ * Instantiates a MnemonicWalletSubprovider. Defaults to baseDerivationPath set to `44'/60'/0'/0`.
+ * This is the default in TestRPC/Ganache, it can be overridden if desired.
+ * @param config Configuration for the mnemonic wallet, must contain the mnemonic
+ * @return MnemonicWalletSubprovider instance
+ */
+ constructor(config: MnemonicWalletSubproviderConfigs) {
+ assert.isString('mnemonic', config.mnemonic);
+ const baseDerivationPath = config.baseDerivationPath || DEFAULT_BASE_DERIVATION_PATH;
+ assert.isString('baseDerivationPath', baseDerivationPath);
+ const addressSearchLimit = config.addressSearchLimit || DEFAULT_ADDRESS_SEARCH_LIMIT;
+ assert.isNumber('addressSearchLimit', addressSearchLimit);
+ super();
+
+ this._mnemonic = config.mnemonic;
+ this._baseDerivationPath = baseDerivationPath;
+ this._addressSearchLimit = addressSearchLimit;
+ this._derivedKeyInfo = this._initialDerivedKeyInfo(this._baseDerivationPath);
+ }
+ /**
+ * Retrieve the set derivation path
+ * @returns derivation path
+ */
+ public getPath(): string {
+ return this._baseDerivationPath;
+ }
+ /**
+ * Set a desired derivation path when computing the available user addresses
+ * @param baseDerivationPath The desired derivation path (e.g `44'/60'/0'`)
+ */
+ public setPath(baseDerivationPath: string): void {
+ this._baseDerivationPath = baseDerivationPath;
+ this._derivedKeyInfo = this._initialDerivedKeyInfo(this._baseDerivationPath);
+ }
+ /**
+ * Retrieve the accounts associated with the mnemonic.
+ * This method is implicitly called when issuing a `eth_accounts` JSON RPC request
+ * via your providerEngine instance.
+ * @param numberOfAccounts Number of accounts to retrieve (default: 10)
+ * @return An array of accounts
+ */
+ public async getAccountsAsync(numberOfAccounts: number = DEFAULT_NUM_ADDRESSES_TO_FETCH): Promise<string[]> {
+ const derivedKeys = walletUtils.calculateDerivedHDKeyInfos(this._derivedKeyInfo, numberOfAccounts);
+ const accounts = _.map(derivedKeys, k => k.address);
+ return accounts;
+ }
+
+ /**
+ * Signs a transaction with the account specificed by the `from` field in txParams.
+ * If you've added this Subprovider to your app's provider, you can simply send
+ * an `eth_sendTransaction` JSON RPC request, and this method will be called auto-magically.
+ * If you are not using this via a ProviderEngine instance, you can call it directly.
+ * @param txParams Parameters of the transaction to sign
+ * @return Signed transaction hex string
+ */
+ public async signTransactionAsync(txParams: PartialTxParams): Promise<string> {
+ if (_.isUndefined(txParams.from) || !addressUtils.isAddress(txParams.from)) {
+ throw new Error(WalletSubproviderErrors.FromAddressMissingOrInvalid);
+ }
+ const privateKeyWallet = this._privateKeyWalletForAddress(txParams.from);
+ const signedTx = privateKeyWallet.signTransactionAsync(txParams);
+ return signedTx;
+ }
+ /**
+ * Sign a personal Ethereum signed message. The signing account will be the account
+ * associated with the provided address.
+ * If you've added the MnemonicWalletSubprovider to your app's provider, you can simply send an `eth_sign`
+ * or `personal_sign` JSON RPC request, and this method will be called auto-magically.
+ * If you are not using this via a ProviderEngine instance, you can call it directly.
+ * @param data Hex string message to sign
+ * @param address Address of the account to sign with
+ * @return Signature hex string (order: rsv)
+ */
+ public async signPersonalMessageAsync(data: string, address: string): Promise<string> {
+ if (_.isUndefined(data)) {
+ throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage);
+ }
+ assert.isHexString('data', data);
+ assert.isETHAddressHex('address', address);
+ const privateKeyWallet = this._privateKeyWalletForAddress(address);
+ const sig = await privateKeyWallet.signPersonalMessageAsync(data, address);
+ return sig;
+ }
+ private _privateKeyWalletForAddress(address: string): PrivateKeyWalletSubprovider {
+ const derivedKeyInfo = this._findDerivedKeyInfoForAddress(address);
+ const privateKeyHex = derivedKeyInfo.hdKey.privateKey.toString('hex');
+ const privateKeyWallet = new PrivateKeyWalletSubprovider(privateKeyHex);
+ return privateKeyWallet;
+ }
+ private _findDerivedKeyInfoForAddress(address: string): DerivedHDKeyInfo {
+ const matchedDerivedKeyInfo = walletUtils.findDerivedKeyInfoForAddressIfExists(
+ address,
+ this._derivedKeyInfo,
+ this._addressSearchLimit,
+ );
+ if (_.isUndefined(matchedDerivedKeyInfo)) {
+ throw new Error(`${WalletSubproviderErrors.AddressNotFound}: ${address}`);
+ }
+ return matchedDerivedKeyInfo;
+ }
+ private _initialDerivedKeyInfo(baseDerivationPath: string): DerivedHDKeyInfo {
+ const seed = bip39.mnemonicToSeed(this._mnemonic);
+ const hdKey = HDNode.fromMasterSeed(seed);
+ // Walk down to base derivation level (i.e m/44'/60'/0') and create an initial key at that level
+ // all children will then be walked relative (i.e m/0)
+ const parentKeyDerivationPath = `m/${baseDerivationPath}`;
+ const parentHDKeyAtDerivationPath = hdKey.derive(parentKeyDerivationPath);
+ const address = walletUtils.addressOfHDKey(parentHDKeyAtDerivationPath);
+ const derivedKeyInfo = {
+ address,
+ baseDerivationPath,
+ derivationPath: parentKeyDerivationPath,
+ hdKey: parentHDKeyAtDerivationPath,
+ };
+ return derivedKeyInfo;
+ }
+}
diff --git a/packages/subproviders/src/subproviders/nonce_tracker.ts b/packages/subproviders/src/subproviders/nonce_tracker.ts
index 907330111..eea722aee 100644
--- a/packages/subproviders/src/subproviders/nonce_tracker.ts
+++ b/packages/subproviders/src/subproviders/nonce_tracker.ts
@@ -1,6 +1,6 @@
import * as _ from 'lodash';
-import { BlockParamLiteral, JSONRPCRequestPayload } from '@0xproject/types';
+import { BlockParamLiteral, JSONRPCRequestPayload } from 'ethereum-types';
import EthereumTx = require('ethereumjs-tx');
import ethUtil = require('ethereumjs-util');
import providerEngineUtils = require('web3-provider-engine/util/rpc-cache-utils');
@@ -17,7 +17,7 @@ const NONCE_TOO_LOW_ERROR_MESSAGE = 'Transaction nonce is too low';
* We added the additional feature of clearing the cached nonce value when a `nonce value too low` error occurs.
*/
export class NonceTrackerSubprovider extends Subprovider {
- private _nonceCache: { [address: string]: string } = {};
+ private readonly _nonceCache: { [address: string]: string } = {};
private static _reconstructTransaction(payload: JSONRPCRequestPayload): EthereumTx {
const raw = payload.params[0];
if (_.isUndefined(raw)) {
@@ -75,7 +75,7 @@ export class NonceTrackerSubprovider extends Subprovider {
return next();
}
case 'eth_sendRawTransaction':
- return next((sendTransactionError: Error | null, txResult: any, cb: Callback) => {
+ return next((sendTransactionError: Error | null, _txResult: any, cb: Callback) => {
if (_.isNull(sendTransactionError)) {
this._handleSuccessfulTransaction(payload);
} else {
@@ -93,7 +93,8 @@ export class NonceTrackerSubprovider extends Subprovider {
// Increment the nonce from the previous successfully submitted transaction
let nonce = ethUtil.bufferToInt(transaction.nonce);
nonce++;
- let nextHexNonce = nonce.toString(16);
+ const hexBase = 16;
+ let nextHexNonce = nonce.toString(hexBase);
if (nextHexNonce.length % 2) {
nextHexNonce = `0${nextHexNonce}`;
}
diff --git a/packages/subproviders/src/subproviders/private_key_wallet.ts b/packages/subproviders/src/subproviders/private_key_wallet.ts
new file mode 100644
index 000000000..9d6fc487e
--- /dev/null
+++ b/packages/subproviders/src/subproviders/private_key_wallet.ts
@@ -0,0 +1,87 @@
+import { assert } from '@0xproject/assert';
+import EthereumTx = require('ethereumjs-tx');
+import * as ethUtil from 'ethereumjs-util';
+import * as _ from 'lodash';
+
+import { PartialTxParams, WalletSubproviderErrors } from '../types';
+
+import { BaseWalletSubprovider } from './base_wallet_subprovider';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * This subprovider intercepts all account related RPC requests (e.g message/transaction signing, etc...) and handles
+ * all requests with the supplied Ethereum private key.
+ */
+export class PrivateKeyWalletSubprovider extends BaseWalletSubprovider {
+ private readonly _address: string;
+ private readonly _privateKeyBuffer: Buffer;
+ /**
+ * Instantiates a PrivateKeyWalletSubprovider.
+ * @param privateKey The corresponding private key to an Ethereum address
+ * @return PrivateKeyWalletSubprovider instance
+ */
+ constructor(privateKey: string) {
+ assert.isString('privateKey', privateKey);
+ super();
+ this._privateKeyBuffer = new Buffer(privateKey, 'hex');
+ this._address = `0x${ethUtil.privateToAddress(this._privateKeyBuffer).toString('hex')}`;
+ }
+ /**
+ * Retrieve the account associated with the supplied private key.
+ * This method is implicitly called when issuing a `eth_accounts` JSON RPC request
+ * via your providerEngine instance.
+ * @return An array of accounts
+ */
+ public async getAccountsAsync(): Promise<string[]> {
+ return [this._address];
+ }
+ /**
+ * Sign a transaction with the private key. If you've added this Subprovider to your
+ * app's provider, you can simply send an `eth_sendTransaction` JSON RPC request, and
+ * this method will be called auto-magically. If you are not using this via a ProviderEngine
+ * instance, you can call it directly.
+ * @param txParams Parameters of the transaction to sign
+ * @return Signed transaction hex string
+ */
+ public async signTransactionAsync(txParams: PartialTxParams): Promise<string> {
+ PrivateKeyWalletSubprovider._validateTxParams(txParams);
+ if (!_.isUndefined(txParams.from) && txParams.from !== this._address) {
+ throw new Error(
+ `Requested to sign transaction with address: ${txParams.from}, instantiated with address: ${
+ this._address
+ }`,
+ );
+ }
+ const tx = new EthereumTx(txParams);
+ tx.sign(this._privateKeyBuffer);
+ const rawTx = `0x${tx.serialize().toString('hex')}`;
+ return rawTx;
+ }
+ /**
+ * Sign a personal Ethereum signed message. The signing address will be calculated from the private key.
+ * The address must be provided it must match the address calculated from the private key.
+ * If you've added this Subprovider to your app's provider, you can simply send an `eth_sign`
+ * or `personal_sign` JSON RPC request, and this method will be called auto-magically.
+ * If you are not using this via a ProviderEngine instance, you can call it directly.
+ * @param data Hex string message to sign
+ * @param address Address of the account to sign with
+ * @return Signature hex string (order: rsv)
+ */
+ public async signPersonalMessageAsync(data: string, address: string): Promise<string> {
+ if (_.isUndefined(data)) {
+ throw new Error(WalletSubproviderErrors.DataMissingForSignPersonalMessage);
+ }
+ assert.isHexString('data', data);
+ assert.isETHAddressHex('address', address);
+ if (address !== this._address) {
+ throw new Error(
+ `Requested to sign message with address: ${address}, instantiated with address: ${this._address}`,
+ );
+ }
+ const dataBuff = ethUtil.toBuffer(data);
+ const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff);
+ const sig = ethUtil.ecsign(msgHashBuff, this._privateKeyBuffer);
+ const rpcSig = ethUtil.toRpcSig(sig.v, sig.r, sig.s);
+ return rpcSig;
+ }
+}
diff --git a/packages/subproviders/src/subproviders/redundant_rpc.ts b/packages/subproviders/src/subproviders/redundant_rpc.ts
deleted file mode 100644
index f8ff0915d..000000000
--- a/packages/subproviders/src/subproviders/redundant_rpc.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-import { JSONRPCRequestPayload } from '@0xproject/types';
-import { promisify } from '@0xproject/utils';
-import * as _ from 'lodash';
-import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
-
-import { Callback } from '../types';
-
-import { Subprovider } from './subprovider';
-
-/**
- * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
- * It attempts to handle each JSON RPC request by sequentially attempting to receive a valid response from one of a
- * set of JSON RPC endpoints.
- */
-export class RedundantRPCSubprovider extends Subprovider {
- private _rpcs: RpcSubprovider[];
- private static async _firstSuccessAsync(
- rpcs: RpcSubprovider[],
- payload: JSONRPCRequestPayload,
- next: Callback,
- ): Promise<any> {
- let lastErr: Error | undefined;
- for (const rpc of rpcs) {
- try {
- const data = await promisify(rpc.handleRequest.bind(rpc))(payload, next);
- return data;
- } catch (err) {
- lastErr = err;
- continue;
- }
- }
- if (!_.isUndefined(lastErr)) {
- throw lastErr;
- }
- }
- /**
- * Instantiates a new RedundantRPCSubprovider
- * @param endpoints JSON RPC endpoints to attempt. Attempts are made in the order of the endpoints.
- */
- constructor(endpoints: string[]) {
- super();
- this._rpcs = _.map(endpoints, endpoint => {
- return new RpcSubprovider({
- rpcUrl: endpoint,
- });
- });
- }
- /**
- * This method conforms to the web3-provider-engine interface.
- * It is called internally by the ProviderEngine when it is this subproviders
- * turn to handle a JSON RPC request.
- * @param payload JSON RPC payload
- * @param next Callback to call if this subprovider decides not to handle the request
- * @param end Callback to call if subprovider handled the request and wants to pass back the request.
- */
- // tslint:disable-next-line:async-suffix
- public async handleRequest(
- payload: JSONRPCRequestPayload,
- next: Callback,
- end: (err: Error | null, data?: any) => void,
- ): Promise<void> {
- const rpcsCopy = this._rpcs.slice();
- try {
- const data = await RedundantRPCSubprovider._firstSuccessAsync(rpcsCopy, payload, next);
- end(null, data);
- } catch (err) {
- end(err);
- }
- }
-}
diff --git a/packages/subproviders/src/subproviders/redundant_subprovider.ts b/packages/subproviders/src/subproviders/redundant_subprovider.ts
new file mode 100644
index 000000000..7aa6226d5
--- /dev/null
+++ b/packages/subproviders/src/subproviders/redundant_subprovider.ts
@@ -0,0 +1,65 @@
+import { promisify } from '@0xproject/utils';
+import { JSONRPCRequestPayload } from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { Callback } from '../types';
+
+import { Subprovider } from './subprovider';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * It attempts to handle each JSON RPC request by sequentially attempting to receive a valid response from one of a
+ * set of JSON RPC endpoints.
+ */
+export class RedundantSubprovider extends Subprovider {
+ private readonly _subproviders: Subprovider[];
+ private static async _firstSuccessAsync(
+ subproviders: Subprovider[],
+ payload: JSONRPCRequestPayload,
+ next: Callback,
+ ): Promise<any> {
+ let lastErr: Error | undefined;
+ for (const subprovider of subproviders) {
+ try {
+ const data = await promisify(subprovider.handleRequest.bind(subprovider))(payload, next);
+ return data;
+ } catch (err) {
+ lastErr = err;
+ continue;
+ }
+ }
+ if (!_.isUndefined(lastErr)) {
+ throw lastErr;
+ }
+ }
+ /**
+ * Instantiates a new RedundantSubprovider
+ * @param endpoints JSON RPC endpoints to attempt. Attempts are made in the order of the endpoints.
+ */
+ constructor(subproviders: Subprovider[]) {
+ super();
+ this._subproviders = subproviders;
+ }
+ /**
+ * This method conforms to the web3-provider-engine interface.
+ * It is called internally by the ProviderEngine when it is this subproviders
+ * turn to handle a JSON RPC request.
+ * @param payload JSON RPC payload
+ * @param next Callback to call if this subprovider decides not to handle the request
+ * @param end Callback to call if subprovider handled the request and wants to pass back the request.
+ */
+ // tslint:disable-next-line:async-suffix
+ public async handleRequest(
+ payload: JSONRPCRequestPayload,
+ next: Callback,
+ end: (err: Error | null, data?: any) => void,
+ ): Promise<void> {
+ const subprovidersCopy = this._subproviders.slice();
+ try {
+ const data = await RedundantSubprovider._firstSuccessAsync(subprovidersCopy, payload, next);
+ end(null, data);
+ } catch (err) {
+ end(err);
+ }
+ }
+}
diff --git a/packages/subproviders/src/subproviders/rpc_subprovider.ts b/packages/subproviders/src/subproviders/rpc_subprovider.ts
new file mode 100644
index 000000000..d874c6f05
--- /dev/null
+++ b/packages/subproviders/src/subproviders/rpc_subprovider.ts
@@ -0,0 +1,90 @@
+import { assert } from '@0xproject/assert';
+import { StatusCodes } from '@0xproject/types';
+import { fetchAsync } from '@0xproject/utils';
+import { JSONRPCRequestPayload } from 'ethereum-types';
+import JsonRpcError = require('json-rpc-error');
+
+import { Callback, ErrorCallback } from '../types';
+
+import { Subprovider } from './subprovider';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine) subprovider interface.
+ * It forwards on JSON RPC requests to the supplied `rpcUrl` endpoint
+ */
+export class RPCSubprovider extends Subprovider {
+ private readonly _rpcUrl: string;
+ private readonly _requestTimeoutMs: number;
+ constructor(rpcUrl: string, requestTimeoutMs: number = 20000) {
+ super();
+ assert.isString('rpcUrl', rpcUrl);
+ assert.isNumber('requestTimeoutMs', requestTimeoutMs);
+ this._rpcUrl = rpcUrl;
+ this._requestTimeoutMs = requestTimeoutMs;
+ }
+ /**
+ * This method conforms to the web3-provider-engine interface.
+ * It is called internally by the ProviderEngine when it is this subproviders
+ * turn to handle a JSON RPC request.
+ * @param payload JSON RPC payload
+ * @param next Callback to call if this subprovider decides not to handle the request
+ * @param end Callback to call if subprovider handled the request and wants to pass back the request.
+ */
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, _next: Callback, end: ErrorCallback): Promise<void> {
+ const finalPayload = Subprovider._createFinalPayload(payload);
+ const headers = new Headers({
+ Accept: 'application/json',
+ 'Content-Type': 'application/json',
+ });
+
+ let response;
+ try {
+ response = await fetchAsync(
+ this._rpcUrl,
+ {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(finalPayload),
+ },
+ this._requestTimeoutMs,
+ );
+ } catch (err) {
+ end(new JsonRpcError.InternalError(err));
+ return;
+ }
+
+ const text = await response.text();
+ if (!response.ok) {
+ const statusCode = response.status;
+ switch (statusCode) {
+ case StatusCodes.MethodNotAllowed:
+ end(new JsonRpcError.MethodNotFound());
+ return;
+ case StatusCodes.GatewayTimeout:
+ const errMsg =
+ 'Gateway timeout. The request took too long to process. This can happen when querying logs over too wide a block range.';
+ const err = new Error(errMsg);
+ end(new JsonRpcError.InternalError(err));
+ return;
+ default:
+ end(new JsonRpcError.InternalError(text));
+ return;
+ }
+ }
+
+ let data;
+ try {
+ data = JSON.parse(text);
+ } catch (err) {
+ end(new JsonRpcError.InternalError(err));
+ return;
+ }
+
+ if (data.error) {
+ end(data.error);
+ return;
+ }
+ end(null, data.result);
+ }
+}
diff --git a/packages/subproviders/src/subproviders/signer.ts b/packages/subproviders/src/subproviders/signer.ts
new file mode 100644
index 000000000..d5fd86897
--- /dev/null
+++ b/packages/subproviders/src/subproviders/signer.ts
@@ -0,0 +1,75 @@
+import { marshaller, Web3Wrapper } from '@0xproject/web3-wrapper';
+import { JSONRPCRequestPayload, Provider } from 'ethereum-types';
+
+import { Callback, ErrorCallback } from '../types';
+
+import { Subprovider } from './subprovider';
+
+/**
+ * This class implements the [web3-provider-engine](https://github.com/MetaMask/provider-engine)
+ * subprovider interface. It forwards JSON RPC requests involving the domain of a signer (getAccounts,
+ * sendTransaction, signMessage etc...) to the provider instance supplied at instantiation. All other requests
+ * are passed onwards for subsequent subproviders to handle.
+ */
+export class SignerSubprovider extends Subprovider {
+ private readonly _web3Wrapper: Web3Wrapper;
+ /**
+ * Instantiates a new SignerSubprovider
+ * @param provider Web3 provider that should handle all user account related requests
+ */
+ constructor(provider: Provider) {
+ super();
+ this._web3Wrapper = new Web3Wrapper(provider);
+ }
+ /**
+ * This method conforms to the web3-provider-engine interface.
+ * It is called internally by the ProviderEngine when it is this subproviders
+ * turn to handle a JSON RPC request.
+ * @param payload JSON RPC payload
+ * @param next Callback to call if this subprovider decides not to handle the request
+ * @param end Callback to call if subprovider handled the request and wants to pass back the request.
+ */
+ // tslint:disable-next-line:prefer-function-over-method async-suffix
+ public async handleRequest(payload: JSONRPCRequestPayload, next: Callback, end: ErrorCallback): Promise<void> {
+ switch (payload.method) {
+ case 'web3_clientVersion':
+ try {
+ const nodeVersion = await this._web3Wrapper.getNodeVersionAsync();
+ end(null, nodeVersion);
+ } catch (err) {
+ end(err);
+ }
+ return;
+ case 'eth_accounts':
+ try {
+ const accounts = await this._web3Wrapper.getAvailableAddressesAsync();
+ end(null, accounts);
+ } catch (err) {
+ end(err);
+ }
+ return;
+ case 'eth_sendTransaction':
+ const [txParams] = payload.params;
+ try {
+ const txData = marshaller.unmarshalTxData(txParams);
+ const txHash = await this._web3Wrapper.sendTransactionAsync(txData);
+ end(null, txHash);
+ } catch (err) {
+ end(err);
+ }
+ return;
+ case 'eth_sign':
+ const [address, message] = payload.params;
+ try {
+ const signature = await this._web3Wrapper.signMessageAsync(address, message);
+ end(null, signature);
+ } catch (err) {
+ end(err);
+ }
+ return;
+ default:
+ next();
+ return;
+ }
+ }
+}
diff --git a/packages/subproviders/src/subproviders/subprovider.ts b/packages/subproviders/src/subproviders/subprovider.ts
index 26ce19305..5dc273569 100644
--- a/packages/subproviders/src/subproviders/subprovider.ts
+++ b/packages/subproviders/src/subproviders/subprovider.ts
@@ -1,25 +1,15 @@
-import { JSONRPCRequestPayload, JSONRPCResponsePayload } from '@0xproject/types';
-import promisify = require('es6-promisify');
-import * as Web3 from 'web3';
+import { promisify } from '@0xproject/utils';
+import { JSONRPCRequestPayload, JSONRPCResponsePayload, Provider } from 'ethereum-types';
-import { JSONRPCRequestPayloadWithMethod } from '../types';
+import { Callback, ErrorCallback, JSONRPCRequestPayloadWithMethod } from '../types';
/**
* A altered version of the base class Subprovider found in [web3-provider-engine](https://github.com/MetaMask/provider-engine).
* This one has an async/await `emitPayloadAsync` and also defined types.
*/
-export class Subprovider {
- private _engine: any;
- // Ported from: https://github.com/MetaMask/provider-engine/blob/master/util/random-id.js
- private static _getRandomId() {
- const extraDigits = 3;
- // 13 time digits
- const datePart = new Date().getTime() * Math.pow(10, extraDigits);
- // 3 random digits
- const extraPart = Math.floor(Math.random() * Math.pow(10, extraDigits));
- // 16 digits
- return datePart + extraPart;
- }
- private static _createFinalPayload(
+export abstract class Subprovider {
+ // tslint:disable-next-line:underscore-private-and-protected
+ private engine!: Provider;
+ protected static _createFinalPayload(
payload: Partial<JSONRPCRequestPayloadWithMethod>,
): Partial<JSONRPCRequestPayloadWithMethod> {
const finalPayload = {
@@ -31,6 +21,24 @@ export class Subprovider {
};
return finalPayload;
}
+ // Ported from: https://github.com/MetaMask/provider-engine/blob/master/util/random-id.js
+ private static _getRandomId(): number {
+ const extraDigits = 3;
+ const baseTen = 10;
+ // 13 time digits
+ const datePart = new Date().getTime() * Math.pow(baseTen, extraDigits);
+ // 3 random digits
+ const extraPart = Math.floor(Math.random() * Math.pow(baseTen, extraDigits));
+ // 16 digits
+ return datePart + extraPart;
+ }
+ // tslint:disable-next-line:async-suffix
+ public abstract async handleRequest(
+ payload: JSONRPCRequestPayload,
+ next: Callback,
+ end: ErrorCallback,
+ ): Promise<void>;
+
/**
* Emits a JSON RPC payload that will then be handled by the ProviderEngine instance
* this subprovider is a part of. The payload will cascade down the subprovider middleware
@@ -40,7 +48,7 @@ export class Subprovider {
*/
public async emitPayloadAsync(payload: Partial<JSONRPCRequestPayloadWithMethod>): Promise<JSONRPCResponsePayload> {
const finalPayload = Subprovider._createFinalPayload(payload);
- const response = await promisify(this._engine.sendAsync, this._engine)(finalPayload);
+ const response = await promisify<JSONRPCResponsePayload>(this.engine.sendAsync, this.engine)(finalPayload);
return response;
}
/**
@@ -48,7 +56,7 @@ export class Subprovider {
* This is only called within the ProviderEngine source code, do not call
* directly.
*/
- public setEngine(engine: any): void {
- this._engine = engine;
+ public setEngine(engine: Provider): void {
+ this.engine = engine;
}
}
diff --git a/packages/subproviders/src/types.ts b/packages/subproviders/src/types.ts
index a1fec1882..fe58bffa5 100644
--- a/packages/subproviders/src/types.ts
+++ b/packages/subproviders/src/types.ts
@@ -1,11 +1,13 @@
-import { ECSignature, JSONRPCRequestPayload } from '@0xproject/types';
-import * as _ from 'lodash';
+import { ECSignature } from '@0xproject/types';
+import { JSONRPCRequestPayload } from 'ethereum-types';
+import HDNode = require('hdkey');
export interface LedgerCommunicationClient {
close: () => Promise<void>;
}
-/*
+/**
+ * Elliptic Curve signature
* The LedgerEthereumClient sends Ethereum-specific requests to the Ledger Nano S
* It uses an internal LedgerCommunicationClient to relay these requests. Currently
* NodeJs and Browser communication are supported.
@@ -31,7 +33,7 @@ export interface ECSignatureString {
export type LedgerEthereumClientFactoryAsync = () => Promise<LedgerEthereumClient>;
-/*
+/**
* networkId: The ethereum networkId to set as the chainId from EIP155
* ledgerConnectionType: Environment in which you wish to connect to Ledger (nodejs or browser)
* derivationPath: Initial derivation path to use e.g 44'/60'/0'
@@ -40,20 +42,33 @@ export type LedgerEthereumClientFactoryAsync = () => Promise<LedgerEthereumClien
export interface LedgerSubproviderConfigs {
networkId: number;
ledgerEthereumClientFactoryAsync: LedgerEthereumClientFactoryAsync;
- derivationPath?: string;
+ baseDerivationPath?: string;
accountFetchingConfigs?: AccountFetchingConfigs;
}
-/*
+/**
+ * addressSearchLimit: The maximum number of addresses to search through, defaults to 1000
* numAddressesToReturn: Number of addresses to return from 'eth_accounts' call
* shouldAskForOnDeviceConfirmation: Whether you wish to prompt the user on their Ledger
* before fetching their addresses
*/
export interface AccountFetchingConfigs {
+ addressSearchLimit?: number;
numAddressesToReturn?: number;
shouldAskForOnDeviceConfirmation?: boolean;
}
+/**
+ * mnemonic: The string mnemonic seed
+ * addressSearchLimit: The maximum number of addresses to search through, defaults to 1000
+ * baseDerivationPath: The base derivation path (e.g 44'/60'/0'/0)
+ */
+export interface MnemonicWalletSubproviderConfigs {
+ mnemonic: string;
+ addressSearchLimit?: number;
+ baseDerivationPath?: string;
+}
+
export interface SignatureData {
hash: string;
r: string;
@@ -67,18 +82,12 @@ export interface LedgerGetAddressResult {
chainCode: string;
}
-export interface LedgerWalletSubprovider {
- getPath: () => string;
- setPath: (path: string) => void;
- setPathIndex: (pathIndex: number) => void;
-}
-
export interface PartialTxParams {
nonce: string;
gasPrice?: string;
gas: string;
to: string;
- from?: string;
+ from: string;
value?: string;
data?: string;
chainId: number; // EIP 155 chainId - mainnet: 1, ropsten: 3
@@ -95,11 +104,14 @@ export interface ResponseWithTxParams {
tx: PartialTxParams;
}
-export enum LedgerSubproviderErrors {
- TooOldLedgerFirmware = 'TOO_OLD_LEDGER_FIRMWARE',
- FromAddressMissingOrInvalid = 'FROM_ADDRESS_MISSING_OR_INVALID',
+export enum WalletSubproviderErrors {
+ AddressNotFound = 'ADDRESS_NOT_FOUND',
DataMissingForSignPersonalMessage = 'DATA_MISSING_FOR_SIGN_PERSONAL_MESSAGE',
SenderInvalidOrNotSupplied = 'SENDER_INVALID_OR_NOT_SUPPLIED',
+ FromAddressMissingOrInvalid = 'FROM_ADDRESS_MISSING_OR_INVALID',
+}
+export enum LedgerSubproviderErrors {
+ TooOldLedgerFirmware = 'TOO_OLD_LEDGER_FIRMWARE',
MultipleOpenConnectionsDisallowed = 'MULTIPLE_OPEN_CONNECTIONS_DISALLOWED',
}
@@ -107,6 +119,12 @@ export enum NonceSubproviderErrors {
EmptyParametersFound = 'EMPTY_PARAMETERS_FOUND',
CannotDetermineAddressFromPayload = 'CANNOT_DETERMINE_ADDRESS_FROM_PAYLOAD',
}
+export interface DerivedHDKeyInfo {
+ address: string;
+ baseDerivationPath: string;
+ derivationPath: string;
+ hdKey: HDNode;
+}
export type ErrorCallback = (err: Error | null, data?: any) => void;
export type Callback = () => void;
diff --git a/packages/subproviders/src/utils/subprovider_utils.ts b/packages/subproviders/src/utils/subprovider_utils.ts
new file mode 100644
index 000000000..beda408ab
--- /dev/null
+++ b/packages/subproviders/src/utils/subprovider_utils.ts
@@ -0,0 +1,15 @@
+import Web3ProviderEngine = require('web3-provider-engine');
+
+import { Subprovider } from '../subproviders/subprovider';
+
+/**
+ * Prepends a subprovider to a provider
+ * @param provider Given provider
+ * @param subprovider Subprovider to prepend
+ */
+export function prependSubprovider(provider: Web3ProviderEngine, subprovider: Subprovider): void {
+ subprovider.setEngine(provider);
+ // HACK: We use implementation details of provider engine here
+ // https://github.com/MetaMask/provider-engine/blob/master/index.js#L68
+ (provider as any)._providers = [subprovider, ...(provider as any)._providers];
+}
diff --git a/packages/subproviders/src/utils/wallet_utils.ts b/packages/subproviders/src/utils/wallet_utils.ts
new file mode 100644
index 000000000..4c233645b
--- /dev/null
+++ b/packages/subproviders/src/utils/wallet_utils.ts
@@ -0,0 +1,78 @@
+import ethUtil = require('ethereumjs-util');
+import HDNode = require('hdkey');
+
+import { DerivedHDKeyInfo } from '../types';
+
+const DEFAULT_ADDRESS_SEARCH_LIMIT = 1000;
+
+class DerivedHDKeyInfoIterator implements IterableIterator<DerivedHDKeyInfo> {
+ private readonly _parentDerivedKeyInfo: DerivedHDKeyInfo;
+ private readonly _searchLimit: number;
+ private _index: number;
+
+ constructor(initialDerivedKey: DerivedHDKeyInfo, searchLimit: number = DEFAULT_ADDRESS_SEARCH_LIMIT) {
+ this._searchLimit = searchLimit;
+ this._parentDerivedKeyInfo = initialDerivedKey;
+ this._index = 0;
+ }
+
+ public next(): IteratorResult<DerivedHDKeyInfo> {
+ const baseDerivationPath = this._parentDerivedKeyInfo.baseDerivationPath;
+ const derivationIndex = this._index;
+ const fullDerivationPath = `m/${baseDerivationPath}/${derivationIndex}`;
+ const path = `m/${derivationIndex}`;
+ const hdKey = this._parentDerivedKeyInfo.hdKey.derive(path);
+ const address = walletUtils.addressOfHDKey(hdKey);
+ const derivedKey: DerivedHDKeyInfo = {
+ address,
+ hdKey,
+ baseDerivationPath,
+ derivationPath: fullDerivationPath,
+ };
+ const isDone = this._index === this._searchLimit;
+ this._index++;
+ return {
+ done: isDone,
+ value: derivedKey,
+ };
+ }
+
+ public [Symbol.iterator](): IterableIterator<DerivedHDKeyInfo> {
+ return this;
+ }
+}
+
+export const walletUtils = {
+ calculateDerivedHDKeyInfos(parentDerivedKeyInfo: DerivedHDKeyInfo, numberOfKeys: number): DerivedHDKeyInfo[] {
+ const derivedKeys: DerivedHDKeyInfo[] = [];
+ const derivedKeyIterator = new DerivedHDKeyInfoIterator(parentDerivedKeyInfo, numberOfKeys);
+ for (const key of derivedKeyIterator) {
+ derivedKeys.push(key);
+ }
+ return derivedKeys;
+ },
+ findDerivedKeyInfoForAddressIfExists(
+ address: string,
+ parentDerivedKeyInfo: DerivedHDKeyInfo,
+ searchLimit: number,
+ ): DerivedHDKeyInfo | undefined {
+ let matchedKey: DerivedHDKeyInfo | undefined;
+ const derivedKeyIterator = new DerivedHDKeyInfoIterator(parentDerivedKeyInfo, searchLimit);
+ for (const key of derivedKeyIterator) {
+ if (key.address === address) {
+ matchedKey = key;
+ break;
+ }
+ }
+ return matchedKey;
+ },
+ addressOfHDKey(hdKey: HDNode): string {
+ const shouldSanitizePublicKey = true;
+ const derivedPublicKey = hdKey.publicKey;
+ const ethereumAddressUnprefixed = ethUtil
+ .publicToAddress(derivedPublicKey, shouldSanitizePublicKey)
+ .toString('hex');
+ const address = ethUtil.addHexPrefix(ethereumAddressUnprefixed).toLowerCase();
+ return address;
+ },
+};
diff --git a/packages/subproviders/test/chai_setup.ts b/packages/subproviders/test/chai_setup.ts
index a281bab6c..6c24dc222 100644
--- a/packages/subproviders/test/chai_setup.ts
+++ b/packages/subproviders/test/chai_setup.ts
@@ -3,7 +3,7 @@ import chaiAsPromised = require('chai-as-promised');
import * as dirtyChai from 'dirty-chai';
export const chaiSetup = {
- configure() {
+ configure(): void {
chai.config.includeStack = true;
chai.use(dirtyChai);
chai.use(chaiAsPromised);
diff --git a/packages/subproviders/test/integration/ledger_subprovider_test.ts b/packages/subproviders/test/integration/ledger_subprovider_test.ts
index 969081ad5..527ee5b22 100644
--- a/packages/subproviders/test/integration/ledger_subprovider_test.ts
+++ b/packages/subproviders/test/integration/ledger_subprovider_test.ts
@@ -1,23 +1,23 @@
-import { JSONRPCResponsePayload } from '@0xproject/types';
+import { DoneCallback } from '@0xproject/types';
+import { promisify } from '@0xproject/utils';
import Eth from '@ledgerhq/hw-app-eth';
-// HACK: This depdency is optional and tslint skips optional depdencies
+// HACK: This dependency is optional and tslint skips optional dependencies
// tslint:disable-next-line:no-implicit-dependencies
import TransportNodeHid from '@ledgerhq/hw-transport-node-hid';
import * as chai from 'chai';
-import promisify = require('es6-promisify');
+import { JSONRPCResponsePayload } from 'ethereum-types';
import * as ethUtils from 'ethereumjs-util';
-import * as _ from 'lodash';
-import Web3 = require('web3');
-import Web3ProviderEngine = require('web3-provider-engine');
-import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
-import { LedgerSubprovider } from '../../src';
-import { DoneCallback, LedgerEthereumClient } from '../../src/types';
+import { LedgerSubprovider, RPCSubprovider, Web3ProviderEngine } from '../../src';
+import { LedgerEthereumClient } from '../../src/types';
import { chaiSetup } from '../chai_setup';
+import { fixtureData } from '../utils/fixture_data';
import { reportCallbackErrors } from '../utils/report_callback_errors';
chaiSetup.configure();
const expect = chai.expect;
+const DEFAULT_NUM_ACCOUNTS = 10;
+const EXPECTED_SIGNATURE_LENGTH = 132;
async function ledgerEthereumNodeJsClientFactoryAsync(): Promise<LedgerEthereumClient> {
const ledgerConnection = await TransportNodeHid.create();
@@ -25,28 +25,26 @@ async function ledgerEthereumNodeJsClientFactoryAsync(): Promise<LedgerEthereumC
return ledgerEthClient;
}
-const TESTRPC_DERIVATION_PATH = `m/44'/60'/0'/0`;
-const TEST_RPC_ACCOUNT_0 = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
-
describe('LedgerSubprovider', () => {
let ledgerSubprovider: LedgerSubprovider;
- const networkId: number = 42;
+ const networkId: number = fixtureData.NETWORK_ID;
before(async () => {
ledgerSubprovider = new LedgerSubprovider({
networkId,
ledgerEthereumClientFactoryAsync: ledgerEthereumNodeJsClientFactoryAsync,
- derivationPath: TESTRPC_DERIVATION_PATH,
+ baseDerivationPath: fixtureData.TESTRPC_BASE_DERIVATION_PATH,
});
});
describe('direct method calls', () => {
it('returns default number of accounts', async () => {
const accounts = await ledgerSubprovider.getAccountsAsync();
expect(accounts[0]).to.not.be.an('undefined');
- expect(accounts.length).to.be.equal(10);
+ expect(accounts.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
});
- it('returns the expected first account from a ledger set up with the test mnemonic', async () => {
+ it('returns the expected accounts from a ledger set up with the test mnemonic', async () => {
const accounts = await ledgerSubprovider.getAccountsAsync();
- expect(accounts[0]).to.be.equal(TEST_RPC_ACCOUNT_0);
+ expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(accounts[1]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_1);
});
it('returns requested number of accounts', async () => {
const numberOfAccounts = 20;
@@ -55,24 +53,29 @@ describe('LedgerSubprovider', () => {
expect(accounts.length).to.be.equal(numberOfAccounts);
});
it('signs a personal message', async () => {
- const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world'));
- const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data);
- expect(ecSignatureHex.length).to.be.equal(132);
- expect(ecSignatureHex.substr(0, 2)).to.be.equal('0x');
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(
+ data,
+ fixtureData.TEST_RPC_ACCOUNT_0,
+ );
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
});
- it('signs a transaction', async () => {
- const tx = {
- nonce: '0x00',
- gas: '0x2710',
- to: '0x0000000000000000000000000000000000000000',
- value: '0x00',
- chainId: 3,
- from: TEST_RPC_ACCOUNT_0,
- };
- const txHex = await ledgerSubprovider.signTransactionAsync(tx);
- expect(txHex).to.be.equal(
- '0xf85f8080822710940000000000000000000000000000000000000000808078a0712854c73c69445cc1b22a7c3d7312ff9a97fe4ffba35fd636e8236b211b6e7ca0647cee031615e52d916c7c707025bc64ad525d8f1b9876c3435a863b42743178',
+ it('signs a personal message with second address', async () => {
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(
+ data,
+ fixtureData.TEST_RPC_ACCOUNT_1,
);
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_ACCOUNT_1_SIGNED_RESULT);
+ });
+ it('signs a transaction', async () => {
+ const txHex = await ledgerSubprovider.signTransactionAsync(fixtureData.TX_DATA);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ });
+ it('signs a transaction with the second address', async () => {
+ const txData = { ...fixtureData.TX_DATA, from: fixtureData.TEST_RPC_ACCOUNT_1 };
+ const txHex = await ledgerSubprovider.signTransactionAsync(txData);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_ACCOUNT_1_SIGNED_RESULT);
});
});
describe('calls through a provider', () => {
@@ -81,9 +84,7 @@ describe('LedgerSubprovider', () => {
before(() => {
ledgerProvider = new Web3ProviderEngine();
ledgerProvider.addProvider(ledgerSubprovider);
- const httpProvider = new RpcSubprovider({
- rpcUrl: 'http://localhost:8545',
- });
+ const httpProvider = new RPCSubprovider('http://localhost:8545');
ledgerProvider.addProvider(httpProvider);
ledgerProvider.start();
@@ -100,7 +101,7 @@ describe('LedgerSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(10);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
done();
});
ledgerProvider.sendAsync(payload, callback);
@@ -118,7 +119,7 @@ describe('LedgerSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(132);
+ expect(response.result.length).to.be.equal(EXPECTED_SIGNATURE_LENGTH);
expect(response.result.substr(0, 2)).to.be.equal('0x');
done();
});
@@ -138,7 +139,7 @@ describe('LedgerSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(132);
+ expect(response.result.length).to.be.equal(EXPECTED_SIGNATURE_LENGTH);
expect(response.result.substr(0, 2)).to.be.equal('0x');
done();
});
@@ -146,20 +147,15 @@ describe('LedgerSubprovider', () => {
})().catch(done);
});
it('signs a transaction', (done: DoneCallback) => {
- const tx = {
- to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66',
- value: '0x00',
- };
const payload = {
jsonrpc: '2.0',
method: 'eth_signTransaction',
- params: [tx],
+ params: [fixtureData.TX_DATA],
id: 1,
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.raw.length).to.be.equal(206);
- expect(response.result.raw.substr(0, 2)).to.be.equal('0x');
+ expect(response.result.raw).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
done();
});
ledgerProvider.sendAsync(payload, callback);
@@ -171,7 +167,7 @@ describe('LedgerSubprovider', () => {
// Give first account on Ledger sufficient ETH to complete tx send
let tx = {
to: accounts[0],
- from: TEST_RPC_ACCOUNT_0,
+ from: fixtureData.TEST_RPC_ACCOUNT_0,
value: '0x8ac7230489e80000', // 10 ETH
};
let payload = {
@@ -180,7 +176,7 @@ describe('LedgerSubprovider', () => {
params: [tx],
id: 1,
};
- await promisify(defaultProvider.sendAsync, defaultProvider)(payload);
+ await promisify(defaultProvider.sendAsync.bind(defaultProvider))(payload);
// Send transaction from Ledger
tx = {
@@ -197,7 +193,8 @@ describe('LedgerSubprovider', () => {
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
const result = response.result;
- expect(result.length).to.be.equal(66);
+ const signedTxLength = 66;
+ expect(result.length).to.be.equal(signedTxLength);
expect(result.substr(0, 2)).to.be.equal('0x');
done();
});
diff --git a/packages/subproviders/test/unit/eth_lightwallet_subprovider_test.ts b/packages/subproviders/test/unit/eth_lightwallet_subprovider_test.ts
new file mode 100644
index 000000000..063817a95
--- /dev/null
+++ b/packages/subproviders/test/unit/eth_lightwallet_subprovider_test.ts
@@ -0,0 +1,166 @@
+import * as chai from 'chai';
+import * as lightwallet from 'eth-lightwallet';
+import { JSONRPCResponsePayload } from 'ethereum-types';
+import * as ethUtils from 'ethereumjs-util';
+
+import { EthLightwalletSubprovider, Web3ProviderEngine } from '../../src';
+import { DoneCallback } from '../../src/types';
+import { chaiSetup } from '../chai_setup';
+import { fixtureData } from '../utils/fixture_data';
+import { ganacheSubprovider } from '../utils/ganache_subprovider';
+import { reportCallbackErrors } from '../utils/report_callback_errors';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+const DEFAULT_NUM_ACCOUNTS = 10;
+const PASSWORD = 'supersecretpassword99';
+const SALT = 'kvODghzs7Ff1uqHyI0P3wI4Hso4w4iWT2e9qmrWz0y4';
+
+describe('EthLightwalletSubprovider', () => {
+ let ethLightwalletSubprovider: EthLightwalletSubprovider;
+ before(async () => {
+ const options = {
+ password: PASSWORD,
+ seedPhrase: fixtureData.TEST_RPC_MNEMONIC,
+ salt: SALT,
+ hdPathString: fixtureData.TESTRPC_BASE_DERIVATION_PATH,
+ };
+ const createVaultAsync = async (vaultOptions: lightwallet.VaultOptions) => {
+ return new Promise<lightwallet.keystore>(resolve => {
+ lightwallet.keystore.createVault(vaultOptions, (err: Error, vaultKeystore) => {
+ if (err) {
+ throw new Error(`Failed to createVault: ${err}`);
+ }
+ resolve(vaultKeystore);
+ });
+ });
+ };
+ const deriveKeyFromPasswordAsync = async (vaultKeystore: lightwallet.keystore) => {
+ return new Promise<Uint8Array>(resolve => {
+ vaultKeystore.keyFromPassword(PASSWORD, (err: Error, passwordDerivedKey: Uint8Array) => {
+ if (err) {
+ throw new Error(`Failed to get key from password: ${err}`);
+ }
+ resolve(passwordDerivedKey);
+ });
+ });
+ };
+ const keystore: lightwallet.keystore = await createVaultAsync(options);
+ const pwDerivedKey: Uint8Array = await deriveKeyFromPasswordAsync(keystore);
+
+ // Generate 10 addresses
+ keystore.generateNewAddress(pwDerivedKey, DEFAULT_NUM_ACCOUNTS);
+
+ ethLightwalletSubprovider = new EthLightwalletSubprovider(keystore, pwDerivedKey);
+ });
+ describe('direct method calls', () => {
+ describe('success cases', () => {
+ it('returns a list of accounts', async () => {
+ const accounts = await ethLightwalletSubprovider.getAccountsAsync();
+ expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(accounts[1]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_1);
+ expect(accounts.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
+ });
+ it('signs a personal message hash', async () => {
+ const accounts = await ethLightwalletSubprovider.getAccountsAsync();
+ const signingAccount = accounts[0];
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await ethLightwalletSubprovider.signPersonalMessageAsync(data, signingAccount);
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ });
+ it('signs a transaction', async () => {
+ const txHex = await ethLightwalletSubprovider.signTransactionAsync(fixtureData.TX_DATA);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ });
+ });
+ });
+ describe('calls through a provider', () => {
+ let provider: Web3ProviderEngine;
+ before(() => {
+ provider = new Web3ProviderEngine();
+ provider.addProvider(ethLightwalletSubprovider);
+ provider.addProvider(ganacheSubprovider);
+ provider.start();
+ });
+ describe('success cases', () => {
+ it('returns a list of accounts', (done: DoneCallback) => {
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_accounts',
+ params: [],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a personal message hash with eth_sign', (done: DoneCallback) => {
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const account = fixtureData.TEST_RPC_ACCOUNT_0;
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [account, data],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a transaction', (done: DoneCallback) => {
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_signTransaction',
+ params: [fixtureData.TX_DATA],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result.raw).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ describe('failure cases', () => {
+ it('should throw if `data` param not hex when calling eth_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [fixtureData.TEST_RPC_ACCOUNT_0, nonHexMessage],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `data` param not hex when calling personal_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [nonHexMessage, fixtureData.TEST_RPC_ACCOUNT_0],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ });
+});
diff --git a/packages/subproviders/test/unit/ledger_subprovider_test.ts b/packages/subproviders/test/unit/ledger_subprovider_test.ts
index 3cb487f02..a1d146dbc 100644
--- a/packages/subproviders/test/unit/ledger_subprovider_test.ts
+++ b/packages/subproviders/test/unit/ledger_subprovider_test.ts
@@ -1,19 +1,24 @@
-import { JSONRPCResponsePayload } from '@0xproject/types';
import * as chai from 'chai';
+import { JSONRPCResponsePayload } from 'ethereum-types';
import * as ethUtils from 'ethereumjs-util';
import * as _ from 'lodash';
-import Web3 = require('web3');
-import Web3ProviderEngine = require('web3-provider-engine');
-import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
-import { LedgerSubprovider } from '../../src';
-import { DoneCallback, LedgerCommunicationClient, LedgerSubproviderErrors } from '../../src/types';
+import { LedgerSubprovider, Web3ProviderEngine } from '../../src';
+import {
+ DoneCallback,
+ LedgerCommunicationClient,
+ LedgerSubproviderErrors,
+ WalletSubproviderErrors,
+} from '../../src/types';
import { chaiSetup } from '../chai_setup';
+import { fixtureData } from '../utils/fixture_data';
+import { ganacheSubprovider } from '../utils/ganache_subprovider';
import { reportCallbackErrors } from '../utils/report_callback_errors';
chaiSetup.configure();
const expect = chai.expect;
const FAKE_ADDRESS = '0xb088a3bc93f71b4de97b9de773e9647645983688';
+const DEFAULT_NUM_ACCOUNTS = 10;
describe('LedgerSubprovider', () => {
const networkId: number = 42;
@@ -41,7 +46,7 @@ describe('LedgerSubprovider', () => {
};
return ecSignature;
},
- signTransaction: async (derivationPath: string, txHex: string) => {
+ signTransaction: async (_derivationPath: string, _txHex: string) => {
const ecSignature = {
v: '77',
r: '88a95ef1378487bc82be558e82c8478baf840c545d5b887536bb1da63673a98b',
@@ -50,7 +55,7 @@ describe('LedgerSubprovider', () => {
return ecSignature;
},
transport: {
- close: _.noop,
+ close: _.noop.bind(_),
} as LedgerCommunicationClient,
};
// tslint:enable:no-object-literal-type-assertion
@@ -66,7 +71,7 @@ describe('LedgerSubprovider', () => {
it('returns default number of accounts', async () => {
const accounts = await ledgerSubprovider.getAccountsAsync();
expect(accounts[0]).to.be.equal(FAKE_ADDRESS);
- expect(accounts.length).to.be.equal(10);
+ expect(accounts.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
});
it('returns requested number of accounts', async () => {
const numberOfAccounts = 20;
@@ -75,8 +80,8 @@ describe('LedgerSubprovider', () => {
expect(accounts.length).to.be.equal(numberOfAccounts);
});
it('signs a personal message', async () => {
- const data = ethUtils.bufferToHex(ethUtils.toBuffer('hello world'));
- const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data);
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await ledgerSubprovider.signPersonalMessageAsync(data, FAKE_ADDRESS);
expect(ecSignatureHex).to.be.equal(
'0xa6cc284bff14b42bdf5e9286730c152be91719d478605ec46b3bebcd0ae491480652a1a7b742ceb0213d1e744316e285f41f878d8af0b8e632cbca4c279132d001',
);
@@ -88,7 +93,7 @@ describe('LedgerSubprovider', () => {
return expect(
Promise.all([
ledgerSubprovider.getAccountsAsync(),
- ledgerSubprovider.signPersonalMessageAsync(data),
+ ledgerSubprovider.signPersonalMessageAsync(data, FAKE_ADDRESS),
]),
).to.be.rejectedWith(LedgerSubproviderErrors.MultipleOpenConnectionsDisallowed);
});
@@ -99,10 +104,7 @@ describe('LedgerSubprovider', () => {
before(() => {
provider = new Web3ProviderEngine();
provider.addProvider(ledgerSubprovider);
- const httpProvider = new RpcSubprovider({
- rpcUrl: 'http://localhost:8545',
- });
- provider.addProvider(httpProvider);
+ provider.addProvider(ganacheSubprovider);
provider.start();
});
describe('success cases', () => {
@@ -115,7 +117,7 @@ describe('LedgerSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(10);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
expect(response.result[0]).to.be.equal(FAKE_ADDRESS);
done();
});
@@ -126,7 +128,7 @@ describe('LedgerSubprovider', () => {
const payload = {
jsonrpc: '2.0',
method: 'eth_sign',
- params: ['0x0000000000000000000000000000000000000000', messageHex],
+ params: [FAKE_ADDRESS, messageHex],
id: 1,
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
@@ -139,11 +141,11 @@ describe('LedgerSubprovider', () => {
provider.sendAsync(payload, callback);
});
it('signs a personal message with personal_sign', (done: DoneCallback) => {
- const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer('hello world'));
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
const payload = {
jsonrpc: '2.0',
method: 'personal_sign',
- params: [messageHex, '0x0000000000000000000000000000000000000000'],
+ params: [messageHex, FAKE_ADDRESS],
id: 1,
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
@@ -162,6 +164,7 @@ describe('LedgerSubprovider', () => {
gasPrice: '0x00',
nonce: '0x00',
gas: '0x00',
+ from: FAKE_ADDRESS,
};
const payload = {
jsonrpc: '2.0',
@@ -171,7 +174,8 @@ describe('LedgerSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.raw.length).to.be.equal(192);
+ const rawTxLength = 192;
+ expect(response.result.raw.length).to.be.equal(rawTxLength);
expect(response.result.raw.substr(0, 2)).to.be.equal('0x');
done();
});
@@ -184,10 +188,10 @@ describe('LedgerSubprovider', () => {
const payload = {
jsonrpc: '2.0',
method: 'eth_sign',
- params: ['0x0000000000000000000000000000000000000000', nonHexMessage],
+ params: [FAKE_ADDRESS, nonHexMessage],
id: 1,
};
- const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
expect(err).to.not.be.a('null');
expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
done();
@@ -199,10 +203,10 @@ describe('LedgerSubprovider', () => {
const payload = {
jsonrpc: '2.0',
method: 'personal_sign',
- params: [nonHexMessage, '0x0000000000000000000000000000000000000000'],
+ params: [nonHexMessage, FAKE_ADDRESS],
id: 1,
};
- const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
expect(err).to.not.be.a('null');
expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
done();
@@ -220,9 +224,9 @@ describe('LedgerSubprovider', () => {
params: [tx],
id: 1,
};
- const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
expect(err).to.not.be.a('null');
- expect(err.message).to.be.equal(LedgerSubproviderErrors.SenderInvalidOrNotSupplied);
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
done();
});
provider.sendAsync(payload, callback);
@@ -239,9 +243,9 @@ describe('LedgerSubprovider', () => {
params: [tx],
id: 1,
};
- const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
expect(err).to.not.be.a('null');
- expect(err.message).to.be.equal(LedgerSubproviderErrors.SenderInvalidOrNotSupplied);
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
done();
});
provider.sendAsync(payload, callback);
diff --git a/packages/subproviders/test/unit/mnemonic_wallet_subprovider_test.ts b/packages/subproviders/test/unit/mnemonic_wallet_subprovider_test.ts
new file mode 100644
index 000000000..f2bdda3cd
--- /dev/null
+++ b/packages/subproviders/test/unit/mnemonic_wallet_subprovider_test.ts
@@ -0,0 +1,209 @@
+import * as chai from 'chai';
+import { JSONRPCResponsePayload } from 'ethereum-types';
+import * as ethUtils from 'ethereumjs-util';
+
+import { GanacheSubprovider, MnemonicWalletSubprovider, Web3ProviderEngine } from '../../src/';
+import { DoneCallback, WalletSubproviderErrors } from '../../src/types';
+import { chaiSetup } from '../chai_setup';
+import { fixtureData } from '../utils/fixture_data';
+import { reportCallbackErrors } from '../utils/report_callback_errors';
+
+chaiSetup.configure();
+const expect = chai.expect;
+const DEFAULT_NUM_ACCOUNTS = 10;
+
+describe('MnemonicWalletSubprovider', () => {
+ let subprovider: MnemonicWalletSubprovider;
+ before(async () => {
+ subprovider = new MnemonicWalletSubprovider({
+ mnemonic: fixtureData.TEST_RPC_MNEMONIC,
+ baseDerivationPath: fixtureData.TEST_RPC_MNEMONIC_BASE_DERIVATION_PATH,
+ });
+ });
+ describe('direct method calls', () => {
+ describe('success cases', () => {
+ it('returns the accounts', async () => {
+ const accounts = await subprovider.getAccountsAsync();
+ expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(accounts[1]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_1);
+ expect(accounts.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
+ });
+ it('signs a personal message', async () => {
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await subprovider.signPersonalMessageAsync(data, fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ });
+ it('signs a personal message with second address', async () => {
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await subprovider.signPersonalMessageAsync(data, fixtureData.TEST_RPC_ACCOUNT_1);
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_ACCOUNT_1_SIGNED_RESULT);
+ });
+ it('signs a transaction', async () => {
+ const txHex = await subprovider.signTransactionAsync(fixtureData.TX_DATA);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ });
+ it('signs a transaction with the second address', async () => {
+ const txData = { ...fixtureData.TX_DATA, from: fixtureData.TEST_RPC_ACCOUNT_1 };
+ const txHex = await subprovider.signTransactionAsync(txData);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_ACCOUNT_1_SIGNED_RESULT);
+ });
+ });
+ describe('failure cases', () => {
+ it('throws an error if address is invalid ', async () => {
+ const txData = { ...fixtureData.TX_DATA, from: '0x0' };
+ return expect(subprovider.signTransactionAsync(txData)).to.be.rejectedWith(
+ WalletSubproviderErrors.FromAddressMissingOrInvalid,
+ );
+ });
+ it('throws an error if address is valid format but not found', async () => {
+ const txData = { ...fixtureData.TX_DATA, from: fixtureData.NULL_ADDRESS };
+ return expect(subprovider.signTransactionAsync(txData)).to.be.rejectedWith(
+ `${WalletSubproviderErrors.AddressNotFound}: ${fixtureData.NULL_ADDRESS}`,
+ );
+ });
+ });
+ });
+ describe('calls through a provider', () => {
+ let provider: Web3ProviderEngine;
+ before(() => {
+ provider = new Web3ProviderEngine();
+ provider.addProvider(subprovider);
+ const ganacheSubprovider = new GanacheSubprovider({});
+ provider.addProvider(ganacheSubprovider);
+ provider.start();
+ });
+ describe('success cases', () => {
+ it('returns a list of accounts', (done: DoneCallback) => {
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_accounts',
+ params: [],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a personal message with eth_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [fixtureData.TEST_RPC_ACCOUNT_0, messageHex],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a personal message with personal_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [messageHex, fixtureData.TEST_RPC_ACCOUNT_0],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ describe('failure cases', () => {
+ it('should throw if `data` param not hex when calling eth_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [fixtureData.TEST_RPC_ACCOUNT_0, nonHexMessage],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `data` param not hex when calling personal_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [nonHexMessage, fixtureData.TEST_RPC_ACCOUNT_0],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `address` param not found when calling personal_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [messageHex, fixtureData.NULL_ADDRESS],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(
+ `${WalletSubproviderErrors.AddressNotFound}: ${fixtureData.NULL_ADDRESS}`,
+ );
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `from` param missing when calling eth_sendTransaction', (done: DoneCallback) => {
+ const tx = {
+ to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66',
+ value: '0xde0b6b3a7640000',
+ };
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sendTransaction',
+ params: [tx],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `from` param invalid address when calling eth_sendTransaction', (done: DoneCallback) => {
+ const tx = {
+ to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66',
+ from: '0xIncorrectEthereumAddress',
+ value: '0xde0b6b3a7640000',
+ };
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sendTransaction',
+ params: [tx],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ });
+});
diff --git a/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts b/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
index 14176c145..05f213cf5 100644
--- a/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
+++ b/packages/subproviders/test/unit/nonce_tracker_subprovider_test.ts
@@ -1,14 +1,10 @@
import * as chai from 'chai';
-import * as fs from 'fs';
-import * as _ from 'lodash';
-import * as path from 'path';
-import Web3ProviderEngine = require('web3-provider-engine');
import FixtureSubprovider = require('web3-provider-engine/subproviders/fixture');
import { promisify } from '@0xproject/utils';
import EthereumTx = require('ethereumjs-tx');
-import { NonceTrackerSubprovider } from '../../src';
+import { NonceTrackerSubprovider, Web3ProviderEngine } from '../../src';
import { chaiSetup } from '../chai_setup';
const expect = chai.expect;
@@ -39,11 +35,11 @@ describe('NonceTrackerSubprovider', () => {
'0x5e1d3a76fbf824220eafc8c79ad578ad2b67d01b0c2425eb1f1347e8f50882ab',
'0x5bd428537f05f9830e93792f90ea6a3e2d1ee84952dd96edbae9f658f831ab13',
];
- function createFixtureSubprovider() {
+ function createFixtureSubprovider(): FixtureSubprovider {
let isFirstGetTransactionCount = true;
const fixedBlockNumberAndTransactionCountProvider = new FixtureSubprovider({
eth_getBlockByNumber: '0x01',
- eth_getTransactionCount: (data: any, next: any, end: any) => {
+ eth_getTransactionCount: (_data: any, _next: any, end: any) => {
// For testing caching we return different results on the second call
if (isFirstGetTransactionCount) {
isFirstGetTransactionCount = false;
@@ -64,9 +60,9 @@ describe('NonceTrackerSubprovider', () => {
const payload = { ...getTransactionCountPayload, params: ['0x0', 'pending'] };
- const response = await promisify<any>(provider.sendAsync, provider)(payload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(payload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(secondResponse.result).to.be.eq('0x00');
});
it('does not cache the result for latest transaction count', async () => {
@@ -78,9 +74,9 @@ describe('NonceTrackerSubprovider', () => {
const payload = { ...getTransactionCountPayload, params: ['0x0', 'latest'] };
- const response = await promisify<any>(provider.sendAsync, provider)(payload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(payload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(payload);
expect(secondResponse.result).to.be.eq('0x99');
});
it('clears the cache on a Nonce Too Low Error', async () => {
@@ -90,7 +86,7 @@ describe('NonceTrackerSubprovider', () => {
provider.addProvider(createFixtureSubprovider());
provider.addProvider(
new FixtureSubprovider({
- eth_sendRawTransaction: (data: any, next: any, end: any) => {
+ eth_sendRawTransaction: (_data: any, _next: any, end: any) => {
end(new Error('Transaction nonce is too low'));
},
}),
@@ -107,14 +103,14 @@ describe('NonceTrackerSubprovider', () => {
params: [transaction.serialize()],
};
- const response = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(secondResponse.result).to.be.eq('0x00');
try {
- await promisify(provider.sendAsync, provider)(txPayload);
+ await promisify(provider.sendAsync.bind(provider))(txPayload);
} catch (err) {
- const thirdResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const thirdResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(thirdResponse.result).to.be.eq('0x99');
}
});
@@ -125,7 +121,7 @@ describe('NonceTrackerSubprovider', () => {
provider.addProvider(createFixtureSubprovider());
provider.addProvider(
new FixtureSubprovider({
- eth_sendRawTransaction: (data: any, next: any, end: any) => {
+ eth_sendRawTransaction: (_data: any, _next: any, end: any) => {
end(null);
},
}),
@@ -142,12 +138,12 @@ describe('NonceTrackerSubprovider', () => {
params: [transaction.serialize()],
};
- const response = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const response = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(response.result).to.be.eq('0x00');
- const secondResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ const secondResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(secondResponse.result).to.be.eq('0x00');
- await promisify(provider.sendAsync, provider)(txPayload);
- const thirdResponse = await promisify<any>(provider.sendAsync, provider)(noncePayload);
+ await promisify(provider.sendAsync.bind(provider))(txPayload);
+ const thirdResponse = await promisify<any>(provider.sendAsync.bind(provider))(noncePayload);
expect(thirdResponse.result).to.be.eq('0x01');
});
});
diff --git a/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts
new file mode 100644
index 000000000..95773145f
--- /dev/null
+++ b/packages/subproviders/test/unit/private_key_wallet_subprovider_test.ts
@@ -0,0 +1,211 @@
+import * as chai from 'chai';
+import { JSONRPCResponsePayload } from 'ethereum-types';
+import * as ethUtils from 'ethereumjs-util';
+
+import { GanacheSubprovider, PrivateKeyWalletSubprovider, Web3ProviderEngine } from '../../src/';
+import { DoneCallback, WalletSubproviderErrors } from '../../src/types';
+import { chaiSetup } from '../chai_setup';
+import { fixtureData } from '../utils/fixture_data';
+import { reportCallbackErrors } from '../utils/report_callback_errors';
+
+chaiSetup.configure();
+const expect = chai.expect;
+
+describe('PrivateKeyWalletSubprovider', () => {
+ let subprovider: PrivateKeyWalletSubprovider;
+ before(async () => {
+ subprovider = new PrivateKeyWalletSubprovider(fixtureData.TEST_RPC_ACCOUNT_0_ACCOUNT_PRIVATE_KEY);
+ });
+ describe('direct method calls', () => {
+ describe('success cases', () => {
+ it('returns the account', async () => {
+ const accounts = await subprovider.getAccountsAsync();
+ expect(accounts[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(accounts.length).to.be.equal(1);
+ });
+ it('signs a personal message', async () => {
+ const data = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const ecSignatureHex = await subprovider.signPersonalMessageAsync(data, fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(ecSignatureHex).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ });
+ it('signs a transaction', async () => {
+ const txHex = await subprovider.signTransactionAsync(fixtureData.TX_DATA);
+ expect(txHex).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ });
+ });
+ });
+ describe('calls through a provider', () => {
+ let provider: Web3ProviderEngine;
+ before(() => {
+ provider = new Web3ProviderEngine();
+ provider.addProvider(subprovider);
+ const ganacheSubprovider = new GanacheSubprovider({});
+ provider.addProvider(ganacheSubprovider);
+ provider.start();
+ });
+ describe('success cases', () => {
+ it('returns a list of accounts', (done: DoneCallback) => {
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_accounts',
+ params: [],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result[0]).to.be.equal(fixtureData.TEST_RPC_ACCOUNT_0);
+ expect(response.result.length).to.be.equal(1);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a transaction', (done: DoneCallback) => {
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_signTransaction',
+ params: [fixtureData.TX_DATA],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result.raw).to.be.equal(fixtureData.TX_DATA_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a personal message with eth_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [fixtureData.TEST_RPC_ACCOUNT_0, messageHex],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('signs a personal message with personal_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [messageHex, fixtureData.TEST_RPC_ACCOUNT_0],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
+ expect(err).to.be.a('null');
+ expect(response.result).to.be.equal(fixtureData.PERSONAL_MESSAGE_SIGNED_RESULT);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ describe('failure cases', () => {
+ it('should throw if `data` param not hex when calling eth_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sign',
+ params: [fixtureData.TEST_RPC_ACCOUNT_0, nonHexMessage],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `data` param not hex when calling personal_sign', (done: DoneCallback) => {
+ const nonHexMessage = 'hello world';
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [nonHexMessage, fixtureData.TEST_RPC_ACCOUNT_0],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal('Expected data to be of type HexString, encountered: hello world');
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `address` param is not the address from private key when calling personal_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [messageHex, fixtureData.TEST_RPC_ACCOUNT_1],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(
+ `Requested to sign message with address: ${
+ fixtureData.TEST_RPC_ACCOUNT_1
+ }, instantiated with address: ${fixtureData.TEST_RPC_ACCOUNT_0}`,
+ );
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `from` param missing when calling eth_sendTransaction', (done: DoneCallback) => {
+ const tx = {
+ to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66',
+ value: '0xde0b6b3a7640000',
+ };
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sendTransaction',
+ params: [tx],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `from` param invalid address when calling eth_sendTransaction', (done: DoneCallback) => {
+ const tx = {
+ to: '0xafa3f8684e54059998bc3a7b0d2b0da075154d66',
+ from: '0xIncorrectEthereumAddress',
+ value: '0xde0b6b3a7640000',
+ };
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'eth_sendTransaction',
+ params: [tx],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(WalletSubproviderErrors.SenderInvalidOrNotSupplied);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ it('should throw if `address` param not found when calling personal_sign', (done: DoneCallback) => {
+ const messageHex = ethUtils.bufferToHex(ethUtils.toBuffer(fixtureData.PERSONAL_MESSAGE_STRING));
+ const payload = {
+ jsonrpc: '2.0',
+ method: 'personal_sign',
+ params: [messageHex, '0x0'],
+ id: 1,
+ };
+ const callback = reportCallbackErrors(done)((err: Error, _response: JSONRPCResponsePayload) => {
+ expect(err).to.not.be.a('null');
+ expect(err.message).to.be.equal(`Expected address to be of type ETHAddressHex, encountered: 0x0`);
+ done();
+ });
+ provider.sendAsync(payload, callback);
+ });
+ });
+ });
+});
diff --git a/packages/subproviders/test/unit/redundant_rpc_subprovider_test.ts b/packages/subproviders/test/unit/redundant_rpc_subprovider_test.ts
index a347ab765..e30d2f74e 100644
--- a/packages/subproviders/test/unit/redundant_rpc_subprovider_test.ts
+++ b/packages/subproviders/test/unit/redundant_rpc_subprovider_test.ts
@@ -1,23 +1,24 @@
-import { JSONRPCResponsePayload } from '@0xproject/types';
+import { DoneCallback } from '@0xproject/types';
import * as chai from 'chai';
-import * as _ from 'lodash';
-import Web3 = require('web3');
-import Web3ProviderEngine = require('web3-provider-engine');
+import { JSONRPCResponsePayload } from 'ethereum-types';
+import * as Sinon from 'sinon';
-import { RedundantRPCSubprovider } from '../../src';
-import { DoneCallback } from '../../src/types';
+import { RedundantSubprovider, RPCSubprovider, Web3ProviderEngine } from '../../src';
+import { Subprovider } from '../../src/subproviders/subprovider';
import { chaiSetup } from '../chai_setup';
+import { ganacheSubprovider } from '../utils/ganache_subprovider';
import { reportCallbackErrors } from '../utils/report_callback_errors';
const expect = chai.expect;
chaiSetup.configure();
+const DEFAULT_NUM_ACCOUNTS = 10;
-describe('RedundantRpcSubprovider', () => {
+describe('RedundantSubprovider', () => {
let provider: Web3ProviderEngine;
it('succeeds when supplied a healthy endpoint', (done: DoneCallback) => {
provider = new Web3ProviderEngine();
- const endpoints = ['http://localhost:8545'];
- const redundantSubprovider = new RedundantRPCSubprovider(endpoints);
+ const subproviders = [ganacheSubprovider];
+ const redundantSubprovider = new RedundantSubprovider(subproviders);
provider.addProvider(redundantSubprovider);
provider.start();
@@ -29,15 +30,19 @@ describe('RedundantRpcSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(10);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
done();
});
provider.sendAsync(payload, callback);
});
it('succeeds when supplied at least one healthy endpoint', (done: DoneCallback) => {
provider = new Web3ProviderEngine();
- const endpoints = ['http://does-not-exist:3000', 'http://localhost:8545'];
- const redundantSubprovider = new RedundantRPCSubprovider(endpoints);
+ const nonExistentSubprovider = new RPCSubprovider('http://does-not-exist:3000');
+ const handleRequestStub = Sinon.stub(nonExistentSubprovider, 'handleRequest').throws(
+ new Error('REQUEST_FAILED'),
+ );
+ const subproviders = [nonExistentSubprovider as Subprovider, ganacheSubprovider];
+ const redundantSubprovider = new RedundantSubprovider(subproviders);
provider.addProvider(redundantSubprovider);
provider.start();
@@ -49,7 +54,8 @@ describe('RedundantRpcSubprovider', () => {
};
const callback = reportCallbackErrors(done)((err: Error, response: JSONRPCResponsePayload) => {
expect(err).to.be.a('null');
- expect(response.result.length).to.be.equal(10);
+ expect(response.result.length).to.be.equal(DEFAULT_NUM_ACCOUNTS);
+ handleRequestStub.restore();
done();
});
provider.sendAsync(payload, callback);
diff --git a/packages/subproviders/test/utils/configs.ts b/packages/subproviders/test/utils/configs.ts
new file mode 100644
index 000000000..341037e4f
--- /dev/null
+++ b/packages/subproviders/test/utils/configs.ts
@@ -0,0 +1,5 @@
+export const configs = {
+ port: 8545,
+ networkId: 50,
+ mnemonic: 'concert load couple harbor equip island argue ramp clarify fence smart topic',
+};
diff --git a/packages/subproviders/test/utils/fixture_data.ts b/packages/subproviders/test/utils/fixture_data.ts
new file mode 100644
index 000000000..7cf502c97
--- /dev/null
+++ b/packages/subproviders/test/utils/fixture_data.ts
@@ -0,0 +1,33 @@
+const TEST_RPC_ACCOUNT_0 = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
+const TEST_RPC_ACCOUNT_1 = '0x6ecbe1db9ef729cbe972c83fb886247691fb6beb';
+const NULL_ADDRESS = '0x0000000000000000000000000000000000000000';
+const networkId = 42;
+export const fixtureData = {
+ NULL_ADDRESS,
+ TEST_RPC_ACCOUNT_0,
+ TEST_RPC_ACCOUNT_0_ACCOUNT_PRIVATE_KEY: 'F2F48EE19680706196E2E339E5DA3491186E0C4C5030670656B0E0164837257D',
+ TEST_RPC_ACCOUNT_1,
+ TEST_RPC_MNEMONIC: 'concert load couple harbor equip island argue ramp clarify fence smart topic',
+ TEST_RPC_MNEMONIC_BASE_DERIVATION_PATH: `44'/60'/0'/0`,
+ PERSONAL_MESSAGE_STRING: 'hello world',
+ PERSONAL_MESSAGE_SIGNED_RESULT:
+ '0x1b0ec5e2908e993d0c8ab6b46da46be2688fdf03c7ea6686075de37392e50a7d7fcc531446699132fbda915bd989882e0064d417018773a315fb8d43ed063c9b00',
+ PERSONAL_MESSAGE_ACCOUNT_1_SIGNED_RESULT:
+ '0xe7ae0c21d02eb38f2c2a20d9d7876a98cc7ef035b7a4559d49375e2ec735e06f0d0ab0ff92ee56c5ffc28d516e6ed0692d0270feae8796408dbef060c6c7100f01',
+ TESTRPC_BASE_DERIVATION_PATH: `m/44'/60'/0'/0`,
+ NETWORK_ID: networkId,
+ TX_DATA: {
+ nonce: '0x00',
+ gasPrice: '0x0',
+ gas: '0x2710',
+ to: NULL_ADDRESS,
+ value: '0x00',
+ chainId: networkId,
+ from: TEST_RPC_ACCOUNT_0,
+ },
+ // This is the signed result of the above Transaction Data
+ TX_DATA_SIGNED_RESULT:
+ '0xf85f8080822710940000000000000000000000000000000000000000808078a0712854c73c69445cc1b22a7c3d7312ff9a97fe4ffba35fd636e8236b211b6e7ca0647cee031615e52d916c7c707025bc64ad525d8f1b9876c3435a863b42743178',
+ TX_DATA_ACCOUNT_1_SIGNED_RESULT:
+ '0xf85f8080822710940000000000000000000000000000000000000000808078a04b02af7ff3f18ce114b601542cc8ebdc50921354f75dd510d31793453a0710e6a0540082a01e475465801b8186a2edc79ec1a2dcf169b9781c25a58a417023c9ca',
+};
diff --git a/packages/subproviders/test/utils/ganache_subprovider.ts b/packages/subproviders/test/utils/ganache_subprovider.ts
new file mode 100644
index 000000000..ac4a9325c
--- /dev/null
+++ b/packages/subproviders/test/utils/ganache_subprovider.ts
@@ -0,0 +1,18 @@
+import * as fs from 'fs';
+
+import { GanacheSubprovider } from '../../src/subproviders/ganache';
+import { configs } from '../utils/configs';
+
+const logger = {
+ log: (arg: any) => {
+ fs.appendFileSync('ganache.log', `${arg}\n`);
+ },
+};
+
+export const ganacheSubprovider = new GanacheSubprovider({
+ logger,
+ verbose: false,
+ port: configs.port,
+ networkId: configs.networkId,
+ mnemonic: configs.mnemonic,
+});
diff --git a/packages/subproviders/test/utils/report_callback_errors.ts b/packages/subproviders/test/utils/report_callback_errors.ts
index 8a8f4d966..eaefea7c3 100644
--- a/packages/subproviders/test/utils/report_callback_errors.ts
+++ b/packages/subproviders/test/utils/report_callback_errors.ts
@@ -1,4 +1,4 @@
-import { DoneCallback } from '../../src/types';
+import { DoneCallback } from '@0xproject/types';
export const reportCallbackErrors = (done: DoneCallback) => {
return (f: (...args: any[]) => void) => {
diff --git a/packages/subproviders/tsconfig.json b/packages/subproviders/tsconfig.json
index 7b93af0da..e35816553 100644
--- a/packages/subproviders/tsconfig.json
+++ b/packages/subproviders/tsconfig.json
@@ -3,10 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": [
- "./src/**/*",
- "./test/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
+ "include": ["./src/**/*", "./test/**/*"]
}
diff --git a/packages/testnet-faucets/Dockerfile b/packages/testnet-faucets/Dockerfile
index bd1dcc4a4..cfd22aa39 100644
--- a/packages/testnet-faucets/Dockerfile
+++ b/packages/testnet-faucets/Dockerfile
@@ -2,11 +2,6 @@ FROM node
WORKDIR /src
-# Ledger Provider (in the Subproviders package) requires node-hid at dependency install time
-# which compiles and expects certain USB developer library packages to be present
-RUN apt-get -qq update && apt-get install -y libhidapi-dev libusb-1.0-0-dev
-# Our fork of ledgerco disables requiring node-hid at run time if CIRCLECI is set to true
-ENV CIRCLECI=true
COPY package.json .
RUN npm i
RUN npm install forever -g
@@ -15,4 +10,4 @@ COPY . .
EXPOSE 3000
-CMD ["forever", "./bin/server.js"]
+CMD ["forever", "./server/server.js"]
diff --git a/packages/testnet-faucets/README.md b/packages/testnet-faucets/README.md
index 2f6ae347f..a92b93fc0 100644
--- a/packages/testnet-faucets/README.md
+++ b/packages/testnet-faucets/README.md
@@ -4,15 +4,15 @@ This faucet dispenses 0.1 test ether to one recipient per second and 0.1 test ZR
## Installation
-This is a private package and therefore is not published to npm. In order to build and run this package locally, see the [Install Dependencies](#Install-Dependencies) section and onwards below.
+This is a private package and therefore is not published to npm. In order to build and run this package locally, see the contributing instructions below.
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -26,6 +26,32 @@ Then install dependencies
yarn install
```
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/testnet-faucets yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/testnet-faucets yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
+### Lint
+
+```bash
+yarn lint
+```
+
### Start
Set the following environment variables:
@@ -48,7 +74,7 @@ Infura API Key can be requested here: https://infura.io/signup
Note: The above public/private keys exist when running `testrpc` with the following option `--mnemonic concert load couple harbor equip island argue ramp clarify fence smart topic`.
```bash
-yarn dev
+PKG=0x.js yarn watch
```
### Endpoints
@@ -125,9 +151,3 @@ docker run -d \
-e INFURA_API_KEY=$INFURA_API_KEY \
testnet-faucets
```
-
-### Lint
-
-```bash
-yarn lint
-```
diff --git a/packages/testnet-faucets/gulpfile.js b/packages/testnet-faucets/gulpfile.js
index 773faf33a..7c4e25e0f 100644
--- a/packages/testnet-faucets/gulpfile.js
+++ b/packages/testnet-faucets/gulpfile.js
@@ -9,7 +9,7 @@ const config = {
target: 'node',
entry: [path.join(__dirname, '/src/ts/server.ts')],
output: {
- path: path.join(__dirname, '/bin'),
+ path: path.join(__dirname, '/server'),
filename: 'server.js',
},
devtool: 'source-map',
@@ -47,7 +47,7 @@ const config = {
modulesDir: path.join(__dirname, '../../node_modules')
}),
watchOptions: {
- ignored: /bin|node_modules|transpiled/
+ ignored: /server|node_modules|transpiled/
},
};
@@ -67,7 +67,7 @@ gulp.task('run', ['watch'], function() {
execMap: {
js: 'node',
},
- script: path.join(__dirname, 'bin/server'),
+ script: path.join(__dirname, 'server/server'),
ignore: ['*'],
watch: ['foo/'],
ext: 'noop',
diff --git a/packages/testnet-faucets/package.json b/packages/testnet-faucets/package.json
index 787476a85..ce2a1a52d 100644
--- a/packages/testnet-faucets/package.json
+++ b/packages/testnet-faucets/package.json
@@ -1,47 +1,49 @@
{
"private": true,
"name": "@0xproject/testnet-faucets",
- "version": "1.0.21",
+ "version": "1.0.41",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "A faucet micro-service that dispenses test ERC20 tokens or Ether",
"main": "server.js",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "node ../../node_modules/gulp/bin/gulp.js build",
"dev": "node ../../node_modules/gulp/bin/gulp.js run",
- "start": "node ./bin/server.js",
- "lint": "tslint --project . 'src/**/*.ts'",
- "clean": "shx rm -rf bin"
+ "start": "node ./server/server.js",
+ "lint": "tslint --project .",
+ "clean": "shx rm -rf server"
},
"author": "Fabio Berger",
"license": "Apache-2.0",
"dependencies": {
- "0x.js": "^0.34.0",
- "@0xproject/subproviders": "^0.8.3",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
+ "0x.js": "0.38.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
"body-parser": "^1.17.1",
- "ethereumjs-tx": "^1.3.3",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-tx": "^1.3.5",
"ethereumjs-util": "^5.1.1",
"express": "^4.15.2",
- "lodash": "^4.17.4",
- "rollbar": "^0.6.5",
- "web3": "^0.20.0",
- "web3-provider-engine": "^13.0.1"
+ "lodash": "^4.17.5",
+ "rollbar": "^0.6.5"
},
"devDependencies": {
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/body-parser": "^1.16.1",
"@types/express": "^4.0.35",
"@types/lodash": "4.14.104",
"awesome-typescript-loader": "^3.1.3",
"gulp": "^3.9.1",
+ "make-promises-safe": "^1.1.0",
"nodemon": "^1.11.0",
"shx": "^0.2.2",
"source-map-loader": "^0.1.6",
- "tslint": "5.8.0",
- "types-bn": "^0.0.1",
- "types-ethereumjs-util": "0xProject/types-ethereumjs-util",
- "typescript": "2.7.1",
+ "tslint": "5.11.0",
+ "typescript": "2.9.2",
"webpack": "^3.1.0",
"webpack-node-externals": "^1.6.0"
}
diff --git a/packages/testnet-faucets/src/ts/constants.ts b/packages/testnet-faucets/src/ts/constants.ts
new file mode 100644
index 000000000..c6370e3f6
--- /dev/null
+++ b/packages/testnet-faucets/src/ts/constants.ts
@@ -0,0 +1,5 @@
+export const constants = {
+ SUCCESS_STATUS: 200,
+ SERVICE_UNAVAILABLE_STATUS: 503,
+ BAD_REQUEST_STATUS: 400,
+};
diff --git a/packages/testnet-faucets/src/ts/dispatch_queue.ts b/packages/testnet-faucets/src/ts/dispatch_queue.ts
index 2dbeeba7a..0a13df7c9 100644
--- a/packages/testnet-faucets/src/ts/dispatch_queue.ts
+++ b/packages/testnet-faucets/src/ts/dispatch_queue.ts
@@ -7,8 +7,8 @@ const MAX_QUEUE_SIZE = 500;
const DEFAULT_QUEUE_INTERVAL_MS = 1000;
export class DispatchQueue {
- private _queueIntervalMs: number;
- private _queue: Array<() => Promise<void>>;
+ private readonly _queueIntervalMs: number;
+ private readonly _queue: Array<() => Promise<void>>;
private _queueIntervalIdIfExists?: NodeJS.Timer;
constructor() {
this._queueIntervalMs = DEFAULT_QUEUE_INTERVAL_MS;
@@ -28,12 +28,12 @@ export class DispatchQueue {
public isFull(): boolean {
return this.size() >= MAX_QUEUE_SIZE;
}
- public stop() {
+ public stop(): void {
if (!_.isUndefined(this._queueIntervalIdIfExists)) {
intervalUtils.clearAsyncExcludingInterval(this._queueIntervalIdIfExists);
}
}
- private _start() {
+ private _start(): void {
this._queueIntervalIdIfExists = intervalUtils.setAsyncExcludingInterval(
async () => {
const taskAsync = this._queue.shift();
diff --git a/packages/testnet-faucets/src/ts/dispense_asset_tasks.ts b/packages/testnet-faucets/src/ts/dispense_asset_tasks.ts
index 99f1bad36..3af5ca747 100644
--- a/packages/testnet-faucets/src/ts/dispense_asset_tasks.ts
+++ b/packages/testnet-faucets/src/ts/dispense_asset_tasks.ts
@@ -1,38 +1,38 @@
import { ZeroEx } from '0x.js';
-import { BigNumber, logUtils, promisify } from '@0xproject/utils';
+import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
-import * as Web3 from 'web3';
import { configs } from './configs';
-import { errorReporter } from './error_reporter';
const DISPENSE_AMOUNT_ETHER = 0.1;
const DISPENSE_AMOUNT_TOKEN = 0.1;
const DISPENSE_MAX_AMOUNT_TOKEN = 2;
const DISPENSE_MAX_AMOUNT_ETHER = 2;
+type AsyncTask = () => Promise<void>;
+
export const dispenseAssetTasks = {
- dispenseEtherTask(recipientAddress: string, web3: Web3) {
+ dispenseEtherTask(recipientAddress: string, web3Wrapper: Web3Wrapper): AsyncTask {
return async () => {
logUtils.log(`Processing ETH ${recipientAddress}`);
- const userBalance = await promisify<BigNumber>(web3.eth.getBalance)(recipientAddress);
- const maxAmountInWei = new BigNumber(web3.toWei(DISPENSE_MAX_AMOUNT_ETHER, 'ether'));
+ const userBalance = await web3Wrapper.getBalanceInWeiAsync(recipientAddress);
+ const maxAmountInWei = Web3Wrapper.toWei(new BigNumber(DISPENSE_MAX_AMOUNT_ETHER));
if (userBalance.greaterThanOrEqualTo(maxAmountInWei)) {
logUtils.log(
`User exceeded ETH balance maximum (${maxAmountInWei}) ${recipientAddress} ${userBalance} `,
);
return;
}
- const sendTransactionAsync = promisify(web3.eth.sendTransaction);
- const txHash = await sendTransactionAsync({
+ const txHash = await web3Wrapper.sendTransactionAsync({
from: configs.DISPENSER_ADDRESS,
to: recipientAddress,
- value: web3.toWei(DISPENSE_AMOUNT_ETHER, 'ether'),
+ value: Web3Wrapper.toWei(new BigNumber(DISPENSE_AMOUNT_ETHER)),
});
logUtils.log(`Sent ${DISPENSE_AMOUNT_ETHER} ETH to ${recipientAddress} tx: ${txHash}`);
};
},
- dispenseTokenTask(recipientAddress: string, tokenSymbol: string, zeroEx: ZeroEx) {
+ dispenseTokenTask(recipientAddress: string, tokenSymbol: string, zeroEx: ZeroEx): AsyncTask {
return async () => {
logUtils.log(`Processing ${tokenSymbol} ${recipientAddress}`);
const amountToDispense = new BigNumber(DISPENSE_AMOUNT_TOKEN);
diff --git a/packages/testnet-faucets/src/ts/error_reporter.ts b/packages/testnet-faucets/src/ts/error_reporter.ts
index f0f3ca679..49c37b6eb 100644
--- a/packages/testnet-faucets/src/ts/error_reporter.ts
+++ b/packages/testnet-faucets/src/ts/error_reporter.ts
@@ -5,14 +5,14 @@ import rollbar = require('rollbar');
import { configs } from './configs';
export const errorReporter = {
- setup() {
+ setup(): void {
rollbar.init(configs.ROLLBAR_ACCESS_KEY, {
environment: configs.ENVIRONMENT,
});
rollbar.handleUncaughtExceptions(configs.ROLLBAR_ACCESS_KEY);
process.on('unhandledRejection', async (err: Error) => {
logUtils.log(`Uncaught exception ${err}. Stack: ${err.stack}`);
- await this.reportAsync(err);
+ await errorReporter.reportAsync(err);
process.exit(1);
});
},
@@ -20,7 +20,7 @@ export const errorReporter = {
if (configs.ENVIRONMENT === 'development') {
return; // Do not log development environment errors
}
- return new Promise((resolve, reject) => {
+ return new Promise<any>((resolve, reject) => {
rollbar.handleError(err, req, (rollbarErr: Error) => {
if (rollbarErr) {
logUtils.log(`Error reporting to rollbar, ignoring: ${rollbarErr}`);
@@ -31,7 +31,7 @@ export const errorReporter = {
});
});
},
- errorHandler() {
+ errorHandler(): any {
return rollbar.errorHandler(configs.ROLLBAR_ACCESS_KEY);
},
};
diff --git a/packages/testnet-faucets/src/ts/global.d.ts b/packages/testnet-faucets/src/ts/global.d.ts
index 41a2f3a8a..94e63a32d 100644
--- a/packages/testnet-faucets/src/ts/global.d.ts
+++ b/packages/testnet-faucets/src/ts/global.d.ts
@@ -1,39 +1,6 @@
-declare module 'rollbar';
-declare module 'web3-provider-engine/subproviders/rpc';
-declare module 'web3-provider-engine/subproviders/nonce-tracker';
-declare module 'web3-provider-engine/subproviders/hooked-wallet';
-
declare module '*.json' {
const json: any;
/* tslint:disable */
export default json;
/* tslint:enable */
}
-
-// Ethereumjs-tx declarations
-declare module 'ethereumjs-tx' {
- class EthereumTx {
- public raw: Buffer[];
- public r: Buffer;
- public s: Buffer;
- public v: Buffer;
- public serialize(): Buffer;
- public sign(buffer: Buffer): void;
- constructor(txParams: any);
- }
- export = EthereumTx;
-}
-
-/* tslint:disable */
-declare module 'web3-provider-engine' {
- class Web3ProviderEngine {
- public on(event: string, handler: () => void): void;
- public send(payload: any): void;
- public sendAsync(payload: any, callback: (error: any, response: any) => void): void;
- public addProvider(provider: any): void;
- public start(): void;
- public stop(): void;
- }
- export = Web3ProviderEngine;
-}
-/* tslint:enable */
diff --git a/packages/testnet-faucets/src/ts/handler.ts b/packages/testnet-faucets/src/ts/handler.ts
index f9ac484de..3749bc70b 100644
--- a/packages/testnet-faucets/src/ts/handler.ts
+++ b/packages/testnet-faucets/src/ts/handler.ts
@@ -1,28 +1,26 @@
-import { Order, SignedOrder, ZeroEx } from '0x.js';
+import { Order, ZeroEx } from '0x.js';
import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import { Provider } from 'ethereum-types';
import * as express from 'express';
import * as _ from 'lodash';
-import * as Web3 from 'web3';
-// HACK: web3 injects XMLHttpRequest into the global scope and ProviderEngine checks XMLHttpRequest
-// to know whether it is running in a browser or node environment. We need it to be undefined since
-// we are not running in a browser env.
-// Filed issue: https://github.com/ethereum/web3.js/issues/844
-(global as any).XMLHttpRequest = undefined;
-import { NonceTrackerSubprovider } from '@0xproject/subproviders';
-import ProviderEngine = require('web3-provider-engine');
-import HookedWalletSubprovider = require('web3-provider-engine/subproviders/hooked-wallet');
-import RpcSubprovider = require('web3-provider-engine/subproviders/rpc');
+import {
+ NonceTrackerSubprovider,
+ PrivateKeyWalletSubprovider,
+ RPCSubprovider,
+ Web3ProviderEngine,
+} from '@0xproject/subproviders';
import { configs } from './configs';
+import { constants } from './constants';
import { DispatchQueue } from './dispatch_queue';
import { dispenseAssetTasks } from './dispense_asset_tasks';
-import { idManagement } from './id_management';
import { rpcUrls } from './rpc_urls';
interface NetworkConfig {
dispatchQueue: DispatchQueue;
- web3: Web3;
+ web3Wrapper: Web3Wrapper;
zeroEx: ZeroEx;
}
@@ -39,38 +37,37 @@ enum RequestedAssetType {
const FIVE_DAYS_IN_MS = 4.32e8; // TODO: make this configurable
export class Handler {
- private _networkConfigByNetworkId: ItemByNetworkId<NetworkConfig> = {};
- private static _createProviderEngine(rpcUrl: string) {
- const engine = new ProviderEngine();
+ private readonly _networkConfigByNetworkId: ItemByNetworkId<NetworkConfig> = {};
+ private static _createProviderEngine(rpcUrl: string): Provider {
+ if (_.isUndefined(configs.DISPENSER_PRIVATE_KEY)) {
+ throw new Error('Dispenser Private key not found');
+ }
+ const engine = new Web3ProviderEngine();
engine.addProvider(new NonceTrackerSubprovider());
- engine.addProvider(new HookedWalletSubprovider(idManagement));
- engine.addProvider(
- new RpcSubprovider({
- rpcUrl,
- }),
- );
+ engine.addProvider(new PrivateKeyWalletSubprovider(configs.DISPENSER_PRIVATE_KEY));
+ engine.addProvider(new RPCSubprovider(rpcUrl));
engine.start();
return engine;
}
constructor() {
_.forIn(rpcUrls, (rpcUrl: string, networkId: string) => {
const providerObj = Handler._createProviderEngine(rpcUrl);
- const web3 = new Web3(providerObj);
+ const web3Wrapper = new Web3Wrapper(providerObj);
const zeroExConfig = {
networkId: +networkId,
};
- const zeroEx = new ZeroEx(web3.currentProvider, zeroExConfig);
+ const zeroEx = new ZeroEx(providerObj, zeroExConfig);
const dispatchQueue = new DispatchQueue();
this._networkConfigByNetworkId[networkId] = {
dispatchQueue,
- web3,
+ web3Wrapper,
zeroEx,
};
});
}
- public getQueueInfo(req: express.Request, res: express.Response) {
+ public getQueueInfo(_req: express.Request, res: express.Response): void {
res.setHeader('Content-Type', 'application/json');
- const queueInfo = _.mapValues(rpcUrls, (rpcUrl: string, networkId: string) => {
+ const queueInfo = _.mapValues(rpcUrls, (_rpcUrl: string, networkId: string) => {
const dispatchQueue = this._networkConfigByNetworkId[networkId].dispatchQueue;
return {
full: dispatchQueue.isFull(),
@@ -78,28 +75,32 @@ export class Handler {
};
});
const payload = JSON.stringify(queueInfo);
- res.status(200).send(payload);
+ res.status(constants.SUCCESS_STATUS).send(payload);
}
- public dispenseEther(req: express.Request, res: express.Response) {
+ public dispenseEther(req: express.Request, res: express.Response): void {
this._dispenseAsset(req, res, RequestedAssetType.ETH);
}
- public dispenseZRX(req: express.Request, res: express.Response) {
+ public dispenseZRX(req: express.Request, res: express.Response): void {
this._dispenseAsset(req, res, RequestedAssetType.ZRX);
}
- public async dispenseWETHOrder(req: express.Request, res: express.Response) {
- await this._dispenseOrder(req, res, RequestedAssetType.WETH);
+ public async dispenseWETHOrderAsync(req: express.Request, res: express.Response): Promise<void> {
+ await this._dispenseOrderAsync(req, res, RequestedAssetType.WETH);
}
- public async dispenseZRXOrder(req: express.Request, res: express.Response, next: express.NextFunction) {
- await this._dispenseOrder(req, res, RequestedAssetType.ZRX);
+ public async dispenseZRXOrderAsync(
+ req: express.Request,
+ res: express.Response,
+ _next: express.NextFunction,
+ ): Promise<void> {
+ await this._dispenseOrderAsync(req, res, RequestedAssetType.ZRX);
}
- private _dispenseAsset(req: express.Request, res: express.Response, requestedAssetType: RequestedAssetType) {
+ private _dispenseAsset(req: express.Request, res: express.Response, requestedAssetType: RequestedAssetType): void {
const networkId = req.params.networkId;
const recipient = req.params.recipient;
const networkConfig = this._networkConfigByNetworkId[networkId];
let dispenserTask;
switch (requestedAssetType) {
case RequestedAssetType.ETH:
- dispenserTask = dispenseAssetTasks.dispenseEtherTask(recipient, networkConfig.web3);
+ dispenserTask = dispenseAssetTasks.dispenseEtherTask(recipient, networkConfig.web3Wrapper);
break;
case RequestedAssetType.WETH:
case RequestedAssetType.ZRX:
@@ -114,16 +115,20 @@ export class Handler {
}
const didAddToQueue = networkConfig.dispatchQueue.add(dispenserTask);
if (!didAddToQueue) {
- res.status(503).send('QUEUE_IS_FULL');
+ res.status(constants.SERVICE_UNAVAILABLE_STATUS).send('QUEUE_IS_FULL');
return;
}
logUtils.log(`Added ${recipient} to queue: ${requestedAssetType} networkId: ${networkId}`);
- res.status(200).end();
+ res.status(constants.SUCCESS_STATUS).end();
}
- private async _dispenseOrder(req: express.Request, res: express.Response, requestedAssetType: RequestedAssetType) {
+ private async _dispenseOrderAsync(
+ req: express.Request,
+ res: express.Response,
+ requestedAssetType: RequestedAssetType,
+ ): Promise<void> {
const networkConfig = _.get(this._networkConfigByNetworkId, req.params.networkId);
if (_.isUndefined(networkConfig)) {
- res.status(400).send('UNSUPPORTED_NETWORK_ID');
+ res.status(constants.BAD_REQUEST_STATUS).send('UNSUPPORTED_NETWORK_ID');
return;
}
const zeroEx = networkConfig.zeroEx;
@@ -160,9 +165,8 @@ export class Handler {
...order,
ecSignature: signature,
};
- const signedOrderHash = ZeroEx.getOrderHashHex(signedOrder);
const payload = JSON.stringify(signedOrder);
logUtils.log(`Dispensed signed order: ${payload}`);
- res.status(200).send(payload);
+ res.status(constants.SUCCESS_STATUS).send(payload);
}
}
diff --git a/packages/testnet-faucets/src/ts/id_management.ts b/packages/testnet-faucets/src/ts/id_management.ts
deleted file mode 100644
index 7c598f91c..000000000
--- a/packages/testnet-faucets/src/ts/id_management.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import EthereumTx = require('ethereumjs-tx');
-import * as ethUtil from 'ethereumjs-util';
-import * as _ from 'lodash';
-
-import { configs } from './configs';
-
-type Callback = (err: Error | null, result: any) => void;
-
-export const idManagement = {
- getAccounts(callback: Callback) {
- callback(null, [configs.DISPENSER_ADDRESS]);
- },
- approveTransaction(txData: object, callback: Callback) {
- callback(null, true);
- },
- signTransaction(txData: object, callback: Callback) {
- const tx = new EthereumTx(txData);
- const privateKeyBuffer = new Buffer(configs.DISPENSER_PRIVATE_KEY as string, 'hex');
- tx.sign(privateKeyBuffer);
- const rawTx = `0x${tx.serialize().toString('hex')}`;
- callback(null, rawTx);
- },
- signMessage(message: object, callback: Callback) {
- const dataIfExists = _.get(message, 'data');
- if (_.isUndefined(dataIfExists)) {
- callback(new Error('NO_DATA_TO_SIGN'), null);
- }
- const privateKeyBuffer = new Buffer(configs.DISPENSER_PRIVATE_KEY as string, 'hex');
- const dataBuff = ethUtil.toBuffer(dataIfExists);
- const msgHashBuff = ethUtil.hashPersonalMessage(dataBuff);
- const sig = ethUtil.ecsign(msgHashBuff, privateKeyBuffer);
- const rpcSig = ethUtil.toRpcSig(sig.v, sig.r, sig.s);
- callback(null, rpcSig);
- },
-};
diff --git a/packages/testnet-faucets/src/ts/parameter_transformer.ts b/packages/testnet-faucets/src/ts/parameter_transformer.ts
index 2630a5e0b..7320b1d1c 100644
--- a/packages/testnet-faucets/src/ts/parameter_transformer.ts
+++ b/packages/testnet-faucets/src/ts/parameter_transformer.ts
@@ -2,16 +2,16 @@ import { addressUtils } from '@0xproject/utils';
import { NextFunction, Request, Response } from 'express';
import * as _ from 'lodash';
-import { configs } from './configs';
+import { constants } from './constants';
import { rpcUrls } from './rpc_urls';
const DEFAULT_NETWORK_ID = 42; // kovan
export const parameterTransformer = {
- transform(req: Request, res: Response, next: NextFunction) {
+ transform(req: Request, res: Response, next: NextFunction): void {
const recipientAddress = req.params.recipient;
if (_.isUndefined(recipientAddress) || !addressUtils.isAddress(recipientAddress)) {
- res.status(400).send('INVALID_RECIPIENT_ADDRESS');
+ res.status(constants.BAD_REQUEST_STATUS).send('INVALID_RECIPIENT_ADDRESS');
return;
}
const lowerCaseRecipientAddress = recipientAddress.toLowerCase();
@@ -19,7 +19,7 @@ export const parameterTransformer = {
const networkId = _.get(req.query, 'networkId', DEFAULT_NETWORK_ID);
const rpcUrlIfExists = _.get(rpcUrls, networkId);
if (_.isUndefined(rpcUrlIfExists)) {
- res.status(400).send('UNSUPPORTED_NETWORK_ID');
+ res.status(constants.BAD_REQUEST_STATUS).send('UNSUPPORTED_NETWORK_ID');
return;
}
req.params.networkId = networkId;
diff --git a/packages/testnet-faucets/src/ts/server.ts b/packages/testnet-faucets/src/ts/server.ts
index be1077756..f00562000 100644
--- a/packages/testnet-faucets/src/ts/server.ts
+++ b/packages/testnet-faucets/src/ts/server.ts
@@ -1,6 +1,7 @@
import * as bodyParser from 'body-parser';
import * as express from 'express';
+import { constants } from './constants';
import { errorReporter } from './error_reporter';
import { Handler } from './handler';
import { parameterTransformer } from './parameter_transformer';
@@ -10,6 +11,7 @@ errorReporter.setup();
const app = express();
app.use(bodyParser.json()); // for parsing application/json
+// tslint:disable-next-line:no-unused-variable
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
@@ -17,16 +19,34 @@ app.use((req, res, next) => {
});
const handler = new Handler();
+// tslint:disable-next-line:no-unused-variable
app.get('/ping', (req: express.Request, res: express.Response) => {
- res.status(200).send('pong');
+ res.status(constants.SUCCESS_STATUS).send('pong');
});
app.get('/info', handler.getQueueInfo.bind(handler));
-app.get('/ether/:recipient', parameterTransformer.transform, handler.dispenseEther.bind(handler));
-app.get('/zrx/:recipient', parameterTransformer.transform, handler.dispenseZRX.bind(handler));
-app.get('/order/weth/:recipient', parameterTransformer.transform, handler.dispenseWETHOrder.bind(handler));
-app.get('/order/zrx/:recipient', parameterTransformer.transform, handler.dispenseZRXOrder.bind(handler));
+app.get(
+ '/ether/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseEther.bind(handler),
+);
+app.get(
+ '/zrx/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseZRX.bind(handler),
+);
+app.get(
+ '/order/weth/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseWETHOrderAsync.bind(handler),
+);
+app.get(
+ '/order/zrx/:recipient',
+ parameterTransformer.transform.bind(parameterTransformer),
+ handler.dispenseZRXOrderAsync.bind(handler),
+);
// Log to rollbar any errors unhandled by handlers
app.use(errorReporter.errorHandler());
-const port = process.env.PORT || 3000;
+const DEFAULT_PORT = 3000;
+const port = process.env.PORT || DEFAULT_PORT;
app.listen(port);
diff --git a/packages/testnet-faucets/tsconfig.json b/packages/testnet-faucets/tsconfig.json
index b0e7ba00c..d7e89a1e2 100644
--- a/packages/testnet-faucets/tsconfig.json
+++ b/packages/testnet-faucets/tsconfig.json
@@ -4,9 +4,5 @@
"outDir": "lib",
"strictPropertyInitialization": false
},
- "include": [
- "./src/ts/**/*",
- "../../node_modules/types-bn/index.d.ts",
- "../../node_modules/types-ethereumjs-util/index.d.ts"
- ]
+ "include": ["./src/ts/**/*"]
}
diff --git a/packages/tslint-config/CHANGELOG.json b/packages/tslint-config/CHANGELOG.json
index c0aa3b39a..8bad8526a 100644
--- a/packages/tslint-config/CHANGELOG.json
+++ b/packages/tslint-config/CHANGELOG.json
@@ -1,13 +1,139 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532551340,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Added a bunch of rules",
+ "pr": 883
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.4.21",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.4.20",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.4.19",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.4.18",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.4.17",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.4.16",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.4.15",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.4.14",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"timestamp": 1522658513,
"version": "0.4.13",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.4.9",
@@ -16,8 +142,7 @@
"note": "Move devDeps to deps to fix missed dependency issue in published package."
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.4.8",
@@ -27,8 +152,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.4.7",
@@ -39,8 +163,7 @@
"pr": 354
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
},
{
"version": "0.4.0",
@@ -54,8 +177,7 @@
"Because our tools can be used in both a TS and JS environment, we want to make the private methods of any public facing interface show up at the bottom of auto-complete lists. Additionally, we wanted to remain consistent with respect to our usage of underscores in order to enforce this rule with a linter rule, rather then manual code reviews."
}
],
- "timestamp": 1514386800,
- "isPublished": true
+ "timestamp": 1514386800
},
{
"version": "0.3.0",
@@ -65,8 +187,7 @@
"pr": 265
}
],
- "timestamp": 1513695600,
- "isPublished": true
+ "timestamp": 1513695600
},
{
"version": "0.1.0",
@@ -78,7 +199,6 @@
"note": "Updated to TSLint v5.8.0, requiring several rule additions to keep our conventions aligned."
}
],
- "timestamp": 1510585200,
- "isPublished": true
+ "timestamp": 1510585200
}
]
diff --git a/packages/tslint-config/CHANGELOG.md b/packages/tslint-config/CHANGELOG.md
index c3629b95f..136441971 100644
--- a/packages/tslint-config/CHANGELOG.md
+++ b/packages/tslint-config/CHANGELOG.md
@@ -1,36 +1,92 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 25, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Added a bunch of rules (#883)
+
+## v0.4.21 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.4.20 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.4.19 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.4.18 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.4.17 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.4.16 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.4.15 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.4.14 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.4.13 - _April 2, 2018_
* Dependencies updated
-## v0.4.9 - _February 9, 2018_
+## v0.4.9 - _February 8, 2018_
* Move devDeps to deps to fix missed dependency issue in published package.
-## v0.4.8 - _February 9, 2018_
+## v0.4.8 - _February 8, 2018_
* Fix publish issue where custom TSLint rules were not being included (#389)
-## v0.4.7 - _February 7, 2018_
+## v0.4.7 - _February 6, 2018_
* Modified custom 'underscore-privates' rule, changing it to 'underscore-private-and-protected' requiring underscores to be prepended to both private and protected variable names (#354)
-## v0.4.0 - _December 28, 2017_
+## v0.4.0 - _December 27, 2017_
* Added custom 'underscore-privates' rule, requiring underscores to be prepended to private variable names
* Because our tools can be used in both a TS and JS environment, we want to make the private methods of any public facing interface show up at the bottom of auto-complete lists. Additionally, we wanted to remain consistent with respect to our usage of underscores in order to enforce this rule with a linter rule, rather then manual code reviews.
-## v0.3.0 - _December 20, 2017_
+## v0.3.0 - _December 19, 2017_
* Added rules for unused imports, variables and Async suffixes (#265)
-## v0.1.0 - _November 14, 2017_
+## v0.1.0 - _November 13, 2017_
* Re-published TsLintConfig previously published under NPM package `tslint-config-0xproject`
* Updated to TSLint v5.8.0, requiring several rule additions to keep our conventions aligned.
diff --git a/packages/tslint-config/README.md b/packages/tslint-config/README.md
index b517f2d95..d630ec84d 100644
--- a/packages/tslint-config/README.md
+++ b/packages/tslint-config/README.md
@@ -20,11 +20,11 @@ Add the following to your `tslint.json` file
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -40,14 +40,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/tslint-config yarn build
+```
+
+Or continuously rebuild on change:
+
```bash
-yarn build
+PKG=@0xproject/tslint-config yarn watch
```
-or
+### Clean
```bash
-yarn build:watch
+yarn clean
```
### Lint
diff --git a/packages/tslint-config/package.json b/packages/tslint-config/package.json
index ef14c2a5d..1cc778caf 100644
--- a/packages/tslint-config/package.json
+++ b/packages/tslint-config/package.json
@@ -1,13 +1,16 @@
{
"name": "@0xproject/tslint-config",
- "version": "0.4.13",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Lint rules related to 0xProject for TSLint",
"main": "tslint.json",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'rules/**/*.ts'",
+ "lint": "tslint --project .",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"repository": {
@@ -31,17 +34,19 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/tslint-config/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
+ "@0xproject/monorepo-scripts": "^1.0.5",
"@types/lodash": "4.14.104",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"dependencies": {
- "lodash": "^4.17.4",
- "tslint": "5.8.0",
+ "lodash": "^4.17.5",
+ "tslint": "5.11.0",
"tslint-eslint-rules": "^4.1.1",
- "tslint-react": "^3.2.0"
+ "tslint-react": "^3.2.0",
+ "tsutils": "2.22.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/tslint-config/rules/booleanNamingRule.ts b/packages/tslint-config/rules/booleanNamingRule.ts
new file mode 100644
index 000000000..6590f689b
--- /dev/null
+++ b/packages/tslint-config/rules/booleanNamingRule.ts
@@ -0,0 +1,69 @@
+import * as _ from 'lodash';
+import * as Lint from 'tslint';
+import * as ts from 'typescript';
+
+const VALID_BOOLEAN_PREFIXES = ['is', 'does', 'should', 'was', 'has', 'can', 'did', 'would', 'are'];
+// tslint:disable:no-unnecessary-type-assertion
+export class Rule extends Lint.Rules.TypedRule {
+ public static FAILURE_STRING = `Boolean variable names should begin with: ${VALID_BOOLEAN_PREFIXES.join(', ')}`;
+
+ public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] {
+ return this.applyWithFunction(sourceFile, walk, undefined, program.getTypeChecker());
+ }
+}
+
+function walk(ctx: Lint.WalkContext<void>, tc: ts.TypeChecker): void {
+ traverse(ctx.sourceFile);
+
+ function traverse(node: ts.Node): void {
+ checkNodeForViolations(ctx, node, tc);
+ return ts.forEachChild(node, traverse);
+ }
+}
+
+function checkNodeForViolations(ctx: Lint.WalkContext<void>, node: ts.Node, tc: ts.TypeChecker): void {
+ switch (node.kind) {
+ // Handle: const { timestamp } = ...
+ case ts.SyntaxKind.BindingElement: {
+ const bindingElementNode = node as ts.BindingElement;
+ if (bindingElementNode.name.kind === ts.SyntaxKind.Identifier) {
+ handleBooleanNaming(bindingElementNode, tc, ctx);
+ }
+ break;
+ }
+
+ // Handle regular assignments: const block = ...
+ case ts.SyntaxKind.VariableDeclaration:
+ const variableDeclarationNode = node as ts.VariableDeclaration;
+ if (variableDeclarationNode.name.kind === ts.SyntaxKind.Identifier) {
+ handleBooleanNaming(node as ts.VariableDeclaration, tc, ctx);
+ }
+ break;
+
+ default:
+ _.noop();
+ }
+}
+
+function handleBooleanNaming(
+ node: ts.VariableDeclaration | ts.BindingElement,
+ tc: ts.TypeChecker,
+ ctx: Lint.WalkContext<void>,
+): void {
+ const nodeName = node.name;
+ const variableName = nodeName.getText();
+ const lowercasedName = _.toLower(variableName);
+ const typeNode = tc.getTypeAtLocation(node);
+ const typeName = (typeNode as any).intrinsicName;
+ if (typeName === 'boolean') {
+ const hasProperName = !_.isUndefined(
+ _.find(VALID_BOOLEAN_PREFIXES, prefix => {
+ return _.startsWith(lowercasedName, prefix);
+ }),
+ );
+ if (!hasProperName) {
+ ctx.addFailureAtNode(node, Rule.FAILURE_STRING);
+ }
+ }
+}
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/tslint-config/rules/customNoMagicNumbersRule.ts b/packages/tslint-config/rules/customNoMagicNumbersRule.ts
new file mode 100644
index 000000000..cb124f738
--- /dev/null
+++ b/packages/tslint-config/rules/customNoMagicNumbersRule.ts
@@ -0,0 +1,79 @@
+import * as Lint from 'tslint';
+import { isPrefixUnaryExpression } from 'tsutils';
+import * as ts from 'typescript';
+
+// tslint:disable:no-unnecessary-type-assertion
+/**
+ * A modified version of the no-magic-numbers rule that allows for magic numbers
+ * when instantiating a BigNumber instance.
+ * E.g We want to be able to write:
+ * const amount = new BigNumber(5);
+ * Original source: https://github.com/palantir/tslint/blob/42b058a6baa688f8be8558b277eb056c3ff79818/src/rules/noMagicNumbersRule.ts
+ */
+export class Rule extends Lint.Rules.AbstractRule {
+ public static ALLOWED_NODES = new Set<ts.SyntaxKind>([
+ ts.SyntaxKind.ExportAssignment,
+ ts.SyntaxKind.FirstAssignment,
+ ts.SyntaxKind.LastAssignment,
+ ts.SyntaxKind.PropertyAssignment,
+ ts.SyntaxKind.ShorthandPropertyAssignment,
+ ts.SyntaxKind.VariableDeclaration,
+ ts.SyntaxKind.VariableDeclarationList,
+ ts.SyntaxKind.EnumMember,
+ ts.SyntaxKind.PropertyDeclaration,
+ ts.SyntaxKind.Parameter,
+ ]);
+
+ public static DEFAULT_ALLOWED = [-1, 0, 1];
+
+ public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
+ const allowedNumbers = this.ruleArguments.length > 0 ? this.ruleArguments : Rule.DEFAULT_ALLOWED;
+ return this.applyWithWalker(
+ // tslint:disable-next-line:no-inferred-empty-object-type
+ new CustomNoMagicNumbersWalker(sourceFile, this.ruleName, new Set(allowedNumbers.map(String))),
+ );
+ }
+}
+
+// tslint:disable-next-line:max-classes-per-file
+class CustomNoMagicNumbersWalker extends Lint.AbstractWalker<Set<string>> {
+ public static FAILURE_STRING = "'magic numbers' are not allowed";
+ private static _isNegativeNumberLiteral(
+ node: ts.Node,
+ ): node is ts.PrefixUnaryExpression & { operand: ts.NumericLiteral } {
+ return (
+ isPrefixUnaryExpression(node) &&
+ node.operator === ts.SyntaxKind.MinusToken &&
+ node.operand.kind === ts.SyntaxKind.NumericLiteral
+ );
+ }
+ public walk(sourceFile: ts.SourceFile): void {
+ const cb = (node: ts.Node): void => {
+ if (node.kind === ts.SyntaxKind.NumericLiteral) {
+ return this.checkNumericLiteral(node, (node as ts.NumericLiteral).text);
+ }
+ if (CustomNoMagicNumbersWalker._isNegativeNumberLiteral(node)) {
+ return this.checkNumericLiteral(node, `-${(node.operand as ts.NumericLiteral).text}`);
+ }
+ return ts.forEachChild(node, cb);
+ };
+ return ts.forEachChild(sourceFile, cb);
+ }
+
+ // tslint:disable:no-non-null-assertion
+ // tslint:disable-next-line:underscore-private-and-protected
+ private checkNumericLiteral(node: ts.Node, num: string): void {
+ if (!Rule.ALLOWED_NODES.has(node.parent!.kind) && !this.options.has(num)) {
+ if (node.parent!.kind === ts.SyntaxKind.NewExpression) {
+ const className = (node.parent! as any).expression.escapedText;
+ const BIG_NUMBER_NEW_EXPRESSION = 'BigNumber';
+ if (className === BIG_NUMBER_NEW_EXPRESSION) {
+ return; // noop
+ }
+ }
+ this.addFailureAtNode(node, CustomNoMagicNumbersWalker.FAILURE_STRING);
+ }
+ }
+ // tslint:enable:no-non-null-assertion
+}
+// tslint:enable:no-unnecessary-type-assertion
diff --git a/packages/tslint-config/rules/underscorePrivateAndProtectedRule.ts b/packages/tslint-config/rules/underscorePrivateAndProtectedRule.ts
index 2f05b0c18..8c039bea7 100644
--- a/packages/tslint-config/rules/underscorePrivateAndProtectedRule.ts
+++ b/packages/tslint-config/rules/underscorePrivateAndProtectedRule.ts
@@ -50,10 +50,10 @@ function isRelevantClassMember(node: ts.Node): node is RelevantClassMember {
return false;
}
}
-function nameStartsWithUnderscore(text: string) {
+function nameStartsWithUnderscore(text: string): boolean {
return text.charCodeAt(0) === UNDERSCORE.charCodeAt(0);
}
-function memberIsPrivate(node: ts.Declaration) {
+function memberIsPrivate(node: ts.Declaration): boolean {
return Lint.hasModifier(node.modifiers, ts.SyntaxKind.PrivateKeyword, ts.SyntaxKind.ProtectedKeyword);
}
function nameIsIdentifier(node: ts.Node): node is ts.Identifier {
diff --git a/packages/tslint-config/tsconfig.json b/packages/tslint-config/tsconfig.json
index fd9b23316..3f349e100 100644
--- a/packages/tslint-config/tsconfig.json
+++ b/packages/tslint-config/tsconfig.json
@@ -1,7 +1,7 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "typeRoots": ["node_modules/@types"],
+ "typeRoots": ["../../node_modules/@types", "node_modules/@types"],
"outDir": "lib"
},
"include": ["./rules/**/*", "./monorepo_scripts/**/*"]
diff --git a/packages/tslint-config/tslint.json b/packages/tslint-config/tslint.json
index aacfb6d59..93403d36b 100644
--- a/packages/tslint-config/tslint.json
+++ b/packages/tslint-config/tslint.json
@@ -7,47 +7,80 @@
"async-suffix": true,
"await-promise": true,
"binary-expression-operand-order": true,
+ "boolean-naming": true,
"callable-types": true,
"class-name": true,
"completed-docs": [
true,
{
- "functions": { "visibilities": ["exported"] },
- "methods": { "locations": "instance", "privacies": ["public", "protected"] }
+ "functions": {
+ "visibilities": ["exported"]
+ },
+ "methods": {
+ "locations": "instance",
+ "privacies": ["public", "protected"]
+ }
}
],
"curly": true,
- "eofline": true,
+ "custom-no-magic-numbers": [true, 0, 1, 2, 3, -1],
"encoding": true,
+ "eofline": true,
"import-spacing": true,
"indent": [true, "spaces", 4],
"interface-name": false,
"interface-over-type-literal": true,
+ "jsx-alignment": true,
+ "jsx-boolean-value": true,
+ "jsx-curly-spacing": [true, "never"],
+ "jsx-no-bind": false,
+ "jsx-no-lambda": true,
+ "jsx-no-multiline-js": false,
+ "jsx-no-string-ref": true,
+ "jsx-self-close": true,
+ "jsx-wrap-multiline": false,
"linebreak-style": [true, "LF"],
- "max-classes-per-file": false,
"max-classes-per-file": [true, 1],
- "max-line-length": false,
"max-file-line-count": [true, 500],
+ "max-line-length": false,
"member-access": true,
"member-ordering": [true, "public-before-private", "static-before-instance", "variables-before-functions"],
- "newline-before-return": false,
"new-parens": true,
+ "newline-before-return": false,
"no-angle-bracket-type-assertion": true,
"no-boolean-literal-compare": true,
+ "no-debugger": true,
"no-default-export": true,
+ "no-duplicate-super": true,
+ "no-duplicate-switch-case": true,
+ "no-duplicate-variable": true,
"no-empty-interface": false,
+ "no-eval": true,
"no-floating-promises": true,
+ "no-implicit-dependencies": [true, "dev"],
+ "no-inferred-empty-object-type": true,
+ "no-invalid-template-strings": true,
+ "no-invalid-this": true,
+ "no-misused-new": true,
"no-non-null-assertion": true,
"no-parameter-reassignment": true,
"no-redundant-jsdoc": true,
"no-return-await": true,
+ "no-shadowed-variable": true,
+ "no-sparse-arrays": true,
+ "no-string-literal": true,
"no-string-throw": true,
"no-submodule-imports": false,
+ "no-switch-case-fall-through": true,
+ "no-this-assignment": false,
+ "no-unbound-method": true,
+ "no-unnecessary-class": true,
"no-unnecessary-type-assertion": true,
- "no-implicit-dependencies": [true, "dev"],
+ "no-unsafe-finally": true,
+ "no-unused-variable": [true, "check-parameters"],
"number-literal-format": true,
- "object-literal-sort-keys": false,
"object-literal-key-quotes": false,
+ "object-literal-sort-keys": false,
"ordered-imports": [
true,
{
@@ -57,6 +90,8 @@
"prefer-const": true,
"prefer-for-of": true,
"prefer-function-over-method": true,
+ "prefer-object-spread": true,
+ "prefer-readonly": true,
"promise-function-async": true,
"quotemark": [true, "single", "avoid-escape", "jsx-double"],
"restrict-plus-operands": true,
@@ -65,14 +100,16 @@
true,
{
"anonymous": "never",
- "named": "never",
- "method": "never",
+ "asyncArrow": "always",
"constructor": "never",
- "asyncArrow": "always"
+ "method": "never",
+ "named": "never"
}
],
"space-within-parens": false,
+ "switch-default": true,
"type-literal-delimiter": true,
+ "typedef": [true, "call-signature", "parameter", "property-declaration"],
"underscore-private-and-protected": true,
"variable-name": [true, "ban-keywords", "allow-pascal-case"],
"whitespace": [
@@ -85,16 +122,7 @@
"check-type",
"check-typecast",
"check-preblock"
- ],
- "jsx-alignment": true,
- "jsx-boolean-value": true,
- "jsx-curly-spacing": [true, "never"],
- "jsx-no-lambda": true,
- "jsx-no-multiline-js": false,
- "jsx-no-string-ref": true,
- "jsx-self-close": true,
- "jsx-wrap-multiline": false,
- "jsx-no-bind": false
+ ]
},
"rulesDirectory": "lib/rules"
}
diff --git a/packages/types/CHANGELOG.json b/packages/types/CHANGELOG.json
index c70d4cadc..4b9019cd4 100644
--- a/packages/types/CHANGELOG.json
+++ b/packages/types/CHANGELOG.json
@@ -1,13 +1,163 @@
[
{
+ "version": "1.0.1-rc.4",
+ "changes": [
+ {
+ "pr": 914,
+ "note": "Added SignerType to handle different signing prefix scenarios"
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "version": "1.0.1-rc.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532619515
+ },
+ {
+ "version": "1.0.1-rc.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ],
+ "timestamp": 1532614997
+ },
+ {
+ "version": "1.0.1-rc.1",
+ "changes": [
+ {
+ "note": "Remove `ECSignatureBuffer`"
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0-rc.1",
+ "changes": [
+ {
+ "note": "Updated types for V2 of 0x protocol"
+ },
+ {
+ "note": "Add `ECSignatureBuffer`"
+ },
+ {
+ "note": "Add Forwarder contract revert reasons"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.8.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.8.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.8.0",
+ "changes": [
+ {
+ "note": "Change the order type to v2 format",
+ "pr": 618
+ }
+ ]
+ },
+ {
+ "version": "0.7.0",
+ "changes": [
+ {
+ "note": "Make OpCode type an enum",
+ "pr": 589
+ },
+ {
+ "note":
+ "Moved ExchangeContractErrs, DoneCallback, Token, OrderRelevantState, OrderStateValid, OrderStateInvalid, OrderState, OrderAddresses and OrderValues types from 0x.js",
+ "pr": 579
+ }
+ ],
+ "timestamp": 1527009133
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.6.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.6.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.6.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.6.0",
+ "changes": [
+ {
+ "note": "Add Provider type",
+ "pr": 501
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "version": "0.5.0",
+ "changes": [
+ {
+ "note": "Make `DataItem.components` optional",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
"timestamp": 1522658513,
"version": "0.4.2",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.4.0",
@@ -21,8 +171,7 @@
"pr": 456
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.3.1",
@@ -31,8 +180,7 @@
"note": "Added `RawLogEntry` type."
}
],
- "timestamp": 1520434800,
- "isPublished": true
+ "timestamp": 1520434800
},
{
"version": "0.3.0",
@@ -50,8 +198,7 @@
"pr": 429
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.2.1",
@@ -61,8 +208,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.2.0",
@@ -72,7 +218,6 @@
"pr": 355
}
],
- "timestamp": 1517929200,
- "isPublished": true
+ "timestamp": 1517929200
}
]
diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md
index ed6efe601..9be0c8bca 100644
--- a/packages/types/CHANGELOG.md
+++ b/packages/types/CHANGELOG.md
@@ -1,33 +1,96 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.1-rc.4 - _August 13, 2018_
+
+ * Added SignerType to handle different signing prefix scenarios (#914)
+
+## v1.0.1-rc.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1-rc.1 - _July 26, 2018_
+
+ * Remove `ECSignatureBuffer`
+
+## v1.0.0 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0-rc.1 - _July 19, 2018_
+
+ * Updated types for V2 of 0x protocol
+ * Add `ECSignatureBuffer`
+ * Add Forwarder contract revert reasons
+
+## v0.8.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.8.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.8.0 - _May 22, 2018_
+
+ * Change the order type to v2 format (#618)
+
+## v0.7.0 - _May 22, 2018_
+
+ * Make OpCode type an enum (#589)
+ * Moved ExchangeContractErrs, DoneCallback, Token, OrderRelevantState, OrderStateValid, OrderStateInvalid, OrderState, OrderAddresses and OrderValues types from 0x.js (#579)
+
+## v0.6.3 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.2 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.1 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.6.0 - _April 11, 2018_
+
+ * Add Provider type (#501)
+
+## v0.5.0 - _April 2, 2018_
+
+ * Make `DataItem.components` optional (#485)
+
## v0.4.2 - _April 2, 2018_
* Dependencies updated
-## v0.4.0 - _March 18, 2018_
+## v0.4.0 - _March 17, 2018_
* Remove `JSONRPCPayload` (#426)
* Consolidate `Order`, `SignedOrder`, and `ECSignature` into the `@0xproject/types` package (#456)
-## v0.3.1 - _March 8, 2018_
+## v0.3.1 - _March 7, 2018_
* Added `RawLogEntry` type.
-## v0.3.0 - _March 4, 2018_
+## v0.3.0 - _March 3, 2018_
* Add `data` to `TxData` (#413)
* Add `number` as an option to `ContractEventArg` (#413)
* Move web3 types from devDep to dep since required when using this package (#429)
-## v0.2.1 - _February 9, 2018_
+## v0.2.1 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.2.0 - _February 7, 2018_
+## v0.2.0 - _February 6, 2018_
* Added BlockLiteralParam and BlockParam, refactored out of 0x.js types. (#355)
diff --git a/packages/types/README.md b/packages/types/README.md
index b971eaee7..c091b8302 100644
--- a/packages/types/README.md
+++ b/packages/types/README.md
@@ -24,13 +24,13 @@ import { TransactionReceipt, TxData, TxDataPayable } from '@0xproject/types';
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
-If you don't have yarn workspaces e`nabled (Yarn < v1.0) - enable them:
+If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
```bash
yarn config set workspaces-experimental true
@@ -44,14 +44,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/types yarn build
+```
+
+Or continuously rebuild on change:
+
```bash
-yarn build
+PKG=@0xproject/types yarn watch
```
-or
+### Clean
```bash
-yarn build:watch
+yarn clean
```
### Lint
diff --git a/packages/types/package.json b/packages/types/package.json
index a656aa753..c97984e10 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,14 +1,17 @@
{
"name": "@0xproject/types",
- "version": "0.4.2",
+ "version": "1.0.1-rc.4",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x types",
"main": "lib/index.js",
"types": "lib/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'src/**/*.ts'",
+ "lint": "tslint --project .",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"license": "Apache-2.0",
@@ -21,16 +24,18 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/types/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
- "@types/node": "^8.0.53",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
- "bignumber.js": "~4.1.0"
+ "@types/node": "^8.0.53",
+ "bignumber.js": "~4.1.0",
+ "ethereum-types": "^1.0.4"
},
"publishConfig": {
"access": "public"
diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts
index 57b14e230..fa634420d 100644
--- a/packages/types/src/index.ts
+++ b/packages/types/src/index.ts
@@ -1,277 +1,156 @@
import { BigNumber } from 'bignumber.js';
+import { ContractAbi } from 'ethereum-types';
-export type ContractAbi = AbiDefinition[];
-
-export type AbiDefinition = FunctionAbi | EventAbi;
-
-export type FunctionAbi = MethodAbi | ConstructorAbi | FallbackAbi;
-
-export type ConstructorStateMutability = 'nonpayable' | 'payable';
-export type StateMutability = 'pure' | 'view' | ConstructorStateMutability;
-
-export interface MethodAbi {
- type: AbiType.Function;
- name: string;
- inputs: DataItem[];
- outputs: DataItem[];
- constant: boolean;
- stateMutability: StateMutability;
- payable: boolean;
+// HACK: Rather then extending from OrderWithoutExchangeAddress
+// we don't, because our docs don't expand inherited types, and it's unnecessarily
+// confusing to introduce the user to the OrderWithoutExchangeAddress type.
+export interface Order {
+ senderAddress: string;
+ makerAddress: string;
+ takerAddress: string;
+ makerFee: BigNumber;
+ takerFee: BigNumber;
+ makerAssetAmount: BigNumber;
+ takerAssetAmount: BigNumber;
+ makerAssetData: string;
+ takerAssetData: string;
+ salt: BigNumber;
+ exchangeAddress: string;
+ feeRecipientAddress: string;
+ expirationTimeSeconds: BigNumber;
}
-export interface ConstructorAbi {
- type: AbiType.Constructor;
- inputs: DataItem[];
- payable: boolean;
- stateMutability: ConstructorStateMutability;
+export interface OrderWithoutExchangeAddress {
+ senderAddress: string;
+ makerAddress: string;
+ takerAddress: string;
+ makerFee: BigNumber;
+ takerFee: BigNumber;
+ makerAssetAmount: BigNumber;
+ takerAssetAmount: BigNumber;
+ makerAssetData: string;
+ takerAssetData: string;
+ salt: BigNumber;
+ feeRecipientAddress: string;
+ expirationTimeSeconds: BigNumber;
}
-export interface FallbackAbi {
- type: AbiType.Fallback;
- payable: boolean;
+export interface SignedOrder extends Order {
+ signature: string;
}
-export interface EventParameter extends DataItem {
- indexed: boolean;
+/**
+ * Elliptic Curve signature
+ */
+export interface ECSignature {
+ v: number;
+ r: string;
+ s: string;
}
-export interface EventAbi {
- type: AbiType.Event;
- name: string;
- inputs: EventParameter[];
- anonymous: boolean;
+/**
+ * Validator signature components
+ */
+export interface ValidatorSignature {
+ validatorAddress: string;
+ signature: string;
}
-export interface DataItem {
+/**
+ * Errors originating from the 0x exchange contract
+ */
+export enum ExchangeContractErrs {
+ OrderFillExpired = 'ORDER_FILL_EXPIRED',
+ OrderCancelExpired = 'ORDER_CANCEL_EXPIRED',
+ OrderCancelAmountZero = 'ORDER_CANCEL_AMOUNT_ZERO',
+ OrderAlreadyCancelledOrFilled = 'ORDER_ALREADY_CANCELLED_OR_FILLED',
+ OrderFillAmountZero = 'ORDER_FILL_AMOUNT_ZERO',
+ OrderRemainingFillAmountZero = 'ORDER_REMAINING_FILL_AMOUNT_ZERO',
+ OrderFillRoundingError = 'ORDER_FILL_ROUNDING_ERROR',
+ FillBalanceAllowanceError = 'FILL_BALANCE_ALLOWANCE_ERROR',
+ InsufficientTakerBalance = 'INSUFFICIENT_TAKER_BALANCE',
+ InsufficientTakerAllowance = 'INSUFFICIENT_TAKER_ALLOWANCE',
+ InsufficientMakerBalance = 'INSUFFICIENT_MAKER_BALANCE',
+ InsufficientMakerAllowance = 'INSUFFICIENT_MAKER_ALLOWANCE',
+ InsufficientTakerFeeBalance = 'INSUFFICIENT_TAKER_FEE_BALANCE',
+ InsufficientTakerFeeAllowance = 'INSUFFICIENT_TAKER_FEE_ALLOWANCE',
+ InsufficientMakerFeeBalance = 'INSUFFICIENT_MAKER_FEE_BALANCE',
+ InsufficientMakerFeeAllowance = 'INSUFFICIENT_MAKER_FEE_ALLOWANCE',
+ TransactionSenderIsNotFillOrderTaker = 'TRANSACTION_SENDER_IS_NOT_FILL_ORDER_TAKER',
+ MultipleMakersInSingleCancelBatchDisallowed = 'MULTIPLE_MAKERS_IN_SINGLE_CANCEL_BATCH_DISALLOWED',
+ InsufficientRemainingFillAmount = 'INSUFFICIENT_REMAINING_FILL_AMOUNT',
+ MultipleTakerTokensInFillUpToDisallowed = 'MULTIPLE_TAKER_TOKENS_IN_FILL_UP_TO_DISALLOWED',
+ BatchOrdersMustHaveSameExchangeAddress = 'BATCH_ORDERS_MUST_HAVE_SAME_EXCHANGE_ADDRESS',
+ BatchOrdersMustHaveAtLeastOneItem = 'BATCH_ORDERS_MUST_HAVE_AT_LEAST_ONE_ITEM',
+}
+
+export type ArtifactContractName = 'ZRX' | 'TokenTransferProxy' | 'TokenRegistry' | 'Token' | 'Exchange' | 'EtherToken';
+
+export interface Artifact {
+ contract_name: ArtifactContractName;
+ abi: ContractAbi;
+ networks: {
+ [networkId: number]: {
+ address: string;
+ };
+ };
+}
+
+export type DoneCallback = (err?: Error) => void;
+
+export interface OrderRelevantState {
+ makerBalance: BigNumber;
+ makerProxyAllowance: BigNumber;
+ makerFeeBalance: BigNumber;
+ makerFeeProxyAllowance: BigNumber;
+ filledTakerAssetAmount: BigNumber;
+ remainingFillableMakerAssetAmount: BigNumber;
+ remainingFillableTakerAssetAmount: BigNumber;
+}
+
+export interface OrderStateValid {
+ isValid: true;
+ orderHash: string;
+ orderRelevantState: OrderRelevantState;
+}
+
+export interface OrderStateInvalid {
+ isValid: false;
+ orderHash: string;
+ error: ExchangeContractErrs;
+}
+
+export type OrderState = OrderStateValid | OrderStateInvalid;
+
+export interface Token {
name: string;
- type: string;
- components: DataItem[];
-}
-
-export type OpCode = string;
-
-export interface StructLog {
- depth: number;
- error: string;
- gas: number;
- gasCost: number;
- memory: string[];
- op: OpCode;
- pc: number;
- stack: string[];
- storage: { [location: string]: string };
-}
-
-export interface TransactionTrace {
- gas: number;
- returnValue: any;
- structLogs: StructLog[];
-}
-
-export type Unit =
- | 'kwei'
- | 'ada'
- | 'mwei'
- | 'babbage'
- | 'gwei'
- | 'shannon'
- | 'szabo'
- | 'finney'
- | 'ether'
- | 'kether'
- | 'grand'
- | 'einstein'
- | 'mether'
- | 'gether'
- | 'tether';
-
-export interface JSONRPCRequestPayload {
- params: any[];
- method: string;
- id: number;
- jsonrpc: string;
-}
-
-export interface JSONRPCResponsePayload {
- result: any;
- id: number;
- jsonrpc: string;
-}
-
-export interface AbstractBlock {
- number: number | null;
- hash: string | null;
- parentHash: string;
- nonce: string | null;
- sha3Uncles: string;
- logsBloom: string | null;
- transactionsRoot: string;
- stateRoot: string;
- miner: string;
- difficulty: BigNumber;
- totalDifficulty: BigNumber;
- extraData: string;
- size: number;
- gasLimit: number;
- gasUsed: number;
- timestamp: number;
- uncles: string[];
-}
-
-export interface BlockWithoutTransactionData extends AbstractBlock {
- transactions: string[];
-}
-
-export interface BlockWithTransactionData extends AbstractBlock {
- transactions: Transaction[];
-}
-
-export interface Transaction {
- hash: string;
- nonce: number;
- blockHash: string | null;
- blockNumber: number | null;
- transactionIndex: number | null;
- from: string;
- to: string | null;
- value: BigNumber;
- gasPrice: BigNumber;
- gas: number;
- input: string;
-}
-
-export interface CallTxDataBase {
- to?: string;
- value?: number | string | BigNumber;
- gas?: number | string | BigNumber;
- gasPrice?: number | string | BigNumber;
- data?: string;
- nonce?: number;
-}
-
-export interface TxData extends CallTxDataBase {
- from: string;
-}
-
-export interface CallData extends CallTxDataBase {
- from?: string;
-}
-
-export interface FilterObject {
- fromBlock?: number | string;
- toBlock?: number | string;
- address?: string;
- topics?: LogTopic[];
-}
-
-export type LogTopic = null | string | string[];
-
-export interface DecodedLogEntry<A> extends LogEntry {
- event: string;
- args: A;
-}
-
-export interface DecodedLogEntryEvent<A> extends DecodedLogEntry<A> {
- removed: boolean;
-}
-
-export interface LogEntryEvent extends LogEntry {
- removed: boolean;
-}
-
-export interface LogEntry {
- logIndex: number | null;
- transactionIndex: number | null;
- transactionHash: string;
- blockHash: string | null;
- blockNumber: number | null;
- address: string;
- data: string;
- topics: string[];
-}
-
-export interface TxDataPayable extends TxData {
- value?: BigNumber;
-}
-
-export interface TransactionReceipt {
- blockHash: string;
- blockNumber: number;
- transactionHash: string;
- transactionIndex: number;
- from: string;
- to: string;
- status: null | string | 0 | 1;
- cumulativeGasUsed: number;
- gasUsed: number;
- contractAddress: string | null;
- logs: LogEntry[];
-}
-
-export enum AbiType {
- Function = 'function',
- Constructor = 'constructor',
- Event = 'event',
- Fallback = 'fallback',
-}
-
-export type ContractEventArg = string | BigNumber | number;
-
-export interface DecodedLogArgs {
- [argName: string]: ContractEventArg;
-}
-
-export interface LogWithDecodedArgs<ArgsType> extends DecodedLogEntry<ArgsType> {}
-export type RawLog = LogEntry;
-export enum SolidityTypes {
- Address = 'address',
- Uint256 = 'uint256',
- Uint8 = 'uint8',
- Uint = 'uint',
-}
-
-export interface TransactionReceiptWithDecodedLogs extends TransactionReceipt {
- logs: Array<LogWithDecodedArgs<DecodedLogArgs> | LogEntry>;
-}
-
-// Earliest is omitted by design. It is simply an alias for the `0` constant and
-// is thus not very helpful. Moreover, this type is used in places that only accept
-// `latest` or `pending`.
-export enum BlockParamLiteral {
- Latest = 'latest',
- Pending = 'pending',
-}
-
-export type BlockParam = BlockParamLiteral | number;
-
-export interface RawLogEntry {
- logIndex: string | null;
- transactionIndex: string | null;
- transactionHash: string;
- blockHash: string | null;
- blockNumber: string | null;
address: string;
- data: string;
- topics: string[];
+ symbol: string;
+ decimals: number;
}
-export interface Order {
- maker: string;
- taker: string;
- makerFee: BigNumber;
- takerFee: BigNumber;
- makerTokenAmount: BigNumber;
- takerTokenAmount: BigNumber;
- makerTokenAddress: string;
- takerTokenAddress: string;
- salt: BigNumber;
- exchangeContractAddress: string;
- feeRecipient: string;
- expirationUnixTimestampSec: BigNumber;
+export enum SignatureType {
+ Illegal,
+ Invalid,
+ EIP712,
+ EthSign,
+ Caller,
+ Wallet,
+ Validator,
+ PreSigned,
+ Trezor,
+ NSignatureTypes,
}
-export interface SignedOrder extends Order {
- ecSignature: ECSignature;
+/**
+ * The type of the Signer implementation. Some signer implementations use different message prefixes (e.g Trezor) or implement different
+ * eth_sign behaviour (e.g Metamask). Default assumes a spec compliant `eth_sign`.
+ */
+export enum SignerType {
+ Default = 'DEFAULT',
+ Ledger = 'LEDGER',
+ Metamask = 'METAMASK',
+ Trezor = 'TREZOR',
}
/**
@@ -282,3 +161,76 @@ export interface ECSignature {
r: string;
s: string;
}
+
+export enum AssetProxyId {
+ ERC20 = '0xf47261b0',
+ ERC721 = '0x02571792',
+}
+
+export interface ERC20AssetData {
+ assetProxyId: string;
+ tokenAddress: string;
+}
+
+export interface ERC721AssetData {
+ assetProxyId: string;
+ tokenAddress: string;
+ tokenId: BigNumber;
+}
+
+export enum RevertReason {
+ OrderUnfillable = 'ORDER_UNFILLABLE',
+ InvalidMaker = 'INVALID_MAKER',
+ InvalidTaker = 'INVALID_TAKER',
+ InvalidSender = 'INVALID_SENDER',
+ InvalidOrderSignature = 'INVALID_ORDER_SIGNATURE',
+ InvalidTakerAmount = 'INVALID_TAKER_AMOUNT',
+ RoundingError = 'ROUNDING_ERROR',
+ InvalidSignature = 'INVALID_SIGNATURE',
+ SignatureIllegal = 'SIGNATURE_ILLEGAL',
+ SignatureUnsupported = 'SIGNATURE_UNSUPPORTED',
+ InvalidNewOrderEpoch = 'INVALID_NEW_ORDER_EPOCH',
+ CompleteFillFailed = 'COMPLETE_FILL_FAILED',
+ NegativeSpreadRequired = 'NEGATIVE_SPREAD_REQUIRED',
+ ReentrancyIllegal = 'REENTRANCY_ILLEGAL',
+ InvalidTxHash = 'INVALID_TX_HASH',
+ InvalidTxSignature = 'INVALID_TX_SIGNATURE',
+ FailedExecution = 'FAILED_EXECUTION',
+ AssetProxyAlreadyExists = 'ASSET_PROXY_ALREADY_EXISTS',
+ LengthGreaterThan0Required = 'LENGTH_GREATER_THAN_0_REQUIRED',
+ LengthGreaterThan131Required = 'LENGTH_GREATER_THAN_131_REQUIRED',
+ Length0Required = 'LENGTH_0_REQUIRED',
+ Length65Required = 'LENGTH_65_REQUIRED',
+ InvalidAmount = 'INVALID_AMOUNT',
+ TransferFailed = 'TRANSFER_FAILED',
+ SenderNotAuthorized = 'SENDER_NOT_AUTHORIZED',
+ TargetNotAuthorized = 'TARGET_NOT_AUTHORIZED',
+ TargetAlreadyAuthorized = 'TARGET_ALREADY_AUTHORIZED',
+ IndexOutOfBounds = 'INDEX_OUT_OF_BOUNDS',
+ AuthorizedAddressMismatch = 'AUTHORIZED_ADDRESS_MISMATCH',
+ OnlyContractOwner = 'ONLY_CONTRACT_OWNER',
+ MakerNotWhitelisted = 'MAKER_NOT_WHITELISTED',
+ TakerNotWhitelisted = 'TAKER_NOT_WHITELISTED',
+ AssetProxyDoesNotExist = 'ASSET_PROXY_DOES_NOT_EXIST',
+ LibBytesGreaterThanZeroLengthRequired = 'GREATER_THAN_ZERO_LENGTH_REQUIRED',
+ LibBytesGreaterOrEqualTo4LengthRequired = 'GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED',
+ LibBytesGreaterOrEqualTo20LengthRequired = 'GREATER_OR_EQUAL_TO_20_LENGTH_REQUIRED',
+ LibBytesGreaterOrEqualTo32LengthRequired = 'GREATER_OR_EQUAL_TO_32_LENGTH_REQUIRED',
+ LibBytesGreaterOrEqualToNestedBytesLengthRequired = 'GREATER_OR_EQUAL_TO_NESTED_BYTES_LENGTH_REQUIRED',
+ LibBytesGreaterOrEqualToSourceBytesLengthRequired = 'GREATER_OR_EQUAL_TO_SOURCE_BYTES_LENGTH_REQUIRED',
+ Erc20InsufficientBalance = 'ERC20_INSUFFICIENT_BALANCE',
+ Erc20InsufficientAllowance = 'ERC20_INSUFFICIENT_ALLOWANCE',
+ FeePercentageTooLarge = 'FEE_PERCENTAGE_TOO_LARGE',
+ ValueGreaterThanZero = 'VALUE_GREATER_THAN_ZERO',
+ InvalidMsgValue = 'INVALID_MSG_VALUE',
+ InsufficientEthRemaining = 'INSUFFICIENT_ETH_REMAINING',
+ Uint256Overflow = 'UINT256_OVERFLOW',
+}
+
+export enum StatusCodes {
+ Success = 200,
+ NotFound = 404,
+ InternalError = 500,
+ MethodNotAllowed = 405,
+ GatewayTimeout = 504,
+}
diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json
index 5ec2db5e0..ce916a635 100644
--- a/packages/types/tsconfig.json
+++ b/packages/types/tsconfig.json
@@ -1,8 +1,8 @@
{
"extends": "../../tsconfig",
"compilerOptions": {
- "typeRoots": ["node_modules/@types"],
+ "typeRoots": ["../../node_modules/@types", "node_modules/@types"],
"outDir": "lib"
},
- "include": ["./src/**/*"]
+ "include": ["src/**/*"]
}
diff --git a/packages/typescript-typings/CHANGELOG.json b/packages/typescript-typings/CHANGELOG.json
index 4e24094eb..566d9f24c 100644
--- a/packages/typescript-typings/CHANGELOG.json
+++ b/packages/typescript-typings/CHANGELOG.json
@@ -1,8 +1,162 @@
[
{
+ "timestamp": 1534210131,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Add types for `eth-lightwallet`",
+ "pr": 775
+ },
+ {
+ "note": "Improve 'web3-provider-engine' typings",
+ "pr": 768
+ },
+ {
+ "note": "Additional error type for `ethers.js`",
+ "pr": 763
+ },
+ {
+ "note": "Add @ledgerhq typings",
+ "pr": 770
+ }
+ ]
+ },
+ {
+ "version": "0.4.3",
+ "changes": [
+ {
+ "note": "Add back ethers-contracts types for Aquaduct which relies on it",
+ "pr": 885
+ }
+ ],
+ "timestamp": 1531919263
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.4.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.4.0",
+ "changes": [
+ {
+ "note": "Add types for `react-joyride`"
+ },
+ {
+ "note": "Add types for `react-popper`, remove types for `react-joyride`"
+ },
+ {
+ "note":
+ "Remove types for blockies, bn.js, compare-versions, ethereumjs-abi, ethereumjs-tx, find-versions, hdkey, is-mobile, solidity-parser-antlr, xml-js as they were moved to DefinitelyTyped",
+ "pr": 641
+ }
+ ]
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.3.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.3.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.3.0",
+ "changes": [
+ {
+ "note": "Add types for `ethers.js`, removing `ethers-contracts`",
+ "pr": 540
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.2.0",
+ "changes": [
+ {
+ "note": "Add types for `solc.compileStandardWrapper`",
+ "pr": 509
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "version": "0.1.0",
+ "changes": [
+ {
+ "note": "Add types for more packages",
+ "pr": 501
+ },
+ {
+ "note": "Add types for HDKey",
+ "pr": 507
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "timestamp": 1522673609,
+ "version": "0.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
"version": "0.0.2",
"changes": [],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
}
]
diff --git a/packages/typescript-typings/CHANGELOG.md b/packages/typescript-typings/CHANGELOG.md
index 26c23b7eb..70e6574b2 100644
--- a/packages/typescript-typings/CHANGELOG.md
+++ b/packages/typescript-typings/CHANGELOG.md
@@ -1,8 +1,70 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.4 - _August 13, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Add types for `eth-lightwallet` (#775)
+ * Improve 'web3-provider-engine' typings (#768)
+ * Additional error type for `ethers.js` (#763)
+ * Add @ledgerhq typings (#770)
+
+## v0.4.3 - _July 18, 2018_
+
+ * Add back ethers-contracts types for Aquaduct which relies on it (#885)
+
+## v0.4.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.4.0 - _June 19, 2018_
+
+ * Add types for `react-joyride`
+ * Add types for `react-popper`, remove types for `react-joyride`
+ * Remove types for blockies, bn.js, compare-versions, ethereumjs-abi, ethereumjs-tx, find-versions, hdkey, is-mobile, solidity-parser-antlr, xml-js as they were moved to DefinitelyTyped (#641)
+
+## v0.3.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.3.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.3.0 - _May 4, 2018_
+
+ * Add types for `ethers.js`, removing `ethers-contracts` (#540)
+
+## v0.2.0 - _April 18, 2018_
+
+ * Add types for `solc.compileStandardWrapper` (#509)
+
+## v0.1.0 - _April 11, 2018_
+
+ * Add types for more packages (#501)
+ * Add types for HDKey (#507)
+
+## v0.0.3 - _April 2, 2018_
+
+ * Dependencies updated
+
## v0.0.2 - _April 2, 2018_
diff --git a/packages/typescript-typings/README.md b/packages/typescript-typings/README.md
index 9a74739f3..439cb6484 100644
--- a/packages/typescript-typings/README.md
+++ b/packages/typescript-typings/README.md
@@ -20,11 +20,11 @@ This will allow the TS compiler to first look into that repo and then fallback t
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -38,6 +38,26 @@ Then install dependencies
yarn install
```
+### Build
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/typescript-typings yarn build
+```
+
+Or continuously rebuild on change:
+
+```bash
+PKG=@0xproject/typescript-typings yarn watch
+```
+
+### Clean
+
+```bash
+yarn clean
+```
+
### Lint
```bash
diff --git a/packages/typescript-typings/package.json b/packages/typescript-typings/package.json
index bec1b97c4..01a1d8adc 100644
--- a/packages/typescript-typings/package.json
+++ b/packages/typescript-typings/package.json
@@ -1,8 +1,12 @@
{
"name": "@0xproject/typescript-typings",
- "version": "0.0.2",
+ "version": "1.0.4",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x project typescript type definitions",
"scripts": {
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 1 './lib/**/*' ./scripts",
"clean": "shx rm -rf scripts",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
@@ -21,11 +25,14 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/typescript-typings#readme",
"dependencies": {
- "@0xproject/types": "^0.4.2",
- "bignumber.js": "~4.1.0"
+ "@types/bn.js": "^4.11.0",
+ "@types/react": "*",
+ "bignumber.js": "~4.1.0",
+ "ethereum-types": "^1.0.4",
+ "popper.js": "1.14.3"
},
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
+ "@0xproject/monorepo-scripts": "^1.0.5",
"copyfiles": "^1.2.0",
"shx": "^0.2.2"
},
diff --git a/packages/typescript-typings/types/@ledgerhq/index.d.ts b/packages/typescript-typings/types/@ledgerhq/index.d.ts
new file mode 100644
index 000000000..724dacb76
--- /dev/null
+++ b/packages/typescript-typings/types/@ledgerhq/index.d.ts
@@ -0,0 +1,45 @@
+// Ledgerco declarations
+interface ECSignatureString {
+ v: string;
+ r: string;
+ s: string;
+}
+interface ECSignature {
+ v: number;
+ r: string;
+ s: string;
+}
+
+interface LedgerTransport {
+ close(): Promise<void>;
+}
+
+declare module '@ledgerhq/hw-app-eth' {
+ class Eth {
+ public transport: LedgerTransport;
+ constructor(transport: LedgerTransport);
+ public getAddress(
+ path: string,
+ boolDisplay?: boolean,
+ boolChaincode?: boolean,
+ ): Promise<{ publicKey: string; address: string; chainCode: string }>;
+ public signTransaction(path: string, rawTxHex: string): Promise<ECSignatureString>;
+ public getAppConfiguration(): Promise<{ arbitraryDataEnabled: number; version: string }>;
+ public signPersonalMessage(path: string, messageHex: string): Promise<ECSignature>;
+ }
+ export default Eth;
+}
+
+declare module '@ledgerhq/hw-transport-u2f' {
+ export default class TransportU2F implements LedgerTransport {
+ public static create(): Promise<LedgerTransport>;
+ public close(): Promise<void>;
+ }
+}
+
+declare module '@ledgerhq/hw-transport-node-hid' {
+ export default class TransportNodeHid implements LedgerTransport {
+ public static create(): Promise<LedgerTransport>;
+ public close(): Promise<void>;
+ }
+}
diff --git a/packages/typescript-typings/types/async-child-process/index.d.ts b/packages/typescript-typings/types/async-child-process/index.d.ts
new file mode 100644
index 000000000..f8ed46378
--- /dev/null
+++ b/packages/typescript-typings/types/async-child-process/index.d.ts
@@ -0,0 +1 @@
+declare module 'async-child-process';
diff --git a/packages/typescript-typings/types/chai-bignumber/index.d.ts b/packages/typescript-typings/types/chai-bignumber/index.d.ts
new file mode 100644
index 000000000..802b69795
--- /dev/null
+++ b/packages/typescript-typings/types/chai-bignumber/index.d.ts
@@ -0,0 +1 @@
+declare module 'chai-bignumber';
diff --git a/packages/typescript-typings/types/chai/index.d.ts b/packages/typescript-typings/types/chai/index.d.ts
index 8b3e4c079..3bde1f27c 100644
--- a/packages/typescript-typings/types/chai/index.d.ts
+++ b/packages/typescript-typings/types/chai/index.d.ts
@@ -114,6 +114,9 @@ declare namespace Chai {
extensible: Assertion;
sealed: Assertion;
frozen: Assertion;
+ bignumber: Assertion;
+ // HACK: In order to comply with chai-as-promised we make eventually a `PromisedAssertion` not an `Assertion`
+ eventually: PromisedAssertion;
oneOf(list: any[], message?: string): Assertion;
}
@@ -148,7 +151,7 @@ declare namespace Chai {
}
interface NumberComparer {
- (value: number, message?: string): Assertion;
+ (value: number | object, message?: string): Assertion;
}
interface TypeComparison {
diff --git a/packages/typescript-typings/types/detect-node/index.d.ts b/packages/typescript-typings/types/detect-node/index.d.ts
new file mode 100644
index 000000000..4c58b8450
--- /dev/null
+++ b/packages/typescript-typings/types/detect-node/index.d.ts
@@ -0,0 +1,3 @@
+declare module 'detect-node' {
+ export const isNode: boolean;
+}
diff --git a/packages/typescript-typings/types/dirty-chai/index.d.ts b/packages/typescript-typings/types/dirty-chai/index.d.ts
new file mode 100644
index 000000000..91ed2021e
--- /dev/null
+++ b/packages/typescript-typings/types/dirty-chai/index.d.ts
@@ -0,0 +1 @@
+declare module 'dirty-chai';
diff --git a/packages/typescript-typings/types/es6-promisify/index.d.ts b/packages/typescript-typings/types/es6-promisify/index.d.ts
new file mode 100644
index 000000000..f9c202fb0
--- /dev/null
+++ b/packages/typescript-typings/types/es6-promisify/index.d.ts
@@ -0,0 +1 @@
+declare module 'es6-promisify';
diff --git a/packages/typescript-typings/types/eth-lightwallet/index.d.ts b/packages/typescript-typings/types/eth-lightwallet/index.d.ts
new file mode 100644
index 000000000..93daa5041
--- /dev/null
+++ b/packages/typescript-typings/types/eth-lightwallet/index.d.ts
@@ -0,0 +1,54 @@
+// eth-lightwallet declarations
+
+interface ECSignatureBuffer {
+ v: number;
+ r: Buffer;
+ s: Buffer;
+}
+declare module 'eth-lightwallet' {
+ // tslint:disable-next-line:class-name
+ export class signing {
+ public static signTx(
+ keystore: keystore,
+ pwDerivedKey: Uint8Array,
+ rawTx: string,
+ signingAddress: string,
+ ): string;
+ public static signMsg(
+ keystore: keystore,
+ pwDerivedKey: Uint8Array,
+ rawMsg: string,
+ signingAddress: string,
+ ): ECSignatureBuffer;
+ public static signMsgHash(
+ keystore: keystore,
+ pwDerivedKey: Uint8Array,
+ msgHash: string,
+ signingAddress: string,
+ ): ECSignatureBuffer;
+ public static concatSig(signature: any): string;
+ }
+ // tslint:disable-next-line:class-name
+ export class keystore {
+ public static createVault(options: any, callback?: (error: Error, keystore: keystore) => void): keystore;
+ public static generateRandomSeed(): string;
+ public static isSeedValid(seed: string): boolean;
+ public static deserialize(keystore: string): keystore;
+ public serialize(): string;
+ public keyFromPassword(
+ password: string,
+ callback?: (error: Error, pwDerivedKey: Uint8Array) => void,
+ ): Uint8Array;
+ public isDerivedKeyCorrect(pwDerivedKey: Uint8Array): boolean;
+ public generateNewAddress(pwDerivedKey: Uint8Array, numberOfAddresses: number): void;
+ public getSeed(pwDerivedKey: Uint8Array): string;
+ public exportPrivateKey(address: string, pwDerivedKey: Uint8Array): string;
+ public getAddresses(): string[];
+ }
+ interface VaultOptions {
+ password: string;
+ seedPhrase: string;
+ salt?: string;
+ hdPathString: string;
+ }
+}
diff --git a/packages/typescript-typings/types/ethereumjs-abi/index.d.ts b/packages/typescript-typings/types/ethereumjs-abi/index.d.ts
new file mode 100644
index 000000000..2d9fc9fcd
--- /dev/null
+++ b/packages/typescript-typings/types/ethereumjs-abi/index.d.ts
@@ -0,0 +1,7 @@
+declare module 'ethereumjs-abi' {
+ export function soliditySHA3(argTypes: string[], args: any[]): Buffer;
+ export function soliditySHA256(argTypes: string[], args: any[]): Buffer;
+ export function methodID(name: string, types: string[]): Buffer;
+ export function simpleEncode(signature: string, ...args: any[]): Buffer;
+ export function rawDecode(signature: string[], data: Buffer): any[];
+}
diff --git a/packages/typescript-typings/types/ethereumjs-util/index.d.ts b/packages/typescript-typings/types/ethereumjs-util/index.d.ts
new file mode 100644
index 000000000..b1c521e18
--- /dev/null
+++ b/packages/typescript-typings/types/ethereumjs-util/index.d.ts
@@ -0,0 +1,100 @@
+declare module 'ethereumjs-util' {
+ import BN = require('bn.js');
+
+ interface Signature {
+ v: number;
+ r: Buffer;
+ s: Buffer;
+ }
+
+ export const MAX_INTEGER: BN;
+
+ export const TWO_POW256: BN;
+
+ export const SHA3_NULL_S: string;
+
+ export const SHA3_NULL: Buffer;
+
+ export const SHA3_RLP_ARRAY_S: string;
+
+ export const SHA3_RLP_ARRAY: Buffer;
+
+ export const SHA3_RLP_S: string;
+
+ export const SHA3_RLP: Buffer;
+
+ export function zeros(bytes: number): Buffer;
+
+ export function setLength(msg: Buffer, length: number, right: boolean): Buffer;
+ export function setLength(msg: number[], length: number, right: boolean): number[];
+
+ export function setLengthLeft(msg: Buffer, length: number, right?: boolean): Buffer;
+ export function setLengthLeft(msg: number[], length: number, right?: boolean): number[];
+
+ export function setLengthRight(msg: Buffer, length: number): Buffer;
+ export function setLengthRight(msg: number[], length: number): number[];
+
+ export function unpad(a: Buffer): Buffer;
+ export function unpad(a: number[]): number[];
+ export function unpad(a: string): string;
+
+ export function toBuffer(v: any): Buffer;
+
+ export function bufferToInt(buf: Buffer): number;
+
+ export function bufferToHex(buf: Buffer): string;
+
+ export function fromSigned(num: Buffer): BN;
+
+ export function toUnsigned(num: BN): Buffer;
+
+ export function sha3(a: Buffer | string | number | number[], bits?: number): Buffer;
+
+ export function sha256(a: Buffer | string | number | number[]): Buffer;
+
+ export function ripemd160(a: Buffer | string | number | number[], padded?: boolean): Buffer;
+
+ export function rlphash(a: Buffer | string | number | number[]): Buffer;
+
+ export function isValidPrivate(privateKey: Buffer): boolean;
+
+ export function isValidPublic(publicKey: Buffer, sanitize?: boolean): boolean;
+
+ export function pubToAddress(publicKey: Buffer, sanitize?: boolean): Buffer;
+ export function publicToAddress(publicKey: Buffer, sanitize?: boolean): Buffer;
+
+ export function privateToPublic(privateKey: Buffer): Buffer;
+
+ export function importPublic(publicKey: Buffer): Buffer;
+
+ export function ecsign(message: Buffer, privateKey: Buffer): Signature;
+
+ export function hashPersonalMessage(message: Buffer | string): Buffer;
+
+ export function ecrecover(msgHash: Buffer, v: number, r: Buffer, s: Buffer): Buffer;
+
+ export function toRpcSig(v: number, r: Buffer, s: Buffer): string;
+
+ export function fromRpcSig(sig: string): Signature;
+
+ export function privateToAddress(privateKey: Buffer): Buffer;
+
+ export function isValidAddress(address: string): boolean;
+
+ export function toChecksumAddress(address: string): string;
+
+ export function isValidChecksumAddress(address: string): boolean;
+
+ export function generateAddress(from: Buffer | string, nonce: number | string | number[] | Buffer): Buffer;
+
+ export function isPrecompiled(address: Buffer | string): boolean;
+
+ export function addHexPrefix(str: string): string;
+
+ export function stripHexPrefix(str: string): string;
+
+ export function isValidSignature(v: number, r: Buffer | string, s: Buffer | string, homestead?: boolean): boolean;
+
+ export function baToJSON(ba: Buffer): string;
+ export function baToJSON(ba: any[]): string[];
+}
diff --git a/packages/typescript-typings/types/ethers-contracts/index.d.ts b/packages/typescript-typings/types/ethers-contracts/index.d.ts
deleted file mode 100644
index e5d38819e..000000000
--- a/packages/typescript-typings/types/ethers-contracts/index.d.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-declare module 'ethers-contracts' {
- export interface TransactionDescription {
- name: string;
- signature: string;
- sighash: string;
- data: string;
- }
- export interface CallDescription extends TransactionDescription {
- parse: (...args: any[]) => any;
- }
- export interface FunctionDescription {
- (...params: any[]): TransactionDescription | CallDescription;
- inputs: { names: string[]; types: string[] };
- outputs: { names: string[]; types: string[] };
- }
- export interface EventDescription {
- parse: (...args: any[]) => any;
- inputs: { names: string[]; types: string[] };
- signature: string;
- topic: string;
- }
- export class Interface {
- public functions: { [functionName: string]: FunctionDescription };
- public events: { [eventName: string]: EventDescription };
- public static decodeParams(types: string[], data: string): any[];
- constructor(abi: any);
- }
-}
diff --git a/packages/typescript-typings/types/ethers/index.d.ts b/packages/typescript-typings/types/ethers/index.d.ts
new file mode 100644
index 000000000..875563ba2
--- /dev/null
+++ b/packages/typescript-typings/types/ethers/index.d.ts
@@ -0,0 +1,55 @@
+declare module 'ethers' {
+ import { TxData } from 'ethereum-types';
+
+ export interface TransactionDescription {
+ name: string;
+ signature: string;
+ sighash: string;
+ data: string;
+ }
+ export interface CallDescription extends TransactionDescription {
+ parse: (...args: any[]) => any;
+ }
+ export interface FunctionDescription {
+ (...params: any[]): TransactionDescription | CallDescription;
+ inputs: { names: string[]; types: string[] };
+ outputs: { names: string[]; types: string[] };
+ type: string;
+ }
+ export interface EventDescription {
+ parse: (...args: any[]) => any;
+ inputs: { names: string[]; types: string[] };
+ signature: string;
+ topics: string[];
+ }
+ export class Interface {
+ public functions: { [functionName: string]: FunctionDescription };
+ public events: { [eventName: string]: EventDescription };
+ constructor(abi: any);
+ }
+ export class Contract {
+ public static getDeployTransaction(bytecode: string, abi: any, ...args: any[]): Partial<TxData>;
+ constructor(address: string, abi: any, provider: any);
+ }
+ const enum errors {
+ INVALID_ARGUMENT = 'INVALID_ARGUMENT',
+ }
+
+ export type ParamName = null | string | NestedParamName;
+
+ export interface NestedParamName {
+ name: string | null;
+ names: ParamName[];
+ }
+
+ export const utils: {
+ AbiCoder: {
+ defaultCoder: AbiCoder;
+ };
+ };
+
+ export interface AbiCoder {
+ encode: (names: ParamName[] | string[], types: string[] | any[], args: any[] | undefined) => string;
+ decode: (names: ParamName[] | string[], types: string[] | string, data: string | undefined) => any;
+ }
+}
diff --git a/packages/typescript-typings/types/ganache-core/index.d.ts b/packages/typescript-typings/types/ganache-core/index.d.ts
new file mode 100644
index 000000000..c07e6a78e
--- /dev/null
+++ b/packages/typescript-typings/types/ganache-core/index.d.ts
@@ -0,0 +1,16 @@
+declare module 'ganache-core' {
+ import { Provider } from 'ethereum-types';
+ export interface GanacheOpts {
+ verbose?: boolean;
+ logger?: {
+ log(msg: string): void;
+ };
+ port?: number;
+ network_id?: number;
+ networkId?: number;
+ mnemonic?: string;
+ gasLimit?: number;
+ }
+ // tslint:disable-next-line:completed-docs
+ export function provider(opts: GanacheOpts): Provider;
+}
diff --git a/packages/typescript-typings/types/json-rpc-error/index.d.ts b/packages/typescript-typings/types/json-rpc-error/index.d.ts
new file mode 100644
index 000000000..dfaf92167
--- /dev/null
+++ b/packages/typescript-typings/types/json-rpc-error/index.d.ts
@@ -0,0 +1,8 @@
+declare module 'json-rpc-error' {
+ export class InternalError extends Error {
+ constructor(err: Error | string);
+ }
+ export class MethodNotFound extends Error {
+ constructor();
+ }
+}
diff --git a/packages/typescript-typings/types/keccak/index.d.ts b/packages/typescript-typings/types/keccak/index.d.ts
new file mode 100644
index 000000000..0465f8faf
--- /dev/null
+++ b/packages/typescript-typings/types/keccak/index.d.ts
@@ -0,0 +1 @@
+declare module 'keccak';
diff --git a/packages/typescript-typings/types/newman/index.d.ts b/packages/typescript-typings/types/newman/index.d.ts
new file mode 100644
index 000000000..bea9ac160
--- /dev/null
+++ b/packages/typescript-typings/types/newman/index.d.ts
@@ -0,0 +1,24 @@
+declare module 'newman' {
+ export interface NewmanRunSummary {
+ run: NewmanRun;
+ }
+ export interface NewmanRun {
+ executions: NewmanRunExecution[];
+ }
+ export interface NewmanRunExecution {
+ item: NewmanRunExecutionItem;
+ assertions: NewmanRunExecutionAssertion[];
+ }
+ export interface NewmanRunExecutionItem {
+ name: string;
+ }
+ export interface NewmanRunExecutionAssertion {
+ assertion: string;
+ error: NewmanRunExecutionAssertionError;
+ }
+ export interface NewmanRunExecutionAssertionError {
+ message: string;
+ }
+ // tslint:disable-next-line:completed-docs
+ export function run(options: any, callback?: (err: Error | null, summary: NewmanRunSummary) => void): void;
+}
diff --git a/packages/typescript-typings/types/openapi-schema-validation/index.d.ts b/packages/typescript-typings/types/openapi-schema-validation/index.d.ts
new file mode 100644
index 000000000..123a6bdb7
--- /dev/null
+++ b/packages/typescript-typings/types/openapi-schema-validation/index.d.ts
@@ -0,0 +1 @@
+declare module 'openapi-schema-validation';
diff --git a/packages/typescript-typings/types/promisify-child-process/index.d.ts b/packages/typescript-typings/types/promisify-child-process/index.d.ts
new file mode 100644
index 000000000..55c041735
--- /dev/null
+++ b/packages/typescript-typings/types/promisify-child-process/index.d.ts
@@ -0,0 +1 @@
+declare module 'promisify-child-process';
diff --git a/packages/typescript-typings/types/publish-release/index.d.ts b/packages/typescript-typings/types/publish-release/index.d.ts
new file mode 100644
index 000000000..680cc45c9
--- /dev/null
+++ b/packages/typescript-typings/types/publish-release/index.d.ts
@@ -0,0 +1 @@
+declare module 'publish-release';
diff --git a/packages/typescript-typings/types/react-highlight/index.d.ts b/packages/typescript-typings/types/react-highlight/index.d.ts
new file mode 100644
index 000000000..875721533
--- /dev/null
+++ b/packages/typescript-typings/types/react-highlight/index.d.ts
@@ -0,0 +1 @@
+declare module 'react-highlight';
diff --git a/packages/typescript-typings/types/react-popper/index.d.ts b/packages/typescript-typings/types/react-popper/index.d.ts
new file mode 100644
index 000000000..d7dbca17f
--- /dev/null
+++ b/packages/typescript-typings/types/react-popper/index.d.ts
@@ -0,0 +1,49 @@
+// Type definitions for react-popper 1.0.0-beta.6
+// Project: https://github.com/gilbarbara/react-joyride
+
+declare module 'react-popper' {
+ import * as React from 'react';
+ import * as PopperJS from 'popper.js';
+
+ interface ManagerProps {
+ children: React.ReactNode;
+ }
+ export class Manager extends React.Component<ManagerProps, {}> {}
+
+ type RefHandler = (ref: HTMLElement | null) => void;
+
+ export interface ReferenceChildrenProps {
+ ref: RefHandler;
+ }
+
+ export interface ReferenceProps {
+ children: (props: ReferenceChildrenProps) => React.ReactNode;
+ }
+ export class Reference extends React.Component<ReferenceProps, {}> {}
+
+ export interface PopperArrowProps {
+ ref: RefHandler;
+ style: React.CSSProperties;
+ }
+
+ export type Placement = PopperJS.Placement;
+
+ export interface PopperChildrenProps {
+ arrowProps: PopperArrowProps;
+ outOfBoundaries: boolean | null;
+ placement: PopperJS.Placement;
+ ref: RefHandler;
+ scheduleUpdate: () => void;
+ style: React.CSSProperties;
+ }
+
+ export interface PopperProps {
+ children: (props: PopperChildrenProps) => React.ReactNode;
+ eventsEnabled?: boolean;
+ modifiers?: PopperJS.Modifiers;
+ placement?: PopperJS.Placement;
+ positionFixed?: boolean;
+ referenceElement?: Element;
+ }
+ export class Popper extends React.Component<PopperProps, {}> {}
+}
diff --git a/packages/typescript-typings/types/react-tooltip/index.d.ts b/packages/typescript-typings/types/react-tooltip/index.d.ts
new file mode 100644
index 000000000..98cb6d592
--- /dev/null
+++ b/packages/typescript-typings/types/react-tooltip/index.d.ts
@@ -0,0 +1 @@
+declare module 'react-tooltip';
diff --git a/packages/typescript-typings/types/request-promise-native/index.d.ts b/packages/typescript-typings/types/request-promise-native/index.d.ts
new file mode 100644
index 000000000..a86e99624
--- /dev/null
+++ b/packages/typescript-typings/types/request-promise-native/index.d.ts
@@ -0,0 +1 @@
+declare module 'request-promise-native';
diff --git a/packages/typescript-typings/types/rollbar/index.d.ts b/packages/typescript-typings/types/rollbar/index.d.ts
new file mode 100644
index 000000000..c9bec447d
--- /dev/null
+++ b/packages/typescript-typings/types/rollbar/index.d.ts
@@ -0,0 +1 @@
+declare module 'rollbar';
diff --git a/packages/typescript-typings/types/semver-diff/index.d.ts b/packages/typescript-typings/types/semver-diff/index.d.ts
new file mode 100644
index 000000000..e4a14eeb2
--- /dev/null
+++ b/packages/typescript-typings/types/semver-diff/index.d.ts
@@ -0,0 +1 @@
+declare module 'semver-diff';
diff --git a/packages/typescript-typings/types/semver-sort/index.d.ts b/packages/typescript-typings/types/semver-sort/index.d.ts
new file mode 100644
index 000000000..47310756a
--- /dev/null
+++ b/packages/typescript-typings/types/semver-sort/index.d.ts
@@ -0,0 +1,3 @@
+declare module 'semver-sort' {
+ const desc: (versions: string[]) => string[];
+}
diff --git a/packages/typescript-typings/types/solc/index.d.ts b/packages/typescript-typings/types/solc/index.d.ts
new file mode 100644
index 000000000..571bae101
--- /dev/null
+++ b/packages/typescript-typings/types/solc/index.d.ts
@@ -0,0 +1,156 @@
+declare module 'solc' {
+ export interface ContractCompilationResult {
+ srcmap: string;
+ srcmapRuntime: string;
+ bytecode: string;
+ runtimeBytecode: string;
+ interface: string;
+ }
+ export interface CompilationResult {
+ errors: string[];
+ contracts: {
+ [contractIdentifier: string]: ContractCompilationResult;
+ };
+ sources: {
+ [sourceName: string]: {
+ AST: any;
+ };
+ };
+ sourceList: string[];
+ }
+ export interface ImportContents {
+ contents: string;
+ }
+ export interface InputSources {
+ sources: {
+ [fileName: string]: string;
+ };
+ }
+ export interface BaseSource {
+ keccak256?: string;
+ }
+ export interface InMemorySource extends BaseSource {
+ content: string;
+ }
+ export interface UrlSource extends BaseSource {
+ urls: string[];
+ }
+ export type Source = UrlSource | InMemorySource;
+ export type OutputField =
+ | '*'
+ | 'ast'
+ | 'legacyAST'
+ | 'abi'
+ | 'devdoc'
+ | 'userdoc'
+ | 'metadata'
+ | 'ir'
+ | 'evm.assembly'
+ | 'evm.legacyAssembly'
+ | 'evm.bytecode.object'
+ | 'evm.bytecode.opcodes'
+ | 'evm.bytecode.sourceMap'
+ | 'evm.bytecode.linkReferences'
+ | 'evm.deployedBytecode.object'
+ | 'evm.deployedBytecode.opcodes'
+ | 'evm.deployedBytecode.sourceMap'
+ | 'evm.deployedBytecode.linkReferences'
+ | 'evm.methodIdentifiers'
+ | 'evm.gasEstimates'
+ | 'ewasm.wast'
+ | 'ewasm.wasm';
+ export interface CompilerSettings {
+ remappings?: string[];
+ optimizer?: {
+ enabled: boolean;
+ runs?: number;
+ };
+ evmVersion?: 'homestead' | 'tangerineWhistle' | 'spuriousDragon' | 'byzantium' | 'constantinople';
+ metadata?: {
+ useLiteralContent: true;
+ };
+ libraries?: {
+ [fileName: string]: {
+ [libName: string]: string;
+ };
+ };
+ outputSelection: {
+ [fileName: string]: {
+ [contractName: string]: OutputField[];
+ };
+ };
+ }
+ export interface StandardInput {
+ language: 'Solidity' | 'serpent' | 'lll' | 'assembly';
+ sources: {
+ [fileName: string]: Source;
+ };
+ settings: CompilerSettings;
+ }
+ export type ErrorType =
+ | 'JSONError'
+ | 'IOError'
+ | 'ParserError'
+ | 'DocstringParsingError'
+ | 'SyntaxError'
+ | 'DeclarationError'
+ | 'TypeError'
+ | 'UnimplementedFeatureError'
+ | 'InternalCompilerError'
+ | 'Exception'
+ | 'CompilerError'
+ | 'FatalError'
+ | 'Warning';
+ export type ErrorSeverity = 'error' | 'warning';
+ export interface Error {
+ sourceLocation?: {
+ file: string;
+ start: number;
+ end: number;
+ };
+ type: ErrorType;
+ component: 'general' | 'ewasm';
+ severity: ErrorSeverity;
+ message: string;
+ formattedMessage?: string;
+ }
+ import { ContractAbi } from 'ethereum-types';
+ export interface StandardContractOutput {
+ abi: ContractAbi;
+ evm: {
+ bytecode: {
+ object: string;
+ sourceMap: string;
+ };
+ deployedBytecode: {
+ object: string;
+ sourceMap: string;
+ };
+ };
+ }
+ export interface StandardOutput {
+ errors: Error[];
+ sources: {
+ [fileName: string]: {
+ id: number;
+ ast?: object;
+ legacyAST?: object;
+ };
+ };
+ contracts: {
+ [fileName: string]: {
+ [contractName: string]: StandardContractOutput;
+ };
+ };
+ }
+ export interface SolcInstance {
+ compile(
+ sources: InputSources,
+ optimizerEnabled: number,
+ findImports: (importPath: string) => ImportContents,
+ ): CompilationResult;
+ compileStandardWrapper(input: string, findImports: (importPath: string) => ImportContents): string;
+ }
+ export function loadRemoteVersion(versionName: string, cb: (err: Error | null, res?: SolcInstance) => void): void;
+ export function setupMethods(solcBin: any): SolcInstance;
+}
diff --git a/packages/typescript-typings/types/to-snake-case/index.d.ts b/packages/typescript-typings/types/to-snake-case/index.d.ts
new file mode 100644
index 000000000..39df3f852
--- /dev/null
+++ b/packages/typescript-typings/types/to-snake-case/index.d.ts
@@ -0,0 +1,4 @@
+declare function toSnakeCase(str: string): string;
+declare module 'to-snake-case' {
+ export = toSnakeCase;
+}
diff --git a/packages/typescript-typings/types/truffle-hdwalet-provider/index.d.ts b/packages/typescript-typings/types/truffle-hdwalet-provider/index.d.ts
new file mode 100644
index 000000000..007df61e0
--- /dev/null
+++ b/packages/typescript-typings/types/truffle-hdwalet-provider/index.d.ts
@@ -0,0 +1,11 @@
+declare module 'truffle-hdwallet-provider' {
+ import { JSONRPCRequestPayload, JSONRPCResponsePayload, Provider } from 'ethereum-types';
+ class HDWalletProvider implements Provider {
+ constructor(mnemonic: string, rpcUrl: string);
+ public sendAsync(
+ payload: JSONRPCRequestPayload,
+ callback: (err: Error, result: JSONRPCResponsePayload) => void,
+ ): void;
+ }
+ export = HDWalletProvider;
+}
diff --git a/packages/typescript-typings/types/web3-eth-abi/index.d.ts b/packages/typescript-typings/types/web3-eth-abi/index.d.ts
new file mode 100644
index 000000000..5d2f46e04
--- /dev/null
+++ b/packages/typescript-typings/types/web3-eth-abi/index.d.ts
@@ -0,0 +1,3 @@
+declare module 'web3-eth-abi' {
+ export function encodeParameters(typesArray: string[], parameters: any[]): string;
+}
diff --git a/packages/typescript-typings/types/web3-provider-engine/index.d.ts b/packages/typescript-typings/types/web3-provider-engine/index.d.ts
new file mode 100644
index 000000000..72ef434a7
--- /dev/null
+++ b/packages/typescript-typings/types/web3-provider-engine/index.d.ts
@@ -0,0 +1,62 @@
+declare module 'web3-provider-engine' {
+ import { Provider, JSONRPCRequestPayload, JSONRPCResponsePayload } from 'ethereum-types';
+ interface Web3ProviderEngineOptions {
+ pollingInterval?: number;
+ blockTracker?: any;
+ blockTrackerProvider?: any;
+ }
+ class Web3ProviderEngine implements Provider {
+ constructor(options?: Web3ProviderEngineOptions);
+ public on(event: string, handler: () => void): void;
+ public send(payload: JSONRPCRequestPayload): void;
+ public sendAsync(
+ payload: JSONRPCRequestPayload,
+ callback: (error: null | Error, response: JSONRPCResponsePayload) => void,
+ ): void;
+ public addProvider(provider: any): void;
+ // start block polling
+ public start(callback?: () => void): void;
+ // stop block polling
+ public stop(): void;
+ }
+ export = Web3ProviderEngine;
+}
+
+declare module 'web3-provider-engine/subproviders/nonce-tracker';
+declare module 'web3-provider-engine/subproviders/hooked-wallet';
+declare module 'web3-provider-engine/subproviders/filters';
+// web3-provider-engine declarations
+declare module 'web3-provider-engine/subproviders/subprovider' {
+ class Subprovider {}
+ export = Subprovider;
+}
+declare module 'web3-provider-engine/subproviders/rpc' {
+ import { JSONRPCRequestPayload, JSONRPCResponsePayload } from 'ethereum-types';
+ class RpcSubprovider {
+ constructor(options: { rpcUrl: string });
+ public handleRequest(
+ payload: JSONRPCRequestPayload,
+ next: () => void,
+ end: (err: Error | null, data?: JSONRPCResponsePayload) => void,
+ ): void;
+ }
+ export = RpcSubprovider;
+}
+declare module 'web3-provider-engine/util/rpc-cache-utils' {
+ class ProviderEngineRpcUtils {
+ public static blockTagForPayload(payload: any): string | null;
+ }
+ export = ProviderEngineRpcUtils;
+}
+declare module 'web3-provider-engine/subproviders/fixture' {
+ import { JSONRPCRequestPayload, JSONRPCResponsePayload } from 'ethereum-types';
+ class FixtureSubprovider {
+ constructor(staticResponses: any);
+ public handleRequest(
+ payload: JSONRPCRequestPayload,
+ next: () => void,
+ end: (err: Error | null, data?: JSONRPCResponsePayload) => void,
+ ): void;
+ }
+ export = FixtureSubprovider;
+}
diff --git a/packages/typescript-typings/types/web3/index.d.ts b/packages/typescript-typings/types/web3/index.d.ts
index f4ebd41b9..4085c71a7 100644
--- a/packages/typescript-typings/types/web3/index.d.ts
+++ b/packages/typescript-typings/types/web3/index.d.ts
@@ -6,6 +6,7 @@ declare module 'web3' {
BlockWithoutTransactionData,
BlockParam,
CallData,
+ Provider,
Unit,
TxData,
Transaction,
@@ -15,23 +16,23 @@ declare module 'web3' {
LogEntryEvent,
JSONRPCRequestPayload,
JSONRPCResponsePayload,
- } from '@0xproject/types';
+ } from 'ethereum-types';
type MixedData = string | number | object | any[] | BigNumber.BigNumber;
class Web3 {
public static providers: typeof providers;
- public currentProvider: Web3.Provider;
+ public currentProvider: Provider;
public eth: Web3.EthApi;
public personal: Web3.PersonalApi | undefined;
public version: Web3.VersionApi;
public net: Web3.NetApi;
- public constructor(provider?: Web3.Provider);
+ public constructor(provider?: Provider);
public isConnected(): boolean;
- public setProvider(provider: Web3.Provider): void;
+ public setProvider(provider: Provider): void;
public reset(keepIsSyncing: boolean): void;
public toHex(data: MixedData): string;
public toAscii(hex: string): string;
@@ -49,7 +50,7 @@ declare module 'web3' {
}
namespace providers {
- class HttpProvider implements Web3.Provider {
+ class HttpProvider implements Provider {
constructor(url?: string, timeout?: number, username?: string, password?: string);
public sendAsync(
payload: JSONRPCRequestPayload,
@@ -77,13 +78,6 @@ declare module 'web3' {
stopWatching(callback?: () => void): void;
}
- interface Provider {
- sendAsync(
- payload: JSONRPCRequestPayload,
- callback: (err: Error, result: JSONRPCResponsePayload) => void,
- ): void;
- }
-
interface Sha3Options {
encoding: 'hex';
}
diff --git a/packages/utils/CHANGELOG.json b/packages/utils/CHANGELOG.json
index 887b515d0..3e3e1125b 100644
--- a/packages/utils/CHANGELOG.json
+++ b/packages/utils/CHANGELOG.json
@@ -1,13 +1,170 @@
[
{
+ "version": "1.0.5",
+ "changes": [
+ {
+ "note": "Increased BigNumber decimal precision from 20 to 78",
+ "pr": 807
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.0.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.0.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532605697,
+ "version": "1.0.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Add `AbortController` polyfill to `fetchAsync`",
+ "pr": 903
+ }
+ ],
+ "timestamp": 1532357734
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Add `fetchAsync` which adds a default timeout to all requests",
+ "pr": 874
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.7.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.7.2",
+ "changes": [
+ {
+ "note": "Added errorUtils.spawnSwitchErr"
+ },
+ {
+ "note": "Add logUtils.warn",
+ "pr": 589
+ },
+ {
+ "note": "Fixes uncaught Error in abi_decoder",
+ "pr": 763
+ }
+ ],
+ "timestamp": 1531149657
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.7.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.7.0",
+ "changes": [
+ {
+ "note": "Incorrect publish that was unpublished"
+ }
+ ],
+ "timestamp": 1527810075
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.6.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.6.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.6.0",
+ "changes": [
+ {
+ "note": "Update ethers-contracts to ethers.js",
+ "pr": 540
+ }
+ ],
+ "timestamp": 1525428773
+ },
+ {
+ "version": "0.5.2",
+ "changes": [
+ {
+ "note": "Export NULL_BYTES constant",
+ "pr": 500
+ }
+ ],
+ "timestamp": 1524044013
+ },
+ {
+ "timestamp": 1523462196,
+ "version": "0.5.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.5.0",
+ "changes": [
+ {
+ "note": "Make `AbiDecoder.addABI` public",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
"timestamp": 1522658513,
"version": "0.4.4",
"changes": [
{
"note": "Dependencies updated"
}
- ],
- "isPublished": true
+ ]
},
{
"version": "0.4.3",
@@ -17,8 +174,7 @@
"Add `@types/node` to dependencies since `intervalUtils` has the `NodeJS` type as part of its public interface."
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.4.2",
@@ -28,8 +184,7 @@
"pr": 452
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.4.0",
@@ -43,8 +198,7 @@
"pr": 429
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.3.2",
@@ -54,8 +208,7 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
},
{
"version": "0.3.0",
@@ -66,8 +219,7 @@
"pr": 366
}
],
- "timestamp": 1517756400,
- "isPublished": true
+ "timestamp": 1517756400
},
{
"version": "0.2.0",
@@ -81,7 +233,6 @@
"pr": 312
}
],
- "timestamp": 1516114800,
- "isPublished": true
+ "timestamp": 1516114800
}
]
diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md
index 88a6502e9..bdde2687d 100644
--- a/packages/utils/CHANGELOG.md
+++ b/packages/utils/CHANGELOG.md
@@ -1,36 +1,102 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.0.5 - _August 13, 2018_
+
+ * Increased BigNumber decimal precision from 20 to 78 (#807)
+
+## v1.0.4 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.3 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.0.1 - _July 23, 2018_
+
+ * Add `AbortController` polyfill to `fetchAsync` (#903)
+
+## v1.0.0 - _July 19, 2018_
+
+ * Add `fetchAsync` which adds a default timeout to all requests (#874)
+
+## v0.7.3 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.7.2 - _July 9, 2018_
+
+ * Added errorUtils.spawnSwitchErr
+ * Add logUtils.warn (#589)
+ * Fixes uncaught Error in abi_decoder (#763)
+
+## v0.7.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.7.0 - _May 31, 2018_
+
+ * Incorrect publish that was unpublished
+
+## v0.6.2 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.6.1 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.0 - _May 4, 2018_
+
+ * Update ethers-contracts to ethers.js (#540)
+
+## v0.5.2 - _April 18, 2018_
+
+ * Export NULL_BYTES constant (#500)
+
+## v0.5.1 - _April 11, 2018_
+
+ * Dependencies updated
+
+## v0.5.0 - _April 2, 2018_
+
+ * Make `AbiDecoder.addABI` public (#485)
+
## v0.4.4 - _April 2, 2018_
* Dependencies updated
-## v0.4.3 - _March 18, 2018_
+## v0.4.3 - _March 17, 2018_
* Add `@types/node` to dependencies since `intervalUtils` has the `NodeJS` type as part of its public interface.
-## v0.4.2 - _March 18, 2018_
+## v0.4.2 - _March 17, 2018_
* Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
-## v0.4.0 - _March 4, 2018_
+## v0.4.0 - _March 3, 2018_
* Use `ethers-contracts` as a backend to decode event args (#413)
* Move web3 types from devDep to dep since required when using this package (#429)
-## v0.3.2 - _February 9, 2018_
+## v0.3.2 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
-## v0.3.0 - _February 5, 2018_
+## v0.3.0 - _February 4, 2018_
* Fix a bug related to event signature collisions (argument indexes aren't included in event signatures) in the abi_decoder. The decoder used to throw on unknown events with identical signatures as a known event (except indexes). (#366)
-## v0.2.0 - _January 17, 2018_
+## v0.2.0 - _January 16, 2018_
* Add `onError` parameter to `intervalUtils.setAsyncExcludingInterval` (#312)
* Add `intervalUtils.setInterval` (#312)
diff --git a/packages/utils/README.md b/packages/utils/README.md
index fde0780a9..c9a2f5846 100644
--- a/packages/utils/README.md
+++ b/packages/utils/README.md
@@ -22,13 +22,28 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
import { addressUtils, bigNumberConfigs, classUtils, intervalUtils, promisify } from '@0xproject/utils';
```
+## Troubleshooting
+
+If you are still seeing TS type errors complaining about missing DOM types such as `Response`:
+
+```
+error TS2304: Cannot find name 'Response'.
+```
+
+Then you need to explicitly add the `dom` lib to your compiler options in `tsconfig.json`. The `dom` library is included by default, but customizing the `lib` option can cause it to be dropped.
+
+```
+"compilerOptions": {
+ "lib": [..., "dom"],
+```
+
## Contributing
-We strongly recommend that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -44,14 +59,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/utils yarn build
+```
+
+Or continuously rebuild on change:
+
```bash
-yarn build
+PKG=@0xproject/utils yarn watch
```
-or
+### Clean
```bash
-yarn build:watch
+yarn clean
```
### Lint
diff --git a/packages/utils/coverage/.gitkeep b/packages/utils/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/utils/coverage/.gitkeep
diff --git a/packages/utils/package.json b/packages/utils/package.json
index ba11c2e06..0fd925715 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,14 +1,22 @@
{
"name": "@0xproject/utils",
- "version": "0.4.4",
+ "version": "1.0.5",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "0x TS utils",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
+ "watch_without_deps": "tsc -w",
"build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'src/**/*.ts'",
+ "test": "yarn run_mocha",
+ "test:circleci": "yarn test:coverage",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
+ "lint": "tslint --project .",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js"
},
"license": "Apache-2.0",
@@ -21,24 +29,32 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/utils/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
+ "@types/mocha": "^2.2.42",
+ "chai": "^4.0.1",
"copyfiles": "^1.2.0",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"shx": "^0.2.2",
- "tslint": "5.8.0",
- "typescript": "2.7.1"
+ "tslint": "5.11.0",
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
+ "@0xproject/types": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
"@types/node": "^8.0.53",
+ "abortcontroller-polyfill": "^1.1.9",
"bignumber.js": "~4.1.0",
- "ethers-contracts": "^2.2.1",
+ "detect-node": "2.0.3",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-util": "^5.1.1",
+ "ethers": "3.0.22",
+ "isomorphic-fetch": "^2.2.1",
"js-sha3": "^0.7.0",
- "lodash": "^4.17.4",
- "web3": "^0.20.0"
+ "lodash": "^4.17.5"
},
"publishConfig": {
"access": "public"
diff --git a/packages/utils/src/abi_decoder.ts b/packages/utils/src/abi_decoder.ts
index d49906cfb..7f93e746e 100644
--- a/packages/utils/src/abi_decoder.ts
+++ b/packages/utils/src/abi_decoder.ts
@@ -8,53 +8,55 @@ import {
LogWithDecodedArgs,
RawLog,
SolidityTypes,
-} from '@0xproject/types';
-import * as ethersContracts from 'ethers-contracts';
+} from 'ethereum-types';
+import * as ethers from 'ethers';
import * as _ from 'lodash';
+import { addressUtils } from './address_utils';
import { BigNumber } from './configured_bignumber';
export class AbiDecoder {
- private _savedABIs: AbiDefinition[] = [];
- private _methodIds: { [signatureHash: string]: EventAbi } = {};
- private static _padZeros(address: string) {
- let formatted = address;
- if (_.startsWith(formatted, '0x')) {
- formatted = formatted.slice(2);
- }
-
- formatted = _.padStart(formatted, 40, '0');
- return `0x${formatted}`;
- }
+ private readonly _methodIds: { [signatureHash: string]: EventAbi } = {};
constructor(abiArrays: AbiDefinition[][]) {
- _.forEach(abiArrays, this._addABI.bind(this));
+ _.forEach(abiArrays, this.addABI.bind(this));
}
// This method can only decode logs from the 0x & ERC20 smart contracts
- public tryToDecodeLogOrNoop<ArgsType>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
+ public tryToDecodeLogOrNoop<ArgsType extends DecodedLogArgs>(log: LogEntry): LogWithDecodedArgs<ArgsType> | RawLog {
const methodId = log.topics[0];
const event = this._methodIds[methodId];
if (_.isUndefined(event)) {
return log;
}
- const ethersInterface = new ethersContracts.Interface([event]);
- const logData = log.data;
+ const ethersInterface = new ethers.Interface([event]);
const decodedParams: DecodedLogArgs = {};
let topicsIndex = 1;
- const nonIndexedInputs = _.filter(event.inputs, input => !input.indexed);
- const dataTypes = _.map(nonIndexedInputs, input => input.type);
- const decodedData = ethersInterface.events[event.name].parse(log.data);
+ let decodedData: any[];
+ try {
+ decodedData = ethersInterface.events[event.name].parse(log.data);
+ } catch (error) {
+ if (error.code === ethers.errors.INVALID_ARGUMENT) {
+ // Because we index events by Method ID, and Method IDs are derived from the method
+ // name and the input parameters, it's possible that the return value of the event
+ // does not match our ABI. If that's the case, then ethers will throw an error
+ // when we try to parse the event. We handle that case here by returning the log rather
+ // than throwing an error.
+ return log;
+ }
+ throw error;
+ }
- let failedToDecode = false;
+ let didFailToDecode = false;
_.forEach(event.inputs, (param: EventParameter, i: number) => {
// Indexed parameters are stored in topics. Non-indexed ones in decodedData
let value: BigNumber | string | number = param.indexed ? log.topics[topicsIndex++] : decodedData[i];
if (_.isUndefined(value)) {
- failedToDecode = true;
+ didFailToDecode = true;
return;
}
if (param.type === SolidityTypes.Address) {
- value = AbiDecoder._padZeros(new BigNumber(value).toString(16));
+ const baseHex = 16;
+ value = addressUtils.padZeros(new BigNumber(value).toString(baseHex));
} else if (param.type === SolidityTypes.Uint256 || param.type === SolidityTypes.Uint) {
value = new BigNumber(value);
} else if (param.type === SolidityTypes.Uint8) {
@@ -63,7 +65,7 @@ export class AbiDecoder {
decodedParams[param.name] = value;
});
- if (failedToDecode) {
+ if (didFailToDecode) {
return log;
} else {
return {
@@ -73,17 +75,16 @@ export class AbiDecoder {
};
}
}
- private _addABI(abiArray: AbiDefinition[]): void {
+ public addABI(abiArray: AbiDefinition[]): void {
if (_.isUndefined(abiArray)) {
return;
}
- const ethersInterface = new ethersContracts.Interface(abiArray);
+ const ethersInterface = new ethers.Interface(abiArray);
_.map(abiArray, (abi: AbiDefinition) => {
if (abi.type === AbiType.Event) {
- const topic = ethersInterface.events[abi.name].topic;
+ const topic = ethersInterface.events[abi.name].topics[0];
this._methodIds[topic] = abi;
}
});
- this._savedABIs = this._savedABIs.concat(abiArray);
}
}
diff --git a/packages/utils/src/abi_utils.ts b/packages/utils/src/abi_utils.ts
new file mode 100644
index 000000000..c9b70966c
--- /dev/null
+++ b/packages/utils/src/abi_utils.ts
@@ -0,0 +1,224 @@
+import { AbiDefinition, AbiType, ContractAbi, DataItem, MethodAbi } from 'ethereum-types';
+import * as ethers from 'ethers';
+import * as _ from 'lodash';
+
+import { BigNumber } from './configured_bignumber';
+
+// Note(albrow): This function is unexported in ethers.js. Copying it here for
+// now.
+// Source: https://github.com/ethers-io/ethers.js/blob/884593ab76004a808bf8097e9753fb5f8dcc3067/contracts/interface.js#L30
+function parseEthersParams(params: DataItem[]): { names: ethers.ParamName[]; types: string[] } {
+ const names: ethers.ParamName[] = [];
+ const types: string[] = [];
+
+ params.forEach((param: DataItem) => {
+ if (param.components != null) {
+ let suffix = '';
+ const arrayBracket = param.type.indexOf('[');
+ if (arrayBracket >= 0) {
+ suffix = param.type.substring(arrayBracket);
+ }
+
+ const result = parseEthersParams(param.components);
+ names.push({ name: param.name || null, names: result.names });
+ types.push('tuple(' + result.types.join(',') + ')' + suffix);
+ } else {
+ names.push(param.name || null);
+ types.push(param.type);
+ }
+ });
+
+ return {
+ names,
+ types,
+ };
+}
+
+// returns true if x is equal to y and false otherwise. Performs some minimal
+// type conversion and data massaging for x and y, depending on type. name and
+// type should typically be derived from parseEthersParams.
+function isAbiDataEqual(name: ethers.ParamName, type: string, x: any, y: any): boolean {
+ if (_.isUndefined(x) && _.isUndefined(y)) {
+ return true;
+ } else if (_.isUndefined(x) && !_.isUndefined(y)) {
+ return false;
+ } else if (!_.isUndefined(x) && _.isUndefined(y)) {
+ return false;
+ }
+ if (_.endsWith(type, '[]')) {
+ // For array types, we iterate through the elements and check each one
+ // individually. Strangely, name does not need to be changed in this
+ // case.
+ if (x.length !== y.length) {
+ return false;
+ }
+ const newType = _.trimEnd(type, '[]');
+ for (let i = 0; i < x.length; i++) {
+ if (!isAbiDataEqual(name, newType, x[i], y[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (_.startsWith(type, 'tuple(')) {
+ if (_.isString(name)) {
+ throw new Error('Internal error: type was tuple but names was a string');
+ } else if (_.isNull(name)) {
+ throw new Error('Internal error: type was tuple but names was null');
+ }
+ // For tuples, we iterate through the underlying values and check each
+ // one individually.
+ const types = splitTupleTypes(type);
+ if (types.length !== name.names.length) {
+ throw new Error(
+ `Internal error: parameter types/names length mismatch (${types.length} != ${name.names.length})`,
+ );
+ }
+ for (let i = 0; i < types.length; i++) {
+ // For tuples, name is an object with a names property that is an
+ // array. As an example, for orders, name looks like:
+ //
+ // {
+ // name: 'orders',
+ // names: [
+ // 'makerAddress',
+ // // ...
+ // 'takerAssetData'
+ // ]
+ // }
+ //
+ const nestedName = _.isString(name.names[i])
+ ? (name.names[i] as string)
+ : ((name.names[i] as ethers.NestedParamName).name as string);
+ if (!isAbiDataEqual(name.names[i], types[i], x[nestedName], y[nestedName])) {
+ return false;
+ }
+ }
+ return true;
+ } else if (type === 'address' || type === 'bytes') {
+ // HACK(albrow): ethers.js returns the checksummed address even when
+ // initially passed in a non-checksummed address. To account for that,
+ // we convert to lowercase before comparing.
+ return _.isEqual(_.toLower(x), _.toLower(y));
+ } else if (_.startsWith(type, 'uint') || _.startsWith(type, 'int')) {
+ return new BigNumber(x).eq(new BigNumber(y));
+ }
+ return _.isEqual(x, y);
+}
+
+// splitTupleTypes splits a tuple type string (of the form `tuple(X)` where X is
+// any other type or list of types) into its component types. It works with
+// nested tuples, so, e.g., `tuple(tuple(uint256,address),bytes32)` will yield:
+// `['tuple(uint256,address)', 'bytes32']`. It expects exactly one tuple type as
+// an argument (not an array).
+function splitTupleTypes(type: string): string[] {
+ if (_.endsWith(type, '[]')) {
+ throw new Error('Internal error: array types are not supported');
+ } else if (!_.startsWith(type, 'tuple(')) {
+ throw new Error('Internal error: expected tuple type but got non-tuple type: ' + type);
+ }
+ // Trim the outtermost tuple().
+ const trimmedType = type.substring('tuple('.length, type.length - 1);
+ const types: string[] = [];
+ let currToken = '';
+ let parenCount = 0;
+ // Tokenize the type string while keeping track of parentheses.
+ for (const char of trimmedType) {
+ switch (char) {
+ case '(':
+ parenCount += 1;
+ currToken += char;
+ break;
+ case ')':
+ parenCount -= 1;
+ currToken += char;
+ break;
+ case ',':
+ if (parenCount === 0) {
+ types.push(currToken);
+ currToken = '';
+ break;
+ } else {
+ currToken += char;
+ break;
+ }
+ default:
+ currToken += char;
+ break;
+ }
+ }
+ types.push(currToken);
+ return types;
+}
+
+export const abiUtils = {
+ parseEthersParams,
+ isAbiDataEqual,
+ splitTupleTypes,
+ parseFunctionParam(param: DataItem): string {
+ if (param.type === 'tuple') {
+ // Parse out tuple types into {type_1, type_2, ..., type_N}
+ const tupleComponents = param.components;
+ const paramString = _.map(tupleComponents, component => abiUtils.parseFunctionParam(component));
+ const tupleParamString = `{${paramString}}`;
+ return tupleParamString;
+ }
+ return param.type;
+ },
+ getFunctionSignature(methodAbi: MethodAbi): string {
+ const functionName = methodAbi.name;
+ const parameterTypeList = _.map(methodAbi.inputs, (param: DataItem) => abiUtils.parseFunctionParam(param));
+ const functionSignature = `${functionName}(${parameterTypeList})`;
+ return functionSignature;
+ },
+ /**
+ * Solidity supports function overloading whereas TypeScript does not.
+ * See: https://solidity.readthedocs.io/en/v0.4.21/contracts.html?highlight=overload#function-overloading
+ * In order to support overloaded functions, we suffix overloaded function names with an index.
+ * This index should be deterministic, regardless of function ordering within the smart contract. To do so,
+ * we assign indexes based on the alphabetical order of function signatures.
+ *
+ * E.g
+ * ['f(uint)', 'f(uint,byte32)']
+ * Should always be renamed to:
+ * ['f1(uint)', 'f2(uint,byte32)']
+ * Regardless of the order in which these these overloaded functions are declared within the contract ABI.
+ */
+ renameOverloadedMethods(inputContractAbi: ContractAbi): ContractAbi {
+ const contractAbi = _.cloneDeep(inputContractAbi);
+ const methodAbis = contractAbi.filter((abi: AbiDefinition) => abi.type === AbiType.Function) as MethodAbi[];
+ // Sort method Abis into alphabetical order, by function signature
+ const methodAbisOrdered = _.sortBy(methodAbis, [
+ (methodAbi: MethodAbi) => {
+ const functionSignature = abiUtils.getFunctionSignature(methodAbi);
+ return functionSignature;
+ },
+ ]);
+ // Group method Abis by name (overloaded methods will be grouped together, in alphabetical order)
+ const methodAbisByName: { [key: string]: MethodAbi[] } = {};
+ _.each(methodAbisOrdered, methodAbi => {
+ (methodAbisByName[methodAbi.name] || (methodAbisByName[methodAbi.name] = [])).push(methodAbi);
+ });
+ // Rename overloaded methods to overloadedMethodName1, overloadedMethodName2, ...
+ _.each(methodAbisByName, methodAbisWithSameName => {
+ _.each(methodAbisWithSameName, (methodAbi, i: number) => {
+ if (methodAbisWithSameName.length > 1) {
+ const overloadedMethodId = i + 1;
+ const sanitizedMethodName = `${methodAbi.name}${overloadedMethodId}`;
+ const indexOfExistingAbiWithSanitizedMethodNameIfExists = _.findIndex(
+ methodAbis,
+ currentMethodAbi => currentMethodAbi.name === sanitizedMethodName,
+ );
+ if (indexOfExistingAbiWithSanitizedMethodNameIfExists >= 0) {
+ const methodName = methodAbi.name;
+ throw new Error(
+ `Failed to rename overloaded method '${methodName}' to '${sanitizedMethodName}'. A method with this name already exists.`,
+ );
+ }
+ methodAbi.name = sanitizedMethodName;
+ }
+ });
+ });
+ return contractAbi;
+ },
+};
diff --git a/packages/utils/src/address_utils.ts b/packages/utils/src/address_utils.ts
index f94985441..1fc960408 100644
--- a/packages/utils/src/address_utils.ts
+++ b/packages/utils/src/address_utils.ts
@@ -1,7 +1,10 @@
+import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util';
import * as jsSHA3 from 'js-sha3';
+import * as _ from 'lodash';
const BASIC_ADDRESS_REGEX = /^(0x)?[0-9a-f]{40}$/i;
const SAME_CASE_ADDRESS_REGEX = /^(0x)?([0-9a-f]{40}|[0-9A-F]{40})$/;
+const ADDRESS_LENGTH = 40;
export const addressUtils = {
isChecksumAddress(address: string): boolean {
@@ -9,11 +12,15 @@ export const addressUtils = {
const unprefixedAddress = address.replace('0x', '');
const addressHash = jsSHA3.keccak256(unprefixedAddress.toLowerCase());
- for (let i = 0; i < 40; i++) {
+ for (let i = 0; i < ADDRESS_LENGTH; i++) {
// The nth letter should be uppercase if the nth digit of casemap is 1
+ const hexBase = 16;
+ const lowercaseRange = 7;
if (
- (parseInt(addressHash[i], 16) > 7 && unprefixedAddress[i].toUpperCase() !== unprefixedAddress[i]) ||
- (parseInt(addressHash[i], 16) <= 7 && unprefixedAddress[i].toLowerCase() !== unprefixedAddress[i])
+ (parseInt(addressHash[i], hexBase) > lowercaseRange &&
+ unprefixedAddress[i].toUpperCase() !== unprefixedAddress[i]) ||
+ (parseInt(addressHash[i], hexBase) <= lowercaseRange &&
+ unprefixedAddress[i].toLowerCase() !== unprefixedAddress[i])
) {
return false;
}
@@ -33,4 +40,7 @@ export const addressUtils = {
return isValidChecksummedAddress;
}
},
+ padZeros(address: string): string {
+ return addHexPrefix(_.padStart(stripHexPrefix(address), ADDRESS_LENGTH, '0'));
+ },
};
diff --git a/packages/utils/src/configured_bignumber.ts b/packages/utils/src/configured_bignumber.ts
index e44c062c2..2b22b6938 100644
--- a/packages/utils/src/configured_bignumber.ts
+++ b/packages/utils/src/configured_bignumber.ts
@@ -1,9 +1,14 @@
import { BigNumber } from 'bignumber.js';
-// By default BigNumber's `toString` method converts to exponential notation if the value has
-// more then 20 digits. We want to avoid this behavior, so we set EXPONENTIAL_AT to a high number
BigNumber.config({
+ // By default BigNumber's `toString` method converts to exponential notation if the value has
+ // more then 20 digits. We want to avoid this behavior, so we set EXPONENTIAL_AT to a high number
EXPONENTIAL_AT: 1000,
+ // Note(albrow): This is the lowest value for which
+ // `x.div(y).floor() === x.divToInt(y)`
+ // for all values of x and y <= MAX_UINT256, where MAX_UINT256 is the
+ // maximum number represented by the uint256 type in Solidity (2^256-1).
+ DECIMAL_PLACES: 78,
});
export { BigNumber };
diff --git a/packages/utils/src/constants.ts b/packages/utils/src/constants.ts
new file mode 100644
index 000000000..2894d4747
--- /dev/null
+++ b/packages/utils/src/constants.ts
@@ -0,0 +1 @@
+export const NULL_BYTES = '0x';
diff --git a/packages/utils/src/error_utils.ts b/packages/utils/src/error_utils.ts
new file mode 100644
index 000000000..735d3940b
--- /dev/null
+++ b/packages/utils/src/error_utils.ts
@@ -0,0 +1,5 @@
+export const errorUtils = {
+ spawnSwitchErr(name: string, value: any): Error {
+ return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
+ },
+};
diff --git a/packages/utils/src/fetchAsync.ts b/packages/utils/src/fetchAsync.ts
new file mode 100644
index 000000000..b4c85718d
--- /dev/null
+++ b/packages/utils/src/fetchAsync.ts
@@ -0,0 +1,40 @@
+import isNode = require('detect-node');
+import 'isomorphic-fetch';
+// WARNING: This needs to be imported after isomorphic-fetch: https://github.com/mo/abortcontroller-polyfill#using-it-on-browsers-without-fetch
+// tslint:disable-next-line:ordered-imports
+import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
+
+export const fetchAsync = async (
+ endpoint: string,
+ options: RequestInit = {},
+ timeoutMs: number = 20000,
+): Promise<Response> => {
+ if (options.signal || (options as any).timeout) {
+ throw new Error(
+ 'Cannot call fetchAsync with options.signal or options.timeout. To set a timeout, please use the supplied "timeoutMs" parameter.',
+ );
+ }
+ let optionsWithAbortParam;
+ if (!isNode) {
+ const controller = new AbortController();
+ const signal = controller.signal;
+ setTimeout(() => {
+ controller.abort();
+ }, timeoutMs);
+ optionsWithAbortParam = {
+ signal,
+ ...options,
+ };
+ } else {
+ // HACK: the `timeout` param only exists in `node-fetch`, and not on the `isomorphic-fetch`
+ // `RequestInit` type. Since `isomorphic-fetch` conditionally wraps `node-fetch` when the
+ // execution environment is `Node.js`, we need to cast it to `any` in that scenario.
+ optionsWithAbortParam = {
+ timeout: timeoutMs,
+ ...options,
+ } as any;
+ }
+
+ const response = await fetch(endpoint, optionsWithAbortParam);
+ return response;
+};
diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts
index debcce746..b8e0b1775 100644
--- a/packages/utils/src/index.ts
+++ b/packages/utils/src/index.ts
@@ -5,3 +5,7 @@ export { intervalUtils } from './interval_utils';
export { BigNumber } from './configured_bignumber';
export { AbiDecoder } from './abi_decoder';
export { logUtils } from './log_utils';
+export { abiUtils } from './abi_utils';
+export { NULL_BYTES } from './constants';
+export { errorUtils } from './error_utils';
+export { fetchAsync } from './fetchAsync';
diff --git a/packages/utils/src/interval_utils.ts b/packages/utils/src/interval_utils.ts
index ebecc7015..3d0561cd2 100644
--- a/packages/utils/src/interval_utils.ts
+++ b/packages/utils/src/interval_utils.ts
@@ -1,19 +1,21 @@
-import * as _ from 'lodash';
-
export const intervalUtils = {
- setAsyncExcludingInterval(fn: () => Promise<void>, intervalMs: number, onError: (err: Error) => void) {
- let locked = false;
+ setAsyncExcludingInterval(
+ fn: () => Promise<void>,
+ intervalMs: number,
+ onError: (err: Error) => void,
+ ): NodeJS.Timer {
+ let isLocked = false;
const intervalId = setInterval(async () => {
- if (locked) {
+ if (isLocked) {
return;
} else {
- locked = true;
+ isLocked = true;
try {
await fn();
} catch (err) {
onError(err);
}
- locked = false;
+ isLocked = false;
}
}, intervalMs);
return intervalId;
@@ -21,7 +23,7 @@ export const intervalUtils = {
clearAsyncExcludingInterval(intervalId: NodeJS.Timer): void {
clearInterval(intervalId);
},
- setInterval(fn: () => void, intervalMs: number, onError: (err: Error) => void) {
+ setInterval(fn: () => void, intervalMs: number, onError: (err: Error) => void): NodeJS.Timer {
const intervalId = setInterval(() => {
try {
fn();
diff --git a/packages/utils/src/log_utils.ts b/packages/utils/src/log_utils.ts
index d0f0e34c9..87f8479b5 100644
--- a/packages/utils/src/log_utils.ts
+++ b/packages/utils/src/log_utils.ts
@@ -2,4 +2,7 @@ export const logUtils = {
log(...args: any[]): void {
console.log(...args); // tslint:disable-line:no-console
},
+ warn(...args: any[]): void {
+ console.warn(...args); // tslint:disable-line:no-console
+ },
};
diff --git a/packages/utils/test/abi_utils_test.ts b/packages/utils/test/abi_utils_test.ts
new file mode 100644
index 000000000..0ebee64c4
--- /dev/null
+++ b/packages/utils/test/abi_utils_test.ts
@@ -0,0 +1,19 @@
+import * as chai from 'chai';
+import 'mocha';
+
+import { abiUtils } from '../src';
+
+const expect = chai.expect;
+
+describe('abiUtils', () => {
+ describe('splitTupleTypes', () => {
+ it('handles basic types', () => {
+ const got = abiUtils.splitTupleTypes('tuple(bytes,uint256,address)');
+ expect(got).to.deep.equal(['bytes', 'uint256', 'address']);
+ });
+ it('handles nested tuple types', () => {
+ const got = abiUtils.splitTupleTypes('tuple(tuple(bytes,uint256),address)');
+ expect(got).to.deep.equal(['tuple(bytes,uint256)', 'address']);
+ });
+ });
+});
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
index c56d255d5..8b4cd47a2 100644
--- a/packages/utils/tsconfig.json
+++ b/packages/utils/tsconfig.json
@@ -3,5 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": ["./src/**/*"]
+ "include": ["src/**/*", "test/**/*"]
}
diff --git a/packages/web3-wrapper/CHANGELOG.json b/packages/web3-wrapper/CHANGELOG.json
index bcbab3ded..422059cc0 100644
--- a/packages/web3-wrapper/CHANGELOG.json
+++ b/packages/web3-wrapper/CHANGELOG.json
@@ -1,5 +1,213 @@
[
{
+ "version": "1.2.0",
+ "changes": [
+ {
+ "note": "Export marshaller to convert between RPC and user-space data formats",
+ "pr": 938
+ },
+ {
+ "note": "Export RPC types",
+ "pr": 938
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
+ "timestamp": 1532619515,
+ "version": "1.1.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532614997,
+ "version": "1.1.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "1.1.0",
+ "changes": [
+ {
+ "note": "Add `getTransactionByHashAsync` method",
+ "pr": 847
+ }
+ ],
+ "timestamp": 1532605697
+ },
+ {
+ "timestamp": 1532357734,
+ "version": "1.0.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1532043000,
+ "version": "1.0.0",
+ "changes": [
+ {
+ "note": "Stop exporting `marshaller` utility file.",
+ "pr": 902
+ },
+ {
+ "note": "Export `marshaller` utility file.",
+ "pr": 829
+ },
+ {
+ "note": "Add `getNodeTypeAsync` method",
+ "pr": 812
+ },
+ {
+ "note": "Stop exporting uniqueVersionIds object",
+ "pr": 897
+ }
+ ]
+ },
+ {
+ "timestamp": 1531919263,
+ "version": "0.7.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1531149657,
+ "version": "0.7.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1529397769,
+ "version": "0.7.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1528070400,
+ "version": "0.7.0",
+ "changes": [
+ {
+ "note": "Add `web3Wrapper.getContractCodeAsync`",
+ "pr": 675
+ },
+ {
+ "note": "Add `web3Wrapper.getTransactionTraceAsync`",
+ "pr": 675
+ },
+ {
+ "note": "Add `web3Wrapper.getBlockWithTransactionDataAsync`",
+ "pr": 675
+ },
+ {
+ "note": "Add exported uniqueVersionIds object",
+ "pr": 622
+ },
+ {
+ "note": "Update increaseTimeAsync to work with Geth",
+ "pr": 622
+ },
+ {
+ "note": "Make callAsync throw if raw call result is 0x (null)",
+ "pr": 622
+ },
+ {
+ "note": "Add new setHeadAsync method",
+ "pr": 622
+ },
+ {
+ "note":
+ "Improve performance of awaitTransactionMinedAsync by immediately checking if the transaction was already mined instead of waiting for the first interval.",
+ "pr": 688
+ }
+ ]
+ },
+ {
+ "timestamp": 1527009133,
+ "version": "0.6.4",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525477860,
+ "version": "0.6.3",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1525428773,
+ "version": "0.6.2",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "timestamp": 1524044013,
+ "version": "0.6.1",
+ "changes": [
+ {
+ "note": "Dependencies updated"
+ }
+ ]
+ },
+ {
+ "version": "0.6.0",
+ "changes": [
+ {
+ "note": "Make `isAddress` and `toWei` static",
+ "pr": 501
+ },
+ {
+ "note": "Add static methods `toUnitAmount` and `toBaseUnitAmount`",
+ "pr": 501
+ }
+ ],
+ "timestamp": 1523462196
+ },
+ {
+ "version": "0.5.0",
+ "changes": [
+ {
+ "note": "Add `web3Wrapper.awaitTransactionMinedAsync`",
+ "pr": 485
+ },
+ {
+ "note":
+ "Add a public field `abiDecoder: AbiDecoder` which allows you to add your ABIs that are later used to decode logs",
+ "pr": 485
+ },
+ {
+ "note": "Export enum `Web3WrapperErrors` with a single value so far: `TransactionMiningTimeout`",
+ "pr": 485
+ }
+ ],
+ "timestamp": 1522673609
+ },
+ {
"version": "0.4.0",
"changes": [
{
@@ -7,8 +215,7 @@
"pr": 465
}
],
- "timestamp": 1522658513,
- "isPublished": true
+ "timestamp": 1522658513
},
{
"version": "0.3.0",
@@ -27,8 +234,7 @@
"pr": 444
}
],
- "timestamp": 1521298800,
- "isPublished": true
+ "timestamp": 1521298800
},
{
"version": "0.2.0",
@@ -50,8 +256,7 @@
"pr": 413
}
],
- "timestamp": 1520089200,
- "isPublished": true
+ "timestamp": 1520089200
},
{
"version": "0.1.12",
@@ -61,7 +266,6 @@
"pr": 389
}
],
- "timestamp": 1518102000,
- "isPublished": true
+ "timestamp": 1518102000
}
]
diff --git a/packages/web3-wrapper/CHANGELOG.md b/packages/web3-wrapper/CHANGELOG.md
index e306b71f9..0955993f4 100644
--- a/packages/web3-wrapper/CHANGELOG.md
+++ b/packages/web3-wrapper/CHANGELOG.md
@@ -1,27 +1,105 @@
<!--
-This file is auto-generated using the monorepo-scripts package. Don't edit directly.
+changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
Edit the package's CHANGELOG.json file only.
-->
CHANGELOG
+## v1.2.0 - _August 13, 2018_
+
+ * Export marshaller to convert between RPC and user-space data formats (#938)
+ * Export RPC types (#938)
+
+## v1.1.2 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.1.1 - _July 26, 2018_
+
+ * Dependencies updated
+
+## v1.1.0 - _July 26, 2018_
+
+ * Add `getTransactionByHashAsync` method (#847)
+
+## v1.0.1 - _July 23, 2018_
+
+ * Dependencies updated
+
+## v1.0.0 - _July 19, 2018_
+
+ * Stop exporting `marshaller` utility file. (#902)
+ * Export `marshaller` utility file. (#829)
+ * Add `getNodeTypeAsync` method (#812)
+ * Stop exporting uniqueVersionIds object (#897)
+
+## v0.7.3 - _July 18, 2018_
+
+ * Dependencies updated
+
+## v0.7.2 - _July 9, 2018_
+
+ * Dependencies updated
+
+## v0.7.1 - _June 19, 2018_
+
+ * Dependencies updated
+
+## v0.7.0 - _June 3, 2018_
+
+ * Add `web3Wrapper.getContractCodeAsync` (#675)
+ * Add `web3Wrapper.getTransactionTraceAsync` (#675)
+ * Add `web3Wrapper.getBlockWithTransactionDataAsync` (#675)
+ * Add exported uniqueVersionIds object (#622)
+ * Update increaseTimeAsync to work with Geth (#622)
+ * Make callAsync throw if raw call result is 0x (null) (#622)
+ * Add new setHeadAsync method (#622)
+ * Improve performance of awaitTransactionMinedAsync by immediately checking if the transaction was already mined instead of waiting for the first interval. (#688)
+
+## v0.6.4 - _May 22, 2018_
+
+ * Dependencies updated
+
+## v0.6.3 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.2 - _May 4, 2018_
+
+ * Dependencies updated
+
+## v0.6.1 - _April 18, 2018_
+
+ * Dependencies updated
+
+## v0.6.0 - _April 11, 2018_
+
+ * Make `isAddress` and `toWei` static (#501)
+ * Add static methods `toUnitAmount` and `toBaseUnitAmount` (#501)
+
+## v0.5.0 - _April 2, 2018_
+
+ * Add `web3Wrapper.awaitTransactionMinedAsync` (#485)
+ * Add a public field `abiDecoder: AbiDecoder` which allows you to add your ABIs that are later used to decode logs (#485)
+ * Export enum `Web3WrapperErrors` with a single value so far: `TransactionMiningTimeout` (#485)
+
## v0.4.0 - _April 2, 2018_
* Rename `signTransactionAsync` to `signMessageAsync` for clarity (#465)
-## v0.3.0 - _March 18, 2018_
+## v0.3.0 - _March 17, 2018_
* Add `web3Wrapper.takeSnapshotAsync`, `web3Wrapper.revertSnapshotAsync`, `web3Wrapper.mineBlockAsync`, `web3Wrapper.increaseTimeAsync` (#426)
* Add `web3Wrapper.isZeroExWeb3Wrapper` for runtime instanceOf checks (#426)
* Add a `getProvider` method (#444)
-## v0.2.0 - _March 4, 2018_
+## v0.2.0 - _March 3, 2018_
* Ensure all returned user addresses are lowercase (#373)
* Add `web3Wrapper.callAsync` (#413)
* Make `web3Wrapper.estimateGas` accept whole `txData` instead of `data` (#413)
* Remove `web3Wrapper.getContractInstance` (#413)
-## v0.1.12 - _February 9, 2018_
+## v0.1.12 - _February 8, 2018_
* Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
diff --git a/packages/web3-wrapper/README.md b/packages/web3-wrapper/README.md
index e7491acb0..06c788101 100644
--- a/packages/web3-wrapper/README.md
+++ b/packages/web3-wrapper/README.md
@@ -1,8 +1,8 @@
## @0xproject/web3-wrapper
-Wrapped version of web3 with a nicer interface that is used across 0x projects and packages.
+Web3-wrapper is a JSON-RPC client for Ethereum nodes. It is a type-safe alternative to [Web3.js](https://github.com/ethereum/web3.js/) written in TypeScript.
-### Read the [Documentation](0xproject.com/docs/web3_wrapper).
+### Read the [Documentation](https://0xproject.com/docs/web3-wrapper).
## Installation
@@ -20,11 +20,11 @@ If your project is in [TypeScript](https://www.typescriptlang.org/), add the fol
## Contributing
-We strongly encourage that the community help us make improvements and determine the future direction of the protocol. To report bugs within this package, please create an issue in this repository.
+We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-### Install Dependencies
+### Install dependencies
If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
@@ -40,14 +40,22 @@ yarn install
### Build
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
+
+```bash
+PKG=@0xproject/web3-wrapper yarn build
+```
+
+Or continuously rebuild on change:
+
```bash
-yarn build
+PKG=@0xproject/web3-wrapper yarn watch
```
-or
+### Clean
```bash
-yarn build:watch
+yarn clean
```
### Lint
diff --git a/packages/web3-wrapper/coverage/.gitkeep b/packages/web3-wrapper/coverage/.gitkeep
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/packages/web3-wrapper/coverage/.gitkeep
diff --git a/packages/web3-wrapper/package.json b/packages/web3-wrapper/package.json
index 9a67d2d1d..3f9ee9019 100644
--- a/packages/web3-wrapper/package.json
+++ b/packages/web3-wrapper/package.json
@@ -1,16 +1,25 @@
{
"name": "@0xproject/web3-wrapper",
- "version": "0.4.0",
+ "version": "1.2.0",
+ "engines": {
+ "node": ">=6.12"
+ },
"description": "Wraps around web3 and gives a nicer interface",
- "main": "lib/index.js",
- "types": "lib/index.d.ts",
+ "main": "lib/src/index.js",
+ "types": "lib/src/index.d.ts",
"scripts": {
- "build:watch": "tsc -w",
- "build": "tsc && copyfiles -u 2 './lib/monorepo_scripts/**/*' ./scripts",
+ "watch_without_deps": "tsc -w",
+ "build": "tsc && copyfiles -u 3 './lib/src/monorepo_scripts/**/*' ./scripts",
"clean": "shx rm -rf lib scripts",
- "lint": "tslint --project . 'src/**/*.ts'",
+ "lint": "tslint --project .",
+ "test": "yarn run_mocha",
+ "rebuild_and_test": "run-s clean build test",
+ "test:circleci": "yarn test:coverage",
+ "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/**/*_test.js --bail --exit",
+ "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
+ "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
"manual:postpublish": "yarn build; node ./scripts/postpublish.js",
- "docs:stage": "yarn build && node ./scripts/stage_docs.js",
+ "docs:stage": "node scripts/stage_docs.js",
"docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --json $JSON_FILE_PATH $PROJECT_FILES",
"upload_docs_json": "aws s3 cp generated_docs/index.json $S3_URL --profile 0xproject --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-type application/json"
},
@@ -18,7 +27,8 @@
"postpublish": {
"docPublishConfigs": {
"extraFileIncludes": [
- "../types/src/index.ts"
+ "../types/src/index.ts",
+ "../ethereum-types/src/index.ts"
],
"s3BucketPath": "s3://doc-jsons/web3-wrapper/",
"s3StagingBucketPath": "s3://staging-doc-jsons/web3-wrapper/"
@@ -35,23 +45,33 @@
},
"homepage": "https://github.com/0xProject/0x-monorepo/packages/web3-wrapper/README.md",
"devDependencies": {
- "@0xproject/monorepo-scripts": "^0.1.15",
- "@0xproject/tslint-config": "^0.4.13",
+ "@0xproject/monorepo-scripts": "^1.0.5",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/lodash": "4.14.104",
+ "chai": "^4.0.1",
+ "chai-as-promised": "^7.1.0",
+ "chai-bignumber": "^2.0.1",
"copyfiles": "^1.2.0",
+ "dirty-chai": "^2.0.1",
+ "ganache-core": "0xProject/ganache-core#monorepo-dep",
+ "make-promises-safe": "^1.1.0",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
+ "nyc": "^11.0.1",
"shx": "^0.2.2",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"dependencies": {
- "@0xproject/types": "^0.4.2",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "ethers-contracts": "^2.2.1",
- "lodash": "^4.17.4",
- "web3": "^0.20.0"
+ "@0xproject/assert": "^1.0.5",
+ "@0xproject/json-schemas": "^1.0.1-rc.4",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "ethereum-types": "^1.0.4",
+ "ethereumjs-util": "^5.1.1",
+ "ethers": "3.0.22",
+ "lodash": "^4.17.5"
},
"publishConfig": {
"access": "public"
diff --git a/packages/web3-wrapper/src/index.ts b/packages/web3-wrapper/src/index.ts
index 87c69b269..5d3d135e4 100644
--- a/packages/web3-wrapper/src/index.ts
+++ b/packages/web3-wrapper/src/index.ts
@@ -1,326 +1,13 @@
-import {
- BlockParam,
- BlockWithoutTransactionData,
- CallData,
- ContractAbi,
- FilterObject,
- JSONRPCRequestPayload,
- JSONRPCResponsePayload,
- LogEntry,
- RawLogEntry,
- TransactionReceipt,
- TxData,
-} from '@0xproject/types';
-import { BigNumber, promisify } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as Web3 from 'web3';
-
-/**
- * A wrapper around the Web3.js 0.x library that provides a consistent, clean promise-based interface.
- */
-export class Web3Wrapper {
- /**
- * Flag to check if this instance is of type Web3Wrapper
- */
- public isZeroExWeb3Wrapper = true;
- private _web3: Web3;
- private _defaults: Partial<TxData>;
- private _jsonRpcRequestId: number;
- /**
- * Instantiates a new Web3Wrapper.
- * @param provider The Web3 provider instance you would like the Web3Wrapper to use for interacting with
- * the backing Ethereum node.
- * @param defaults Override TxData defaults sent with RPC requests to the backing Ethereum node.
- * @return An instance of the Web3Wrapper class.
- */
- constructor(provider: Web3.Provider, defaults?: Partial<TxData>) {
- if (_.isUndefined((provider as any).sendAsync)) {
- // Web3@1.0 provider doesn't support synchronous http requests,
- // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x`
- // We re-assign the send method so that Web3@1.0 providers work with @0xproject/web3-wrapper
- (provider as any).sendAsync = (provider as any).send;
- }
- this._web3 = new Web3();
- this._web3.setProvider(provider);
- this._defaults = defaults || {};
- this._jsonRpcRequestId = 0;
- }
- /**
- * Get the contract defaults set to the Web3Wrapper instance
- * @return TxData defaults (e.g gas, gasPrice, nonce, etc...)
- */
- public getContractDefaults(): Partial<TxData> {
- return this._defaults;
- }
- /**
- * Retrieve the Web3 provider
- * @return Web3 provider instance
- */
- public getProvider(): Web3.Provider {
- return this._web3.currentProvider;
- }
- /**
- * Update the used Web3 provider
- * @param provider The new Web3 provider to be set
- */
- public setProvider(provider: Web3.Provider) {
- this._web3.setProvider(provider);
- }
- /**
- * Check if an address is a valid Ethereum address
- * @param address Address to check
- * @returns Whether the address is a valid Ethereum address
- */
- public isAddress(address: string): boolean {
- return this._web3.isAddress(address);
- }
- /**
- * Check whether an address is available through the backing provider. This can be
- * useful if you want to know whether a user can sign messages or transactions from
- * a given Ethereum address.
- * @param senderAddress Address to check availability for
- * @returns Whether the address is available through the provider.
- */
- public async isSenderAddressAvailableAsync(senderAddress: string): Promise<boolean> {
- const addresses = await this.getAvailableAddressesAsync();
- const normalizedAddress = senderAddress.toLowerCase();
- return _.includes(addresses, normalizedAddress);
- }
- /**
- * Fetch the backing Ethereum node's version string (e.g `MetaMask/v4.2.0`)
- * @returns Ethereum node's version string
- */
- public async getNodeVersionAsync(): Promise<string> {
- const nodeVersion = await promisify<string>(this._web3.version.getNode)();
- return nodeVersion;
- }
- /**
- * Fetches the networkId of the backing Ethereum node
- * @returns The network id
- */
- public async getNetworkIdAsync(): Promise<number> {
- const networkIdStr = await promisify<string>(this._web3.version.getNetwork)();
- const networkId = _.parseInt(networkIdStr);
- return networkId;
- }
- /**
- * Retrieves the transaction receipt for a given transaction hash
- * @param txHash Transaction hash
- * @returns The transaction receipt, including it's status (0: failed, 1: succeeded or undefined: not found)
- */
- public async getTransactionReceiptAsync(txHash: string): Promise<TransactionReceipt> {
- const transactionReceipt = await promisify<TransactionReceipt>(this._web3.eth.getTransactionReceipt)(txHash);
- if (!_.isNull(transactionReceipt)) {
- transactionReceipt.status = this._normalizeTxReceiptStatus(transactionReceipt.status);
- }
- return transactionReceipt;
- }
- /**
- * Convert an Ether amount from ETH to Wei
- * @param ethAmount Amount of Ether to convert to wei
- * @returns Amount in wei
- */
- public toWei(ethAmount: BigNumber): BigNumber {
- const balanceWei = this._web3.toWei(ethAmount, 'ether');
- return balanceWei;
- }
- /**
- * Retrieves an accounts Ether balance in wei
- * @param owner Account whose balance you wish to check
- * @returns Balance in wei
- */
- public async getBalanceInWeiAsync(owner: string): Promise<BigNumber> {
- let balanceInWei = await promisify<BigNumber>(this._web3.eth.getBalance)(owner);
- // Rewrap in a new BigNumber
- balanceInWei = new BigNumber(balanceInWei);
- return balanceInWei;
- }
- /**
- * Check if a contract exists at a given address
- * @param address Address to which to check
- * @returns Whether or not contract code was found at the supplied address
- */
- public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
- const code = await promisify<string>(this._web3.eth.getCode)(address);
- // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients
- const codeIsEmpty = /^0x0{0,40}$/i.test(code);
- return !codeIsEmpty;
- }
- /**
- * Sign a message with a specific address's private key (`eth_sign`)
- * @param address Address of signer
- * @param message Message to sign
- * @returns Signature string (might be VRS or RSV depending on the Signer)
- */
- public async signMessageAsync(address: string, message: string): Promise<string> {
- const signData = await promisify<string>(this._web3.eth.sign)(address, message);
- return signData;
- }
- /**
- * Fetches the latest block number
- * @returns Block number
- */
- public async getBlockNumberAsync(): Promise<number> {
- const blockNumber = await promisify<number>(this._web3.eth.getBlockNumber)();
- return blockNumber;
- }
- /**
- * Fetch a specific Ethereum block
- * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
- * @returns The requested block without transaction data
- */
- public async getBlockAsync(blockParam: string | BlockParam): Promise<BlockWithoutTransactionData> {
- const block = await promisify<BlockWithoutTransactionData>(this._web3.eth.getBlock)(blockParam);
- return block;
- }
- /**
- * Fetch a block's timestamp
- * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
- * @returns The block's timestamp
- */
- public async getBlockTimestampAsync(blockParam: string | BlockParam): Promise<number> {
- const { timestamp } = await this.getBlockAsync(blockParam);
- return timestamp;
- }
- /**
- * Retrieve the user addresses available through the backing provider
- * @returns Available user addresses
- */
- public async getAvailableAddressesAsync(): Promise<string[]> {
- const addresses = await promisify<string[]>(this._web3.eth.getAccounts)();
- const normalizedAddresses = _.map(addresses, address => address.toLowerCase());
- return normalizedAddresses;
- }
- /**
- * Take a snapshot of the blockchain state on a TestRPC/Ganache local node
- * @returns The snapshot id. This can be used to revert to this snapshot
- */
- public async takeSnapshotAsync(): Promise<number> {
- const snapshotId = Number(await this._sendRawPayloadAsync<string>({ method: 'evm_snapshot', params: [] }));
- return snapshotId;
- }
- /**
- * Revert the blockchain state to a previous snapshot state on TestRPC/Ganache local node
- * @param snapshotId snapshot id to revert to
- * @returns Whether the revert was successful
- */
- public async revertSnapshotAsync(snapshotId: number): Promise<boolean> {
- const didRevert = await this._sendRawPayloadAsync<boolean>({ method: 'evm_revert', params: [snapshotId] });
- return didRevert;
- }
- /**
- * Mine a block on a TestRPC/Ganache local node
- */
- public async mineBlockAsync(): Promise<void> {
- await this._sendRawPayloadAsync<string>({ method: 'evm_mine', params: [] });
- }
- /**
- * Increase the next blocks timestamp on TestRPC/Ganache local node
- * @param timeDelta Amount of time to add in seconds
- */
- public async increaseTimeAsync(timeDelta: number): Promise<void> {
- await this._sendRawPayloadAsync<string>({ method: 'evm_increaseTime', params: [timeDelta] });
- }
- /**
- * Retrieve smart contract logs for a given filter
- * @param filter Parameters by which to filter which logs to retrieve
- * @returns The corresponding log entries
- */
- public async getLogsAsync(filter: FilterObject): Promise<LogEntry[]> {
- let fromBlock = filter.fromBlock;
- if (_.isNumber(fromBlock)) {
- fromBlock = this._web3.toHex(fromBlock);
- }
- let toBlock = filter.toBlock;
- if (_.isNumber(toBlock)) {
- toBlock = this._web3.toHex(toBlock);
- }
- const serializedFilter = {
- ...filter,
- fromBlock,
- toBlock,
- };
- const payload = {
- jsonrpc: '2.0',
- id: this._jsonRpcRequestId++,
- method: 'eth_getLogs',
- params: [serializedFilter],
- };
- const rawLogs = await this._sendRawPayloadAsync<RawLogEntry[]>(payload);
- const formattedLogs = _.map(rawLogs, this._formatLog.bind(this));
- return formattedLogs;
- }
- /**
- * Get a Web3 contract factory instance for a given ABI
- * @param abi Smart contract ABI
- * @returns Web3 contract factory which can create Web3 Contract instances from the supplied ABI
- */
- public getContractFromAbi(abi: ContractAbi): Web3.Contract<any> {
- const web3Contract = this._web3.eth.contract(abi);
- return web3Contract;
- }
- /**
- * Calculate the estimated gas cost for a given transaction
- * @param txData Transaction data
- * @returns Estimated gas cost
- */
- public async estimateGasAsync(txData: Partial<TxData>): Promise<number> {
- const gas = await promisify<number>(this._web3.eth.estimateGas)(txData);
- return gas;
- }
- /**
- * Call a smart contract method at a given block height
- * @param callData Call data
- * @param defaultBlock Block height at which to make the call. Defaults to `latest`
- * @returns The raw call result
- */
- public async callAsync(callData: CallData, defaultBlock?: BlockParam): Promise<string> {
- const rawCallResult = await promisify<string>(this._web3.eth.call)(callData, defaultBlock);
- return rawCallResult;
- }
- /**
- * Send a transaction
- * @param txData Transaction data
- * @returns Transaction hash
- */
- public async sendTransactionAsync(txData: TxData): Promise<string> {
- const txHash = await promisify<string>(this._web3.eth.sendTransaction)(txData);
- return txHash;
- }
- private async _sendRawPayloadAsync<A>(payload: Partial<JSONRPCRequestPayload>): Promise<A> {
- const sendAsync = this._web3.currentProvider.sendAsync.bind(this._web3.currentProvider);
- const response = await promisify<JSONRPCResponsePayload>(sendAsync)(payload);
- const result = response.result;
- return result;
- }
- private _normalizeTxReceiptStatus(status: undefined | null | string | 0 | 1): null | 0 | 1 {
- // Transaction status might have four values
- // undefined - Testrpc and other old clients
- // null - New clients on old transactions
- // number - Parity
- // hex - Geth
- if (_.isString(status)) {
- return this._web3.toDecimal(status) as 0 | 1;
- } else if (_.isUndefined(status)) {
- return null;
- } else {
- return status;
- }
- }
- private _formatLog(rawLog: RawLogEntry): LogEntry {
- const formattedLog = {
- ...rawLog,
- logIndex: this._hexToDecimal(rawLog.logIndex),
- blockNumber: this._hexToDecimal(rawLog.blockNumber),
- transactionIndex: this._hexToDecimal(rawLog.transactionIndex),
- };
- return formattedLog;
- }
- private _hexToDecimal(hex: string | null): number | null {
- if (_.isNull(hex)) {
- return null;
- }
- const decimal = this._web3.toDecimal(hex);
- return decimal;
- }
-}
+export { Web3Wrapper } from './web3_wrapper';
+export { marshaller } from './marshaller';
+export {
+ Web3WrapperErrors,
+ NodeType,
+ CallDataRPC,
+ CallTxDataBaseRPC,
+ AbstractBlockRPC,
+ BlockWithoutTransactionDataRPC,
+ BlockWithTransactionDataRPC,
+ TransactionRPC,
+ TxDataRPC,
+} from './types';
diff --git a/packages/web3-wrapper/src/marshaller.ts b/packages/web3-wrapper/src/marshaller.ts
new file mode 100644
index 000000000..572a322d6
--- /dev/null
+++ b/packages/web3-wrapper/src/marshaller.ts
@@ -0,0 +1,210 @@
+import { addressUtils } from '@0xproject/utils';
+import {
+ BlockParam,
+ BlockParamLiteral,
+ BlockWithoutTransactionData,
+ BlockWithTransactionData,
+ CallData,
+ CallTxDataBase,
+ LogEntry,
+ RawLogEntry,
+ Transaction,
+ TxData,
+} from 'ethereum-types';
+import ethUtil = require('ethereumjs-util');
+import * as _ from 'lodash';
+
+import { utils } from './utils';
+
+import {
+ BlockWithoutTransactionDataRPC,
+ BlockWithTransactionDataRPC,
+ CallDataRPC,
+ CallTxDataBaseRPC,
+ TransactionRPC,
+ TxDataRPC,
+} from './types';
+
+/**
+ * Utils to convert ethereum structures from user-space format to RPC format. (marshall/unmarshall)
+ */
+export const marshaller = {
+ /**
+ * Unmarshall block without transaction data
+ * @param blockWithHexValues block to unmarshall
+ * @return unmarshalled block without transaction data
+ */
+ unmarshalIntoBlockWithoutTransactionData(
+ blockWithHexValues: BlockWithoutTransactionDataRPC,
+ ): BlockWithoutTransactionData {
+ const block = {
+ ...blockWithHexValues,
+ gasLimit: utils.convertHexToNumber(blockWithHexValues.gasLimit),
+ gasUsed: utils.convertHexToNumber(blockWithHexValues.gasUsed),
+ size: utils.convertHexToNumber(blockWithHexValues.size),
+ timestamp: utils.convertHexToNumber(blockWithHexValues.timestamp),
+ number: _.isNull(blockWithHexValues.number) ? null : utils.convertHexToNumber(blockWithHexValues.number),
+ difficulty: utils.convertAmountToBigNumber(blockWithHexValues.difficulty),
+ totalDifficulty: utils.convertAmountToBigNumber(blockWithHexValues.totalDifficulty),
+ };
+ return block;
+ },
+ /**
+ * Unmarshall block with transaction data
+ * @param blockWithHexValues block to unmarshall
+ * @return unmarshalled block with transaction data
+ */
+ unmarshalIntoBlockWithTransactionData(blockWithHexValues: BlockWithTransactionDataRPC): BlockWithTransactionData {
+ const block = {
+ ...blockWithHexValues,
+ gasLimit: utils.convertHexToNumber(blockWithHexValues.gasLimit),
+ gasUsed: utils.convertHexToNumber(blockWithHexValues.gasUsed),
+ size: utils.convertHexToNumber(blockWithHexValues.size),
+ timestamp: utils.convertHexToNumber(blockWithHexValues.timestamp),
+ number: _.isNull(blockWithHexValues.number) ? null : utils.convertHexToNumber(blockWithHexValues.number),
+ difficulty: utils.convertAmountToBigNumber(blockWithHexValues.difficulty),
+ totalDifficulty: utils.convertAmountToBigNumber(blockWithHexValues.totalDifficulty),
+ transactions: [] as Transaction[],
+ };
+ block.transactions = _.map(blockWithHexValues.transactions, (tx: TransactionRPC) => {
+ const transaction = marshaller.unmarshalTransaction(tx);
+ return transaction;
+ });
+ return block;
+ },
+ /**
+ * Unmarshall transaction
+ * @param txRpc transaction to unmarshall
+ * @return unmarshalled transaction
+ */
+ unmarshalTransaction(txRpc: TransactionRPC): Transaction {
+ const tx = {
+ ...txRpc,
+ blockNumber: !_.isNull(txRpc.blockNumber) ? utils.convertHexToNumber(txRpc.blockNumber) : null,
+ transactionIndex: !_.isNull(txRpc.transactionIndex)
+ ? utils.convertHexToNumber(txRpc.transactionIndex)
+ : null,
+ nonce: utils.convertHexToNumber(txRpc.nonce),
+ gas: utils.convertHexToNumber(txRpc.gas),
+ gasPrice: utils.convertAmountToBigNumber(txRpc.gasPrice),
+ value: utils.convertAmountToBigNumber(txRpc.value),
+ };
+ return tx;
+ },
+ /**
+ * Unmarshall transaction data
+ * @param txDataRpc transaction data to unmarshall
+ * @return unmarshalled transaction data
+ */
+ unmarshalTxData(txDataRpc: TxDataRPC): TxData {
+ if (_.isUndefined(txDataRpc.from)) {
+ throw new Error(`txData must include valid 'from' value.`);
+ }
+ const txData = {
+ ...txDataRpc,
+ value: !_.isUndefined(txDataRpc.value) ? utils.convertHexToNumber(txDataRpc.value) : undefined,
+ gas: !_.isUndefined(txDataRpc.gas) ? utils.convertHexToNumber(txDataRpc.gas) : undefined,
+ gasPrice: !_.isUndefined(txDataRpc.gasPrice) ? utils.convertHexToNumber(txDataRpc.gasPrice) : undefined,
+ nonce: !_.isUndefined(txDataRpc.nonce) ? utils.convertHexToNumber(txDataRpc.nonce) : undefined,
+ };
+ return txData;
+ },
+ /**
+ * Marshall transaction data
+ * @param txData transaction data to marshall
+ * @return marshalled transaction data
+ */
+ marshalTxData(txData: Partial<TxData>): Partial<TxDataRPC> {
+ if (_.isUndefined(txData.from)) {
+ throw new Error(`txData must include valid 'from' value.`);
+ }
+ const callTxDataBase = {
+ ...txData,
+ };
+ delete callTxDataBase.from;
+ const callTxDataBaseRPC = marshaller._marshalCallTxDataBase(callTxDataBase);
+ const txDataRPC = {
+ ...callTxDataBaseRPC,
+ from: marshaller.marshalAddress(txData.from),
+ };
+ const prunableIfUndefined = ['gasPrice', 'gas', 'value', 'nonce'];
+ _.each(txDataRPC, (value: any, key: string) => {
+ if (_.isUndefined(value) && _.includes(prunableIfUndefined, key)) {
+ delete (txDataRPC as any)[key];
+ }
+ });
+ return txDataRPC;
+ },
+ /**
+ * Marshall call data
+ * @param callData call data to marshall
+ * @return marshalled call data
+ */
+ marshalCallData(callData: Partial<CallData>): Partial<CallDataRPC> {
+ const callTxDataBase = {
+ ...callData,
+ };
+ delete callTxDataBase.from;
+ const callTxDataBaseRPC = marshaller._marshalCallTxDataBase(callTxDataBase);
+ const callDataRPC = {
+ ...callTxDataBaseRPC,
+ from: _.isUndefined(callData.from) ? undefined : marshaller.marshalAddress(callData.from),
+ };
+ return callDataRPC;
+ },
+ /**
+ * Marshall address
+ * @param address address to marshall
+ * @return marshalled address
+ */
+ marshalAddress(address: string): string {
+ if (addressUtils.isAddress(address)) {
+ return ethUtil.addHexPrefix(address);
+ }
+ throw new Error(`Invalid address encountered: ${address}`);
+ },
+ /**
+ * Marshall block param
+ * @param blockParam block param to marshall
+ * @return marshalled block param
+ */
+ marshalBlockParam(blockParam: BlockParam | string | number | undefined): string | undefined {
+ if (_.isUndefined(blockParam)) {
+ return BlockParamLiteral.Latest;
+ }
+ const encodedBlockParam = _.isNumber(blockParam) ? utils.numberToHex(blockParam) : blockParam;
+ return encodedBlockParam;
+ },
+ /**
+ * Unmarshall log
+ * @param rawLog log to unmarshall
+ * @return unmarshalled log
+ */
+ unmarshalLog(rawLog: RawLogEntry): LogEntry {
+ const formattedLog = {
+ ...rawLog,
+ logIndex: utils.convertHexToNumberOrNull(rawLog.logIndex),
+ blockNumber: utils.convertHexToNumberOrNull(rawLog.blockNumber),
+ transactionIndex: utils.convertHexToNumberOrNull(rawLog.transactionIndex),
+ };
+ return formattedLog;
+ },
+ _marshalCallTxDataBase(callTxDataBase: Partial<CallTxDataBase>): Partial<CallTxDataBaseRPC> {
+ const callTxDataBaseRPC = {
+ ...callTxDataBase,
+ to: _.isUndefined(callTxDataBase.to) ? undefined : marshaller.marshalAddress(callTxDataBase.to),
+ gasPrice: _.isUndefined(callTxDataBase.gasPrice)
+ ? undefined
+ : utils.encodeAmountAsHexString(callTxDataBase.gasPrice),
+ gas: _.isUndefined(callTxDataBase.gas) ? undefined : utils.encodeAmountAsHexString(callTxDataBase.gas),
+ value: _.isUndefined(callTxDataBase.value)
+ ? undefined
+ : utils.encodeAmountAsHexString(callTxDataBase.value),
+ nonce: _.isUndefined(callTxDataBase.nonce)
+ ? undefined
+ : utils.encodeAmountAsHexString(callTxDataBase.nonce),
+ };
+
+ return callTxDataBaseRPC;
+ },
+};
diff --git a/packages/web3-wrapper/src/types.ts b/packages/web3-wrapper/src/types.ts
new file mode 100644
index 000000000..e81039186
--- /dev/null
+++ b/packages/web3-wrapper/src/types.ts
@@ -0,0 +1,65 @@
+export enum Web3WrapperErrors {
+ TransactionMiningTimeout = 'TRANSACTION_MINING_TIMEOUT',
+}
+
+export interface AbstractBlockRPC {
+ number: string | null;
+ hash: string | null;
+ parentHash: string;
+ nonce: string | null;
+ sha3Uncles: string;
+ logsBloom: string | null;
+ transactionsRoot: string;
+ stateRoot: string;
+ miner: string;
+ difficulty: string;
+ totalDifficulty: string;
+ extraData: string;
+ size: string;
+ gasLimit: string;
+ gasUsed: string;
+ timestamp: string;
+ uncles: string[];
+}
+export interface BlockWithoutTransactionDataRPC extends AbstractBlockRPC {
+ transactions: string[];
+}
+export interface BlockWithTransactionDataRPC extends AbstractBlockRPC {
+ transactions: TransactionRPC[];
+}
+export interface TransactionRPC {
+ hash: string;
+ nonce: string;
+ blockHash: string | null;
+ blockNumber: string | null;
+ transactionIndex: string | null;
+ from: string;
+ to: string | null;
+ value: string;
+ gasPrice: string;
+ gas: string;
+ input: string;
+}
+
+export interface CallTxDataBaseRPC {
+ to?: string;
+ value?: string;
+ gas?: string;
+ gasPrice?: string;
+ data?: string;
+ nonce?: string;
+}
+
+export interface TxDataRPC extends CallTxDataBaseRPC {
+ from: string;
+}
+
+export interface CallDataRPC extends CallTxDataBaseRPC {
+ from?: string;
+}
+
+// NodeType represents the type of the backing Ethereum node.
+export enum NodeType {
+ Geth = 'GETH',
+ Ganache = 'GANACHE',
+}
diff --git a/packages/web3-wrapper/src/utils.ts b/packages/web3-wrapper/src/utils.ts
new file mode 100644
index 000000000..01605dc9a
--- /dev/null
+++ b/packages/web3-wrapper/src/utils.ts
@@ -0,0 +1,58 @@
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+export const utils = {
+ isBigNumber(value: any): boolean {
+ const isBigNumber = _.isObject(value) && value.isBigNumber;
+ return isBigNumber;
+ },
+ convertHexToNumber(value: string): number {
+ const valueBigNumber = new BigNumber(value);
+ const valueNumber = valueBigNumber.toNumber();
+ return valueNumber;
+ },
+ convertHexToNumberOrNull(hex: string | null): number | null {
+ if (_.isNull(hex)) {
+ return null;
+ }
+ const decimal = utils.convertHexToNumber(hex);
+ return decimal;
+ },
+ convertAmountToBigNumber(value: string | number | BigNumber): BigNumber {
+ const num = value || 0;
+ const isBigNumber = utils.isBigNumber(num);
+ if (isBigNumber) {
+ return num as BigNumber;
+ }
+
+ if (_.isString(num) && (num.indexOf('0x') === 0 || num.indexOf('-0x') === 0)) {
+ return new BigNumber(num.replace('0x', ''), 16);
+ }
+
+ const baseTen = 10;
+ return new BigNumber((num as number).toString(baseTen), baseTen);
+ },
+ encodeAmountAsHexString(value: string | number | BigNumber): string {
+ const valueBigNumber = utils.convertAmountToBigNumber(value);
+ const hexBase = 16;
+ const valueHex = valueBigNumber.toString(hexBase);
+
+ return valueBigNumber.lessThan(0) ? '-0x' + valueHex.substr(1) : '0x' + valueHex;
+ },
+ numberToHex(value: number): string {
+ if (!isFinite(value) && !utils.isHexStrict(value)) {
+ throw new Error(`Given input ${value} is not a number.`);
+ }
+
+ const valueBigNumber = new BigNumber(value);
+ const hexBase = 16;
+ const result = valueBigNumber.toString(hexBase);
+
+ return valueBigNumber.lt(0) ? '-0x' + result.substr(1) : '0x' + result;
+ },
+ isHexStrict(hex: string | number): boolean {
+ return (
+ (_.isString(hex) || _.isNumber(hex)) && /^(-)?0x[0-9a-f]*$/i.test(_.isNumber(hex) ? hex.toString() : hex)
+ );
+ },
+};
diff --git a/packages/web3-wrapper/src/web3_wrapper.ts b/packages/web3-wrapper/src/web3_wrapper.ts
new file mode 100644
index 000000000..dd35e2094
--- /dev/null
+++ b/packages/web3-wrapper/src/web3_wrapper.ts
@@ -0,0 +1,653 @@
+import { assert } from '@0xproject/assert';
+import { schemas } from '@0xproject/json-schemas';
+import { AbiDecoder, addressUtils, BigNumber, intervalUtils, promisify } from '@0xproject/utils';
+import {
+ BlockParam,
+ BlockParamLiteral,
+ BlockWithoutTransactionData,
+ BlockWithTransactionData,
+ CallData,
+ FilterObject,
+ JSONRPCRequestPayload,
+ JSONRPCResponsePayload,
+ LogEntry,
+ Provider,
+ RawLogEntry,
+ TraceParams,
+ Transaction,
+ TransactionReceipt,
+ TransactionReceiptWithDecodedLogs,
+ TransactionTrace,
+ TxData,
+} from 'ethereum-types';
+import * as _ from 'lodash';
+
+import { marshaller } from './marshaller';
+import { BlockWithoutTransactionDataRPC, BlockWithTransactionDataRPC, NodeType, Web3WrapperErrors } from './types';
+import { utils } from './utils';
+
+const BASE_TEN = 10;
+
+// These are unique identifiers contained in the response of the
+// web3_clientVersion call.
+const uniqueVersionIds = {
+ geth: 'Geth',
+ ganache: 'EthereumJS TestRPC',
+};
+
+/**
+ * An alternative to the Web3.js library that provides a consistent, clean, promise-based interface.
+ */
+export class Web3Wrapper {
+ /**
+ * Flag to check if this instance is of type Web3Wrapper
+ */
+ public isZeroExWeb3Wrapper = true;
+ public abiDecoder: AbiDecoder;
+ private _provider: Provider;
+ private readonly _txDefaults: Partial<TxData>;
+ private _jsonRpcRequestId: number;
+ /**
+ * Check if an address is a valid Ethereum address
+ * @param address Address to check
+ * @returns Whether the address is a valid Ethereum address
+ */
+ public static isAddress(address: string): boolean {
+ return addressUtils.isAddress(address);
+ }
+ /**
+ * A unit amount is defined as the amount of a token above the specified decimal places (integer part).
+ * E.g: If a currency has 18 decimal places, 1e18 or one quintillion of the currency is equivalent
+ * to 1 unit.
+ * @param amount The amount in baseUnits that you would like converted to units.
+ * @param decimals The number of decimal places the unit amount has.
+ * @return The amount in units.
+ */
+ public static toUnitAmount(amount: BigNumber, decimals: number): BigNumber {
+ assert.isValidBaseUnitAmount('amount', amount);
+ assert.isNumber('decimals', decimals);
+ const aUnit = new BigNumber(BASE_TEN).pow(decimals);
+ const unit = amount.div(aUnit);
+ return unit;
+ }
+ /**
+ * A baseUnit is defined as the smallest denomination of a token. An amount expressed in baseUnits
+ * is the amount expressed in the smallest denomination.
+ * E.g: 1 unit of a token with 18 decimal places is expressed in baseUnits as 1000000000000000000
+ * @param amount The amount of units that you would like converted to baseUnits.
+ * @param decimals The number of decimal places the unit amount has.
+ * @return The amount in baseUnits.
+ */
+ public static toBaseUnitAmount(amount: BigNumber, decimals: number): BigNumber {
+ assert.isBigNumber('amount', amount);
+ assert.isNumber('decimals', decimals);
+ const unit = new BigNumber(BASE_TEN).pow(decimals);
+ const baseUnitAmount = amount.times(unit);
+ const hasDecimals = baseUnitAmount.decimalPlaces() !== 0;
+ if (hasDecimals) {
+ throw new Error(`Invalid unit amount: ${amount.toString()} - Too many decimal places`);
+ }
+ return baseUnitAmount;
+ }
+ /**
+ * Convert an Ether amount from ETH to Wei
+ * @param ethAmount Amount of Ether to convert to wei
+ * @returns Amount in wei
+ */
+ public static toWei(ethAmount: BigNumber): BigNumber {
+ assert.isBigNumber('ethAmount', ethAmount);
+ const ETH_DECIMALS = 18;
+ const balanceWei = Web3Wrapper.toBaseUnitAmount(ethAmount, ETH_DECIMALS);
+ return balanceWei;
+ }
+ private static _assertBlockParam(blockParam: string | BlockParam): void {
+ if (_.isNumber(blockParam)) {
+ return;
+ } else if (_.isString(blockParam)) {
+ assert.doesBelongToStringEnum('blockParam', blockParam, BlockParamLiteral);
+ }
+ }
+ private static _assertBlockParamOrString(blockParam: string | BlockParam): void {
+ try {
+ Web3Wrapper._assertBlockParam(blockParam);
+ } catch (err) {
+ try {
+ assert.isHexString('blockParam', blockParam as string);
+ return;
+ } catch (err) {
+ throw new Error(`Expected blockParam to be of type "string | BlockParam", encountered ${blockParam}`);
+ }
+ }
+ }
+ private static _normalizeTxReceiptStatus(status: undefined | null | string | 0 | 1): null | 0 | 1 {
+ // Transaction status might have four values
+ // undefined - Testrpc and other old clients
+ // null - New clients on old transactions
+ // number - Parity
+ // hex - Geth
+ if (_.isString(status)) {
+ return utils.convertHexToNumber(status) as 0 | 1;
+ } else if (_.isUndefined(status)) {
+ return null;
+ } else {
+ return status;
+ }
+ }
+ /**
+ * Instantiates a new Web3Wrapper.
+ * @param provider The Web3 provider instance you would like the Web3Wrapper to use for interacting with
+ * the backing Ethereum node.
+ * @param txDefaults Override TxData defaults sent with RPC requests to the backing Ethereum node.
+ * @return An instance of the Web3Wrapper class.
+ */
+ constructor(provider: Provider, txDefaults?: Partial<TxData>) {
+ assert.isWeb3Provider('provider', provider);
+ if (_.isUndefined((provider as any).sendAsync)) {
+ // Web3@1.0 provider doesn't support synchronous http requests,
+ // so it only has an async `send` method, instead of a `send` and `sendAsync` in web3@0.x.x`
+ // We re-assign the send method so that Web3@1.0 providers work with @0xproject/web3-wrapper
+ (provider as any).sendAsync = (provider as any).send;
+ }
+ this.abiDecoder = new AbiDecoder([]);
+ this._provider = provider;
+ this._txDefaults = txDefaults || {};
+ this._jsonRpcRequestId = 0;
+ }
+ /**
+ * Get the contract defaults set to the Web3Wrapper instance
+ * @return TxData defaults (e.g gas, gasPrice, nonce, etc...)
+ */
+ public getContractDefaults(): Partial<TxData> {
+ return this._txDefaults;
+ }
+ /**
+ * Retrieve the Web3 provider
+ * @return Web3 provider instance
+ */
+ public getProvider(): Provider {
+ return this._provider;
+ }
+ /**
+ * Update the used Web3 provider
+ * @param provider The new Web3 provider to be set
+ */
+ public setProvider(provider: Provider): void {
+ assert.isWeb3Provider('provider', provider);
+ this._provider = provider;
+ }
+ /**
+ * Check whether an address is available through the backing provider. This can be
+ * useful if you want to know whether a user can sign messages or transactions from
+ * a given Ethereum address.
+ * @param senderAddress Address to check availability for
+ * @returns Whether the address is available through the provider.
+ */
+ public async isSenderAddressAvailableAsync(senderAddress: string): Promise<boolean> {
+ assert.isETHAddressHex('senderAddress', senderAddress);
+ const addresses = await this.getAvailableAddressesAsync();
+ const normalizedAddress = senderAddress.toLowerCase();
+ return _.includes(addresses, normalizedAddress);
+ }
+ /**
+ * Fetch the backing Ethereum node's version string (e.g `MetaMask/v4.2.0`)
+ * @returns Ethereum node's version string
+ */
+ public async getNodeVersionAsync(): Promise<string> {
+ const nodeVersion = await this._sendRawPayloadAsync<string>({ method: 'web3_clientVersion' });
+ return nodeVersion;
+ }
+ /**
+ * Fetches the networkId of the backing Ethereum node
+ * @returns The network id
+ */
+ public async getNetworkIdAsync(): Promise<number> {
+ const networkIdStr = await this._sendRawPayloadAsync<string>({ method: 'net_version' });
+ const networkId = _.parseInt(networkIdStr);
+ return networkId;
+ }
+ /**
+ * Retrieves the transaction receipt for a given transaction hash
+ * @param txHash Transaction hash
+ * @returns The transaction receipt, including it's status (0: failed, 1: succeeded or undefined: not found)
+ */
+ public async getTransactionReceiptAsync(txHash: string): Promise<TransactionReceipt> {
+ assert.isHexString('txHash', txHash);
+ const transactionReceipt = await this._sendRawPayloadAsync<TransactionReceipt>({
+ method: 'eth_getTransactionReceipt',
+ params: [txHash],
+ });
+ if (!_.isNull(transactionReceipt)) {
+ transactionReceipt.status = Web3Wrapper._normalizeTxReceiptStatus(transactionReceipt.status);
+ }
+ return transactionReceipt;
+ }
+ /**
+ * Retrieves the transaction data for a given transaction
+ * @param txHash Transaction hash
+ * @returns The raw transaction data
+ */
+ public async getTransactionByHashAsync(txHash: string): Promise<Transaction> {
+ assert.isHexString('txHash', txHash);
+ const transaction = await this._sendRawPayloadAsync<Transaction>({
+ method: 'eth_getTransactionByHash',
+ params: [txHash],
+ });
+ return transaction;
+ }
+ /**
+ * Retrieves an accounts Ether balance in wei
+ * @param owner Account whose balance you wish to check
+ * @returns Balance in wei
+ */
+ public async getBalanceInWeiAsync(owner: string, defaultBlock?: BlockParam): Promise<BigNumber> {
+ assert.isETHAddressHex('owner', owner);
+ if (!_.isUndefined(defaultBlock)) {
+ Web3Wrapper._assertBlockParam(defaultBlock);
+ }
+ const marshalledDefaultBlock = marshaller.marshalBlockParam(defaultBlock);
+ const encodedOwner = marshaller.marshalAddress(owner);
+ const balanceInWei = await this._sendRawPayloadAsync<string>({
+ method: 'eth_getBalance',
+ params: [encodedOwner, marshalledDefaultBlock],
+ });
+ // Rewrap in a new BigNumber
+ return new BigNumber(balanceInWei);
+ }
+ /**
+ * Check if a contract exists at a given address
+ * @param address Address to which to check
+ * @returns Whether or not contract code was found at the supplied address
+ */
+ public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
+ assert.isETHAddressHex('address', address);
+ const code = await this.getContractCodeAsync(address);
+ // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients
+ const isCodeEmpty = /^0x0{0,40}$/i.test(code);
+ return !isCodeEmpty;
+ }
+ /**
+ * Gets the contract code by address
+ * @param address Address of the contract
+ * @param defaultBlock Block height at which to make the call. Defaults to `latest`
+ * @return Code of the contract
+ */
+ public async getContractCodeAsync(address: string, defaultBlock?: BlockParam): Promise<string> {
+ assert.isETHAddressHex('address', address);
+ if (!_.isUndefined(defaultBlock)) {
+ Web3Wrapper._assertBlockParam(defaultBlock);
+ }
+ const marshalledDefaultBlock = marshaller.marshalBlockParam(defaultBlock);
+ const encodedAddress = marshaller.marshalAddress(address);
+ const code = await this._sendRawPayloadAsync<string>({
+ method: 'eth_getCode',
+ params: [encodedAddress, marshalledDefaultBlock],
+ });
+ return code;
+ }
+ /**
+ * Gets the debug trace of a transaction
+ * @param txHash Hash of the transactuon to get a trace for
+ * @param traceParams Config object allowing you to specify if you need memory/storage/stack traces.
+ * @return Transaction trace
+ */
+ public async getTransactionTraceAsync(txHash: string, traceParams: TraceParams): Promise<TransactionTrace> {
+ assert.isHexString('txHash', txHash);
+ const trace = await this._sendRawPayloadAsync<TransactionTrace>({
+ method: 'debug_traceTransaction',
+ params: [txHash, traceParams],
+ });
+ return trace;
+ }
+ /**
+ * Sign a message with a specific address's private key (`eth_sign`)
+ * @param address Address of signer
+ * @param message Message to sign
+ * @returns Signature string (might be VRS or RSV depending on the Signer)
+ */
+ public async signMessageAsync(address: string, message: string): Promise<string> {
+ assert.isETHAddressHex('address', address);
+ assert.isString('message', message); // TODO: Should this be stricter? Hex string?
+ const signData = await this._sendRawPayloadAsync<string>({
+ method: 'eth_sign',
+ params: [address, message],
+ });
+ return signData;
+ }
+ /**
+ * Fetches the latest block number
+ * @returns Block number
+ */
+ public async getBlockNumberAsync(): Promise<number> {
+ const blockNumberHex = await this._sendRawPayloadAsync<string>({
+ method: 'eth_blockNumber',
+ params: [],
+ });
+ const blockNumber = utils.convertHexToNumberOrNull(blockNumberHex);
+ return blockNumber as number;
+ }
+ /**
+ * Fetch a specific Ethereum block without transaction data
+ * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
+ * @returns The requested block without transaction data
+ */
+ public async getBlockAsync(blockParam: string | BlockParam): Promise<BlockWithoutTransactionData> {
+ Web3Wrapper._assertBlockParamOrString(blockParam);
+ const encodedBlockParam = marshaller.marshalBlockParam(blockParam);
+ const method = utils.isHexStrict(blockParam) ? 'eth_getBlockByHash' : 'eth_getBlockByNumber';
+ const shouldIncludeTransactionData = false;
+ const blockWithoutTransactionDataWithHexValues = await this._sendRawPayloadAsync<
+ BlockWithoutTransactionDataRPC
+ >({
+ method,
+ params: [encodedBlockParam, shouldIncludeTransactionData],
+ });
+ const blockWithoutTransactionData = marshaller.unmarshalIntoBlockWithoutTransactionData(
+ blockWithoutTransactionDataWithHexValues,
+ );
+ return blockWithoutTransactionData;
+ }
+ /**
+ * Fetch a specific Ethereum block with transaction data
+ * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
+ * @returns The requested block with transaction data
+ */
+ public async getBlockWithTransactionDataAsync(blockParam: string | BlockParam): Promise<BlockWithTransactionData> {
+ Web3Wrapper._assertBlockParamOrString(blockParam);
+ let encodedBlockParam = blockParam;
+ if (_.isNumber(blockParam)) {
+ encodedBlockParam = utils.numberToHex(blockParam);
+ }
+ const method = utils.isHexStrict(blockParam) ? 'eth_getBlockByHash' : 'eth_getBlockByNumber';
+ const shouldIncludeTransactionData = true;
+ const blockWithTransactionDataWithHexValues = await this._sendRawPayloadAsync<BlockWithTransactionDataRPC>({
+ method,
+ params: [encodedBlockParam, shouldIncludeTransactionData],
+ });
+ const blockWithoutTransactionData = marshaller.unmarshalIntoBlockWithTransactionData(
+ blockWithTransactionDataWithHexValues,
+ );
+ return blockWithoutTransactionData;
+ }
+ /**
+ * Fetch a block's timestamp
+ * @param blockParam The block you wish to fetch (blockHash, blockNumber or blockLiteral)
+ * @returns The block's timestamp
+ */
+ public async getBlockTimestampAsync(blockParam: string | BlockParam): Promise<number> {
+ Web3Wrapper._assertBlockParamOrString(blockParam);
+ const { timestamp } = await this.getBlockAsync(blockParam);
+ return timestamp;
+ }
+ /**
+ * Retrieve the user addresses available through the backing provider
+ * @returns Available user addresses
+ */
+ public async getAvailableAddressesAsync(): Promise<string[]> {
+ const addresses = await this._sendRawPayloadAsync<string>({
+ method: 'eth_accounts',
+ params: [],
+ });
+ const normalizedAddresses = _.map(addresses, address => address.toLowerCase());
+ return normalizedAddresses;
+ }
+ /**
+ * Take a snapshot of the blockchain state on a TestRPC/Ganache local node
+ * @returns The snapshot id. This can be used to revert to this snapshot
+ */
+ public async takeSnapshotAsync(): Promise<number> {
+ const snapshotId = Number(await this._sendRawPayloadAsync<string>({ method: 'evm_snapshot', params: [] }));
+ return snapshotId;
+ }
+ /**
+ * Revert the blockchain state to a previous snapshot state on TestRPC/Ganache local node
+ * @param snapshotId snapshot id to revert to
+ * @returns Whether the revert was successful
+ */
+ public async revertSnapshotAsync(snapshotId: number): Promise<boolean> {
+ assert.isNumber('snapshotId', snapshotId);
+ const didRevert = await this._sendRawPayloadAsync<boolean>({ method: 'evm_revert', params: [snapshotId] });
+ return didRevert;
+ }
+ /**
+ * Mine a block on a TestRPC/Ganache local node
+ */
+ public async mineBlockAsync(): Promise<void> {
+ await this._sendRawPayloadAsync<string>({ method: 'evm_mine', params: [] });
+ }
+ /**
+ * Increase the next blocks timestamp on TestRPC/Ganache or Geth local node.
+ * Will throw if provider is neither TestRPC/Ganache or Geth.
+ * @param timeDelta Amount of time to add in seconds
+ */
+ public async increaseTimeAsync(timeDelta: number): Promise<number> {
+ assert.isNumber('timeDelta', timeDelta);
+ // Detect Geth vs. Ganache and use appropriate endpoint.
+ const version = await this.getNodeVersionAsync();
+ if (_.includes(version, uniqueVersionIds.geth)) {
+ return this._sendRawPayloadAsync<number>({ method: 'debug_increaseTime', params: [timeDelta] });
+ } else if (_.includes(version, uniqueVersionIds.ganache)) {
+ return this._sendRawPayloadAsync<number>({ method: 'evm_increaseTime', params: [timeDelta] });
+ } else {
+ throw new Error(`Unknown client version: ${version}`);
+ }
+ }
+ /**
+ * Retrieve smart contract logs for a given filter
+ * @param filter Parameters by which to filter which logs to retrieve
+ * @returns The corresponding log entries
+ */
+ public async getLogsAsync(filter: FilterObject): Promise<LogEntry[]> {
+ let fromBlock = filter.fromBlock;
+ if (_.isNumber(fromBlock)) {
+ fromBlock = utils.numberToHex(fromBlock);
+ }
+ let toBlock = filter.toBlock;
+ if (_.isNumber(toBlock)) {
+ toBlock = utils.numberToHex(toBlock);
+ }
+ const serializedFilter = {
+ ...filter,
+ fromBlock,
+ toBlock,
+ };
+ const payload = {
+ method: 'eth_getLogs',
+ params: [serializedFilter],
+ };
+ const rawLogs = await this._sendRawPayloadAsync<RawLogEntry[]>(payload);
+ const formattedLogs = _.map(rawLogs, marshaller.unmarshalLog.bind(marshaller));
+ return formattedLogs;
+ }
+ /**
+ * Calculate the estimated gas cost for a given transaction
+ * @param txData Transaction data
+ * @returns Estimated gas cost
+ */
+ public async estimateGasAsync(txData: Partial<TxData>): Promise<number> {
+ assert.doesConformToSchema('txData', txData, schemas.txDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ const txDataHex = marshaller.marshalTxData(txData);
+ const gasHex = await this._sendRawPayloadAsync<string>({ method: 'eth_estimateGas', params: [txDataHex] });
+ const gas = utils.convertHexToNumber(gasHex);
+ return gas;
+ }
+ /**
+ * Call a smart contract method at a given block height
+ * @param callData Call data
+ * @param defaultBlock Block height at which to make the call. Defaults to `latest`
+ * @returns The raw call result
+ */
+ public async callAsync(callData: CallData, defaultBlock?: BlockParam): Promise<string> {
+ assert.doesConformToSchema('callData', callData, schemas.callDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ if (!_.isUndefined(defaultBlock)) {
+ Web3Wrapper._assertBlockParam(defaultBlock);
+ }
+ const marshalledDefaultBlock = marshaller.marshalBlockParam(defaultBlock);
+ const callDataHex = marshaller.marshalCallData(callData);
+ const rawCallResult = await this._sendRawPayloadAsync<string>({
+ method: 'eth_call',
+ params: [callDataHex, marshalledDefaultBlock],
+ });
+ if (rawCallResult === '0x') {
+ throw new Error('Contract call failed (returned null)');
+ }
+ return rawCallResult;
+ }
+ /**
+ * Send a transaction
+ * @param txData Transaction data
+ * @returns Transaction hash
+ */
+ public async sendTransactionAsync(txData: TxData): Promise<string> {
+ assert.doesConformToSchema('txData', txData, schemas.txDataSchema, [
+ schemas.addressSchema,
+ schemas.numberSchema,
+ schemas.jsNumber,
+ ]);
+ const txDataHex = marshaller.marshalTxData(txData);
+ const txHash = await this._sendRawPayloadAsync<string>({ method: 'eth_sendTransaction', params: [txDataHex] });
+ return txHash;
+ }
+ /**
+ * Waits for a transaction to be mined and returns the transaction receipt.
+ * Note that just because a transaction was mined does not mean it was
+ * successful. You need to check the status code of the transaction receipt
+ * to find out if it was successful, or use the helper method
+ * awaitTransactionSuccessAsync.
+ * @param txHash Transaction hash
+ * @param pollingIntervalMs How often (in ms) should we check if the transaction is mined.
+ * @param timeoutMs How long (in ms) to poll for transaction mined until aborting.
+ * @return Transaction receipt with decoded log args.
+ */
+ public async awaitTransactionMinedAsync(
+ txHash: string,
+ pollingIntervalMs: number = 1000,
+ timeoutMs?: number,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ assert.isHexString('txHash', txHash);
+ assert.isNumber('pollingIntervalMs', pollingIntervalMs);
+ if (!_.isUndefined(timeoutMs)) {
+ assert.isNumber('timeoutMs', timeoutMs);
+ }
+ // Immediately check if the transaction has already been mined.
+ let transactionReceipt = await this.getTransactionReceiptAsync(txHash);
+ if (!_.isNull(transactionReceipt)) {
+ const logsWithDecodedArgs = _.map(
+ transactionReceipt.logs,
+ this.abiDecoder.tryToDecodeLogOrNoop.bind(this.abiDecoder),
+ );
+ const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
+ ...transactionReceipt,
+ logs: logsWithDecodedArgs,
+ };
+ return transactionReceiptWithDecodedLogArgs;
+ }
+
+ // Otherwise, check again every pollingIntervalMs.
+ let wasTimeoutExceeded = false;
+ if (timeoutMs) {
+ setTimeout(() => (wasTimeoutExceeded = true), timeoutMs);
+ }
+
+ const txReceiptPromise = new Promise(
+ (resolve: (receipt: TransactionReceiptWithDecodedLogs) => void, reject) => {
+ const intervalId = intervalUtils.setAsyncExcludingInterval(
+ async () => {
+ if (wasTimeoutExceeded) {
+ intervalUtils.clearAsyncExcludingInterval(intervalId);
+ return reject(Web3WrapperErrors.TransactionMiningTimeout);
+ }
+
+ transactionReceipt = await this.getTransactionReceiptAsync(txHash);
+ if (!_.isNull(transactionReceipt)) {
+ intervalUtils.clearAsyncExcludingInterval(intervalId);
+ const logsWithDecodedArgs = _.map(
+ transactionReceipt.logs,
+ this.abiDecoder.tryToDecodeLogOrNoop.bind(this.abiDecoder),
+ );
+ const transactionReceiptWithDecodedLogArgs: TransactionReceiptWithDecodedLogs = {
+ ...transactionReceipt,
+ logs: logsWithDecodedArgs,
+ };
+ resolve(transactionReceiptWithDecodedLogArgs);
+ }
+ },
+ pollingIntervalMs,
+ (err: Error) => {
+ intervalUtils.clearAsyncExcludingInterval(intervalId);
+ reject(err);
+ },
+ );
+ },
+ );
+ const txReceipt = await txReceiptPromise;
+ return txReceipt;
+ }
+ /**
+ * Waits for a transaction to be mined and returns the transaction receipt.
+ * Unlike awaitTransactionMinedAsync, it will throw if the receipt has a
+ * status that is not equal to 1. A status of 0 or null indicates that the
+ * transaction was mined, but failed. See:
+ * https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgettransactionreceipt
+ * @param txHash Transaction hash
+ * @param pollingIntervalMs How often (in ms) should we check if the transaction is mined.
+ * @param timeoutMs How long (in ms) to poll for transaction mined until aborting.
+ * @return Transaction receipt with decoded log args.
+ */
+ public async awaitTransactionSuccessAsync(
+ txHash: string,
+ pollingIntervalMs: number = 1000,
+ timeoutMs?: number,
+ ): Promise<TransactionReceiptWithDecodedLogs> {
+ const receipt = await this.awaitTransactionMinedAsync(txHash, pollingIntervalMs, timeoutMs);
+ if (receipt.status !== 1) {
+ throw new Error(`Transaction failed: ${txHash}`);
+ }
+ return receipt;
+ }
+ /**
+ * Calls the 'debug_setHead' JSON RPC method, which sets the current head of
+ * the local chain by block number. Note, this is a destructive action and
+ * may severely damage your chain. Use with extreme caution. As of now, this
+ * is only supported by Geth. It sill throw if the 'debug_setHead' method is
+ * not supported.
+ * @param blockNumber The block number to reset to.
+ */
+ public async setHeadAsync(blockNumber: number): Promise<void> {
+ assert.isNumber('blockNumber', blockNumber);
+ await this._sendRawPayloadAsync<void>({ method: 'debug_setHead', params: [utils.numberToHex(blockNumber)] });
+ }
+ /**
+ * Returns either NodeType.Geth or NodeType.Ganache depending on the type of
+ * the backing Ethereum node. Throws for any other type of node.
+ */
+ public async getNodeTypeAsync(): Promise<NodeType> {
+ const version = await this.getNodeVersionAsync();
+ if (_.includes(version, uniqueVersionIds.geth)) {
+ return NodeType.Geth;
+ } else if (_.includes(version, uniqueVersionIds.ganache)) {
+ return NodeType.Ganache;
+ } else {
+ throw new Error(`Unknown client version: ${version}`);
+ }
+ }
+ private async _sendRawPayloadAsync<A>(payload: Partial<JSONRPCRequestPayload>): Promise<A> {
+ const sendAsync = this._provider.sendAsync.bind(this._provider);
+ const payloadWithDefaults = {
+ id: this._jsonRpcRequestId++,
+ params: [],
+ jsonrpc: '2.0',
+ ...payload,
+ };
+ const response = await promisify<JSONRPCResponsePayload>(sendAsync)(payloadWithDefaults);
+ const result = response.result;
+ return result;
+ }
+} // tslint:disable-line:max-file-line-count
diff --git a/packages/web3-wrapper/test/utils/chai_setup.ts b/packages/web3-wrapper/test/utils/chai_setup.ts
new file mode 100644
index 000000000..1a8733093
--- /dev/null
+++ b/packages/web3-wrapper/test/utils/chai_setup.ts
@@ -0,0 +1,13 @@
+import * as chai from 'chai';
+import chaiAsPromised = require('chai-as-promised');
+import ChaiBigNumber = require('chai-bignumber');
+import * as dirtyChai from 'dirty-chai';
+
+export const chaiSetup = {
+ configure(): void {
+ chai.config.includeStack = true;
+ chai.use(ChaiBigNumber());
+ chai.use(dirtyChai);
+ chai.use(chaiAsPromised);
+ },
+};
diff --git a/packages/web3-wrapper/test/web3_wrapper_test.ts b/packages/web3-wrapper/test/web3_wrapper_test.ts
new file mode 100644
index 000000000..b4fd8bb44
--- /dev/null
+++ b/packages/web3-wrapper/test/web3_wrapper_test.ts
@@ -0,0 +1,132 @@
+import * as chai from 'chai';
+import { BlockParamLiteral } from 'ethereum-types';
+import * as Ganache from 'ganache-core';
+import * as _ from 'lodash';
+import 'mocha';
+
+import { utils } from '../src/utils';
+import { Web3Wrapper } from '../src/web3_wrapper';
+
+import { chaiSetup } from './utils/chai_setup';
+chaiSetup.configure();
+
+const { expect } = chai;
+
+const NUM_GANACHE_ADDRESSES = 10;
+
+describe('Web3Wrapper tests', () => {
+ const NETWORK_ID = 50;
+ const provider = Ganache.provider({ network_id: NETWORK_ID });
+ const web3Wrapper = new Web3Wrapper(provider);
+ let addresses: string[];
+ before(async () => {
+ addresses = await web3Wrapper.getAvailableAddressesAsync();
+ });
+ describe('#isAddress', () => {
+ it('correctly checks if a string is a valid ethereum address', () => {
+ expect(Web3Wrapper.isAddress('0x0')).to.be.false();
+ expect(Web3Wrapper.isAddress('0xdeadbeef')).to.be.false();
+ expect(Web3Wrapper.isAddress('42')).to.be.false();
+ expect(Web3Wrapper.isAddress('weth.thetoken.eth')).to.be.false();
+ expect(Web3Wrapper.isAddress('0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2')).to.be.true();
+ expect(Web3Wrapper.isAddress('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2')).to.be.true();
+ });
+ });
+ describe('#getNodeVersionAsync', () => {
+ it('gets the node version', async () => {
+ const nodeVersion = await web3Wrapper.getNodeVersionAsync();
+ const NODE_VERSION = 'EthereumJS TestRPC/v2.1.2/ethereum-js';
+ expect(nodeVersion).to.be.equal(NODE_VERSION);
+ });
+ });
+ describe('#getNetworkIdAsync', () => {
+ it('gets the network id', async () => {
+ const networkId = await web3Wrapper.getNetworkIdAsync();
+ expect(networkId).to.be.equal(NETWORK_ID);
+ });
+ });
+ describe('#getNetworkIdAsync', () => {
+ it('gets the network id', async () => {
+ const networkId = await web3Wrapper.getNetworkIdAsync();
+ expect(networkId).to.be.equal(NETWORK_ID);
+ });
+ });
+ describe('#getAvailableAddressesAsync', () => {
+ it('gets the available addresses', async () => {
+ const availableAddresses = await web3Wrapper.getAvailableAddressesAsync();
+ expect(availableAddresses.length).to.be.equal(NUM_GANACHE_ADDRESSES);
+ expect(Web3Wrapper.isAddress(availableAddresses[0])).to.equal(true);
+ });
+ });
+ describe('#getBalanceInWeiAsync', () => {
+ it('gets the users balance in wei', async () => {
+ const secondAccount = addresses[1];
+ const balanceInWei = await web3Wrapper.getBalanceInWeiAsync(secondAccount);
+ const tenEthInWei = 100000000000000000000;
+ expect(balanceInWei).to.be.bignumber.equal(tenEthInWei);
+ });
+ it('should throw if supplied owner not an Ethereum address hex string', async () => {
+ const invalidEthAddress = 'deadbeef';
+ expect(web3Wrapper.getBalanceInWeiAsync(invalidEthAddress)).to.eventually.to.be.rejected();
+ });
+ });
+ describe('#signMessageAsync', () => {
+ it('should sign message', async () => {
+ const message = '0xdeadbeef';
+ const signer = addresses[1];
+ const signature = await web3Wrapper.signMessageAsync(signer, message);
+ const signatureLength = 132;
+ expect(signature.length).to.be.equal(signatureLength);
+ });
+ });
+ describe('#getBlockNumberAsync', () => {
+ it('get block number', async () => {
+ const blockNumber = await web3Wrapper.getBlockNumberAsync();
+ expect(typeof blockNumber).to.be.equal('number');
+ });
+ });
+ describe('#getBlockAsync', () => {
+ it('gets block when supplied a valid BlockParamLiteral value', async () => {
+ const blockParamLiteral = BlockParamLiteral.Earliest;
+ const block = await web3Wrapper.getBlockAsync(blockParamLiteral);
+ expect(block.number).to.be.equal(0);
+ expect(utils.isBigNumber(block.difficulty)).to.equal(true);
+ expect(_.isNumber(block.gasLimit)).to.equal(true);
+ });
+ it('gets block when supplied a block number', async () => {
+ const blockParamLiteral = 0;
+ const block = await web3Wrapper.getBlockAsync(blockParamLiteral);
+ expect(block.number).to.be.equal(0);
+ });
+ it('gets block when supplied a block hash', async () => {
+ const blockParamLiteral = 0;
+ const block = await web3Wrapper.getBlockAsync(blockParamLiteral);
+ const sameBlock = await web3Wrapper.getBlockAsync(block.hash as string);
+ expect(sameBlock.number).to.be.equal(0);
+ });
+ it('should throw if supplied invalid blockParam value', async () => {
+ const invalidBlockParam = 'deadbeef';
+ expect(web3Wrapper.getBlockAsync(invalidBlockParam)).to.eventually.to.be.rejected();
+ });
+ });
+ describe('#getBlockWithTransactionDataAsync', () => {
+ it('gets block when supplied a valid BlockParamLiteral value', async () => {
+ const blockParamLiteral = BlockParamLiteral.Earliest;
+ const block = await web3Wrapper.getBlockWithTransactionDataAsync(blockParamLiteral);
+ expect(block.number).to.be.equal(0);
+ expect(utils.isBigNumber(block.difficulty)).to.equal(true);
+ expect(_.isNumber(block.gasLimit)).to.equal(true);
+ });
+ it('should throw if supplied invalid blockParam value', async () => {
+ const invalidBlockParam = 'deadbeef';
+ expect(web3Wrapper.getBlockWithTransactionDataAsync(invalidBlockParam)).to.eventually.to.be.rejected();
+ });
+ });
+ describe('#getBlockTimestampAsync', () => {
+ it('gets block timestamp', async () => {
+ const blockParamLiteral = BlockParamLiteral.Earliest;
+ const timestamp = await web3Wrapper.getBlockTimestampAsync(blockParamLiteral);
+ expect(_.isNumber(timestamp)).to.be.equal(true);
+ });
+ });
+});
diff --git a/packages/web3-wrapper/tsconfig.json b/packages/web3-wrapper/tsconfig.json
index c56d255d5..8b4cd47a2 100644
--- a/packages/web3-wrapper/tsconfig.json
+++ b/packages/web3-wrapper/tsconfig.json
@@ -3,5 +3,5 @@
"compilerOptions": {
"outDir": "lib"
},
- "include": ["./src/**/*"]
+ "include": ["src/**/*", "test/**/*"]
}
diff --git a/packages/website/README.md b/packages/website/README.md
index 042df52de..7115a3b5c 100644
--- a/packages/website/README.md
+++ b/packages/website/README.md
@@ -28,20 +28,22 @@ Add the following to your `/etc/hosts` file:
yarn install
```
-### Run dev server
+### Initial setup
+
+To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
```bash
-yarn run dev
+PKG=@0xproject/website yarn build
```
-Visit [0xproject.localhost:3572](http://0xproject.localhost:3572) in your browser.
-
-### Build
+### Run dev server
```bash
-yarn build
+PKG=@0xproject/website yarn watch
```
+Visit [0xproject.localhost:3572](http://0xproject.localhost:3572) in your browser.
+
### Clean
```bash
diff --git a/packages/website/md/docs/0xjs/async.md b/packages/website/md/docs/0xjs/1.0.0/async.md
index 8abaef331..8abaef331 100644
--- a/packages/website/md/docs/0xjs/async.md
+++ b/packages/website/md/docs/0xjs/1.0.0/async.md
diff --git a/packages/website/md/docs/0xjs/errors.md b/packages/website/md/docs/0xjs/1.0.0/errors.md
index e97973ccf..e97973ccf 100644
--- a/packages/website/md/docs/0xjs/errors.md
+++ b/packages/website/md/docs/0xjs/1.0.0/errors.md
diff --git a/packages/website/md/docs/0xjs/installation.md b/packages/website/md/docs/0xjs/1.0.0/installation.md
index ac0a47699..ac0a47699 100644
--- a/packages/website/md/docs/0xjs/installation.md
+++ b/packages/website/md/docs/0xjs/1.0.0/installation.md
diff --git a/packages/website/md/docs/0xjs/introduction.md b/packages/website/md/docs/0xjs/1.0.0/introduction.md
index 008376d33..008376d33 100644
--- a/packages/website/md/docs/0xjs/introduction.md
+++ b/packages/website/md/docs/0xjs/1.0.0/introduction.md
diff --git a/packages/website/md/docs/0xjs/versioning.md b/packages/website/md/docs/0xjs/1.0.0/versioning.md
index 6bcaa5b4d..6bcaa5b4d 100644
--- a/packages/website/md/docs/0xjs/versioning.md
+++ b/packages/website/md/docs/0xjs/1.0.0/versioning.md
diff --git a/packages/website/md/docs/0xjs/2.0.0/introduction.md b/packages/website/md/docs/0xjs/2.0.0/introduction.md
new file mode 100644
index 000000000..b98aeef38
--- /dev/null
+++ b/packages/website/md/docs/0xjs/2.0.0/introduction.md
@@ -0,0 +1,3 @@
+<b>**NOTE:** Release candidate versions are meant to work with V2 of 0x protocol. To interact with V1, select a 0.X version.</b>
+
+Welcome to the [0x.js](https://github.com/0xProject/0x-monorepo) documentation! 0x.js is a Javascript library for interacting with the 0x protocol. With it, you can easily make calls to the 0x smart contracts as well as any token adhering to the token standards supported by the protocol (currently ERC20 & ERC721). Functionality includes generating, signing, filling and cancelling orders, verifying an orders signature, setting or checking a users ERC20/ERC721 token balance/allowance and much more.
diff --git a/packages/website/md/docs/0xjs/2.0.0/versioning.md b/packages/website/md/docs/0xjs/2.0.0/versioning.md
new file mode 100644
index 000000000..7f2b6fee9
--- /dev/null
+++ b/packages/website/md/docs/0xjs/2.0.0/versioning.md
@@ -0,0 +1 @@
+Since v1.0.0, this package adheres to the [Semantic Versioning 2.0.0](http://semver.org/) specification. The library's public interface includes all the methods, properties and types included in the documentation. We will publish with a major version bump for any breaking change to the public interface, use a minor version bump when introducing new features in a backwards-compatible way, and patch versions when introducing backwards-compatible bug fixes. Because of this, we recommend you import `0x.js` with a caret `^2.0.0` to take advantage of non-breaking bug fixes.
diff --git a/packages/website/md/docs/connect/installation.md b/packages/website/md/docs/connect/1.0.0/installation.md
index 950bf92ca..950bf92ca 100644
--- a/packages/website/md/docs/connect/installation.md
+++ b/packages/website/md/docs/connect/1.0.0/installation.md
diff --git a/packages/website/md/docs/connect/introduction.md b/packages/website/md/docs/connect/1.0.0/introduction.md
index 4e3039442..4e3039442 100644
--- a/packages/website/md/docs/connect/introduction.md
+++ b/packages/website/md/docs/connect/1.0.0/introduction.md
diff --git a/packages/website/md/docs/deployer/installation.md b/packages/website/md/docs/deployer/installation.md
deleted file mode 100644
index c02dbadc6..000000000
--- a/packages/website/md/docs/deployer/installation.md
+++ /dev/null
@@ -1,24 +0,0 @@
-#### CLI Installation
-
-```bash
-yarn global add @0xproject/deployer
-```
-
-#### API Installation
-
-```bash
-yarn add @0xproject/deployer
-```
-
-**Import**
-
-```typescript
-import { Deployer, Compiler } from '@0xproject/deployer';
-```
-
-or
-
-```javascript
-var Deployer = require('@0xproject/deployer').Deployer;
-var Compiler = require('@0xproject/deployer').Compiler;
-```
diff --git a/packages/website/md/docs/deployer/introduction.md b/packages/website/md/docs/deployer/introduction.md
deleted file mode 100644
index 7ebd26a3c..000000000
--- a/packages/website/md/docs/deployer/introduction.md
+++ /dev/null
@@ -1,18 +0,0 @@
-Welcome to the [Deployer](https://github.com/0xProject/0x-monorepo/tree/development/packages/deployer) documentation! Deployer is a tool for compiling and deploying Solidity smart contracts with ease.
-
-It serves a similar purpose as parts of the [Truffle framework](http://truffleframework.com/), but with the UNIX philosophy in mind: Make each program do one thing well. This tool is for intermediate to advanced Solidity developers that require greater configurability and reliability.
-
-Deployer has the following advantages over Truffle:
-
-* Deploy each smart contract with a specific version of Solidity.
-* Improved artifact files:
- * Properly segregated artifacts to support storing different versions of smart contract deployed on different networks.
- * Storage of constructor args, source maps and paths to all requisite source files.
- * An easy to maintain codebase: TypeScript + Single repo.
- * Allows you to specify the deployer RPC address.
- * Supports Solidity version ranges - contract compiled with latest Solidity version that satisfies the range.
- * Migrations that work with `async/await`.
- * Migrations that can be written synchronously in order to guarentee deterministic contract addresses.
- * No race conditions when running migrations.
-
-Deployer can be used as a command-line tool or as an imported module.
diff --git a/packages/website/md/docs/deployer/usage.md b/packages/website/md/docs/deployer/usage.md
deleted file mode 100644
index 295af55e1..000000000
--- a/packages/website/md/docs/deployer/usage.md
+++ /dev/null
@@ -1,56 +0,0 @@
-#### CLI Usage
-
-```bash
-$ 0x-deployer --help
-0x-deployer [command]
-
-Commands:
- 0x-deployer compile compile contracts
- 0x-deployer deploy deploy a single contract with provided arguments
-
-Options:
- --version Show version number [boolean]
- --contracts-dir path of contracts directory to compile [string] [default:
- "/path/to/contracts"]
- --network-id mainnet=1, kovan=42, testrpc=50 [number] [default: 50]
- --should-optimize enable optimizer [boolean] [default: false]
- --artifacts-dir path to write contracts artifacts to [string] [default:
- "/path/to/artifacts"]
- --jsonrpc-port port connected to JSON RPC [number] [default: 8545]
- --gas-price gasPrice to be used for transactions
- [string] [default: "2000000000"]
- --account account to use for deploying contracts [string]
- --contracts comma separated list of contracts to compile
- [string] [default: "*"]
- --help Show help [boolean]
-```
-
-#### API Usage
-
-##### Migrations
-
-You can write migration scripts (similar to `truffle migrate`), that deploys multiple contracts and configures them. Below you'll find a simple example of such a script to help you get started.
-
-```typescript
-import { Deployer } from '@0xproject/deployer';
-import * as path from 'path';
-
-const deployerOpts = {
- artifactsDir: path.resolve('src', 'artifacts'),
- jsonrpcUrl: 'http://localhost:8545',
- networkId: 50,
- defaults: {
- gas: 1000000,
- },
-};
-
-const deployer = new Deployer(deployerOpts);
-
-(async () => {
- const etherToken = await deployer.deployAndSaveAsync('WETH9');
-})().catch(console.log);
-```
-
-**Tip:** Be sure to start an Ethereum node at the supplied `jsonrpcUrl`. We recommend testing with [Ganache-cli](https://github.com/trufflesuite/ganache-cli)
-
-A more sophisticated example can be found [here](https://github.com/0xProject/0x-monorepo/tree/development/packages/contracts/migrations)
diff --git a/packages/website/md/docs/ethereum_types/installation.md b/packages/website/md/docs/ethereum_types/installation.md
new file mode 100644
index 000000000..5371cfa47
--- /dev/null
+++ b/packages/website/md/docs/ethereum_types/installation.md
@@ -0,0 +1,11 @@
+**Install**
+
+```bash
+yarn add ethereum-types
+```
+
+**Import**
+
+```typescript
+import { Provider } from 'ethereum-types';
+```
diff --git a/packages/website/md/docs/ethereum_types/introduction.md b/packages/website/md/docs/ethereum_types/introduction.md
new file mode 100644
index 000000000..43484cdd1
--- /dev/null
+++ b/packages/website/md/docs/ethereum_types/introduction.md
@@ -0,0 +1 @@
+Welcome to the [ethereum-types](https://github.com/0xProject/0x-monorepo/packages/ethereum-types) documentation! This package provides ethereum specific (but not library-specific) types that are meant to be shared between other ethereum packages.
diff --git a/packages/website/md/docs/json_schemas/installation.md b/packages/website/md/docs/json_schemas/1.0.0/installation.md
index 50a37bae1..50a37bae1 100644
--- a/packages/website/md/docs/json_schemas/installation.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/installation.md
diff --git a/packages/website/md/docs/json_schemas/1.0.0/introduction.md b/packages/website/md/docs/json_schemas/1.0.0/introduction.md
new file mode 100644
index 000000000..cc777b1a8
--- /dev/null
+++ b/packages/website/md/docs/json_schemas/1.0.0/introduction.md
@@ -0,0 +1,5 @@
+<b>**NOTE:** Release candidate versions are meant to work with V2 of 0x protocol. To interact with V1, select a 0.X version.</b>
+
+Welcome to the [@0xproject/json-schemas](https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas) documentation! This package provides JSON schemas for validating 0x Protocol & Standard Relayer API data structures. It provides both the raw JSON schemas and a schema validator class to interact with them from a JS project.
+
+If you are not using a Javascript-based language for your project, you can copy-paste the JSON schemas within this package and use them together with a [JSON Schema](http://json-schema.org/) implementation in your [language of choice](http://json-schema.org/implementations.html) (e.g Python, Haskell, Go, C, C++, Rust, Ruby, Scala, etc...).
diff --git a/packages/website/md/docs/json_schemas/schemas.md b/packages/website/md/docs/json_schemas/1.0.0/schemas.md
index fcf5d8df6..fcf5d8df6 100644
--- a/packages/website/md/docs/json_schemas/schemas.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/schemas.md
diff --git a/packages/website/md/docs/json_schemas/usage.md b/packages/website/md/docs/json_schemas/1.0.0/usage.md
index 68b801153..68b801153 100644
--- a/packages/website/md/docs/json_schemas/usage.md
+++ b/packages/website/md/docs/json_schemas/1.0.0/usage.md
diff --git a/packages/website/md/docs/json_schemas/introduction.md b/packages/website/md/docs/json_schemas/introduction.md
deleted file mode 100644
index a27f4b521..000000000
--- a/packages/website/md/docs/json_schemas/introduction.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Welcome to the [@0xproject/json-schemas](https://github.com/0xProject/0x-monorepo/tree/development/packages/json-schemas) documentation! This package provides JSON schemas for validating 0x Protocol & Standard Relayer API data structures. It provides both the raw JSON schemas and a schema validator class to interact with them from a JS project.
-
-If you are not using a Javascript-based language for your project, you can copy-paste the JSON schemas within this package and use them together with a [JSON Schema](http://json-schema.org/) implementation in your [language of choice](http://json-schema.org/implementations.html) (e.g Python, Haskell, Go, C, C++, Rust, Ruby, Scala, etc...).
diff --git a/packages/website/md/docs/order_utils/1.0.0/installation.md b/packages/website/md/docs/order_utils/1.0.0/installation.md
new file mode 100644
index 000000000..68a7cf960
--- /dev/null
+++ b/packages/website/md/docs/order_utils/1.0.0/installation.md
@@ -0,0 +1,17 @@
+**Install**
+
+```bash
+yarn add @0xproject/order-utils
+```
+
+**Import**
+
+```javascript
+import { createSignedOrderAsync } from '@0xproject/order-utils';
+```
+
+or
+
+```javascript
+var createSignedOrderAsync = require('@0xproject/order-utils').createSignedOrderAsync;
+```
diff --git a/packages/website/md/docs/order_utils/1.0.0/introduction.md b/packages/website/md/docs/order_utils/1.0.0/introduction.md
new file mode 100644
index 000000000..d5f3f2925
--- /dev/null
+++ b/packages/website/md/docs/order_utils/1.0.0/introduction.md
@@ -0,0 +1 @@
+Welcome to the [@0xproject/order-utils](https://github.com/0xProject/0x-monorepo/tree/development/packages/order-utils) documentation! Order utils is a set of utils around creating, signing, validating 0x orders.
diff --git a/packages/website/md/docs/smart_contracts/introduction.md b/packages/website/md/docs/smart_contracts/1.0.0/introduction.md
index 566a573b6..566a573b6 100644
--- a/packages/website/md/docs/smart_contracts/introduction.md
+++ b/packages/website/md/docs/smart_contracts/1.0.0/introduction.md
diff --git a/packages/website/md/docs/sol-compiler/installation.md b/packages/website/md/docs/sol-compiler/installation.md
new file mode 100644
index 000000000..9c8561d9b
--- /dev/null
+++ b/packages/website/md/docs/sol-compiler/installation.md
@@ -0,0 +1,23 @@
+#### CLI Installation
+
+```bash
+yarn global add @0xproject/sol-compiler
+```
+
+#### API Installation
+
+```bash
+yarn add @0xproject/sol-compiler
+```
+
+**Import**
+
+```typescript
+import { Compiler } from '@0xproject/sol-compiler';
+```
+
+or
+
+```javascript
+var Compiler = require('@0xproject/sol-compiler').Compiler;
+```
diff --git a/packages/website/md/docs/sol-compiler/introduction.md b/packages/website/md/docs/sol-compiler/introduction.md
new file mode 100644
index 000000000..fcd80f47b
--- /dev/null
+++ b/packages/website/md/docs/sol-compiler/introduction.md
@@ -0,0 +1,8 @@
+Welcome to the [sol-compiler](https://github.com/0xProject/0x-monorepo/tree/development/packages/sol-compiler) documentation! Sol-compiler is a wrapper around [solc-js](https://www.npmjs.com/package/solc) that adds:
+
+* Smart re-compilation: Only recompiles when smart contracts have changed
+* Ability to compile an entire project instead of only individual `.sol` files
+* Compilation using the Solidity version specified at the top of each individual `.sol` file
+* Proper parsing of Solidity version ranges
+* Support for the standard [input description](https://solidity.readthedocs.io/en/develop/using-the-compiler.html#input-description) for what information you'd like added to the resulting `artifacts` file (i.e 100% configurable artifacts content).
+* Storage of constructor args, source maps and paths to all dependency source files.
diff --git a/packages/website/md/docs/sol-compiler/usage.md b/packages/website/md/docs/sol-compiler/usage.md
new file mode 100644
index 000000000..79c9b32ba
--- /dev/null
+++ b/packages/website/md/docs/sol-compiler/usage.md
@@ -0,0 +1,24 @@
+#### CLI Usage
+
+```bash
+$ sol-compiler
+Options:
+ --version Show version number [boolean]
+ --contracts-dir path of contracts directory to compile [string]
+ --artifacts-dir path to write contracts artifacts to [string]
+ --contracts comma separated list of contracts to compile
+ [string] [default: "*"]
+ --help Show help [boolean]
+```
+
+#### API Usage
+
+```typescript
+import { Compiler } from '@0xproject/sol-compiler';
+
+const compiler = new Compiler();
+
+(async () => {
+ await compiler.compileAllAsync();
+})().catch(console.log);
+```
diff --git a/packages/website/md/docs/sol_cov/usage.md b/packages/website/md/docs/sol_cov/usage.md
index ea1982d97..c747005fb 100644
--- a/packages/website/md/docs/sol_cov/usage.md
+++ b/packages/website/md/docs/sol_cov/usage.md
@@ -2,8 +2,43 @@ Sol-cov uses transaction traces in order to figure out which lines of Solidity s
The CoverageSubprovider eavesdrops on the `eth_sendTransaction` and `eth_call` RPC calls and collects traces after each call using `debug_traceTransaction`. `eth_call`'s' don't generate traces - so we take a snapshot, re-submit it as a transaction, get the trace and then revert the snapshot.
+Coverage subprovider needs some info about your contracts (`srcMap`, `bytecode`). It gets that info from your project's artifacts. Some frameworks have their own artifact format. Some artifact formats don't actually contain all the neccessary data.
+
+In order to use `CoverageSubprovider` with your favorite framework you need to pass an `artifactsAdapter` to it.
+
+### Sol-compiler
+
+If you are generating your artifacts with [@0xproject/sol-compiler](https://0xproject.com/docs/sol-compiler) you can use the `SolCompilerArtifactsAdapter` we've implemented for you.
+
+```typescript
+import { SolCompilerArtifactsAdapter } from '@0xproject/sol-cov';
+const artifactsPath = 'src/artifacts';
+const contractsPath = 'src/contracts';
+const artifactsAdapter = new SolCompilerArtifactsAdapter(artifactsPath, contractsPath);
+```
+
+### Truffle
+
+If your project is using [Truffle](https://truffleframework.com/), we've written a `TruffleArtifactsAdapter`for you.
+
+```typescript
+import { TruffleArtifactAdapter } from '@0xproject/sol-cov';
+const contractsPath = 'src/contracts';
+const artifactAdapter = new TruffleArtifactAdapter(contractsDir);
+```
+
+Because truffle artifacts don't have all the data we need - we actually will recompile your contracts under the hood. That's why you don't need to pass an `artifactsPath`.
+
+### Other framework/toolset
+
+You'll need to write your own artifacts adapter. It should extend `AbstractArtifactsAdapter`.
+Look at the code of the two adapters above for examples.
+
+### Usage
+
```typescript
import { CoverageSubprovider } from '@0xproject/sol-cov';
+import ProviderEngine = require('web3-provider-engine');
const provider = new ProviderEngine();
@@ -12,15 +47,16 @@ const contractsPath = 'src/contracts';
const networkId = 50;
// Some calls might not have `from` address specified. Nevertheless - transactions need to be submitted from an address with at least some funds. defaultFromAddress is the address that will be used to submit those calls as transactions from.
const defaultFromAddress = '0x5409ed021d9299bf6814279a6a1411a7e866a631';
-const coverageSubprovider = new CoverageSubprovider(artifactsPath, contractsPath, networkId, defaultFromAddress);
+const isVerbose = true;
+const coverageSubprovider = new CoverageSubprovider(artifactsAdapter, defaultFromAddress, isVerbose);
provider.addProvider(coverageSubprovider);
```
-After your test suite is complete (e.g global `after` hook), you'll need to call:
+After your test suite is complete (e.g in the Mocha global `after` hook), you'll need to call:
```typescript
await coverageSubprovider.writeCoverageAsync();
```
-This will create a `coverage.json` file in the `coverage` directory. This file has an [Istanbul format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md) - so you can use any of the existing Instanbul reporters.
+This will create a `coverage.json` file in a `coverage` directory. This file has an [Istanbul format](https://github.com/gotwarlost/istanbul/blob/master/coverage.json.md) - so you can use it with any of the existing Istanbul reporters.
diff --git a/packages/website/md/docs/web3_wrapper/introduction.md b/packages/website/md/docs/web3_wrapper/introduction.md
index ea2f4cf0d..17bd316f1 100644
--- a/packages/website/md/docs/web3_wrapper/introduction.md
+++ b/packages/website/md/docs/web3_wrapper/introduction.md
@@ -1 +1 @@
-Welcome to the [Web3Wrapper](https://github.com/0xProject/0x-monorepo/tree/development/packages/web3-wrapper) documentation! Web3Wrapper is a convenience library that wraps Web3 v0.x, providing promise-based endpoints and a consistent API.
+Welcome to the [Web3Wrapper](https://github.com/0xProject/0x-monorepo/tree/development/packages/web3-wrapper) documentation! Web3-wrapper is a JSON-RPC client for Ethereum nodes. It is a type-safe alternative to [Web3.js](https://github.com/ethereum/web3.js/) written in TypeScript.
diff --git a/packages/website/package.json b/packages/website/package.json
index f8f50c5e0..f4638229d 100644
--- a/packages/website/package.json
+++ b/packages/website/package.json
@@ -1,83 +1,82 @@
{
"name": "@0xproject/website",
- "version": "0.0.23",
+ "version": "0.0.44",
+ "engines": {
+ "node": ">=6.12"
+ },
"private": true,
"description": "Website and 0x portal dapp",
"scripts": {
- "build": "NODE_ENV=production webpack; exit 0;",
+ "build": "NODE_ENV=production node --max_old_space_size=8192 ../../node_modules/.bin/webpack; exit 0;",
"clean": "shx rm -f public/bundle*",
"lint": "tslint --project . 'ts/**/*.ts' 'ts/**/*.tsx'",
- "dev": "webpack-dev-server --content-base public --https",
- "update_contracts": "for i in ${npm_package_config_artifacts}; do copyfiles -u 4 ../contracts/build/contracts/$i.json ../website/contracts; done;",
+ "watch_without_deps": "webpack-dev-server --content-base public --https",
+ "deploy_dogfood": "npm run build; aws s3 sync ./public/. s3://dogfood.0xproject.com --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers",
"deploy_staging": "npm run build; aws s3 sync ./public/. s3://staging-0xproject --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers",
- "deploy_live": "npm run build; aws s3 sync ./public/. s3://0xproject.com --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers"
- },
- "config": {
- "artifacts": "Mintable"
+ "deploy_live": "DEPLOY_ROLLBAR_SOURCEMAPS=true npm run build; aws s3 sync ./public/. s3://0xproject.com --profile 0xproject --region us-east-1 --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --exclude *.map.js"
},
"author": "Fabio Berger",
"license": "Apache-2.0",
"dependencies": {
- "0x.js": "^0.34.0",
- "@0xproject/react-docs": "^0.0.5",
- "@0xproject/react-shared": "^0.1.0",
- "@0xproject/subproviders": "^0.8.3",
- "@0xproject/typescript-typings": "^0.0.2",
- "@0xproject/utils": "^0.4.4",
- "@0xproject/web3-wrapper": "^0.4.0",
+ "@0xproject/contract-wrappers": "^0.0.5",
+ "@0xproject/order-utils": "^0.0.9",
+ "@0xproject/react-docs": "^1.0.5",
+ "@0xproject/react-shared": "^0.2.3",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/types": "^0.8.1",
+ "@0xproject/typescript-typings": "^0.4.3",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
"accounting": "^0.4.1",
"basscss": "^8.0.3",
"blockies": "^0.0.2",
- "dateformat": "^2.0.0",
+ "bowser": "^1.9.3",
"deep-equal": "^1.0.1",
- "dharma-loan-frame": "^0.0.12",
- "ethereumjs-tx": "^1.3.3",
"ethereumjs-util": "^5.1.1",
"find-versions": "^2.0.0",
"jsonschema": "^1.2.0",
"less": "^2.7.2",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"material-ui": "^0.17.1",
"moment": "2.21.0",
- "query-string": "^5.0.1",
+ "numeral": "^2.0.6",
+ "polished": "^1.9.2",
+ "query-string": "^6.0.0",
"react": "15.6.1",
"react-copy-to-clipboard": "^4.2.3",
"react-document-title": "^2.0.3",
"react-dom": "15.6.1",
- "react-ga": "^2.4.1",
- "react-html5video": "^2.1.0",
- "react-inlinesvg": "^0.5.5",
- "react-markdown": "^3.2.2",
- "react-recaptcha": "^2.3.2",
+ "react-helmet": "^5.2.0",
+ "react-popper": "^1.0.0-beta.6",
"react-redux": "^5.0.3",
"react-router-dom": "^4.1.1",
- "react-router-hash-link": "^1.1.0",
"react-scroll": "^1.5.2",
"react-tap-event-plugin": "^2.0.1",
"react-tooltip": "^3.2.7",
- "react-waypoint": "^7.0.4",
"redux": "^3.6.0",
- "scroll-to-element": "^2.0.0",
+ "redux-devtools-extension": "^2.13.2",
"semver-sort": "0.0.4",
+ "styled-components": "^3.3.0",
"thenby": "^1.2.3",
"truffle-contract": "2.0.1",
- "web3": "^0.20.0",
- "web3-provider-engine": "^13.0.1",
- "whatwg-fetch": "^2.0.3",
- "xml-js": "^1.3.2"
+ "web3-provider-engine": "14.0.6",
+ "xml-js": "^1.6.4"
},
"devDependencies": {
"@types/accounting": "^0.4.1",
- "@types/dateformat": "^1.0.1",
+ "@types/blockies": "^0.0.0",
"@types/deep-equal": "^1.0.0",
+ "@types/find-versions": "^2.0.0",
"@types/jsonschema": "^1.1.1",
"@types/lodash": "4.14.104",
"@types/material-ui": "0.18.0",
"@types/node": "^8.0.53",
- "@types/query-string": "^5.0.1",
- "@types/react": "^16.0.34",
+ "@types/numeral": "^0.0.22",
+ "@types/query-string": "^5.1.0",
+ "@types/react": "16.3.13",
"@types/react-copy-to-clipboard": "^4.2.0",
"@types/react-dom": "^16.0.3",
+ "@types/react-helmet": "^5.0.6",
"@types/react-redux": "^4.4.37",
"@types/react-router-dom": "^4.0.4",
"@types/react-scroll": "0.0.31",
@@ -91,13 +90,16 @@
"imports-loader": "0.6.x",
"json-loader": "^0.5.4",
"less-loader": "^2.2.3",
+ "make-promises-safe": "^1.1.0",
"raw-loader": "^0.5.1",
+ "rollbar-sourcemap-webpack-plugin": "^2.3.0",
"shx": "^0.2.2",
"source-map-loader": "^0.1.6",
"style-loader": "0.13.x",
- "tslint": "5.8.0",
+ "tslint": "5.11.0",
"tslint-config-0xproject": "^0.0.2",
- "typescript": "2.7.1",
+ "typescript": "2.9.2",
+ "uglifyjs-webpack-plugin": "^1.2.5",
"webpack": "^3.1.0",
"webpack-dev-middleware": "^1.10.0",
"webpack-dev-server": "^2.5.0"
diff --git a/packages/website/public/images/eth_dollar.svg b/packages/website/public/images/eth_dollar.svg
new file mode 100644
index 000000000..0afec94fa
--- /dev/null
+++ b/packages/website/public/images/eth_dollar.svg
@@ -0,0 +1,29 @@
+<svg width="76" height="46" viewBox="0 0 76 46" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d)">
+<path d="M-2.34315e-08 10.7545L18.9187 -1.15499e-08L65.2081 26.3534L46.2894 37.1079L-2.34315e-08 10.7545Z" transform="translate(5.62109 1.17188)" fill="#DCD3EB"/>
+<path d="M20.5403 1.84086L65.2081 27.2738L47.911 37.1079L3.24321 11.6749L20.5403 1.84086ZM20.5403 0L0 11.6749L47.911 38.9487L68.4513 27.2738L20.5403 0Z" transform="translate(4 0.25)" fill="#AAA7C9"/>
+<path d="M9.92618 13.54C7.05152 13.54 4.44712 12.9587 2.62896 11.9171C0.90908 10.9483 3.74905e-07 9.66451 3.74905e-07 8.2112C3.74905e-07 6.27346 1.6216 4.23882 4.44712 2.64018C7.39549 0.944652 11.2775 3.69596e-07 15.0613 3.69596e-07C17.9359 3.69596e-07 20.5403 0.581324 22.3585 1.62286C24.0784 2.59174 24.9874 3.87549 24.9874 5.3288C24.9874 7.26655 23.3658 9.30118 20.5403 10.8998C17.5919 12.5711 13.7099 13.54 9.92618 13.54Z" transform="translate(26.3359 13.3047)" fill="#CAC3E5"/>
+<path d="M15.8578 1.59864C18.585 1.59864 21.042 2.13152 22.7619 3.1004C23.7692 3.68172 24.9731 4.67482 24.9731 6.1039C24.9731 7.72677 23.4744 9.5434 20.9437 10.9967C18.0936 12.6196 14.3836 13.54 10.7473 13.54C8.02001 13.54 5.56304 13.0071 3.84316 12.0383C2.8358 11.4569 1.63188 10.4638 1.63188 9.03475C1.63188 7.41188 3.13063 5.59524 5.66132 4.14193C8.48684 2.51907 12.1969 1.59864 15.8578 1.59864ZM15.8578 -3.69596e-07C12.0986 -3.69596e-07 8.04458 0.944652 4.85051 2.76129C-0.825098 5.98279 -1.6359 10.7545 3.03235 13.4189C5.07164 14.5815 7.82345 15.1386 10.7473 15.1386C14.5064 15.1386 18.5604 14.194 21.7545 12.3774C27.4301 9.15585 28.2409 4.38415 23.5727 1.71975C21.5088 0.557102 18.757 -3.69596e-07 15.8578 -3.69596e-07Z" transform="translate(25.5391 12.5078)" fill="#AAA7C9"/>
+<path d="M1.81816 5.69213L8.89425 6.73367L11.8426 0L-7.49809e-07 1.64709L1.81816 5.69213Z" transform="translate(34.3945 15.875)" fill="#AAA7C9"/>
+<path d="M3.74905e-07 6.07968L10.7124 5.03814L3.63632 4.02083L1.81816 3.69596e-07L3.74905e-07 6.07968Z" transform="translate(31.7422 18.0312)" fill="#AAA7C9"/>
+<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638813 3.14884C0.343976 2.97929 -4.68631e-08 2.68862 -4.68631e-08 2.3253C-4.68631e-08 1.86508 0.491395 1.28376 1.27763 0.847764C2.23585 0.314884 3.46433 0 4.69282 0C5.6019 0 6.4127 0.169553 6.97781 0.484437C7.27265 0.65399 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(7.85938 9.69531)" fill="#DCD3EB"/>
+<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58406 2.1073 7.60863 2.15574C7.55949 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66275 3.17306 1.63818 3.12462C1.68732 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.8893 4.43913 1.59864 5.5202 1.59864ZM5.5202 0C4.218 0 2.79295 0.314884 1.68732 0.968874C-0.278265 2.08308 -0.573102 3.75438 1.0485 4.67482C1.76102 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.217997 6.52756 0 5.5202 0Z" transform="translate(7.05469 8.85156)" fill="#AAA7C9"/>
+<path d="M2.9238 3.63327C2.01472 3.63327 1.20392 3.46372 0.638815 3.14884C0.343978 2.97928 0 2.68862 0 2.3253C0 1.86508 0.491394 1.28376 1.27763 0.847763C2.23585 0.314882 3.46434 -1.47838e-06 4.69282 -1.47838e-06C5.6019 -1.47838e-06 6.4127 0.169551 6.97781 0.484435C7.27264 0.653988 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40535 3.31839 4.15229 3.63327 2.9238 3.63327Z" transform="translate(49.332 33.2891)" fill="#CAC3E5"/>
+<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58405 2.1073 7.60862 2.15574C7.55948 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73646 3.22151 1.66274 3.17306 1.63817 3.12462C1.68731 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.86508 4.43913 1.59864 5.5202 1.59864ZM5.5202 0C4.218 0 2.79296 0.314884 1.68732 0.968874C-0.278264 2.08308 -0.573102 3.75439 1.0485 4.67482C1.76102 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.193775 6.52756 0 5.5202 0Z" transform="translate(48.5273 32.4648)" fill="#AAA7C9"/>
+<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638813 3.14884C0.343976 2.97929 1.49962e-06 2.68862 1.49962e-06 2.3253C1.49962e-06 1.86508 0.491396 1.28376 1.27763 0.847764C2.23585 0.314884 3.46433 -3.69596e-07 4.69282 -3.69596e-07C5.6019 -3.69596e-07 6.4127 0.169553 6.97781 0.484436C7.27265 0.653989 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.33899 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(61.3945 26.4336)" fill="#DCD3EB"/>
+<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51034 2.05886 7.58405 2.1073 7.60862 2.15574C7.55948 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66275 3.17306 1.63818 3.12462C1.68732 3.00351 1.90844 2.68863 2.49812 2.34952C3.30892 1.8893 4.43913 1.59864 5.5202 1.59864ZM5.5202 -3.69596e-07C4.218 -3.69596e-07 2.79295 0.314884 1.68731 0.968873C-0.278266 2.08308 -0.5731 3.75439 1.0485 4.67482C1.76103 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.81991 1.52598 8.1983 0.605546C7.48578 0.217996 6.52756 -3.69596e-07 5.5202 -3.69596e-07Z" transform="translate(60.5938 25.5859)" fill="#AAA7C9"/>
+<path d="M2.9238 3.63328C2.01472 3.63328 1.20392 3.46372 0.638814 3.14884C0.343977 2.97929 7.49809e-07 2.68862 7.49809e-07 2.3253C7.49809e-07 1.86508 0.491395 1.28376 1.27763 0.847764C2.23585 0.314884 3.46434 9.2399e-08 4.69282 9.2399e-08C5.6019 9.2399e-08 6.4127 0.169553 6.97781 0.484437C7.27264 0.65399 7.61662 0.944652 7.61662 1.30798C7.61662 1.76819 7.12523 2.34952 6.339 2.78551C5.40534 3.31839 4.15229 3.63328 2.9238 3.63328Z" transform="translate(19.9219 2.82031)" fill="#CAC3E5"/>
+<path d="M5.5202 1.59864C6.28186 1.59864 6.96981 1.74397 7.3875 1.98619C7.51035 2.05886 7.58406 2.1073 7.60863 2.15574C7.55949 2.27685 7.33836 2.59174 6.74868 2.93084C5.93788 3.39106 4.80767 3.68172 3.7266 3.68172C2.96494 3.68172 2.27699 3.53639 1.8593 3.29417C1.73645 3.2215 1.66274 3.17306 1.63817 3.12462C1.68731 3.00351 1.90844 2.68862 2.49812 2.34952C3.30892 1.86508 4.43913 1.59864 5.5202 1.59864ZM5.5202 -4.61995e-08C4.218 -4.61995e-08 2.79295 0.314884 1.68732 0.968874C-0.278265 2.08308 -0.573101 3.75439 1.0485 4.67482C1.76103 5.08659 2.71924 5.28036 3.7266 5.28036C5.0288 5.28036 6.45385 4.96548 7.55949 4.31149C9.52507 3.19728 9.8199 1.52598 8.1983 0.605546C7.48578 0.193775 6.52756 -4.61995e-08 5.5202 -4.61995e-08Z" transform="translate(19.1172 1.99219)" fill="#AAA7C9"/>
+</g>
+<defs>
+<filter id="filter0_d" x="0.799705" y="0.25" width="74.8519" height="45.3493" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="3.20029"/>
+<feGaussianBlur stdDeviation="1.60015"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/packages/website/public/images/eth_token.svg b/packages/website/public/images/eth_token.svg
new file mode 100644
index 000000000..9392692f9
--- /dev/null
+++ b/packages/website/public/images/eth_token.svg
@@ -0,0 +1,20 @@
+<svg width="54" height="36" viewBox="0 0 54 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M45.9288 8.37974H44.6437C43.5923 6.66375 41.7231 5.06216 39.2698 3.68937C30.2743 -1.22979 15.788 -1.22979 6.79252 3.68937C4.3392 5.06216 2.47001 6.66375 1.41859 8.37974H0.0166892V12.2693C-0.21696 15.5869 2.00271 19.0189 6.67569 21.5356C15.6712 26.4548 30.1575 26.4548 39.153 21.5356C43.8259 19.0189 46.0456 15.5869 45.812 12.2693V8.37974H45.9288Z" transform="translate(4.07422 6.77344)" fill="#AAA7C9"/>
+<path d="M39.2239 21.4212C30.2284 26.3404 15.7421 26.3404 6.74662 21.4212C-2.24888 16.5021 -2.24888 8.60854 6.74662 3.68937C15.7421 -1.22979 30.2284 -1.22979 39.2239 3.68937C48.2194 8.60854 48.2194 16.6165 39.2239 21.4212Z" transform="translate(4 3)" fill="#CAC3E6"/>
+<path d="M19.7434 21.2782C30.6473 21.2782 39.4867 16.5149 39.4867 10.6391C39.4867 4.7633 30.6473 0 19.7434 0C8.83941 0 0 4.7633 0 10.6391C0 16.5149 8.83941 21.2782 19.7434 21.2782Z" transform="translate(7.35938 4.51562)" fill="#DCD3EB"/>
+<path d="M2.45332 7.89354L12.6171 9.49513L16.8228 -2.18199e-07L-4.45651e-07 2.17358L2.45332 7.89354Z" transform="translate(20.3242 9.55078)" fill="#AAA7C9"/>
+<path d="M0 8.69434L15.304 7.43595L5.25711 5.71996L2.68697 4.36398e-07L0 8.69434Z" transform="translate(16.3516 12.2969)" fill="#AAA7C9"/>
+</g>
+<defs>
+<filter id="filter0_d" x="0.799705" y="0.599779" width="52.4036" height="35.399" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="0.800074"/>
+<feGaussianBlur stdDeviation="1.60015"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/packages/website/public/images/eth_token_erc20.svg b/packages/website/public/images/eth_token_erc20.svg
new file mode 100644
index 000000000..6313c826d
--- /dev/null
+++ b/packages/website/public/images/eth_token_erc20.svg
@@ -0,0 +1,22 @@
+<svg width="66" height="38" viewBox="0 0 66 38" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="36.2389" height="14.3077" rx="2.40022" transform="translate(26.7617 0.457031)" fill="#3289F1"/>
+<path d="M3.01758 9.09766C2.20703 9.09766 1.55111 8.85677 1.0498 8.375C0.548503 7.88997 0.297852 7.26009 0.297852 6.48535V6.34863C0.297852 5.80827 0.397135 5.33138 0.595703 4.91797C0.797526 4.50456 1.09049 4.18555 1.47461 3.96094C1.85872 3.73307 2.31445 3.61914 2.8418 3.61914C3.58398 3.61914 4.16992 3.85026 4.59961 4.3125C5.0293 4.77148 5.24414 5.41276 5.24414 6.23633V6.87598H1.97266C2.03125 7.1722 2.15983 7.40495 2.3584 7.57422C2.55697 7.74349 2.81413 7.82812 3.12988 7.82812C3.65072 7.82812 4.05762 7.64583 4.35059 7.28125L5.10254 8.16992C4.89746 8.45312 4.60612 8.67936 4.22852 8.84863C3.85417 9.01465 3.45052 9.09766 3.01758 9.09766ZM2.83203 4.88867C2.35026 4.88867 2.0638 5.20768 1.97266 5.8457H3.63281V5.71875C3.63932 5.45508 3.57259 5.25163 3.43262 5.1084C3.29264 4.96191 3.09245 4.88867 2.83203 4.88867ZM9.31514 5.20605L8.77315 5.16699C8.25557 5.16699 7.92354 5.32975 7.77706 5.65527V9H6.13155V3.7168H7.67452L7.72823 4.39551C8.00492 3.87793 8.39066 3.61914 8.88545 3.61914C9.06123 3.61914 9.21423 3.63867 9.34444 3.67773L9.31514 5.20605ZM12.2533 7.82812C12.4844 7.82812 12.6635 7.76628 12.7904 7.64258C12.9174 7.51562 12.9792 7.33984 12.976 7.11523H14.519C14.519 7.69466 14.3106 8.16992 13.894 8.54102C13.4805 8.91211 12.9467 9.09766 12.2924 9.09766C11.5242 9.09766 10.9187 8.85677 10.476 8.375C10.0333 7.89323 9.81192 7.22591 9.81192 6.37305V6.30469C9.81192 5.77083 9.90958 5.30046 10.1049 4.89355C10.3035 4.4834 10.5883 4.16927 10.9594 3.95117C11.3305 3.72982 11.7699 3.61914 12.2777 3.61914C12.9646 3.61914 13.5098 3.80957 13.9135 4.19043C14.3171 4.57129 14.519 5.08724 14.519 5.73828H12.976C12.976 5.46484 12.9093 5.25488 12.7758 5.1084C12.6423 4.96191 12.4633 4.88867 12.2387 4.88867C11.8122 4.88867 11.5632 5.16048 11.4916 5.7041C11.4688 5.87663 11.4574 6.11426 11.4574 6.41699C11.4574 6.94759 11.5209 7.31543 11.6479 7.52051C11.7748 7.72559 11.9766 7.82812 12.2533 7.82812ZM20.3575 9H15.3966V7.92578L17.6818 5.52344C18.2449 4.88216 18.5265 4.37272 18.5265 3.99512C18.5265 3.68913 18.4597 3.45638 18.3263 3.29688C18.1928 3.13737 17.9991 3.05762 17.7452 3.05762C17.4946 3.05762 17.2911 3.16504 17.1349 3.37988C16.9786 3.59147 16.9005 3.85677 16.9005 4.17578H15.2501C15.2501 3.73958 15.3592 3.33757 15.5773 2.96973C15.7954 2.59863 16.0981 2.30892 16.4855 2.10059C16.8728 1.89225 17.3058 1.78809 17.7843 1.78809C18.5525 1.78809 19.1433 1.96549 19.5568 2.32031C19.9734 2.67513 20.1818 3.18457 20.1818 3.84863C20.1818 4.12858 20.1297 4.40202 20.0255 4.66895C19.9213 4.93262 19.7586 5.21094 19.5372 5.50391C19.3191 5.79362 18.9659 6.18262 18.4776 6.6709L17.5597 7.73047H20.3575V9ZM26.3328 6.09473C26.3328 7.05501 26.1164 7.79557 25.6834 8.31641C25.2537 8.83724 24.6466 9.09766 23.8621 9.09766C23.0711 9.09766 22.4591 8.83561 22.0262 8.31152C21.5932 7.78743 21.3768 7.0485 21.3768 6.09473V4.7959C21.3768 3.83561 21.5916 3.09505 22.0213 2.57422C22.4542 2.05339 23.0646 1.79297 23.8524 1.79297C24.6401 1.79297 25.2505 2.05501 25.6834 2.5791C26.1164 3.10319 26.3328 3.84375 26.3328 4.80078V6.09473ZM24.6873 4.58594C24.6873 4.07487 24.6206 3.69401 24.4871 3.44336C24.3537 3.18945 24.1421 3.0625 23.8524 3.0625C23.5692 3.0625 23.3625 3.17969 23.2322 3.41406C23.1053 3.64844 23.0369 4.00326 23.0272 4.47852V6.29492C23.0272 6.82552 23.0939 7.21452 23.2274 7.46191C23.3608 7.70605 23.5724 7.82812 23.8621 7.82812C24.1421 7.82812 24.3488 7.70931 24.4822 7.47168C24.6157 7.23079 24.6841 6.85482 24.6873 6.34375V4.58594Z" transform="translate(32 2.19922)" fill="white"/>
+<g filter="url(#filter0_d)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M36.9872 6.66078H35.9523C35.1056 5.2968 33.6003 4.02375 31.6246 2.93256C24.3804 -0.977521 12.7144 -0.977521 5.47013 2.93256C3.49443 4.02375 1.98914 5.2968 1.14241 6.66078H0.0134401V9.75247C-0.174722 12.3895 1.61281 15.1175 5.37605 17.118C12.6203 21.0281 24.2863 21.0281 31.5305 17.118C35.2938 15.1175 37.0813 12.3895 36.8931 9.75247V6.66078H36.9872Z" transform="translate(3.46484 12.9961)" fill="#AAA7C9"/>
+<path d="M31.5877 17.027C24.3434 20.9371 12.6774 20.9371 5.43317 17.027C-1.81106 13.117 -1.81106 6.84264 5.43317 2.93256C12.6774 -0.977521 24.3434 -0.977521 31.5877 2.93256C38.8319 6.84264 38.8319 13.2079 31.5877 17.027Z" transform="translate(3.40625 9.99609)" fill="#CAC3E6"/>
+<path d="M15.8997 16.9134C24.6808 16.9134 31.7993 13.1272 31.7993 8.45669C31.7993 3.78619 24.6808 0 15.8997 0C7.11853 0 0 3.78619 0 8.45669C0 13.1272 7.11853 16.9134 15.8997 16.9134Z" transform="translate(6.11328 11.1992)" fill="#DCD3EB"/>
+<path d="M1.9757 6.27432L10.1607 7.54737L13.5476 -1.73439e-07L-3.5889e-07 1.72771L1.9757 6.27432Z" transform="translate(16.5547 15.2031)" fill="#AAA7C9"/>
+<path d="M0 6.91084L12.3246 5.91059L4.23364 4.54661L2.16386 3.46879e-07L0 6.91084Z" transform="translate(13.3555 17.3867)" fill="#AAA7C9"/>
+</g>
+<defs>
+<filter id="filter0_d" x="0.205955" y="7.59587" width="43.4464" height="29.4511" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="0.800074"/>
+<feGaussianBlur stdDeviation="1.60015"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/packages/website/public/images/ether_alt.svg b/packages/website/public/images/ether_alt.svg
new file mode 100644
index 000000000..82199d14d
--- /dev/null
+++ b/packages/website/public/images/ether_alt.svg
@@ -0,0 +1,7 @@
+<svg width="29" height="47" viewBox="0 0 29 47" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.4883 6.11532e-07L0 6.49253L14.4883 14.9288L28.9665 6.49253L14.4883 6.11532e-07Z" transform="translate(0 17.1875)" fill="#267DFF"/>
+<path d="M0 23.6857L14.4883 32.122V0L0 23.6857Z" fill="#267DFF"/>
+<path d="M0 0V32.112L14.4782 23.6757L0 0Z" transform="translate(14.5039)" fill="#267DFF"/>
+<path d="M0 -1.22306e-06L14.4883 20.1088V8.43629L0 -1.22306e-06Z" transform="translate(0 26.8906)" fill="#267DFF"/>
+<path d="M0 8.43629V20.1088L14.4883 -1.22306e-06L0 8.43629Z" transform="translate(14.5117 26.8594)" fill="#267DFF"/>
+</svg>
diff --git a/packages/website/public/images/fake_toggle.svg b/packages/website/public/images/fake_toggle.svg
new file mode 100644
index 000000000..c9632d0da
--- /dev/null
+++ b/packages/website/public/images/fake_toggle.svg
@@ -0,0 +1,4 @@
+<svg width="36" height="23" viewBox="0 0 36 23" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 11.4379C0 5.12093 5.12093 0 11.4379 0H23.8494C30.1664 0 35.2873 5.12093 35.2873 11.4379V11.4379C35.2873 17.7549 30.1664 22.8758 23.8494 22.8758H11.4379C5.12092 22.8758 0 17.7549 0 11.4379V11.4379Z" fill="#E0E0E0"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M6.85185 13.8889C10.636 13.8889 13.7037 10.7798 13.7037 6.94444C13.7037 3.10913 10.636 0 6.85185 0C3.06768 0 0 3.10913 0 6.94444C0 10.7798 3.06768 13.8889 6.85185 13.8889Z" transform="translate(3.49609 4.53125)" fill="white"/>
+</svg>
diff --git a/packages/website/public/images/jobs/calendar-icon.svg b/packages/website/public/images/jobs/calendar-icon.svg
new file mode 100644
index 000000000..2ce87388f
--- /dev/null
+++ b/packages/website/public/images/jobs/calendar-icon.svg
@@ -0,0 +1,15 @@
+<svg width="36" height="34" viewBox="0 0 36 34" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M14.5337 0.542553H13.1244V0H12.1554V0.542553H4.66839V0H3.78756V0.542553H2.37824C1.05699 0.542553 0 1.62766 0 2.98404V14.5585C0 15.9149 1.05699 17 2.37824 17H14.6218C15.943 17 17 15.9149 17 14.5585V5.33511V4.43085V2.98404C16.9119 1.62766 15.8549 0.542553 14.5337 0.542553Z" transform="translate(0.410645) scale(2)" fill="black"/>
+<path d="M0.61658 2.53191H1.84974C2.20207 2.53191 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53191 0.61658 2.53191Z" transform="translate(4.63916 24.5938) scale(2)" fill="white"/>
+<path d="M0.61658 2.53191H1.84974C2.20207 2.53191 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53191 0.61658 2.53191Z" transform="translate(11.5103 24.5938) scale(2)" fill="white"/>
+<path d="M0.61658 2.53191H1.84974C2.20207 2.53191 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53191 0.61658 2.53191Z" transform="translate(18.5571 24.5938) scale(2)" fill="white"/>
+<path d="M0.61658 2.53191H1.84974C2.20207 2.53191 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53191 0.61658 2.53191Z" transform="translate(25.6035 24.5938) scale(2)" fill="white"/>
+<path d="M0.61658 2.53192H1.84974C2.20207 2.53192 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53192 0.61658 2.53192Z" transform="translate(4.63916 17.1797) scale(2)" fill="white"/>
+<path d="M0.61658 2.53192H1.84974C2.20207 2.53192 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53192 0.61658 2.53192Z" transform="translate(11.5103 17.1797) scale(2)" fill="white"/>
+<path d="M0.61658 2.53192H1.84974C2.20207 2.53192 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53192 0.61658 2.53192Z" transform="translate(18.5571 17.1797) scale(2)" fill="white"/>
+<path d="M0.61658 2.53192H1.84974C2.20207 2.53192 2.46632 2.26064 2.46632 1.89894V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.26064 0.264249 2.53192 0.61658 2.53192Z" transform="translate(25.6035 17.1797) scale(2)" fill="white"/>
+<path d="M0.61658 2.44149H1.84974C2.20207 2.44149 2.46632 2.17021 2.46632 1.80851V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.17021 0.264249 2.44149 0.61658 2.44149Z" transform="translate(4.63916 9.76562) scale(2)" fill="white"/>
+<path d="M0.61658 2.44149H1.84974C2.20207 2.44149 2.46632 2.17021 2.46632 1.80851V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.17021 0.264249 2.44149 0.61658 2.44149Z" transform="translate(11.5103 9.76562) scale(2)" fill="white"/>
+<path d="M0.61658 2.44149H1.84974C2.20207 2.44149 2.46632 2.17021 2.46632 1.80851V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.17021 0.264249 2.44149 0.61658 2.44149Z" transform="translate(18.5571 9.76562) scale(2)" fill="white"/>
+<path d="M0.61658 2.44149H1.84974C2.20207 2.44149 2.46632 2.17021 2.46632 1.80851V0.632979C2.46632 0.271276 2.20207 0 1.84974 0H0.61658C0.264249 0 0 0.271276 0 0.632979V1.89894C0 2.17021 0.264249 2.44149 0.61658 2.44149Z" transform="translate(25.6035 9.76562) scale(2)" fill="white"/>
+</svg>
diff --git a/packages/website/public/images/jobs/heart-icon.svg b/packages/website/public/images/jobs/heart-icon.svg
new file mode 100644
index 000000000..b83067af6
--- /dev/null
+++ b/packages/website/public/images/jobs/heart-icon.svg
@@ -0,0 +1,3 @@
+<svg width="42" height="36" viewBox="0 0 42 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M19.9861 5.40966C19.9861 6.40787 19.7347 7.34168 19.2634 8.14669C19.1691 8.30769 19.0434 8.46869 18.9491 8.6297L17.9435 9.66011L10.0245 18L1.66551 9.3703C1.66551 9.3703 1.66551 9.3703 1.63409 9.3381L1.44554 9.1449C1.16271 8.8551 0.942742 8.50089 0.722769 8.14669C0.251398 7.37388 0 6.40787 0 5.40966C0 2.41503 2.35685 0 5.24793 0C7.32196 0 9.11317 1.25581 9.99306 3.05903C10.8415 1.25581 12.6327 0 14.7068 0C17.6293 0 19.9861 2.41503 19.9861 5.40966Z" transform="translate(0.0483398) scale(2)" fill="#FF573F"/>
+</svg>
diff --git a/packages/website/public/images/jobs/hero-dots-left.svg b/packages/website/public/images/jobs/hero-dots-left.svg
new file mode 100644
index 000000000..35f3239a0
--- /dev/null
+++ b/packages/website/public/images/jobs/hero-dots-left.svg
@@ -0,0 +1,17 @@
+<svg width="730" height="566" viewBox="0 0 730 566" fill="none" xmlns="http://www.w3.org/2000/svg">
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(569.231 541.863) scale(2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(620.402 302.363) scale(2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(425.944 249.332) scale(2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(707.397 74.8438) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(444.712 430.668) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(180.317 546.992) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(620.402 165.508) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(265.602 182.617) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(705.691 444.352) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(269.014 386.188) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(1.95703 458) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(1.95703) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(77.9043 262) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(465.178 86.8164) scale(2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(159.847 86.8164) scale(2)" fill="black"/>
+</svg>
diff --git a/packages/website/public/images/jobs/hero-dots-right.svg b/packages/website/public/images/jobs/hero-dots-right.svg
new file mode 100644
index 000000000..93686f128
--- /dev/null
+++ b/packages/website/public/images/jobs/hero-dots-right.svg
@@ -0,0 +1,16 @@
+<svg width="680" height="506" viewBox="0 0 680 506" fill="none" xmlns="http://www.w3.org/2000/svg">
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(117.916 483.762) scale(-2 2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(66.7402 196.73) scale(-2 2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(244.141 280.555) scale(-2 2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(494.888 148.828) scale(-2 2)" fill="black"/>
+<ellipse cx="5.54373" cy="5.55975" rx="5.54373" ry="5.55975" transform="translate(221.969 22.2383) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(293.61 409.672) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(508.535 482.051) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(15.5688 25.6602) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(522.182) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(15.5688 372.93) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(435.188 314.766) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(653.747 352) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(679.729 76) scale(-2 2)" fill="black"/>
+<ellipse cx="3.41153" cy="3.42138" rx="3.41153" ry="3.42138" transform="translate(305.551 138.566) scale(-2 2)" fill="black"/>
+</svg>
diff --git a/packages/website/public/images/jobs/ship-icon.svg b/packages/website/public/images/jobs/ship-icon.svg
new file mode 100644
index 000000000..4e507b9c0
--- /dev/null
+++ b/packages/website/public/images/jobs/ship-icon.svg
@@ -0,0 +1,6 @@
+<svg width="42" height="28" viewBox="0 0 42 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M13.4071 11.6878H1.76832C0.771632 11.6878 0 10.9065 0 9.96896V1.71879C0 0.781267 0.803783 0 1.76832 0H13.3749C14.3716 0 15.1433 0.781267 15.1433 1.71879L16.1078 9.93771C16.14 10.9065 14.3716 11.6878 13.4071 11.6878Z" transform="translate(0.410645) scale(2)" fill="#04060C"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M8.32719 7.1564H0.96454C0.417967 7.1564 0 6.75015 0 6.21888V0.93752C0 0.406259 0.417967 0 0.96454 0H8.29504C8.84161 0 9.25958 0.406259 9.25958 0.93752V6.18763C9.29173 6.71889 8.84161 7.1564 8.32719 7.1564Z" transform="translate(21.8877 9.06641) scale(2)" fill="#04060C"/>
+<path d="M2.3792 4.6251C3.69319 4.6251 4.7584 3.58974 4.7584 2.31255C4.7584 1.03536 3.69319 0 2.3792 0C1.0652 0 0 1.03536 0 2.31255C0 3.58974 1.0652 4.6251 2.3792 4.6251Z" transform="translate(4.20508 18.75) scale(2)" fill="#04060C"/>
+<path d="M2.3792 4.6251C3.69319 4.6251 4.7584 3.58974 4.7584 2.31255C4.7584 1.03536 3.69319 0 2.3792 0C1.0652 0 0 1.03536 0 2.31255C0 3.58974 1.0652 4.6251 2.3792 4.6251Z" transform="translate(26.3887 18.75) scale(2)" fill="#04060C"/>
+</svg>
diff --git a/packages/website/public/images/jobs/world-map.svg b/packages/website/public/images/jobs/world-map.svg
new file mode 100644
index 000000000..7b201dcd2
--- /dev/null
+++ b/packages/website/public/images/jobs/world-map.svg
@@ -0,0 +1,64 @@
+<svg width="1046" height="594" viewBox="0 0 1046 594" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_d)">
+<path d="M220.481 72.6818C220.411 73.1706 220.692 73.3102 221.112 73.3102C220.692 74.148 219.92 73.1705 219.57 72.7517C219.64 72.6818 219.64 72.612 219.71 72.4724C219.85 72.5422 219.92 72.6818 220.061 72.7517C220.061 72.612 220.061 72.4724 220.061 72.4026C220.411 72.3328 220.411 72.4724 220.481 72.6818ZM97.4774 35.4009C97.3372 35.5405 97.0566 35.5405 96.9164 35.75C96.4255 34.5631 96.145 34.8424 94.9528 34.7725C95.584 34.3537 96.145 33.9348 96.7761 33.5857C96.5658 33.5159 96.4255 33.2366 96.2151 33.1668C96.4956 32.9574 96.7761 32.8177 97.1268 32.6083C96.4255 32.2592 96.145 31.98 95.4437 32.1894C94.6723 32.4687 94.3918 32.6781 93.6905 32.2592C92.9893 31.9102 92.6386 32.1894 91.8672 32.1894C91.5166 32.1894 91.0958 32.9574 90.8153 33.2366C91.0958 33.3763 92.4983 33.7253 92.4983 34.0744C92.4983 34.7725 92.4984 35.6801 91.5166 35.4707C91.0958 35.4009 90.5348 34.3537 90.0439 34.4933C89.553 34.6329 88.8517 35.1216 89.4127 35.6103C90.5348 36.5179 91.8672 36.7972 92.849 37.984C93.2698 38.5425 93.6204 39.2407 94.2515 39.3803C94.8126 39.5199 95.6541 39.0312 95.4437 38.4029C96.3554 38.8218 98.8098 37.1462 97.1969 36.5877C97.4073 36.5179 97.6878 36.3783 97.8982 36.3085C97.7579 36.0292 97.6177 35.6801 97.4774 35.4009ZM218.798 72.612C218.868 72.8215 218.588 73.2404 219.009 73.5894C219.009 73.1706 218.938 72.8215 219.219 72.4724C219.079 72.4026 218.798 72.4026 218.658 72.4026C218.588 72.612 218.728 72.5422 218.798 72.612ZM124.056 49.5034C124.547 49.9223 125.879 50.6903 126.37 49.8525C126.861 49.0147 126.51 48.5958 126.791 47.7581C125.669 46.292 122.793 48.4562 124.056 49.5034ZM132.05 39.5898C131.7 38.3331 130.087 38.5425 129.245 38.8218C128.754 39.0312 127.492 37.0066 126.931 36.5179C126.3 35.9594 124.897 35.3311 124.126 35.4009C123.705 35.4707 122.793 35.4009 122.513 35.6801C122.303 35.8896 121.601 36.7972 121.321 36.6575C120.409 36.099 120.479 36.099 119.778 36.7972C119.357 37.2161 118.796 37.2161 119.147 36.5179C119.568 35.6801 119.708 35.6801 119.287 34.8424C119.007 34.214 118.796 34.2838 118.446 33.865C118.095 33.4461 118.235 32.6781 117.674 32.6083C117.253 32.6083 116.552 32.3989 116.131 32.5385C115.079 32.9574 114.098 33.4461 113.046 33.5857C113.116 33.1668 113.256 32.8177 113.326 32.3989C111.713 32.1894 111.012 32.1894 109.469 32.8876C108.347 33.3763 107.646 34.0744 107.155 35.4009C106.945 35.8896 106.313 36.9368 106.384 37.4255C106.454 37.6349 106.594 39.2407 106.734 39.2407C108.207 39.3803 109.189 39.2407 110.241 40.3577C109.189 40.2879 108.137 40.1483 107.015 40.0785C107.436 40.9162 108.277 41.5446 109.048 41.9634C109.68 42.3125 109.96 41.8238 110.451 41.8238C111.573 41.754 110.732 42.0333 111.363 42.5918C111.643 42.8012 112.555 43.0107 112.905 43.0107C113.957 43.0805 115.29 42.8012 116.272 43.2201C116.622 43.3597 116.903 43.4994 117.253 43.639C117.464 43.7088 117.604 43.2201 117.744 43.2201C118.235 43.2899 118.375 43.9881 118.936 43.7786C118.516 43.3597 118.095 43.0107 117.674 42.5918C119.287 43.0805 120.339 43.4296 121.952 43.0805C121.671 42.3823 121.531 42.0333 120.83 41.8936C121.671 41.0559 121.601 42.3823 122.232 42.6616C122.443 42.7314 123.004 42.3823 123.074 42.7314C123.144 43.0805 123.214 43.4296 123.284 43.7786C124.056 43.0107 125.388 44.756 126.019 45.2447C124.897 45.5938 124.617 45.3844 124.617 46.7108C125.108 46.5014 125.669 46.292 126.16 46.1523C126.861 45.8731 126.791 45.8032 127.212 46.5014C127.702 47.409 128.824 47.1297 129.385 48.1071C129.736 48.7355 130.087 49.4336 130.437 50.0619C130.578 50.3412 130.227 50.5506 130.017 50.7601C129.175 51.5979 128.334 52.4356 127.492 53.2734C127.773 53.4829 128.824 53.9715 128.614 54.5301C128.544 54.7395 127.001 55.0188 126.721 55.0886C125.739 55.3678 124.547 54.949 123.565 54.8791C123.705 55.5773 122.793 55.7169 122.443 56.3452C122.232 56.7641 122.934 57.6717 123.355 57.6019C124.056 57.5321 124.897 57.7415 125.388 57.2528C125.879 56.7641 126.58 57.183 127.212 57.3226C127.212 57.1132 127.352 56.9038 127.282 56.6943C127.702 56.6245 127.983 56.9038 127.983 57.3226C129.105 56.6245 129.035 57.2528 129.736 58.3699C130.157 58.9982 130.858 58.9284 131.489 59.2775C131.139 59.4869 130.718 59.6265 130.367 59.836C130.998 60.185 131.419 60.5341 132.12 60.4643C132.05 60.6039 131.98 60.6737 131.91 60.8134C132.611 61.0228 133.313 61.1625 134.014 61.3719C134.294 61.4417 134.294 62.07 134.785 62.2097C136.118 62.5587 137.52 62.9078 138.923 63.2569C138.993 62.6286 139.203 62.3493 138.712 62.0002C138.222 61.6512 137.731 61.3021 137.17 60.953C136.819 60.7436 136.118 60.8134 135.907 60.4643C135.627 59.9756 135.346 59.4869 135.066 58.9982C135.557 59.2076 136.048 59.4171 136.539 59.6265C136.398 59.4171 136.398 59.1378 136.328 58.9284C137.17 59.4171 138.011 59.9756 138.853 60.4643C139.273 60.7436 140.115 61.7908 140.396 61.6512C140.255 61.3719 140.185 61.0926 140.045 60.8134C140.185 60.8832 140.396 60.8832 140.536 60.953C140.886 60.185 139.764 60.0454 140.185 59.2775C140.396 59.5567 140.676 59.9058 140.886 60.185C140.816 59.6963 140.886 58.7888 140.676 58.3699C140.396 57.8812 139.835 58.0906 139.694 57.4623C139.554 56.6943 139.624 56.4849 138.993 56.2056C138.502 55.9962 138.011 55.5773 137.871 56.4151C137.661 55.8565 137.52 55.298 137.31 54.7395C137.1 54.1112 136.959 54.3904 136.398 54.5999C136.258 54.2508 136.118 53.8319 136.048 53.413C136.398 53.4828 136.819 53.4828 137.17 53.5527C137.1 52.7847 136.328 52.8545 136.749 52.1564C137.029 51.6677 137.38 51.7375 137.941 52.0167C138.362 52.2262 138.783 53.1338 139.273 53.2036C139.624 53.2734 140.325 52.8545 140.676 52.7149C140.886 53.5527 140.115 53.6225 139.554 53.8319C140.466 54.8791 140.957 55.3678 142.219 55.9264C142.499 55.1584 142.219 54.3206 142.149 53.5527C143.131 54.2508 143.551 53.6923 144.603 53.1338C144.253 52.9941 143.902 52.7847 143.551 52.6451C143.832 52.2262 144.603 52.5753 145.024 52.6451C145.164 51.6677 145.515 51.1092 144.603 50.6903C144.042 50.4808 142.99 50.7601 142.359 50.7601C142.569 50.4808 142.78 50.1318 142.92 49.8525C142.008 49.7129 141.588 49.7827 140.957 49.0845C140.396 48.4562 140.185 48.2468 139.484 47.9675C138.011 47.409 136.539 46.8505 135.066 46.1523C135.487 46.0825 135.907 46.0825 136.328 46.0127C136.258 45.5938 136.188 45.2447 136.118 44.8258C136.679 44.9655 137.31 45.0353 137.871 45.1749C137.52 44.1975 137.59 44.2673 136.679 44.407C136.188 44.4768 135.767 44.1975 135.276 44.0579C136.118 43.5692 136.328 43.4994 137.31 43.4994C137.31 42.7314 136.539 42.4522 136.048 42.1031C135.907 42.871 135.206 43.0107 134.645 43.2899C134.855 42.522 134.294 42.6616 133.733 42.5918C134.365 42.3823 135.487 42.3823 135.697 41.6144C135.136 41.3351 132.261 39.4501 131.91 40.2181C131.63 40.8464 130.648 41.5446 130.367 40.7068C130.437 40.2879 131.77 39.7294 132.05 39.5898ZM89.1322 26.0457C88.7816 26.0457 88.5011 26.1854 88.2206 26.4646C88.6413 26.4646 88.992 26.4646 89.4127 26.4646C88.1504 27.3024 89.9036 27.3722 90.5348 27.2326C91.4464 27.0231 92.3581 26.9533 93.2698 26.8835C93.1295 27.2326 92.849 27.3722 92.4983 27.3024C92.5685 27.3722 92.6386 27.442 92.7087 27.5118C92.3581 27.442 92.0075 27.5817 91.7971 27.9307C92.1477 27.9307 92.5685 28.0005 92.9191 28.21C92.7087 28.21 92.4282 28.2798 92.2178 28.2798C92.288 28.9081 92.7789 28.8383 93.2698 28.9779C93.5503 29.0478 93.6905 28.6289 93.9009 28.6289C94.6022 28.6987 95.6541 28.9779 96.2151 28.4194C96.0047 28.2798 95.7943 28.0704 95.584 27.9307C95.8645 27.7213 95.9346 27.5118 95.9346 27.1628C96.0749 27.3024 96.2852 27.3722 96.4255 27.442C96.5658 26.8835 96.2151 26.7439 96.145 26.325C96.145 25.9061 96.3554 25.557 96.2852 25.208C96.2852 24.9985 95.8645 24.2306 95.6541 24.1607C95.3736 24.0211 94.8126 23.672 94.5321 23.8117C93.6905 24.3004 93.0594 23.6022 92.0075 24.0211C90.8854 24.44 92.7789 24.5098 92.849 25.0683C92.6386 24.9985 92.4282 25.1381 92.2178 25.0683C92.4984 25.4872 92.7789 25.8363 93.0594 26.2552C92.6386 26.0457 89.8335 23.323 89.9036 25.208C90.1841 25.208 90.4646 25.208 90.7452 25.208C90.114 25.4872 90.2543 26.1155 90.8854 25.9061C90.8153 26.4646 89.6932 25.9061 89.1322 26.0457ZM89.2024 44.1975C89.4127 43.0805 89.9738 43.3597 90.6049 43.8484C90.675 43.7088 90.8153 43.5692 90.8854 43.3597C91.727 44.6862 91.5867 42.9409 91.5867 42.3823C90.675 42.5918 89.553 41.8936 88.5712 41.3351C88.2206 41.1257 86.818 40.5672 86.6778 40.1483C86.5375 39.7294 86.9583 39.1011 86.7479 38.5425C86.1869 37.2161 85.8362 35.1914 84.6441 34.5631C84.1532 34.2838 83.6623 33.5159 83.3116 34.1442C83.1012 34.4235 82.1896 33.7253 81.9091 33.5857C82.2597 34.0744 81.6286 34.2838 81.7688 34.5631C81.9091 34.9122 82.0493 35.2613 82.1195 35.6103C82.4 36.4481 82.6805 37.2161 82.961 37.984C82.4 38.1935 82.1195 38.6124 81.839 37.9142C81.5584 37.1462 81.3481 36.4481 81.0675 35.6801C80.7169 34.6329 78.9637 34.6329 78.2624 34.7027C78.6832 35.1216 79.104 35.6103 79.5247 36.0292C79.2442 35.9594 78.2624 35.5405 78.1222 35.8198C77.7014 36.5179 77.7014 36.4481 76.93 36.4481C77.1404 36.1688 77.3508 35.9594 77.491 35.6801C77.0001 35.4707 75.5275 34.4235 75.0366 34.5631C74.6859 34.6329 74.6158 35.4707 74.195 35.4707C73.7743 35.5405 73.3535 35.5405 73.0029 35.5405C73.634 34.982 74.3353 34.2838 73.4236 33.7253C72.7224 33.3064 72.4418 33.5857 71.6704 33.865C70.0575 34.4933 68.9355 34.982 67.603 36.099C67.8134 36.1688 68.0238 36.3783 68.2342 36.3783C67.6732 36.867 66.8316 37.3557 66.9719 38.2633C67.4628 38.2633 67.8836 38.2633 68.3744 38.2633C68.3043 38.4029 68.2342 38.6124 68.1641 38.8218C69.1459 38.752 70.1276 38.752 71.0393 38.752C70.0575 39.1709 69.0056 39.6596 68.0238 40.0785C68.655 40.7068 68.7952 41.0559 69.5666 40.986C70.6185 40.986 71.6003 40.986 72.6522 40.9162C74.1249 40.9162 75.3872 41.2653 76.8599 41.6144C77.9118 41.8936 76.2287 42.1729 75.8781 42.1729C75.1067 42.1729 74.2652 41.9635 73.4938 41.8936C72.2315 41.754 70.6887 42.4522 69.4264 42.6616C70.1276 45.1051 72.512 44.6862 74.4755 44.8258C74.3353 46.0825 74.6158 46.7108 75.7378 46.641C77.1404 46.5014 78.4728 46.4316 79.8754 46.292C80.787 46.2221 81.1377 45.5938 82.1195 45.3844C82.6805 45.3145 82.961 45.2447 83.3818 44.8258C83.8025 44.4768 83.8025 43.9881 84.3635 44.1975C84.2934 44.3371 84.2934 44.6164 84.2233 44.756C84.8544 44.8957 85.5557 45.0353 86.1869 45.1749C86.0466 45.2447 85.9765 45.3844 85.8362 45.4542C86.9583 45.4542 88.0102 46.0825 89.1322 45.9429C89.4127 45.9429 90.5348 45.524 90.5348 45.2447C90.5348 44.756 89.8335 44.8957 90.3244 44.1975C89.553 43.9881 89.1322 44.407 88.5712 44.9655C88.5712 44.407 88.7115 43.9881 88.2907 43.5692C88.5011 43.5692 88.6413 43.5692 88.8517 43.639C88.8517 43.9881 89.0621 44.0579 89.2024 44.1975ZM93.41 45.524C93.5503 45.6636 93.8308 45.9429 93.971 46.0127C94.0412 45.7334 94.1814 45.8032 94.2515 45.6636C94.3217 46.0127 94.5321 46.1523 94.8126 46.2221C94.8827 46.1523 94.8827 46.0127 94.9528 45.8731C95.2333 46.7108 96.4956 46.7807 97.1969 46.9203C97.8982 47.0599 98.5995 46.292 99.2306 45.9429C98.3891 45.1749 97.6177 44.5466 96.6359 43.9183C96.145 43.5692 95.7242 43.0107 95.2333 43.4994C94.8827 43.8484 94.2515 44.2673 94.8827 44.756C94.7424 44.756 94.6723 44.8258 94.5321 44.8258C94.3918 45.4542 93.7607 44.8957 93.41 45.524ZM219.429 71.7743C219.359 71.8441 219.289 71.8441 219.149 71.9139C219.219 71.9837 219.219 72.1233 219.289 72.1932C219.64 71.9139 219.78 71.7044 220.131 71.6346C220.061 71.5648 219.99 71.495 219.92 71.3554C220.481 71.2856 220.411 70.5176 220.131 70.6572C219.78 70.8667 218.588 71.2158 219.429 71.7743ZM119.778 58.5793C118.866 57.8812 118.726 57.8812 117.604 58.0208C118.586 57.0434 116.061 55.8565 115.57 55.5075C115.22 55.2282 114.589 55.3678 114.308 55.0188C113.817 54.5301 113.677 54.3206 113.186 55.0188C113.116 54.8791 112.976 54.5999 112.905 54.4603C113.887 54.3206 113.607 52.9243 112.765 53.2734C111.924 53.6225 111.924 54.3904 111.643 55.3678C111.503 55.7867 111.503 56.2056 111.433 56.5547C111.363 56.8339 111.643 57.3227 111.573 57.5321C111.433 57.8114 110.451 58.5793 110.171 58.9284C110.451 58.9284 112.064 58.5095 112.204 58.5793C112.415 58.7189 112.555 60.3247 112.905 60.1152C113.467 59.7662 113.887 58.9982 114.378 58.7888C115.15 58.5095 115.079 57.8812 115.851 57.5321C115.64 58.7888 117.814 59.068 118.656 59.2775C119.007 59.068 119.357 58.8586 119.778 58.5793ZM103.649 29.3968C103.929 30.095 104.841 29.4666 105.262 29.1874C105.612 29.8855 105.542 29.9553 106.243 30.0252C106.804 30.095 107.365 30.3044 107.506 29.4666C107.576 29.6761 107.786 29.7459 107.926 29.9553C107.926 29.6761 108.067 29.3968 108.067 29.1176C108.838 29.3968 107.997 30.3044 108.838 30.3742C109.68 30.444 110.521 30.444 111.363 30.5139C111.293 30.3044 111.363 30.095 111.363 29.8855C111.783 30.5139 112.976 30.7233 113.186 29.8157C113.396 30.7233 114.659 30.1648 115.29 30.0252C115.22 29.6761 115.15 29.327 115.079 28.9779C115.921 28.9779 115.5 29.8855 116.131 30.1648C116.692 30.3742 117.113 30.5837 117.674 30.444C118.025 30.3742 119.568 30.3742 119.708 30.0252C119.918 29.2572 120.199 29.327 120.9 29.0478C120.549 28.6987 120.129 28.6987 119.708 28.5591C120.059 28.2798 120.409 28.0704 120.69 27.7911C119.357 26.6741 117.744 25.8363 116.061 26.3948C115.36 26.6042 114.729 26.2552 113.957 26.5344C113.186 26.8137 112.555 26.9533 111.783 27.1628C111.924 27.3024 112.064 27.442 112.204 27.5118C111.433 27.3722 110.381 26.8835 109.609 26.9533C109.399 26.9533 108.908 27.442 108.698 27.3024C108.347 27.0929 107.997 26.8137 107.576 26.6042C107.365 26.4646 105.823 25.6268 105.823 25.557C105.682 25.0683 107.225 25.6268 107.365 24.9287C106.945 24.7891 106.524 24.6494 106.033 24.5796C105.402 24.44 105.682 24.0909 105.262 23.8117C104.49 23.323 103.649 24.0211 102.877 23.8117C102.036 23.672 101.615 22.9041 100.914 22.8343C100.072 22.6946 99.0202 22.2757 98.2488 22.555C96.9164 22.9041 97.3372 23.4626 98.1787 24.3702C99.0202 25.208 99.5111 25.0683 100.563 24.9287C101.475 24.7891 101.895 24.44 102.527 25.208C102.947 25.6967 103.999 26.5344 103.298 27.2326C103.018 28.21 103.228 28.4194 103.649 29.3968ZM127.352 48.1769C126.861 48.7355 128.965 48.7355 129.105 48.7355C128.895 47.7581 127.843 47.6184 127.352 48.1769ZM108.067 7.40524C107.436 7.96376 106.734 8.52228 106.103 9.08079C107.225 9.84875 108.347 9.22042 109.68 9.15061C110.872 9.08079 112.134 8.66191 113.256 8.31283C112.204 8.87135 111.363 9.29024 110.171 9.36005C109.048 9.49968 108.347 9.42987 107.295 9.91857C108.417 10.1978 109.609 10.9658 110.591 10.2676C111.854 9.42987 112.485 9.29024 114.028 9.15061C112.695 9.5695 112.064 9.84875 110.942 10.8262C111.924 10.9658 112.835 11.1054 113.817 11.1054C114.589 11.1054 114.659 11.3149 114.799 10.4073C114.869 10.128 115.711 9.98838 115.991 9.91857C115.851 10.0582 115.711 10.2676 115.57 10.4073C116.201 10.1978 116.763 10.0582 117.394 9.84875C116.903 10.2676 116.482 10.6167 115.991 11.0356C116.763 10.896 117.534 10.7563 118.235 10.6167C118.726 10.5469 119.848 10.5469 120.199 10.1978C121.321 9.08079 122.373 8.66191 123.775 7.96376C123.144 8.52228 122.583 9.08079 121.952 9.63931C122.303 9.77894 122.723 9.98838 123.074 10.128C120.62 10.7563 118.235 11.245 115.781 11.7337C116.622 12.5017 117.394 13.2697 118.235 13.9678C117.183 13.3395 115.921 12.1526 114.729 11.8734C114.518 11.8036 111.222 11.8036 111.222 11.7337C110.241 13.6886 112.204 13.5489 113.256 14.3169C114.238 15.015 115.079 16.1321 115.711 17.2491C114.168 16.4113 111.643 16.2019 110.241 17.5982C108.978 18.8548 110.1 18.9945 111.363 19.2039C112.204 19.4133 112.835 18.2963 113.467 17.7378C113.046 19.1341 111.783 19.9021 113.256 20.9493C114.448 21.787 115.781 20.1115 116.482 19.3435C115.36 20.8795 114.659 21.9965 112.695 21.5078C111.924 21.2983 111.854 20.1813 111.152 20.1115C110.171 19.9719 109.68 19.9021 108.768 20.2511C109.329 21.2983 109.329 21.438 110.451 21.5078C109.68 22.2757 109.189 22.0663 108.277 22.4852C107.926 22.6248 107.155 22.7644 106.945 23.0437C106.734 23.323 107.295 23.6022 106.875 23.8815C107.506 24.6494 107.716 24.0909 108.207 23.5324C108.207 24.44 109.469 25.1381 109.82 24.0909C109.96 24.9985 110.521 24.5098 111.152 24.5796C111.783 24.6494 112.344 24.7193 112.976 24.7193C113.677 24.7193 113.887 24.0909 114.378 24.2306C114.799 24.3702 115.57 24.7193 115.43 23.8117C115.711 24.44 117.043 25.0683 117.113 23.9513C117.674 24.5796 118.025 23.8117 118.375 24.0909C118.936 24.5098 118.726 24.7891 118.516 25.4872C119.357 25.208 120.129 24.9985 120.97 24.7193C121.181 24.6494 121.321 24.1607 121.531 24.0909C121.601 24.0909 121.882 24.44 122.162 24.3702C122.373 24.3004 123.004 24.2306 123.004 23.9513C123.004 23.672 123.004 22.9739 122.793 22.8343C122.373 22.555 122.232 22.4154 121.812 22.6248C121.321 22.9041 121.321 23.1135 120.97 22.555C120.69 22.0663 122.162 21.0191 122.443 20.8096C123.284 20.1115 121.952 19.7624 122.373 19.4133C122.653 19.2039 123.775 19.9021 124.266 19.6926C125.248 19.3435 125.458 19.2039 126.089 18.3661C125.599 18.0869 125.178 17.8774 124.687 17.5982C125.528 17.4585 126.3 17.3887 127.141 17.3189C127.212 16.3415 125.108 16.2717 124.406 16.0622C125.318 16.0622 126.3 16.0622 127.212 16.0622C127.422 14.9452 124.757 15.2943 124.056 15.2245C125.739 15.015 127.422 14.8754 129.105 14.5263C129.035 14.2471 128.895 13.898 128.824 13.6187C129.456 13.7584 130.227 14.2471 130.788 13.898C131.63 13.4791 132.05 13.13 132.681 12.4319C132.05 12.4319 131.489 12.3621 130.858 12.3621C131.84 12.1526 132.822 11.9432 133.804 11.7337C134.645 11.5941 135.697 10.6167 136.398 10.128C137.38 9.49968 140.676 8.66191 140.816 7.47506C138.292 7.96376 135.837 8.45246 133.313 9.01098C134.855 8.59209 136.398 8.10339 137.871 7.6845C136.959 7.54487 136.118 7.40524 135.206 7.26561C137.17 7.12599 139.133 6.98636 141.097 6.84673C142.499 6.77691 144.253 5.24099 145.515 4.61266C143.762 3.98433 142.219 3.56544 140.396 3.28619C138.853 3.00693 137.45 3.49563 135.907 3.8447C136.749 3.356 137.59 2.93711 138.432 2.44841C136.889 2.23897 135.206 1.75027 133.663 1.75027C132.191 1.75027 130.578 2.23897 129.105 2.44841C129.315 2.8673 129.526 3.21637 129.736 3.63526C129.035 3.14656 128.053 2.16915 127.212 2.16915C125.949 2.16915 124.757 2.09934 123.565 2.09934C124.266 2.72767 125.038 3.28619 125.739 3.91452C124.897 3.56544 123.986 3.21637 123.144 2.8673C122.653 2.65786 121.251 2.30878 120.76 2.44841C120.409 2.58804 120.339 3.00693 119.918 3.07674C119.357 3.07674 118.796 3.14656 118.235 3.14656C117.604 3.21637 116.903 4.05415 116.412 4.47303C117.885 5.24099 119.287 6.00895 120.76 6.77691C119.147 6.35803 117.534 6.00895 115.991 5.59007C115.29 5.38062 114.518 4.61266 113.887 4.19378C113.396 3.91452 112.625 4.05415 112.064 3.98433C112.204 4.3334 112.344 4.61266 112.415 4.96174C111.783 4.96174 111.222 4.96174 110.591 5.03155C111.012 5.24099 111.433 5.45044 111.854 5.65988C110.241 5.7297 108.067 4.82211 107.225 6.7071C106.103 5.7297 104.701 6.49765 103.579 7.12599C104.35 7.47506 105.051 7.82413 105.823 8.1732C106.594 7.96376 107.365 7.6845 108.067 7.40524ZM91.5867 20.3908C91.0958 19.7624 90.5348 19.9021 89.9036 20.0417C89.2024 20.1813 89.6231 20.67 90.1841 20.67C90.675 20.6002 91.0257 20.2511 91.5867 20.3908ZM120.269 63.7456C120.69 63.3965 121.882 62.1399 120.69 61.7908C120.199 61.6512 119.708 62.2097 119.638 62.6286C119.638 63.2569 119.848 63.3267 120.269 63.7456ZM215.572 84.4805C215.432 84.5503 215.292 84.7598 215.152 84.8296C216.414 85.8768 218.097 83.922 219.289 83.5729C219.71 83.4333 219.99 83.8522 220.131 83.2937C220.271 82.8748 220.411 82.3861 220.551 81.8974C220.762 81.3389 220.411 80.5709 219.99 80.152C220.832 79.5935 221.112 79.5237 221.183 78.4765C220.762 78.6161 220.622 77.8481 220.271 77.4292C220.061 77.2198 219.289 77.5689 219.009 77.6387C219.079 77.4991 219.149 77.4292 219.219 77.2896C218.237 76.7311 217.326 77.7783 216.835 78.5463C217.115 78.6859 217.466 78.7557 217.746 78.8953C217.326 79.1746 217.185 79.5237 216.694 79.384C216.414 79.3142 215.923 79.035 215.642 79.2444C215.152 79.5237 215.292 79.5935 215.432 80.2218C215.502 80.5011 215.011 80.8502 214.871 80.9898C215.432 81.269 215.853 81.4087 216.484 81.4785C216.063 81.8276 215.642 82.2464 215.222 82.805C215.783 82.6653 216.344 82.4559 216.835 82.6653C216.484 82.7351 215.713 82.7351 215.502 83.0842C215.222 83.4333 215.011 83.5729 214.591 83.6427C214.801 83.6427 215.011 83.7824 215.222 83.8522C215.011 83.9918 214.801 84.1314 214.52 84.2012C215.011 84.3409 215.292 84.4107 215.572 84.4805ZM114.659 61.7908C114.729 61.9304 114.799 62.4889 115.009 62.4191C116.131 62.3493 117.464 61.8606 117.604 60.3945C117.324 60.3945 117.043 60.3945 116.763 60.3945C116.061 60.5341 115.64 60.5341 115.079 61.0228C114.659 61.3719 114.518 61.3021 114.659 61.7908ZM101.685 28.5591C101.545 27.7911 100.703 26.6741 99.8617 26.9533C99.3709 27.0929 97.0566 27.5118 97.4073 28.6987C97.5475 29.1874 99.441 29.8157 99.8617 30.095C100.914 29.8855 101.966 30.0252 101.685 28.5591ZM85.9765 16.9C86.6778 16.9698 86.8881 15.9226 87.5193 16.551C87.379 16.6208 87.3089 16.8302 87.1687 16.9C87.5193 16.9698 87.8699 17.0397 88.2206 17.1095C88.3608 18.2963 86.6778 17.3887 85.9765 17.8774C86.1869 19.9021 88.5011 17.9472 88.9218 18.4359C89.4127 18.9945 90.2543 18.8548 90.8854 18.9246C91.5166 18.9945 91.5867 19.3435 91.9373 19.9719C92.2178 20.5304 95.0931 20.4606 93.6905 18.8548C93.4801 18.6454 92.9892 18.2963 93.0594 17.9472C93.1996 17.4585 93.2698 17.5284 92.9191 17.2491C92.288 16.7604 92.1477 16.8302 91.3763 16.9698C91.6568 15.4339 89.7634 16.2019 89.2725 16.4811C88.8517 15.5735 88.4309 14.8754 87.379 15.015C86.1869 15.1547 85.5557 14.9452 85.1349 16.1321C85.5557 16.1321 85.9064 16.1321 86.3271 16.0622C86.1869 16.4113 86.1167 16.6906 85.9765 16.9ZM86.3271 22.3456C86.6778 22.6946 87.0284 22.1361 86.7479 21.7172C86.4674 21.438 86.1869 21.1587 85.9765 20.9493C85.5557 20.6002 85.2051 20.1813 84.6441 20.3908C84.7142 20.8096 84.8544 21.1587 84.9246 21.5776C85.2752 21.9267 86.0466 22.0663 86.3271 22.3456ZM94.4619 12.8508C94.1113 12.013 92.1477 12.2923 92.7087 13.4093C93.6204 13.7584 95.1632 14.5961 94.4619 12.8508ZM97.1268 19.2039C96.7761 19.4133 96.2852 19.3435 95.9346 19.4832C96.2852 19.6228 96.9164 20.2511 96.9865 20.2511C97.4073 20.2511 97.8281 20.1115 98.1787 19.9719C98.5995 19.8322 99.441 19.8322 99.6514 19.4133C99.8618 18.9945 99.3007 18.8548 99.8617 18.2963C99.3709 18.0869 98.6696 18.1567 98.3189 17.9472C97.9683 17.8076 97.5475 17.3189 97.1268 17.1793C96.4956 16.9 94.2515 16.4811 95.5138 17.8076C95.3736 17.8076 95.2333 17.8774 95.0931 17.8774C95.3736 19.1341 96.4255 18.5058 97.1268 19.2039ZM76.4391 19.6228C75.1768 19.8322 74.6158 19.553 74.8963 21.0889C75.4573 21.0889 75.9482 21.8569 76.4391 21.787C77.2105 21.5776 77.9819 21.3682 78.6832 21.2285C79.2442 21.0889 78.9637 20.8795 79.104 20.5304C79.1741 20.1813 78.2624 20.4606 78.0521 20.1115C78.6832 19.9719 79.3144 19.9719 79.7351 19.3435C78.8235 18.9246 77.4209 19.4832 76.4391 19.6228ZM78.7533 24.8589C79.2442 25.1381 79.7351 25.4872 80.226 25.7665C79.8754 25.9061 79.5949 26.0457 79.2442 26.1854C79.5247 26.325 80.8572 26.6741 80.787 27.0231C80.6468 27.7911 79.9455 27.442 79.2442 27.3722C78.8936 27.3722 77.491 27.5118 77.4209 27.0929C77.2105 26.1854 77.1404 26.325 76.2989 26.3948C76.4391 26.325 76.5794 26.2552 76.7196 26.1854C76.1586 25.7665 75.5275 24.8589 74.8262 24.9985C73.5639 25.208 74.0548 24.7193 73.0029 24.3702C72.7925 24.3004 71.2497 24.44 71.2497 24.7891C71.2497 25.1381 72.512 25.3476 72.7925 25.4174C71.7406 25.3476 71.0393 25.208 70.0575 25.6268V26.1155C70.6887 26.4646 71.8107 26.1854 72.5821 26.1854C72.2315 26.3948 69.2861 26.2552 69.3562 26.9533C69.4264 27.6515 71.8808 26.8835 72.2315 26.8137C71.2497 27.5817 69.2861 27.0231 68.7251 28.1402C69.5666 28.4194 69.9173 28.4892 70.7588 28.2798C70.7588 28.4194 70.6887 28.5591 70.6887 28.6987C71.0393 28.8383 71.3899 28.9081 71.7406 28.9779C71.4601 28.2798 72.3016 28.4194 72.4418 29.0478C73.2834 28.4892 73.4938 28.4194 73.7041 27.442C74.3353 27.6515 74.0548 28.1402 73.9847 28.6987C74.4755 28.6289 75.5976 28.9081 75.6677 28.21C75.9482 28.9081 77.1404 28.5591 77.7014 28.21C76.7196 29.2572 74.6158 29.4666 73.2133 29.9553C74.8963 31.0724 75.5976 30.7233 77.4209 30.0252C78.4728 29.6761 79.4546 29.327 80.5065 28.9081C81.0676 28.6987 81.4182 29.2572 81.9792 29.1874C82.2597 29.1874 82.3298 28.6987 82.7506 28.6987C83.2415 28.6987 83.7324 28.6987 84.2233 28.6987C84.8544 28.6987 85.1349 27.9307 85.2752 27.2326C85.4856 26.3948 85.4155 25.6268 84.2934 25.7665C82.961 25.9759 84.083 26.325 83.522 27.0231C83.3116 26.325 83.1012 26.1854 82.4701 26.0457C82.1195 25.9061 81.9792 25.208 81.6987 24.9287C80.9974 24.3702 81.5584 22.8343 80.226 23.3928C79.7351 23.9513 79.3845 24.3702 78.7533 24.8589ZM97.267 12.6413C97.4774 14.2471 99.2306 14.2471 100.212 13.8282C99.8617 14.3867 99.3709 14.3169 98.8098 14.3867C98.3891 14.4565 98.5293 15.015 98.9501 14.9452C99.3709 14.8754 99.3007 15.6434 99.7916 15.2943C100.142 15.015 100.353 14.7358 100.773 14.9452C100.773 15.0848 100.703 15.1547 100.703 15.2943C101.194 15.5735 101.334 15.1547 101.755 14.9452C101.895 14.8754 102.316 15.4339 102.176 14.666C102.947 14.9452 104.28 14.5961 104.771 15.0848C104.14 15.1547 103.508 15.2245 102.877 15.3641C103.859 15.783 104.771 15.5735 105.752 15.5037C103.929 15.8528 102.246 15.7132 100.563 16.4113C101.054 16.7604 101.615 16.9 102.246 17.0397C101.966 17.0397 101.615 17.1095 101.334 17.1095C101.825 17.8774 103.228 17.5982 104.069 17.8076C103.508 17.8774 102.877 17.9472 102.316 18.0171C103.088 19.2039 104.771 18.9945 105.963 19.0643C105.893 18.785 105.682 18.5058 105.402 18.4359C106.173 18.4359 106.524 18.7152 107.085 19.2039C106.804 18.6454 106.524 18.0869 106.243 17.4585C106.804 18.0171 107.365 18.5756 107.926 19.1341C108.207 18.5058 108.347 18.1567 107.926 17.5284C110.311 18.785 107.716 16.551 109.329 16.0622C109.189 16.551 109.399 16.9698 109.609 17.4585C110.03 17.1095 110.732 16.8302 110.381 16.1321C110.802 16.4811 112.485 15.5735 113.186 15.3641C112.905 14.8754 112.485 14.5263 112.064 14.1074C111.994 14.3169 111.783 14.5263 111.713 14.7358C111.643 13.5489 110.311 14.2471 109.75 14.4565C110.381 13.2697 110.661 12.7112 109.189 12.5715C110.1 11.8036 108.838 10.7563 107.997 11.5243C108.207 11.8734 108.347 12.1526 108.558 12.5017C108.067 12.5017 107.646 12.3621 107.365 11.9432C107.225 11.6639 107.646 10.896 106.945 11.1054C106.173 11.3149 105.542 10.9658 104.981 10.4073C104.14 9.49968 103.719 8.73172 102.527 8.38265C101.825 8.1732 100.703 7.82413 100.212 8.59209C100.844 8.80154 101.545 8.59209 102.106 8.94116C101.545 9.98838 99.441 8.52228 98.8098 10.128C99.3007 10.2676 100.072 10.1978 100.493 10.5469C100.002 10.6865 97.6177 10.7563 98.3891 11.5243C98.0384 11.6639 97.6177 11.8036 97.267 11.9432C97.8982 12.2224 98.2488 12.0828 98.88 12.2224C98.8098 12.2923 98.6696 12.3621 98.5995 12.3621C99.1605 12.6413 99.8618 12.013 100.353 12.3621C100.142 12.4319 100.002 12.6413 99.7916 12.6413C99.9319 12.781 100.072 12.9206 100.212 12.9904C100.002 12.9206 99.7916 12.9206 99.5812 12.781C98.88 12.781 98.0384 12.7112 97.267 12.6413ZM86.818 25.3476C87.3089 25.9061 89.4829 26.0457 89.2725 24.9287C88.6413 24.7891 87.2388 24.8589 86.818 25.3476ZM68.9355 25.4872C68.5147 25.6268 66.3407 26.4646 66.6213 27.0929C66.7615 27.5118 67.8836 27.3722 68.0939 27.0231C68.3043 26.6042 69.0757 26.0457 68.9355 25.4872ZM220.271 73.6593C220.201 73.7291 220.131 73.7291 220.061 73.7989L220.201 73.9385C220.201 73.8687 220.341 73.7989 220.271 73.6593ZM83.3116 33.3763C84.0129 33.5857 84.083 33.7253 84.6441 34.214C85.0648 34.6329 85.3453 35.1216 85.9064 34.8424C86.3271 34.6329 86.6778 33.9348 86.6778 33.5159C86.6778 32.8876 86.257 32.8177 85.7661 32.4687C84.7843 32.6083 83.7324 32.2592 83.3116 33.3763ZM87.9401 28.3496C87.5894 27.3722 87.0985 27.5118 86.3972 27.7911C85.4856 29.0478 87.5193 28.5591 87.9401 28.3496ZM86.4674 23.9513C86.6778 24.3702 86.818 24.3702 86.818 24.7891C87.4492 24.8589 88.2206 24.9985 88.7115 24.5098C88.4309 24.3004 88.0803 24.1607 87.7998 23.9513C87.379 23.7419 86.9583 23.8117 86.4674 23.9513ZM101.475 21.3682C101.685 21.0889 101.895 20.7398 102.106 20.4606C100.703 20.0417 99.1605 19.9719 97.8281 20.67C98.1787 21.7172 100.703 21.2983 101.475 21.3682ZM119.778 34.8424C119.988 35.0518 120.479 35.2613 120.69 35.4009C121.181 35.6801 122.653 35.0518 123.144 34.9122C123.775 34.7726 124.687 34.982 125.318 34.982C124.406 33.7951 123.775 33.3763 122.513 32.7479C122.092 32.5385 121.531 32.8876 121.04 32.6781C120.549 32.4687 119.988 32.329 119.497 32.1196C118.656 32.2592 118.516 33.4461 119.287 33.865C119.918 34.214 119.427 34.3537 119.778 34.8424ZM104.841 21.0191C104.35 21.5078 105.332 21.8569 105.612 21.9965C106.103 22.2059 106.524 21.9267 107.015 21.787C106.945 20.7398 105.472 20.4606 104.841 21.0191ZM105.823 23.323C105.332 23.672 106.454 24.44 106.875 24.3004C106.804 24.1607 106.734 23.8815 106.664 23.8117C107.295 23.3928 106.173 23.0437 105.823 23.323ZM429.672 29.8157C431.285 29.8855 432.337 29.8157 433.88 29.327C433.95 29.327 434.09 28.4194 434.02 28.3496C433.95 28.21 433.108 28.0704 432.968 28.0005C432.127 27.7213 431.846 27.8609 431.004 28.1402C431.075 27.9307 431.004 27.7213 431.004 27.5817C430.303 27.5817 429.602 27.3722 428.971 27.8609C428.901 26.3948 427.288 27.3024 427.428 28.21C427.498 28.6289 429.251 29.5365 429.672 29.8157ZM299.866 39.4501C300.707 40.3577 301.759 40.986 302.881 41.0559C303.933 41.1257 306.107 41.8238 307.019 41.0559C305.546 40.0785 304.354 39.1709 304.284 37.1462C304.214 35.5405 305.757 34.214 306.668 33.097C307.229 32.4687 307.72 31.7705 308.211 31.0724C308.702 30.5139 309.754 30.095 310.385 29.6761C311.577 28.9081 312.348 27.9307 313.751 27.5817C315.364 27.093 316.977 26.6042 318.59 26.0457C319.361 25.7665 322.587 25.208 322.727 23.7419C322.868 21.9965 319.572 22.7644 319.011 23.2531C317.678 24.3004 316.206 24.5796 314.593 24.9985C313.12 24.9985 312.138 25.1381 310.806 25.6967C309.754 26.1155 308.071 26.4646 307.159 27.2326C306.177 28.1402 305.195 28.9779 304.284 29.9553C303.653 30.6535 303.022 31.3516 302.39 32.0498C301.899 32.6083 302.18 32.9574 302.32 33.6555C302.39 33.9348 300.988 34.7027 300.777 34.8424C299.936 35.4707 300.707 35.5405 300.287 36.3085C300.006 36.9368 299.094 36.6575 299.024 37.4255C298.954 38.6124 299.094 38.6124 299.866 39.4501ZM302.741 11.8036C301.198 11.245 301.198 11.3149 299.866 12.3621C300.497 12.4319 301.128 12.5017 301.689 12.5715C302.04 12.2923 302.39 12.0828 302.741 11.8036ZM308.421 8.24302C308.071 7.96376 307.72 7.61469 307.369 7.33543C308.071 7.12599 308.842 6.98636 309.543 6.77691C308.351 6.56747 307.86 6.28821 306.879 6.98636C306.107 7.54487 305.266 8.10339 304.494 8.59209C305.266 8.66191 305.967 8.80154 306.738 8.87135C307.299 8.73172 307.86 8.45246 308.421 8.24302ZM308.421 42.1729C308.632 42.7314 310.385 44.1277 310.946 43.639C311.577 43.0805 309.473 41.9635 309.193 41.6842C308.912 41.8936 308.702 42.0333 308.421 42.1729ZM310.315 12.9206C310.034 12.2923 309.403 12.7112 308.912 12.8508C309.123 12.9904 309.333 13.1999 309.543 13.3395C309.824 13.13 310.104 12.9904 310.315 12.9206ZM307.72 9.84875C306.808 9.5695 305.967 9.22042 304.985 9.22042C303.653 9.29024 303.162 9.08079 302.25 10.1978C303.162 10.4073 304.003 10.6865 304.915 10.896C306.037 10.6865 306.808 10.6167 307.72 9.84875ZM294.326 10.6865C293.695 11.1054 292.993 11.5243 292.362 12.013C293.554 12.4319 294.326 12.5017 295.588 12.5017C295.518 12.1526 295.378 11.8036 295.307 11.4545C296.57 11.1752 297.902 10.8262 299.164 10.5469C298.463 10.0582 297.972 9.63931 297.131 9.91857C296.289 10.128 295.588 10.4771 294.746 10.2676C292.993 9.84875 291.871 10.3375 290.118 10.896C290.679 11.0356 291.31 11.1752 291.871 11.3847C292.713 11.1054 293.554 10.896 294.326 10.6865ZM295.027 46.1523C295.448 46.5712 296.78 45.3844 297.131 45.1749C296.5 44.6164 296.219 44.4768 295.448 44.3371C294.466 44.6862 294.115 45.2447 295.027 46.1523ZM258.21 42.5918C259.542 42.3823 260.384 42.0333 261.296 40.986C260.664 40.986 260.664 41.5446 260.174 41.754C259.753 41.9635 259.051 41.8936 258.631 41.8936C258.841 42.2427 258.561 42.4522 258.21 42.5918ZM76.5794 18.4359C77.2105 18.785 77.1404 18.2963 77.7014 18.2265C78.1222 18.1567 80.5065 19.0643 80.226 17.8076C80.0156 17.0397 78.1222 17.1095 77.6313 17.2491C76.7898 17.5284 75.3171 17.5982 74.7561 18.4359C74.8262 18.5058 74.9664 18.5756 75.1067 18.6454C75.5275 18.5756 76.1586 18.2265 76.5794 18.4359ZM308.421 11.245C308.071 11.245 304.564 11.3847 304.915 12.3621C305.266 13.3395 307.65 12.5715 308.491 12.4319C308.351 12.2923 308.281 12.0828 308.141 11.9432C308.562 11.8734 308.982 11.8036 309.403 11.7337C309.123 11.5941 308.772 11.3847 308.421 11.245ZM416.067 29.1176C416.558 29.3968 417.049 29.9553 417.61 29.8855C418.592 29.8157 418.522 29.7459 418.943 28.8383C419.644 29.9553 420.696 29.0478 421.748 28.6289C422.028 28.4892 422.379 29.5365 422.729 29.4666C423.22 29.327 423.781 29.2572 424.272 29.1176C424.062 28.8383 423.922 28.4892 423.711 28.21C424.342 28.4892 424.623 28.6987 425.184 28.3496C425.675 28.0704 426.095 27.7911 426.446 27.3024C425.044 26.7439 423.641 26.2552 422.309 25.6967C421.958 25.557 421.327 25.1381 420.906 25.2778C420.205 25.557 420.555 26.0457 420.696 26.8137C419.714 26.3948 417.75 24.5098 416.769 25.2778C415.857 25.9759 415.436 26.1854 415.086 27.3722C414.945 28.1402 415.717 28.6987 416.067 29.1176ZM220.271 76.8009C220.622 76.6613 220.692 76.382 220.481 76.033C220.341 76.1028 220.131 76.2424 219.99 76.382C220.411 76.4518 220.201 76.5915 220.271 76.8009ZM421.467 33.5857C422.379 34.3537 423.01 34.1442 424.132 34.1442C423.851 33.097 423.781 33.097 422.94 32.5385C422.729 32.3989 421.257 31.7705 421.257 31.7007C421.187 31.0026 420.626 30.3044 419.784 30.8629C418.802 31.4913 419.994 32.1196 420.415 32.4687C419.854 32.8177 419.293 33.2366 418.732 33.5857C419.504 33.5159 420.836 33.0272 421.467 33.5857ZM317.328 9.98838C318.169 9.77894 317.889 9.42987 317.818 8.52228C317.468 8.52228 316.767 8.45246 316.486 8.59209C316.276 8.80154 316.206 9.42987 315.995 9.5695C315.294 9.98838 314.593 8.94116 314.032 9.98838C314.242 10.1978 314.382 10.4073 314.593 10.5469C315.504 10.4073 316.416 10.1978 317.328 9.98838ZM309.894 11.3149C310.385 11.3149 310.665 11.1752 310.946 11.5941C311.507 12.2923 312.91 11.3149 313.4 10.7563C313.961 10.128 312.699 9.15061 312.068 9.36005C311.016 9.63931 310.175 9.91857 309.263 10.4073C309.403 10.8262 309.403 11.3149 309.894 11.3149ZM363.962 19.2737C364.734 20.2511 366.557 18.9945 367.469 18.7152C367.749 18.6454 368.24 19.2039 368.661 19.1341C369.432 18.9945 370.274 18.8548 371.045 18.7152C371.606 18.6454 371.887 18.4359 372.378 18.0171C372.658 17.8076 372.027 16.8302 371.676 16.8302C370.905 16.7604 370.765 16.4113 370.204 15.783C369.993 15.5037 368.941 15.783 368.591 15.783C368.801 15.5735 369.012 15.3641 369.292 15.1547C368.17 14.7358 367.399 14.8056 366.627 15.6434C365.856 16.4811 365.295 17.4585 364.664 18.5058C364.453 18.785 364.173 19.0643 363.962 19.2737ZM353.654 14.1074C354.425 14.0376 355.968 13.5489 356.529 14.2471C357.23 15.1547 357.651 16.2717 358.703 16.2019C360.035 16.0623 360.666 16.0623 361.859 16.4811C362.981 16.9 363.472 16.6906 364.664 16.3415C364.523 15.9924 364.173 15.2245 364.243 14.8056C364.453 14.3169 364.944 13.6886 364.453 13.4093C363.401 12.8508 362.84 13.3395 361.718 13.7584C362.069 13.3395 362.42 12.9904 362.84 12.5715C362.35 12.4319 361.087 12.5017 360.947 11.8734C360.737 10.5469 360.737 10.6865 361.859 10.3375C361.087 9.77894 359.685 8.31283 358.843 8.24302C357.791 8.1732 358.492 8.80154 357.861 9.01098C357.16 9.22042 356.459 9.42987 355.828 9.63931C355.056 9.84875 355.126 10.128 354.916 11.0356C354.846 11.3149 353.654 11.4545 353.373 11.5243C353.093 11.5941 352.742 12.781 352.602 13.13C352.461 13.3395 353.513 13.9678 353.654 14.1074ZM473.572 40.637C473.923 40.4973 474.273 40.7766 474.624 40.7068C475.816 40.4973 476.728 40.4973 477.569 39.5898C477.078 39.1709 476.728 38.6124 476.097 38.6124C475.255 38.5425 474.413 38.5425 473.642 38.4727C473.081 38.4727 472.169 39.0312 471.678 39.3105C471.538 39.3803 471.959 40.8464 472.029 41.1257C472.45 40.9162 473.011 40.7766 473.572 40.637ZM250.917 44.8957C250.426 45.1051 249.795 45.1051 250.005 45.8731C250.286 45.6636 250.566 45.4542 250.776 45.2447C250.776 45.1051 250.847 44.9655 250.917 44.8957ZM247.34 47.8977C247.691 47.9675 247.971 47.8279 248.112 47.4788C247.901 47.2694 247.621 47.2694 247.41 47.5486C247.34 47.6184 247.34 47.7581 247.34 47.8977ZM249.304 45.524C249.023 45.8731 248.743 46.1523 248.462 46.5014C248.743 46.5712 249.023 46.641 249.304 46.7108C249.865 46.292 249.795 45.9429 249.304 45.524ZM224.479 69.6798C224.829 69.7496 224.829 69.6798 225.18 69.5402C224.969 69.5402 224.829 69.4006 224.549 69.4704C224.619 69.4006 224.689 69.4006 224.759 69.3308C224.268 68.9817 224.198 69.4704 224.198 69.6798C224.268 69.7496 224.338 69.8893 224.408 69.9591C224.479 69.8893 224.479 69.8195 224.479 69.6798ZM260.033 41.6144C260.314 41.3351 260.664 41.1955 260.664 40.7068C260.244 40.9162 260.314 41.1955 259.753 41.0559C259.332 40.9162 259.051 40.9162 258.631 40.986C258.841 41.8936 259.472 41.6144 260.033 41.6144ZM220.692 76.3122C220.832 76.1028 220.972 75.8933 221.042 75.6839C220.762 75.6141 220.481 75.8933 220.692 76.3122ZM249.444 46.9203C248.883 46.9203 248.322 46.7807 248.322 47.6184C248.743 47.409 249.093 47.1297 249.444 46.9203ZM221.603 76.5217C221.603 76.7311 221.673 76.9405 221.814 77.15C222.024 76.8009 221.884 76.5915 221.603 76.5217ZM221.253 72.9611C221.183 72.9611 221.112 73.0309 221.042 73.1007C221.183 73.1705 221.253 73.1706 221.323 73.1706C221.042 73.4498 220.902 73.7291 220.832 74.0781C220.762 74.2178 220.341 74.4272 220.201 74.6367C220.762 74.7763 220.762 74.9857 220.201 75.1254C220.551 75.4744 221.463 75.1254 220.692 74.6367C221.183 74.9159 221.393 74.497 221.814 74.148C221.884 74.2178 221.884 74.2876 221.954 74.3574C221.393 74.6367 221.323 75.265 221.183 75.8933C221.112 76.3122 221.323 76.3122 221.112 76.8009C221.042 77.0802 220.832 77.2198 221.042 77.3594C221.463 77.7783 221.393 76.8009 221.463 76.5217C221.533 76.033 221.533 75.5443 222.094 75.3348C221.463 75.8933 222.024 76.382 222.445 75.4744C222.515 75.6141 222.585 75.8235 222.585 75.9631C222.234 75.9631 222.305 76.1028 222.375 76.5217C222.515 77.0104 222.585 76.8707 222.375 77.4991C222.164 78.1274 221.603 78.1972 222.305 78.7557C222.305 78.6161 222.305 78.4765 222.305 78.3368C222.655 78.4765 223.146 78.8953 223.006 78.3368C223.497 78.6859 224.198 77.9878 224.899 78.1274C223.637 78.4066 224.338 80.3615 225.11 79.8029C224.759 80.2916 224.829 81.269 225.25 81.6181L225.11 81.6879C224.899 81.4087 224.969 81.5483 224.759 81.4087C224.759 81.5483 224.829 81.6181 224.829 81.7577C224.338 81.6879 223.988 81.4785 223.567 81.8276C223.427 81.4785 223.146 81.3389 222.796 81.4785C223.357 81.8974 223.076 82.3163 222.585 82.6653C222.866 82.5955 223.216 82.5257 223.497 82.5257C223.427 83.154 223.777 83.2937 223.357 83.8522C223.146 84.1314 222.234 84.3409 221.884 84.4805C221.954 84.6201 221.954 84.8994 221.954 84.8296C222.375 85.5277 222.866 84.6201 223.497 84.9692C223.427 85.039 223.357 85.1088 223.286 85.1787C223.567 85.1787 224.198 85.5277 224.268 85.5277C224.689 85.3881 225.18 85.2485 225.601 85.039C225.32 85.3881 225.04 85.5975 224.969 86.0164C224.128 85.8768 223.216 85.5277 222.936 86.6448C222.796 87.2033 221.814 87.692 221.393 88.1807C222.164 88.6694 222.936 87.1335 223.988 87.9014C224.549 86.4353 224.829 87.6222 225.881 87.1335C226.232 86.9938 226.863 86.4353 227.214 86.5051C227.704 86.5051 227.775 87.0637 228.265 86.924C229.177 86.7146 229.738 86.7146 230.65 86.3655C231.842 85.8768 230.019 85.5277 229.668 85.4579C230.58 84.7598 231.211 84.4805 231.351 83.2238C231.491 81.9672 229.387 82.805 229.177 82.5955C230.019 82.037 228.756 80.9898 228.125 80.9898C228.476 80.8502 228.897 80.92 229.107 81.269C228.826 79.6633 227.494 79.5237 227.073 78.267C226.582 76.5915 225.881 76.4518 224.338 76.2424C224.619 75.8933 224.969 75.7537 225.32 75.8235C224.829 74.8461 227.003 73.7291 226.442 72.8215C226.091 72.263 223.567 72.5422 223.286 73.1007L223.146 72.9611C223.357 72.8215 223.427 72.5422 223.637 72.4026C223.427 72.3328 223.216 72.1932 223.006 72.1932C223.146 72.1932 223.286 72.1932 223.497 72.1932C223.637 71.5648 224.759 71.4252 224.899 70.5176C224.338 70.378 223.497 70.5874 222.936 70.8667C222.655 70.727 222.936 70.6572 222.515 70.8667C222.375 70.2383 221.884 70.7969 222.094 71.2856C221.954 71.2856 221.814 71.3554 221.673 71.3554C221.603 71.495 221.603 71.6346 221.533 71.7044C221.744 71.8441 221.884 72.1233 222.024 72.263C221.744 72.0535 221.393 72.0535 221.042 72.1932C221.183 72.4026 221.183 72.6819 221.323 72.9611C221.183 72.9611 221.042 72.8913 220.972 72.8913C220.832 72.8913 220.972 72.8913 221.253 72.9611ZM222.866 79.1746C222.585 79.3142 222.375 79.5237 222.375 79.8727C222.445 79.8727 222.515 79.8727 222.655 79.8727C222.936 79.7331 223.006 79.5237 222.866 79.1746ZM251.618 46.4316C252.109 45.8731 252.67 45.3145 253.161 44.756C252.81 45.0353 252.459 45.3844 252.109 45.6636C251.688 45.6636 251.478 46.0127 251.618 46.4316ZM254.353 43.2201C254.072 43.5692 253.792 43.7088 253.441 44.0579C253.722 44.0579 254.072 44.0579 254.353 44.1277C254.633 43.639 255.054 43.4296 254.353 43.2201ZM252.53 44.1277C251.898 44.3371 251.898 44.2673 251.828 44.9655C251.758 46.0127 253.231 44.6164 253.511 44.3371C253.301 43.8484 252.95 43.9881 252.53 44.1277ZM255.615 42.9409C255.194 42.6616 254.633 42.6616 254.493 43.2201C254.633 43.2899 254.774 43.3597 254.984 43.4296C255.265 43.3597 255.475 43.2201 255.615 42.9409ZM250.987 45.8032C250.706 46.0127 250.847 46.4316 250.426 46.641C250.496 46.292 250.566 45.9429 250.636 45.6636C250.215 45.6636 250.005 46.0127 250.145 46.5014C250.005 46.5014 249.865 46.5014 249.795 46.5014C249.725 46.9901 249.795 46.7807 249.514 47.1297C250.075 47.1995 250.286 47.409 250.636 46.9203C250.917 46.5712 251.127 46.4316 251.548 46.5712C251.548 46.2919 251.408 45.524 250.987 45.8032ZM249.725 47.7581C249.725 48.3864 249.374 48.526 248.883 48.5958C249.093 48.7355 249.023 48.8053 249.234 48.9449C249.163 49.0845 249.093 49.294 248.953 49.4336C249.514 48.8751 249.865 48.6656 249.725 47.7581ZM250.356 47.5486C250.215 47.4788 250.005 47.4788 249.865 47.4788C249.865 47.6882 249.865 47.9675 249.935 48.1769C250.356 47.7581 250.776 47.2694 251.197 46.8505C250.847 46.8505 250.566 47.1297 250.356 47.5486ZM256.667 43.1503C256.106 42.8012 255.054 43.4296 254.633 43.9881C254.914 43.9183 255.194 43.7786 255.475 43.7088C255.896 43.4994 256.246 43.2899 256.667 43.1503ZM257.158 42.3823C257.018 42.3823 256.667 42.3823 256.527 42.3823C256.597 42.522 256.597 42.6616 256.667 42.8012C257.018 43.0805 257.228 42.871 257.158 42.3823ZM324.691 33.2366C323.849 33.3064 324.06 33.7253 323.99 34.6329C324.761 34.4933 325.532 34.3537 326.304 34.214C325.953 33.4461 325.392 33.1668 324.691 33.2366ZM405.057 118.061C405.127 118.41 405.127 118.759 405.197 119.109C406.039 119.178 405.408 118.201 406.039 118.271C406.81 118.341 406.39 119.318 406.179 119.667C405.759 120.295 405.688 122.32 406.81 121.552C407.652 120.924 408.003 119.737 408.493 118.759C408.634 118.48 408.143 117.852 408.003 117.642C407.722 117.154 407.442 117.712 407.021 117.084C407.722 116.456 408.493 117.433 408.844 116.176C409.195 116.805 409.475 116.525 409.896 116.246C410.106 116.107 410.878 115.967 410.948 115.827C411.439 115.269 412.421 115.618 413.052 115.688C412.07 116.525 412.631 117.154 413.402 117.782C413.823 117.224 414.174 116.176 414.945 116.316C414.454 115.897 414.314 115.478 414.875 115.059C415.506 116.107 416.839 115.618 417.47 114.71C417.61 114.989 417.75 115.269 417.891 115.548C418.241 115.059 418.522 114.501 419.013 114.152C418.943 114.431 418.872 114.78 418.802 115.129C419.504 114.92 419.574 114.361 420.135 114.012C420.205 113.942 419.994 112.616 420.065 112.267C420.205 111.499 420.485 111.499 420.485 110.591C420.485 110.033 420.345 109.055 421.187 109.474C421.187 108.916 421.046 108.497 421.467 108.148C421.958 107.799 421.818 107.17 421.818 106.542C421.818 106.123 421.327 105.495 421.116 105.076C420.906 104.657 421.116 104.238 421.187 103.819C420.485 103.47 420.065 103.959 420.275 104.727C419.854 103.121 418.872 105.215 418.732 105.844C418.592 106.332 419.223 106.542 419.153 106.821C418.943 107.45 418.732 108.148 418.522 108.846C418.241 109.684 417.68 110.661 416.839 111.01C416.348 111.289 415.927 111.499 415.366 111.569C414.875 111.569 415.436 110.661 415.576 110.521C414.875 110.801 414.595 110.731 414.595 111.499C414.595 111.918 413.893 112.476 413.683 112.825C413.402 113.244 413.823 113.593 413.262 113.803C412.491 114.152 412.841 113.523 412.35 113.523C411.439 113.593 409.756 113.384 409.195 114.222C408.564 115.129 407.722 115.757 406.67 115.757C407.301 117.154 405.758 117.573 405.057 118.061ZM403.725 165.605C403.304 165.954 402.673 166.373 402.392 166.862C401.972 167.56 402.252 167.699 402.392 168.328C402.462 168.816 402.533 169.375 402.463 169.934C402.392 170.283 403.234 170.701 403.444 170.911C403.374 170.213 403.094 168.747 404.216 169.235C404.075 169.096 402.883 168.328 403.444 168.188C404.075 168.049 404.146 167.211 403.444 167.071C403.585 166.862 403.655 166.582 403.795 166.443C403.865 166.164 403.725 165.884 403.725 165.605ZM434.16 205.609C433.389 204.911 434.441 203.933 433.178 203.514C433.038 203.445 432.407 204.352 432.267 203.863C432.056 203.235 431.916 202.677 431.706 202.118C431.355 201.071 431.425 200.442 430.514 199.954C430.163 199.744 427.708 198.627 427.708 198.278C427.708 197.231 427.989 196.114 427.288 195.346C426.376 194.299 426.446 193.81 426.376 192.344C426.306 191.367 425.184 190.878 424.553 191.436C424.202 189.272 423.641 187.666 422.8 185.642C421.748 185.851 421.677 187.736 421.467 188.644C421.187 189.621 421.397 190.808 421.467 191.855C421.537 193.112 420.836 197.022 419.083 196.393C418.452 196.184 417.961 195.137 417.33 194.718C416.208 194.02 415.085 193.391 413.963 192.693C412.912 192.065 413.332 191.716 413.683 190.459C413.893 189.412 414.524 188.923 415.156 188.155C414.104 187.108 413.823 187.038 412.421 186.898C411.299 186.759 410.247 186.619 409.125 186.619C409.195 187.108 409.195 187.666 409.265 188.155C408.003 187.946 406.951 187.317 406.179 188.434C405.408 189.551 405.198 190.599 404.917 191.925C403.865 191.367 402.813 190.808 401.761 190.25C401.411 190.04 400.078 191.506 399.798 191.785C398.115 193.252 395.8 194.508 394.889 196.742C394.468 197.859 394.468 198.837 393.346 199.116C391.873 199.465 390.401 199.814 388.928 200.093C387.946 200.303 387.385 200.722 386.473 201.42C385.351 202.188 385.211 202.467 384.65 203.863C384.44 203.375 384.299 202.956 384.089 202.537C383.388 204.352 382.897 205.818 383.598 207.633C384.019 208.681 383.879 208.89 383.528 210.007C383.248 210.775 383.809 211.403 384.089 212.102C384.931 213.917 385.492 215.592 385.772 217.617C385.912 218.385 386.544 220.34 386.263 220.968C386.193 221.177 384.51 222.155 385.351 222.713C385.983 223.202 386.754 224.179 387.595 224.179C388.437 224.179 389.419 224.459 390.05 223.83C390.962 222.923 391.242 222.574 392.434 222.434C393.276 222.364 394.117 222.225 395.029 222.225C395.66 222.225 396.361 222.155 396.993 222.155C397.203 222.155 397.483 221.247 397.624 221.038C397.974 220.34 399.237 220.06 399.938 219.711C400.639 219.362 401.691 219.921 402.322 219.502C402.813 219.223 403.865 218.245 404.426 218.315C406.46 218.594 408.283 218.804 410.177 219.502C411.369 219.991 411.509 220.2 412.14 221.457C412.561 222.294 413.052 222.993 413.543 223.761C414.665 222.504 415.576 221.457 416.348 219.991C416.839 221.526 415.857 222.713 415.086 224.04C416.348 224.319 416.278 223.621 416.909 222.364C416.979 223.132 416.769 225.017 417.54 225.017C418.241 225.017 418.732 226.483 418.872 227.112C419.363 229.276 420.906 229.904 422.8 230.184C423.992 230.393 424.202 230.533 425.114 229.695C426.166 228.787 426.096 229.206 427.007 230.253C427.428 230.742 428.55 230.393 428.971 229.974C429.953 228.997 430.093 228.927 431.355 228.857C433.529 228.787 433.319 225.855 433.669 224.04C433.95 222.434 435.703 221.247 436.124 219.711C436.615 217.826 437.526 215.592 437.596 213.637C437.667 211.822 437.035 209.658 436.755 207.843C435.843 207.145 435.002 206.377 434.16 205.609ZM400.148 174.402C399.728 175.589 401.691 175.1 401.972 174.96C402.042 174.262 400.429 173.634 400.148 174.402ZM407.231 186.48C406.53 186.968 405.759 185.991 405.688 187.248C406.249 187.248 406.881 187.527 407.301 187.248C407.722 186.968 407.932 186.27 407.231 186.48ZM436.825 176.845C437.176 176.147 437.246 176.077 436.825 175.449C436.755 175.379 436.474 175.519 436.404 175.379C436.334 175.239 436.194 174.96 436.054 174.821C435.422 174.262 434.581 173.913 433.88 173.424C433.599 174.262 436.825 174.681 436.474 176.217C436.545 176.426 436.685 176.636 436.825 176.845ZM429.953 233.884C429.532 234.023 428.269 234.861 427.919 234.652C427.218 234.303 426.446 234.023 425.745 233.674C425.605 234.791 425.745 236.188 426.166 237.235C426.727 238.561 427.358 238.84 428.62 239.12C429.953 239.329 431.425 234.372 429.953 233.884ZM432.126 177.823C431.565 177.823 431.004 177.683 430.514 177.892C430.864 178.73 432.547 179.219 433.319 179.009C433.95 178.87 434.721 178.591 434.932 177.962C435.002 177.753 436.194 177.823 435.493 177.055C436.474 176.845 436.054 176.007 435.493 175.658C434.721 175.17 434.932 176.496 434.932 176.915C434.861 176.915 432.407 178.66 433.038 177.194C432.968 177.055 432.617 177.823 432.126 177.823ZM427.077 177.683C426.657 177.194 426.937 176.426 426.306 176.077C425.675 175.728 425.114 175.309 424.483 174.96C423.571 174.402 422.379 174.122 421.397 173.773C419.854 173.215 418.311 172.586 416.698 172.028C415.927 171.749 414.735 172.307 414.244 173.005C414.034 173.215 413.262 174.611 412.982 174.471C412.351 174.122 412 174.122 411.719 173.424C411.439 172.656 411.228 172.028 411.158 171.19C411.018 170.283 410.808 170.492 410.036 170.283C408.774 170.003 407.512 170.283 406.881 171.539C407.301 171.609 407.722 171.679 408.213 171.749C408.423 171.819 408.213 172.517 408.493 172.656C409.195 173.075 410.177 172.796 410.948 172.796C410.948 172.936 410.948 173.285 410.878 173.424C409.896 173.075 409.335 173.285 408.283 173.494C408.704 174.192 409.125 174.96 409.545 175.658C409.896 175.17 410.317 174.751 410.667 174.262C410.878 175.379 410.878 175.309 411.789 175.728C412.841 176.217 413.963 176.636 415.015 177.055C415.436 177.264 416.558 177.473 416.769 177.962C417.119 178.8 417.47 179.708 417.82 180.545C416.558 180.894 416.418 180.755 416.278 182.151C417.259 182.081 418.171 181.942 419.153 181.872C419.644 181.802 419.994 183.338 420.626 183.338C421.607 183.408 422.589 183.687 423.431 183.059C423.922 182.779 424.132 181.243 424.623 181.313C425.184 181.383 426.797 181.313 427.218 181.732C427.989 182.57 428.76 183.338 429.532 184.176C430.163 184.804 430.934 184.734 431.776 184.874C432.337 184.944 433.249 185.642 433.669 185.502C433.319 185.153 432.197 184.385 432.758 183.896C432.267 183.757 431.495 183.827 431.846 183.059C430.584 182.989 430.654 182.71 430.023 181.523C429.882 181.243 429.321 181.034 429.041 180.825C428.76 180.685 428.69 179.987 428.55 179.708C428.971 179.638 429.392 179.638 429.742 179.568C430.023 177.892 427.779 178.451 427.077 177.683ZM422.168 86.2957C422.168 87.2731 422.238 88.1109 421.888 88.9486C421.397 90.0657 421.748 90.0657 422.028 91.1827C422.168 91.8809 422.168 91.8809 421.748 92.5092C421.537 92.7884 421.818 93.2772 421.818 93.6262C421.818 94.6734 421.607 94.9527 422.028 95.9999C422.168 95.4414 422.168 94.5338 422.87 94.3942C423.571 94.2545 423.922 95.1621 423.851 95.7207C424.483 95.0225 423.711 93.9753 423.361 93.2772C422.87 92.4394 422.589 92.2997 422.87 91.3223C423.29 90.0657 423.15 89.6468 424.342 89.4373C425.114 89.2977 425.044 90.6242 425.815 90.6242C425.184 89.5072 424.903 88.5298 424.553 87.2033C424.412 86.575 424.272 86.0164 424.062 85.3881C423.992 84.9692 423.501 84.6899 423.431 84.2711C423.22 82.9446 424.272 82.3163 423.571 80.9898C423.22 80.2916 423.641 78.4066 422.379 79.3142C422.87 79.8029 423.15 80.5709 422.659 80.9898C422.449 81.1992 422.379 80.7803 421.958 81.0596C421.537 81.4087 421.677 81.4087 421.818 81.9672C421.958 82.5955 421.607 83.6427 421.467 84.2711C421.467 85.1787 422.87 85.5277 422.168 86.2957ZM397.554 155.272C398.185 155.412 398.605 154.435 397.764 154.365C397.554 154.574 396.782 155.133 397.554 155.272ZM396.572 155.482C396.642 154.854 396.993 154.365 397.413 154.016C397.694 153.806 397.483 152.969 397.624 152.62C397.554 152.689 397.483 152.689 397.413 152.759C397.203 153.597 396.432 154.644 396.572 155.482ZM398.816 152.48C398.465 152.689 398.115 152.55 397.904 152.27C397.974 152.689 397.904 153.038 398.115 153.318C398.676 152.829 398.255 154.295 398.886 154.644C398.886 154.435 398.886 154.155 398.816 153.946C398.886 154.155 399.026 154.295 399.096 154.505C399.447 154.016 398.746 153.248 398.816 152.48ZM396.782 151.293C396.922 151.642 397.203 151.921 397.483 152.061C397.554 151.852 397.554 151.433 397.554 151.223C396.993 151.293 397.133 150.595 396.361 150.665C396.572 151.014 396.502 151.433 396.151 151.712C396.361 151.572 396.642 151.433 396.782 151.293ZM397.834 150.804C397.834 151.363 398.255 151.502 398.605 151.782C399.026 152.131 398.535 152.201 398.816 152.55C399.728 153.737 399.657 152.131 399.517 151.363C399.307 150.455 398.465 150.735 397.834 150.804ZM394.538 151.921C394.678 153.457 394.468 154.505 396.081 153.806C395.66 154.365 394.748 155.203 395.59 155.622C395.941 155.761 395.8 156.25 396.221 156.18C396.642 156.11 396.432 155.552 396.432 155.133C396.432 154.574 397.133 153.527 396.922 153.178C396.432 152.34 396.151 152.27 395.31 151.921C395.099 151.852 394.748 151.921 394.538 151.921ZM391.032 171.469C390.821 172.028 390.962 172.447 390.681 173.005C390.26 173.843 390.05 173.913 390.541 174.681C390.821 175.1 391.593 174.541 391.382 175.519C391.312 175.938 390.891 177.543 391.032 177.823C391.242 178.102 392.294 178.311 392.504 177.892C392.575 177.753 392.294 177.194 392.294 176.985C392.294 176.706 392.574 176.496 392.574 176.287C392.645 175.798 392.504 175.1 392.574 174.541C392.645 173.983 391.873 173.564 392.995 173.424C393.626 173.354 393.136 174.471 393.206 174.751C393.416 175.379 394.187 175.309 393.977 175.938C393.767 176.636 394.258 176.775 394.748 176.636C394.468 176.706 395.871 175.589 395.73 175.938C396.151 175.03 395.169 175.519 394.889 174.821C394.819 174.681 395.309 174.332 395.169 174.122C395.029 173.773 394.819 173.494 394.678 173.145C394.398 172.656 394.117 172.656 393.767 172.237C395.029 172.726 395.45 170.213 396.572 170.911C396.852 169.794 395.941 170.492 395.52 170.492C395.029 170.492 394.959 170.701 394.608 170.841C394.117 170.981 394.398 170.422 393.907 170.911C392.715 172.168 391.452 169.934 392.364 168.816C392.785 168.258 393.346 168.886 393.977 168.816C394.678 168.747 395.52 168.467 396.151 168.816C397.694 169.724 398.535 168.049 399.026 166.722C398.395 166.722 397.904 167.699 397.343 168.118C397.063 168.328 396.502 167.979 396.151 167.909C395.73 167.909 395.8 168.188 395.31 167.979C394.678 167.769 393.556 167.071 392.925 167.49C392.154 167.979 391.943 168.467 391.523 169.375C392.154 170.422 391.312 170.771 391.032 171.469ZM392.504 149.408C392.925 150.106 393.276 150.735 393.697 151.433C394.468 150.525 394.398 150.036 393.486 149.408C393.135 149.408 392.855 149.408 392.504 149.408ZM384.86 181.732C384.86 182.5 385.422 183.128 385.983 182.43C386.544 181.662 385.351 181.523 384.86 181.732ZM419.854 100.328C419.784 100.608 419.784 101.236 419.574 101.376C419.083 101.655 419.013 101.655 418.872 102.144C418.802 102.283 419.363 103.889 419.504 103.959C419.714 104.029 419.924 103.33 420.205 103.4C420.415 103.47 420.906 103.47 420.626 103.121C420.345 102.632 419.433 102.981 419.574 102.074C419.994 101.934 420.485 102.353 420.696 102.283C420.906 102.144 421.537 101.795 421.748 102.004C422.098 102.353 423.15 103.261 423.641 103.051C423.641 103.051 423.922 102.004 423.992 101.864C424.132 101.655 424.763 101.306 425.044 101.306C425.815 101.306 426.446 101.236 427.007 100.538C425.535 100.608 426.657 99.351 426.446 98.7227C425.394 99.7699 425.394 99.4906 424.062 98.8623C423.15 98.3736 422.729 97.5358 422.028 96.6981C421.257 95.581 421.537 98.0245 421.677 98.3736C421.818 98.7925 421.116 99.1416 421.116 99.6303C421.116 100.049 421.187 100.328 420.976 100.677C420.696 100.538 420.275 100.468 419.854 100.328ZM242.151 76.9405C242.221 77.2896 242.782 78.0576 243.133 77.9878C243.623 77.8481 243.553 77.15 243.133 77.0802C242.992 76.5915 242.571 76.7311 242.151 76.9405ZM275.882 113.942C275.461 114.152 274.76 114.64 274.339 114.571C274.059 114.571 273.007 114.291 272.797 114.71C272.095 116.107 274.97 115.269 275.251 115.199C274.83 114.64 275.461 114.361 275.882 113.942ZM264.592 115.059C264.592 114.571 263.61 114.361 263.119 114.431C262.207 114.571 261.927 114.361 261.155 113.872C261.015 114.012 260.875 114.361 260.805 114.571C262.207 115.059 263.189 115.129 264.592 115.059ZM243.974 76.7311C243.834 77.0802 243.974 77.7783 244.465 77.7783C245.026 77.7085 244.956 78.1972 245.026 78.7557C245.096 78.1274 245.026 77.4292 245.797 77.3594C245.657 77.2896 245.517 77.0104 245.377 76.9405C247.27 76.5915 244.184 74.8461 245.096 76.6613C244.675 76.6613 244.535 76.4518 244.745 76.033C244.605 76.033 244.395 76.033 244.255 76.033C244.395 76.3122 244.325 76.5217 243.974 76.7311ZM260.664 70.5874C259.753 70.3082 259.402 70.378 258.42 70.6572C258.771 71.0063 258.981 71.3554 258.771 71.9139C259.192 71.1459 260.033 71.0063 260.664 70.5874ZM240.538 105.914C240.608 106.123 240.187 106.472 240.187 106.751C240.187 106.891 240.538 107.031 240.538 107.17C240.468 107.799 239.907 107.868 240.398 108.357C240.818 108.706 241.239 108.776 241.309 108.148C241.309 107.799 241.87 108.148 241.94 107.449C242.01 106.751 242.081 106.053 242.221 105.355C242.361 103.959 240.748 104.797 240.398 105.076C240.257 105.006 240.117 105.006 239.977 104.936C239.696 105.634 240.468 105.425 240.538 105.914ZM486.405 58.7189C486.125 58.7189 484.933 58.4397 484.722 58.6491C484.442 58.9284 484.722 59.5567 484.933 59.7662C485.704 60.3945 486.686 59.4869 487.177 60.1152C487.738 60.8134 488.649 61.0926 489 59.9058C488.229 59.4869 487.247 58.7189 486.405 58.7189ZM253.441 73.9385C253.722 73.5196 254.143 73.2404 254.563 73.0309C254.143 72.5422 254.493 72.263 254.844 71.8441C253.511 71.495 253.371 72.8913 253.441 73.9385ZM256.316 67.2363C256.316 67.0967 256.246 66.9571 256.246 66.8174C256.316 66.8174 256.387 66.8174 256.457 66.8174C256.317 65.9098 255.124 66.608 256.316 67.2363ZM240.468 102.632C239.977 103.051 240.888 103.889 241.309 103.889C241.66 102.842 241.73 102.283 241.59 101.166C241.169 101.236 241.52 101.585 241.309 101.864C241.169 102.144 240.748 102.353 240.468 102.632ZM440.051 178.451C439.7 178.241 439.77 177.683 439.139 177.543C439.139 178.032 439.139 178.311 439.42 178.591C439.63 178.87 439.56 179.219 439.7 179.428C439.981 179.777 441.243 180.126 440.822 179.219C440.612 178.94 440.331 178.591 440.051 178.451ZM410.738 117.712C410.948 117.642 411.228 118.271 411.369 118.061C411.509 117.852 412 117.363 412.07 117.154C412.14 115.478 409.966 116.944 409.616 116.665C409.125 117.712 408.704 117.503 409.125 118.829C409.966 119.388 410.106 117.992 410.738 117.712ZM402.743 174.332C402.112 175.17 403.374 175.17 403.725 175.1C404.005 175.1 403.865 174.471 404.146 174.611C404.426 174.681 404.777 174.96 405.057 174.89C405.899 174.681 406.109 174.96 406.81 175.449C407.091 173.983 405.548 173.913 404.707 173.634C403.935 173.773 403.234 173.704 402.743 174.332ZM464.385 235.071C464.385 234.512 464.175 234.023 463.964 233.535C463.333 233.884 463.053 233.884 462.913 234.652C462.702 235.42 462.492 235.071 462.071 235.629C461.79 236.048 461.861 236.746 461.58 237.165C461.3 237.584 460.668 237.933 460.318 238.282C459.897 238.631 459.546 239.05 459.055 239.259C458.705 239.399 457.933 239.608 457.653 239.888C456.882 240.935 456.11 241.912 455.339 242.96C454.567 244.007 456.882 243.728 457.162 244.077C457.653 244.635 459.266 245.194 459.757 244.356C460.248 243.518 461.229 242.471 461.51 241.493C461.861 240.097 462.352 239.888 463.474 239.12C463.544 239.469 463.754 239.678 464.105 239.678C463.684 238.84 463.614 238.771 464.175 238.003C464.736 237.235 465.297 236.537 465.858 235.838C465.718 235.28 465.507 234.791 465.367 234.233C465.086 234.512 464.736 234.791 464.385 235.071ZM457.162 244.705C456.741 244.845 457.022 245.403 456.671 245.822C457.162 245.403 458.354 245.613 457.162 244.705ZM471.117 228.438C469.995 229.136 469.855 229.066 468.593 228.717C467.821 228.508 468.312 227.112 467.541 226.763C467.611 227.531 467.12 228.159 466.629 227.181C466.489 226.902 466.77 226.413 466.559 226.134C466.419 225.925 466.138 225.646 465.998 225.366C465.647 224.319 466.279 224.459 465.086 224.04C464.525 223.83 464.245 223.272 463.684 223.132C463.964 223.761 464.245 224.319 464.525 224.947C464.666 224.878 464.736 224.808 464.876 224.668C465.157 225.296 465.858 227.67 466.559 227.461C466.279 228.229 466.84 228.927 466.559 229.625C466.209 230.602 466.068 230.882 465.227 231.51C465.507 231.789 465.858 232.138 466.209 232.348C466.419 232.487 467.12 232.487 467.26 232.697C467.681 233.465 466.699 234.442 466.349 234.861C467.05 235.28 467.821 235.699 468.383 234.582C468.803 233.674 469.645 232.627 469.645 231.65C469.645 231.021 470.346 230.951 470.697 231.161C471.117 231.37 470.767 230.812 470.907 230.672C471.328 230.114 472.169 228.578 471.117 228.438ZM232.193 107.17C232.473 107.38 232.754 107.589 233.034 107.799C233.245 107.589 233.525 107.38 233.735 107.17C233.245 106.263 232.894 106.682 232.193 107.17ZM484.021 54.181C484.021 55.0886 484.161 55.3678 483.39 55.7169C482.829 55.9962 483.32 56.8339 483.46 57.3925C482.478 57.2528 482.128 57.1132 481.286 56.4849C480.795 56.1358 479.673 56.7641 479.533 56.1358C479.322 55.2282 479.463 54.3904 478.551 54.3206C477.569 54.2508 476.587 54.181 475.676 54.1112C475.115 54.0414 476.096 52.3658 474.834 52.5753C474.203 52.7149 474.413 54.3206 474.413 54.949C474.343 55.9962 471.117 56.2754 470.276 56.4849C471.047 57.0434 471.889 57.2528 471.959 58.3001C472.029 59.4869 472.52 59.9756 473.151 60.953C473.221 61.0228 472.66 61.7908 472.52 61.7908C472.24 61.8606 471.608 61.5813 471.328 61.5813C470.837 61.5115 469.785 61.0228 469.364 61.3021C467.611 62.3493 465.788 63.4663 464.035 64.5135C462.632 65.3513 461.159 65.84 460.528 67.3759C459.266 66.1891 459.196 65.9797 457.583 66.1891C456.04 66.3985 455.97 66.4684 454.988 67.8646C454.988 67.3759 454.988 66.8872 454.918 66.3985C454.427 66.608 453.586 67.3061 453.025 67.2363C452.393 67.1665 451.762 66.8174 451.341 67.4458C450.43 68.842 449.588 70.3082 448.677 71.7044C449.168 71.8441 450.78 72.0535 450.64 72.612C450.29 74.0083 450.219 74.0083 451.061 75.1254C449.658 75.7537 448.466 76.3122 449.168 78.1274C449.308 78.4066 448.116 78.8953 447.765 78.9652C447.064 79.1746 446.503 79.1048 446.433 79.9426C446.362 80.8502 446.643 81.6879 445.731 81.8974C444.609 82.1766 444.539 82.037 444.399 83.2937C444.188 84.4805 442.716 85.7372 441.944 86.6448C441.033 82.3861 437.947 74.3574 443.066 71.8441C444.539 71.1459 445.381 70.9365 446.222 69.4704C446.994 68.0741 447.975 67.5156 449.168 66.608C450.009 65.9797 451.201 65.6306 451.412 64.5135C451.622 63.6758 451.832 62.838 452.043 62.0002C452.113 61.7908 453.235 61.721 453.445 61.6512C452.604 61.4417 452.113 61.3719 451.271 61.4417C450.64 61.5115 450.29 62.4889 449.939 63.0474C449.238 64.1645 447.765 65.0023 446.783 65.7702C446.292 64.5135 446.433 64.0248 446.713 62.6286C445.801 63.1871 445.381 63.3965 444.329 63.3965C443.277 63.3965 442.996 63.3267 442.155 64.0248C440.822 65.0721 439.7 66.3287 438.578 67.6552C438.929 67.9345 439.841 68.3533 439.56 68.842C439.49 69.0515 438.228 69.1213 438.017 69.1213C436.755 69.2609 435.563 69.4006 434.3 69.5402C434.721 69.1911 435.212 68.9119 435.633 68.5628C434.441 68.3533 433.249 68.0741 432.126 67.8646C431.776 67.7948 431.004 68.493 430.724 68.7024C430.373 68.9119 429.882 68.7024 429.462 68.6326C428.34 68.4232 427.428 68.4232 426.306 68.493C425.605 68.493 423.641 68.2137 423.15 68.7024C421.327 70.378 419.504 72.0535 417.75 73.8687C416.137 75.5443 414.314 76.7311 412.421 78.0576C412.701 78.6859 413.122 78.6161 413.613 78.6859C414.314 78.7557 414.384 78.6161 414.665 79.3142C414.735 79.5237 415.015 80.5709 415.226 80.5709C416.628 80.7105 416.769 80.92 417.4 79.5237C417.961 78.3368 421.327 81.0596 421.187 82.037C420.766 84.2013 420.275 86.3655 419.784 88.5996C419.293 90.6242 418.592 91.7412 417.47 93.5564C416.418 95.2319 415.576 96.8377 414.174 98.1642C413.262 99.0718 412.35 99.9793 411.369 100.887C410.878 101.376 409.826 101.376 409.125 101.515C408.774 101.585 408.493 100.608 408.213 100.608C408.003 100.538 407.231 101.166 407.021 101.306C405.969 101.934 405.969 102.213 405.548 103.47C404.917 105.425 403.374 106.472 401.972 107.799C403.514 109.125 404.917 110.591 404.566 112.895C404.356 114.431 404.566 114.78 403.304 115.408C402.252 115.967 401.691 115.897 400.499 115.897C400.639 115.059 400.709 114.152 400.85 113.314C400.99 112.337 400.078 112.406 400.85 111.499C401.34 110.94 401.06 110.172 400.359 110.242C399.728 110.312 398.676 110.731 398.465 109.753C398.325 109.265 399.026 107.938 399.167 107.449C399.167 107.38 397.764 106.402 397.554 106.472C396.993 106.472 396.011 107.38 395.59 107.659C394.959 108.078 394.258 108.427 393.626 108.846C393.136 107.519 394.328 106.612 395.099 105.774C394.258 105.146 394.258 104.936 393.346 105.355C392.715 105.634 392.294 106.053 391.733 106.472C391.032 107.031 390.681 107.38 389.84 107.659C389.699 107.729 388.297 108.217 388.647 108.636C389.208 109.195 389.699 109.753 390.12 110.452C390.751 111.429 390.681 111.289 391.593 110.801C392.995 110.102 394.047 110.731 395.45 111.08C393.837 112.406 392.294 113.733 390.681 115.129C391.382 115.688 392.224 116.176 392.574 117.084C393.065 118.201 393.556 119.248 394.117 120.365C393.276 120.226 392.504 120.086 391.663 119.946C392.504 120.575 393.416 121.203 394.258 121.831C393.626 122.25 392.995 122.739 392.364 123.228C393.136 123.437 393.977 123.716 394.748 123.926C393.767 125.741 392.925 128.045 391.663 129.651C390.33 131.326 389.279 133.211 387.315 134.049C385.211 134.887 383.177 135.794 381.003 136.562C380.372 136.772 379.671 137.051 379.04 137.26C378.479 137.47 378.619 137.47 378.759 138.098C378.829 138.517 378.829 139.355 378.128 139.006C377.918 138.936 377.707 137.958 377.637 137.679C377.848 137.609 378.058 137.4 378.339 137.4C377.637 136.841 376.305 136.423 375.463 137.051C374.762 137.609 373.079 138.447 372.798 139.355C372.728 139.634 372.167 140.821 372.308 141.1C372.728 141.728 373.149 142.427 373.57 143.055C374.131 144.032 374.902 144.87 375.604 145.708C376.445 146.825 376.936 147.174 377.006 148.57C377.076 149.408 377.497 151.433 376.866 152.061C375.043 153.737 373.289 155.272 371.326 156.739C370.695 156.11 371.606 155.063 371.115 154.574C370.484 153.876 369.853 153.248 369.222 152.55C368.1 151.363 367.258 150.665 365.716 150.595C365.786 150.246 365.786 149.827 365.856 149.478C364.383 149.548 364.664 149.757 364.523 151.363C364.453 152.34 363.962 153.248 363.612 154.086C363.472 154.435 363.612 154.923 363.612 155.272C363.682 156.04 363.682 155.901 364.383 155.901C364.734 155.901 365.225 158.274 365.365 158.693C365.575 159.392 366.978 160.09 367.539 160.509C368.03 160.858 368.941 161.765 369.152 162.324C369.503 163.162 369.152 164.348 369.362 165.256C369.573 166.094 370.064 166.932 370.344 167.769C369.082 167.56 368.31 166.792 367.329 165.954C366.347 165.186 366.277 164.767 365.926 163.511C365.645 162.673 365.365 160.718 364.804 160.09C363.892 159.112 363.051 158.205 362.139 157.227C361.718 156.808 362.279 154.435 362.35 153.806C362.49 152.62 362.209 151.223 362.139 150.036C361.999 147.663 361.227 145.638 360.526 143.334C360.035 143.893 359.544 144.521 359.124 145.08C358.492 145.848 358.563 145.778 357.651 145.568C356.669 145.359 356.739 145.429 356.95 144.381C357.02 143.963 357.37 142.776 357.23 142.357C356.599 140.891 356.248 139.564 355.056 138.657C354.004 137.819 353.654 136.353 353.093 135.096C352.532 135.445 351.83 136.283 351.199 136.353C350.077 136.492 348.955 136.632 347.903 136.841C347.763 136.841 347.062 136.841 346.921 136.981C346.711 137.19 347.062 137.958 346.851 138.168C346.29 138.726 345.799 139.285 345.238 139.843C343.696 141.449 342.153 142.985 340.61 144.591C340.119 145.149 338.997 145.359 338.366 145.708C337.524 146.127 337.875 146.685 337.875 147.663C337.875 148.5 338.155 149.687 337.945 150.525C337.735 151.293 337.104 152.48 337.314 153.248C337.594 154.505 337.805 154.993 338.576 155.901C339.277 156.669 339.558 157.507 339.979 158.484C340.75 160.229 337.735 161.765 337.524 159.392C337.384 158.344 337.384 157.367 337.454 156.32C337.524 155.272 337.104 155.133 336.402 154.435C336.332 155.133 336.472 155.901 335.841 156.25C335.21 156.669 334.579 157.088 333.948 157.507C332.195 154.225 330.722 150.874 329.249 147.453C328.828 146.546 328.197 145.498 327.987 144.591C327.847 143.893 327.917 142.985 327.917 142.287C327.847 140.123 327.777 137.889 327.706 135.724C327.216 136.353 326.795 136.981 326.304 137.609C325.813 138.238 325.813 138.168 325.042 138.098C324.2 138.098 323.218 136.423 322.587 135.794C323.218 135.655 324.481 135.724 324.621 134.887C324.27 134.887 323.849 135.026 323.499 134.956C322.587 134.747 321.605 133.909 320.764 133.421C320.203 133.071 319.852 131.675 319.572 131.047C319.291 130.418 314.593 131.396 313.821 131.536C312.068 131.745 310.385 131.047 308.702 130.698C307.93 130.558 307.089 130.628 306.738 129.86C306.037 128.533 306.247 128.115 304.915 128.603C303.793 129.022 303.092 128.883 301.899 128.673C301.198 128.533 300.707 127.626 300.006 127.347C298.814 126.788 298.674 126.649 298.113 125.392C297.692 124.554 297.552 123.437 296.64 123.297C295.097 123.088 295.097 123.158 294.045 124.414C293.695 124.833 294.957 126.439 295.237 126.858C296.219 128.464 297.061 130.209 297.902 131.815C298.042 131.047 298.113 130.279 298.253 129.581C298.884 130.698 298.744 131.815 298.814 133.141C299.936 133.071 301.759 133.281 302.811 132.653C303.793 132.024 304.775 130.488 305.546 129.511C305.616 130.488 305.406 132.024 306.177 132.513C306.598 132.792 307.089 133.281 307.65 133.49C308.071 133.7 308.632 133.49 308.912 133.979C309.123 134.328 309.403 135.305 309.824 135.375C310.525 135.515 310.245 135.934 310.175 136.632C310.104 137.33 308.702 138.517 308.281 139.006C308.281 138.796 308.071 138.587 308.071 138.377C307.72 139.215 307.51 139.634 307.51 140.611C307.51 141.449 307.229 141.379 306.528 141.659C305.827 142.008 305.125 142.357 304.424 142.636C304.003 142.845 304.003 144.032 303.583 144.242C303.232 144.381 302.741 143.963 302.39 144.102C301.899 144.312 301.338 144.591 300.848 144.8C300.146 145.149 300.216 146.057 299.585 146.336C298.393 146.755 297.201 147.174 296.079 147.593C295.728 147.732 295.658 147.872 295.448 148.221C295.167 148.64 294.817 148.64 294.326 148.71C293.274 148.919 292.292 149.199 291.31 149.478C290.539 149.687 290.399 150.525 289.627 150.525C288.365 150.525 288.225 150.804 288.014 149.478C287.734 148.151 287.523 146.825 287.243 145.498C286.822 143.474 285.84 142.078 284.788 140.332C284.157 139.285 284.087 139.076 282.965 138.657C282.334 138.447 282.334 136.492 282.194 135.864C282.053 134.887 281.352 133.979 280.931 133.071C280.651 132.513 280.02 132.303 279.739 131.675C279.038 130.418 278.337 129.162 277.635 127.905C277.285 127.277 277.004 126.23 276.163 126.439C276.233 125.671 276.373 124.903 276.443 124.135C276.163 125.043 275.812 125.95 275.531 126.928C274.48 125.811 273.919 124.833 273.217 123.437C272.446 124.345 273.778 125.95 274.199 126.788C275.041 128.533 275.882 130.279 276.794 132.024C277.285 133.071 277.144 134.258 277.916 135.026C278.266 135.375 279.038 135.934 279.108 136.423C279.248 137.33 279.389 138.168 279.529 139.075C279.599 139.564 279.529 140.611 279.95 140.96C280.44 141.449 281.142 141.938 281.562 142.496C282.264 143.613 282.614 145.359 283.105 146.615C283.246 147.034 284.508 146.965 284.788 147.314C285.279 147.872 285.77 148.431 286.191 148.989C286.962 149.897 288.575 150.944 287.383 152.131C288.225 152.41 289.136 154.086 289.838 153.946C292.152 153.318 294.466 152.689 296.71 152.131C297.131 151.991 298.393 151.502 298.744 152.131C298.954 152.48 298.183 154.714 298.042 155.203C297.622 157.018 296.289 158.763 295.448 160.369C294.676 161.765 294.115 163.231 293.063 164.348C290.258 167.281 287.032 169.934 284.929 173.494C284.438 174.262 281.492 178.311 281.983 179.009C282.825 180.266 282.825 180.476 282.755 182.011C282.685 183.408 282.755 183.478 283.526 184.595C284.788 186.27 284.368 188.853 284.438 191.018C284.508 192.553 283.246 194.369 281.983 194.997C281.282 195.346 279.879 195.695 279.318 196.254C278.617 197.091 277.916 197.859 277.215 198.697C276.583 199.395 275.882 199.744 276.233 200.652C276.513 201.28 277.425 202.677 277.355 203.375C277.285 204.143 277.425 206.028 277.004 206.656C276.654 207.214 274.9 207.633 274.339 207.913C273.358 208.401 273.568 208.82 273.428 210.007C273.358 210.635 273.498 212.381 273.147 212.869C272.025 214.475 270.903 216.43 269.571 217.896C268.869 218.664 267.958 219.292 267.186 219.921C266.766 220.27 265.924 221.387 265.293 221.526C263.259 221.945 261.155 222.364 259.122 222.783C258.21 222.993 257.228 223.202 256.246 223.411C255.755 223.481 254.844 222.294 254.563 222.015C253.441 221.038 253.511 221.038 253.652 219.432C253.722 218.804 253.021 217.757 252.81 217.198C252.319 216.011 251.828 214.824 251.337 213.637C251.057 212.939 250.145 212.381 249.654 211.892C249.304 211.543 249.304 209.867 249.234 209.379C249.023 207.982 248.813 206.656 248.602 205.33C248.322 203.514 247.41 202.048 246.569 200.442C246.008 199.395 245.517 198.348 245.026 197.231C244.816 196.742 245.096 195.905 245.166 195.416C245.517 193.112 245.587 190.878 246.709 188.853C247.831 186.898 247.13 185.363 246.639 183.338C246.148 181.174 245.587 179.009 245.096 176.845C244.956 176.217 244.044 175.379 243.694 174.89C242.922 173.913 242.221 172.936 241.449 171.888C241.029 171.33 241.309 170.632 241.449 170.003C241.59 168.677 241.73 167.281 241.94 165.954C242.081 164.767 242.151 164.697 241.449 163.79C240.678 162.743 240.748 162.603 239.486 162.743C238.785 162.743 237.382 163.231 236.891 162.603C236.19 161.765 235.489 160.858 234.787 160.02C234.507 159.671 230.159 160.299 229.598 160.578C228.546 161.067 227.564 161.626 226.512 162.114C225.741 162.533 225.32 162.324 224.479 162.114C223.567 161.905 223.006 161.626 222.094 161.905C220.972 162.324 219.85 162.673 218.728 163.092C218.167 163.301 217.606 162.533 217.185 162.254C216.133 161.486 215.011 160.718 213.959 159.95C212.627 158.973 211.926 158.484 211.084 157.018C209.682 154.644 208.349 152.27 206.947 149.897C206.526 149.129 206.105 148.361 205.614 147.593C205.404 147.244 206.175 145.917 206.245 145.568C206.456 144.94 207.157 143.753 207.017 143.055C206.736 141.938 206.526 140.821 206.245 139.634C206.105 138.866 205.474 137.54 205.614 136.702C205.684 136.213 206.245 135.515 206.456 135.096C207.788 132.722 209.121 130.349 210.453 127.975C211.365 126.299 212.487 125.811 214.1 124.833C214.941 124.345 215.292 124.275 215.432 123.297C215.642 122.041 215.783 120.784 215.993 119.527C216.204 118.061 219.219 117.782 219.78 116.316C220.201 115.339 220.341 113.872 221.393 113.593C221.673 113.523 222.375 114.92 223.216 114.71C223.567 114.64 224.408 114.291 224.759 114.431C224.969 114.571 225.671 115.059 225.881 114.989C226.653 114.501 227.494 113.942 228.336 113.523C229.878 112.825 231.772 112.127 233.455 111.918C233.876 111.848 234.577 111.638 234.998 111.778C235.348 111.918 235.909 112.197 236.26 112.197C236.681 112.197 237.102 111.708 237.522 111.638C237.873 111.569 238.294 111.708 238.644 111.708C239.766 111.778 240.538 111.987 241.52 111.359C242.291 110.87 243.062 111.499 243.834 111.848C243.203 113.174 243.133 113.244 243.764 114.501C244.114 115.059 242.852 115.967 242.431 116.386C243.062 116.944 243.904 118.061 244.675 118.271C246.078 118.62 247.48 119.039 248.883 119.388C249.935 119.667 249.654 120.854 250.706 121.343C251.618 121.761 252.53 121.622 253.371 122.18C254.633 123.018 255.265 123.228 256.036 121.692C256.246 121.343 255.615 120.784 255.826 120.435C255.966 120.156 256.316 119.318 256.597 119.178C257.929 118.759 258.631 118.55 260.033 118.969C260.314 119.039 260.033 119.667 260.454 119.737C261.085 119.876 261.716 120.016 262.348 120.156C262.838 120.226 262.909 120.505 263.119 120.994C263.259 121.273 263.75 120.644 263.96 120.714C264.942 120.994 265.994 121.343 266.976 121.622C268.098 121.971 268.238 121.971 269.29 121.412C270.482 120.854 270.552 120.644 271.745 121.203C273.147 121.901 275.251 121.692 275.882 119.946C276.233 118.829 278.196 115.478 277.425 114.361C276.934 113.663 277.986 112.127 277.776 111.918C277.495 111.638 277.074 112.127 276.864 112.267C276.583 112.476 276.163 111.918 275.882 111.987C275.461 112.057 275.181 112.895 274.83 113.035C274.48 113.174 273.778 113.104 273.428 113.104C272.516 113.104 272.165 112.197 271.394 112.057C270.833 111.987 270.412 111.638 270.202 112.267C269.991 112.965 269.991 112.965 269.29 113.035C268.589 113.174 267.537 112.267 266.976 111.918C265.994 111.359 264.241 108.427 265.293 107.24C264.942 107.31 264.592 107.31 264.241 107.38C264.101 106.193 265.643 105.844 266.275 105.844C267.537 105.774 268.168 105.774 269.29 105.146C268.939 105.006 268.589 104.797 268.238 104.657C268.449 104.098 269.711 104.308 270.272 104.378C271.324 104.517 271.394 104.238 272.236 103.68C272.797 103.33 273.568 102.772 274.199 102.842C275.041 102.912 275.812 103.051 276.654 102.772C276.443 103.121 276.794 103.4 277.144 103.61C277.705 103.889 277.495 103.121 278.056 103.959C278.266 104.238 279.879 104.517 280.37 104.727C281.212 105.076 281.773 104.587 282.614 104.657C283.596 104.797 284.297 104.378 285.139 103.889C285.84 103.47 285.419 102.213 284.999 101.725C284.368 101.027 283.596 100.887 282.965 100.259C282.264 99.5605 281.703 98.7227 280.721 98.583C280.651 98.583 279.879 98.0943 279.739 98.0245C279.388 97.7453 278.968 97.466 278.617 97.1868C278.687 97.1169 278.898 96.7679 278.898 96.7679C279.248 96.8377 279.599 96.9075 279.95 96.9773C279.599 95.8603 280.37 95.5112 281.212 95.5112C280.791 95.1621 280.3 94.8829 280.09 94.3942C280.44 94.3942 280.791 94.3942 281.142 94.3942C280.861 93.5564 281.913 94.1847 282.123 93.696C282.334 93.1375 281.422 93.347 281.212 93.4168C280.3 93.5564 279.388 93.5564 278.757 94.3942C278.757 94.3244 278.757 94.1847 278.757 94.1149C277.776 94.3244 277.355 94.5338 276.654 95.2319C276.724 95.0923 276.794 94.9527 276.864 94.8829C275.882 94.7432 276.303 95.9999 276.724 96.4886C277.215 97.1169 278.056 96.7679 278.898 96.7679C278.337 97.8151 277.635 97.0471 277.004 97.3962C276.303 97.7453 275.041 98.9321 274.269 98.3736C274.69 97.1169 274.129 97.2566 273.077 96.7679C273.568 96.4886 275.531 95.7905 274.199 95.3018C273.778 95.1621 273.287 95.3018 272.867 95.3018C272.586 95.3018 272.095 94.8131 271.885 94.6734C272.446 94.7433 273.147 95.0225 273.428 94.3942C272.867 94.6734 271.324 93.9753 270.973 94.3942C270.552 94.8131 269.43 95.7206 269.36 96.2792C269.29 96.6282 269.29 97.3962 269.15 97.7453C268.939 98.0245 268.168 97.9547 268.098 98.3038C267.888 99.351 267.958 100.189 267.046 100.747C266.204 101.306 266.415 102.283 266.766 103.121C267.046 103.61 268.378 104.238 268.308 104.517C268.098 105.215 266.836 104.308 266.345 104.727C265.643 105.355 265.012 105.983 264.311 106.612C264.241 105.914 264.662 105.774 265.153 105.425C264.732 105.285 264.311 105.285 263.89 105.076C263.189 104.797 262.768 105.006 262.137 104.797C261.857 104.727 261.436 105.006 261.155 105.076C260.875 105.146 261.296 105.704 261.085 105.844C260.524 106.332 260.174 105.914 259.683 105.565C259.192 106.123 259.753 106.682 260.033 107.24C260.524 108.078 260.524 107.938 259.893 108.636C260.735 109.195 261.646 109.404 261.506 110.661C261.015 110.242 260.664 109.823 260.103 110.452C260.735 110.591 260.805 111.01 260.384 111.359C259.893 111.778 260.103 111.987 260.314 112.616C259.753 112.476 259.332 112.616 259.051 112.057C258.841 111.569 258.561 111.708 258.14 112.057C257.719 110.591 257.368 110.452 258.561 109.474C257.509 109.474 257.509 109.334 256.807 108.357C256.457 107.799 256.176 106.891 255.685 106.472C254.844 105.774 255.124 105.215 255.265 104.098C255.335 103.051 254.984 103.051 254.213 102.423C253.161 101.585 251.969 100.398 250.636 100.259C250.286 100.189 249.514 99.2114 249.444 98.8623C249.163 97.8151 249.023 97.5358 248.252 96.9075C247.901 98.0245 247.48 97.466 247.34 96.6981C247.2 95.9301 247.34 96.1395 246.499 96.349C245.657 96.5584 245.166 96.6282 245.727 97.6057C245.938 97.9547 245.236 98.7227 245.867 99.1416C246.358 99.4906 247.13 99.9095 247.551 100.398C247.901 100.887 247.831 101.725 248.322 102.144C248.883 102.632 249.234 103.051 249.935 103.121C250.426 103.121 251.267 103.121 250.496 103.749C251.197 104.308 254.633 105.774 253.792 106.891C253.441 106.682 252.459 105.355 252.039 105.704C251.618 106.123 251.548 106.193 251.408 106.751C251.267 107.24 251.618 107.24 251.969 107.519C252.95 108.287 251.267 108.497 251.337 108.985C251.408 109.684 250.075 110.87 250.075 109.753C249.374 110.172 249.234 111.01 249.584 111.638C249.935 112.337 248.532 112.546 248.392 111.987C248.112 111.01 244.816 111.15 246.078 109.684C246.288 109.893 248.041 110.033 248.462 109.963C248.953 109.823 249.795 109.823 250.145 109.544C250.566 109.265 250.215 108.985 250.636 108.706C250.987 108.567 250.145 106.472 249.935 106.472C249.654 106.472 249.023 106.402 249.093 105.983C249.163 105.425 248.673 105.215 248.252 105.425C248.322 105.006 247.34 104.238 246.919 104.308C246.218 104.378 245.797 103.68 245.306 103.191C244.395 102.283 243.133 101.864 242.852 100.677C242.571 99.5605 242.571 99.4906 241.59 98.9321C241.099 98.6529 240.468 98.4434 240.117 98.9321C239.837 99.2812 237.242 101.166 236.891 101.027C236.05 100.747 235.138 100.468 234.296 100.189C233.876 100.049 233.174 100.957 232.824 101.306C232.684 101.445 233.174 102.772 232.824 103.261C232.473 103.68 231.351 104.029 230.86 104.238C229.458 104.936 229.037 106.123 228.195 107.519C227.915 107.938 229.037 108.357 228.476 109.055C228.125 109.474 227.284 110.172 227.564 110.731C227.284 110.801 226.512 110.87 226.372 111.15C226.232 111.429 225.881 112.197 225.601 112.197C224.689 112.267 223.847 112.267 222.936 112.197C222.164 112.127 221.673 113.104 221.042 113.314C220.481 113.523 219.429 112.267 220.131 111.778C219.429 112.127 219.079 110.94 218.237 111.429C217.536 111.848 217.045 111.219 216.414 111.708C216.484 111.219 216.624 110.731 216.624 110.172C216.624 109.893 216.554 109.614 216.554 109.334C216.554 109.055 216.204 109.404 216.133 109.265C215.572 108.427 215.993 108.287 216.203 107.38C216.414 106.472 217.045 105.146 216.694 104.308C216.344 103.54 216.554 102.632 216.694 101.795C216.204 102.213 215.853 101.445 216.063 100.957C216.274 100.538 217.185 100.538 217.466 100.468C217.396 100.398 217.396 100.259 217.326 100.189C218.167 99.4208 218.588 100.468 219.289 100.259C220.341 99.9793 220.692 99.9095 221.744 100.259C222.515 100.538 223.216 100.119 223.918 100.398C224.408 100.608 225.39 100.747 225.881 100.608C227.284 100.328 227.073 97.6056 227.073 96.4886C227.073 95.4414 227.214 95.0923 226.232 94.8131C225.671 94.6036 225.601 93.6262 225.671 93.2772C225.11 93.4168 225.32 93.0677 225.11 92.9979C224.899 92.8583 224.268 92.8583 224.128 92.7884C223.707 92.4394 223.567 92.2299 223.006 92.2997C222.655 92.2997 222.375 92.2997 222.164 91.8809C222.305 91.8809 222.445 91.7412 222.585 91.7412C222.234 91.6016 222.024 91.3223 222.024 90.9035C222.655 90.8336 223.286 90.9733 223.777 90.6242C224.829 89.8562 224.268 91.2525 224.899 91.0431C225.18 90.9733 226.442 90.7638 226.442 90.4147C226.372 89.7864 226.162 89.3675 225.881 88.7392C226.162 88.7392 226.653 88.6694 226.793 88.9486C226.933 89.3675 226.863 89.4373 227.284 89.4373C228.055 89.5072 228.406 89.5072 229.177 89.1581C228.967 89.1581 228.826 89.0185 228.616 89.0185C229.037 88.4599 229.738 88.2505 230.299 88.0411C231.141 87.6222 230.229 87.1335 230.65 86.4353C230.86 86.1561 232.122 85.8768 232.473 85.6674C233.104 85.3881 233.525 85.3881 234.226 85.4579C234.016 85.3881 233.315 85.3183 233.315 85.039C233.315 84.9692 233.946 84.8994 234.016 84.8296C234.156 84.69 234.016 84.4107 234.156 84.2711C234.577 83.7125 234.647 83.3635 234.857 82.5955C234.928 82.2464 235.489 82.3163 235.699 82.037C236.47 81.1294 237.172 81.6879 238.013 81.4087C238.153 81.3389 238.013 80.92 238.224 80.92C238.434 80.92 238.714 80.8502 238.925 80.7803C239.275 80.7105 239.696 80.8502 240.047 80.92C239.907 80.2218 240.468 80.4313 240.959 80.3615C240.678 80.2916 239.977 79.6633 240.327 79.384C240.888 78.8953 240.398 78.9652 240.187 78.3368C239.977 77.7085 240.398 77.3594 239.837 76.8707C239.416 76.5217 239.486 76.2424 239.486 75.6839C239.416 74.7065 239.626 73.5894 240.678 73.5196C241.449 73.5196 242.151 72.612 242.922 72.263C242.361 73.0309 242.081 74.7065 243.273 74.9857C242.571 76.033 241.309 76.4518 241.52 77.8481C241.73 78.8953 242.712 79.8029 243.694 79.3142C243.553 79.5935 243.413 79.8727 243.273 80.152C244.255 80.7105 245.026 79.3142 245.867 79.2444C246.148 79.1746 246.99 79.7331 247.06 80.0124C247.2 80.5709 247.691 80.7105 248.182 80.9898C248.252 80.8502 248.252 80.6407 248.252 80.4313C247.971 80.4313 247.691 80.3615 247.48 80.3615C248.041 80.0124 250.145 79.9426 250.566 79.384C251.197 78.4765 253.161 77.9878 254.072 78.7557C254.002 78.6859 253.652 78.6161 253.511 78.4765C253.511 79.384 254.774 79.5237 255.194 78.9652C255.405 78.7557 255.475 78.1972 255.545 78.1274C255.685 78.0576 255.896 78.1274 256.036 77.9878C256.317 77.7085 256.737 77.5689 256.948 77.2198C256.878 77.5689 256.597 77.7783 256.387 78.0576C257.929 78.8255 257.018 76.033 256.948 75.3348C256.948 74.7763 257.088 74.3574 257.439 73.9385C257.789 73.5196 257.509 72.9611 258 72.5422C259.332 71.5648 259.683 73.7291 260.664 73.7989C261.225 73.8687 261.646 73.0309 261.506 72.5422C261.436 72.1932 261.716 70.9365 261.646 70.8667C261.506 70.727 261.225 71.0761 261.085 71.0063C260.875 70.8667 260.664 70.5874 260.454 70.378C260.314 70.2383 260.033 69.0515 260.174 68.9817C261.155 68.5628 262.277 67.9345 263.329 68.0741C264.101 68.1439 264.872 68.2835 265.643 68.3533C266.695 68.493 265.784 68.0741 266.415 67.6552C266.836 67.3759 267.397 67.5854 267.888 67.2363C268.238 67.0269 269.01 67.3061 269.36 67.3759C269.15 66.6778 267.677 66.3985 267.116 66.1193C267.256 65.9797 267.256 65.7004 267.327 65.5608C265.153 65.9797 262.909 66.5382 260.664 66.9571C260.454 67.0269 259.542 67.3061 259.402 67.0967C258.981 66.3985 258.841 66.2589 258.14 65.9797C257.298 65.6306 257.368 65.7004 257.509 64.723C257.649 64.0248 257.649 63.7456 257.509 63.0474C257.368 62.5587 256.878 61.5115 257.018 61.0228C257.088 60.6039 258 59.9058 258.28 59.5567C258.981 58.7189 259.963 58.2302 260.594 57.3925C260.945 56.9736 261.506 55.9962 261.927 55.7169C262.347 55.5075 263.049 55.9264 262.768 55.0886C262.488 53.9716 261.646 53.4828 260.524 53.413C258.981 53.3432 258.911 53.2734 257.859 54.4603C257.158 55.2282 256.807 55.7867 257.368 56.7641C257.859 57.6019 253.722 59.7662 253.441 60.185C252.389 61.4417 250.706 63.5361 251.758 65.4211C252.249 66.2589 253.582 66.1891 254.002 67.1665C254.283 67.8646 253.161 68.4232 252.67 68.842C251.828 69.61 251.127 69.8893 250.987 71.0063C250.847 71.9139 250.917 73.3102 250.496 74.148C250.005 75.3348 249.093 75.3348 248.112 75.5442C247.691 75.6141 247.761 76.1028 247.621 76.5217C247.48 77.0104 247.2 76.8707 246.709 76.8707C246.008 76.9405 245.938 77.0802 245.797 76.3122C245.727 75.8933 245.517 75.265 245.657 74.8461C245.938 74.0083 244.745 73.0309 244.255 72.4026C244.044 72.1233 244.184 71.6346 244.044 71.2856C243.834 70.8667 243.483 70.4478 243.413 69.9591C243.343 69.5402 243.694 68.7722 243.203 68.7024C242.782 68.6326 242.712 67.9345 242.571 67.5156C242.291 68.6326 242.081 68.7722 241.169 69.4006C240.538 69.8195 240.047 70.5176 239.416 70.9365C238.434 71.5648 235.909 71.2158 235.909 69.6798C235.839 67.7948 235.138 65.9797 235.208 64.1645C235.278 62.5587 235.418 62.5587 236.541 61.5813C237.172 61.0228 237.873 60.7436 238.644 60.3247C239.556 59.9058 240.327 59.6265 241.029 58.7888C241.66 58.0906 242.291 57.4623 242.992 56.7641C244.465 55.3678 245.096 53.6923 246.148 51.9469C247.2 50.2714 248.532 49.0147 249.865 47.6184C251.127 46.2221 252.249 44.6862 253.932 43.9183C255.826 43.0805 257.649 42.4522 259.613 41.8238C260.384 41.6144 260.735 40.4275 261.436 40.0086C262.067 39.5898 263.049 39.5199 263.82 39.5898C262.909 40.5672 262.488 41.0559 262.137 42.3823C262.979 42.2427 263.75 40.7766 264.241 40.1483C264.311 40.5672 264.381 40.986 264.521 41.4049C264.942 40.9162 265.293 40.3577 265.643 39.869C265.784 39.6596 266.766 39.869 267.046 39.869C266.836 40.2879 266.555 40.637 266.345 41.0559C267.327 41.8238 266.766 39.9388 267.607 40.2879C268.449 40.637 269.36 40.986 270.202 41.3351C270.903 41.6144 269.571 42.3125 269.29 42.3823C268.659 42.522 267.817 42.2427 267.186 42.1729C267.537 42.8012 268.168 42.522 268.449 43.2201C268.519 43.3597 269.43 43.1503 269.711 43.1503C270.482 43.2201 271.184 43.5692 271.674 42.871C271.885 42.522 272.797 43.2201 273.147 43.4296C272.937 44.1277 272.306 43.7088 271.815 43.5692C271.604 44.9655 274.059 44.4768 274.76 44.4768C276.163 44.5466 276.794 44.8957 278.056 45.5938C279.248 46.2221 280.23 46.8505 281.492 47.1995C282.474 47.4788 283.666 48.1071 284.017 49.2242C284.368 50.2714 284.297 50.2714 283.736 51.179C283.386 51.7375 283.246 52.0866 282.614 52.296C281.212 52.7149 280.791 52.7847 279.459 52.5054C276.934 51.8771 274.83 51.3186 272.446 50.1318C273.147 50.8299 275.111 52.1564 275.111 53.1338C275.111 54.181 274.9 56.2754 275.882 56.6943C276.934 57.183 278.337 58.3699 279.388 57.951C280.02 57.6717 279.669 56.6943 279.038 56.6943C278.407 56.6943 278.126 56.1358 277.705 55.5773C278.687 54.6697 278.757 54.8791 279.95 55.298C280.931 55.6471 281.913 55.9962 282.895 56.3452C282.825 56.066 282.053 54.181 282.123 54.1112C282.895 53.6225 283.596 53.1338 284.297 52.6451C284.648 52.3658 285.419 51.6677 285.84 51.8073C286.612 52.0167 287.383 52.296 288.154 52.5054C288.225 52.0866 288.645 51.2488 288.435 50.8299C288.365 50.6903 287.664 49.5034 287.593 49.643C287.804 48.9449 287.944 48.2468 288.084 47.4788C288.154 47.1995 287.313 46.5014 287.173 46.2221C288.084 46.3618 289.066 46.4316 289.978 46.5712C290.679 46.641 291.17 47.7581 291.591 48.3166C291.1 48.3864 289.767 48.2468 289.487 48.6656C289.066 49.3638 289.838 49.8525 290.258 50.411C290.749 51.0393 291.45 50.6205 292.222 50.5506C293.134 50.411 292.502 49.7827 292.923 49.1543C293.134 48.8751 293.975 48.6656 294.256 48.526C295.097 48.1769 295.939 47.7581 296.78 47.3392C298.113 46.7807 299.375 46.1523 300.637 45.5938C300.988 46.7807 300.988 46.7807 302.11 47.0599C302.881 47.2694 303.232 45.8731 303.863 45.9429C304.845 46.0825 305.406 46.2221 306.247 45.8032C307.229 45.3145 307.51 45.3844 308.632 45.5938C308.491 45.8731 308.281 46.1523 308.141 46.4316C309.333 46.7807 309.263 46.8505 310.104 45.8032C310.806 44.8258 310.385 44.756 309.614 43.7786C311.297 43.0805 313.751 43.2899 315.434 43.9881C316.626 44.4768 317.748 44.8957 318.94 45.3844C319.782 45.7334 320.624 46.641 321.325 47.1995C321.395 46.7807 321.816 45.3145 321.465 45.0353C320.624 44.407 319.782 43.7786 318.87 43.1503C318.309 42.7314 319.221 41.5446 319.431 40.986C319.642 40.4973 318.309 40.0086 317.959 39.7294C318.8 39.1011 319.642 38.4029 320.483 37.7048C321.044 37.2161 321.325 35.6103 321.535 34.9122C321.886 34.0046 325.883 34.982 326.795 35.0518C326.444 36.0292 326.094 37.0066 325.743 37.984C325.533 38.4727 326.444 39.6596 326.655 40.1483C327.075 40.986 325.673 44.8258 326.374 45.3145C327.216 45.8731 328.127 45.9429 327.706 46.9901C327.426 47.5486 327.145 48.9449 326.655 49.2242C325.743 49.7827 324.831 50.3412 323.92 50.8997C323.499 51.179 322.307 50.6903 321.816 50.6903C323.008 51.6677 324.27 52.4356 325.883 51.9469C327.145 51.528 328.478 49.8525 329.39 48.8751C330.441 47.8279 327.777 46.292 329.951 45.5938C330.371 45.4542 331.563 44.8258 331.844 45.2447C332.405 45.8731 332.966 46.5014 333.527 47.1297C333.387 46.292 333.527 45.524 332.826 45.0353C331.914 44.407 331.844 44.407 330.792 44.5466C330.512 44.6164 328.408 45.0353 328.338 44.8258C328.197 44.2673 327.636 43.2201 327.917 42.6616C328.267 41.9634 329.039 41.0559 328.548 40.3577C328.197 39.7992 327.005 38.752 327.426 38.1236C327.917 37.2859 328.688 37.2161 329.53 36.867C330.161 36.5877 329.6 35.1914 329.46 34.7725C329.951 34.6329 330.792 35.8896 330.582 36.3783C329.951 37.5651 330.021 37.5651 330.652 38.752C331.073 39.5898 334.439 39.5898 335.28 39.6596C334.088 39.2407 332.896 38.752 331.704 38.1935C330.371 37.5651 332.686 36.5877 333.247 36.3783C334.859 35.8896 335.561 36.2387 337.174 36.867C337.665 37.0764 338.085 37.4255 338.576 37.7048C338.997 37.984 339.628 37.7048 340.119 37.6349C339.979 37.2161 339.768 36.1688 339.488 35.8896C339.207 35.6103 338.015 35.6103 337.594 35.5405C337.033 35.4707 336.963 33.0272 336.823 32.4687C338.646 32.2592 340.47 32.1196 342.293 31.9102C343.345 31.8403 344.327 31.7007 345.379 31.6309C346.08 31.5611 345.799 30.8629 345.799 30.1648C345.87 28.8383 345.729 28.8383 346.781 28.21C347.553 27.7911 348.324 27.1628 349.095 26.8137C350.778 26.1854 352.812 26.1155 354.565 25.7665C357.861 25.1381 361.087 24.7891 364.313 23.5324C365.084 23.2532 364.734 22.0663 365.295 21.7172C366.207 21.2285 367.188 20.7398 368.1 20.2511C369.222 19.6926 371.256 19.6926 372.097 20.8795C371.186 21.1587 370.344 21.438 369.432 21.7172C370.835 21.9267 372.237 22.1361 373.64 22.3456C373.079 22.8343 372.448 23.323 371.887 23.8815C372.658 23.9513 373.43 23.9513 374.201 24.0211C374.201 23.7419 374.061 22.555 374.341 22.555C374.972 22.555 375.534 22.6248 376.165 22.6248C377.076 22.6248 378.058 22.4852 378.9 22.9739C379.671 23.5324 381.003 24.0909 381.635 24.8589C381.775 25.0683 382.546 25.8363 382.476 26.0457C382.336 26.325 382.125 27.2326 381.845 27.3722C378.058 29.6761 374.341 31.98 370.554 34.2838C373.149 33.5159 375.744 32.8177 378.409 32.0498C377.707 31.98 377.076 31.8403 376.375 31.7705C377.146 31.0724 378.409 30.444 379.391 31.1422C380.793 32.1894 381.144 32.1196 382.897 31.98C385.141 31.7705 387.455 32.2592 389.629 32.4687C389.208 32.7479 388.788 32.9574 388.367 33.2366C388.928 33.5159 389.91 34.2838 390.471 34.214C391.382 34.1442 392.294 34.1442 393.135 34.0744C393.697 34.0744 395.169 34.2839 395.239 33.6555C395.45 32.2592 395.31 32.329 396.502 32.329C397.343 32.329 398.255 32.3989 399.096 32.2592C399.728 32.1196 400.99 31.5611 401.621 31.7705C402.182 31.98 403.024 33.3763 403.444 33.865C403.725 34.1442 403.094 35.8198 403.094 36.2387C403.094 36.5877 403.164 38.6124 403.374 38.752C404.216 39.2407 404.987 39.6596 405.829 40.1483C406.179 40.3577 407.301 38.5425 407.512 38.1935C408.213 37.2859 408.073 37.1462 409.055 37.7746C410.036 38.4029 410.247 38.6822 411.299 38.4029C412 38.1935 412.841 37.7048 413.473 37.984C413.963 38.2633 415.085 39.1011 415.576 38.8916C416.418 38.5425 417.259 38.1935 418.101 37.8444C417.891 37.4255 417.049 36.5179 417.4 36.099C417.61 35.75 418.382 34.3537 418.802 34.4235C420.415 34.6329 422.028 34.8424 423.641 35.0518C424.833 35.1914 426.096 35.6801 427.288 35.9594C428.55 36.3085 430.373 36.3783 431.495 37.0764C432.197 37.4953 433.81 40.0785 434.581 40.0086C436.194 39.7294 437.807 39.4501 439.42 39.1709C440.752 38.9614 442.014 39.5898 443.277 39.9388C444.048 40.1483 444.399 40.0785 444.679 40.8464C444.96 41.754 444.89 41.8936 444.609 42.8012C445.942 43.2201 446.994 43.7786 448.396 43.4994C450.009 43.2201 451.061 43.1503 452.674 43.4296C453.235 43.4994 454.076 43.8484 454.567 43.4994C455.339 42.871 455.269 42.871 455.97 43.5692C456.461 44.0579 457.232 45.1051 457.863 45.3844C458.354 45.5938 459.266 45.2447 459.757 45.1749C459.617 44.1277 459.476 43.0107 459.336 41.9634C461.65 42.1729 463.964 42.3125 466.279 42.522C468.102 42.6616 469.855 43.9183 471.468 44.6862C473.362 45.5938 475.185 46.5712 477.008 47.6184C478.13 48.2468 478.27 48.3166 478.761 49.643C479.322 51.1092 479.112 51.528 480.585 51.528C480.444 50.9695 480.234 50.3412 480.094 49.7827C481.426 49.7827 482.338 49.8525 483.6 50.3412C484.512 50.6903 485.423 51.7375 486.195 52.3658C485.704 52.7847 485.003 53.6225 484.442 53.7621C485.423 54.5999 484.512 54.2508 484.021 54.181ZM302.46 103.889C302.18 103.68 302.25 102.981 301.97 102.842C300.848 102.144 300.637 103.889 300.637 104.517C300.006 103.4 299.866 102.981 300.427 101.795C299.936 101.585 298.954 101.376 298.603 100.957C298.323 100.608 298.323 99.4208 298.253 99.0019C298.253 98.9321 296.71 98.3736 297.411 98.1642C298.113 98.0245 298.253 98.7925 298.954 98.3038C298.533 97.8849 298.042 97.8151 298.463 97.2566C298.674 96.9773 299.235 96.7679 299.515 96.8377C300.287 96.9773 301.549 96.9075 302.25 97.2566C301.759 97.466 301.268 98.0943 301.268 98.7227C301.759 98.0245 301.97 97.6057 302.811 97.466C302.39 96.1395 302.11 97.0471 300.988 96.6981C301.128 96.1395 301.549 95.4414 301.268 94.9527C301.128 94.7432 300.637 93.5564 300.216 94.0451C299.796 94.5338 299.164 94.0451 298.603 93.8357C298.183 93.696 297.481 94.3942 297.061 94.464C295.939 94.6734 296.009 94.1149 295.728 95.4414C295.658 95.7905 294.396 96.0697 294.045 96.2792C293.274 96.6282 293.344 96.6282 293.134 97.5358C293.063 97.9547 292.432 98.3736 292.152 98.6529C292.853 98.7227 293.624 99.2114 293.554 100.049C293.554 101.236 293.695 101.725 294.185 102.772C294.466 103.4 295.237 103.61 295.588 104.238C296.149 105.215 296.359 105.564 297.341 106.053C296.57 106.332 296.359 106.193 296.149 107.1C296.009 107.659 295.798 108.148 295.588 108.706C295.307 109.334 295.448 109.753 295.448 110.452C295.518 111.219 295.728 111.08 296.43 111.219C297.061 111.359 297.061 111.848 297.552 111.987C298.113 112.197 298.744 112.337 299.305 112.546C300.076 112.755 301.409 112.267 302.18 112.197C302.11 111.219 301.899 110.312 302.04 109.404C302.32 107.938 301.689 108.636 301.128 107.589C301.268 107.659 301.479 107.589 301.689 107.659C301.619 107.45 301.549 106.961 301.409 106.751C301.268 106.612 300.777 106.821 300.637 106.612C300.216 106.123 300.497 105.634 300.707 105.215C300.637 105.285 302.881 105.564 303.302 105.355C303.442 104.447 302.881 104.238 302.46 103.889ZM72.6522 23.3928C73.2132 23.5324 73.9847 23.8815 74.5457 23.4626C74.4054 23.323 74.2652 23.1833 74.1249 23.1135C73.5639 23.1135 73.0029 22.9739 72.6522 23.3928ZM122.373 142.008C122.934 142.357 123.284 142.636 123.916 142.845C124.196 142.915 124.617 142.427 125.178 142.636C125.038 142.496 124.967 142.287 124.827 142.147C124.196 141.868 122.934 141.17 122.373 142.008ZM117.604 96.349C117.534 96.4188 117.464 96.4886 117.394 96.5584L117.534 96.6282C117.744 96.349 117.885 96.2094 117.744 95.9301C117.674 95.9999 117.604 96.0697 117.604 96.1395C117.464 95.7206 117.113 95.6508 116.763 95.7905C116.272 95.9999 116.131 95.5112 115.64 95.8603C115.781 95.8603 115.921 95.9301 115.991 95.9301C116.482 96.1395 117.113 96.6282 117.604 96.349ZM114.869 95.2319C114.589 95.0225 114.518 95.1621 114.448 95.2319C114.518 95.3018 114.659 95.4414 114.729 95.5112C114.799 95.4414 114.799 95.3716 114.869 95.2319ZM115.5 95.9301C115.5 95.8603 115.5 95.7905 115.5 95.7207C115.36 95.6508 115.29 95.581 115.079 95.5112C115.009 95.581 114.869 95.6508 114.799 95.7207C115.009 95.8603 115.29 95.8603 115.5 95.9301ZM152.948 86.0863C153.159 85.6674 153.299 85.3183 153.509 84.8994C152.387 84.4107 151.195 85.9466 150.774 86.9938C150.073 88.6694 149.442 89.4373 148.25 90.694C148.039 90.9034 147.899 92.1601 148.11 92.4394C148.39 92.8583 149.372 92.7186 149.793 92.7186C151.055 92.579 152.387 92.579 153.58 93.2073C153.159 93.347 152.878 93.6262 152.878 94.1149C154 93.9055 154.281 93.0677 155.403 92.9979C155.263 93.8357 155.122 93.9055 155.894 94.1847C156.525 94.464 156.665 94.464 157.016 93.9055C157.437 93.2771 156.946 91.811 156.805 91.1129C156.735 90.694 155.894 90.4846 155.964 90.2053C156.104 89.4373 155.964 89.4373 155.473 88.8788C155.122 88.4599 153.509 89.0185 153.018 89.1581C153.018 88.8788 153.089 88.2505 152.808 88.1109C152.598 88.0411 152.107 87.9014 152.107 87.6222C152.037 86.7146 152.317 86.6448 152.948 86.0863ZM137.59 142.357C137.941 143.125 139.273 142.496 139.624 142.008C139.554 141.938 139.484 141.868 139.414 141.798C138.712 141.728 137.1 141.17 137.59 142.357ZM126.3 139.564C126.861 139.425 127.422 139.215 127.983 139.075C127.562 138.726 127.212 138.377 126.651 138.308C126.23 138.238 126.019 137.679 125.879 137.679C125.108 137.749 124.196 137.26 123.635 136.632C123.635 136.702 123.565 136.772 123.565 136.841C121.952 135.794 120.199 134.817 118.305 134.607C117.183 134.468 116.342 134.747 115.22 135.026C114.308 135.236 114.098 136.073 113.396 136.562C114.799 137.33 116.412 134.119 117.814 135.585C117.604 135.724 117.464 135.794 117.113 135.724C117.324 136.004 117.744 136.213 118.095 136.073C118.516 135.934 118.586 136.283 119.007 136.283C119.778 136.283 120.479 136.841 121.321 136.981C122.092 137.051 122.092 137.958 122.934 138.377C123.144 138.447 123.986 138.238 123.986 138.866C123.986 139.075 123.284 139.564 123.144 139.704C124.196 139.704 125.248 139.425 126.3 139.564ZM141.728 93.696C141.097 94.8829 142.219 95.0923 143.06 95.5112C143.902 95.8603 144.112 95.4414 144.673 94.8131C143.832 94.7433 142.99 94.6734 142.079 94.6036C141.938 94.3244 141.798 93.9753 141.728 93.696ZM141.167 88.3203C142.008 89.0185 143.972 90.6242 145.024 89.7864C144.042 88.6694 142.499 88.3203 141.167 88.3203ZM180.999 179.777C181.42 181.593 181.42 181.523 180.438 182.919C179.246 184.664 178.054 186.41 176.792 188.155C176.231 188.993 175.529 189.621 175.459 190.668C175.249 193.252 175.109 195.765 174.898 198.348C174.758 200.024 173.005 201.769 172.163 203.165C171.813 203.724 171.462 204.701 170.761 204.771C170.06 204.841 168.587 204.562 167.956 204.98C166.273 206.167 164.59 207.284 162.836 208.471C162.486 208.681 162.486 211.264 162.486 211.683C162.416 212.241 162.486 213.149 162.205 213.568C160.803 215.383 159.4 217.198 157.998 218.943C156.735 220.619 155.403 222.225 154.141 223.9C153.86 224.249 149.793 222.504 149.161 222.364C148.811 223.761 151.125 223.9 151.335 225.087C151.476 225.646 151.896 226.832 151.826 227.391C151.756 227.949 150.915 228.648 150.634 229.136C149.793 230.393 148.671 230.323 147.268 230.742C145.936 231.091 145.304 231.091 143.972 230.812C144.253 231.65 144.463 231.999 144.112 232.836C143.902 233.325 144.182 234.163 143.902 234.372C142.569 235.28 141.798 234.931 140.396 234.233C140.396 234.931 140.185 235.838 140.325 236.537C140.466 237.025 141.237 237.863 141.027 238.352C140.606 239.259 140.185 240.167 139.764 241.075C139.344 241.982 139.203 241.912 138.222 242.122C137.38 242.331 137.24 243.029 136.819 243.797C136.539 244.286 137.59 245.194 137.871 245.612C138.222 246.171 139.484 245.682 139.203 246.52C138.923 247.358 138.783 247.707 138.292 248.335C137.801 248.894 137.1 249.452 136.889 250.22C136.539 251.337 136.258 251.407 135.276 251.966C134.294 252.524 135.416 255.387 135.557 256.504C135.627 256.922 135.627 257.83 135.907 258.039C136.609 258.668 137.31 259.296 138.081 259.855C139.344 260.902 140.185 260.762 141.798 260.762C140.325 261.391 138.853 262.089 137.45 262.717C136.258 263.276 136.048 262.927 134.855 262.368C133.102 261.53 131.419 260.692 129.736 259.924C128.824 259.506 128.684 258.528 128.334 257.551C127.352 255.317 125.809 253.083 126.089 250.569C126.51 246.799 126.931 243.029 127.352 239.329C127.773 235.699 127.913 231.929 128.614 228.368C129.456 223.9 130.297 219.362 131.209 214.894C131.7 212.171 132.261 209.449 132.752 206.726C132.962 205.539 133.383 204.282 133.453 203.095C133.523 202.118 133.172 200.931 133.032 199.954C132.962 199.325 133.032 197.72 132.681 197.161C132.331 196.603 131.069 196.044 130.578 195.695C129.526 194.997 128.474 194.229 127.422 193.461C126.37 192.693 126.019 191.995 125.388 190.738C124.056 188.295 122.793 185.851 121.461 183.478C120.409 181.453 119.287 179.498 118.235 177.473C117.604 176.217 118.726 173.983 119.007 172.656C119.147 172.028 119.217 170.562 119.638 170.073C120.269 169.305 120.83 168.467 121.461 167.699C122.864 165.954 123.986 164.907 123.635 162.463C123.565 161.905 123.214 161.626 123.635 161.207C123.705 161.137 123.495 160.369 123.565 160.09C123.705 159.322 122.092 158.624 122.232 157.925C122.443 157.018 122.443 157.157 121.671 156.739C121.11 156.459 121.11 156.459 120.62 156.739C120.199 156.948 119.918 157.297 119.568 157.646C119.357 157.856 119.918 158.484 120.059 158.693C119.007 159.112 119.077 159.252 118.586 158.135C118.375 158.763 117.324 157.716 116.692 157.576C116.412 157.507 116.201 157.856 115.991 157.716C115.64 157.507 115.36 157.227 115.009 156.948C114.378 156.459 113.046 155.831 112.555 155.133C112.134 154.505 112.344 153.597 111.854 153.038C110.591 151.572 109.82 150.316 108.067 149.827C106.734 149.478 104.49 149.338 103.368 148.291C102.456 147.383 101.475 146.476 100.563 145.498C99.9319 144.87 99.0903 145.498 98.3189 145.778C96.6359 146.266 94.9528 145.08 93.3399 144.451C92.0776 143.963 90.7452 143.404 89.4829 142.915C89.0621 142.776 88.2907 142.636 88.0102 142.287C87.1687 141.449 86.3271 140.611 85.4856 139.774C84.7142 139.006 85.2051 138.517 85.4856 137.47C85.696 136.772 84.3635 135.375 84.0129 134.817C83.5921 134.188 83.2415 133.77 82.6805 133.211C81.7688 132.373 80.8572 131.536 80.0156 130.698C79.8053 130.488 80.0858 129.93 80.0858 129.651C80.1559 129.371 79.665 128.952 79.5247 128.743C78.8936 127.905 78.3326 127.207 77.5612 126.579C76.8599 126.09 76.1586 125.741 75.8781 124.903C75.7378 124.414 75.3872 122.111 74.9664 121.901C74.1249 121.552 73.2834 121.133 72.4418 120.784C72.7224 121.692 72.9327 123.577 73.4938 124.275C74.4054 125.322 75.1768 126.23 75.7378 127.556C76.0184 128.324 76.2287 128.533 76.8599 129.022C77.2807 129.441 77.4209 130 77.6313 130.628C77.8417 131.256 78.1222 131.815 78.1923 132.443C78.2624 133.49 78.6832 132.722 78.9637 132.932C79.3144 133.211 79.9455 133.77 79.8754 134.328C79.8053 135.026 79.1741 135.166 78.8936 134.677C78.2624 133.56 77.2105 132.932 76.2287 132.234C75.9482 132.024 76.0885 130.768 76.0184 130.418C75.9482 129.86 75.1768 129.511 74.8262 129.162C74.4755 128.883 74.1249 129.022 73.7041 128.673C73.2132 128.254 72.7925 127.835 72.3016 127.416C72.8626 127.347 74.1249 127.207 73.4236 126.16C72.7925 125.252 72.512 124.764 71.5302 124.275C70.899 123.996 70.7588 122.948 70.4783 122.25C70.0575 121.133 69.5666 120.016 69.1459 118.829C68.655 117.573 67.042 116.525 65.8499 116.176C64.8681 115.897 64.5174 115.967 64.0967 115.059C63.6058 114.012 63.1149 112.965 62.6941 111.987C61.9928 110.452 60.5903 109.544 60.0994 107.868C59.4682 105.704 59.5384 104.308 59.6085 102.004C59.6786 100.119 59.8189 98.234 59.889 96.2792C59.9591 94.464 59.5384 93.2772 58.9773 91.5318C60.0293 91.811 61.0812 92.0903 62.063 92.5092C62.1331 90.9733 62.2032 90.7638 61.1513 89.7166C60.3799 88.8788 59.6786 88.3901 58.767 87.7618C57.9956 87.2033 57.154 87.2033 56.3125 86.8542C54.9099 86.2259 54.6996 86.2259 54.0684 84.7598C53.3671 83.0842 50.8425 82.1766 50.9828 80.2916C51.123 78.5463 50.9828 78.6859 49.6504 77.8481C49.44 77.7085 48.5985 79.5237 48.0374 78.6859C47.6167 77.9878 46.9154 76.3122 46.2141 75.9631C45.2323 75.4744 45.0219 75.265 44.4609 74.3574C43.8298 73.4498 43.2688 72.1932 42.5675 71.495C41.9363 70.8667 41.0247 70.4478 40.3234 69.9591C38.5702 68.7722 37.0975 68.1439 35.1339 67.4458C34.3625 67.1665 33.4509 67.7948 32.6795 67.6552C31.8379 67.4458 30.9263 66.608 30.225 66.1193C29.2432 65.491 28.9627 65.2815 27.8407 65.4211C26.8589 65.491 26.368 65.7702 26.7186 67.0269C26.9991 68.0741 23.0019 69.1911 22.0902 69.4704C21.8798 68.9817 22.0902 68.7024 22.5811 68.5628C21.8798 68.3533 22.4408 66.3985 22.8616 66.1193C23.8434 65.5608 24.3343 65.5608 25.5265 65.5608C25.246 65.3513 25.0356 65.0721 24.7551 64.8626C25.0356 64.6532 25.3161 64.4437 25.6667 64.2343C23.8434 64.5834 23.1421 64.9324 21.5993 66.1193C20.2669 67.0967 19.776 68.2137 18.9345 69.6798C19.3552 69.7496 19.776 69.8893 20.1968 69.9591C18.9345 71.6346 17.7423 72.5422 16.0592 73.7291C15.2177 74.2876 12.6931 74.9857 12.5528 76.1726C12.4827 77.2896 9.11659 77.8481 8.13481 78.1274C7.71404 78.267 7.3634 78.267 6.94264 78.3368C6.45174 78.4066 6.66213 78.6859 6.31149 78.8953C5.46996 79.4539 4.90893 79.5935 4.0674 79.384C4.83881 78.6161 5.68034 78.4066 6.592 77.8481C7.29327 77.4292 9.25685 75.4744 9.888 76.5915C10.3088 75.8235 11.9217 74.0781 12.7632 74.6367C12.4827 73.7989 13.9554 73.3102 14.1658 72.4026C14.306 71.6346 14.306 71.4252 14.7969 70.9365C15.1476 70.5874 15.4281 70.4478 15.1476 69.9591C14.0255 70.5874 12.9035 71.495 11.7814 70.727C11.4308 70.4478 10.6594 69.61 10.1685 69.8195C9.60749 70.0987 9.04646 70.3082 8.48544 70.5874C8.27506 69.4704 8.06468 68.2835 7.92442 67.1665C7.64391 67.3061 6.17123 68.4232 5.96085 68.2137C5.39983 67.7948 4.34791 67.2363 3.99728 66.608C3.57651 65.9098 3.57651 64.5834 3.36613 63.8154C3.22587 63.1173 3.71676 62.6286 4.0674 62.07C4.69855 60.953 4.62842 60.6737 5.82059 60.8134C6.80238 60.8832 6.94264 60.1152 7.78417 59.7662C8.6257 59.4171 9.32698 60.1152 9.74774 59.068C10.0984 58.2302 9.60749 58.0906 8.97634 57.4623C9.25685 57.3227 9.46723 57.183 9.74774 57.0434C9.3971 55.9264 8.48544 56.9038 7.8543 57.2528C7.01276 57.7415 6.94264 57.183 6.1011 57.2528C4.48817 57.4623 2.66485 57.8114 1.82332 56.066C2.0337 55.9962 2.24408 55.7867 2.38434 55.7867C1.61294 55.5075 0.561021 55.3678 0 54.5999C1.19217 53.9715 1.96357 53.413 3.22587 53.413C3.15574 53.2734 3.01549 53.2036 2.94536 53.064C3.92715 52.5054 4.48817 52.3658 5.61021 52.296C5.96085 53.064 6.94264 52.8545 7.92442 53.1338C8.76595 53.3432 9.04646 52.9941 9.81787 52.4356C9.46723 52.296 9.11659 52.1564 8.76595 52.0167C8.90621 51.9469 9.04646 51.9469 9.18672 51.8771C8.83608 51.5979 8.69583 51.2488 9.11659 50.8997C8.20493 50.8299 7.43353 50.6903 6.52187 50.411C5.82059 50.2016 5.82059 49.0147 5.11932 48.7355C4.62842 48.526 2.59472 47.9675 2.38434 47.4788C2.31421 47.2694 2.73498 46.292 2.80511 46.0825C2.87523 45.8731 3.296 45.9429 3.43625 45.9429C4.20766 45.8731 5.3297 46.1523 5.82059 45.4542C6.38162 44.6862 6.87251 43.7786 7.57378 43.1503C8.76595 42.0333 10.449 41.4049 11.9918 41.1257C13.0437 40.986 13.8151 40.986 14.6567 40.2879C15.7787 39.3803 15.7086 39.3803 16.9709 40.0086C18.0929 40.5672 21.2487 39.7992 21.7396 41.1257C22.0902 42.1031 25.3862 42.0333 26.5082 42.1729C28.1212 42.3823 29.8042 42.5918 31.4172 42.871C33.8716 43.2899 36.256 43.7088 38.7105 44.1277C40.3234 44.407 41.7961 45.3145 43.2688 46.0127C43.5493 46.1523 45.2323 44.0579 45.5128 43.8484C45.9336 43.3597 46.8453 44.756 47.3362 44.4768C48.1777 44.1277 52.0347 41.754 52.5957 42.6616C51.1932 43.4296 49.7906 44.1277 48.3881 44.8957C49.44 45.6636 53.0866 42.522 53.3671 43.8484C53.7879 43.3597 54.2087 42.871 54.6294 42.3823C54.9801 41.9635 54.1385 41.8936 54.7697 41.4049C55.8216 42.6616 56.9436 43.7786 58.0657 44.8957C58.4163 43.7088 58.5566 43.2899 59.4682 42.522C60.0293 43.0805 59.0475 43.3597 59.8189 43.7786C60.0994 43.9183 59.6786 44.4768 59.5384 44.756C60.0293 44.6164 60.8708 44.6164 61.2214 44.3371C61.3617 44.1975 61.0812 43.639 61.2916 43.639C61.5721 43.5692 61.7824 43.5692 62.063 43.4994C62.9746 43.3597 64.2369 44.2673 65.0784 44.6164C66.8316 45.3844 68.9355 45.6636 70.7588 46.1523C70.6887 46.0127 70.6887 45.8731 70.6185 45.7334C71.8107 45.8032 72.4418 46.3618 73.4938 47.0599C74.2652 47.6184 71.8808 48.3864 71.7406 48.4562C72.512 48.7355 73.3535 49.1544 74.195 49.0845C75.5275 48.9449 76.93 48.8751 78.2624 48.7355C78.8936 48.6656 80.0156 48.526 80.4364 49.1543C81.0675 50.0619 81.6987 50.9695 82.3298 51.9469C82.2597 51.528 82.1195 51.1092 82.0493 50.7601C81.9792 50.4808 82.2597 50.2714 82.1896 50.0619C82.0493 49.0845 81.6286 49.3638 82.1195 48.3864C82.4701 47.7581 85.2752 47.6882 84.6441 46.7108C83.3116 47.2694 82.3298 47.6882 80.8572 47.6184C81.2078 46.4316 81.6987 46.5014 82.7506 46.1523C83.8727 45.8032 84.083 45.6636 85.1349 46.292C85.4155 46.4316 85.6258 47.1297 85.7661 47.4788C85.9765 47.8977 86.257 47.8279 86.7479 47.9675C87.6595 48.1769 88.431 48.4562 89.2725 48.7355C89.9738 49.0147 93.8308 49.4336 93.971 48.8751C94.3217 47.7581 94.3217 47.2694 95.584 47.2694C96.3554 47.2694 97.1969 47.6882 97.9683 47.8977C97.8982 48.2468 97.4073 49.3638 97.4774 49.7129C97.6177 50.0619 98.6696 50.5506 98.9501 50.6903C98.5293 49.4336 98.1086 48.3166 99.6514 48.1071C100.283 48.0373 100.633 47.409 101.124 46.9901C101.475 46.641 101.194 46.2221 101.124 45.8032C100.703 46.0127 100.353 46.1523 99.9319 46.3618C99.7916 45.1051 100.703 44.9655 101.545 44.8258C101.475 43.8484 100.563 44.5466 100.002 44.3371C99.5111 44.1277 97.8982 43.8484 97.6878 43.3597C97.267 42.3125 97.267 41.6144 97.267 40.4973C97.267 39.3803 97.828 39.2407 98.6696 39.5898C98.8098 39.0312 98.4592 38.8916 97.9683 38.8916C98.8098 38.3331 98.9501 38.4029 98.88 37.3557C98.88 36.4481 98.8098 36.0292 98.3891 35.2613C98.1086 34.6329 98.3189 33.7951 98.3189 33.097C98.3189 32.5385 99.2306 32.8177 99.6514 32.8876C98.1086 31.212 100.773 31.7007 101.825 31.7007C103.298 31.7007 104.28 31.8403 105.682 32.2592C105.121 33.097 104.28 34.9122 103.508 35.4009C102.807 35.8198 100.984 35.4707 100.212 35.4707C102.737 35.8198 99.8618 37.4255 100.002 38.2633C101.264 38.0538 101.966 39.1709 102.246 40.3577C102.386 41.1257 103.649 42.0333 104.14 42.6616C103.508 43.0805 102.877 43.4994 102.316 43.9183C102.947 44.1277 103.438 44.5466 103.999 44.1975C104.56 43.7786 105.051 44.2673 105.682 44.6164C105.402 44.8258 105.121 45.0353 104.771 45.2447C105.332 45.7334 105.682 45.7334 105.472 46.5712C105.262 47.3392 105.121 47.5486 105.823 47.9675C106.243 47.3392 106.454 47.0599 106.524 46.292C106.524 46.0127 106.804 44.8258 107.295 45.1749C107.646 45.3844 108.768 45.8032 108.838 46.2221C108.978 46.9203 109.399 47.6882 108.558 47.9675C108.558 47.8279 108.487 47.6184 108.487 47.4788C106.734 48.4562 110.591 51.8771 110.802 49.9921C110.872 49.4336 110.802 49.1543 111.152 48.8053C111.363 48.6656 111.924 48.3166 111.924 48.0373C111.924 46.641 111.924 46.7108 113.116 46.2221C112.625 45.4542 112.204 45.1051 112.415 44.2673C112.625 43.3597 113.046 43.639 113.817 43.7088C114.308 43.7786 115.711 43.7088 116.061 44.1277C116.763 44.8957 116.973 45.0353 117.885 45.2447C117.464 45.9429 118.095 46.4316 117.674 46.9203C117.394 47.2694 116.482 47.1297 116.061 47.1297C116.412 47.8977 116.622 48.5958 117.253 49.0845C117.885 49.6431 118.165 50.1318 117.464 50.9695C117.043 51.528 115.921 51.8771 115.29 52.296C114.729 52.6451 114.308 51.8771 113.817 51.4582C114.028 52.0167 114.308 52.5054 114.518 53.064C114.168 52.8545 113.747 52.6451 113.396 52.5054C113.467 52.6451 113.467 52.7847 113.537 52.9243C113.186 52.8545 112.765 52.7149 112.415 52.6451C112.134 52.5753 112.344 51.9469 112.134 51.9469C111.573 51.9469 110.732 51.7375 110.451 52.3658C110.802 52.5753 111.152 52.7847 111.503 52.9941C111.152 53.5527 110.802 54.2508 110.241 54.5999C109.399 55.0886 109.119 54.6697 108.207 54.2508C106.875 53.5527 105.682 53.6225 104.14 53.5527C105.191 54.0414 106.243 54.5999 107.295 55.0886C108.067 55.4377 109.329 55.3678 110.171 55.4377C109.82 55.9962 109.259 57.5321 108.698 57.8114C108.347 57.951 107.926 58.3001 107.576 58.3001C107.155 58.2302 106.734 58.0906 106.313 58.3699C105.191 59.2076 105.051 59.2076 103.789 58.8586C102.947 58.5793 102.106 58.4397 101.334 58.1604C101.895 58.4397 102.456 58.6491 103.017 58.9284C102.877 58.9982 102.807 59.2076 102.667 59.2775C103.508 59.068 103.719 59.068 104.49 59.4869C104.911 59.6963 105.542 60.3247 104.841 60.6737C104.069 61.0228 103.789 61.0228 102.947 60.953C102.667 60.953 102.246 61.8606 102.106 62.07C101.475 63.1173 100.423 64.2343 100.142 65.491C99.8618 66.8872 99.5812 68.3533 99.2306 69.7496C99.7916 69.8893 101.054 69.8893 101.475 70.3082C101.966 70.727 102.246 72.4026 102.456 73.0309C102.877 74.2178 103.158 73.7989 104.21 73.5196C104.771 73.38 105.472 73.7989 106.033 74.0083C107.716 74.6367 108.908 75.1952 110.381 76.2424C110.872 76.5915 111.713 77.5689 112.274 77.5689C113.116 77.6387 113.957 77.7783 114.729 77.8481C115.009 77.8481 116.622 77.8481 116.622 78.1972C116.552 79.3142 116.552 80.5011 116.482 81.6181C116.412 83.2238 118.025 84.4107 118.936 85.5975C119.848 86.7146 121.812 84.6201 121.601 83.6427C121.461 82.5955 121.251 81.6181 121.11 80.5709C121.04 80.0124 120.269 79.3142 119.988 78.8255C120.97 78.1972 122.934 77.4292 123.635 76.4518C124.266 75.5443 124.406 73.1007 123.635 72.3328C123.074 71.7743 122.513 71.2856 122.092 70.6572C121.461 69.7496 121.251 69.8195 122.022 69.1213C122.934 68.3533 123.004 68.4232 122.653 67.2363C122.513 66.608 122.092 65.84 122.303 65.2117C122.653 64.0248 122.723 63.8154 122.373 62.6984C122.162 62.0002 122.583 61.721 123.355 61.6512C124.757 61.5115 126.019 62.6984 127.352 62.07C128.193 61.6512 128.404 62.1399 129.245 62.6984C129.596 62.9776 130.718 63.3965 130.788 63.955C130.998 64.723 131.419 65.2815 132.261 65.1419C132.962 65.0721 133.383 65.3513 134.014 65.7004C133.663 66.3287 133.453 66.4684 133.593 67.1665C133.733 67.7948 133.874 68.4232 133.663 69.0515C133.874 68.9817 134.014 69.1213 134.224 69.0515C133.874 69.4704 132.962 70.0987 133.453 70.5874C134.294 68.0043 137.45 73.6593 138.151 70.1685C138.292 70.3082 138.572 70.3082 138.712 70.5176C139.063 69.7496 139.624 69.0515 139.484 68.2137C139.344 67.6552 140.255 66.4684 140.816 66.608C140.746 66.8872 140.676 67.2363 140.606 67.5156C141.938 67.5854 142.85 70.378 143.551 71.495C143.902 72.1233 145.024 73.38 145.024 74.0781C145.024 74.497 144.393 74.9857 144.463 75.4046C144.533 75.5443 145.164 75.9631 145.304 76.1028C145.585 76.3122 146.216 76.6613 146.427 77.0104C146.707 77.4292 146.286 77.8481 146.847 77.9179C147.899 77.9878 148.32 77.9878 149.232 78.5463C149.793 78.9652 150.985 79.5237 149.723 79.7331C149.021 79.8727 148.25 80.152 147.549 80.3615C147.969 80.5011 148.53 80.2218 149.021 80.0822C148.671 80.6407 147.689 80.7105 147.128 80.92C146.567 81.1294 146.777 82.1766 147.058 81.8276C147.338 81.4785 147.478 81.4785 147.899 81.269C148.25 81.1294 148.11 80.92 148.32 80.8502C148.811 80.5709 149.442 80.4313 150.003 80.3615C149.652 80.2916 149.582 80.2218 149.372 80.0124C149.793 80.0124 150.564 80.0822 150.774 80.5709C150.985 81.1992 150.284 81.1294 150.704 81.6181C151.195 80.7803 151.756 81.1992 152.457 81.4785C153.018 81.6879 152.598 82.805 152.457 83.154C152.247 83.7824 152.948 83.9918 152.457 84.7598C152.247 85.1088 151.195 85.6674 150.845 85.7372C150.284 85.8768 149.723 85.7372 149.091 85.9466C148.46 86.1561 148.18 86.5749 147.689 87.0636C146.707 88.1109 145.865 88.3203 144.463 88.1807C142.99 88.0411 141.658 87.9712 140.185 88.1109C138.923 88.1807 137.59 87.7618 137.24 89.4373C137.17 89.8562 135.907 89.9959 135.557 90.2751C134.996 90.694 134.505 91.3922 134.014 91.8809C133.172 92.7884 132.681 93.9055 131.7 94.6734C133.453 93.8357 134.365 92.0205 136.118 91.1827C137.31 90.6242 140.536 88.809 141.377 90.9035C141.237 90.8336 141.097 90.8336 140.957 90.7638C141.798 91.3223 140.676 91.811 140.185 92.1601C139.624 92.6488 139.133 91.811 138.502 92.2299C138.783 92.2997 139.414 92.9979 139.414 92.9979C139.835 92.8583 140.185 92.7884 140.606 92.9281C140.536 93.4168 140.185 93.8357 139.835 94.1149C140.045 94.0451 140.255 94.1149 140.466 94.1149C140.115 95.0225 141.097 95.7206 141.798 95.9301C141.728 95.9999 141.658 96.0697 141.588 96.0697C142.569 96.5584 143.551 96.9773 144.463 96.349C144.463 96.4886 144.533 96.6981 144.533 96.8377C144.673 96.8377 144.954 96.7679 145.094 96.6282C144.463 95.8603 145.725 94.7433 146.146 94.1149C146.917 94.3942 146.497 95.0923 146.286 95.7207C146.847 95.3018 147.689 96.1395 147.198 96.349C146.567 96.6282 145.936 97.0471 145.234 96.9075C145.375 97.0471 145.445 97.2566 145.655 97.3962C144.814 97.7453 144.042 98.0943 143.201 98.3736C142.92 98.5132 142.569 98.5831 142.289 98.7925C141.938 99.0718 141.868 98.3736 141.518 98.6529C140.957 99.0718 140.466 99.9793 139.835 100.538C139.414 100.957 139.063 100.398 138.783 100.259C137.941 99.0019 139.975 97.9547 140.676 97.466C141.167 97.117 140.957 97.5358 141.167 97.7453C141.658 98.1642 141.938 97.6056 142.359 97.1868C141.798 97.1868 141.097 96.9773 140.606 97.3264C140.606 97.0471 140.886 96.7679 141.027 96.4188C140.396 96.2792 139.554 97.117 139.063 97.466C138.712 97.6755 138.712 97.1868 138.292 97.6755C138.081 97.8849 137.59 97.7453 137.31 97.7453C137.731 99.0718 135.487 98.5831 135.136 99.2114C135.066 99.1416 134.926 99.0019 134.855 98.9321C134.505 99.6303 134.154 99.7001 133.523 99.9793C133.102 100.119 133.032 100.468 132.892 100.957C132.611 101.655 131.349 104.029 133.102 103.819C133.032 103.68 133.032 103.61 132.962 103.47C133.102 103.54 133.243 103.749 133.313 103.889C132.822 104.238 132.191 103.959 131.63 103.819C131.349 103.749 131.419 104.587 131.069 104.587C129.806 104.657 129.175 104.727 128.053 105.495C128.824 105.425 129.456 105.006 130.297 104.866C130.227 104.936 130.157 105.006 130.017 105.076C130.227 105.076 130.437 105.146 130.648 105.076C130.087 105.355 129.736 105.634 129.105 105.634C128.614 105.704 127.773 105.495 127.492 105.983C128.684 106.123 126.931 108.427 126.51 108.776C126.791 108.287 125.949 107.938 125.739 107.38C125.809 108.078 126.651 109.055 126.37 109.684C126.019 110.312 125.458 111.15 125.318 111.778L125.178 111.708C125.178 111.219 125.388 110.801 125.599 110.382C125.318 110.172 125.458 109.544 124.827 109.753C124.897 109.265 124.967 108.776 125.108 108.357C125.178 108.287 125.528 107.38 125.108 107.659C124.056 108.427 124.406 108.916 124.687 110.102C124.406 109.893 124.056 109.684 123.705 109.614C123.986 109.963 124.617 110.102 124.827 110.452C124.967 110.731 124.617 111.569 124.687 111.848C124.827 112.337 125.528 112.057 125.318 112.895C125.178 113.593 124.757 113.523 124.196 113.663C124.687 113.663 125.599 113.523 125.458 114.222C125.388 114.501 124.336 114.571 124.056 114.571C124.196 114.64 124.336 114.78 124.477 114.92C124.266 114.989 124.126 115.129 123.845 115.129C124.126 115.757 124.477 115.199 124.897 115.408C124.617 115.548 124.336 115.757 124.056 115.897C123.845 116.037 123.495 115.618 123.355 115.757C123.004 115.967 122.653 116.805 122.443 117.154C122.232 117.433 121.671 117.293 121.321 117.712C121.04 118.061 120.76 118.55 120.339 118.829C118.936 119.667 118.726 120.016 117.955 121.482C117.604 122.18 117.814 123.437 118.165 124.135C118.726 125.392 119.147 126.509 119.568 127.835C119.778 128.533 119.918 130.279 119.427 130.768C119.077 131.117 118.726 131.675 118.305 131.047C118.165 130.837 117.324 130.139 117.324 130.069C117.183 129.441 116.903 129.092 116.692 128.603C116.482 128.045 116.201 127.766 116.342 127.137C116.272 127.207 116.131 127.277 116.061 127.416C115.851 126.579 116.552 125.462 115.781 124.833C115.079 124.345 114.659 123.367 113.817 123.646C113.326 123.786 112.905 124.135 112.415 123.856C112.064 123.577 111.503 123.158 111.082 123.018C110.311 122.809 109.048 123.786 108.838 122.529C108.698 123.646 106.243 122.809 105.542 123.437C106.033 123.507 107.926 123.716 106.524 124.414C106.664 124.484 107.436 124.764 107.436 124.903C107.506 125.322 107.155 125.462 106.945 125.392C107.155 124.903 106.384 124.694 106.033 124.484C106.103 124.833 105.963 124.973 105.963 125.252C105.612 124.554 105.332 125.252 104.841 124.903C104.28 124.484 103.999 124.065 103.298 124.275C102.947 124.414 102.386 124.065 102.036 123.926C101.334 123.646 100.212 124.484 99.5812 124.764C98.4592 125.182 95.8645 127.137 95.8645 128.673C95.8645 129.162 96.4956 129.651 96.5658 130.139C96.5658 130.488 96.3554 130.977 96.2151 131.326C96.0047 132.164 95.584 133.071 95.584 133.979C95.584 136.213 95.8645 137.819 97.1268 139.704C97.8281 140.821 98.1086 141.589 99.3709 141.938C99.6514 142.008 100.002 142.636 100.212 142.566C100.703 142.357 101.194 142.217 101.685 142.008C102.176 141.798 102.527 141.728 103.017 141.728C103.368 141.728 103.649 142.147 103.859 142.078C104.069 142.008 104.35 141.938 104.49 141.798C104.63 141.728 104.35 141.379 104.49 141.24C104.911 140.821 105.121 140.751 105.262 140.123C105.542 139.145 105.472 138.028 106.454 137.679C106.875 137.54 108.277 137.191 108.698 137.26C109.259 137.33 110.872 136.981 110.381 138.238C110.171 138.726 109.539 140.193 109.189 140.193C109.399 140.262 109.259 140.472 109.68 140.472C109.539 140.611 109.399 140.751 109.259 140.891L109.329 141.03C109.399 140.96 109.469 140.891 109.539 140.891C109.329 141.449 109.189 142.078 109.048 142.636C108.768 142.357 108.698 142.008 108.768 141.589C108.628 141.728 108.487 142.078 108.347 142.287C109.119 142.357 108.207 143.753 108.487 144.312C108.698 144.8 107.926 145.708 107.576 145.987C108.628 146.336 109.68 146.057 110.872 146.266C111.363 146.336 111.643 145.917 112.134 145.987C112.625 146.057 113.326 145.987 113.817 146.197C114.799 146.615 115.5 147.314 115.29 148.5C115.15 149.268 115.079 149.967 114.939 150.735C114.869 151.153 114.518 151.572 114.448 151.991C114.168 154.016 116.692 157.367 118.516 156.599C119.638 156.11 120.269 155.691 121.461 156.04C122.653 156.389 123.074 157.018 123.916 157.995C123.845 156.529 125.669 154.574 126.37 153.457C126.58 153.108 127.913 152.899 128.263 152.759C129.245 152.41 130.227 152.061 131.209 151.712C132.12 151.363 133.733 152.201 134.575 152.34C136.889 152.899 139.203 153.387 141.518 153.946C142.78 154.225 144.042 154.225 145.024 155.203C146.847 156.948 148.6 158.624 150.424 160.369C151.546 161.486 154.07 161.486 155.473 161.835C156.805 162.184 157.927 164.418 158.769 165.535C159.61 166.652 160.522 167.769 161.364 168.956C161.574 169.235 162.065 170.143 162.345 170.283C164.169 170.981 166.062 171.609 167.886 172.307C169.709 173.005 171.602 173.634 173.496 174.332C175.039 174.89 176.652 176.566 177.984 177.543C178.264 177.543 179.948 177.613 180.018 177.753C180.579 178.102 180.789 178.94 180.999 179.777ZM121.321 100.887C121.321 101.445 119.427 101.934 118.866 101.864C118.025 101.864 117.955 101.864 117.324 102.423C116.903 102.772 116.622 103.191 115.991 102.912C116.061 102.493 116.412 102.213 116.763 102.144C116.552 101.795 116.482 102.074 116.412 101.655C115.991 102.213 115.64 102.772 115.29 103.4C115.57 103.47 115.921 103.54 116.201 103.68C116.131 103.749 116.061 103.889 115.991 103.959C117.253 104.098 117.744 103.47 118.796 103.051C119.848 102.632 120.549 102.213 121.461 101.515C121.531 101.236 121.601 101.096 121.321 100.887ZM122.934 100.538C123.916 101.445 125.949 99.7001 124.897 99.2812C125.178 99.0019 125.458 98.7925 125.739 98.5132C125.178 98.7227 123.916 99.7001 123.495 99.4906C122.723 99.1416 121.812 99.6303 121.04 99.7699C119.427 101.934 122.303 99.8397 122.934 100.538ZM103.649 94.1847C104.21 94.464 104.771 94.1149 105.332 93.9055C105.262 94.0451 105.262 94.1847 105.191 94.2545C106.524 94.9527 108.487 92.2299 109.469 92.9979C109.048 93.1375 108.558 93.6262 108.417 94.1149C108.908 93.8357 109.329 93.8357 109.68 94.2545C110.03 94.6734 110.311 94.464 110.732 94.7432C110.942 94.8131 112.835 94.1847 113.186 94.1149C112.976 94.7433 113.537 94.5338 113.957 94.7432C114.238 94.8829 114.378 95.3716 114.659 95.6508C114.168 95.581 113.677 95.3018 113.467 95.8603C112.765 95.0923 111.433 95.5112 110.942 96.2792L110.802 96.1395C110.872 95.9999 110.942 95.9301 111.012 95.7905C110.802 95.9301 110.661 95.9301 110.451 96.0697C110.451 95.9301 110.381 95.7905 110.381 95.7207C109.89 96.2094 109.119 97.466 108.978 98.0944C109.539 98.234 109.82 97.1868 110.241 96.8377C110.311 97.3264 109.82 98.0944 109.68 98.6529C109.469 99.351 109.119 100.119 109.189 100.887C109.259 102.004 109.82 104.936 110.942 102.702C111.573 101.515 111.363 100.677 111.082 99.4906C110.802 98.1642 111.854 97.9547 112.204 97.117C112.204 97.3264 112.204 97.6755 112.204 97.8849C112.555 97.466 112.415 96.7679 113.186 96.6981C112.555 95.8603 113.817 95.9999 114.238 96.4188C114.659 96.9075 115.29 96.6981 115.43 97.3962C115.29 97.3962 115.29 97.3264 115.22 97.3962C115.5 97.8151 115.57 98.5831 115.15 98.8623C115.079 98.9321 114.448 99.5604 114.518 99.7699C114.659 100.189 115.64 99.2114 115.921 99.2812C116.482 99.2812 116.482 100.747 116.552 101.236C116.833 100.887 117.183 100.538 117.464 100.189C117.674 99.9793 117.464 99.351 117.604 99.0019C117.814 98.3736 118.516 97.6057 117.534 97.117C118.235 96.7679 117.955 97.6755 118.516 97.6057C118.446 97.8151 118.446 97.8151 118.305 98.0245C118.446 98.1642 118.446 98.0944 118.516 98.3038C118.866 97.9547 119.497 98.4434 119.848 98.3038C119.918 98.3038 119.708 97.6755 120.269 98.0245C119.568 97.3962 119.638 95.9999 118.586 95.7905C117.674 95.581 116.622 95.581 115.711 95.3716C115.36 95.3018 113.537 94.7432 113.677 94.5338C113.817 94.2545 113.677 94.1149 113.537 93.9055C113.396 93.696 113.677 93.4866 113.607 93.2772C113.396 92.6488 112.835 92.9979 113.186 92.0205C111.854 92.2299 111.854 91.6714 111.152 90.6242C110.802 90.0657 110.311 90.694 109.96 90.5544C109.469 90.3449 109.048 90.0657 108.558 90.1355C109.048 90.5544 108.628 90.8336 108.207 91.1129C108.347 90.9035 108.417 90.694 108.487 90.4147C108.067 90.6242 108.137 91.1827 107.716 91.3223C107.786 91.1827 107.856 90.9733 107.926 90.8336C107.225 90.9733 107.506 91.6016 107.015 91.8809C106.384 92.1601 105.823 92.4394 105.191 92.7186C104.771 93.1375 104.21 93.6262 103.649 94.1847ZM69.0056 52.1564C68.7952 52.1564 68.655 52.0167 68.4446 52.0167C68.5848 51.8771 68.7251 51.6677 68.8653 51.5979C68.2342 51.528 67.8134 52.296 67.1823 52.3658C66.3407 52.5054 65.9901 52.5753 65.2187 52.2262C65.4291 51.528 66.481 51.3884 67.042 51.1092C65.8498 50.6903 65.5693 50.5506 64.4473 51.0393C63.746 51.3186 63.0447 51.528 62.3435 51.8073C61.5721 52.0866 60.8007 52.1564 60.0293 52.4356C59.6085 52.5753 57.9254 52.6451 59.1877 53.4828C59.2579 53.413 59.4682 53.2734 59.5384 53.2036C59.4682 53.1338 59.4682 53.064 59.3981 52.9941C59.889 52.7847 61.2214 52.7847 61.7123 52.9243C61.6422 52.7847 61.6422 52.7847 61.5721 52.6451C62.4136 52.5054 63.2551 52.6451 64.0265 53.1338C63.6058 53.7621 62.5539 53.2036 61.9227 53.413C62.2032 53.6225 62.4837 53.8319 62.624 54.1112C62.2733 54.181 61.9928 54.3904 61.7123 54.5999C62.2733 55.2282 61.3617 55.298 60.9409 55.3678C61.5019 55.7867 62.1331 55.5075 62.7642 55.7867C63.185 55.9962 63.746 54.949 64.0967 54.6697C64.7278 54.2508 65.7797 54.5999 64.9382 55.1584C64.5876 55.3678 64.5174 55.7169 64.3772 55.7867C64.2369 55.9264 63.8863 55.9264 63.746 56.066C64.5876 56.834 65.4291 54.6697 66.481 54.949C66.3407 54.5999 66.0602 54.3206 65.7096 54.2508C66.5511 53.3432 68.3043 54.6697 68.655 53.6923C68.5147 53.7621 68.3043 53.7621 68.1641 53.7621C68.1641 53.1338 68.5848 53.4828 68.7251 53.1338C68.7952 52.7149 68.9355 52.4356 69.0056 52.1564ZM80.7169 60.8832C79.8053 60.4643 78.3326 60.185 77.491 60.8832C77.1404 61.1624 76.93 61.6511 76.6495 61.9304C76.1586 62.4191 75.9482 62.5587 75.3171 62.6286C74.7561 62.6984 73.7743 62.6286 73.4938 61.9304C73.4236 61.721 72.3717 62.0002 72.0912 61.4417C72.0211 61.3021 71.0393 60.8832 70.9692 61.0228C70.7588 61.2323 71.8808 61.721 72.0912 61.721C71.7406 62.4889 73.4938 63.1173 72.4418 63.3965C72.0912 63.4663 71.8107 63.1871 71.6003 63.606C71.3198 63.955 71.4601 64.1645 71.0393 64.2343C71.1094 64.3041 71.1796 64.3739 71.2497 64.4437C70.899 64.723 70.4783 64.4437 70.0575 64.4437C70.0575 64.5135 70.0575 64.5834 70.1276 64.6532C69.7069 64.6532 69.3562 64.4437 68.8653 64.4437C69.4264 65.2117 70.899 65.4211 71.8107 65.5608C72.3717 65.6306 74.5457 65.3513 74.195 64.5834C74.8963 63.955 75.3171 64.1645 76.0184 63.8154C76.4391 63.606 76.8599 63.0474 77.2807 62.6984C77.1404 62.6984 77.0703 62.6984 76.93 62.6984C77.4209 62.2795 77.7014 62.0002 78.1923 61.8606C78.6832 61.721 78.9637 61.9304 79.3845 61.5115C79.0338 61.6511 78.9637 61.5813 78.6131 61.5115C78.9637 61.4417 79.2442 61.3719 79.5949 61.2323C79.2442 61.2323 78.9637 61.2323 78.6832 61.0228C78.8936 61.0228 79.1741 61.0228 79.4546 61.0228C78.543 60.7436 77.7715 61.3021 76.93 61.8606C77.2105 60.8134 80.0156 60.185 80.1559 61.3719C80.3663 61.3021 80.5767 61.0228 80.7169 60.8832ZM95.8645 84.3409C95.9346 83.7824 95.8645 84.0616 96.2151 83.8522C96.2151 83.9918 96.145 84.1314 96.145 84.2711C96.2151 84.1314 96.2151 84.2013 96.2852 83.9918C96.706 84.1314 96.5658 84.69 96.5658 85.1787C96.706 84.8994 96.9164 84.69 97.1969 84.8296C97.4073 84.8994 97.0566 85.5277 96.9865 85.7372C97.1969 85.5277 97.3372 85.5277 97.4774 85.4579C96.9865 85.807 96.8463 86.5051 97.0566 87.1335C97.267 87.692 97.6177 87.0636 97.5475 86.7146C97.6878 86.7844 97.7579 86.7844 97.8982 86.8542C97.6878 86.2957 98.1086 85.7372 97.7579 85.4579C97.4073 85.1088 97.1268 84.3409 96.9865 83.922C96.706 83.2238 95.3736 80.2916 95.9346 79.9426L95.7944 79.8727C95.584 80.0822 95.584 80.0822 95.3035 80.152C95.3736 79.8029 95.584 79.5935 95.8645 79.5237C95.7943 79.4539 95.584 79.3142 95.584 79.2444C95.1632 80.0124 95.1632 80.2916 95.7944 80.7105C95.3035 80.5011 94.3918 80.0124 94.1814 80.7803C93.8308 82.1068 94.0412 81.8276 95.0229 82.037C93.9009 82.2464 95.3035 83.5729 95.5138 84.1314C95.584 84.2013 95.7242 84.2711 95.8645 84.3409ZM3.50638 66.608C2.59472 66.2589 2.17396 66.8872 1.19217 66.8174C1.61294 67.4458 2.24408 67.5156 2.87523 67.7948C3.01549 67.4458 3.36613 67.5854 3.71676 67.5156C3.71676 67.4458 3.71676 67.3759 3.71676 67.3061C3.57651 66.9571 3.296 67.0269 3.50638 66.608ZM58.4865 37.4953C59.328 37.9142 60.0293 38.1935 60.6604 38.8916C61.7123 40.0785 61.5721 40.0785 62.8344 39.3105C63.0447 39.1709 63.2551 39.1011 63.4655 38.9614C63.6759 38.8916 63.6058 39.2407 63.746 39.2407C64.1668 39.1011 64.5875 38.8916 65.0083 38.6822L65.359 36.867C65.9901 37.2859 66.6213 36.7274 66.7615 36.099C66.9018 35.5405 67.1823 35.5405 67.6732 35.3311C68.7952 34.8424 70.4783 34.4933 71.3899 33.7253C71.951 33.2366 71.951 32.9574 71.2497 32.4687C70.7588 32.1196 70.338 31.7007 69.777 31.4913C68.7251 31.0724 67.603 30.6535 66.6914 31.6309C66.7615 31.4913 66.7615 31.2818 66.8316 31.0724C65.5693 31.4215 64.5174 29.9553 63.3954 30.1648C62.063 30.3742 60.6604 30.5837 59.328 30.7233C59.5384 31.1422 60.5903 32.4687 60.3799 32.6781C59.9591 33.097 58.8371 34.1442 59.4682 34.7725C58.2761 34.9122 59.1877 35.3311 58.6968 35.8896C58.3462 36.3783 57.715 36.867 57.8553 37.5651C57.9956 37.6349 58.2761 37.6349 58.4865 37.4953ZM63.746 26.1854C64.4473 26.2552 64.0967 25.6967 64.2369 25.4872C64.6577 25.1381 65.1486 25.6268 65.0784 26.325C65.4291 26.1854 65.9901 26.1155 66.2706 25.8363C66.5511 25.4872 65.7797 24.9287 66.2706 24.6494C66.5511 24.5098 66.7615 25.557 67.3225 24.9985C67.603 24.6494 67.3927 24.3004 67.042 24.1607C67.4628 23.8815 67.8836 24.3004 67.8836 23.4626C67.8836 23.1135 68.5147 23.1833 68.655 23.323C67.603 23.9513 68.655 24.9985 69.5666 24.7891C70.1978 24.6494 71.7406 23.4626 70.6185 22.9041C70.7588 22.8343 71.1094 22.7644 71.3198 22.7644C69.8471 22.4852 71.1796 21.8569 71.8107 21.6474C70.899 21.1587 70.5484 20.7398 69.5666 21.1587C69.7069 21.2285 69.777 21.3682 69.9874 21.438C69.5666 21.8569 69.1459 21.5776 68.655 21.3682C68.3043 21.2285 67.8134 21.438 67.4628 21.5078C66.481 21.6474 66.2005 21.9965 65.4291 22.6946C64.9382 23.1135 63.9564 24.3702 63.2551 24.44C62.2032 24.5796 61.3617 24.8589 62.2733 25.9759C62.7642 26.1155 63.2551 26.1854 63.746 26.1854ZM74.3353 20.1115C73.4236 19.2737 73.4236 19.2039 72.3016 19.6228C72.7224 19.9021 73.073 20.1813 73.4938 20.4606C73.7743 20.3908 74.0548 20.2511 74.3353 20.1115ZM20.4773 71.495C20.898 71.7743 21.5292 71.3554 21.7396 71.0761C21.8097 71.1459 21.8798 71.2157 21.9499 71.2856C22.0201 71.2157 22.0902 71.0761 22.1603 71.0063C21.8798 70.8667 21.5993 70.727 21.2487 70.6572C20.9682 70.7969 20.6175 71.0761 20.4773 71.495ZM49.6504 80.2218C49.7205 79.4539 47.827 79.7331 47.827 79.8727C47.7569 80.8502 49.8607 84.4805 50.6322 83.6427C50.4218 83.4333 50.2114 83.2238 50.001 83.0842C49.7205 82.037 49.5802 81.269 49.6504 80.2218ZM19.4955 72.5422C18.3033 71.7743 18.0929 74.3574 19.3552 74.2876C19.7059 74.2876 19.9864 73.6593 20.4773 73.5894C20.898 73.5196 21.2487 73.3102 21.2487 72.8215C21.5993 72.9611 21.8097 72.8913 21.9499 72.5422C21.8097 72.5422 21.7396 72.4724 21.5993 72.4724C21.8097 71.5648 19.3552 71.4252 19.4955 72.5422ZM60.45 89.7864C60.3098 89.5072 59.7487 89.4373 59.4682 89.2977C59.0475 89.1581 58.9773 88.8788 58.767 88.4599C58.0657 87.2033 57.8553 87.4825 56.593 87.0636C55.6112 86.7146 55.2606 86.2259 54.2087 86.575C55.8917 88.5996 57.6449 89.7864 59.889 90.9733C61.3617 91.5318 61.1513 90.9733 60.45 89.7864ZM296.78 189.202C296.43 188.714 295.307 186.968 295.237 188.644C295.167 189.97 294.817 189.97 293.975 190.948C293.274 191.716 292.993 192.414 292.152 192.903C291.17 193.391 290.469 193.74 289.417 193.88C288.996 193.95 288.575 195.695 288.715 196.184C288.926 197.022 289.487 198.348 289.417 199.186C289.347 200.093 288.295 201.001 288.014 201.909C287.664 202.956 287.874 203.724 288.154 204.771C288.435 205.748 288.575 206.726 288.715 207.703C288.786 208.052 290.399 208.681 290.749 208.541C290.96 208.401 292.713 207.913 292.783 207.843C292.993 207.075 293.204 206.377 293.484 205.609C294.326 202.886 295.097 200.163 295.939 197.51C296.5 195.695 296.64 194.857 296.5 192.903C296.71 193.112 296.991 193.391 297.201 193.601C297.622 192.065 297.131 190.808 296.78 189.202ZM391.943 144.94C391.663 145.498 392.013 146.406 392.084 147.034C392.154 147.523 392.855 147.593 393.276 147.732C392.434 148.151 392.995 148.989 393.697 149.059C394.328 149.129 394.117 148.64 394.889 149.059C395.169 149.199 395.38 149.548 395.52 149.827C395.59 149.478 395.66 149.129 395.73 148.78C396.502 149.059 396.572 148.989 396.642 149.827C396.642 150.176 397.483 150.525 397.764 150.665C398.185 149.687 397.203 149.967 397.273 149.129C397.904 149.478 398.395 149.129 397.834 148.5C397.554 148.221 397.554 148.85 397.343 148.78C397.063 148.71 396.782 148.431 396.502 148.291C396.221 148.151 396.011 148.082 395.73 148.012C395.38 147.942 395.31 148.5 395.099 148.5C394.398 148.5 394.678 147.802 394.398 147.244C393.907 146.266 394.538 146.546 394.468 145.638C394.468 145.289 394.959 145.638 395.099 145.429C395.239 145.219 395.31 144.8 395.31 144.591C395.66 143.544 395.239 143.963 395.099 143.055C394.959 142.566 395.59 142.287 395.239 141.659C394.187 142.147 394.678 141.659 393.767 141.449C393.486 141.379 392.855 141.589 392.855 141.938C392.715 142.776 392.574 143.613 392.434 144.451C392.364 144.94 392.855 145.01 392.645 145.568C392.364 145.289 392.154 145.149 391.943 144.94ZM394.328 133.351C394.468 132.583 395.239 130.628 393.837 131.326C393.065 131.675 392.364 132.722 392.154 133.7C391.943 134.747 392.645 135.445 393.206 136.283C393.697 135.236 394.047 134.538 394.328 133.351ZM391.172 152.34C390.962 153.457 390.821 154.086 390.05 154.784C389.208 155.552 388.788 156.11 388.227 157.088C389.279 156.459 390.33 156.18 390.541 154.854C390.611 154.505 391.452 154.086 391.733 153.876C391.803 153.806 391.523 152.899 391.663 152.62C391.452 152.55 391.312 152.48 391.172 152.34ZM400.218 155.761C400.078 155.342 399.798 154.993 399.447 154.923C399.517 155.342 399.587 155.691 399.657 156.11C399.167 156.04 399.307 155.971 399.096 156.25C398.676 155.971 398.535 156.32 398.535 156.808C397.904 156.39 397.624 157.367 397.063 157.576C397.413 157.157 397.343 156.529 396.782 156.459C396.151 156.39 396.361 157.297 396.011 157.437C395.38 157.646 394.187 158.344 394.889 159.322C395.169 159.042 395.8 157.088 396.011 158.554C396.151 158.205 396.221 158.274 396.361 158.065C396.432 158.484 396.432 158.344 396.712 158.554C396.642 158.344 396.712 158.135 396.642 157.925C398.115 157.716 397.133 159.112 397.413 159.88C397.624 160.369 398.816 161.207 399.026 160.509H399.167C398.816 161.556 399.868 161.137 399.728 160.229C399.587 159.601 399.167 159.112 399.938 158.554C400.289 159.042 400.078 159.601 400.429 160.159C400.429 159.88 400.499 159.531 400.499 159.252C400.569 159.322 400.639 159.322 400.709 159.392C400.779 158.973 401.34 157.367 400.709 157.367C400.779 157.227 400.779 157.018 400.709 156.878C400.499 156.878 400.429 156.739 400.359 156.739C400.429 156.599 400.569 156.529 400.639 156.459C400.709 156.11 400.569 155.622 400.218 155.761ZM392.925 184.315C392.645 183.687 390.611 182.989 390.681 184.036C391.382 184.315 393.486 185.712 392.925 184.315ZM388.507 182.43C388.297 182.151 387.525 181.872 387.245 181.872C386.614 181.872 386.614 182.151 386.333 182.779C387.666 183.198 388.577 183.128 389.91 182.849C391.873 182.5 389.769 181.453 388.928 181.732C389.208 182.221 388.928 182.361 388.507 182.43ZM394.258 182.989C394.468 182.989 394.538 182.64 394.819 182.71C395.45 182.849 395.73 182.221 396.081 182.221C396.922 182.221 398.395 182.64 399.026 182.011C398.044 181.662 397.413 181.942 396.432 181.872C395.8 181.802 395.8 181.872 395.31 182.291C395.029 182.5 394.748 182.011 394.398 182.221C393.767 182.57 392.434 181.453 391.873 182.151C391.172 182.919 393.065 182.71 393.346 183.059C393.837 182.64 393.977 183.059 394.258 182.989ZM395.099 177.543C395.38 177.753 395.59 178.032 395.871 178.241C396.151 177.753 396.502 177.613 396.151 177.194C395.941 176.845 396.151 176.636 396.502 176.706C396.291 175.938 395.73 176.217 395.871 176.915C395.52 175.938 395.169 177.194 395.099 177.543ZM377.006 168.677C376.936 169.026 377.357 169.235 377.427 169.584C377.497 169.794 377.146 169.864 377.217 170.073C377.287 170.352 377.357 170.562 377.427 170.841C377.497 171.19 377.707 170.911 377.637 171.469C378.058 171.26 377.988 171.469 378.128 171.051C378.829 171.679 378.689 173.005 378.829 173.913C378.9 174.681 380.442 174.053 380.863 173.913C380.933 174.262 381.003 174.611 381.074 174.96C382.266 174.262 382.406 173.983 383.528 174.751C383.738 174.89 384.159 174.681 384.44 174.751C384.72 174.89 384.79 175.519 384.86 175.868C385.492 175.589 386.123 175.239 386.754 174.96C386.614 175.379 386.614 175.728 387.105 175.728C387.105 174.821 387.175 173.913 387.175 173.075C387.175 172.237 387.385 172.237 388.016 171.679C388.858 170.911 388.858 170.981 388.788 169.794C388.788 169.235 389.138 168.328 389.629 168.398C390.611 168.607 391.032 168.467 390.19 167.63C389.98 167.42 389.489 167.141 389.349 166.862C389.279 166.722 389.559 166.303 389.489 166.094C389.138 165.047 388.717 165.116 388.788 163.86C388.788 163.231 390.05 163.231 390.401 163.162C390.19 162.882 389.98 162.603 389.84 162.394C390.33 162.254 390.821 162.114 391.242 161.975C391.102 161.556 390.821 161.626 390.401 161.486C390.12 161.416 389.84 160.927 389.629 160.648C389.349 160.299 388.297 159.322 387.946 159.322C387.525 159.392 386.614 160.858 386.263 161.207C385.702 161.835 386.193 162.324 385.421 162.533C384.44 162.812 384.299 162.812 383.668 163.65C383.248 164.279 383.037 164.977 382.336 165.186C381.564 165.396 380.933 165.465 380.513 166.164C379.952 167.071 379.741 167.071 380.513 167.769C379.811 167.56 378.409 167.63 378.268 166.652C377.988 166.792 377.707 167.001 377.357 167.211C377.146 167.56 377.076 168.118 377.006 168.677ZM398.325 184.595C398.605 184.176 398.816 183.896 399.237 183.687C399.938 183.338 401.621 182.919 401.901 182.081C401.27 182.151 400.639 182.151 400.008 182.291C399.728 182.361 399.377 182.361 399.167 182.5C399.026 182.57 399.026 182.919 398.816 182.989C398.255 183.268 397.694 183.408 397.203 183.827C396.712 184.315 397.483 184.525 396.852 185.083C397.343 185.013 397.974 185.083 398.325 184.595ZM129.947 142.217C130.227 142.287 130.788 142.078 131.069 142.217C131.279 142.357 131.209 143.264 131.77 143.125C132.05 143.055 132.05 142.147 132.261 142.008C132.681 141.728 132.752 142.147 132.892 142.147C133.593 142.147 134.154 141.868 134.926 141.868C135.557 141.868 135.416 142.427 135.837 141.728C135.977 141.449 135.346 141.03 135.066 141.03C134.365 140.891 134.365 140.891 134.014 140.193C133.733 139.704 133.733 140.053 133.313 139.913C132.962 139.774 132.471 139.425 132.12 139.634C131.98 139.704 131.349 139.843 131.209 139.843C130.227 139.843 129.947 139.494 128.965 139.983C129.947 140.472 129.876 140.751 130.508 141.659C129.876 142.078 127.352 141.1 127.702 142.008C128.474 142.496 128.824 142.078 129.947 142.217ZM207.999 57.3925C208.77 57.6019 209.191 57.0434 209.191 56.2056C209.822 56.5547 210.102 55.9264 210.523 55.5075C210.032 55.1584 210.383 54.4603 210.173 54.3206C209.682 54.0414 209.261 53.6225 208.63 53.9017C209.401 52.6451 205.754 51.179 206.386 52.8545C205.334 52.7149 205.053 53.2734 204.001 52.7847C204.071 53.2036 204.142 53.5527 204.142 53.9716C203.721 53.413 203.581 52.9243 202.949 52.8545C202.388 52.8545 202.178 53.4829 202.388 53.9716C202.038 53.5527 201.687 52.9243 201.056 52.9941C201.477 54.0414 200.916 53.5527 200.635 54.0414C200.425 54.3904 200.285 54.8791 200.074 55.298C199.794 54.8791 199.513 54.4603 199.303 53.9716C199.583 54.0414 199.934 53.8319 199.864 53.4828C199.864 53.2036 199.233 53.064 199.092 52.9243C198.321 52.2262 198.391 52.0866 197.339 52.0866C197.479 52.5753 197.83 52.5054 198.321 52.5753C198.461 53.9017 197.129 52.4356 196.708 52.9243C196.217 53.5527 197.129 53.5527 196.989 53.8319C196.848 54.1112 196.357 53.9017 196.147 53.7621C196.147 53.9017 196.147 54.0414 196.147 54.181C195.796 54.1112 195.866 54.2508 195.516 54.3904C196.357 54.7395 196.638 54.5999 197.55 54.2508C197.97 54.1112 198.882 54.5301 199.303 54.5999C198.952 54.8093 198.601 54.949 198.181 55.1584C198.531 55.3678 198.882 55.4377 199.233 55.2282C199.233 55.298 199.233 55.4377 199.233 55.5075C198.181 55.5075 197.129 55.9264 196.147 55.9264C196.287 56.6943 198.04 56.3452 198.601 56.3452C198.321 56.6943 198.461 56.9736 198.882 56.9038C198.882 57.0434 198.812 57.1132 198.812 57.2528C198.952 57.2528 199.022 57.2528 199.162 57.3226C198.882 58.0906 197.62 57.8812 197.9 58.7189C198.742 58.6491 199.583 58.5095 200.425 58.3699C200.635 58.3699 200.846 58.9284 201.056 59.068C201.336 59.2775 201.897 59.2775 202.178 59.3473C202.879 59.4869 203.44 59.5567 204.142 59.2076C204.492 59.068 204.422 58.7888 204.773 58.7189C205.193 58.6491 205.544 58.5793 205.965 58.5793C206.456 58.2302 207.508 57.2528 207.999 57.3925ZM199.162 40.5672C199.022 39.9388 198.321 38.4727 198.601 37.8444C199.162 36.2387 199.513 34.214 200.635 32.9574C201.407 32.1196 202.108 31.2818 202.879 30.444C203.09 30.2346 202.529 28.3496 202.529 28.0005C202.388 27.3024 202.458 26.1155 201.897 25.6967C201.126 25.208 200.425 24.6494 199.653 24.1607C200.775 23.1135 201.827 21.9965 202.949 20.9493C201.757 20.1813 201.056 19.8322 200.495 18.5058C200.074 17.4585 201.407 16.1321 201.897 15.2943C202.458 14.3169 203.581 13.9678 204.492 13.3395C205.474 12.6413 206.245 12.013 207.087 11.0356C206.806 10.8262 206.526 10.5469 206.245 10.3375C207.227 10.128 208.419 10.128 209.331 9.5695C210.453 8.94116 211.645 8.24302 212.767 7.61469C211.505 7.12599 210.102 6.28821 208.77 6.07877C207.788 5.93914 205.825 5.7297 205.193 6.49766C204.773 7.05617 204.492 7.75432 203.791 7.6845C203.02 7.54487 202.178 7.40524 201.407 7.26561C200.495 7.12599 198.672 8.38265 197.83 8.73172C197.97 8.45246 199.653 5.79951 198.461 5.79951C197.409 5.79951 196.428 5.93914 195.516 5.24099C196.918 4.75229 198.391 4.19378 199.794 3.70507C196.989 2.51823 194.534 1.26156 191.589 0.842677C188.293 0.353975 185.137 -0.204542 181.841 0.0747164C180.649 0.144531 179.457 0.28416 178.264 0.353975C177.844 0.353975 177.072 0.28416 176.652 0.493604C176.09 0.842677 176.02 2.09934 175.249 1.95971C174.267 1.82008 173.356 1.61064 172.444 1.47101C171.322 1.26156 169.919 0.703047 168.797 1.19175C167.184 1.88989 165.571 2.65786 164.029 3.356C165.571 4.3334 167.184 5.03155 168.166 6.63728C165.431 5.65988 162.977 4.89192 160.172 4.26359C159.33 4.12396 158.068 4.54285 157.226 4.61266C155.263 4.89192 153.369 5.10136 151.406 5.38062C150.564 5.52025 149.232 5.38062 148.46 5.79951C147.338 6.35803 146.286 6.91654 145.164 7.47506C142.429 8.87135 139.764 10.2676 137.029 11.6639C138.011 12.781 139.203 12.5715 140.606 12.7112C140.325 13.4791 139.975 14.2471 139.694 15.015C139.344 15.8528 139.273 15.7132 138.362 15.7132C137.1 15.783 136.118 16.0622 134.855 16.4113C133.243 16.9 131.7 17.3189 130.087 17.8076C129.736 17.9472 129.736 18.8548 129.666 19.2737C129.596 19.553 130.297 20.2511 130.508 20.5304C130.998 21.1587 131.559 22.4852 132.261 22.8343C133.172 23.3928 134.084 23.9513 135.066 24.44C135.557 24.7193 136.819 25.8363 137.38 25.7665C138.432 25.6268 139.484 25.4872 140.536 25.3476C142.429 25.1381 144.042 25.4872 145.936 25.7665C146.917 25.9061 147.829 26.1155 148.811 26.2552C149.302 26.325 150.284 28.0704 150.564 28.4892C151.826 30.1648 152.528 32.1196 153.439 34.0744C153.93 35.1216 154.07 35.2613 153.72 36.3085C153.369 37.3557 152.808 37.984 153.509 38.752C154.281 39.5898 155.263 40.0086 154.912 41.1955C154.631 42.3125 154.141 43.0107 154.912 43.8484C155.894 44.8957 155.824 44.8957 157.156 44.5466C158.138 44.2673 159.049 43.9881 160.031 43.7088C159.961 44.407 159.821 45.1051 159.751 45.8731C159.751 46.0825 158.839 46.3618 158.629 46.4316C157.998 46.7108 157.296 46.9901 156.665 47.2694C156.525 47.3392 156.525 48.2468 156.455 48.4562C156.314 49.4336 155.824 51.0393 156.104 51.9469C156.595 53.2734 157.086 54.6697 157.577 55.9962C158.348 58.1604 159.751 59.9756 160.943 61.8606C161.644 62.9776 162.416 64.1645 163.117 65.2815C163.468 65.84 164.519 65.9797 165.08 66.1891C166.273 66.608 167.395 67.0269 168.587 67.4458C168.867 67.5156 170.48 67.5854 170.55 67.3759C171.252 65.1419 172.023 62.9078 172.724 60.6737C173.285 58.8586 173.917 57.1132 174.618 55.3678C174.968 54.3904 174.898 54.3904 175.81 54.1112C177.002 53.7621 178.124 53.3432 179.316 52.9941C180.018 52.7847 181.14 52.6451 181.771 52.2262C182.472 51.7375 183.173 50.4808 183.734 49.7827C184.225 49.1544 184.436 48.7355 185.137 48.5958C186.259 48.3166 187.311 48.0373 188.433 47.6882C189.976 47.2694 191.939 47.1297 193.342 46.2221C195.095 45.1051 196.918 44.0579 198.672 42.9409C199.373 41.8238 199.443 41.8936 199.162 40.5672ZM378.128 141.798C378.479 141.659 379.11 141.659 379.18 141.1C379.25 140.611 379.391 139.983 379.881 139.983C379.952 139.494 379.811 139.145 379.391 139.075C379.391 139.215 379.32 139.285 379.32 139.425C378.058 138.726 377.497 139.843 376.585 140.402C376.585 141.24 376.445 141.449 377.146 141.868C377.427 142.078 377.567 142.078 377.918 142.078C378.268 142.147 377.918 141.868 378.128 141.798ZM372.658 178.381C372.869 177.264 372.658 175.798 373.009 174.751C373.43 173.564 371.957 172.656 371.186 173.634C371.817 173.005 371.186 173.005 371.115 172.517C371.045 172.237 371.045 171.26 370.765 171.19C370.484 171.051 369.713 170.981 369.713 170.632C369.643 170.073 370.134 169.934 370.064 169.515C369.923 168.886 369.082 168.956 369.082 168.607C369.082 167.909 368.801 168.188 368.38 167.839C367.89 167.49 368.451 167.35 367.679 167.211C367.188 167.141 366.838 167.141 366.557 166.792C365.996 166.024 365.155 165.745 364.453 165.116C363.892 164.558 362.981 163.999 362.49 163.301C361.859 162.394 362.069 161.975 360.877 161.835C360.526 161.765 358.703 161.137 358.563 161.346C358.282 161.765 359.685 163.511 359.965 163.72C360.526 164.209 361.718 164.418 361.718 165.465C361.788 166.582 363.051 166.373 363.331 167.42C363.472 168.049 363.682 168.677 363.822 169.235C363.962 169.654 364.313 169.515 364.594 169.794C365.225 170.492 365.646 172.028 365.996 172.936C366.347 173.704 366.978 174.262 367.539 174.89C368.661 176.147 369.853 177.404 371.115 178.591C371.115 178.311 371.186 178.102 371.186 177.823C371.747 178.521 372.167 177.404 372.658 178.381ZM375.604 173.354C374.902 172.796 375.183 174.262 375.183 174.541C376.165 174.821 376.235 173.843 375.604 173.354ZM383.388 181.104C382.757 181.243 381.775 180.755 381.985 179.847C381.494 180.057 380.302 179.917 379.952 179.568C379.531 179.079 379.32 179.358 379.18 179.847C379.11 180.126 378.689 179.987 378.479 179.917C377.427 179.777 376.726 180.057 376.165 179.079C376.095 178.94 374.692 178.591 374.411 178.451C374.271 178.94 373.85 178.66 373.43 178.521C373.009 178.451 373.009 178.591 372.728 178.94C371.887 179.917 373.009 179.987 373.71 180.196C373.71 180.336 373.64 180.476 373.64 180.615C374.482 180.755 375.253 181.243 376.095 181.453C376.515 181.523 377.006 181.243 377.427 181.243C377.848 181.313 378.339 181.593 378.689 181.732C379.04 181.872 379.391 182.081 379.741 182.081C380.022 182.081 380.302 182.151 380.653 182.221C380.863 182.221 380.933 182.011 381.074 182.011C381.915 182.081 382.266 182.361 383.177 182.221C383.738 182.43 384.229 182.71 384.79 182.919C384.019 181.942 384.86 180.755 383.388 181.104ZM371.817 172.586C372.027 172.796 372.167 172.796 372.448 172.726C372.588 172.726 372.728 173.075 372.869 173.285C373.079 173.494 372.939 173.634 373.219 173.843C373.5 174.053 373.71 174.192 373.991 174.192C373.78 173.913 373.78 173.634 374.131 173.424C372.939 173.494 373.57 171.749 372.588 171.819C372.588 171.958 372.658 172.098 372.658 172.237C372.308 171.609 372.097 172.237 371.817 172.586Z" transform="translate(34 26) scale(2)" fill="white"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(859.474 468.395) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(854.935 460.781) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(857.07 456.211) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(867.177 458.332) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(547.667 186.191) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(543.128 178.578) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(545.263 174.008) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(555.37 176.129) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(509.799 195.969) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(505.26 188.355) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(507.395 183.785) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(517.502 185.906) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(796.046 237.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(791.507 229.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(793.642 224.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(803.749 226.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(816.046 297.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(811.507 289.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(813.642 284.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(823.749 286.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(794.046 301.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(789.507 293.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(791.642 288.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(801.749 290.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(352.046 433.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(347.507 425.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(349.642 420.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(359.749 422.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(200.046 237.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(195.507 229.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(197.642 224.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(207.749 226.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(156.046 243.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(151.507 235.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(153.642 230.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(163.749 232.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(208.046 265.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(203.507 257.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(205.642 252.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(215.749 254.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(278.046 245.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(273.507 237.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(275.642 232.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(285.749 234.957) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0 2.36804C0.590364 2.71089 1.26641 2.92688 1.9936 2.97373C2.99795 3.03839 3.94806 2.77184 4.7373 2.26944C5.12975 2.01962 5.48213 1.71145 5.78153 1.35622C5.53323 1.01235 5.26904 0.657526 4.99001 0.296025L4.76202 0C4.46198 0.471461 4.03057 0.849314 3.52278 1.0857L2.7439 0.32652L0 2.36804Z" transform="translate(686.046 311.02) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M0.604584 0C0.268048 0.58226 0.0560402 1.24712 0.00960309 1.96155C-0.0554133 2.96241 0.212865 3.90916 0.718502 4.69527C0.968667 5.08428 1.27703 5.43372 1.6323 5.73085C1.97783 5.48362 2.33448 5.22058 2.69787 4.94286L2.99492 4.71637C2.52216 4.41772 2.14318 3.98873 1.90604 3.48384L2.67357 2.70084L0.604584 0Z" transform="translate(681.507 303.406) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M5.78206 0.616686C5.19117 0.273085 4.51439 0.0564579 3.78629 0.009566C2.78092 -0.0551811 1.82989 0.211895 1.04024 0.715243C0.649454 0.96431 0.298489 1.2713 0 1.62495C0.248345 1.96895 0.512562 2.32398 0.791518 2.68577L1.019 2.9815C1.31913 2.51066 1.75027 2.13325 2.25773 1.8972L2.99226 2.609L5.78206 0.616686Z" transform="translate(683.642 298.836) scale(2)" fill="black"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M2.40197 5.71368C2.7324 5.13584 2.94121 4.47796 2.98716 3.77102C3.05213 2.77115 2.78441 1.82527 2.2797 1.03958C2.02876 0.648908 1.71919 0.298102 1.36237 0C1.01698 0.247188 0.660552 0.510198 0.297402 0.788014L0 1.01494C0.474427 1.31415 0.854625 1.74457 1.09198 2.25126L1.09653 2.2618L0.357757 3.02495L2.40197 5.71368Z" transform="translate(693.749 300.957) scale(2)" fill="black"/>
+<defs>
+<filter id="filter0_d" x="0" y="0" width="1046" height="594" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="4"/>
+<feGaussianBlur stdDeviation="8.5"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/packages/website/public/images/landing/project_logos/ercdex.png b/packages/website/public/images/landing/project_logos/ercdex.png
index 1367837e0..31d137be7 100644
--- a/packages/website/public/images/landing/project_logos/ercdex.png
+++ b/packages/website/public/images/landing/project_logos/ercdex.png
Binary files differ
diff --git a/packages/website/public/images/landing/project_logos/imToken.png b/packages/website/public/images/landing/project_logos/imToken.png
new file mode 100644
index 000000000..ffb3b2fd3
--- /dev/null
+++ b/packages/website/public/images/landing/project_logos/imToken.png
Binary files differ
diff --git a/packages/website/public/images/landing/project_logos/the_ocean.png b/packages/website/public/images/landing/project_logos/the_ocean.png
index 74678b5d4..0677abc29 100644
--- a/packages/website/public/images/landing/project_logos/the_ocean.png
+++ b/packages/website/public/images/landing/project_logos/the_ocean.png
Binary files differ
diff --git a/packages/website/public/images/lock_icon.svg b/packages/website/public/images/lock_icon.svg
new file mode 100644
index 000000000..83e8191a1
--- /dev/null
+++ b/packages/website/public/images/lock_icon.svg
@@ -0,0 +1,3 @@
+<svg width="26" height="32" viewBox="0 0 26 32" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6.47619 0C3.79509 0 1.60489 2.21216 1.60489 4.92014V6.33135C0.717479 6.33135 -3.60127e-08 7.05602 -3.60127e-08 7.95232V14.379C-3.60127e-08 15.2753 0.717479 16 1.60489 16H11.3475C12.2349 16 12.9524 15.2753 12.9524 14.379V7.95232C12.9524 7.05602 12.2349 6.33135 11.3475 6.33135V4.92014C11.3475 2.21216 9.1573 0 6.47619 0ZM9.6482 6.33135H3.30418V4.92014C3.30418 3.16567 4.72026 1.71633 6.47619 1.71633C8.23213 1.71633 9.6482 3.16567 9.6482 4.92014V6.33135Z" transform="scale(2)" fill="black"/>
+</svg>
diff --git a/packages/website/public/images/relayer_fallback.png b/packages/website/public/images/relayer_fallback.png
new file mode 100644
index 000000000..587fc9ef7
--- /dev/null
+++ b/packages/website/public/images/relayer_fallback.png
Binary files differ
diff --git a/packages/website/public/images/setup_account_icon.svg b/packages/website/public/images/setup_account_icon.svg
new file mode 100644
index 000000000..eaa5b2fd6
--- /dev/null
+++ b/packages/website/public/images/setup_account_icon.svg
@@ -0,0 +1,3 @@
+<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M16.5 9C16.5 13.1421 13.1421 16.5 9 16.5C4.85791 16.5 1.5 13.1421 1.5 9C1.5 4.85791 4.85791 1.5 9 1.5C13.1421 1.5 16.5 4.85791 16.5 9ZM18 9C18 13.9706 13.9707 18 9 18C4.0293 18 0 13.9706 0 9C0 4.02942 4.0293 0 9 0C13.9707 0 18 4.02942 18 9ZM9.21973 5.7196C9.5127 5.42664 9.9873 5.42664 10.2803 5.7196L13.0806 8.51953C13.373 8.8125 13.373 9.28735 13.0806 9.5802L10.2803 12.3802C9.9873 12.6731 9.5127 12.6731 9.21973 12.3802C8.92676 12.0873 8.92676 11.6124 9.21973 11.3196L10.7393 9.7998H4.75C4.33594 9.7998 4 9.46399 4 9.0498C4 8.63562 4.33594 8.2998 4.75 8.2998H10.7393L9.21973 6.78015C8.92676 6.4873 8.92676 6.01245 9.21973 5.7196Z" transform="scale(2)" fill="#3289F1"/>
+</svg>
diff --git a/packages/website/public/images/team/alexbrowne.png b/packages/website/public/images/team/alexbrowne.png
new file mode 100644
index 000000000..76a61913e
--- /dev/null
+++ b/packages/website/public/images/team/alexbrowne.png
Binary files differ
diff --git a/packages/website/public/images/team/amir.jpeg b/packages/website/public/images/team/amir.jpeg
deleted file mode 100644
index 7ee16263a..000000000
--- a/packages/website/public/images/team/amir.jpeg
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/team/amir.png b/packages/website/public/images/team/amir.png
new file mode 100644
index 000000000..2bb795d50
--- /dev/null
+++ b/packages/website/public/images/team/amir.png
Binary files differ
diff --git a/packages/website/public/images/team/chris.png b/packages/website/public/images/team/chris.png
new file mode 100644
index 000000000..242a2813f
--- /dev/null
+++ b/packages/website/public/images/team/chris.png
Binary files differ
diff --git a/packages/website/public/images/team/clay.png b/packages/website/public/images/team/clay.png
new file mode 100644
index 000000000..2bc828572
--- /dev/null
+++ b/packages/website/public/images/team/clay.png
Binary files differ
diff --git a/packages/website/public/images/team/fragosti.png b/packages/website/public/images/team/fragosti.png
new file mode 100644
index 000000000..60c168514
--- /dev/null
+++ b/packages/website/public/images/team/fragosti.png
Binary files differ
diff --git a/packages/website/public/images/team/greg.jpeg b/packages/website/public/images/team/greg.jpeg
new file mode 100644
index 000000000..a765e047f
--- /dev/null
+++ b/packages/website/public/images/team/greg.jpeg
Binary files differ
diff --git a/packages/website/public/images/team/mel.png b/packages/website/public/images/team/mel.png
new file mode 100644
index 000000000..52d779ad2
--- /dev/null
+++ b/packages/website/public/images/team/mel.png
Binary files differ
diff --git a/packages/website/public/images/team/peter.jpg b/packages/website/public/images/team/peter.jpg
new file mode 100644
index 000000000..fa976cb8d
--- /dev/null
+++ b/packages/website/public/images/team/peter.jpg
Binary files differ
diff --git a/packages/website/public/images/team/philippe.png b/packages/website/public/images/team/philippe.png
deleted file mode 100644
index cd43c2754..000000000
--- a/packages/website/public/images/team/philippe.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/team/remco.jpeg b/packages/website/public/images/team/remco.jpeg
new file mode 100644
index 000000000..e87e7bfd6
--- /dev/null
+++ b/packages/website/public/images/team/remco.jpeg
Binary files differ
diff --git a/packages/website/public/images/token_icons/firstblood.jpg b/packages/website/public/images/token_icons/1ST.png
index 9cd23b10e..9cd23b10e 100644
--- a/packages/website/public/images/token_icons/firstblood.jpg
+++ b/packages/website/public/images/token_icons/1ST.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ABYSS.png b/packages/website/public/images/token_icons/ABYSS.png
new file mode 100644
index 000000000..6ed2efef8
--- /dev/null
+++ b/packages/website/public/images/token_icons/ABYSS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ADT.png b/packages/website/public/images/token_icons/ADT.png
new file mode 100644
index 000000000..2e7f3f54f
--- /dev/null
+++ b/packages/website/public/images/token_icons/ADT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/AE.png b/packages/website/public/images/token_icons/AE.png
new file mode 100644
index 000000000..01dc13dda
--- /dev/null
+++ b/packages/website/public/images/token_icons/AE.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/AION.png b/packages/website/public/images/token_icons/AION.png
new file mode 100644
index 000000000..a2bfb9253
--- /dev/null
+++ b/packages/website/public/images/token_icons/AION.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/AIR.png b/packages/website/public/images/token_icons/AIR.png
new file mode 100644
index 000000000..ab3a13b6d
--- /dev/null
+++ b/packages/website/public/images/token_icons/AIR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ANT.png b/packages/website/public/images/token_icons/ANT.png
new file mode 100644
index 000000000..437a8f21a
--- /dev/null
+++ b/packages/website/public/images/token_icons/ANT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/APCC.png b/packages/website/public/images/token_icons/APCC.png
new file mode 100644
index 000000000..4294618be
--- /dev/null
+++ b/packages/website/public/images/token_icons/APCC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/APPC.png b/packages/website/public/images/token_icons/APPC.png
new file mode 100644
index 000000000..4294618be
--- /dev/null
+++ b/packages/website/public/images/token_icons/APPC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ARN.png b/packages/website/public/images/token_icons/ARN.png
new file mode 100644
index 000000000..0d17bb0dd
--- /dev/null
+++ b/packages/website/public/images/token_icons/ARN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ART.png b/packages/website/public/images/token_icons/ART.png
new file mode 100644
index 000000000..194f58fa0
--- /dev/null
+++ b/packages/website/public/images/token_icons/ART.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/AST.png b/packages/website/public/images/token_icons/AST.png
new file mode 100644
index 000000000..25d7c00ee
--- /dev/null
+++ b/packages/website/public/images/token_icons/AST.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/BAT.png b/packages/website/public/images/token_icons/BAT.png
new file mode 100644
index 000000000..840ed0a16
--- /dev/null
+++ b/packages/website/public/images/token_icons/BAT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/BCAP.png b/packages/website/public/images/token_icons/BCAP.png
new file mode 100644
index 000000000..acf50e368
--- /dev/null
+++ b/packages/website/public/images/token_icons/BCAP.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/BCPT.png b/packages/website/public/images/token_icons/BCPT.png
new file mode 100644
index 000000000..e1ecbeafe
--- /dev/null
+++ b/packages/website/public/images/token_icons/BCPT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/BNT.png b/packages/website/public/images/token_icons/BNT.png
new file mode 100644
index 000000000..a3b91ec34
--- /dev/null
+++ b/packages/website/public/images/token_icons/BNT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/BRM.png b/packages/website/public/images/token_icons/BRM.png
new file mode 100644
index 000000000..109c21ef5
--- /dev/null
+++ b/packages/website/public/images/token_icons/BRM.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/CAG.png b/packages/website/public/images/token_icons/CAG.png
new file mode 100644
index 000000000..2aa368381
--- /dev/null
+++ b/packages/website/public/images/token_icons/CAG.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/CAN.png b/packages/website/public/images/token_icons/CAN.png
new file mode 100644
index 000000000..7fdf3a9b9
--- /dev/null
+++ b/packages/website/public/images/token_icons/CAN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/CAT.png b/packages/website/public/images/token_icons/CAT.png
new file mode 100644
index 000000000..c59b6b15d
--- /dev/null
+++ b/packages/website/public/images/token_icons/CAT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/CFI.png b/packages/website/public/images/token_icons/CFI.png
new file mode 100644
index 000000000..b1f2e6db9
--- /dev/null
+++ b/packages/website/public/images/token_icons/CFI.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/civic.png b/packages/website/public/images/token_icons/CVC.png
index 1daf28d00..1daf28d00 100644
--- a/packages/website/public/images/token_icons/civic.png
+++ b/packages/website/public/images/token_icons/CVC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DAI.png b/packages/website/public/images/token_icons/DAI.png
new file mode 100644
index 000000000..bf7da4a01
--- /dev/null
+++ b/packages/website/public/images/token_icons/DAI.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DATA.png b/packages/website/public/images/token_icons/DATA.png
new file mode 100644
index 000000000..43f2e6dde
--- /dev/null
+++ b/packages/website/public/images/token_icons/DATA.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DEB.png b/packages/website/public/images/token_icons/DEB.png
new file mode 100644
index 000000000..c729fd265
--- /dev/null
+++ b/packages/website/public/images/token_icons/DEB.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DGD.png b/packages/website/public/images/token_icons/DGD.png
new file mode 100644
index 000000000..cb81ecb45
--- /dev/null
+++ b/packages/website/public/images/token_icons/DGD.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DIVX.png b/packages/website/public/images/token_icons/DIVX.png
new file mode 100644
index 000000000..d8d50f1f8
--- /dev/null
+++ b/packages/website/public/images/token_icons/DIVX.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/DNT.png b/packages/website/public/images/token_icons/DNT.png
new file mode 100644
index 000000000..b4ac550f6
--- /dev/null
+++ b/packages/website/public/images/token_icons/DNT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/edgeless.png b/packages/website/public/images/token_icons/EDG.png
index 606784154..606784154 100644
--- a/packages/website/public/images/token_icons/edgeless.png
+++ b/packages/website/public/images/token_icons/EDG.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/EDU.png b/packages/website/public/images/token_icons/EDU.png
new file mode 100644
index 000000000..d74785e5a
--- /dev/null
+++ b/packages/website/public/images/token_icons/EDU.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ELEC.png b/packages/website/public/images/token_icons/ELEC.png
new file mode 100644
index 000000000..cc1a3745a
--- /dev/null
+++ b/packages/website/public/images/token_icons/ELEC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/EMONT.png b/packages/website/public/images/token_icons/EMONT.png
new file mode 100644
index 000000000..ba7fe4a3d
--- /dev/null
+++ b/packages/website/public/images/token_icons/EMONT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ENG.png b/packages/website/public/images/token_icons/ENG.png
new file mode 100644
index 000000000..6f83a35ea
--- /dev/null
+++ b/packages/website/public/images/token_icons/ENG.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ENTR.png b/packages/website/public/images/token_icons/ENTR.png
new file mode 100644
index 000000000..2936c20e2
--- /dev/null
+++ b/packages/website/public/images/token_icons/ENTR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/EOS.png b/packages/website/public/images/token_icons/EOS.png
new file mode 100644
index 000000000..622df61bc
--- /dev/null
+++ b/packages/website/public/images/token_icons/EOS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/EVE.png b/packages/website/public/images/token_icons/EVE.png
new file mode 100644
index 000000000..d78362134
--- /dev/null
+++ b/packages/website/public/images/token_icons/EVE.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/FUN.png b/packages/website/public/images/token_icons/FUN.png
new file mode 100644
index 000000000..a473a1c72
--- /dev/null
+++ b/packages/website/public/images/token_icons/FUN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/GEE.png b/packages/website/public/images/token_icons/GEE.png
new file mode 100644
index 000000000..887cc8429
--- /dev/null
+++ b/packages/website/public/images/token_icons/GEE.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/GEN.png b/packages/website/public/images/token_icons/GEN.png
new file mode 100644
index 000000000..b1fe28370
--- /dev/null
+++ b/packages/website/public/images/token_icons/GEN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/GET.png b/packages/website/public/images/token_icons/GET.png
new file mode 100644
index 000000000..6a5fbdf63
--- /dev/null
+++ b/packages/website/public/images/token_icons/GET.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/GNO.png b/packages/website/public/images/token_icons/GNO.png
new file mode 100644
index 000000000..7c7d09433
--- /dev/null
+++ b/packages/website/public/images/token_icons/GNO.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/golem.png b/packages/website/public/images/token_icons/GNT.png
index e61a4367d..e61a4367d 100644
--- a/packages/website/public/images/token_icons/golem.png
+++ b/packages/website/public/images/token_icons/GNT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/HGT.png b/packages/website/public/images/token_icons/HGT.png
new file mode 100644
index 000000000..b35c601a3
--- /dev/null
+++ b/packages/website/public/images/token_icons/HGT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/HOT.png b/packages/website/public/images/token_icons/HOT.png
new file mode 100644
index 000000000..0c7f61755
--- /dev/null
+++ b/packages/website/public/images/token_icons/HOT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ICN.png b/packages/website/public/images/token_icons/ICN.png
new file mode 100644
index 000000000..e7eebad10
--- /dev/null
+++ b/packages/website/public/images/token_icons/ICN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/IND.png b/packages/website/public/images/token_icons/IND.png
new file mode 100644
index 000000000..edc3d217b
--- /dev/null
+++ b/packages/website/public/images/token_icons/IND.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/J8T.png b/packages/website/public/images/token_icons/J8T.png
new file mode 100644
index 000000000..74a2f4855
--- /dev/null
+++ b/packages/website/public/images/token_icons/J8T.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/JET.png b/packages/website/public/images/token_icons/JET.png
new file mode 100644
index 000000000..f34a28481
--- /dev/null
+++ b/packages/website/public/images/token_icons/JET.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/KIN.png b/packages/website/public/images/token_icons/KIN.png
new file mode 100644
index 000000000..a38d656e1
--- /dev/null
+++ b/packages/website/public/images/token_icons/KIN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/KNC.png b/packages/website/public/images/token_icons/KNC.png
new file mode 100644
index 000000000..7ebe359b7
--- /dev/null
+++ b/packages/website/public/images/token_icons/KNC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/LINK.png b/packages/website/public/images/token_icons/LINK.png
new file mode 100644
index 000000000..0873f72c9
--- /dev/null
+++ b/packages/website/public/images/token_icons/LINK.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/LOOM.png b/packages/website/public/images/token_icons/LOOM.png
new file mode 100644
index 000000000..0da2c41c9
--- /dev/null
+++ b/packages/website/public/images/token_icons/LOOM.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/LUN.png b/packages/website/public/images/token_icons/LUN.png
new file mode 100644
index 000000000..d661bdc9f
--- /dev/null
+++ b/packages/website/public/images/token_icons/LUN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MANA.png b/packages/website/public/images/token_icons/MANA.png
new file mode 100644
index 000000000..52cdffa69
--- /dev/null
+++ b/packages/website/public/images/token_icons/MANA.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MCO.png b/packages/website/public/images/token_icons/MCO.png
new file mode 100644
index 000000000..7c3c5bfa0
--- /dev/null
+++ b/packages/website/public/images/token_icons/MCO.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MKR.png b/packages/website/public/images/token_icons/MKR.png
new file mode 100644
index 000000000..6da588979
--- /dev/null
+++ b/packages/website/public/images/token_icons/MKR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/melon.png b/packages/website/public/images/token_icons/MLN.png
index 29f58e631..29f58e631 100644
--- a/packages/website/public/images/token_icons/melon.png
+++ b/packages/website/public/images/token_icons/MLN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MOD.png b/packages/website/public/images/token_icons/MOD.png
new file mode 100644
index 000000000..4fbe66b83
--- /dev/null
+++ b/packages/website/public/images/token_icons/MOD.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MORPH.png b/packages/website/public/images/token_icons/MORPH.png
new file mode 100644
index 000000000..a9a8dd067
--- /dev/null
+++ b/packages/website/public/images/token_icons/MORPH.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MOT.png b/packages/website/public/images/token_icons/MOT.png
new file mode 100644
index 000000000..b5457f9f1
--- /dev/null
+++ b/packages/website/public/images/token_icons/MOT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/MTL.png b/packages/website/public/images/token_icons/MTL.png
new file mode 100644
index 000000000..3297462ce
--- /dev/null
+++ b/packages/website/public/images/token_icons/MTL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NANJ.png b/packages/website/public/images/token_icons/NANJ.png
new file mode 100644
index 000000000..0c54c5bde
--- /dev/null
+++ b/packages/website/public/images/token_icons/NANJ.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NAVI.png b/packages/website/public/images/token_icons/NAVI.png
new file mode 100644
index 000000000..3dc359c47
--- /dev/null
+++ b/packages/website/public/images/token_icons/NAVI.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NCT.png b/packages/website/public/images/token_icons/NCT.png
new file mode 100644
index 000000000..879c8d085
--- /dev/null
+++ b/packages/website/public/images/token_icons/NCT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NDC.png b/packages/website/public/images/token_icons/NDC.png
new file mode 100644
index 000000000..b16890ca3
--- /dev/null
+++ b/packages/website/public/images/token_icons/NDC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NEXO.png b/packages/website/public/images/token_icons/NEXO.png
new file mode 100644
index 000000000..f6459a39f
--- /dev/null
+++ b/packages/website/public/images/token_icons/NEXO.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/NMR.png b/packages/website/public/images/token_icons/NMR.png
new file mode 100644
index 000000000..8767f019a
--- /dev/null
+++ b/packages/website/public/images/token_icons/NMR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/OAX.png b/packages/website/public/images/token_icons/OAX.png
new file mode 100644
index 000000000..7a53e71af
--- /dev/null
+++ b/packages/website/public/images/token_icons/OAX.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/OCC.png b/packages/website/public/images/token_icons/OCC.png
new file mode 100644
index 000000000..049812208
--- /dev/null
+++ b/packages/website/public/images/token_icons/OCC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/OMG.png b/packages/website/public/images/token_icons/OMG.png
new file mode 100644
index 000000000..c1552abf2
--- /dev/null
+++ b/packages/website/public/images/token_icons/OMG.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/OMX.png b/packages/website/public/images/token_icons/OMX.png
new file mode 100644
index 000000000..0c3485d79
--- /dev/null
+++ b/packages/website/public/images/token_icons/OMX.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/PAL.png b/packages/website/public/images/token_icons/PAL.png
new file mode 100644
index 000000000..211e42ea5
--- /dev/null
+++ b/packages/website/public/images/token_icons/PAL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/tenx.png b/packages/website/public/images/token_icons/PAY.png
index d9ffca043..d9ffca043 100644
--- a/packages/website/public/images/token_icons/tenx.png
+++ b/packages/website/public/images/token_icons/PAY.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/PKT.png b/packages/website/public/images/token_icons/PKT.png
new file mode 100644
index 000000000..169390929
--- /dev/null
+++ b/packages/website/public/images/token_icons/PKT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/PLAY.png b/packages/website/public/images/token_icons/PLAY.png
new file mode 100644
index 000000000..9b141a6ec
--- /dev/null
+++ b/packages/website/public/images/token_icons/PLAY.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/PLU.png b/packages/website/public/images/token_icons/PLU.png
new file mode 100644
index 000000000..6f9b0344e
--- /dev/null
+++ b/packages/website/public/images/token_icons/PLU.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/POLY.png b/packages/website/public/images/token_icons/POLY.png
new file mode 100644
index 000000000..03ded07dc
--- /dev/null
+++ b/packages/website/public/images/token_icons/POLY.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/qtum.png b/packages/website/public/images/token_icons/QTUM.png
index b7f09dfd2..b7f09dfd2 100644
--- a/packages/website/public/images/token_icons/qtum.png
+++ b/packages/website/public/images/token_icons/QTUM.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/REN.png b/packages/website/public/images/token_icons/REN.png
new file mode 100644
index 000000000..f70856e9f
--- /dev/null
+++ b/packages/website/public/images/token_icons/REN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/REP.png b/packages/website/public/images/token_icons/REP.png
new file mode 100644
index 000000000..c767f4b6f
--- /dev/null
+++ b/packages/website/public/images/token_icons/REP.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/REQ.png b/packages/website/public/images/token_icons/REQ.png
new file mode 100644
index 000000000..3c0e8ed9a
--- /dev/null
+++ b/packages/website/public/images/token_icons/REQ.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/RFR.png b/packages/website/public/images/token_icons/RFR.png
new file mode 100644
index 000000000..05d71c4f3
--- /dev/null
+++ b/packages/website/public/images/token_icons/RFR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/RLC.png b/packages/website/public/images/token_icons/RLC.png
new file mode 100644
index 000000000..c21dee4c4
--- /dev/null
+++ b/packages/website/public/images/token_icons/RLC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ROL.png b/packages/website/public/images/token_icons/ROL.png
new file mode 100644
index 000000000..430fa9af1
--- /dev/null
+++ b/packages/website/public/images/token_icons/ROL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/RVT.png b/packages/website/public/images/token_icons/RVT.png
new file mode 100644
index 000000000..4f32c0e87
--- /dev/null
+++ b/packages/website/public/images/token_icons/RVT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SALT.png b/packages/website/public/images/token_icons/SALT.png
new file mode 100644
index 000000000..ce425eed5
--- /dev/null
+++ b/packages/website/public/images/token_icons/SALT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SAN.png b/packages/website/public/images/token_icons/SAN.png
new file mode 100644
index 000000000..36aa6a554
--- /dev/null
+++ b/packages/website/public/images/token_icons/SAN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SIG.png b/packages/website/public/images/token_icons/SIG.png
new file mode 100644
index 000000000..33af7f085
--- /dev/null
+++ b/packages/website/public/images/token_icons/SIG.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SNGLS.png b/packages/website/public/images/token_icons/SNGLS.png
new file mode 100644
index 000000000..16bf28819
--- /dev/null
+++ b/packages/website/public/images/token_icons/SNGLS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SNT.png b/packages/website/public/images/token_icons/SNT.png
new file mode 100644
index 000000000..6f072cffb
--- /dev/null
+++ b/packages/website/public/images/token_icons/SNT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SPANK.png b/packages/website/public/images/token_icons/SPANK.png
new file mode 100644
index 000000000..aab84ef90
--- /dev/null
+++ b/packages/website/public/images/token_icons/SPANK.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SPN.png b/packages/website/public/images/token_icons/SPN.png
new file mode 100644
index 000000000..c569c4687
--- /dev/null
+++ b/packages/website/public/images/token_icons/SPN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SS.png b/packages/website/public/images/token_icons/SS.png
new file mode 100644
index 000000000..127e42c45
--- /dev/null
+++ b/packages/website/public/images/token_icons/SS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/STORJ.png b/packages/website/public/images/token_icons/STORJ.png
new file mode 100644
index 000000000..4539afb4a
--- /dev/null
+++ b/packages/website/public/images/token_icons/STORJ.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SUB.png b/packages/website/public/images/token_icons/SUB.png
new file mode 100644
index 000000000..633bcbbd1
--- /dev/null
+++ b/packages/website/public/images/token_icons/SUB.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SWT.png b/packages/website/public/images/token_icons/SWT.png
new file mode 100644
index 000000000..910d9fdbf
--- /dev/null
+++ b/packages/website/public/images/token_icons/SWT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/SXDT.png b/packages/website/public/images/token_icons/SXDT.png
new file mode 100644
index 000000000..b37e92050
--- /dev/null
+++ b/packages/website/public/images/token_icons/SXDT.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TAAS.png b/packages/website/public/images/token_icons/TAAS.png
new file mode 100644
index 000000000..266e3690b
--- /dev/null
+++ b/packages/website/public/images/token_icons/TAAS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TIME.png b/packages/website/public/images/token_icons/TIME.png
new file mode 100644
index 000000000..920cc7636
--- /dev/null
+++ b/packages/website/public/images/token_icons/TIME.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TKN.png b/packages/website/public/images/token_icons/TKN.png
new file mode 100644
index 000000000..e1b276416
--- /dev/null
+++ b/packages/website/public/images/token_icons/TKN.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TRL.png b/packages/website/public/images/token_icons/TRL.png
new file mode 100644
index 000000000..afd5815ba
--- /dev/null
+++ b/packages/website/public/images/token_icons/TRL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TRST.png b/packages/website/public/images/token_icons/TRST.png
new file mode 100644
index 000000000..0ba34778f
--- /dev/null
+++ b/packages/website/public/images/token_icons/TRST.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/TRX.png b/packages/website/public/images/token_icons/TRX.png
new file mode 100644
index 000000000..56338957c
--- /dev/null
+++ b/packages/website/public/images/token_icons/TRX.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/UPP.png b/packages/website/public/images/token_icons/UPP.png
new file mode 100644
index 000000000..bc90081a0
--- /dev/null
+++ b/packages/website/public/images/token_icons/UPP.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/VSL.png b/packages/website/public/images/token_icons/VSL.png
new file mode 100644
index 000000000..b3d0950d2
--- /dev/null
+++ b/packages/website/public/images/token_icons/VSL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/WAND.png b/packages/website/public/images/token_icons/WAND.png
new file mode 100644
index 000000000..e22531e21
--- /dev/null
+++ b/packages/website/public/images/token_icons/WAND.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ether_erc20.png b/packages/website/public/images/token_icons/WETH.png
index bc8beae8b..bc8beae8b 100644
--- a/packages/website/public/images/token_icons/ether_erc20.png
+++ b/packages/website/public/images/token_icons/WETH.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/WINGS.png b/packages/website/public/images/token_icons/WINGS.png
new file mode 100644
index 000000000..c0a9ce527
--- /dev/null
+++ b/packages/website/public/images/token_icons/WINGS.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/WTC.png b/packages/website/public/images/token_icons/WTC.png
new file mode 100644
index 000000000..06aac0617
--- /dev/null
+++ b/packages/website/public/images/token_icons/WTC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/WYV.png b/packages/website/public/images/token_icons/WYV.png
new file mode 100644
index 000000000..d63aa857b
--- /dev/null
+++ b/packages/website/public/images/token_icons/WYV.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/XAUR.png b/packages/website/public/images/token_icons/XAUR.png
new file mode 100644
index 000000000..c356cc9dd
--- /dev/null
+++ b/packages/website/public/images/token_icons/XAUR.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/XNK.png b/packages/website/public/images/token_icons/XNK.png
new file mode 100644
index 000000000..04b2ebf80
--- /dev/null
+++ b/packages/website/public/images/token_icons/XNK.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/XSC.png b/packages/website/public/images/token_icons/XSC.png
new file mode 100644
index 000000000..7f70686aa
--- /dev/null
+++ b/packages/website/public/images/token_icons/XSC.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/XYO.png b/packages/website/public/images/token_icons/XYO.png
new file mode 100644
index 000000000..81314d2ff
--- /dev/null
+++ b/packages/website/public/images/token_icons/XYO.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/ZIL.png b/packages/website/public/images/token_icons/ZIL.png
new file mode 100644
index 000000000..197227803
--- /dev/null
+++ b/packages/website/public/images/token_icons/ZIL.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/zero_ex.png b/packages/website/public/images/token_icons/ZRX.png
index 8ed9a984b..8ed9a984b 100644
--- a/packages/website/public/images/token_icons/zero_ex.png
+++ b/packages/website/public/images/token_icons/ZRX.png
Binary files differ
diff --git a/packages/website/public/images/token_icons/adtoken.png b/packages/website/public/images/token_icons/adtoken.png
deleted file mode 100644
index 59290af6b..000000000
--- a/packages/website/public/images/token_icons/adtoken.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/aragon.png b/packages/website/public/images/token_icons/aragon.png
deleted file mode 100644
index d162aab24..000000000
--- a/packages/website/public/images/token_icons/aragon.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/augur.png b/packages/website/public/images/token_icons/augur.png
deleted file mode 100644
index b7d61100a..000000000
--- a/packages/website/public/images/token_icons/augur.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/bancor.png b/packages/website/public/images/token_icons/bancor.png
deleted file mode 100644
index d2b2fa472..000000000
--- a/packages/website/public/images/token_icons/bancor.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/basicattentiontoken.png b/packages/website/public/images/token_icons/basicattentiontoken.png
deleted file mode 100644
index 77e7dfb1f..000000000
--- a/packages/website/public/images/token_icons/basicattentiontoken.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/bitquence.png b/packages/website/public/images/token_icons/bitquence.png
deleted file mode 100644
index d8a2c6960..000000000
--- a/packages/website/public/images/token_icons/bitquence.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/btc.png b/packages/website/public/images/token_icons/btc.png
deleted file mode 100644
index 1d9fc8347..000000000
--- a/packages/website/public/images/token_icons/btc.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/clams.png b/packages/website/public/images/token_icons/clams.png
deleted file mode 100644
index 04c2ba7d3..000000000
--- a/packages/website/public/images/token_icons/clams.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/cofound-it.png b/packages/website/public/images/token_icons/cofound-it.png
deleted file mode 100644
index 7bccd6248..000000000
--- a/packages/website/public/images/token_icons/cofound-it.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/default.png b/packages/website/public/images/token_icons/default.png
deleted file mode 100644
index 5c9ea4b0f..000000000
--- a/packages/website/public/images/token_icons/default.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/digixdao.png b/packages/website/public/images/token_icons/digixdao.png
deleted file mode 100644
index f292db716..000000000
--- a/packages/website/public/images/token_icons/digixdao.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/district0x.png b/packages/website/public/images/token_icons/district0x.png
deleted file mode 100644
index 7427b1146..000000000
--- a/packages/website/public/images/token_icons/district0x.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/eos.png b/packages/website/public/images/token_icons/eos.png
deleted file mode 100644
index a08f3c042..000000000
--- a/packages/website/public/images/token_icons/eos.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/etheroll.png b/packages/website/public/images/token_icons/etheroll.png
deleted file mode 100644
index 89dd5e04b..000000000
--- a/packages/website/public/images/token_icons/etheroll.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/funfair.png b/packages/website/public/images/token_icons/funfair.png
deleted file mode 100644
index 1b7c67ec6..000000000
--- a/packages/website/public/images/token_icons/funfair.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/gnosis.png b/packages/website/public/images/token_icons/gnosis.png
deleted file mode 100644
index 0111846d0..000000000
--- a/packages/website/public/images/token_icons/gnosis.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/iconomi.png b/packages/website/public/images/token_icons/iconomi.png
deleted file mode 100644
index 3499e4765..000000000
--- a/packages/website/public/images/token_icons/iconomi.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/iexec.png b/packages/website/public/images/token_icons/iexec.png
deleted file mode 100644
index ef4860457..000000000
--- a/packages/website/public/images/token_icons/iexec.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/lunyr.png b/packages/website/public/images/token_icons/lunyr.png
deleted file mode 100644
index f77094ba5..000000000
--- a/packages/website/public/images/token_icons/lunyr.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/makerdao.png b/packages/website/public/images/token_icons/makerdao.png
deleted file mode 100644
index adbc9f38c..000000000
--- a/packages/website/public/images/token_icons/makerdao.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/metal.png b/packages/website/public/images/token_icons/metal.png
deleted file mode 100644
index d8a8c33ec..000000000
--- a/packages/website/public/images/token_icons/metal.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/monaco.png b/packages/website/public/images/token_icons/monaco.png
deleted file mode 100644
index 865341fd3..000000000
--- a/packages/website/public/images/token_icons/monaco.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/numeraire.png b/packages/website/public/images/token_icons/numeraire.png
deleted file mode 100644
index 698f7cfdd..000000000
--- a/packages/website/public/images/token_icons/numeraire.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/omisego.png b/packages/website/public/images/token_icons/omisego.png
deleted file mode 100644
index 40a86b9d7..000000000
--- a/packages/website/public/images/token_icons/omisego.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/santiment.png b/packages/website/public/images/token_icons/santiment.png
deleted file mode 100644
index 05ce98c1d..000000000
--- a/packages/website/public/images/token_icons/santiment.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/singularity.png b/packages/website/public/images/token_icons/singularity.png
deleted file mode 100644
index 9db788935..000000000
--- a/packages/website/public/images/token_icons/singularity.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/status.png b/packages/website/public/images/token_icons/status.png
deleted file mode 100644
index a73ba23ba..000000000
--- a/packages/website/public/images/token_icons/status.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/storjcoinx.png b/packages/website/public/images/token_icons/storjcoinx.png
deleted file mode 100644
index 87c4d4292..000000000
--- a/packages/website/public/images/token_icons/storjcoinx.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/taas.png b/packages/website/public/images/token_icons/taas.png
deleted file mode 100644
index 4cca722f7..000000000
--- a/packages/website/public/images/token_icons/taas.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/tokencard.png b/packages/website/public/images/token_icons/tokencard.png
deleted file mode 100644
index 490c1be69..000000000
--- a/packages/website/public/images/token_icons/tokencard.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/trust.png b/packages/website/public/images/token_icons/trust.png
deleted file mode 100644
index 62b412b41..000000000
--- a/packages/website/public/images/token_icons/trust.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/token_icons/wings.png b/packages/website/public/images/token_icons/wings.png
deleted file mode 100644
index cd0eb4213..000000000
--- a/packages/website/public/images/token_icons/wings.png
+++ /dev/null
Binary files differ
diff --git a/packages/website/public/images/toshi_logo.jpg b/packages/website/public/images/toshi_logo.jpg
new file mode 100644
index 000000000..3cf451d24
--- /dev/null
+++ b/packages/website/public/images/toshi_logo.jpg
Binary files differ
diff --git a/packages/website/public/images/unlock-mm.png b/packages/website/public/images/unlock-mm.png
new file mode 100644
index 000000000..531c95dd2
--- /dev/null
+++ b/packages/website/public/images/unlock-mm.png
Binary files differ
diff --git a/packages/website/public/images/zrx_ecosystem.svg b/packages/website/public/images/zrx_ecosystem.svg
new file mode 100644
index 000000000..3b4fa0a6e
--- /dev/null
+++ b/packages/website/public/images/zrx_ecosystem.svg
@@ -0,0 +1,158 @@
+<svg width="267" height="171" viewBox="0 0 267 171" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="1" y="1" width="153" height="169" rx="9" transform="translate(112)" stroke="#3289F1" stroke-width="2"/>
+<g filter="url(#filter0_d)">
+<rect width="38" height="44" rx="5" transform="translate(125 12)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(125 12)" fill="#5C5E9A"/>
+<rect width="16" height="3" rx="1" transform="translate(130 38)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(129.605 44)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter1_d)">
+<rect width="38" height="44" rx="5" transform="translate(171 12)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(171 12)" fill="#737592"/>
+<rect width="16" height="3" rx="1" transform="translate(176 38)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(175.605 44)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter2_d)">
+<rect width="38" height="44" rx="5" transform="translate(217 12)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(217 12)" fill="#434456"/>
+<rect width="16" height="3" rx="1" transform="translate(222 38)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(221.605 44)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter3_d)">
+<rect width="38" height="44" rx="5" transform="translate(125 63)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(125 63)" fill="#434456"/>
+<rect width="16" height="3" rx="1" transform="translate(130 89)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(129.605 95)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter4_d)">
+<rect width="38" height="44" rx="5" transform="translate(171 63)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(171 63)" fill="#5C5E9A"/>
+<rect width="16" height="3" rx="1" transform="translate(176 89)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(175.605 95)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter5_d)">
+<rect width="38" height="44" rx="5" transform="translate(217 63)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(217 63)" fill="#4E6B77"/>
+<rect width="16" height="3" rx="1" transform="translate(222 89)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(221.605 95)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter6_d)">
+<rect width="38" height="44" rx="5" transform="translate(125 114)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(125 114)" fill="#4E6B77"/>
+<rect width="16" height="3" rx="1" transform="translate(130 140)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(129.605 146)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter7_d)">
+<rect width="38" height="44" rx="5" transform="translate(171 114)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(171 114)" fill="#434456"/>
+<rect width="16" height="3" rx="1" transform="translate(176 140)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(175.605 146)" fill="#89BFFF"/>
+</g>
+<g filter="url(#filter8_d)">
+<rect width="38" height="44" rx="5" transform="translate(217 114)" fill="#F2F2F2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H33C35.7614 0 38 2.23858 38 5V22H0V5Z" transform="translate(217 114)" fill="#737492"/>
+<rect width="16" height="3" rx="1" transform="translate(222 140)" fill="#C4C4C4"/>
+<rect width="13.8182" height="2.55072" rx="1" transform="translate(221.605 146)" fill="#89BFFF"/>
+</g>
+<rect x="-1" y="-1" width="68" height="76" rx="6" transform="translate(2 50)" fill="#F2F2F2" stroke="#3289F1" stroke-width="2"/>
+<path d="M0 5C0 2.23858 2.23858 0 5 0H59C61.7614 0 64 2.23858 64 5V15H0V5Z" transform="translate(3 51)" fill="#F6F6F6"/>
+<rect width="6" height="4" rx="2" transform="translate(57 70)" fill="#89BFFF"/>
+<rect width="6" height="4" rx="2" transform="translate(57 83)" fill="#89BFFF"/>
+<rect width="6" height="4" rx="2" transform="translate(57 95)" fill="#89BFFF"/>
+<rect width="6" height="4" rx="2" transform="translate(57 107)" fill="#89BFFF"/>
+<rect width="18" height="4" rx="1" transform="translate(18 70)" fill="#E0E0E0"/>
+<rect width="18" height="4" rx="1" transform="translate(18 56)" fill="#E0E0E0"/>
+<rect width="18" height="4" transform="translate(18 83)" fill="#E0E0E0"/>
+<rect width="18" height="4" transform="translate(18 95)" fill="#E0E0E0"/>
+<rect width="18" height="4" transform="translate(18 107)" fill="#E0E0E0"/>
+<circle cx="3" cy="3" r="3" transform="translate(7 70)" fill="#E0E0E0"/>
+<circle cx="3" cy="3" r="3" transform="translate(7 55)" fill="#3289F1"/>
+<circle cx="3" cy="3" r="3" transform="translate(7 82)" fill="#E0E0E0"/>
+<circle cx="3" cy="3" r="3" transform="translate(7 94)" fill="#E0E0E0"/>
+<circle cx="3" cy="3" r="3" transform="translate(7 106)" fill="#E0E0E0"/>
+<path d="M22.7368 20V21.3333C22.7368 22.8 21.6 24 20.2105 24H2.52632C1.12421 24 0 22.8 0 21.3333V2.66667C0 1.2 1.12421 0 2.52632 0H20.2105C21.6 0 22.7368 1.2 22.7368 2.66667V4H11.3684C9.96632 4 8.8421 5.2 8.8421 6.66667V17.3333C8.8421 18.8 9.96632 20 11.3684 20H22.7368ZM11.3684 17.3333H24V6.66667H11.3684V17.3333ZM16.4211 14C15.3726 14 14.5263 13.1067 14.5263 12C14.5263 10.8933 15.3726 10 16.4211 10C17.4695 10 18.3158 10.8933 18.3158 12C18.3158 13.1067 17.4695 14 16.4211 14Z" transform="translate(24 16)" fill="#3289F1"/>
+<line y1="-1" x2="42" y2="-1" transform="translate(70 86)" stroke="#3289F1" stroke-width="2"/>
+<defs>
+<filter id="filter0_d" x="123" y="11" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter1_d" x="169" y="11" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter2_d" x="215" y="11" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter3_d" x="123" y="62" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter4_d" x="169" y="62" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter5_d" x="215" y="62" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter6_d" x="123" y="113" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter7_d" x="169" y="113" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+<filter id="filter8_d" x="215" y="113" width="42" height="48" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
+<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/>
+</filter>
+</defs>
+</svg>
diff --git a/packages/website/public/index.html b/packages/website/public/index.html
index c28e4abf4..a8a61f8ad 100644
--- a/packages/website/public/index.html
+++ b/packages/website/public/index.html
@@ -23,56 +23,73 @@
</head>
<body style="margin: 0px; min-width: 355px;">
+ <!-- Heap SDK -->
+ <script type="text/javascript">
+ window.heap = window.heap || [], heap.load = function (e, t) { window.heap.appid = e, window.heap.config = t = t || {}; var r = t.forceSSL || "https:" === document.location.protocol, a = document.createElement("script"); a.type = "text/javascript", a.async = !0, a.src = (r ? "https:" : "http:") + "//cdn.heapanalytics.com/js/heap-" + e + ".js"; var n = document.getElementsByTagName("script")[0]; n.parentNode.insertBefore(a, n); for (var o = function (e) { return function () { heap.push([e].concat(Array.prototype.slice.call(arguments, 0))) } }, p = ["addEventProperties", "addUserProperties", "clearEventProperties", "identify", "resetIdentity", "removeEventProperty", "setEventProperties", "track", "unsetEventProperty"], c = 0; c < p.length; c++)heap[p[c]] = o(p[c]) };
+ heap.load("410099666");
+ </script>
+ <!-- End Heap SDK -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-98720122-1"></script>
<script>
- window.dataLayer = window.dataLayer || [];
-function gtag() {
- dataLayer.push(arguments);
-}
-gtag('js', new Date());
+ window.dataLayer = window.dataLayer || [];
+ function gtag() {
+ dataLayer.push(arguments);
+ }
+ gtag('js', new Date());
-gtag('config', 'UA-98720122-1');
-</script>
+ gtag('config', 'UA-98720122-1');
+ </script>
<!-- End Google Analytics -->
<!-- Facebook SDK -->
<div id="fb-root"></div>
<script>
- (function(d, s, id) {
- var js,
- fjs = d.getElementsByTagName(s)[0];
- if (d.getElementById(id)) return;
- js = d.createElement(s);
- js.id = id;
- js.src = '//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8&appId=1687545238205192';
- fjs.parentNode.insertBefore(js, fjs);
-})(document, 'script', 'facebook-jssdk');
-</script>
+ (function (d, s, id) {
+ var js,
+ fjs = d.getElementsByTagName(s)[0];
+ if (d.getElementById(id)) return;
+ js = d.createElement(s);
+ js.id = id;
+ js.src = '//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8&appId=1687545238205192';
+ fjs.parentNode.insertBefore(js, fjs);
+ })(document, 'script', 'facebook-jssdk');
+ </script>
<div id="app"></div>
<!-- End Facebook SDK -->
<!-- Twitter SDK -->
<script>
- window.twttr = (function(d, s, id) {
- var js,
- fjs = d.getElementsByTagName(s)[0],
- t = window.twttr || {};
- if (d.getElementById(id)) return t;
- js = d.createElement(s);
- js.id = id;
- js.src = 'https://platform.twitter.com/widgets.js';
- fjs.parentNode.insertBefore(js, fjs);
+ window.twttr = (function (d, s, id) {
+ var js,
+ fjs = d.getElementsByTagName(s)[0],
+ t = window.twttr || {};
+ if (d.getElementById(id)) return t;
+ js = d.createElement(s);
+ js.id = id;
+ js.src = 'https://platform.twitter.com/widgets.js';
+ fjs.parentNode.insertBefore(js, fjs);
- t._e = [];
- t.ready = function(f) {
- t._e.push(f);
- };
- return t;
-})(document, 'script', 'twitter-wjs');
-</script>
+ t._e = [];
+ t.ready = function (f) {
+ t._e.push(f);
+ };
+ return t;
+ })(document, 'script', 'twitter-wjs');
+ </script>
<!-- End Twitter SDK -->
-
+ <!-- Hotjar Tracking Code for https://0xproject.com/ -->
+ <script>
+ (function (h, o, t, j, a, r) {
+ h.hj = h.hj || function () { (h.hj.q = h.hj.q || []).push(arguments) };
+ h._hjSettings = { hjid: 935597, hjsv: 6 };
+ a = o.getElementsByTagName('head')[0];
+ r = o.createElement('script'); r.async = 1;
+ r.src = t + h._hjSettings.hjid + j + h._hjSettings.hjsv;
+ a.appendChild(r);
+ })(window, document, 'https://static.hotjar.com/c/hotjar-', '.js?sv=');
+ </script>
+ <!-- End Hotjar Tracking Code -->
<!-- Main -->
<script type="text/javascript" crossorigin="anonymous" src="/bundle.js" charset="utf-8"></script>
</body>
-</html>
+</html> \ No newline at end of file
diff --git a/packages/website/public/js/rollbar.umd.min.js b/packages/website/public/js/rollbar.umd.min.js
new file mode 100644
index 000000000..2734bb8be
--- /dev/null
+++ b/packages/website/public/js/rollbar.umd.min.js
@@ -0,0 +1,2 @@
+!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.rollbar=e():t.rollbar=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){t.exports=r(1)},function(t,e,r){"use strict";var n=r(2),o="undefined"!=typeof window&&window._rollbarConfig,i=o&&o.globalAlias||"Rollbar",a="undefined"!=typeof window&&window[i]&&"function"==typeof window[i].shimId&&void 0!==window[i].shimId();if("undefined"==typeof window||window._rollbarStartTime||(window._rollbarStartTime=(new Date).getTime()),!a&&o){var s=new n(o);window[i]=s}else"undefined"!=typeof window?(window.rollbar=n,window._rollbarDidLoad=!0):"undefined"!=typeof self&&(self.rollbar=n,self._rollbarDidLoad=!0);t.exports=n},function(t,e,r){"use strict";function n(t,e){this.options=c.merge(x,t);var r=new l(this.options,h,d);this.client=e||new u(this.options,r,p,"browser");var n="undefined"!=typeof window&&window||"undefined"!=typeof self&&self,o="undefined"!=typeof document&&document;i(this.client.notifier),a(this.client.queue),(this.options.captureUncaught||this.options.handleUncaughtExceptions)&&(f.captureUncaughtExceptions(n,this),f.wrapGlobals(n,this)),(this.options.captureUnhandledRejections||this.options.handleUnhandledRejections)&&f.captureUnhandledRejections(n,this),this.instrumenter=new w(this.options,this.client.telemeter,this,n,o),this.instrumenter.instrument()}function o(t){var e="Rollbar is not initialized";p.error(e),t&&t(new Error(e))}function i(t){t.addTransform(m.handleItemWithError).addTransform(m.ensureItemHasSomethingToSay).addTransform(m.addBaseInfo).addTransform(m.addRequestInfo(window)).addTransform(m.addClientInfo(window)).addTransform(m.addPluginInfo(window)).addTransform(m.addBody).addTransform(g.addMessageWithError).addTransform(g.addTelemetryData).addTransform(g.addConfigToPayload).addTransform(m.scrubPayload).addTransform(g.userTransform(p)).addTransform(g.itemToPayload)}function a(t){t.addPredicate(y.checkLevel).addPredicate(v.checkIgnore).addPredicate(y.userCheckIgnore(p)).addPredicate(y.urlIsNotBlacklisted(p)).addPredicate(y.urlIsWhitelisted(p)).addPredicate(y.messageIsIgnored(p))}function s(t){for(var e=0,r=t.length;e<r;++e)if(c.isFunction(t[e]))return t[e]}var u=r(3),c=r(6),l=r(11),p=r(13),f=r(16),h=r(17),d=r(19),m=r(20),g=r(24),v=r(25),y=r(26),b=r(21),w=r(27),_=null;n.init=function(t,e){return _?_.global(t).configure(t):_=new n(t,e)},n.prototype.global=function(t){return this.client.global(t),this},n.global=function(t){return _?_.global(t):void o()},n.prototype.configure=function(t,e){var r=this.options,n={};return e&&(n={payload:e}),this.options=c.merge(r,t,n),this.client.configure(t,e),this.instrumenter.configure(t),this},n.configure=function(t,e){return _?_.configure(t,e):void o()},n.prototype.lastError=function(){return this.client.lastError},n.lastError=function(){return _?_.lastError():void o()},n.prototype.log=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.log(t),{uuid:e}},n.log=function(){if(_)return _.log.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.debug=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.debug(t),{uuid:e}},n.debug=function(){if(_)return _.debug.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.info=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.info(t),{uuid:e}},n.info=function(){if(_)return _.info.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.warn=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.warn(t),{uuid:e}},n.warn=function(){if(_)return _.warn.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.warning=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.warning(t),{uuid:e}},n.warning=function(){if(_)return _.warning.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.error=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.error(t),{uuid:e}},n.error=function(){if(_)return _.error.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.critical=function(){var t=this._createItem(arguments),e=t.uuid;return this.client.critical(t),{uuid:e}},n.critical=function(){if(_)return _.critical.apply(_,arguments);var t=s(arguments);o(t)},n.prototype.handleUncaughtException=function(t,e,r,n,o,i){var a,s=c.makeUnhandledStackInfo(t,e,r,n,o,"onerror","uncaught exception",b);c.isError(o)?(a=this._createItem([t,o,i]),a._unhandledStackInfo=s):c.isError(e)?(a=this._createItem([t,e,i]),a._unhandledStackInfo=s):(a=this._createItem([t,i]),a.stackInfo=s),a.level=this.options.uncaughtErrorLevel,a._isUncaught=!0,this.client.log(a)},n.prototype.handleUnhandledRejection=function(t,e){var r="unhandled rejection was null or undefined!";r=t?t.message||String(t):r;var n,o=t&&t._rollbarContext||e&&e._rollbarContext;c.isError(t)?n=this._createItem([r,t,o]):(n=this._createItem([r,t,o]),n.stackInfo=c.makeUnhandledStackInfo(r,"",0,0,null,"unhandledrejection","",b)),n.level=this.options.uncaughtErrorLevel,n._isUncaught=!0,n._originalArgs=n._originalArgs||[],n._originalArgs.push(e),this.client.log(n)},n.prototype.wrap=function(t,e,r){try{var n;if(n=c.isFunction(e)?e:function(){return e||{}},!c.isFunction(t))return t;if(t._isWrap)return t;if(!t._rollbar_wrapped&&(t._rollbar_wrapped=function(){r&&c.isFunction(r)&&r.apply(this,arguments);try{return t.apply(this,arguments)}catch(r){var e=r;throw e&&(c.isType(e,"string")&&(e=new String(e)),e._rollbarContext=n()||{},e._rollbarContext._wrappedSource=t.toString(),window._rollbarWrappedError=e),e}},t._rollbar_wrapped._isWrap=!0,t.hasOwnProperty))for(var o in t)t.hasOwnProperty(o)&&(t._rollbar_wrapped[o]=t[o]);return t._rollbar_wrapped}catch(e){return t}},n.wrap=function(t,e){return _?_.wrap(t,e):void o()},n.prototype.captureEvent=function(t,e){return this.client.captureEvent(t,e)},n.captureEvent=function(t,e){return _?_.captureEvent(t,e):void o()},n.prototype.captureDomContentLoaded=function(t,e){return e||(e=new Date),this.client.captureDomContentLoaded(e)},n.prototype.captureLoad=function(t,e){return e||(e=new Date),this.client.captureLoad(e)},n.prototype._createItem=function(t){return c.createItem(t,p,this)};var x={version:"2.4.2",scrubFields:["pw","pass","passwd","password","secret","confirm_password","confirmPassword","password_confirmation","passwordConfirmation","access_token","accessToken","secret_key","secretKey","secretToken","cc-number","card number","cardnumber","cardnum","ccnum","ccnumber","cc num","creditcardnumber","credit card number","newcreditcardnumber","new credit card","creditcardno","credit card no","card#","card #","cc-csc","cvc2","cvv2","ccv2","security code","card verification","name on credit card","name on card","nameoncard","cardholder","card holder","name des karteninhabers","card type","cardtype","cc type","cctype","payment type","expiration date","expirationdate","expdate","cc-exp"],logLevel:"debug",reportLevel:"debug",uncaughtErrorLevel:"error",endpoint:"api.rollbar.com/api/1/item/",verbose:!1,enabled:!0,sendConfig:!1,includeItemsInTelemetry:!0,captureIp:!0};t.exports=n},function(t,e,r){"use strict";function n(t,e,r,o){this.options=c.merge(t),this.logger=r,n.rateLimiter.configureGlobal(this.options),n.rateLimiter.setPlatformOptions(o,this.options),this.queue=new a(n.rateLimiter,e,r,this.options),this.notifier=new s(this.queue,this.options),this.telemeter=new u(this.options),this.lastError=null,this.lastErrorHash="none"}function o(t){var e=t.message||"",r=(t.err||{}).stack||String(t.err);return e+"::"+r}var i=r(4),a=r(5),s=r(9),u=r(10),c=r(6),l={maxItems:0,itemsPerMinute:60};n.rateLimiter=new i(l),n.prototype.global=function(t){return n.rateLimiter.configureGlobal(t),this},n.prototype.configure=function(t,e){this.notifier&&this.notifier.configure(t),this.telemeter&&this.telemeter.configure(t);var r=this.options,n={};return e&&(n={payload:e}),this.options=c.merge(r,t,n),this.global(this.options),this},n.prototype.log=function(t){var e=this._defaultLogLevel();return this._log(e,t)},n.prototype.debug=function(t){this._log("debug",t)},n.prototype.info=function(t){this._log("info",t)},n.prototype.warn=function(t){this._log("warning",t)},n.prototype.warning=function(t){this._log("warning",t)},n.prototype.error=function(t){this._log("error",t)},n.prototype.critical=function(t){this._log("critical",t)},n.prototype.wait=function(t){this.queue.wait(t)},n.prototype.captureEvent=function(t,e){return this.telemeter.captureEvent(t,e)},n.prototype.captureDomContentLoaded=function(t){return this.telemeter.captureDomContentLoaded(t)},n.prototype.captureLoad=function(t){return this.telemeter.captureLoad(t)},n.prototype._log=function(t,e){var r;if(e.callback&&(r=e.callback,delete e.callback),this._sameAsLastError(e)){if(r){var n=new Error("ignored identical item");n.item=e,r(n)}}else try{e.level=e.level||t,this.telemeter._captureRollbarItem(e),e.telemetryEvents=this.telemeter.copyEvents(),this.notifier.log(e,r)}catch(t){this.logger.error(t)}},n.prototype._defaultLogLevel=function(){return this.options.logLevel||"debug"},n.prototype._sameAsLastError=function(t){if(!t._isUncaught)return!1;var e=o(t);return this.lastErrorHash===e||(this.lastError=t.err,this.lastErrorHash=e,!1)},t.exports=n},function(t,e){"use strict";function r(t){this.startTime=(new Date).getTime(),this.counter=0,this.perMinCounter=0,this.platform=null,this.platformOptions={},this.configureGlobal(t)}function n(t,e,r){return!t.ignoreRateLimit&&e>=1&&r>e}function o(t,e,r,n,o,a,s){var u=null;return r&&(r=new Error(r)),r||n||(u=i(t,e,o,a,s)),{error:r,shouldSend:n,payload:u}}function i(t,e,r,n,o){var i,a=e.environment||e.payload&&e.payload.environment;i=o?"item per minute limit reached, ignoring errors until timeout":"maxItems has been hit, ignoring errors until reset.";var s={body:{message:{body:i,extra:{maxItems:r,itemsPerMinute:n}}},language:"javascript",environment:a,notifier:{version:e.notifier&&e.notifier.version||e.version}};return"browser"===t?(s.platform="browser",s.framework="browser-js",s.notifier.name="rollbar-browser-js"):"server"===t?(s.framework=e.framework||"node-js",s.notifier.name=e.notifier.name):"react-native"===t&&(s.framework=e.framework||"react-native",s.notifier.name=e.notifier.name),s}r.globalSettings={startTime:(new Date).getTime(),maxItems:void 0,itemsPerMinute:void 0},r.prototype.configureGlobal=function(t){void 0!==t.startTime&&(r.globalSettings.startTime=t.startTime),void 0!==t.maxItems&&(r.globalSettings.maxItems=t.maxItems),void 0!==t.itemsPerMinute&&(r.globalSettings.itemsPerMinute=t.itemsPerMinute)},r.prototype.shouldSend=function(t,e){e=e||(new Date).getTime(),e-this.startTime>=6e4&&(this.startTime=e,this.perMinCounter=0);var i=r.globalSettings.maxItems,a=r.globalSettings.itemsPerMinute;if(n(t,i,this.counter))return o(this.platform,this.platformOptions,i+" max items reached",!1);if(n(t,a,this.perMinCounter))return o(this.platform,this.platformOptions,a+" items per minute reached",!1);this.counter++,this.perMinCounter++;var s=!n(t,i,this.counter),u=s;return s=s&&!n(t,a,this.perMinCounter),o(this.platform,this.platformOptions,null,s,i,a,u)},r.prototype.setPlatformOptions=function(t,e){this.platform=t,this.platformOptions=e},t.exports=r},function(t,e,r){"use strict";function n(t,e,r,n){this.rateLimiter=t,this.api=e,this.logger=r,this.options=n,this.predicates=[],this.pendingItems=[],this.pendingRequests=[],this.retryQueue=[],this.retryHandle=null,this.waitCallback=null,this.waitIntervalID=null}var o=r(6);n.prototype.configure=function(t){this.api&&this.api.configure(t);var e=this.options;return this.options=o.merge(e,t),this},n.prototype.addPredicate=function(t){return o.isFunction(t)&&this.predicates.push(t),this},n.prototype.addPendingItem=function(t){this.pendingItems.push(t)},n.prototype.removePendingItem=function(t){var e=this.pendingItems.indexOf(t);e!==-1&&this.pendingItems.splice(e,1)},n.prototype.addItem=function(t,e,r,n){e&&o.isFunction(e)||(e=function(){});var i=this._applyPredicates(t);if(i.stop)return this.removePendingItem(n),void e(i.err);this._maybeLog(t,r),this.removePendingItem(n),this.pendingRequests.push(t);try{this._makeApiRequest(t,function(r,n){this._dequeuePendingRequest(t),e(r,n)}.bind(this))}catch(r){this._dequeuePendingRequest(t),e(r)}},n.prototype.wait=function(t){o.isFunction(t)&&(this.waitCallback=t,this._maybeCallWait()||(this.waitIntervalID&&(this.waitIntervalID=clearInterval(this.waitIntervalID)),this.waitIntervalID=setInterval(function(){this._maybeCallWait()}.bind(this),500)))},n.prototype._applyPredicates=function(t){for(var e=null,r=0,n=this.predicates.length;r<n;r++)if(e=this.predicates[r](t,this.options),!e||void 0!==e.err)return{stop:!0,err:e.err};return{stop:!1,err:null}},n.prototype._makeApiRequest=function(t,e){var r=this.rateLimiter.shouldSend(t);r.shouldSend?this.api.postItem(t,function(r,n){r?this._maybeRetry(r,t,e):e(r,n)}.bind(this)):r.error?e(r.error):this.api.postItem(r.payload,e)};var i=["ECONNRESET","ENOTFOUND","ESOCKETTIMEDOUT","ETIMEDOUT","ECONNREFUSED","EHOSTUNREACH","EPIPE","EAI_AGAIN"];n.prototype._maybeRetry=function(t,e,r){var n=!1;if(this.options.retryInterval)for(var o=0,a=i.length;o<a;o++)if(t.code===i[o]){n=!0;break}n?this._retryApiRequest(e,r):r(t)},n.prototype._retryApiRequest=function(t,e){this.retryQueue.push({item:t,callback:e}),this.retryHandle||(this.retryHandle=setInterval(function(){for(;this.retryQueue.length;){var t=this.retryQueue.shift();this._makeApiRequest(t.item,t.callback)}}.bind(this),this.options.retryInterval))},n.prototype._dequeuePendingRequest=function(t){var e=this.pendingRequests.indexOf(t);e!==-1&&(this.pendingRequests.splice(e,1),this._maybeCallWait())},n.prototype._maybeLog=function(t,e){if(this.logger&&this.options.verbose){var r=e;if(r=r||o.get(t,"body.trace.exception.message"),r=r||o.get(t,"body.trace_chain.0.exception.message"))return void this.logger.error(r);r=o.get(t,"body.message.body"),r&&this.logger.log(r)}},n.prototype._maybeCallWait=function(){return!(!o.isFunction(this.waitCallback)||0!==this.pendingItems.length||0!==this.pendingRequests.length)&&(this.waitIntervalID&&(this.waitIntervalID=clearInterval(this.waitIntervalID)),this.waitCallback(),!0)},t.exports=n},function(t,e,r){"use strict";function n(){if(!A&&(A=!0,c(JSON)&&(s(JSON.stringify)&&(R.stringify=JSON.stringify),s(JSON.parse)&&(R.parse=JSON.parse)),!a(R.stringify)||!a(R.parse))){var t=r(8);t(R)}}function o(t,e){return e===i(t)}function i(t){var e=typeof t;return"object"!==e?e:t?t instanceof Error?"error":{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase():"null"}function a(t){return o(t,"function")}function s(t){var e=/[\\^$.*+?()[\]{}|]/g,r=Function.prototype.toString.call(Object.prototype.hasOwnProperty).replace(e,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?"),n=RegExp("^"+r+"$");return u(t)&&n.test(t)}function u(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function c(t){return!o(t,"undefined")}function l(t){var e=i(t);return"object"===e||"array"===e}function p(t){return o(t,"error")}function f(t,e,r){var n,i,a,s=o(t,"object"),u=o(t,"array"),c=[];if(s&&r.indexOf(t)!==-1)return t;if(r.push(t),s)for(n in t)Object.prototype.hasOwnProperty.call(t,n)&&c.push(n);else if(u)for(a=0;a<t.length;++a)c.push(a);var l=s?{}:[];for(a=0;a<c.length;++a)n=c[a],i=t[n],l[n]=e(n,i,r);return 0!=c.length?l:t}function h(){return"********"}function d(){var t=N(),e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var r=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?r:7&r|8).toString(16)});return e}function m(t){var e=g(t);return e?(""===e.anchor&&(e.source=e.source.replace("#","")),t=e.source.replace("?"+e.query,"")):"(unknown)"}function g(t){if(o(t,"string")){for(var e=D,r=e.parser[e.strictMode?"strict":"loose"].exec(t),n={},i=e.key.length;i--;)n[e.key[i]]=r[i]||"";return n[e.q.name]={},n[e.key[12]].replace(e.q.parser,function(t,r,o){r&&(n[e.q.name][r]=o)}),n}}function v(t,e,r){r=r||{},r.access_token=t;var n,o=[];for(n in r)Object.prototype.hasOwnProperty.call(r,n)&&o.push([n,r[n]].join("="));var i="?"+o.sort().join("&");e=e||{},e.path=e.path||"";var a,s=e.path.indexOf("?"),u=e.path.indexOf("#");s!==-1&&(u===-1||u>s)?(a=e.path,e.path=a.substring(0,s)+i+"&"+a.substring(s+1)):u!==-1?(a=e.path,e.path=a.substring(0,u)+i+a.substring(u)):e.path=e.path+i}function y(t,e){if(e=e||t.protocol,!e&&t.port&&(80===t.port?e="http:":443===t.port&&(e="https:")),e=e||"https:",!t.hostname)return null;var r=e+"//"+t.hostname;return t.port&&(r=r+":"+t.port),t.path&&(r+=t.path),r}function b(t,e){var r,n;try{r=R.stringify(t)}catch(o){if(e&&a(e))try{r=e(t)}catch(t){n=t}else n=o}return{error:n,value:r}}function w(t){var e,r;try{e=R.parse(t)}catch(t){r=t}return{error:r,value:e}}function _(t,e,r,n,o,i,a,s){var u={url:e||"",line:r,column:n};u.func=s.guessFunctionName(u.url,u.line),u.context=s.gatherContext(u.url,u.line);var c=document&&document.location&&document.location.href,l=window&&window.navigator&&window.navigator.userAgent;return{mode:i,message:o?String(o):t||a,url:c,stack:[u],useragent:l}}function x(t,e){return function(r,n){try{e(r,n)}catch(e){t.error(e)}}}function k(t,e,r,n,o){for(var a,s,u,c,l,p,f=[],h=0,m=t.length;h<m;++h){p=t[h];var g=i(p);switch(g){case"undefined":break;case"string":a?f.push(p):a=p;break;case"function":c=x(e,p);break;case"date":f.push(p);break;case"error":case"domexception":s?f.push(p):s=p;break;case"object":case"array":if(p instanceof Error||"undefined"!=typeof DOMException&&p instanceof DOMException){s?f.push(p):s=p;break}if(n&&"object"===g&&!l){for(var v=0,y=n.length;v<y;++v)if(void 0!==p[n[v]]){l=p;break}if(l)break}u?f.push(p):u=p;break;default:if(p instanceof Error||"undefined"!=typeof DOMException&&p instanceof DOMException){s?f.push(p):s=p;break}f.push(p)}}f.length>0&&(u=j(u),u.extraArgs=f);var b={message:a,err:s,custom:u,timestamp:N(),callback:c,uuid:d()};return u&&void 0!==u.level&&(b.level=u.level,delete u.level),n&&l&&(b.request=l),o&&(b.lambdaContext=o),b._originalArgs=t,b}function E(t,e){if(t){var r=e.split("."),n=t;try{for(var o=0,i=r.length;o<i;++o)n=n[r[o]]}catch(t){n=void 0}return n}}function I(t,e,r){if(t){var n=e.split("."),o=n.length;if(!(o<1)){if(1===o)return void(t[n[0]]=r);try{for(var i=t[n[0]]||{},a=i,s=1;s<o-1;s++)i[n[s]]=i[n[s]]||{},i=i[n[s]];i[n[o-1]]=r,t[n[0]]=a}catch(t){return}}}}function T(t,e){function r(t,e,r,n,o,i){return e+h(i)}function n(t){var e;if(o(t,"string"))for(e=0;e<u.length;++e)t=t.replace(u[e],r);return t}function i(t,e){var r;for(r=0;r<s.length;++r)if(s[r].test(t)){e=h(e);break}return e}function a(t,e,r){var s=i(t,e);return s===e?o(e,"object")||o(e,"array")?f(e,a,r):n(s):s}e=e||[];var s=S(e),u=O(e);return f(t,a,[])}function S(t){for(var e,r=[],n=0;n<t.length;++n)e="^\\[?(%5[bB])?"+t[n]+"\\[?(%5[bB])?\\]?(%5[dD])?$",r.push(new RegExp(e,"i"));return r}function O(t){for(var e,r=[],n=0;n<t.length;++n)e="\\[?(%5[bB])?"+t[n]+"\\[?(%5[bB])?\\]?(%5[dD])?",r.push(new RegExp("("+e+"=)([^&\\n]+)","igm"));return r}function L(t){var e,r,n,o=[];for(e=0,r=t.length;e<r;e++){switch(n=t[e],i(n)){case"object":n=b(n),n=n.error||n.value,n.length>500&&(n=n.substr(0,497)+"...");break;case"null":n="null";break;case"undefined":n="undefined";break;case"symbol":n=n.toString()}o.push(n)}return o.join(" ")}function N(){return Date.now?+Date.now():+new Date}function C(t,e){if(t&&t.user_ip&&e!==!0){var r=t.user_ip;if(e)try{var n;if(r.indexOf(".")!==-1)n=r.split("."),n.pop(),n.push("0"),r=n.join(".");else if(r.indexOf(":")!==-1){if(n=r.split(":"),n.length>2){var o=n.slice(0,3),i=o[2].indexOf("/");i!==-1&&(o[2]=o[2].substring(0,i));var a="0000:0000:0000:0000:0000";r=o.concat(a).join(":")}}else r=null}catch(t){r=null}else r=null;t.user_ip=r}}var j=r(7),R={},A=!1;n();var q={debug:0,info:1,warning:2,error:3,critical:4},D={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};t.exports={isType:o,typeName:i,isFunction:a,isNativeFunction:s,isIterable:l,isError:p,merge:j,traverse:f,redact:h,uuid4:d,LEVELS:q,sanitizeUrl:m,addParamsAndAccessTokenToPath:v,formatUrl:y,stringify:b,jsonParse:w,makeUnhandledStackInfo:_,createItem:k,get:E,set:I,scrub:T,formatArgsAsString:L,now:N,filterIp:C}},function(t,e){"use strict";function r(){var t,e,n,o,a,s={},u=null,c=arguments.length;for(t=0;t<c;t++)if(u=arguments[t],null!=u)for(a in u)e=s[a],n=u[a],s!==n&&(n&&i(n)?(o=e&&i(e)?e:{},s[a]=r(o,n)):"undefined"!=typeof n&&(s[a]=n));return s}var n=Object.prototype.hasOwnProperty,o=Object.prototype.toString,i=function(t){if(!t||"[object Object]"!==o.call(t))return!1;var e=n.call(t,"constructor"),r=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!r)return!1;var i;for(i in t);return"undefined"==typeof i||n.call(t,i)};t.exports=r},function(t,e){var r=function(t){function e(t){return t<10?"0"+t:t}function r(){return this.valueOf()}function n(t){return i.lastIndex=0,i.test(t)?'"'+t.replace(i,function(t){var e=u[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function o(t,e){var r,i,u,l,p,f=a,h=e[t];switch(h&&"object"==typeof h&&"function"==typeof h.toJSON&&(h=h.toJSON(t)),"function"==typeof c&&(h=c.call(e,t,h)),typeof h){case"string":return n(h);case"number":return isFinite(h)?String(h):"null";case"boolean":case"null":return String(h);case"object":if(!h)return"null";if(a+=s,p=[],"[object Array]"===Object.prototype.toString.apply(h)){for(l=h.length,r=0;r<l;r+=1)p[r]=o(r,h)||"null";return u=0===p.length?"[]":a?"[\n"+a+p.join(",\n"+a)+"\n"+f+"]":"["+p.join(",")+"]",a=f,u}if(c&&"object"==typeof c)for(l=c.length,r=0;r<l;r+=1)"string"==typeof c[r]&&(i=c[r],u=o(i,h),u&&p.push(n(i)+(a?": ":":")+u));else for(i in h)Object.prototype.hasOwnProperty.call(h,i)&&(u=o(i,h),u&&p.push(n(i)+(a?": ":":")+u));return u=0===p.length?"{}":a?"{\n"+a+p.join(",\n"+a)+"\n"+f+"}":"{"+p.join(",")+"}",a=f,u}}var i=/[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+e(this.getUTCMonth()+1)+"-"+e(this.getUTCDate())+"T"+e(this.getUTCHours())+":"+e(this.getUTCMinutes())+":"+e(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=r,Number.prototype.toJSON=r,String.prototype.toJSON=r);var a,s,u,c;"function"!=typeof t.stringify&&(u={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},t.stringify=function(t,e,r){var n;if(a="",s="","number"==typeof r)for(n=0;n<r;n+=1)s+=" ";else"string"==typeof r&&(s=r);if(c=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return o("",{"":t})}),"function"!=typeof t.parse&&(t.parse=function(){function t(t){return t.replace(/\\(?:u(.{4})|([^u]))/g,function(t,e,r){return e?String.fromCharCode(parseInt(e,16)):a[r]})}var e,r,n,o,i,a={"\\":"\\",'"':'"',"/":"/",t:"\t",n:"\n",r:"\r",f:"\f",b:"\b"},s={go:function(){e="ok"},firstokey:function(){o=i,e="colon"},okey:function(){o=i,e="colon"},ovalue:function(){e="ocomma"},firstavalue:function(){e="acomma"},avalue:function(){e="acomma"}},u={go:function(){e="ok"},ovalue:function(){e="ocomma"},firstavalue:function(){e="acomma"},avalue:function(){e="acomma"}},c={"{":{go:function(){r.push({state:"ok"}),n={},e="firstokey"},ovalue:function(){r.push({container:n,state:"ocomma",key:o}),n={},e="firstokey"},firstavalue:function(){r.push({container:n,state:"acomma"}),n={},e="firstokey"},avalue:function(){r.push({container:n,state:"acomma"}),n={},e="firstokey"}},"}":{firstokey:function(){var t=r.pop();i=n,n=t.container,o=t.key,e=t.state},ocomma:function(){var t=r.pop();n[o]=i,i=n,n=t.container,o=t.key,e=t.state}},"[":{go:function(){r.push({state:"ok"}),n=[],e="firstavalue"},ovalue:function(){r.push({container:n,state:"ocomma",key:o}),n=[],e="firstavalue"},firstavalue:function(){r.push({container:n,state:"acomma"}),n=[],e="firstavalue"},avalue:function(){r.push({container:n,state:"acomma"}),n=[],e="firstavalue"}},"]":{firstavalue:function(){var t=r.pop();i=n,n=t.container,o=t.key,e=t.state},acomma:function(){var t=r.pop();n.push(i),i=n,n=t.container,o=t.key,e=t.state}},":":{colon:function(){if(Object.hasOwnProperty.call(n,o))throw new SyntaxError("Duplicate key '"+o+'"');e="ovalue"}},",":{ocomma:function(){n[o]=i,e="okey"},acomma:function(){n.push(i),e="avalue"}},true:{go:function(){i=!0,e="ok"},ovalue:function(){i=!0,e="ocomma"},firstavalue:function(){i=!0,e="acomma"},avalue:function(){i=!0,e="acomma"}},false:{go:function(){i=!1,e="ok"},ovalue:function(){i=!1,e="ocomma"},firstavalue:function(){i=!1,e="acomma"},avalue:function(){i=!1,e="acomma"}},null:{go:function(){i=null,e="ok"},ovalue:function(){i=null,e="ocomma"},firstavalue:function(){i=null,e="acomma"},avalue:function(){i=null,e="acomma"}}};return function(n,o){var a,l=/^[\u0020\t\n\r]*(?:([,:\[\]{}]|true|false|null)|(-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)|"((?:[^\r\n\t\\\"]|\\(?:["\\\/trnfb]|u[0-9a-fA-F]{4}))*)")/;e="go",r=[];try{for(;;){if(a=l.exec(n),!a)break;a[1]?c[a[1]][e]():a[2]?(i=+a[2],u[e]()):(i=t(a[3]),s[e]()),n=n.slice(a[0].length)}}catch(t){e=t}if("ok"!==e||/[^\u0020\t\n\r]/.test(n))throw e instanceof SyntaxError?e:new SyntaxError("JSON");return"function"==typeof o?function t(e,r){var n,a,s=e[r];if(s&&"object"==typeof s)for(n in i)Object.prototype.hasOwnProperty.call(s,n)&&(a=t(s,n),void 0!==a?s[n]=a:delete s[n]);return o.call(e,r,s)}({"":i},""):i}}())};t.exports=r},function(t,e,r){"use strict";function n(t,e){this.queue=t,this.options=e,this.transforms=[]}var o=r(6);n.prototype.configure=function(t){this.queue&&this.queue.configure(t);var e=this.options;return this.options=o.merge(e,t),this},n.prototype.addTransform=function(t){return o.isFunction(t)&&this.transforms.push(t),this},n.prototype.log=function(t,e){if(e&&o.isFunction(e)||(e=function(){}),!this.options.enabled)return e(new Error("Rollbar is not enabled"));this.queue.addPendingItem(t);var r=t.err;this._applyTransforms(t,function(n,o){return n?(this.queue.removePendingItem(t),e(n,null)):void this.queue.addItem(o,e,r,t)}.bind(this))},n.prototype._applyTransforms=function(t,e){var r=-1,n=this.transforms.length,o=this.transforms,i=this.options,a=function(t,s){return t?void e(t,null):(r++,r===n?void e(null,s):void o[r](s,i,a))};a(null,t)},t.exports=n},function(t,e,r){"use strict";function n(t){this.queue=[],this.options=i.merge(t);var e=this.options.maxTelemetryEvents||a;this.maxQueueSize=Math.max(0,Math.min(e,a))}function o(t,e){if(e)return e;var r={error:"error",manual:"info"};return r[t]||"info"}var i=r(6),a=100;n.prototype.configure=function(t){var e=this.options;this.options=i.merge(e,t);var r=this.options.maxTelemetryEvents||a,n=Math.max(0,Math.min(r,a)),o=0;this.maxQueueSize>n&&(o=this.maxQueueSize-n),this.maxQueueSize=n,this.queue.splice(0,o)},n.prototype.copyEvents=function(){return Array.prototype.slice.call(this.queue,0)},n.prototype.capture=function(t,e,r,n,a){var s={level:o(t,r),type:t,timestamp_ms:a||i.now(),body:e,source:"client"};n&&(s.uuid=n);try{if(i.isFunction(this.options.filterTelemetry)&&this.options.filterTelemetry(s))return!1}catch(t){this.options.filterTelemetry=null}return this.push(s),s},n.prototype.captureEvent=function(t,e,r){return this.capture("manual",t,e,r)},n.prototype.captureError=function(t,e,r,n){var o={message:t.message||String(t)};return t.stack&&(o.stack=t.stack),this.capture("error",o,e,r,n)},n.prototype.captureLog=function(t,e,r,n){return this.capture("log",{message:t},e,r,n)},n.prototype.captureNetwork=function(t,e,r,n){e=e||"xhr",t.subtype=t.subtype||e,n&&(t.request=n);var o=this.levelFromStatus(t.status_code);return this.capture("network",t,o,r)},n.prototype.levelFromStatus=function(t){return t>=200&&t<400?"info":0===t||t>=400?"error":"info"},n.prototype.captureDom=function(t,e,r,n,o){var i={subtype:t,element:e};return void 0!==r&&(i.value=r),void 0!==n&&(i.checked=n),this.capture("dom",i,"info",o)},n.prototype.captureNavigation=function(t,e,r){return this.capture("navigation",{from:t,to:e},"info",r)},n.prototype.captureDomContentLoaded=function(t){return this.capture("navigation",{subtype:"DOMContentLoaded"},"info",void 0,t&&t.getTime())},n.prototype.captureLoad=function(t){return this.capture("navigation",{subtype:"load"},"info",void 0,t&&t.getTime())},n.prototype.captureConnectivityChange=function(t,e){return this.captureNetwork({change:t},"connectivity",e)},n.prototype._captureRollbarItem=function(t){if(this.options.includeItemsInTelemetry)return t.err?this.captureError(t.err,t.level,t.uuid,t.timestamp):t.message?this.captureLog(t.message,t.level,t.uuid,t.timestamp):t.custom?this.capture("log",t.custom,t.level,t.uuid,t.timestamp):void 0},n.prototype.push=function(t){this.queue.push(t),this.queue.length>this.maxQueueSize&&this.queue.shift()},t.exports=n},function(t,e,r){"use strict";function n(t,e,r,n){this.options=t,this.transport=e,this.url=r,this.jsonBackup=n,this.accessToken=t.accessToken,this.transportOptions=o(t,r)}function o(t,e){return a.getTransportFromOptions(t,s,e)}var i=r(6),a=r(12),s={hostname:"api.rollbar.com",path:"/api/1/item/",search:null,version:"1",protocol:"https:",port:443};n.prototype.postItem=function(t,e){var r=a.transportOptions(this.transportOptions,"POST"),n=a.buildPayload(this.accessToken,t,this.jsonBackup);this.transport.post(this.accessToken,r,n,e)},n.prototype.configure=function(t){var e=this.oldOptions;return this.options=i.merge(e,t),this.transportOptions=o(this.options,this.url),void 0!==this.options.accessToken&&(this.accessToken=this.options.accessToken),this},t.exports=n},function(t,e,r){"use strict";function n(t,e,r){if(!s.isType(e.context,"string")){var n=s.stringify(e.context,r);n.error?e.context="Error: could not serialize 'context'":e.context=n.value||"",e.context.length>255&&(e.context=e.context.substr(0,255))}return{access_token:t,data:e}}function o(t,e,r){var n=e.hostname,o=e.protocol,i=e.port,a=e.path,s=e.search,u=t.proxy;if(t.endpoint){var c=r.parse(t.endpoint);n=c.hostname,o=c.protocol,i=c.port,a=c.pathname,s=c.search}return{hostname:n,protocol:o,port:i,path:a,search:s,proxy:u}}function i(t,e){var r=t.protocol||"https:",n=t.port||("http:"===r?80:"https:"===r?443:void 0),o=t.hostname,i=t.path;return t.search&&(i+=t.search),t.proxy&&(i=r+"//"+o+i,o=t.proxy.host||t.proxy.hostname,n=t.proxy.port,r=t.proxy.protocol||r),{protocol:r,hostname:o,path:i,port:n,method:e}}function a(t,e){var r=/\/$/.test(t),n=/^\//.test(e);return r&&n?e=e.substring(1):r||n||(e="/"+e),t+e}var s=r(6);t.exports={buildPayload:n,getTransportFromOptions:o,transportOptions:i,appendPathToPath:a}},function(t,e,r){"use strict";function n(){var t=Array.prototype.slice.call(arguments,0);t.unshift("Rollbar:"),a.ieVersion()<=8?console.error(s.formatArgsAsString(t)):console.error.apply(console,t)}function o(){var t=Array.prototype.slice.call(arguments,0);t.unshift("Rollbar:"),a.ieVersion()<=8?console.info(s.formatArgsAsString(t)):console.info.apply(console,t)}function i(){var t=Array.prototype.slice.call(arguments,0);t.unshift("Rollbar:"),a.ieVersion()<=8?console.log(s.formatArgsAsString(t)):console.log.apply(console,t)}r(14);var a=r(15),s=r(6);t.exports={error:n,info:o,log:i}},function(t,e){!function(t){
+"use strict";t.console||(t.console={});for(var e,r,n=t.console,o=function(){},i=["memory"],a="assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(",");e=i.pop();)n[e]||(n[e]={});for(;r=a.pop();)n[r]||(n[r]=o)}("undefined"==typeof window?this:window)},function(t,e){"use strict";function r(){var t;if(!document)return t;for(var e=3,r=document.createElement("div"),n=r.getElementsByTagName("i");r.innerHTML="<!--[if gt IE "+ ++e+"]><i></i><![endif]-->",n[0];);return e>4?e:t}var n={ieVersion:r};t.exports=n},function(t,e){"use strict";function r(t,e,r){if(t){var o;"function"==typeof e._rollbarOldOnError?o=e._rollbarOldOnError:t.onerror&&!t.onerror.belongsToShim&&(o=t.onerror,e._rollbarOldOnError=o);var i=function(){var r=Array.prototype.slice.call(arguments,0);n(t,e,o,r)};i.belongsToShim=r,t.onerror=i}}function n(t,e,r,n){t._rollbarWrappedError&&(n[4]||(n[4]=t._rollbarWrappedError),n[5]||(n[5]=t._rollbarWrappedError._rollbarContext),t._rollbarWrappedError=null),e.handleUncaughtException.apply(e,n),r&&r.apply(t,n)}function o(t,e,r){if(t){"function"==typeof t._rollbarURH&&t._rollbarURH.belongsToShim&&t.removeEventListener("unhandledrejection",t._rollbarURH);var n=function(t){var r,n,o;try{r=t.reason}catch(t){r=void 0}try{n=t.promise}catch(t){n="[unhandledrejection] error getting `promise` from event"}try{o=t.detail,!r&&o&&(r=o.reason,n=o.promise)}catch(t){o="[unhandledrejection] error getting `detail` from event"}r||(r="[unhandledrejection] error getting `reason` from event"),e&&e.handleUnhandledRejection&&e.handleUnhandledRejection(r,n)};n.belongsToShim=r,t._rollbarURH=n,t.addEventListener("unhandledrejection",n)}}function i(t,e,r){if(t){var n,o,i="EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload".split(",");for(n=0;n<i.length;++n)o=i[n],t[o]&&t[o].prototype&&a(e,t[o].prototype,r)}}function a(t,e,r){if(e.hasOwnProperty&&e.hasOwnProperty("addEventListener")){for(var n=e.addEventListener;n._rollbarOldAdd&&n.belongsToShim;)n=n._rollbarOldAdd;var o=function(e,r,o){n.call(this,e,t.wrap(r),o)};o._rollbarOldAdd=n,o.belongsToShim=r,e.addEventListener=o;for(var i=e.removeEventListener;i._rollbarOldRemove&&i.belongsToShim;)i=i._rollbarOldRemove;var a=function(t,e,r){i.call(this,t,e&&e._rollbar_wrapped||e,r)};a._rollbarOldRemove=i,a.belongsToShim=r,e.removeEventListener=a}}t.exports={captureUncaughtExceptions:r,captureUnhandledRejections:o,wrapGlobals:i}},function(t,e,r){"use strict";function n(t,e,r,n,o){n&&l.isFunction(n)||(n=function(){}),l.addParamsAndAccessTokenToPath(t,e,r);var a="GET",s=l.formatUrl(e);i(t,s,a,null,n,o)}function o(t,e,r,n,o){if(n&&l.isFunction(n)||(n=function(){}),!r)return n(new Error("Cannot send empty request"));var a=p.truncate(r);if(a.error)return n(a.error);var s=a.value,u="POST",c=l.formatUrl(e);i(t,c,u,s,n,o)}function i(t,e,r,n,o,i){var p;if(p=i?i():a(),!p)return o(new Error("No way to send a request"));try{try{var h=function(){try{if(h&&4===p.readyState){h=void 0;var t=l.jsonParse(p.responseText);if(s(p))return void o(t.error,t.value);if(u(p)){if(403===p.status){var e=t.value&&t.value.message;f.error(e)}o(new Error(String(p.status)))}else{var r="XHR response had no status code (likely connection failure)";o(c(r))}}}catch(t){var n;n=t&&t.stack?t:new Error(t),o(n)}};p.open(r,e,!0),p.setRequestHeader&&(p.setRequestHeader("Content-Type","application/json"),p.setRequestHeader("X-Rollbar-Access-Token",t)),p.onreadystatechange=h,p.send(n)}catch(t){if("undefined"!=typeof XDomainRequest){if(!window||!window.location)return o(new Error("No window available during request, unknown environment"));"http:"===window.location.href.substring(0,5)&&"https"===e.substring(0,5)&&(e="http"+e.substring(5));var d=new XDomainRequest;d.onprogress=function(){},d.ontimeout=function(){var t="Request timed out",e="ETIMEDOUT";o(c(t,e))},d.onerror=function(){o(new Error("Error during request"))},d.onload=function(){var t=l.jsonParse(d.responseText);o(t.error,t.value)},d.open(r,e,!0),d.send(n)}else o(new Error("Cannot find a method to transport a request"))}}catch(t){o(t)}}function a(){var t,e,r=[function(){return new XMLHttpRequest},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],n=r.length;for(e=0;e<n;e++)try{t=r[e]();break}catch(t){}return t}function s(t){return t&&t.status&&200===t.status}function u(t){return t&&l.isType(t.status,"number")&&t.status>=400&&t.status<600}function c(t,e){var r=new Error(t);return r.code=e||"ENOTFOUND",r}var l=r(6),p=r(18),f=r(13);t.exports={get:n,post:o}},function(t,e,r){"use strict";function n(t,e){return[t,f.stringify(t,e)]}function o(t,e){var r=t.length;return r>2*e?t.slice(0,e).concat(t.slice(r-e)):t}function i(t,e,r){r="undefined"==typeof r?30:r;var n,i=t.data.body;if(i.trace_chain)for(var a=i.trace_chain,s=0;s<a.length;s++)n=a[s].frames,n=o(n,r),a[s].frames=n;else i.trace&&(n=i.trace.frames,n=o(n,r),i.trace.frames=n);return[t,f.stringify(t,e)]}function a(t,e){return e&&e.length>t?e.slice(0,t-3).concat("..."):e}function s(t,e,r){function n(e,r,o){switch(f.typeName(r)){case"string":return a(t,r);case"object":case"array":return f.traverse(r,n,o);default:return r}}return e=f.traverse(e,n,[]),[e,f.stringify(e,r)]}function u(t){return t.exception&&(delete t.exception.description,t.exception.message=a(255,t.exception.message)),t.frames=o(t.frames,1),t}function c(t,e){var r=t.data.body;if(r.trace_chain)for(var n=r.trace_chain,o=0;o<n.length;o++)n[o]=u(n[o]);else r.trace&&(r.trace=u(r.trace));return[t,f.stringify(t,e)]}function l(t,e){return t.length>e}function p(t,e,r){r="undefined"==typeof r?524288:r;for(var o,a,u,p=[n,i,s.bind(null,1024),s.bind(null,512),s.bind(null,256),c];o=p.shift();)if(a=o(t,e),t=a[0],u=a[1],u.error||!l(u.value,r))return u;return u}var f=r(6);t.exports={truncate:p,raw:n,truncateFrames:i,truncateStrings:s,maybeTruncateValue:a}},function(t,e){"use strict";function r(t){var e,r,n={protocol:null,auth:null,host:null,path:null,hash:null,href:t,hostname:null,port:null,pathname:null,search:null,query:null};if(e=t.indexOf("//"),e!==-1?(n.protocol=t.substring(0,e),r=e+2):r=0,e=t.indexOf("@",r),e!==-1&&(n.auth=t.substring(r,e),r=e+1),e=t.indexOf("/",r),e===-1){if(e=t.indexOf("?",r),e===-1)return e=t.indexOf("#",r),e===-1?n.host=t.substring(r):(n.host=t.substring(r,e),n.hash=t.substring(e)),n.hostname=n.host.split(":")[0],n.port=n.host.split(":")[1],n.port&&(n.port=parseInt(n.port,10)),n;n.host=t.substring(r,e),n.hostname=n.host.split(":")[0],n.port=n.host.split(":")[1],n.port&&(n.port=parseInt(n.port,10)),r=e}else n.host=t.substring(r,e),n.hostname=n.host.split(":")[0],n.port=n.host.split(":")[1],n.port&&(n.port=parseInt(n.port,10)),r=e;if(e=t.indexOf("#",r),e===-1?n.path=t.substring(r):(n.path=t.substring(r,e),n.hash=t.substring(e)),n.path){var o=n.path.split("?");n.pathname=o[0],n.query=o[1],n.search=n.query?"?"+n.query:null}return n}t.exports={parse:r}},function(t,e,r){"use strict";function n(t,e,r){if(t.data=t.data||{},t.err)try{t.stackInfo=t.err._savedStackTrace||d.parse(t.err)}catch(e){m.error("Error while parsing the error object.",e);try{t.message=t.err.message||t.err.description||t.message||String(t.err)}catch(e){t.message=String(t.err)||String(e)}delete t.err}r(null,t)}function o(t,e,r){t.message||t.stackInfo||t.custom||r(new Error("No message, stack info, or custom data"),null),r(null,t)}function i(t,e,r){var n=e.payload&&e.payload.environment||e.environment;t.data=h.merge(t.data,{environment:n,level:t.level,endpoint:e.endpoint,platform:"browser",framework:"browser-js",language:"javascript",server:{},uuid:t.uuid,notifier:{name:"rollbar-browser-js",version:e.version}}),r(null,t)}function a(t){return function(e,r,n){if(!t||!t.location)return n(null,e);var o="$remote_ip";r.captureIp?r.captureIp!==!0&&(o+="_anonymize"):o=null,h.set(e,"data.request",{url:t.location.href,query_string:t.location.search,user_ip:o}),n(null,e)}}function s(t){return function(e,r,n){if(!t)return n(null,e);var o=t.navigator||{},i=t.screen||{};h.set(e,"data.client",{runtime_ms:e.timestamp-t._rollbarStartTime,timestamp:Math.round(e.timestamp/1e3),javascript:{browser:o.userAgent,language:o.language,cookie_enabled:o.cookieEnabled,screen:{width:i.width,height:i.height}}}),n(null,e)}}function u(t){return function(e,r,n){if(!t||!t.navigator)return n(null,e);for(var o,i=[],a=t.navigator.plugins||[],s=0,u=a.length;s<u;++s)o=a[s],i.push({name:o.name,description:o.description});h.set(e,"data.client.javascript.plugins",i),n(null,e)}}function c(t,e,r){t.stackInfo?p(t,e,r):l(t,e,r)}function l(t,e,r){var n=t.message,o=t.custom;if(!n)if(o){var i=e.scrubFields,a=h.stringify(h.scrub(o,i));n=a.error||a.value||""}else n="";var s={body:n};o&&(s.extra=h.merge(o)),h.set(t,"data.body",{message:s}),r(null,t)}function p(t,e,r){var n=t.data.description,o=t.stackInfo,i=t.custom,a=d.guessErrorClass(o.message),s=o.name||a[0],u=a[1],c={exception:{class:s,message:u}};n&&(c.exception.description=n);var p=o.stack;if(p&&0===p.length&&t._unhandledStackInfo&&t._unhandledStackInfo.stack&&(p=t._unhandledStackInfo.stack),p){0===p.length&&(c.exception.stack=o.rawStack,c.exception.raw=String(o.rawException));var f,m,g,v,y,b,w,_;for(c.frames=[],w=0;w<p.length;++w)f=p[w],m={filename:f.url?h.sanitizeUrl(f.url):"(unknown)",lineno:f.line||null,method:f.func&&"?"!==f.func?f.func:"[anonymous]",colno:f.column},m.method&&m.method.endsWith&&m.method.endsWith("_rollbar_wrapped")||(g=v=y=null,b=f.context?f.context.length:0,b&&(_=Math.floor(b/2),v=f.context.slice(0,_),g=f.context[_],y=f.context.slice(_)),g&&(m.code=g),(v||y)&&(m.context={},v&&v.length&&(m.context.pre=v),y&&y.length&&(m.context.post=y)),f.args&&(m.args=f.args),c.frames.push(m));c.frames.reverse(),i&&(c.extra=h.merge(i)),h.set(t,"data.body",{trace:c}),r(null,t)}else t.message=s+": "+u,l(t,e,r)}function f(t,e,r){var n=e.scrubFields;t.data=h.scrub(t.data,n),r(null,t)}var h=r(6),d=r(21),m=r(13);t.exports={handleItemWithError:n,ensureItemHasSomethingToSay:o,addBaseInfo:i,addRequestInfo:a,addClientInfo:s,addPluginInfo:u,addBody:c,scrubPayload:f}},function(t,e,r){"use strict";function n(){return l}function o(){return null}function i(t){var e={};return e._stackFrame=t,e.url=t.fileName,e.line=t.lineNumber,e.func=t.functionName,e.column=t.columnNumber,e.args=t.args,e.context=o(e.url,e.line),e}function a(t){function e(){var e,r=[];if(t.stack)e=t;else try{throw t}catch(t){e=t}try{r=c.parse(e)}catch(t){r=[]}for(var n=[],o=0;o<r.length;o++)n.push(new i(r[o]));return n}return{stack:e(),message:t.message,name:t.name,rawStack:t.stack,rawException:t}}function s(t){return new a(t)}function u(t){if(!t||!t.match)return["Unknown error. There was no error message to display.",""];var e=t.match(p),r="(unknown)";return e&&(r=e[e.length-1],t=t.replace((e[e.length-2]||"")+r+":",""),t=t.replace(/(^[\s]+|[\s]+$)/g,"")),[r,t]}var c=r(22),l="?",p=new RegExp("^(([a-zA-Z0-9-_$ ]*): *)?(Uncaught )?([a-zA-Z0-9-_$ ]*): ");t.exports={guessFunctionName:n,guessErrorClass:u,gatherContext:o,parse:s,Stack:a,Frame:i}},function(t,e,r){var n,o,i;!function(a,s){"use strict";o=[r(23)],n=s,i="function"==typeof n?n.apply(e,o):n,!(void 0!==i&&(t.exports=i))}(this,function(t){"use strict";function e(t,e,r){if("function"==typeof Array.prototype.map)return t.map(e,r);for(var n=new Array(t.length),o=0;o<t.length;o++)n[o]=e.call(r,t[o]);return n}function r(t,e,r){if("function"==typeof Array.prototype.filter)return t.filter(e,r);for(var n=[],o=0;o<t.length;o++)e.call(r,t[o])&&n.push(t[o]);return n}var n=/(^|@)\S+\:\d+/,o=/^\s*at .*(\S+\:\d+|\(native\))/m,i=/^(eval@)?(\[native code\])?$/;return{parse:function(t){if("undefined"!=typeof t.stacktrace||"undefined"!=typeof t["opera#sourceloc"])return this.parseOpera(t);if(t.stack&&t.stack.match(o))return this.parseV8OrIE(t);if(t.stack)return this.parseFFOrSafari(t);throw new Error("Cannot parse given Error object")},extractLocation:function(t){if(t.indexOf(":")===-1)return[t];var e=t.replace(/[\(\)\s]/g,"").split(":"),r=e.pop(),n=e[e.length-1];if(!isNaN(parseFloat(n))&&isFinite(n)){var o=e.pop();return[e.join(":"),o,r]}return[e.join(":"),r,void 0]},parseV8OrIE:function(n){var i=r(n.stack.split("\n"),function(t){return!!t.match(o)},this);return e(i,function(e){e.indexOf("(eval ")>-1&&(e=e.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var r=e.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),n=this.extractLocation(r.pop()),o=r.join(" ")||void 0,i="eval"===n[0]?void 0:n[0];return new t(o,void 0,i,n[1],n[2],e)},this)},parseFFOrSafari:function(n){var o=r(n.stack.split("\n"),function(t){return!t.match(i)},this);return e(o,function(e){if(e.indexOf(" > eval")>-1&&(e=e.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),e.indexOf("@")===-1&&e.indexOf(":")===-1)return new t(e);var r=e.split("@"),n=this.extractLocation(r.pop()),o=r.shift()||void 0;return new t(o,void 0,n[0],n[1],n[2],e)},this)},parseOpera:function(t){return!t.stacktrace||t.message.indexOf("\n")>-1&&t.message.split("\n").length>t.stacktrace.split("\n").length?this.parseOpera9(t):t.stack?this.parseOpera11(t):this.parseOpera10(t)},parseOpera9:function(e){for(var r=/Line (\d+).*script (?:in )?(\S+)/i,n=e.message.split("\n"),o=[],i=2,a=n.length;i<a;i+=2){var s=r.exec(n[i]);s&&o.push(new t(void 0,void 0,s[2],s[1],void 0,n[i]))}return o},parseOpera10:function(e){for(var r=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,n=e.stacktrace.split("\n"),o=[],i=0,a=n.length;i<a;i+=2){var s=r.exec(n[i]);s&&o.push(new t(s[3]||void 0,void 0,s[2],s[1],void 0,n[i]))}return o},parseOpera11:function(o){var i=r(o.stack.split("\n"),function(t){return!!t.match(n)&&!t.match(/^Error created at/)},this);return e(i,function(e){var r,n=e.split("@"),o=this.extractLocation(n.pop()),i=n.shift()||"",a=i.replace(/<anonymous function(: (\w+))?>/,"$2").replace(/\([^\)]*\)/g,"")||void 0;i.match(/\(([^\)]*)\)/)&&(r=i.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===r||"[arguments not available]"===r?void 0:r.split(",");return new t(a,s,o[0],o[1],o[2],e)},this)}}})},function(t,e,r){var n,o,i;!function(r,a){"use strict";o=[],n=a,i="function"==typeof n?n.apply(e,o):n,!(void 0!==i&&(t.exports=i))}(this,function(){"use strict";function t(t){return!isNaN(parseFloat(t))&&isFinite(t)}function e(t,e,r,n,o,i){void 0!==t&&this.setFunctionName(t),void 0!==e&&this.setArgs(e),void 0!==r&&this.setFileName(r),void 0!==n&&this.setLineNumber(n),void 0!==o&&this.setColumnNumber(o),void 0!==i&&this.setSource(i)}return e.prototype={getFunctionName:function(){return this.functionName},setFunctionName:function(t){this.functionName=String(t)},getArgs:function(){return this.args},setArgs:function(t){if("[object Array]"!==Object.prototype.toString.call(t))throw new TypeError("Args must be an Array");this.args=t},getFileName:function(){return this.fileName},setFileName:function(t){this.fileName=String(t)},getLineNumber:function(){return this.lineNumber},setLineNumber:function(e){if(!t(e))throw new TypeError("Line Number must be a Number");this.lineNumber=Number(e)},getColumnNumber:function(){return this.columnNumber},setColumnNumber:function(e){if(!t(e))throw new TypeError("Column Number must be a Number");this.columnNumber=Number(e)},getSource:function(){return this.source},setSource:function(t){this.source=String(t)},toString:function(){var e=this.getFunctionName()||"{anonymous}",r="("+(this.getArgs()||[]).join(",")+")",n=this.getFileName()?"@"+this.getFileName():"",o=t(this.getLineNumber())?":"+this.getLineNumber():"",i=t(this.getColumnNumber())?":"+this.getColumnNumber():"";return e+r+n+o+i}},e})},function(t,e,r){"use strict";function n(t,e,r){var n=e.payload||{};n.body&&delete n.body;var o=u.merge(t.data,n);t._isUncaught&&(o._isUncaught=!0),t._originalArgs&&(o._originalArgs=t._originalArgs),r(null,o)}function o(t,e,r){t.telemetryEvents&&u.set(t,"data.body.telemetry",t.telemetryEvents),r(null,t)}function i(t,e,r){if(!t.message)return void r(null,t);var n="data.body.trace_chain.0",o=u.get(t,n);if(o||(n="data.body.trace",o=u.get(t,n)),o){if(!o.exception||!o.exception.description)return u.set(t,n+".exception.description",t.message),void r(null,t);var i=u.get(t,n+".extra")||{},a=u.merge(i,{message:t.message});u.set(t,n+".extra",a)}r(null,t)}function a(t){return function(e,r,n){var o=u.merge(e);try{u.isFunction(r.transform)&&r.transform(o.data)}catch(o){return r.transform=null,t.error("Error while calling custom transform() function. Removing custom transform().",o),void n(null,e)}n(null,o)}}function s(t,e,r){if(!e.sendConfig)return r(null,t);var n="_rollbarConfig",o=u.get(t,"data.custom")||{};o[n]=e,t.data.custom=o,r(null,t)}var u=r(6);t.exports={itemToPayload:n,addTelemetryData:o,addMessageWithError:i,userTransform:a,addConfigToPayload:s}},function(t,e,r){"use strict";function n(t,e){return!o.get(e,"plugins.jquery.ignoreAjaxErrors")||!o.get(t,"body.message.extra.isAjax")}var o=r(6);t.exports={checkIgnore:n}},function(t,e,r){"use strict";function n(t,e){var r=t.level,n=c.LEVELS[r]||0,o=e.reportLevel,i=c.LEVELS[o]||0;return!(n<i)}function o(t){return function(e,r){var n=!!e._isUncaught;delete e._isUncaught;var o=e._originalArgs;delete e._originalArgs;try{c.isFunction(r.onSendCallback)&&r.onSendCallback(n,o,e)}catch(e){r.onSendCallback=null,t.error("Error while calling onSendCallback, removing",e)}try{if(c.isFunction(r.checkIgnore)&&r.checkIgnore(n,o,e))return!1}catch(e){r.checkIgnore=null,t.error("Error while calling custom checkIgnore(), removing",e)}return!0}}function i(t){return function(e,r){return!s(e,r,"blacklist",t)}}function a(t){return function(e,r){return s(e,r,"whitelist",t)}}function s(t,e,r,n){var o=!1;"blacklist"===r&&(o=!0);var i,a,s,u,l,p,f,h,d,m;try{if(i=o?e.hostBlackList:e.hostWhiteList,f=i&&i.length,a=c.get(t,"body.trace"),!i||0===f)return!o;if(!a||!a.frames||0===a.frames.length)return!o;for(l=a.frames.length,d=0;d<l;d++){if(s=a.frames[d],u=s.filename,!c.isType(u,"string"))return!o;for(m=0;m<f;m++)if(p=i[m],h=new RegExp(p),h.test(u))return!0}}catch(t){o?e.hostBlackList=null:e.hostWhiteList=null;var g=o?"hostBlackList":"hostWhiteList";return n.error("Error while reading your configuration's "+g+" option. Removing custom "+g+".",t),!o}return!1}function u(t){return function(e,r){var n,o,i,a,s,u,l,p,f;try{if(s=!1,i=r.ignoredMessages,!i||0===i.length)return!0;if(l=e.body,p=c.get(l,"trace.exception.message"),f=c.get(l,"message.body"),n=p||f,!n)return!0;for(a=i.length,o=0;o<a&&(u=new RegExp(i[o],"gi"),!(s=u.test(n)));o++);}catch(e){r.ignoredMessages=null,t.error("Error while reading your configuration's ignoredMessages option. Removing custom ignoredMessages.")}return!s}}var c=r(6);t.exports={checkLevel:n,userCheckIgnore:o,urlIsNotBlacklisted:i,urlIsWhitelisted:a,messageIsIgnored:u}},function(t,e,r){"use strict";function n(t,e,r,n,o){var i=t[e];t[e]=r(i),n&&n[o].push([t,e,i])}function o(t,e){for(var r;t[e].length;)r=t[e].shift(),r[0][r[1]]=r[2]}function i(t){if(!t||!t.attributes)return null;for(var e=t.attributes,r=0;r<e.length;++r)if("name"===e[r].key)return e[r].value;return null}function a(t){for(var e=[],r=0;r<t.length;++r)e.push(new RegExp(t[r],"i"));return function(t){var r=i(t);if(!r)return!1;for(var n=0;n<e.length;++n)if(e[n].test(r))return!0;return!1}}function s(t,e,r,n,o){var i=t.autoInstrument;t.enabled===!1||i===!1?this.autoInstrument={}:(u.isType(i,"object")||(i=p),this.autoInstrument=u.merge(p,i)),this.scrubTelemetryInputs=!!t.scrubTelemetryInputs,this.telemetryScrubber=t.telemetryScrubber,this.defaultValueScrubber=a(t.scrubFields),this.telemeter=e,this.rollbar=r,this._window=n||{},this._document=o||{},this.replacements={network:[],log:[],navigation:[],connectivity:[]},this.eventRemovers={dom:[],connectivity:[]},this._location=this._window.location,this._lastHref=this._location&&this._location.href}var u=r(6),c=r(19),l=r(28),p={network:!0,networkResponseHeaders:!1,networkResponseBody:!1,networkRequestBody:!1,log:!0,dom:!0,navigation:!0,connectivity:!0};s.prototype.configure=function(t){var e=t.autoInstrument,r=u.merge(this.autoInstrument);t.enabled===!1||e===!1?this.autoInstrument={}:(u.isType(e,"object")||(e=p),this.autoInstrument=u.merge(p,e)),this.instrument(r),void 0!==t.scrubTelemetryInputs&&(this.scrubTelemetryInputs=!!t.scrubTelemetryInputs),void 0!==t.telemetryScrubber&&(this.telemetryScrubber=t.telemetryScrubber)},s.prototype.instrument=function(t){!this.autoInstrument.network||t&&t.network?!this.autoInstrument.network&&t&&t.network&&this.deinstrumentNetwork():this.instrumentNetwork(),!this.autoInstrument.log||t&&t.log?!this.autoInstrument.log&&t&&t.log&&this.deinstrumentConsole():this.instrumentConsole(),!this.autoInstrument.dom||t&&t.dom?!this.autoInstrument.dom&&t&&t.dom&&this.deinstrumentDom():this.instrumentDom(),!this.autoInstrument.navigation||t&&t.navigation?!this.autoInstrument.navigation&&t&&t.navigation&&this.deinstrumentNavigation():this.instrumentNavigation(),!this.autoInstrument.connectivity||t&&t.connectivity?!this.autoInstrument.connectivity&&t&&t.connectivity&&this.deinstrumentConnectivity():this.instrumentConnectivity()},s.prototype.deinstrumentNetwork=function(){o(this.replacements,"network")},s.prototype.instrumentNetwork=function(){function t(t,r){t in r&&u.isFunction(r[t])&&n(r,t,function(t){return e.rollbar.wrap(t)})}var e=this;if("XMLHttpRequest"in this._window){var r=this._window.XMLHttpRequest.prototype;n(r,"open",function(t){return function(e,r){return u.isType(r,"string")&&(this.__rollbar_xhr={method:e,url:r,status_code:null,start_time_ms:u.now(),end_time_ms:null}),t.apply(this,arguments)}},this.replacements,"network"),n(r,"send",function(r){return function(o){function i(){if(a.__rollbar_xhr&&(1===a.readyState||4===a.readyState)){if(null===a.__rollbar_xhr.status_code){a.__rollbar_xhr.status_code=0;var t=null;e.autoInstrument.networkRequestBody&&(t=o),a.__rollbar_event=e.telemeter.captureNetwork(a.__rollbar_xhr,"xhr",void 0,t)}if(1===a.readyState)a.__rollbar_xhr.start_time_ms=u.now();else{a.__rollbar_xhr.end_time_ms=u.now();var r=null;if(e.autoInstrument.networkResponseHeaders){var n=e.autoInstrument.networkResponseHeaders;r={};try{var i,s;if(n===!0){var c=a.getAllResponseHeaders();if(c){var l,p,f=c.trim().split(/[\r\n]+/);for(s=0;s<f.length;s++)l=f[s].split(": "),i=l.shift(),p=l.join(": "),r[i]=p}}else for(s=0;s<n.length;s++)i=n[s],r[i]=a.getResponseHeader(i)}catch(t){}}var h=null;if(e.autoInstrument.networkResponseBody)try{h=a.responseText}catch(t){}var d=null;(h||r)&&(d={},h&&(d.body=h),r&&(d.headers=r)),d&&(a.__rollbar_xhr.response=d)}try{var m=a.status;m=1223===m?204:m,a.__rollbar_xhr.status_code=m,a.__rollbar_event.level=e.telemeter.levelFromStatus(m)}catch(t){}}}var a=this;return t("onload",a),t("onerror",a),t("onprogress",a),"onreadystatechange"in a&&u.isFunction(a.onreadystatechange)?n(a,"onreadystatechange",function(t){return e.rollbar.wrap(t,void 0,i)}):a.onreadystatechange=i,r.apply(this,arguments)}},this.replacements,"network")}"fetch"in this._window&&n(this._window,"fetch",function(t){return function(r,n){for(var o=new Array(arguments.length),i=0,a=o.length;i<a;i++)o[i]=arguments[i];var s,c=o[0],l="GET";u.isType(c,"string")?s=c:c&&(s=c.url,c.method&&(l=c.method)),o[1]&&o[1].method&&(l=o[1].method);var p={method:l,url:s,status_code:null,start_time_ms:u.now(),end_time_ms:null},f=null;return e.autoInstrument.networkRequestBody&&(o[1]&&o[1].body?f=o[1].body:o[0]&&!u.isType(o[0],"string")&&o[0].body&&(f=o[0].body)),e.telemeter.captureNetwork(p,"fetch",void 0,f),t.apply(this,o).then(function(t){p.end_time_ms=u.now(),p.status_code=t.status;var r=null;if(e.autoInstrument.networkResponseHeaders){var n=e.autoInstrument.networkResponseHeaders;r={};try{if(n===!0);else for(var o=0;o<n.length;o++){var i=n[o];r[i]=t.headers.get(i)}}catch(t){}}var a=null;return r&&(a={headers:r}),a&&(p.response=a),t})}},this.replacements,"network")},s.prototype.deinstrumentConsole=function(){if("console"in this._window&&this._window.console.log)for(var t;this.replacements.log.length;)t=this.replacements.log.shift(),this._window.console[t[0]]=t[1]},s.prototype.instrumentConsole=function(){function t(t){var n=r[t],o=r,i="warn"===t?"warning":t;r[t]=function(){var t=Array.prototype.slice.call(arguments),r=u.formatArgsAsString(t);e.telemeter.captureLog(r,i),n&&Function.prototype.apply.call(n,o,t)},e.replacements.log.push([t,n])}if("console"in this._window&&this._window.console.log)for(var e=this,r=this._window.console,n=["debug","info","warn","error","log"],o=0,i=n.length;o<i;o++)t(n[o])},s.prototype.deinstrumentDom=function(){("addEventListener"in this._window||"attachEvent"in this._window)&&this.removeListeners("dom")},s.prototype.instrumentDom=function(){if("addEventListener"in this._window||"attachEvent"in this._window){var t=this.handleClick.bind(this),e=this.handleBlur.bind(this);this.addListener("dom",this._window,"click","onclick",t,!0),this.addListener("dom",this._window,"blur","onfocusout",e,!0)}},s.prototype.handleClick=function(t){try{var e=l.getElementFromEvent(t,this._document),r=e&&e.tagName,n=l.isDescribedElement(e,"a")||l.isDescribedElement(e,"button");r&&(n||l.isDescribedElement(e,"input",["button","submit"]))?this.captureDomEvent("click",e):l.isDescribedElement(e,"input",["checkbox","radio"])&&this.captureDomEvent("input",e,e.value,e.checked)}catch(t){}},s.prototype.handleBlur=function(t){try{var e=l.getElementFromEvent(t,this._document);e&&e.tagName&&(l.isDescribedElement(e,"textarea")?this.captureDomEvent("input",e,e.value):l.isDescribedElement(e,"select")&&e.options&&e.options.length?this.handleSelectInputChanged(e):l.isDescribedElement(e,"input")&&!l.isDescribedElement(e,"input",["button","submit","hidden","checkbox","radio"])&&this.captureDomEvent("input",e,e.value))}catch(t){}},s.prototype.handleSelectInputChanged=function(t){if(t.multiple)for(var e=0;e<t.options.length;e++)t.options[e].selected&&this.captureDomEvent("input",t,t.options[e].value);else t.selectedIndex>=0&&t.options[t.selectedIndex]&&this.captureDomEvent("input",t,t.options[t.selectedIndex].value)},s.prototype.captureDomEvent=function(t,e,r,n){if(void 0!==r)if(this.scrubTelemetryInputs||"password"===l.getElementType(e))r="[scrubbed]";else{var o=l.describeElement(e);this.telemetryScrubber?this.telemetryScrubber(o)&&(r="[scrubbed]"):this.defaultValueScrubber(o)&&(r="[scrubbed]")}var i=l.elementArrayToString(l.treeToArray(e));this.telemeter.captureDom(t,i,r,n)},s.prototype.deinstrumentNavigation=function(){var t=this._window.chrome,e=t&&t.app&&t.app.runtime,r=!e&&this._window.history&&this._window.history.pushState;r&&o(this.replacements,"navigation")},s.prototype.instrumentNavigation=function(){var t=this._window.chrome,e=t&&t.app&&t.app.runtime,r=!e&&this._window.history&&this._window.history.pushState;if(r){var o=this;n(this._window,"onpopstate",function(t){return function(){var e=o._location.href;o.handleUrlChange(o._lastHref,e),t&&t.apply(this,arguments)}},this.replacements,"navigation"),n(this._window.history,"pushState",function(t){return function(){var e=arguments.length>2?arguments[2]:void 0;return e&&o.handleUrlChange(o._lastHref,e+""),t.apply(this,arguments)}},this.replacements,"navigation")}},s.prototype.handleUrlChange=function(t,e){var r=c.parse(this._location.href),n=c.parse(e),o=c.parse(t);this._lastHref=e,r.protocol===n.protocol&&r.host===n.host&&(e=n.path+(n.hash||"")),r.protocol===o.protocol&&r.host===o.host&&(t=o.path+(o.hash||"")),this.telemeter.captureNavigation(t,e)},s.prototype.deinstrumentConnectivity=function(){("addEventListener"in this._window||"body"in this._document)&&(this._window.addEventListener?this.removeListeners("connectivity"):o(this.replacements,"connectivity"))},s.prototype.instrumentConnectivity=function(){if("addEventListener"in this._window||"body"in this._document)if(this._window.addEventListener)this.addListener("connectivity",this._window,"online",void 0,function(){this.telemeter.captureConnectivityChange("online")}.bind(this),!0),this.addListener("connectivity",this._window,"offline",void 0,function(){this.telemeter.captureConnectivityChange("offline")}.bind(this),!0);else{var t=this;n(this._document.body,"ononline",function(e){return function(){t.telemeter.captureConnectivityChange("online"),e&&e.apply(this,arguments)}},this.replacements,"connectivity"),n(this._document.body,"onoffline",function(e){return function(){t.telemeter.captureConnectivityChange("offline"),e&&e.apply(this,arguments)}},this.replacements,"connectivity")}},s.prototype.addListener=function(t,e,r,n,o,i){e.addEventListener?(e.addEventListener(r,o,i),this.eventRemovers[t].push(function(){e.removeEventListener(r,o,i)})):n&&(e.attachEvent(n,o),this.eventRemovers[t].push(function(){e.detachEvent(n,o)}))},s.prototype.removeListeners=function(t){for(var e;this.eventRemovers[t].length;)(e=this.eventRemovers[t].shift())()},t.exports=s},function(t,e){"use strict";function r(t){return(t.getAttribute("type")||"").toLowerCase()}function n(t,e,n){if(t.tagName.toLowerCase()!==e.toLowerCase())return!1;if(!n)return!0;t=r(t);for(var o=0;o<n.length;o++)if(n[o]===t)return!0;return!1}function o(t,e){return t.target?t.target:e&&e.elementFromPoint?e.elementFromPoint(t.clientX,t.clientY):void 0}function i(t){for(var e,r=5,n=[],o=0;t&&o<r&&(e=u(t),"html"!==e.tagName);o++)n.unshift(e),t=t.parentNode;return n}function a(t){for(var e,r,n=80,o=" > ",i=o.length,a=[],u=0,c=t.length-1;c>=0;c--){if(e=s(t[c]),r=u+a.length*i+e.length,c<t.length-1&&r>=n+3){a.unshift("...");break}a.unshift(e),u+=e.length}return a.join(o)}function s(t){if(!t||!t.tagName)return"";var e=[t.tagName];t.id&&e.push("#"+t.id),t.classes&&e.push("."+t.classes.join("."));for(var r=0;r<t.attributes.length;r++)e.push("["+t.attributes[r].key+'="'+t.attributes[r].value+'"]');return e.join("")}function u(t){if(!t||!t.tagName)return null;var e,r,n,o,i={};i.tagName=t.tagName.toLowerCase(),t.id&&(i.id=t.id),e=t.className,e&&"string"==typeof e&&(i.classes=e.split(/\s+/));var a=["type","name","title","alt"];for(i.attributes=[],o=0;o<a.length;o++)r=a[o],n=t.getAttribute(r),n&&i.attributes.push({key:r,value:n});return i}t.exports={describeElement:u,descriptionToString:s,elementArrayToString:a,treeToArray:i,getElementFromEvent:o,isDescribedElement:n,getElementType:r}}])}); \ No newline at end of file
diff --git a/packages/website/public/js/rollbar.umd.nojson.min.js b/packages/website/public/js/rollbar.umd.nojson.min.js
deleted file mode 100644
index f2b05d00a..000000000
--- a/packages/website/public/js/rollbar.umd.nojson.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t=r();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,function(){return function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var t={};return r.m=e,r.c=t,r.p="",r(0)}([function(e,r,t){e.exports=t(1)},function(e,r,t){"use strict";function n(){var e="undefined"==typeof JSON?{}:JSON;o.setupJSON(e)}var o=t(2),i=t(3);n();var a=window._rollbarConfig,s=a&&a.globalAlias||"Rollbar",u=window[s]&&"undefined"!=typeof window[s].shimId;!u&&a?o.wrapper.init(a):(window.Rollbar=o.wrapper,window.RollbarNotifier=i.Notifier),e.exports=o.wrapper},function(e,r,t){"use strict";function n(e,r,t){!t[4]&&window._rollbarWrappedError&&(t[4]=window._rollbarWrappedError,window._rollbarWrappedError=null),e.uncaughtError.apply(e,t),r&&r.apply(window,t)}function o(e,r){if(r.hasOwnProperty&&r.hasOwnProperty("addEventListener")){var t=r.addEventListener;r.addEventListener=function(r,n,o){t.call(this,r,e.wrap(n),o)};var n=r.removeEventListener;r.removeEventListener=function(e,r,t){n.call(this,e,r&&r._wrapped||r,t)}}}var i=t(3),a=t(8),s=i.Notifier;window._rollbarWrappedError=null;var u={};u.init=function(e,r){var t=new s(r);if(t.configure(e),e.captureUncaught){var i;r&&a.isType(r._rollbarOldOnError,"function")?i=r._rollbarOldOnError:window.onerror&&!window.onerror.belongsToShim&&(i=window.onerror),window.onerror=function(){var e=Array.prototype.slice.call(arguments,0);n(t,i,e)};var u,c,l=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"];for(u=0;u<l.length;++u)c=l[u],window[c]&&window[c].prototype&&o(t,window[c].prototype)}return e.captureUnhandledRejections&&(r&&a.isType(r._unhandledRejectionHandler,"function")&&window.removeEventListener("unhandledrejection",r._unhandledRejectionHandler),t._unhandledRejectionHandler=function(e){var r=e.reason,n=e.promise,o=e.detail;!r&&o&&(r=o.reason,n=o.promise),t.unhandledRejection(r,n)},window.addEventListener("unhandledrejection",t._unhandledRejectionHandler)),window.Rollbar=t,s.processPayloads(),t},e.exports={wrapper:u,setupJSON:i.setupJSON}},function(e,r,t){"use strict";function n(e){E=e,w.setupJSON(e),v.setupJSON(e)}function o(e,r){return function(){var t=r||this;try{return e.apply(t,arguments)}catch(e){v.consoleError("[Rollbar]:",e)}}}function i(){h||(h=setTimeout(f,1e3))}function a(){return _}function s(e){_=_||this;var r="https://"+s.DEFAULT_ENDPOINT;this.options={enabled:!0,endpoint:r,environment:"production",scrubFields:g([],s.DEFAULT_SCRUB_FIELDS),checkIgnore:null,logLevel:s.DEFAULT_LOG_LEVEL,reportLevel:s.DEFAULT_REPORT_LEVEL,uncaughtErrorLevel:s.DEFAULT_UNCAUGHT_ERROR_LEVEL,payload:{}},this.lastError=null,this.plugins={},this.parentNotifier=e,e&&(e.hasOwnProperty("shimId")?e.notifier=this:this.configure(e.options))}function u(e){window._rollbarPayloadQueue.push(e),i()}function c(e){return o(function(){var r=this._getLogArgs(arguments);return this._log(e||r.level||this.options.logLevel||s.DEFAULT_LOG_LEVEL,r.message,r.err,r.custom,r.callback)})}function l(e,r){e||(e=r?E.stringify(r):"");var t={body:e};return r&&(t.extra=g(!0,{},r)),{message:t}}function p(e,r,t){var n=m.guessErrorClass(r.message),o=r.name||n[0],i=n[1],a={exception:{class:o,message:i}};if(e&&(a.exception.description=e||"uncaught exception"),r.stack){var s,u,c,p,f,d,h,w;for(a.frames=[],h=0;h<r.stack.length;++h)s=r.stack[h],u={filename:s.url?v.sanitizeUrl(s.url):"(unknown)",lineno:s.line||null,method:s.func&&"?"!==s.func?s.func:"[anonymous]",colno:s.column},c=p=f=null,d=s.context?s.context.length:0,d&&(w=Math.floor(d/2),p=s.context.slice(0,w),c=s.context[w],f=s.context.slice(w)),c&&(u.code=c),(p||f)&&(u.context={},p&&p.length&&(u.context.pre=p),f&&f.length&&(u.context.post=f)),s.args&&(u.args=s.args),a.frames.push(u);return a.frames.reverse(),t&&(a.extra=g(!0,{},t)),{trace:a}}return l(o+": "+i,t)}function f(){var e;try{for(;e=window._rollbarPayloadQueue.shift();)d(e)}finally{h=void 0}}function d(e){var r=e.endpointUrl,t=e.accessToken,n=e.payload,o=e.callback||function(){},i=(new Date).getTime();i-L>=6e4&&(L=i,R=0);var a=window._globalRollbarOptions.maxItems,c=window._globalRollbarOptions.itemsPerMinute,l=function(){return!n.ignoreRateLimit&&a>=1&&T>=a},p=function(){return!n.ignoreRateLimit&&c>=1&&R>=c};return l()?void o(new Error(a+" max items reached")):p()?void o(new Error(c+" items per minute reached")):(T++,R++,l()&&_._log(_.options.uncaughtErrorLevel,"maxItems has been hit. Ignoring errors for the remainder of the current page load.",null,{maxItems:a},null,!1,!0),n.ignoreRateLimit&&delete n.ignoreRateLimit,void y.post(r,t,n,function(r,t){return r?(r instanceof b&&(e.callback=function(){},setTimeout(function(){u(e)},s.RETRY_DELAY)),o(r)):o(null,t)}))}var h,g=t(4),m=t(5),v=t(8),w=t(11),y=w.XHR,b=w.ConnectionError,E=null;s.NOTIFIER_VERSION="1.9.4",s.DEFAULT_ENDPOINT="api.rollbar.com/api/1/",s.DEFAULT_SCRUB_FIELDS=["pw","pass","passwd","password","secret","confirm_password","confirmPassword","password_confirmation","passwordConfirmation","access_token","accessToken","secret_key","secretKey","secretToken"],s.DEFAULT_LOG_LEVEL="debug",s.DEFAULT_REPORT_LEVEL="debug",s.DEFAULT_UNCAUGHT_ERROR_LEVEL="error",s.DEFAULT_ITEMS_PER_MIN=60,s.DEFAULT_MAX_ITEMS=0,s.LEVELS={debug:0,info:1,warning:2,error:3,critical:4},s.RETRY_DELAY=1e4,window._rollbarPayloadQueue=window._rollbarPayloadQueue||[],window._globalRollbarOptions={startTime:(new Date).getTime(),maxItems:s.DEFAULT_MAX_ITEMS,itemsPerMinute:s.DEFAULT_ITEMS_PER_MIN};var _,x=s.prototype;x._getLogArgs=function(e){for(var r,t,n,i,a,u,c=this.options.logLevel||s.DEFAULT_LOG_LEVEL,l=[],p=0;p<e.length;++p)u=e[p],a=v.typeName(u),"string"===a?r?l.push(u):r=u:"function"===a?i=o(u,this):"date"===a?l.push(u):"error"===a||u instanceof Error||"undefined"!=typeof DOMException&&u instanceof DOMException?t?l.push(u):t=u:"object"!==a&&"array"!==a||(n?l.push(u):n=u);return l.length&&(n=n||{},n.extraArgs=l),{level:c,message:r,err:t,custom:n,callback:i}},x._route=function(e){var r=this.options.endpoint,t=/\/$/.test(r),n=/^\//.test(e);return t&&n?e=e.substring(1):t||n||(e="/"+e),r+e},x._processShimQueue=function(e){for(var r,t,n,o,i,a,u,c={};t=e.shift();)r=t.shim,n=t.method,o=t.args,i=r.parentShim,u=c[r.shimId],u||(i?(a=c[i.shimId],u=new s(a)):u=this,c[r.shimId]=u),u[n]&&v.isType(u[n],"function")&&u[n].apply(u,o)},x._buildPayload=function(e,r,t,n,o){var i=this.options.accessToken,a=this.options.environment,u=g(!0,{},this.options.payload),c=v.uuid4();if(void 0===s.LEVELS[r])throw new Error("Invalid level");if(!t&&!n&&!o)throw new Error("No message, stack info or custom data");var l={environment:a,endpoint:this.options.endpoint,uuid:c,level:r,platform:"browser",framework:"browser-js",language:"javascript",body:this._buildBody(t,n,o),request:{url:window.location.href,query_string:window.location.search,user_ip:"$remote_ip"},client:{runtime_ms:e.getTime()-window._globalRollbarOptions.startTime,timestamp:Math.round(e.getTime()/1e3),javascript:{browser:window.navigator.userAgent,language:window.navigator.language,cookie_enabled:window.navigator.cookieEnabled,screen:{width:window.screen.width,height:window.screen.height},plugins:this._getBrowserPlugins()}},server:{},notifier:{name:"rollbar-browser-js",version:s.NOTIFIER_VERSION}};u.body&&delete u.body;var p={access_token:i,data:g(!0,l,u)};return this._scrub(p.data),p},x._buildBody=function(e,r,t){var n;return n=r?p(e,r,t):l(e,t)},x._getBrowserPlugins=function(){if(!this._browserPlugins){var e,r,t=window.navigator.plugins||[],n=t.length,o=[];for(r=0;r<n;++r)e=t[r],o.push({name:e.name,description:e.description});this._browserPlugins=o}return this._browserPlugins},x._scrub=function(e){function r(e,r,t,n,o,i){return r+v.redact(i)}function t(e){var t;if(v.isType(e,"string"))for(t=0;t<s.length;++t)e=e.replace(s[t],r);return e}function n(e,r){var t;for(t=0;t<a.length;++t)if(a[t].test(e)){r=v.redact(r);break}return r}function o(e,r){var o=n(e,r);return o===r?t(o):o}var i=this.options.scrubFields,a=this._getScrubFieldRegexs(i),s=this._getScrubQueryParamRegexs(i);return v.traverse(e,o),e},x._getScrubFieldRegexs=function(e){for(var r,t=[],n=0;n<e.length;++n)r="\\[?(%5[bB])?"+e[n]+"\\[?(%5[bB])?\\]?(%5[dD])?",t.push(new RegExp(r,"i"));return t},x._getScrubQueryParamRegexs=function(e){for(var r,t=[],n=0;n<e.length;++n)r="\\[?(%5[bB])?"+e[n]+"\\[?(%5[bB])?\\]?(%5[dD])?",t.push(new RegExp("("+r+"=)([^&\\n]+)","igm"));return t},x._urlIsWhitelisted=function(e){var r,t,n,o,i,a,s,u,c,l;try{if(r=this.options.hostWhiteList,t=e&&e.data&&e.data.body&&e.data.body.trace,!r||0===r.length)return!0;if(!t)return!0;for(s=r.length,i=t.frames.length,c=0;c<i;c++){if(n=t.frames[c],o=n.filename,!v.isType(o,"string"))return!0;for(l=0;l<s;l++)if(a=r[l],u=new RegExp(a),u.test(o))return!0}}catch(e){return this.configure({hostWhiteList:null}),v.consoleError("[Rollbar]: Error while reading your configuration's hostWhiteList option. Removing custom hostWhiteList.",e),!0}return!1},x._messageIsIgnored=function(e){var r,t,n,o,i,a,s,u,c;try{if(i=!1,n=this.options.ignoredMessages,!n||0===n.length)return!1;if(s=e&&e.data&&e.data.body,u=s&&s.trace&&s.trace.exception&&s.trace.exception.message,c=s&&s.message&&s.message.body,r=u||c,!r)return!1;for(o=n.length,t=0;t<o&&(a=new RegExp(n[t],"gi"),!(i=a.test(r)));t++);}catch(e){this.configure({ignoredMessages:null}),v.consoleError("[Rollbar]: Error while reading your configuration's ignoredMessages option. Removing custom ignoredMessages.")}return i},x._enqueuePayload=function(e,r,t,n){var o={callback:n,accessToken:this.options.accessToken,endpointUrl:this._route("item/"),payload:e},i=function(){if(n){var e="This item was not sent to Rollbar because it was ignored. This can happen if a custom checkIgnore() function was used or if the item's level was less than the notifier' reportLevel. See https://rollbar.com/docs/notifier/rollbar.js/configuration for more details.";n(null,{err:0,result:{id:null,uuid:null,message:e}})}};if(this._internalCheckIgnore(r,t,e))return void i();try{if(v.isType(this.options.checkIgnore,"function")&&this.options.checkIgnore(r,t,e))return void i()}catch(e){this.configure({checkIgnore:null}),v.consoleError("[Rollbar]: Error while calling custom checkIgnore() function. Removing custom checkIgnore().",e)}if(this._urlIsWhitelisted(e)&&!this._messageIsIgnored(e)){if(this.options.verbose){if(e.data&&e.data.body&&e.data.body.trace){var a=e.data.body.trace,s=a.exception.message;v.consoleError("[Rollbar]: ",s)}v.consoleInfo("[Rollbar]: ",o)}v.isType(this.options.logFunction,"function")&&this.options.logFunction(o);try{v.isType(this.options.transform,"function")&&this.options.transform(e)}catch(e){this.configure({transform:null}),v.consoleError("[Rollbar]: Error while calling custom transform() function. Removing custom transform().",e)}this.options.enabled&&u(o)}},x._internalCheckIgnore=function(e,r,t){var n=r[0],o=s.LEVELS[n]||0,i=s.LEVELS[this.options.reportLevel]||0;if(o<i)return!0;var a=this.options?this.options.plugins:{};if(a&&a.jquery&&a.jquery.ignoreAjaxErrors)try{return!!t.data.body.message.extra.isAjax}catch(e){return!1}return!1},x._log=function(e,r,t,n,o,i,a){var s=null;if(t)try{if(s=t._savedStackTrace?t._savedStackTrace:m.parse(t),t===this.lastError)return;this.lastError=t}catch(e){v.consoleError("[Rollbar]: Error while parsing the error object.",e),r=t.message||t.description||r||String(t),t=null}var u=this._buildPayload(new Date,e,r,s,n);return a&&(u.ignoreRateLimit=!0),this._enqueuePayload(u,!!i,[e,r,t,n],o),{uuid:u.data.uuid}},x.log=c(),x.debug=c("debug"),x.info=c("info"),x.warn=c("warning"),x.warning=c("warning"),x.error=c("error"),x.critical=c("critical"),x.uncaughtError=o(function(e,r,t,n,o,i){if(i=i||null,o&&v.isType(o,"error"))return void this._log(this.options.uncaughtErrorLevel,e,o,i,null,!0);if(r&&v.isType(r,"error"))return void this._log(this.options.uncaughtErrorLevel,e,r,i,null,!0);var a={url:r||"",line:t};a.func=m.guessFunctionName(a.url,a.line),a.context=m.gatherContext(a.url,a.line);var s={mode:"onerror",message:o?String(o):e||"uncaught exception",url:document.location.href,stack:[a],useragent:navigator.userAgent},u=this._buildPayload(new Date,this.options.uncaughtErrorLevel,e,s,i);this._enqueuePayload(u,!0,[this.options.uncaughtErrorLevel,e,r,t,n,o])}),x.unhandledRejection=o(function(e,r){var t,n;if(e?(t=e.message||String(e),n=e._rollbarContext):t="unhandled rejection was null or undefined!",n=n||r._rollbarContext||null,e&&v.isType(e,"error"))return void this._log(this.options.uncaughtErrorLevel,t,e,n,null,!0);var o={url:"",line:0};o.func=m.guessFunctionName(o.url,o.line),o.context=m.gatherContext(o.url,o.line);var i={mode:"unhandledrejection",message:t,url:document.location.href,stack:[o],useragent:navigator.userAgent},a=this._buildPayload(new Date,this.options.uncaughtErrorLevel,t,i,n);this._enqueuePayload(a,!0,[this.options.uncaughtErrorLevel,t,o.url,o.line,0,e,r])}),x.global=o(function(e){e=e||{};var r={startTime:e.startTime,maxItems:e.maxItems,itemsPerMinute:e.itemsPerMinute};g(!0,window._globalRollbarOptions,r),void 0!==e.maxItems&&(T=0),void 0!==e.itemsPerMinute&&(R=0)}),x.configure=o(function(e,r){var t=g(!0,{},e);g(!r,this.options,t),this.global(t)}),x.scope=o(function(e){var r=new s(this);return g(!0,r.options.payload,e),r}),x.wrap=function(e,r){try{var t;if(t=v.isType(r,"function")?r:function(){return r||{}},!v.isType(e,"function"))return e;if(e._isWrap)return e;if(!e._wrapped){e._wrapped=function(){try{return e.apply(this,arguments)}catch(r){throw"string"==typeof r&&(r=new String(r)),r.stack||(r._savedStackTrace=m.parse(r)),r._rollbarContext=t()||{},r._rollbarContext._wrappedSource=e.toString(),window._rollbarWrappedError=r,r}},e._wrapped._isWrap=!0;for(var n in e)e.hasOwnProperty(n)&&(e._wrapped[n]=e[n])}return e._wrapped}catch(r){return e}},x.loadFull=function(){v.consoleError("[Rollbar]: Unexpected Rollbar.loadFull() called on a Notifier instance")},s.processPayloads=function(e){return e?void f():void i()};var L=(new Date).getTime(),T=0,R=0;e.exports={Notifier:s,setupJSON:n,topLevelNotifier:a}},function(e,r){"use strict";var t=Object.prototype.hasOwnProperty,n=Object.prototype.toString,o=function(e){return"function"==typeof Array.isArray?Array.isArray(e):"[object Array]"===n.call(e)},i=function(e){if(!e||"[object Object]"!==n.call(e))return!1;var r=t.call(e,"constructor"),o=e.constructor&&e.constructor.prototype&&t.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!r&&!o)return!1;var i;for(i in e);return"undefined"==typeof i||t.call(e,i)};e.exports=function e(){var r,t,n,a,s,u,c=arguments[0],l=1,p=arguments.length,f=!1;for("boolean"==typeof c?(f=c,c=arguments[1]||{},l=2):("object"!=typeof c&&"function"!=typeof c||null==c)&&(c={});l<p;++l)if(r=arguments[l],null!=r)for(t in r)n=c[t],a=r[t],c!==a&&(f&&a&&(i(a)||(s=o(a)))?(s?(s=!1,u=n&&o(n)?n:[]):u=n&&i(n)?n:{},c[t]=e(f,u,a)):"undefined"!=typeof a&&(c[t]=a));return c}},function(e,r,t){"use strict";function n(){return l}function o(){return null}function i(e){var r={};return r._stackFrame=e,r.url=e.fileName,r.line=e.lineNumber,r.func=e.functionName,r.column=e.columnNumber,r.args=e.args,r.context=o(r.url,r.line),r}function a(e){function r(){var r=[];try{r=c.parse(e)}catch(e){r=[]}for(var t=[],n=0;n<r.length;n++)t.push(new i(r[n]));return t}return{stack:r(),message:e.message,name:e.name}}function s(e){return new a(e)}function u(e){if(!e)return["Unknown error. There was no error message to display.",""];var r=e.match(p),t="(unknown)";return r&&(t=r[r.length-1],e=e.replace((r[r.length-2]||"")+t+":",""),e=e.replace(/(^[\s]+|[\s]+$)/g,"")),[t,e]}var c=t(6),l="?",p=new RegExp("^(([a-zA-Z0-9-_$ ]*): *)?(Uncaught )?([a-zA-Z0-9-_$ ]*): ");e.exports={guessFunctionName:n,guessErrorClass:u,gatherContext:o,parse:s,Stack:a,Frame:i}},function(e,r,t){var n,o,i;!function(a,s){"use strict";o=[t(7)],n=s,i="function"==typeof n?n.apply(r,o):n,!(void 0!==i&&(e.exports=i))}(this,function(e){"use strict";function r(e,r,t){if("function"==typeof Array.prototype.map)return e.map(r,t);for(var n=new Array(e.length),o=0;o<e.length;o++)n[o]=r.call(t,e[o]);return n}function t(e,r,t){if("function"==typeof Array.prototype.filter)return e.filter(r,t);for(var n=[],o=0;o<e.length;o++)r.call(t,e[o])&&n.push(e[o]);return n}var n=/(^|@)\S+\:\d+/,o=/^\s*at .*(\S+\:\d+|\(native\))/m,i=/^(eval@)?(\[native code\])?$/;return{parse:function(e){if("undefined"!=typeof e.stacktrace||"undefined"!=typeof e["opera#sourceloc"])return this.parseOpera(e);if(e.stack&&e.stack.match(o))return this.parseV8OrIE(e);if(e.stack)return this.parseFFOrSafari(e);throw new Error("Cannot parse given Error object")},extractLocation:function(e){if(e.indexOf(":")===-1)return[e];var r=e.replace(/[\(\)\s]/g,"").split(":"),t=r.pop(),n=r[r.length-1];if(!isNaN(parseFloat(n))&&isFinite(n)){var o=r.pop();return[r.join(":"),o,t]}return[r.join(":"),t,void 0]},parseV8OrIE:function(n){var i=t(n.stack.split("\n"),function(e){return!!e.match(o)},this);return r(i,function(r){r.indexOf("(eval ")>-1&&(r=r.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var t=r.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),n=this.extractLocation(t.pop()),o=t.join(" ")||void 0,i="eval"===n[0]?void 0:n[0];return new e(o,void 0,i,n[1],n[2],r)},this)},parseFFOrSafari:function(n){var o=t(n.stack.split("\n"),function(e){return!e.match(i)},this);return r(o,function(r){if(r.indexOf(" > eval")>-1&&(r=r.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),r.indexOf("@")===-1&&r.indexOf(":")===-1)return new e(r);var t=r.split("@"),n=this.extractLocation(t.pop()),o=t.shift()||void 0;return new e(o,void 0,n[0],n[1],n[2],r)},this)},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(r){for(var t=/Line (\d+).*script (?:in )?(\S+)/i,n=r.message.split("\n"),o=[],i=2,a=n.length;i<a;i+=2){var s=t.exec(n[i]);s&&o.push(new e(void 0,void 0,s[2],s[1],void 0,n[i]))}return o},parseOpera10:function(r){for(var t=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,n=r.stacktrace.split("\n"),o=[],i=0,a=n.length;i<a;i+=2){var s=t.exec(n[i]);s&&o.push(new e(s[3]||void 0,void 0,s[2],s[1],void 0,n[i]))}return o},parseOpera11:function(o){var i=t(o.stack.split("\n"),function(e){return!!e.match(n)&&!e.match(/^Error created at/)},this);return r(i,function(r){var t,n=r.split("@"),o=this.extractLocation(n.pop()),i=n.shift()||"",a=i.replace(/<anonymous function(: (\w+))?>/,"$2").replace(/\([^\)]*\)/g,"")||void 0;i.match(/\(([^\)]*)\)/)&&(t=i.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===t||"[arguments not available]"===t?void 0:t.split(",");return new e(a,s,o[0],o[1],o[2],r)},this)}}})},function(e,r,t){var n,o,i;!function(t,a){"use strict";o=[],n=a,i="function"==typeof n?n.apply(r,o):n,!(void 0!==i&&(e.exports=i))}(this,function(){"use strict";function e(e){return!isNaN(parseFloat(e))&&isFinite(e)}function r(e,r,t,n,o,i){void 0!==e&&this.setFunctionName(e),void 0!==r&&this.setArgs(r),void 0!==t&&this.setFileName(t),void 0!==n&&this.setLineNumber(n),void 0!==o&&this.setColumnNumber(o),void 0!==i&&this.setSource(i)}return r.prototype={getFunctionName:function(){return this.functionName},setFunctionName:function(e){this.functionName=String(e)},getArgs:function(){return this.args},setArgs:function(e){if("[object Array]"!==Object.prototype.toString.call(e))throw new TypeError("Args must be an Array");this.args=e},getFileName:function(){return this.fileName},setFileName:function(e){this.fileName=String(e)},getLineNumber:function(){return this.lineNumber},setLineNumber:function(r){if(!e(r))throw new TypeError("Line Number must be a Number");this.lineNumber=Number(r)},getColumnNumber:function(){return this.columnNumber},setColumnNumber:function(r){if(!e(r))throw new TypeError("Column Number must be a Number");this.columnNumber=Number(r)},getSource:function(){return this.source},setSource:function(e){this.source=String(e)},toString:function(){var r=this.getFunctionName()||"{anonymous}",t="("+(this.getArgs()||[]).join(",")+")",n=this.getFileName()?"@"+this.getFileName():"",o=e(this.getLineNumber())?":"+this.getLineNumber():"",i=e(this.getColumnNumber())?":"+this.getColumnNumber():"";return r+t+n+o+i}},r})},function(e,r,t){"use strict";function n(e){v=e}function o(e){return{}.toString.call(e).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function i(e,r){return o(e)===r}function a(e){if(!i(e,"string"))throw new Error("received invalid input");for(var r=w,t=r.parser[r.strictMode?"strict":"loose"].exec(e),n={},o=14;o--;)n[r.key[o]]=t[o]||"";return n[r.q.name]={},n[r.key[12]].replace(r.q.parser,function(e,t,o){t&&(n[r.q.name][t]=o)}),n}function s(e){var r=a(e);return""===r.anchor&&(r.source=r.source.replace("#","")),e=r.source.replace("?"+r.query,"")}function u(e,r){var t,n,o,a=i(e,"object"),s=i(e,"array"),c=[];if(a)for(t in e)e.hasOwnProperty(t)&&c.push(t);else if(s)for(o=0;o<e.length;++o)c.push(o);for(o=0;o<c.length;++o)t=c[o],n=e[t],a=i(n,"object"),s=i(n,"array"),a||s?e[t]=u(n,r):e[t]=r(t,n);return e}function c(e){return e=String(e),new Array(e.length+1).join("*")}function l(){var e=(new Date).getTime(),r="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(r){var t=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===r?t:7&t|8).toString(16)});return r}function p(e){return"function"!=typeof Object.create?function(e){var r=function(){};return function(e){if(null!==e&&e!==Object(e))throw TypeError("Argument must be an object, or null");r.prototype=e||{};var t=new r;return r.prototype=null,null===e&&(t.__proto__=null),t}}()(e):Object.create(e)}function f(){for(var e=[],r=0;r<arguments.length;r++){var t=arguments[r];"object"==typeof t?(t=v.stringify(t),t.length>500&&(t=t.substr(0,500)+"...")):"undefined"==typeof t&&(t="undefined"),e.push(t)}return e.join(" ")}function d(){m.ieVersion()<=8?console.error(f.apply(null,arguments)):console.error.apply(null,arguments)}function h(){m.ieVersion()<=8?console.info(f.apply(null,arguments)):console.info.apply(null,arguments)}function g(){m.ieVersion()<=8?console.log(f.apply(null,arguments)):console.log.apply(null,arguments)}t(9);var m=t(10),v=null,w={strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},y={setupJSON:n,isType:i,parseUri:a,parseUriOptions:w,redact:c,sanitizeUrl:s,traverse:u,typeName:o,uuid4:l,objectCreate:p,consoleError:d,consoleInfo:h,consoleLog:g};e.exports=y},function(e,r){!function(e){"use strict";e.console||(e.console={});for(var r,t,n=e.console,o=function(){},i=["memory"],a="assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(",");r=i.pop();)n[r]||(n[r]={});for(;t=a.pop();)n[t]||(n[t]=o)}("undefined"==typeof window?this:window)},function(e,r){"use strict";function t(){for(var e,r=3,t=document.createElement("div"),n=t.getElementsByTagName("i");t.innerHTML="<!--[if gt IE "+ ++r+"]><i></i><![endif]-->",n[0];);return r>4?r:e}var n={ieVersion:t};e.exports=n},function(e,r,t){"use strict";function n(e){a=e}function o(e){this.name="Connection Error",this.message=e,this.stack=(new Error).stack}var i=t(8),a=null;o.prototype=i.objectCreate(Error.prototype),o.prototype.constructor=o;var s={XMLHttpFactories:[function(){return new XMLHttpRequest},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],createXMLHTTPObject:function(){var e,r=!1,t=s.XMLHttpFactories,n=t.length;for(e=0;e<n;e++)try{r=t[e]();break}catch(e){}return r},post:function(e,r,t,n){if(!i.isType(t,"object"))throw new Error("Expected an object to POST");t=a.stringify(t),n=n||function(){};var u=s.createXMLHTTPObject();if(u)try{try{var c=function(){try{if(c&&4===u.readyState){c=void 0;var e=a.parse(u.responseText);200===u.status?n(null,e):i.isType(u.status,"number")&&u.status>=400&&u.status<600?(403==u.status&&i.consoleError("[Rollbar]:"+e.message),n(new Error(String(u.status)))):n(new o("XHR response had no status code (likely connection failure)"))}}catch(e){var r;r=e&&e.stack?e:new Error(e),n(r)}};u.open("POST",e,!0),u.setRequestHeader&&(u.setRequestHeader("Content-Type","application/json"),u.setRequestHeader("X-Rollbar-Access-Token",r)),u.onreadystatechange=c,u.send(t)}catch(r){if("undefined"!=typeof XDomainRequest){"http:"===window.location.href.substring(0,5)&&"https"===e.substring(0,5)&&(e="http"+e.substring(5));var l=function(){n(new o("Request timed out"))},p=function(){n(new Error("Error during request"))},f=function(){n(null,a.parse(u.responseText))};u=new XDomainRequest,u.onprogress=function(){},u.ontimeout=l,u.onerror=p,u.onload=f,u.open("POST",e,!0),u.send(t)}}}catch(e){n(e)}}};e.exports={XHR:s,setupJSON:n,ConnectionError:o}}])});
diff --git a/packages/website/translations/chinese.json b/packages/website/translations/chinese.json
index f610bf56c..3e9f21370 100644
--- a/packages/website/translations/chinese.json
+++ b/packages/website/translations/chinese.json
@@ -56,9 +56,10 @@
"ABOUT": "关于我们",
"CAREERS": "人才招聘",
"CONTACT": "联系方式",
- "DEPLOYER": "Deployer",
+ "SOL_COMPILER": "Solidity Compiler",
"JSON_SCHEMAS": "JSON Schemas",
"SOL_COV": "Solidity Coverage",
+ "ETHEREUM_TYPES": "Ethereum Types",
"SUBPROVIDERS": "Subproviders",
"BLOG": "博客",
"FORUM": "论坛",
@@ -66,6 +67,7 @@
"WHITEPAPER": "白皮书",
"WIKI": "维基",
"WEB3_WRAPPER": "Web3Wrapper",
+ "ORDER_UTILS": "Order Utils",
"FAQ": "FAQ",
"SMART_CONTRACTS": "0x 智能合约",
"STANDARD_RELAYER_API": "中继方标准API",
diff --git a/packages/website/translations/english.json b/packages/website/translations/english.json
index 122d445cb..d94dbb29e 100644
--- a/packages/website/translations/english.json
+++ b/packages/website/translations/english.json
@@ -57,9 +57,10 @@
"ABOUT": "about",
"CAREERS": "careers",
"CONTACT": "contact",
- "DEPLOYER": "Deployer",
+ "SOL_COMPILER": "Solidity Compiler",
"JSON_SCHEMAS": "JSON Schemas",
"SOL_COV": "Solidity Coverage",
+ "ETHEREUM_TYPES": "Ethereum Types",
"SUBPROVIDERS": "Subproviders",
"BLOG": "blog",
"FORUM": "forum",
@@ -67,6 +68,7 @@
"WHITEPAPER": "whitepaper",
"WIKI": "wiki",
"WEB3_WRAPPER": "Web3Wrapper",
+ "ORDER_UTILS": "Order Utils",
"FAQ": "FAQ",
"SMART_CONTRACTS": "0x smart contracts",
"STANDARD_RELAYER_API": "standard relayer API",
@@ -74,5 +76,6 @@
"WEBSITE": "website",
"DEVELOPERS": "developers",
"HOME": "home",
- "ROCKETCHAT": "rocket.chat"
+ "ROCKETCHAT": "rocket.chat",
+ "TRADE_CALL_TO_ACTION": "trade on 0x"
}
diff --git a/packages/website/translations/korean.json b/packages/website/translations/korean.json
index dd5f19b16..c38de6677 100644
--- a/packages/website/translations/korean.json
+++ b/packages/website/translations/korean.json
@@ -56,9 +56,10 @@
"ABOUT": "기업 정보",
"CAREERS": "채용",
"CONTACT": "문의",
- "DEPLOYER": "Deployer",
+ "SOL_COMPILER": "Solidity Compiler",
"JSON_SCHEMAS": "JSON Schemas",
"SOL_COV": "Solidity Coverage",
+ "ETHEREUM_TYPES": "Ethereum Types",
"SUBPROVIDERS": "Subproviders",
"BLOG": "블로그",
"FORUM": "포럼",
@@ -66,6 +67,7 @@
"WHITEPAPER": "백서",
"WIKI": "위키",
"WEB3_WRAPPER": "Web3Wrapper",
+ "ORDER_UTILS": "Order Utils",
"FAQ": "FAQ",
"SMART_CONTRACTS": "0x 스마트 계약",
"STANDARD_RELAYER_API": "Standard Relayer API",
diff --git a/packages/website/translations/russian.json b/packages/website/translations/russian.json
index 5a8e2c539..a7e06d646 100644
--- a/packages/website/translations/russian.json
+++ b/packages/website/translations/russian.json
@@ -56,9 +56,10 @@
"ABOUT": "Kоманда",
"CAREERS": "Карьера",
"CONTACT": "Связаться с нами",
- "DEPLOYER": "Deployer",
+ "SOL_COMPILER": "Solidity Compiler",
"JSON_SCHEMAS": "JSON Schemas",
"SOL_COV": "Solidity Coverage",
+ "ETHEREUM_TYPES": "Ethereum Types",
"SUBPROVIDERS": "Subproviders",
"BLOG": "Блог",
"FORUM": "Форум",
@@ -66,6 +67,7 @@
"WHITEPAPER": "Whitepaper",
"WIKI": "Вики",
"WEB3_WRAPPER": "Web3Wrapper",
+ "ORDER_UTILS": "Order Utils",
"FAQ": "Документация",
"SMART_CONTRACTS": "0x Смарт-контракты ",
"STANDARD_RELAYER_API": "standard relayer API",
diff --git a/packages/website/translations/spanish.json b/packages/website/translations/spanish.json
index dd34e805c..5a8920f61 100644
--- a/packages/website/translations/spanish.json
+++ b/packages/website/translations/spanish.json
@@ -57,9 +57,10 @@
"ABOUT": "equipo",
"CAREERS": "empleo",
"CONTACT": "contacto",
- "DEPLOYER": "Deployer",
+ "SOL_COMPILER": "Solidity Compiler",
"JSON_SCHEMAS": "JSON Schemas",
"SOL_COV": "Solidity Coverage",
+ "ETHEREUM_TYPES": "Ethereum Types",
"SUBPROVIDERS": "Subproviders",
"BLOG": "blog",
"FORUM": "foro",
@@ -67,6 +68,7 @@
"WHITEPAPER": "documento técnico",
"WIKI": "wiki",
"WEB3_WRAPPER": "Web3Wrapper",
+ "ORDER_UTILS": "Order Utils",
"FAQ": "preguntas frecuentes",
"SMART_CONTRACTS": "0x contratos inteligentes",
"STANDARD_RELAYER_API": "API de transmisión estándar",
diff --git a/packages/0x.js/src/artifacts/Exchange.json b/packages/website/ts/artifacts/Exchange.json
index af8db7360..af8db7360 100644
--- a/packages/0x.js/src/artifacts/Exchange.json
+++ b/packages/website/ts/artifacts/Exchange.json
diff --git a/packages/website/ts/blockchain.ts b/packages/website/ts/blockchain.ts
index 72cb94c02..45994be5f 100644
--- a/packages/website/ts/blockchain.ts
+++ b/packages/website/ts/blockchain.ts
@@ -1,35 +1,41 @@
import {
- BlockParam,
BlockRange,
+ ContractWrappers,
DecodedLogEvent,
- ECSignature,
ExchangeContractEventArgs,
ExchangeEvents,
IndexedFilterValues,
LogCancelContractEventArgs,
LogFillContractEventArgs,
- LogWithDecodedArgs,
- Order,
- SignedOrder,
Token as ZeroExToken,
- TransactionReceiptWithDecodedLogs,
- ZeroEx,
-} from '0x.js';
+} from '@0xproject/contract-wrappers';
+import { isValidOrderHash, signOrderHashAsync } from '@0xproject/order-utils';
import { EtherscanLinkSuffixes, utils as sharedUtils } from '@0xproject/react-shared';
import {
- InjectedWeb3Subprovider,
ledgerEthereumBrowserClientFactoryAsync,
LedgerSubprovider,
- LedgerWalletSubprovider,
- RedundantRPCSubprovider,
+ RedundantSubprovider,
+ RPCSubprovider,
+ SignerSubprovider,
+ Web3ProviderEngine,
} from '@0xproject/subproviders';
+import {
+ BlockParam,
+ ECSignature,
+ LogWithDecodedArgs,
+ Order,
+ Provider,
+ SignedOrder,
+ TransactionReceiptWithDecodedLogs,
+} from '@0xproject/types';
import { BigNumber, intervalUtils, logUtils, promisify } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
+import * as moment from 'moment';
import * as React from 'react';
import contract = require('truffle-contract');
import { BlockchainWatcher } from 'ts/blockchain_watcher';
-import { TokenSendCompleted } from 'ts/components/flash_messages/token_send_completed';
+import { AssetSendCompleted } from 'ts/components/flash_messages/asset_send_completed';
import { TransactionSubmitted } from 'ts/components/flash_messages/transaction_submitted';
import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
import { tradeHistoryStorage } from 'ts/local_storage/trade_history_storage';
@@ -38,6 +44,10 @@ import {
BlockchainCallErrs,
BlockchainErrs,
ContractInstance,
+ Fill,
+ InjectedProviderObservable,
+ InjectedProviderUpdate,
+ InjectedWeb3,
Order as PortalOrder,
Providers,
ProviderType,
@@ -46,16 +56,18 @@ import {
Token,
TokenByAddress,
} from 'ts/types';
+import { backendClient } from 'ts/utils/backend_client';
import { configs } from 'ts/utils/configs';
import { constants } from 'ts/utils/constants';
import { errorReporter } from 'ts/utils/error_reporter';
import { utils } from 'ts/utils/utils';
-import Web3 = require('web3');
-import ProviderEngine = require('web3-provider-engine');
import FilterSubprovider = require('web3-provider-engine/subproviders/filters');
import * as MintableArtifacts from '../contracts/Mintable.json';
+// HACK: remove this hard-coded abi and use @0xproject/contract-wrappers
+import * as Exchange from './artifacts/Exchange.json';
+
const BLOCK_NUMBER_BACK_TRACK = 50;
const GWEI_IN_WEI = 1000000000;
@@ -63,21 +75,24 @@ const providerToName: { [provider: string]: string } = {
[Providers.Metamask]: constants.PROVIDER_NAME_METAMASK,
[Providers.Parity]: constants.PROVIDER_NAME_PARITY_SIGNER,
[Providers.Mist]: constants.PROVIDER_NAME_MIST,
+ [Providers.Toshi]: constants.PROVIDER_NAME_TOSHI,
+ [Providers.Cipher]: constants.PROVIDER_NAME_CIPHER,
};
export class Blockchain {
public networkId: number;
public nodeVersion: string;
- private _zeroEx: ZeroEx;
- private _dispatcher: Dispatcher;
+ private _contractWrappers: ContractWrappers;
+ private readonly _dispatcher: Dispatcher;
private _web3Wrapper?: Web3Wrapper;
private _blockchainWatcher?: BlockchainWatcher;
+ private _injectedProviderObservable?: InjectedProviderObservable;
+ private readonly _injectedProviderUpdateHandler: (update: InjectedProviderUpdate) => Promise<void>;
private _userAddressIfExists: string;
- private _cachedProvider: Web3.Provider;
- private _cachedProviderNetworkId: number;
- private _ledgerSubprovider: LedgerWalletSubprovider;
+ private _ledgerSubprovider: LedgerSubprovider;
private _defaultGasPrice: BigNumber;
- private static _getNameGivenProvider(provider: Web3.Provider): string {
+ private _watchGasPriceIntervalId: NodeJS.Timer;
+ private static _getNameGivenProvider(provider: Provider): string {
const providerType = utils.getProviderType(provider);
const providerNameIfExists = providerToName[providerType];
if (_.isUndefined(providerNameIfExists)) {
@@ -85,46 +100,111 @@ export class Blockchain {
}
return providerNameIfExists;
}
- private static async _getProviderAsync(injectedWeb3: Web3, networkIdIfExists: number) {
+ private static _getInjectedWeb3(): InjectedWeb3 {
+ const injectedWeb3IfExists = (window as any).web3;
+ // Our core assumptions about the injected web3 object is that it has the following
+ // properties and methods.
+ if (
+ _.isUndefined(injectedWeb3IfExists) ||
+ _.isUndefined(injectedWeb3IfExists.version) ||
+ _.isUndefined(injectedWeb3IfExists.version.getNetwork) ||
+ _.isUndefined(injectedWeb3IfExists.currentProvider)
+ ) {
+ return undefined;
+ }
+ return injectedWeb3IfExists;
+ }
+ private static async _getInjectedWeb3ProviderNetworkIdIfExistsAsync(): Promise<number | undefined> {
+ // Hack: We need to know the networkId the injectedWeb3 is connected to (if it is defined) in
+ // order to properly instantiate the web3Wrapper. Since we must use the async call, we cannot
+ // retrieve it from within the web3Wrapper constructor. This is and should remain the only
+ // call to a web3 instance outside of web3Wrapper in the entire dapp.
+ // In addition, if the user has an injectedWeb3 instance that is disconnected from a backing
+ // Ethereum node, this call will throw. We need to handle this case gracefully
+ const injectedWeb3IfExists = Blockchain._getInjectedWeb3();
+ let networkIdIfExists: number;
+ if (!_.isUndefined(injectedWeb3IfExists)) {
+ try {
+ networkIdIfExists = _.parseInt(
+ await promisify<string>(
+ injectedWeb3IfExists.version.getNetwork.bind(injectedWeb3IfExists.version),
+ )(),
+ );
+ } catch (err) {
+ // Ignore error and proceed with networkId undefined
+ }
+ }
+ return networkIdIfExists;
+ }
+ private static async _getProviderAsync(
+ injectedWeb3: InjectedWeb3,
+ networkIdIfExists: number,
+ shouldUserLedgerProvider: boolean = false,
+ ): Promise<[Provider, LedgerSubprovider | undefined]> {
const doesInjectedWeb3Exist = !_.isUndefined(injectedWeb3);
+ const isNetworkIdAvailable = !_.isUndefined(networkIdIfExists);
const publicNodeUrlsIfExistsForNetworkId = configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkIdIfExists];
const isPublicNodeAvailableForNetworkId = !_.isUndefined(publicNodeUrlsIfExistsForNetworkId);
- let provider;
- if (doesInjectedWeb3Exist && isPublicNodeAvailableForNetworkId) {
+ if (shouldUserLedgerProvider && isNetworkIdAvailable) {
+ const isU2FSupported = await utils.isU2FSupportedAsync();
+ if (!isU2FSupported) {
+ throw new Error('Cannot update providerType to LEDGER without U2F support');
+ }
+ const provider = new Web3ProviderEngine();
+ const ledgerWalletConfigs = {
+ networkId: networkIdIfExists,
+ ledgerEthereumClientFactoryAsync: ledgerEthereumBrowserClientFactoryAsync,
+ };
+ const ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs);
+ provider.addProvider(ledgerSubprovider);
+ provider.addProvider(new FilterSubprovider());
+ const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkIdIfExists], publicNodeUrl => {
+ return new RPCSubprovider(publicNodeUrl);
+ });
+ provider.addProvider(new RedundantSubprovider(rpcSubproviders));
+ provider.start();
+ return [provider, ledgerSubprovider];
+ } else if (doesInjectedWeb3Exist && isPublicNodeAvailableForNetworkId) {
// We catch all requests involving a users account and send it to the injectedWeb3
// instance. All other requests go to the public hosted node.
- provider = new ProviderEngine();
- provider.addProvider(new InjectedWeb3Subprovider(injectedWeb3.currentProvider));
+ const provider = new Web3ProviderEngine();
+ provider.addProvider(new SignerSubprovider(injectedWeb3.currentProvider));
provider.addProvider(new FilterSubprovider());
- provider.addProvider(new RedundantRPCSubprovider(publicNodeUrlsIfExistsForNetworkId));
+ const rpcSubproviders = _.map(publicNodeUrlsIfExistsForNetworkId, publicNodeUrl => {
+ return new RPCSubprovider(publicNodeUrl);
+ });
+ provider.addProvider(new RedundantSubprovider(rpcSubproviders));
provider.start();
+ return [provider, undefined];
} else if (doesInjectedWeb3Exist) {
// Since no public node for this network, all requests go to injectedWeb3 instance
- provider = injectedWeb3.currentProvider;
+ return [injectedWeb3.currentProvider, undefined];
} else {
// If no injectedWeb3 instance, all requests fallback to our public hosted mainnet/testnet node
// We do this so that users can still browse the 0x Portal DApp even if they do not have web3
// injected into their browser.
- provider = new ProviderEngine();
+ const provider = new Web3ProviderEngine();
provider.addProvider(new FilterSubprovider());
- const networkId = configs.IS_MAINNET_ENABLED ? constants.NETWORK_ID_MAINNET : constants.NETWORK_ID_KOVAN;
- provider.addProvider(new RedundantRPCSubprovider(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId]));
+ const networkId = constants.NETWORK_ID_MAINNET;
+ const rpcSubproviders = _.map(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId], publicNodeUrl => {
+ return new RPCSubprovider(publicNodeUrl);
+ });
+ provider.addProvider(new RedundantSubprovider(rpcSubproviders));
provider.start();
+ return [provider, undefined];
}
-
- return provider;
}
- constructor(dispatcher: Dispatcher, isSalePage: boolean = false) {
+ constructor(dispatcher: Dispatcher) {
this._dispatcher = dispatcher;
- const defaultGasPrice = GWEI_IN_WEI * 30;
+ const defaultGasPrice = GWEI_IN_WEI * 40;
this._defaultGasPrice = new BigNumber(defaultGasPrice);
- // tslint:disable-next-line:no-floating-promises
- this._updateDefaultGasPriceAsync();
+ // We need a unique reference to this function so we can use it to unsubcribe.
+ this._injectedProviderUpdateHandler = this._handleInjectedProviderUpdateAsync.bind(this);
// tslint:disable-next-line:no-floating-promises
this._onPageLoadInitFireAndForgetAsync();
}
- public async networkIdUpdatedFireAndForgetAsync(newNetworkId: number) {
+ public async networkIdUpdatedFireAndForgetAsync(newNetworkId: number): Promise<void> {
const isConnected = !_.isUndefined(newNetworkId);
if (!isConnected) {
this.networkId = newNetworkId;
@@ -134,24 +214,24 @@ export class Blockchain {
this.networkId = newNetworkId;
this._dispatcher.encounteredBlockchainError(BlockchainErrs.NoError);
await this.fetchTokenInformationAsync();
- await this._rehydrateStoreWithContractEvents();
+ await this._rehydrateStoreWithContractEventsAsync();
}
}
- public async userAddressUpdatedFireAndForgetAsync(newUserAddress: string) {
+ public async userAddressUpdatedFireAndForgetAsync(newUserAddress: string): Promise<void> {
if (this._userAddressIfExists !== newUserAddress) {
this._userAddressIfExists = newUserAddress;
await this.fetchTokenInformationAsync();
- await this._rehydrateStoreWithContractEvents();
+ await this._rehydrateStoreWithContractEventsAsync();
}
}
- public async nodeVersionUpdatedFireAndForgetAsync(nodeVersion: string) {
+ public async nodeVersionUpdatedFireAndForgetAsync(nodeVersion: string): Promise<void> {
if (this.nodeVersion !== nodeVersion) {
this.nodeVersion = nodeVersion;
}
}
public async isAddressInTokenRegistryAsync(tokenAddress: string): Promise<boolean> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
- const tokenIfExists = await this._zeroEx.tokenRegistry.getTokenIfExistsAsync(tokenAddress);
+ utils.assert(!_.isUndefined(this._contractWrappers), 'Contract Wrappers must be instantiated.');
+ const tokenIfExists = await this._contractWrappers.tokenRegistry.getTokenIfExistsAsync(tokenAddress);
return !_.isUndefined(tokenIfExists);
}
public getLedgerDerivationPathIfExists(): string {
@@ -161,100 +241,32 @@ export class Blockchain {
const path = this._ledgerSubprovider.getPath();
return path;
}
- public updateLedgerDerivationPathIfExists(path: string) {
+ public updateLedgerDerivationPathIfExists(path: string): void {
if (_.isUndefined(this._ledgerSubprovider)) {
return; // noop
}
this._ledgerSubprovider.setPath(path);
}
- public updateLedgerDerivationIndex(pathIndex: number) {
- if (_.isUndefined(this._ledgerSubprovider)) {
- return; // noop
- }
- this._ledgerSubprovider.setPathIndex(pathIndex);
- }
- public async updateProviderToLedgerAsync(networkId: number) {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
-
- const isU2FSupported = await utils.isU2FSupportedAsync();
- if (!isU2FSupported) {
- throw new Error('Cannot update providerType to LEDGER without U2F support');
- }
-
- // Cache injected provider so that we can switch the user back to it easily
- if (_.isUndefined(this._cachedProvider)) {
- this._cachedProvider = this._web3Wrapper.getProvider();
- this._cachedProviderNetworkId = this.networkId;
- }
-
- this._blockchainWatcher.destroy();
-
- delete this._userAddressIfExists;
- this._dispatcher.updateUserAddress(undefined); // Clear old userAddress
-
- const provider = new ProviderEngine();
- const ledgerWalletConfigs = {
- networkId,
- ledgerEthereumClientFactoryAsync: ledgerEthereumBrowserClientFactoryAsync,
- };
- this._ledgerSubprovider = new LedgerSubprovider(ledgerWalletConfigs);
- provider.addProvider(this._ledgerSubprovider);
- provider.addProvider(new FilterSubprovider());
- provider.addProvider(new RedundantRPCSubprovider(configs.PUBLIC_NODE_URLS_BY_NETWORK_ID[networkId]));
- provider.start();
- this.networkId = networkId;
- this._dispatcher.updateNetworkId(this.networkId);
+ public async updateProviderToLedgerAsync(networkId: number): Promise<void> {
const shouldPollUserAddress = false;
- this._web3Wrapper = new Web3Wrapper(provider);
- this._blockchainWatcher = new BlockchainWatcher(
- this._dispatcher,
- this._web3Wrapper,
- this.networkId,
- shouldPollUserAddress,
- );
- this._zeroEx.setProvider(provider, this.networkId);
- this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState();
- this._dispatcher.updateProviderType(ProviderType.Ledger);
+ const shouldUserLedgerProvider = true;
+ await this._resetOrInitializeAsync(networkId, shouldPollUserAddress, shouldUserLedgerProvider);
}
- public async updateProviderToInjectedAsync() {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
-
- if (_.isUndefined(this._cachedProvider)) {
- return; // Going from injected to injected, so we noop
- }
-
- this._blockchainWatcher.destroy();
-
- const provider = this._cachedProvider;
- this.networkId = this._cachedProviderNetworkId;
-
+ public async updateProviderToInjectedAsync(): Promise<void> {
const shouldPollUserAddress = true;
- this._web3Wrapper = new Web3Wrapper(provider);
- this._blockchainWatcher = new BlockchainWatcher(
- this._dispatcher,
- this._web3Wrapper,
- this.networkId,
- shouldPollUserAddress,
- );
-
- const userAddresses = await this._web3Wrapper.getAvailableAddressesAsync();
- this._userAddressIfExists = userAddresses[0];
-
- this._zeroEx.setProvider(provider, this.networkId);
-
- await this.fetchTokenInformationAsync();
- this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState();
- this._dispatcher.updateProviderType(ProviderType.Injected);
- delete this._ledgerSubprovider;
- delete this._cachedProvider;
+ const shouldUserLedgerProvider = false;
+ this._dispatcher.updateBlockchainIsLoaded(false);
+ // We don't want to be out of sync with the network the injected provider declares.
+ const networkId = await Blockchain._getInjectedWeb3ProviderNetworkIdIfExistsAsync();
+ await this._resetOrInitializeAsync(networkId, shouldPollUserAddress, shouldUserLedgerProvider);
}
public async setProxyAllowanceAsync(token: Token, amountInBaseUnits: BigNumber): Promise<void> {
utils.assert(this.isValidAddress(token.address), BlockchainCallErrs.TokenAddressIsInvalid);
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'Contract Wrappers must be instantiated.');
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.token.setProxyAllowanceAsync(
+ const txHash = await this._contractWrappers.token.setProxyAllowanceAsync(
token.address,
this._userAddressIfExists,
amountInBaseUnits,
@@ -264,12 +276,38 @@ export class Blockchain {
);
await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
}
+ public async sendAsync(toAddress: string, amountInBaseUnits: BigNumber): Promise<void> {
+ utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
+ const transaction = {
+ from: this._userAddressIfExists,
+ to: toAddress,
+ value: amountInBaseUnits,
+ gasPrice: this._defaultGasPrice,
+ };
+ this._showFlashMessageIfLedger();
+ const txHash = await this._web3Wrapper.sendTransactionAsync(transaction);
+ await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
+ const etherScanLinkIfExists = sharedUtils.getEtherScanLinkIfExists(
+ txHash,
+ this.networkId,
+ EtherscanLinkSuffixes.Tx,
+ );
+ this._dispatcher.showFlashMessage(
+ React.createElement(AssetSendCompleted, {
+ etherScanLinkIfExists,
+ toAddress,
+ amountInBaseUnits,
+ decimals: constants.DECIMAL_PLACES_ETH,
+ symbol: constants.ETHER_SYMBOL,
+ }),
+ );
+ }
public async transferAsync(token: Token, toAddress: string, amountInBaseUnits: BigNumber): Promise<void> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.token.transferAsync(
+ const txHash = await this._contractWrappers.token.transferAsync(
token.address,
this._userAddressIfExists,
toAddress,
@@ -285,11 +323,12 @@ export class Blockchain {
EtherscanLinkSuffixes.Tx,
);
this._dispatcher.showFlashMessage(
- React.createElement(TokenSendCompleted, {
+ React.createElement(AssetSendCompleted, {
etherScanLinkIfExists,
- token,
toAddress,
amountInBaseUnits,
+ decimals: token.decimals,
+ symbol: token.symbol,
}),
);
}
@@ -313,13 +352,13 @@ export class Blockchain {
return zeroExSignedOrder;
}
public async fillOrderAsync(signedOrder: SignedOrder, fillTakerTokenAmount: BigNumber): Promise<BigNumber> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
const shouldThrowOnInsufficientBalanceOrAllowance = true;
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.exchange.fillOrderAsync(
+ const txHash = await this._contractWrappers.exchange.fillOrderAsync(
signedOrder,
fillTakerTokenAmount,
shouldThrowOnInsufficientBalanceOrAllowance,
@@ -330,7 +369,7 @@ export class Blockchain {
);
const receipt = await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
const logs: Array<LogWithDecodedArgs<ExchangeContractEventArgs>> = receipt.logs as any;
- this._zeroEx.exchange.throwLogErrorsAsErrors(logs);
+ this._contractWrappers.exchange.throwLogErrorsAsErrors(logs);
const logFill = _.find(logs, { event: 'LogFill' });
const args = (logFill.args as any) as LogFillContractEventArgs;
const filledTakerTokenAmount = args.filledTakerTokenAmount;
@@ -338,32 +377,32 @@ export class Blockchain {
}
public async cancelOrderAsync(signedOrder: SignedOrder, cancelTakerTokenAmount: BigNumber): Promise<BigNumber> {
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.exchange.cancelOrderAsync(signedOrder, cancelTakerTokenAmount, {
+ const txHash = await this._contractWrappers.exchange.cancelOrderAsync(signedOrder, cancelTakerTokenAmount, {
gasPrice: this._defaultGasPrice,
});
const receipt = await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
const logs: Array<LogWithDecodedArgs<ExchangeContractEventArgs>> = receipt.logs as any;
- this._zeroEx.exchange.throwLogErrorsAsErrors(logs);
+ this._contractWrappers.exchange.throwLogErrorsAsErrors(logs);
const logCancel = _.find(logs, { event: ExchangeEvents.LogCancel });
const args = (logCancel.args as any) as LogCancelContractEventArgs;
const cancelledTakerTokenAmount = args.cancelledTakerTokenAmount;
return cancelledTakerTokenAmount;
}
public async getUnavailableTakerAmountAsync(orderHash: string): Promise<BigNumber> {
- utils.assert(ZeroEx.isValidOrderHash(orderHash), 'Must be valid orderHash');
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
- const unavailableTakerAmount = await this._zeroEx.exchange.getUnavailableTakerAmountAsync(orderHash);
+ utils.assert(isValidOrderHash(orderHash), 'Must be valid orderHash');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
+ const unavailableTakerAmount = await this._contractWrappers.exchange.getUnavailableTakerAmountAsync(orderHash);
return unavailableTakerAmount;
}
- public getExchangeContractAddressIfExists() {
- return this._zeroEx.exchange.getContractAddress();
+ public getExchangeContractAddressIfExists(): string | undefined {
+ return this._contractWrappers.exchange.getContractAddress();
}
public async validateFillOrderThrowIfInvalidAsync(
signedOrder: SignedOrder,
fillTakerTokenAmount: BigNumber,
takerAddress: string,
): Promise<void> {
- await this._zeroEx.exchange.validateFillOrderThrowIfInvalidAsync(
+ await this._contractWrappers.exchange.validateFillOrderThrowIfInvalidAsync(
signedOrder,
fillTakerTokenAmount,
takerAddress,
@@ -373,13 +412,13 @@ export class Blockchain {
order: Order,
cancelTakerTokenAmount: BigNumber,
): Promise<void> {
- await this._zeroEx.exchange.validateCancelOrderThrowIfInvalidAsync(order, cancelTakerTokenAmount);
+ await this._contractWrappers.exchange.validateCancelOrderThrowIfInvalidAsync(order, cancelTakerTokenAmount);
}
public isValidAddress(address: string): boolean {
const lowercaseAddress = address.toLowerCase();
- return this._web3Wrapper.isAddress(lowercaseAddress);
+ return Web3Wrapper.isAddress(lowercaseAddress);
}
- public async pollTokenBalanceAsync(token: Token) {
+ public async pollTokenBalanceAsync(token: Token): Promise<BigNumber> {
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
const [currBalance] = await this.getTokenBalanceAndAllowanceAsync(this._userAddressIfExists, token.address);
@@ -408,7 +447,7 @@ export class Blockchain {
return newTokenBalancePromise;
}
public async signOrderHashAsync(orderHash: string): Promise<ECSignature> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
const makerAddress = this._userAddressIfExists;
// If makerAddress is undefined, this means they have a web3 instance injected into their browser
// but no account addresses associated with it.
@@ -425,15 +464,12 @@ export class Blockchain {
if ((isParityNode && !isLedgerSigner) || isTestRpc || isLedgerSigner) {
shouldAddPersonalMessagePrefix = false;
}
- const ecSignature = await this._zeroEx.signOrderHashAsync(
- orderHash,
- makerAddress,
- shouldAddPersonalMessagePrefix,
- );
+ const provider = this._contractWrappers.getProvider();
+ const ecSignature = await signOrderHashAsync(provider, orderHash, makerAddress, shouldAddPersonalMessagePrefix);
this._dispatcher.updateECSignature(ecSignature);
return ecSignature;
}
- public async mintTestTokensAsync(token: Token) {
+ public async mintTestTokensAsync(token: Token): Promise<void> {
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
const mintableContract = await this._instantiateContractIfExistsAsync(MintableArtifacts, token.address);
@@ -448,11 +484,11 @@ export class Blockchain {
return balanceInWei;
}
public async convertEthToWrappedEthTokensAsync(etherTokenAddress: string, amount: BigNumber): Promise<void> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.etherToken.depositAsync(
+ const txHash = await this._contractWrappers.etherToken.depositAsync(
etherTokenAddress,
amount,
this._userAddressIfExists,
@@ -463,11 +499,11 @@ export class Blockchain {
await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
}
public async convertWrappedEthTokensToEthAsync(etherTokenAddress: string, amount: BigNumber): Promise<void> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
this._showFlashMessageIfLedger();
- const txHash = await this._zeroEx.etherToken.withdrawAsync(
+ const txHash = await this._contractWrappers.etherToken.withdrawAsync(
etherTokenAddress,
amount,
this._userAddressIfExists,
@@ -477,7 +513,7 @@ export class Blockchain {
);
await this._showEtherScanLinkAndAwaitTransactionMinedAsync(txHash);
}
- public async doesContractExistAtAddressAsync(address: string) {
+ public async doesContractExistAtAddressAsync(address: string): Promise<boolean> {
const doesContractExist = await this._web3Wrapper.doesContractExistAtAddressAsync(address);
return doesContractExist;
}
@@ -493,8 +529,8 @@ export class Blockchain {
public async getTokenBalanceAndAllowanceAsync(
ownerAddressIfExists: string,
tokenAddress: string,
- ): Promise<BigNumber[]> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ ): Promise<[BigNumber, BigNumber]> {
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
if (_.isUndefined(ownerAddressIfExists)) {
const zero = new BigNumber(0);
@@ -503,27 +539,35 @@ export class Blockchain {
let balance = new BigNumber(0);
let allowance = new BigNumber(0);
if (this._doesUserAddressExist()) {
- balance = await this._zeroEx.token.getBalanceAsync(tokenAddress, ownerAddressIfExists);
- allowance = await this._zeroEx.token.getProxyAllowanceAsync(tokenAddress, ownerAddressIfExists);
+ [balance, allowance] = await Promise.all([
+ this._contractWrappers.token.getBalanceAsync(tokenAddress, ownerAddressIfExists),
+ this._contractWrappers.token.getProxyAllowanceAsync(tokenAddress, ownerAddressIfExists),
+ ]);
}
return [balance, allowance];
}
- public async getUserAccountsAsync() {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
- const userAccountsIfExists = await this._zeroEx.getAvailableAddressesAsync();
+ public async getUserAccountsAsync(): Promise<string[]> {
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
+ const provider = this._contractWrappers.getProvider();
+ const web3Wrapper = new Web3Wrapper(provider);
+ const userAccountsIfExists = await web3Wrapper.getAvailableAddressesAsync();
return userAccountsIfExists;
}
// HACK: When a user is using a Ledger, we simply dispatch the selected userAddress, which
// by-passes the web3Wrapper logic for updating the prevUserAddress. We therefore need to
// manually update it. This should only be called by the LedgerConfigDialog.
- public updateWeb3WrapperPrevUserAddress(newUserAddress: string) {
+ public updateWeb3WrapperPrevUserAddress(newUserAddress: string): void {
this._blockchainWatcher.updatePrevUserAddress(newUserAddress);
}
- public destroy() {
+ public destroy(): void {
this._blockchainWatcher.destroy();
+ if (this._injectedProviderObservable) {
+ this._injectedProviderObservable.unsubscribe(this._injectedProviderUpdateHandler);
+ }
this._stopWatchingExchangeLogFillEvents();
+ this._stopWatchingGasPrice();
}
- public async fetchTokenInformationAsync() {
+ public async fetchTokenInformationAsync(): Promise<void> {
utils.assert(
!_.isUndefined(this.networkId),
'Cannot call fetchTokenInformationAsync if disconnected from Ethereum node',
@@ -542,6 +586,7 @@ export class Blockchain {
tokenRegistryTokenSymbols,
configs.DEFAULT_TRACKED_TOKEN_SYMBOLS,
);
+ const currentTimestamp = moment().unix();
if (defaultTrackedTokensInRegistry.length !== configs.DEFAULT_TRACKED_TOKEN_SYMBOLS.length) {
this._dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
this._dispatcher.encounteredBlockchainError(BlockchainErrs.DefaultTokensNotInTokenRegistry);
@@ -550,25 +595,25 @@ export class Blockchain {
configs.DEFAULT_TRACKED_TOKEN_SYMBOLS,
)}) not found in tokenRegistry: ${JSON.stringify(tokenRegistryTokens)}`,
);
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
return;
}
if (_.isEmpty(trackedTokensByAddress)) {
_.each(configs.DEFAULT_TRACKED_TOKEN_SYMBOLS, symbol => {
const token = _.find(tokenRegistryTokens, t => t.symbol === symbol);
- token.isTracked = true;
+ token.trackedTimestamp = currentTimestamp;
trackedTokensByAddress[token.address] = token;
});
if (!_.isUndefined(this._userAddressIfExists)) {
- _.each(trackedTokensByAddress, (token: Token, address: string) => {
+ _.each(trackedTokensByAddress, (token: Token) => {
trackedTokenStorage.addTrackedTokenToUser(this._userAddressIfExists, this.networkId, token);
});
}
} else {
- // Properly set all tokenRegistry tokens `isTracked` to true if they are in the existing trackedTokens array
+ // Properly set all tokenRegistry tokens `trackedTimestamp` if they are in the existing trackedTokens array
_.each(trackedTokensByAddress, (trackedToken: Token, address: string) => {
if (!_.isUndefined(tokenRegistryTokensByAddress[address])) {
- tokenRegistryTokensByAddress[address].isTracked = true;
+ tokenRegistryTokensByAddress[address].trackedTimestamp = trackedToken.trackedTimestamp;
}
});
}
@@ -606,13 +651,30 @@ export class Blockchain {
etherScanLinkIfExists,
}),
);
- const receipt = await this._zeroEx.awaitTransactionMinedAsync(txHash);
+ const provider = this._contractWrappers.getProvider();
+ const web3Wrapper = new Web3Wrapper(provider);
+ // HACK: remove this hard-coded abi and use @0xproject/contract-wrappers
+ const exchangeAbi = _.get(Exchange, 'abi', []);
+ web3Wrapper.abiDecoder.addABI(exchangeAbi);
+ const receipt = await web3Wrapper.awaitTransactionSuccessAsync(txHash);
return receipt;
}
private _doesUserAddressExist(): boolean {
return !_.isUndefined(this._userAddressIfExists);
}
- private async _rehydrateStoreWithContractEvents() {
+ private async _handleInjectedProviderUpdateAsync(update: InjectedProviderUpdate): Promise<void> {
+ if (update.networkVersion === 'loading' || !_.isUndefined(this._ledgerSubprovider)) {
+ return;
+ }
+ const updatedNetworkId = _.parseInt(update.networkVersion);
+ if (this.networkId === updatedNetworkId) {
+ return;
+ }
+ const shouldPollUserAddress = true;
+ const shouldUserLedgerProvider = false;
+ await this._resetOrInitializeAsync(updatedNetworkId, shouldPollUserAddress, shouldUserLedgerProvider);
+ }
+ private async _rehydrateStoreWithContractEventsAsync(): Promise<void> {
// Ensure we are only ever listening to one set of events
this._stopWatchingExchangeLogFillEvents();
@@ -620,7 +682,7 @@ export class Blockchain {
return; // short-circuit
}
- if (!_.isUndefined(this._zeroEx)) {
+ if (!_.isUndefined(this._contractWrappers)) {
// Since we do not have an index on the `taker` address and want to show
// transactions where an account is either the `maker` or `taker`, we loop
// through all fill events, and filter/cache them client-side.
@@ -629,14 +691,14 @@ export class Blockchain {
}
}
private async _startListeningForExchangeLogFillEventsAsync(indexFilterValues: IndexedFilterValues): Promise<void> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
// Fetch historical logs
await this._fetchHistoricalExchangeLogFillEventsAsync(indexFilterValues);
// Start a subscription for new logs
- this._zeroEx.exchange.subscribe(
+ this._contractWrappers.exchange.subscribe(
ExchangeEvents.LogFill,
indexFilterValues,
async (err: Error, decodedLogEvent: DecodedLogEvent<LogFillContractEventArgs>) => {
@@ -644,8 +706,7 @@ export class Blockchain {
// Note: it's not entirely clear from the documentation which
// errors will be thrown by `watch`. For now, let's log the error
// to rollbar and stop watching when one occurs
- // tslint:disable-next-line:no-floating-promises
- errorReporter.reportAsync(err); // fire and forget
+ errorReporter.report(err); // fire and forget
return;
} else {
const decodedLog = decodedLogEvent.log;
@@ -663,7 +724,7 @@ export class Blockchain {
},
);
}
- private async _fetchHistoricalExchangeLogFillEventsAsync(indexFilterValues: IndexedFilterValues) {
+ private async _fetchHistoricalExchangeLogFillEventsAsync(indexFilterValues: IndexedFilterValues): Promise<void> {
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
const fromBlock = tradeHistoryStorage.getFillsLatestBlock(this._userAddressIfExists, this.networkId);
@@ -671,7 +732,7 @@ export class Blockchain {
fromBlock,
toBlock: 'latest' as BlockParam,
};
- const decodedLogs = await this._zeroEx.exchange.getLogsAsync<LogFillContractEventArgs>(
+ const decodedLogs = await this._contractWrappers.exchange.getLogsAsync<LogFillContractEventArgs>(
ExchangeEvents.LogFill,
blockRange,
indexFilterValues,
@@ -685,7 +746,9 @@ export class Blockchain {
tradeHistoryStorage.addFillToUser(this._userAddressIfExists, this.networkId, fill);
}
}
- private async _convertDecodedLogToFillAsync(decodedLog: LogWithDecodedArgs<LogFillContractEventArgs>) {
+ private async _convertDecodedLogToFillAsync(
+ decodedLog: LogWithDecodedArgs<LogFillContractEventArgs>,
+ ): Promise<Fill> {
const args = decodedLog.args;
const blockTimestamp = await this._web3Wrapper.getBlockTimestampAsync(decodedLog.blockHash);
const fill = {
@@ -704,12 +767,12 @@ export class Blockchain {
};
return fill;
}
- private _doesLogEventInvolveUser(decodedLog: LogWithDecodedArgs<LogFillContractEventArgs>) {
+ private _doesLogEventInvolveUser(decodedLog: LogWithDecodedArgs<LogFillContractEventArgs>): boolean {
const args = decodedLog.args;
const isUserMakerOrTaker = args.maker === this._userAddressIfExists || args.taker === this._userAddressIfExists;
return isUserMakerOrTaker;
}
- private _updateLatestFillsBlockIfNeeded(blockNumber: number) {
+ private _updateLatestFillsBlockIfNeeded(blockNumber: number): void {
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
const isBlockPending = _.isNull(blockNumber);
@@ -726,79 +789,122 @@ export class Blockchain {
}
}
private _stopWatchingExchangeLogFillEvents(): void {
- this._zeroEx.exchange.unsubscribeAll();
+ this._contractWrappers.exchange.unsubscribeAll();
}
private async _getTokenRegistryTokensByAddressAsync(): Promise<TokenByAddress> {
- utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
- const tokenRegistryTokens = await this._zeroEx.tokenRegistry.getTokensAsync();
-
+ let tokenRegistryTokens;
+ if (this.networkId === constants.NETWORK_ID_MAINNET) {
+ tokenRegistryTokens = await backendClient.getTokenInfosAsync();
+ } else {
+ utils.assert(!_.isUndefined(this._contractWrappers), 'ContractWrappers must be instantiated.');
+ tokenRegistryTokens = await this._contractWrappers.tokenRegistry.getTokensAsync();
+ }
const tokenByAddress: TokenByAddress = {};
- _.each(tokenRegistryTokens, (t: ZeroExToken, i: number) => {
+ _.each(tokenRegistryTokens, (t: ZeroExToken) => {
// HACK: For now we have a hard-coded list of iconUrls for the dummyTokens
// TODO: Refactor this out and pull the iconUrl directly from the TokenRegistry
- const iconUrl = configs.ICON_URL_BY_SYMBOL[t.symbol];
+ const iconUrl = utils.getTokenIconUrl(t.symbol);
const token: Token = {
iconUrl,
address: t.address,
name: t.name,
symbol: t.symbol,
decimals: t.decimals,
- isTracked: false,
+ trackedTimestamp: undefined,
isRegistered: true,
};
tokenByAddress[token.address] = token;
});
return tokenByAddress;
}
- private async _onPageLoadInitFireAndForgetAsync() {
- await utils.onPageLoadAsync(); // wait for page to load
-
- // Hack: We need to know the networkId the injectedWeb3 is connected to (if it is defined) in
- // order to properly instantiate the web3Wrapper. Since we must use the async call, we cannot
- // retrieve it from within the web3Wrapper constructor. This is and should remain the only
- // call to a web3 instance outside of web3Wrapper in the entire dapp.
- // In addition, if the user has an injectedWeb3 instance that is disconnected from a backing
- // Ethereum node, this call will throw. We need to handle this case gracefully
- const injectedWeb3 = (window as any).web3;
- let networkIdIfExists: number;
- if (!_.isUndefined(injectedWeb3)) {
- try {
- networkIdIfExists = _.parseInt(await promisify<string>(injectedWeb3.version.getNetwork)());
- } catch (err) {
- // Ignore error and proceed with networkId undefined
+ private async _onPageLoadInitFireAndForgetAsync(): Promise<void> {
+ await utils.onPageLoadPromise; // wait for page to load
+ const networkIdIfExists = await Blockchain._getInjectedWeb3ProviderNetworkIdIfExistsAsync();
+ this.networkId = !_.isUndefined(networkIdIfExists) ? networkIdIfExists : constants.NETWORK_ID_MAINNET;
+ const injectedWeb3IfExists = Blockchain._getInjectedWeb3();
+ if (!_.isUndefined(injectedWeb3IfExists) && !_.isUndefined(injectedWeb3IfExists.currentProvider)) {
+ const injectedProviderObservable = injectedWeb3IfExists.currentProvider.publicConfigStore;
+ if (!_.isUndefined(injectedProviderObservable) && _.isUndefined(this._injectedProviderObservable)) {
+ this._injectedProviderObservable = injectedProviderObservable;
+ this._injectedProviderObservable.subscribe(this._injectedProviderUpdateHandler);
}
}
-
- const provider = await Blockchain._getProviderAsync(injectedWeb3, networkIdIfExists);
- this.networkId = !_.isUndefined(networkIdIfExists)
- ? networkIdIfExists
- : configs.IS_MAINNET_ENABLED ? constants.NETWORK_ID_MAINNET : constants.NETWORK_ID_KOVAN;
- this._dispatcher.updateNetworkId(this.networkId);
- const zeroExConfigs = {
- networkId: this.networkId,
- };
- this._zeroEx = new ZeroEx(provider, zeroExConfigs);
- this._updateProviderName(injectedWeb3);
+ this._updateProviderName(injectedWeb3IfExists);
const shouldPollUserAddress = true;
- this._web3Wrapper = new Web3Wrapper(provider);
- this._blockchainWatcher = new BlockchainWatcher(
- this._dispatcher,
- this._web3Wrapper,
- this.networkId,
- shouldPollUserAddress,
+ const shouldUseLedgerProvider = false;
+ this._startWatchingGasPrice();
+ await this._resetOrInitializeAsync(this.networkId, shouldPollUserAddress, shouldUseLedgerProvider);
+ }
+ private _startWatchingGasPrice(): void {
+ if (!_.isUndefined(this._watchGasPriceIntervalId)) {
+ return; // we are already watching
+ }
+ const oneMinuteInMs = 60000;
+ // tslint:disable-next-line:no-floating-promises
+ this._updateDefaultGasPriceAsync();
+ this._watchGasPriceIntervalId = intervalUtils.setAsyncExcludingInterval(
+ this._updateDefaultGasPriceAsync.bind(this),
+ oneMinuteInMs,
+ (err: Error) => {
+ logUtils.log(`Watching gas price failed: ${err.stack}`);
+ this._stopWatchingGasPrice();
+ },
);
-
- const userAddresses = await this._web3Wrapper.getAvailableAddressesAsync();
- this._userAddressIfExists = userAddresses[0];
- this._dispatcher.updateUserAddress(this._userAddressIfExists);
- await this.fetchTokenInformationAsync();
- this._blockchainWatcher.startEmittingNetworkConnectionAndUserBalanceState();
- await this._rehydrateStoreWithContractEvents();
}
- private _updateProviderName(injectedWeb3: Web3) {
- const doesInjectedWeb3Exist = !_.isUndefined(injectedWeb3);
+ private _stopWatchingGasPrice(): void {
+ if (!_.isUndefined(this._watchGasPriceIntervalId)) {
+ intervalUtils.clearAsyncExcludingInterval(this._watchGasPriceIntervalId);
+ }
+ }
+ private async _resetOrInitializeAsync(
+ networkId: number,
+ shouldPollUserAddress: boolean = false,
+ shouldUserLedgerProvider: boolean = false,
+ ): Promise<void> {
+ if (!shouldUserLedgerProvider) {
+ this._dispatcher.updateBlockchainIsLoaded(false);
+ }
+ this._dispatcher.updateUserWeiBalance(undefined);
+ this.networkId = networkId;
+ const injectedWeb3IfExists = Blockchain._getInjectedWeb3();
+ const [provider, ledgerSubproviderIfExists] = await Blockchain._getProviderAsync(
+ injectedWeb3IfExists,
+ networkId,
+ shouldUserLedgerProvider,
+ );
+ if (!_.isUndefined(this._contractWrappers)) {
+ this._contractWrappers.setProvider(provider, networkId);
+ } else {
+ this._contractWrappers = new ContractWrappers(provider, { networkId });
+ }
+ if (!_.isUndefined(this._blockchainWatcher)) {
+ this._blockchainWatcher.destroy();
+ }
+ this._web3Wrapper = new Web3Wrapper(provider);
+ this._blockchainWatcher = new BlockchainWatcher(this._dispatcher, this._web3Wrapper, shouldPollUserAddress);
+ if (shouldUserLedgerProvider && !_.isUndefined(ledgerSubproviderIfExists)) {
+ delete this._userAddressIfExists;
+ this._ledgerSubprovider = ledgerSubproviderIfExists;
+ this._dispatcher.updateUserAddress(undefined);
+ this._dispatcher.updateProviderType(ProviderType.Ledger);
+ } else {
+ delete this._ledgerSubprovider;
+ const userAddresses = await this._web3Wrapper.getAvailableAddressesAsync();
+ this._userAddressIfExists = userAddresses[0];
+ this._dispatcher.updateUserAddress(this._userAddressIfExists);
+ if (!_.isUndefined(injectedWeb3IfExists)) {
+ this._dispatcher.updateProviderType(ProviderType.Injected);
+ }
+ await this.fetchTokenInformationAsync();
+ }
+ await this._blockchainWatcher.startEmittingUserBalanceStateAsync();
+ this._dispatcher.updateNetworkId(networkId);
+ await this._rehydrateStoreWithContractEventsAsync();
+ }
+ private _updateProviderName(injectedWeb3IfExists: InjectedWeb3): void {
+ const doesInjectedWeb3Exist = !_.isUndefined(injectedWeb3IfExists);
const providerName = doesInjectedWeb3Exist
- ? Blockchain._getNameGivenProvider(injectedWeb3.currentProvider)
+ ? Blockchain._getNameGivenProvider(injectedWeb3IfExists.currentProvider)
: constants.PROVIDER_NAME_PUBLIC;
this._dispatcher.updateInjectedProviderName(providerName);
}
@@ -832,25 +938,24 @@ export class Blockchain {
if (_.includes(errMsg, 'not been deployed to detected network')) {
throw new Error(BlockchainCallErrs.ContractDoesNotExist);
} else {
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
throw new Error(BlockchainCallErrs.UnhandledError);
}
}
}
- private _showFlashMessageIfLedger() {
+ private _showFlashMessageIfLedger(): void {
if (!_.isUndefined(this._ledgerSubprovider)) {
this._dispatcher.showFlashMessage('Confirm the transaction on your Ledger Nano S');
}
}
- private async _updateDefaultGasPriceAsync() {
- const endpoint = `${configs.BACKEND_BASE_URL}/eth_gas_station`;
- const response = await fetch(endpoint);
- if (response.status !== 200) {
- return; // noop and we keep hard-coded default
+ private async _updateDefaultGasPriceAsync(): Promise<void> {
+ try {
+ const gasInfo = await backendClient.getGasInfoAsync();
+ const gasPriceInGwei = new BigNumber(gasInfo.fast / 10);
+ const gasPriceInWei = gasPriceInGwei.mul(1000000000);
+ this._defaultGasPrice = gasPriceInWei;
+ } catch (err) {
+ return;
}
- const gasInfo = await response.json();
- const gasPriceInGwei = new BigNumber(gasInfo.average / 10);
- const gasPriceInWei = gasPriceInGwei.mul(1000000000);
- this._defaultGasPrice = gasPriceInWei;
}
} // tslint:disable:max-file-line-count
diff --git a/packages/website/ts/blockchain_watcher.ts b/packages/website/ts/blockchain_watcher.ts
index 2712b2c04..39ed8b08b 100644
--- a/packages/website/ts/blockchain_watcher.ts
+++ b/packages/website/ts/blockchain_watcher.ts
@@ -1,30 +1,23 @@
-import { BigNumber, intervalUtils, logUtils, promisify } from '@0xproject/utils';
+import { BigNumber, intervalUtils, logUtils } from '@0xproject/utils';
import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { utils } from 'ts/utils/utils';
export class BlockchainWatcher {
- private _dispatcher: Dispatcher;
- private _web3Wrapper: Web3Wrapper;
- private _prevNetworkId: number;
- private _shouldPollUserAddress: boolean;
- private _watchNetworkAndBalanceIntervalId: NodeJS.Timer;
- private _prevUserEtherBalanceInWei: BigNumber;
+ private readonly _dispatcher: Dispatcher;
+ private readonly _web3Wrapper: Web3Wrapper;
+ private readonly _shouldPollUserAddress: boolean;
+ private _watchBalanceIntervalId: NodeJS.Timer;
+ private _prevUserEtherBalanceInWei?: BigNumber;
private _prevUserAddressIfExists: string;
- constructor(
- dispatcher: Dispatcher,
- web3Wrapper: Web3Wrapper,
- networkIdIfExists: number,
- shouldPollUserAddress: boolean,
- ) {
+ private _prevNodeVersionIfExists: string;
+ constructor(dispatcher: Dispatcher, web3Wrapper: Web3Wrapper, shouldPollUserAddress: boolean) {
this._dispatcher = dispatcher;
- this._prevNetworkId = networkIdIfExists;
this._shouldPollUserAddress = shouldPollUserAddress;
this._web3Wrapper = web3Wrapper;
}
- public destroy() {
- this._stopEmittingNetworkConnectionAndUserBalanceStateAsync();
+ public destroy(): void {
+ this._stopEmittingUserBalanceState();
// HACK: stop() is only available on providerEngine instances
const provider = this._web3Wrapper.getProvider();
if (!_.isUndefined((provider as any).stop)) {
@@ -32,76 +25,62 @@ export class BlockchainWatcher {
}
}
// This should only be called from the LedgerConfigDialog
- public updatePrevUserAddress(userAddress: string) {
+ public updatePrevUserAddress(userAddress: string): void {
this._prevUserAddressIfExists = userAddress;
}
- public startEmittingNetworkConnectionAndUserBalanceState() {
- if (!_.isUndefined(this._watchNetworkAndBalanceIntervalId)) {
+ public async startEmittingUserBalanceStateAsync(): Promise<void> {
+ if (!_.isUndefined(this._watchBalanceIntervalId)) {
return; // we are already emitting the state
}
-
- let prevNodeVersion: string;
- this._prevUserEtherBalanceInWei = new BigNumber(0);
- this._dispatcher.updateNetworkId(this._prevNetworkId);
- this._watchNetworkAndBalanceIntervalId = intervalUtils.setAsyncExcludingInterval(
- async () => {
- // Check for network state changes
- let currentNetworkId;
- try {
- currentNetworkId = await this._web3Wrapper.getNetworkIdAsync();
- } catch (err) {
- // Noop
- }
- if (currentNetworkId !== this._prevNetworkId) {
- this._prevNetworkId = currentNetworkId;
- this._dispatcher.updateNetworkId(currentNetworkId);
- }
-
- // Check for node version changes
- const currentNodeVersion = await this._web3Wrapper.getNodeVersionAsync();
- if (currentNodeVersion !== prevNodeVersion) {
- prevNodeVersion = currentNodeVersion;
- this._dispatcher.updateNodeVersion(currentNodeVersion);
- }
-
- if (this._shouldPollUserAddress) {
- const addresses = await this._web3Wrapper.getAvailableAddressesAsync();
- const userAddressIfExists = addresses[0];
- // Update makerAddress on network change
- if (this._prevUserAddressIfExists !== userAddressIfExists) {
- this._prevUserAddressIfExists = userAddressIfExists;
- this._dispatcher.updateUserAddress(userAddressIfExists);
- }
-
- // Check for user ether balance changes
- if (!_.isUndefined(userAddressIfExists)) {
- await this._updateUserWeiBalanceAsync(userAddressIfExists);
- }
- } else {
- // This logic is primarily for the Ledger, since we don't regularly poll for the address
- // we simply update the balance for the last fetched address.
- if (!_.isUndefined(this._prevUserAddressIfExists)) {
- await this._updateUserWeiBalanceAsync(this._prevUserAddressIfExists);
- }
- }
- },
+ this._prevUserEtherBalanceInWei = undefined;
+ await this._updateBalanceAsync();
+ this._watchBalanceIntervalId = intervalUtils.setAsyncExcludingInterval(
+ this._updateBalanceAsync.bind(this),
5000,
(err: Error) => {
logUtils.log(`Watching network and balances failed: ${err.stack}`);
- this._stopEmittingNetworkConnectionAndUserBalanceStateAsync();
+ this._stopEmittingUserBalanceState();
},
);
}
- private async _updateUserWeiBalanceAsync(userAddress: string) {
+ private async _updateBalanceAsync(): Promise<void> {
+ const currentNodeVersion = await this._web3Wrapper.getNodeVersionAsync();
+ if (this._prevNodeVersionIfExists !== currentNodeVersion) {
+ this._prevNodeVersionIfExists = currentNodeVersion;
+ this._dispatcher.updateNodeVersion(currentNodeVersion);
+ }
+
+ if (this._shouldPollUserAddress) {
+ const addresses = await this._web3Wrapper.getAvailableAddressesAsync();
+ const userAddressIfExists = addresses[0];
+ // Update makerAddress on network change
+ if (this._prevUserAddressIfExists !== userAddressIfExists) {
+ this._prevUserAddressIfExists = userAddressIfExists;
+ this._dispatcher.updateUserAddress(userAddressIfExists);
+ }
+
+ // Check for user ether balance changes
+ if (!_.isUndefined(userAddressIfExists)) {
+ await this._updateUserWeiBalanceAsync(userAddressIfExists);
+ }
+ } else {
+ // This logic is primarily for the Ledger, since we don't regularly poll for the address
+ // we simply update the balance for the last fetched address.
+ if (!_.isUndefined(this._prevUserAddressIfExists)) {
+ await this._updateUserWeiBalanceAsync(this._prevUserAddressIfExists);
+ }
+ }
+ }
+ private async _updateUserWeiBalanceAsync(userAddress: string): Promise<void> {
const balanceInWei = await this._web3Wrapper.getBalanceInWeiAsync(userAddress);
- if (!balanceInWei.eq(this._prevUserEtherBalanceInWei)) {
+ if (_.isUndefined(this._prevUserEtherBalanceInWei) || !balanceInWei.eq(this._prevUserEtherBalanceInWei)) {
this._prevUserEtherBalanceInWei = balanceInWei;
this._dispatcher.updateUserWeiBalance(balanceInWei);
}
}
- private _stopEmittingNetworkConnectionAndUserBalanceStateAsync() {
- if (!_.isUndefined(this._watchNetworkAndBalanceIntervalId)) {
- intervalUtils.clearAsyncExcludingInterval(this._watchNetworkAndBalanceIntervalId);
+ private _stopEmittingUserBalanceState(): void {
+ if (!_.isUndefined(this._watchBalanceIntervalId)) {
+ intervalUtils.clearAsyncExcludingInterval(this._watchBalanceIntervalId);
}
}
}
diff --git a/packages/website/ts/components/dialogs/blockchain_err_dialog.tsx b/packages/website/ts/components/dialogs/blockchain_err_dialog.tsx
index 1c3b7458d..c8e10303f 100644
--- a/packages/website/ts/components/dialogs/blockchain_err_dialog.tsx
+++ b/packages/website/ts/components/dialogs/blockchain_err_dialog.tsx
@@ -1,11 +1,9 @@
import { colors, Networks } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
import { BlockchainErrs } from 'ts/types';
-import { configs } from 'ts/utils/configs';
import { constants } from 'ts/utils/constants';
interface BlockchainErrDialogProps {
@@ -18,7 +16,7 @@ interface BlockchainErrDialogProps {
}
export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProps, undefined> {
- public render() {
+ public render(): React.ReactNode {
const dialogActions = [
<FlatButton
key="blockchainErrOk"
@@ -45,7 +43,7 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
</Dialog>
);
}
- private _getTitle(hasWalletAddress: boolean) {
+ private _getTitle(hasWalletAddress: boolean): string {
if (this.props.blockchainErr === BlockchainErrs.AContractNotDeployedOnNetwork) {
return '0x smart contracts not found';
} else if (!hasWalletAddress) {
@@ -58,7 +56,7 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
return 'Unexpected error';
}
}
- private _renderExplanation(hasWalletAddress: boolean) {
+ private _renderExplanation(hasWalletAddress: boolean): React.ReactNode {
if (this.props.blockchainErr === BlockchainErrs.AContractNotDeployedOnNetwork) {
return this._renderContractsNotDeployedExplanation();
} else if (!hasWalletAddress) {
@@ -71,7 +69,7 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
return this._renderUnexpectedErrorExplanation();
}
}
- private _renderDisconnectedFromNode() {
+ private _renderDisconnectedFromNode(): React.ReactNode {
return (
<div>
You were disconnected from the backing Ethereum node. If using{' '}
@@ -86,7 +84,7 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
</div>
);
}
- private _renderDefaultTokenNotInTokenRegistry() {
+ private _renderDefaultTokenNotInTokenRegistry(): React.ReactNode {
return (
<div>
The TokenRegistry deployed on your network does not contain the needed default tokens for 0x Portal to
@@ -96,10 +94,10 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
</div>
);
}
- private _renderUnexpectedErrorExplanation() {
+ private _renderUnexpectedErrorExplanation(): React.ReactNode {
return <div>We encountered an unexpected error. Please try refreshing the page.</div>;
}
- private _renderNoWalletFoundExplanation() {
+ private _renderNoWalletFoundExplanation(): React.ReactNode {
return (
<div>
<div>
@@ -126,8 +124,7 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
Parity Signer Chrome extension
</a>{' '}
lets you connect to a locally running Parity node. Make sure you have started your local Parity node
- with {configs.IS_MAINNET_ENABLED && '`parity ui` or'} `parity --chain kovan ui` in order to connect
- to {configs.IS_MAINNET_ENABLED ? 'mainnet or Kovan respectively.' : 'Kovan.'}
+ with `parity ui` or `parity --chain kovan ui` in order to connect to mainnet or Kovan respectively.
</div>
<div className="pt2">
<span className="bold">Note:</span> If you have done one of the above steps and are still seeing
@@ -137,16 +134,14 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
</div>
);
}
- private _renderContractsNotDeployedExplanation() {
+ private _renderContractsNotDeployedExplanation(): React.ReactNode {
return (
<div>
<div>
The 0x smart contracts are not deployed on the Ethereum network you are currently connected to
(network Id: {this.props.networkId}). In order to use the 0x portal dApp, please connect to the{' '}
- {Networks.Kovan} testnet (network Id: {constants.NETWORK_ID_KOVAN})
- {configs.IS_MAINNET_ENABLED
- ? ` or ${constants.MAINNET_NAME} (network Id: ${constants.NETWORK_ID_MAINNET}).`
- : `.`}
+ {Networks.Kovan} testnet (network Id: {constants.NETWORK_ID_KOVAN}) or ${constants.MAINNET_NAME}{' '}
+ (network Id: ${constants.NETWORK_ID_MAINNET}).
</div>
<h4>Metamask</h4>
<div>
@@ -160,11 +155,8 @@ export class BlockchainErrDialog extends React.Component<BlockchainErrDialogProp
If using the{' '}
<a href={constants.URL_PARITY_CHROME_STORE} target="_blank">
Parity Signer Chrome extension
- </a>, make sure to start your local Parity node with{' '}
- {configs.IS_MAINNET_ENABLED
- ? '`parity ui` or `parity --chain Kovan ui` in order to connect to mainnet \
- or Kovan respectively.'
- : '`parity --chain kovan ui` in order to connect to Kovan.'}
+ </a>, make sure to start your local Parity node with `parity ui` or `parity --chain Kovan ui` in
+ order to connect to mainnet \ or Kovan respectively.
</div>
</div>
);
diff --git a/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx b/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
index 42ca1713d..5f4bf8519 100644
--- a/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
+++ b/packages/website/ts/components/dialogs/eth_weth_conversion_dialog.tsx
@@ -1,4 +1,3 @@
-import { ZeroEx } from '0x.js';
import { colors } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
@@ -6,10 +5,9 @@ import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
-import { EthAmountInput } from 'ts/components/inputs/eth_amount_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Side, Token } from 'ts/types';
-import { constants } from 'ts/utils/constants';
interface EthWethConversionDialogProps {
blockchain: Blockchain;
@@ -20,7 +18,7 @@ interface EthWethConversionDialogProps {
onCancelled: () => void;
isOpen: boolean;
token: Token;
- etherBalanceInWei: BigNumber;
+ etherBalanceInWei?: BigNumber;
lastForceTokenStateRefetch: number;
}
@@ -47,20 +45,20 @@ export class EthWethConversionDialog extends React.Component<
ethTokenBalance: new BigNumber(0),
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
// tslint:disable-next-line:no-floating-promises
this._fetchEthTokenBalanceAsync();
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public render() {
+ public render(): React.ReactNode {
const convertDialogActions = [
<FlatButton key="cancel" label="Cancel" onTouchTap={this._onCancel.bind(this)} />,
<FlatButton key="convert" label="Convert" primary={true} onTouchTap={this._onConvertClick.bind(this)} />,
];
const title = this.props.direction === Side.Deposit ? 'Wrap ETH' : 'Unwrap WETH';
- return (
+ return !_.isUndefined(this.props.etherBalanceInWei) ? (
<Dialog
title={title}
titleStyle={{ fontWeight: 100 }}
@@ -70,15 +68,14 @@ export class EthWethConversionDialog extends React.Component<
>
{this._renderConversionDialogBody()}
</Dialog>
- );
+ ) : null;
}
- private _renderConversionDialogBody() {
+ private _renderConversionDialogBody(): React.ReactNode {
const explanation =
this.props.direction === Side.Deposit
? 'Convert your Ether into a tokenized, tradable form.'
: "Convert your Wrapped Ether back into it's native form.";
const isWrappedVersion = this.props.direction === Side.Receive;
- const etherBalanceInEth = ZeroEx.toUnitAmount(this.props.etherBalanceInWei, constants.DECIMAL_PLACES_ETH);
return (
<div>
<div className="pb2">{explanation}</div>
@@ -103,16 +100,13 @@ export class EthWethConversionDialog extends React.Component<
shouldCheckAllowance={false}
onChange={this._onValueChange.bind(this)}
amount={this.state.value}
- onVisitBalancesPageClick={this.props.onCancelled}
/>
) : (
<EthAmountInput
- balance={etherBalanceInEth}
amount={this.state.value}
onChange={this._onValueChange.bind(this)}
shouldCheckBalance={true}
shouldShowIncompleteErrs={this.state.shouldShowIncompleteErrs}
- onVisitBalancesPageClick={this.props.onCancelled}
/>
)}
<div className="pt1" style={{ fontSize: 12 }}>
@@ -137,7 +131,7 @@ export class EthWethConversionDialog extends React.Component<
</div>
);
}
- private _renderCurrency(isWrappedVersion: boolean) {
+ private _renderCurrency(isWrappedVersion: boolean): React.ReactNode {
const name = isWrappedVersion ? 'Wrapped Ether' : 'Ether';
const iconUrl = isWrappedVersion ? '/images/token_icons/ether_erc20.png' : '/images/ether.png';
const symbol = isWrappedVersion ? 'WETH' : 'ETH';
@@ -155,18 +149,18 @@ export class EthWethConversionDialog extends React.Component<
</div>
);
}
- private _onMaxClick() {
+ private _onMaxClick(): void {
this.setState({
value: this.state.ethTokenBalance,
});
}
- private _onValueChange(isValid: boolean, amount?: BigNumber) {
+ private _onValueChange(isValid: boolean, amount?: BigNumber): void {
this.setState({
value: amount,
hasErrors: !isValid,
});
}
- private _onConvertClick() {
+ private _onConvertClick(): void {
if (this.state.hasErrors) {
this.setState({
shouldShowIncompleteErrs: true,
@@ -179,13 +173,13 @@ export class EthWethConversionDialog extends React.Component<
this.props.onComplete(this.props.direction, value);
}
}
- private _onCancel() {
+ private _onCancel(): void {
this.setState({
value: undefined,
});
this.props.onCancelled();
}
- private async _fetchEthTokenBalanceAsync() {
+ private async _fetchEthTokenBalanceAsync(): Promise<void> {
const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
const [balance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync(
userAddressIfExists,
diff --git a/packages/website/ts/components/dialogs/ledger_config_dialog.tsx b/packages/website/ts/components/dialogs/ledger_config_dialog.tsx
index d7190c0bb..d2f373d67 100644
--- a/packages/website/ts/components/dialogs/ledger_config_dialog.tsx
+++ b/packages/website/ts/components/dialogs/ledger_config_dialog.tsx
@@ -1,6 +1,6 @@
-import { ZeroEx } from '0x.js';
import { colors, constants as sharedConstants } from '@0xproject/react-shared';
import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
@@ -29,7 +29,7 @@ interface LedgerConfigDialogProps {
toggleDialogFn: (isOpen: boolean) => void;
dispatcher: Dispatcher;
blockchain: Blockchain;
- networkId: number;
+ networkId?: number;
providerType: ProviderType;
}
@@ -44,6 +44,9 @@ interface LedgerConfigDialogState {
}
export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps, LedgerConfigDialogState> {
+ public static defaultProps = {
+ networkId: 1,
+ };
constructor(props: LedgerConfigDialogProps) {
super(props);
const derivationPathIfExists = props.blockchain.getLedgerDerivationPathIfExists();
@@ -59,7 +62,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
preferredNetworkId: props.networkId,
};
}
- public render() {
+ public render(): React.ReactNode {
const dialogActions = [
<FlatButton key="ledgerConnectCancel" label="Cancel" onTouchTap={this._onClose.bind(this)} />,
];
@@ -82,7 +85,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
</Dialog>
);
}
- private _renderConnectStep() {
+ private _renderConnectStep(): React.ReactNode {
const networkIds = _.values(sharedConstants.NETWORK_ID_BY_NAME);
return (
<div>
@@ -122,7 +125,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
</div>
);
}
- private _renderSelectAddressStep() {
+ private _renderSelectAddressStep(): React.ReactNode {
return (
<div>
<div>
@@ -159,7 +162,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
</div>
);
}
- private _renderAddressTableRows() {
+ private _renderAddressTableRows(): React.ReactNode {
const rows = _.map(this.state.userAddresses, (userAddress: string, i: number) => {
const balanceInWei = this.state.addressBalances[i];
const addressTooltipId = `address-${userAddress}`;
@@ -168,7 +171,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
// We specifically prefix kovan ETH.
// TODO: We should probably add prefixes for all networks
const isKovanNetwork = networkName === 'Kovan';
- const balanceInEth = ZeroEx.toUnitAmount(balanceInWei, constants.DECIMAL_PLACES_ETH);
+ const balanceInEth = Web3Wrapper.toUnitAmount(balanceInWei, constants.DECIMAL_PLACES_ETH);
const balanceString = `${balanceInEth.toString()} ${isKovanNetwork ? 'Kovan ' : ''}ETH`;
return (
<TableRow key={userAddress} style={{ height: 40 }}>
@@ -189,7 +192,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
});
return rows;
}
- private _onClose() {
+ private _onClose(): void {
this.setState({
connectionErrMsg: '',
stepIndex: LedgerSteps.CONNECT,
@@ -197,9 +200,8 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
const isOpen = false;
this.props.toggleDialogFn(isOpen);
}
- private _onAddressSelected(selectedRowIndexes: number[]) {
+ private _onAddressSelected(selectedRowIndexes: number[]): void {
const selectedRowIndex = selectedRowIndexes[0];
- this.props.blockchain.updateLedgerDerivationIndex(selectedRowIndex);
const selectedAddress = this.state.userAddresses[selectedRowIndex];
const selectAddressBalance = this.state.addressBalances[selectedRowIndex];
this.props.dispatcher.updateUserAddress(selectedAddress);
@@ -229,7 +231,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
}
return didSucceed;
}
- private async _fetchAddressesAndBalancesAsync() {
+ private async _fetchAddressesAndBalancesAsync(): Promise<boolean> {
let userAddresses: string[];
const addressBalances: BigNumber[] = [];
try {
@@ -251,7 +253,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
});
return true;
}
- private _onDerivationPathChanged(e: any, derivationPath: string) {
+ private _onDerivationPathChanged(_event: any, derivationPath: string): void {
let derivationErrMsg = '';
if (!_.startsWith(derivationPath, VALID_ETHEREUM_DERIVATION_PATH_PREFIX)) {
derivationErrMsg = 'Must be valid Ethereum path.';
@@ -262,7 +264,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
derivationErrMsg,
});
}
- private async _onConnectLedgerClickAsync() {
+ private async _onConnectLedgerClickAsync(): Promise<boolean> {
const isU2FSupported = await utils.isU2FSupportedAsync();
if (!isU2FSupported) {
logUtils.log(`U2F not supported in this browser`);
@@ -283,6 +285,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
if (didSucceed) {
this.setState({
stepIndex: LedgerSteps.SELECT_ADDRESS,
+ connectionErrMsg: '',
});
}
return didSucceed;
@@ -296,7 +299,7 @@ export class LedgerConfigDialog extends React.Component<LedgerConfigDialogProps,
}
return userAddresses;
}
- private _onSelectedNetworkUpdated(e: any, index: number, networkId: number) {
+ private _onSelectedNetworkUpdated(_event: any, _index: number, networkId: number): void {
this.setState({
preferredNetworkId: networkId,
});
diff --git a/packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx b/packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx
index b31667121..41a17fe96 100644
--- a/packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx
+++ b/packages/website/ts/components/dialogs/portal_disclaimer_dialog.tsx
@@ -8,7 +8,7 @@ interface PortalDisclaimerDialogProps {
onToggleDialog: () => void;
}
-export function PortalDisclaimerDialog(props: PortalDisclaimerDialogProps) {
+export const PortalDisclaimerDialog = (props: PortalDisclaimerDialogProps) => {
return (
<Dialog
title="0x Portal Disclaimer"
@@ -33,4 +33,4 @@ export function PortalDisclaimerDialog(props: PortalDisclaimerDialogProps) {
</div>
</Dialog>
);
-}
+};
diff --git a/packages/website/ts/components/dialogs/send_dialog.tsx b/packages/website/ts/components/dialogs/send_dialog.tsx
index 2af7fd7ac..c1179dbd0 100644
--- a/packages/website/ts/components/dialogs/send_dialog.tsx
+++ b/packages/website/ts/components/dialogs/send_dialog.tsx
@@ -6,6 +6,7 @@ import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
import { AddressInput } from 'ts/components/inputs/address_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Token } from 'ts/types';
interface SendDialogProps {
@@ -15,7 +16,7 @@ interface SendDialogProps {
onComplete: (recipient: string, value: BigNumber) => void;
onCancelled: () => void;
isOpen: boolean;
- token: Token;
+ asset: Token | 'ETH';
lastForceTokenStateRefetch: number;
}
@@ -35,7 +36,7 @@ export class SendDialog extends React.Component<SendDialogProps, SendDialogState
isAmountValid: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const transferDialogActions = [
<FlatButton key="cancelTransfer" label="Cancel" onTouchTap={this._onCancel.bind(this)} />,
<FlatButton
@@ -57,48 +58,60 @@ export class SendDialog extends React.Component<SendDialogProps, SendDialogState
</Dialog>
);
}
- private _renderSendDialogBody() {
- return (
- <div className="mx-auto" style={{ maxWidth: 300 }}>
- <div style={{ height: 80 }}>
- <AddressInput
- initialAddress={this.state.recipient}
- updateAddress={this._onRecipientChange.bind(this)}
- isRequired={true}
- label={'Recipient address'}
- hintText={'Address'}
- />
- </div>
+ private _renderSendDialogBody(): React.ReactNode {
+ const input =
+ this.props.asset === 'ETH' ? (
+ <EthAmountInput
+ label="Amount to send"
+ shouldShowIncompleteErrs={this.state.shouldShowIncompleteErrs}
+ shouldCheckBalance={true}
+ shouldShowErrs={true}
+ onChange={this._onValueChange.bind(this)}
+ amount={this.state.value}
+ />
+ ) : (
<TokenAmountInput
blockchain={this.props.blockchain}
userAddress={this.props.userAddress}
networkId={this.props.networkId}
label="Amount to send"
- token={this.props.token}
+ token={this.props.asset}
shouldShowIncompleteErrs={this.state.shouldShowIncompleteErrs}
shouldCheckBalance={true}
shouldCheckAllowance={false}
onChange={this._onValueChange.bind(this)}
amount={this.state.value}
- onVisitBalancesPageClick={this.props.onCancelled}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
+ );
+ return (
+ <div className="mx-auto" style={{ maxWidth: 300 }}>
+ <div style={{ height: 80 }}>
+ <AddressInput
+ initialAddress={this.state.recipient}
+ updateAddress={this._onRecipientChange.bind(this)}
+ isRequired={true}
+ label="Recipient address'"
+ hintText="Address"
+ />
+ </div>
+ {input}
</div>
);
}
- private _onRecipientChange(recipient?: string) {
+ private _onRecipientChange(recipient?: string): void {
this.setState({
shouldShowIncompleteErrs: false,
recipient,
});
}
- private _onValueChange(isValid: boolean, amount?: BigNumber) {
+ private _onValueChange(isValid: boolean, amount?: BigNumber): void {
this.setState({
isAmountValid: isValid,
value: amount,
});
}
- private _onSendClick() {
+ private _onSendClick(): void {
if (this._hasErrors()) {
this.setState({
shouldShowIncompleteErrs: true,
@@ -112,13 +125,13 @@ export class SendDialog extends React.Component<SendDialogProps, SendDialogState
this.props.onComplete(this.state.recipient, value);
}
}
- private _onCancel() {
+ private _onCancel(): void {
this.setState({
value: undefined,
});
this.props.onCancelled();
}
- private _hasErrors() {
+ private _hasErrors(): boolean {
return _.isUndefined(this.state.recipient) || _.isUndefined(this.state.value) || !this.state.isAmountValid;
}
}
diff --git a/packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx b/packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx
index bb7e3ed1a..3751ce06f 100644
--- a/packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx
+++ b/packages/website/ts/components/dialogs/track_token_confirmation_dialog.tsx
@@ -1,6 +1,6 @@
-import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
+import * as moment from 'moment';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
import { TrackTokenConfirmation } from 'ts/components/track_token_confirmation';
@@ -33,7 +33,7 @@ export class TrackTokenConfirmationDialog extends React.Component<
isAddingTokenToTracked: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const tokens = this.props.tokens;
return (
<Dialog
@@ -66,7 +66,7 @@ export class TrackTokenConfirmationDialog extends React.Component<
</Dialog>
);
}
- private async _onTrackConfirmationRespondedAsync(didUserAcceptTracking: boolean) {
+ private async _onTrackConfirmationRespondedAsync(didUserAcceptTracking: boolean): Promise<void> {
if (!didUserAcceptTracking) {
this.props.onToggleDialog(didUserAcceptTracking);
return;
@@ -74,12 +74,13 @@ export class TrackTokenConfirmationDialog extends React.Component<
this.setState({
isAddingTokenToTracked: true,
});
+ const currentTimestamp = moment().unix();
for (const token of this.props.tokens) {
const newTokenEntry = {
...token,
+ trackedTimestamp: currentTimestamp,
};
- newTokenEntry.isTracked = true;
trackedTokenStorage.addTrackedTokenToUser(this.props.userAddress, this.props.networkId, newTokenEntry);
this.props.dispatcher.updateTokenByAddress([newTokenEntry]);
}
diff --git a/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx b/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
index 6ac9cf917..3ebab03ef 100644
--- a/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
+++ b/packages/website/ts/components/dialogs/u2f_not_supported_dialog.tsx
@@ -9,14 +9,14 @@ interface U2fNotSupportedDialogProps {
onToggleDialog: () => void;
}
-export function U2fNotSupportedDialog(props: U2fNotSupportedDialogProps) {
+export const U2fNotSupportedDialog = (props: U2fNotSupportedDialogProps) => {
return (
<Dialog
title="U2F Not Supported"
titleStyle={{ fontWeight: 100 }}
- actions={[<FlatButton key="u2fNo" label="Ok" onTouchTap={props.onToggleDialog.bind(this)} />]}
+ actions={[<FlatButton key="u2fNo" label="Ok" onTouchTap={props.onToggleDialog} />]}
open={props.isOpen}
- onRequestClose={props.onToggleDialog.bind(this)}
+ onRequestClose={props.onToggleDialog}
autoScrollBodyContent={true}
>
<div className="pt2" style={{ color: colors.grey700 }}>
@@ -43,4 +43,4 @@ export function U2fNotSupportedDialog(props: U2fNotSupportedDialogProps) {
</div>
</Dialog>
);
-}
+};
diff --git a/packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx b/packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx
index 9e91ff12d..78b270c1e 100644
--- a/packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx
+++ b/packages/website/ts/components/dialogs/wrapped_eth_section_notice_dialog.tsx
@@ -8,7 +8,7 @@ interface WrappedEthSectionNoticeDialogProps {
onToggleDialog: () => void;
}
-export function WrappedEthSectionNoticeDialog(props: WrappedEthSectionNoticeDialogProps) {
+export const WrappedEthSectionNoticeDialog = (props: WrappedEthSectionNoticeDialogProps) => {
return (
<Dialog
title="Dedicated Wrapped Ether Section"
@@ -30,4 +30,4 @@ export function WrappedEthSectionNoticeDialog(props: WrappedEthSectionNoticeDial
</div>
</Dialog>
);
-}
+};
diff --git a/packages/website/ts/components/dropdowns/network_drop_down.tsx b/packages/website/ts/components/dropdowns/network_drop_down.tsx
index b569807dd..2fd2785d1 100644
--- a/packages/website/ts/components/dropdowns/network_drop_down.tsx
+++ b/packages/website/ts/components/dropdowns/network_drop_down.tsx
@@ -13,7 +13,7 @@ interface NetworkDropDownProps {
interface NetworkDropDownState {}
export class NetworkDropDown extends React.Component<NetworkDropDownProps, NetworkDropDownState> {
- public render() {
+ public render(): React.ReactNode {
return (
<div className="mx-auto" style={{ width: 120 }}>
<DropDownMenu value={this.props.selectedNetworkId} onChange={this.props.updateSelectedNetwork}>
@@ -22,7 +22,7 @@ export class NetworkDropDown extends React.Component<NetworkDropDownProps, Netwo
</div>
);
}
- private _renderDropDownItems() {
+ private _renderDropDownItems(): React.ReactNode {
const items = _.map(this.props.avialableNetworkIds, networkId => {
const networkName = sharedConstants.NETWORK_NAME_BY_ID[networkId];
const primaryText = (
diff --git a/packages/website/ts/components/eth_weth_conversion_button.tsx b/packages/website/ts/components/eth_weth_conversion_button.tsx
index 586d260fb..b0091a1c1 100644
--- a/packages/website/ts/components/eth_weth_conversion_button.tsx
+++ b/packages/website/ts/components/eth_weth_conversion_button.tsx
@@ -1,5 +1,5 @@
-import { ZeroEx } from '0x.js';
import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react';
@@ -37,7 +37,7 @@ export class EthWethConversionButton extends React.Component<
> {
public static defaultProps: Partial<EthWethConversionButtonProps> = {
isDisabled: false,
- onConversionSuccessful: _.noop,
+ onConversionSuccessful: _.noop.bind(_),
};
public constructor(props: EthWethConversionButtonProps) {
super(props);
@@ -46,7 +46,7 @@ export class EthWethConversionButton extends React.Component<
isEthConversionHappening: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const labelStyle = this.state.isEthConversionHappening ? { fontSize: 10 } : {};
let callToActionLabel;
let inProgressLabel;
@@ -81,12 +81,12 @@ export class EthWethConversionButton extends React.Component<
</div>
);
}
- private _toggleConversionDialog() {
+ private _toggleConversionDialog(): void {
this.setState({
isEthConversionDialogVisible: !this.state.isEthConversionDialogVisible,
});
}
- private async _onConversionAmountSelectedAsync(direction: Side, value: BigNumber) {
+ private async _onConversionAmountSelectedAsync(direction: Side, value: BigNumber): Promise<void> {
this.setState({
isEthConversionHappening: true,
});
@@ -95,11 +95,11 @@ export class EthWethConversionButton extends React.Component<
try {
if (direction === Side.Deposit) {
await this.props.blockchain.convertEthToWrappedEthTokensAsync(token.address, value);
- const ethAmount = ZeroEx.toUnitAmount(value, constants.DECIMAL_PLACES_ETH);
+ const ethAmount = Web3Wrapper.toUnitAmount(value, constants.DECIMAL_PLACES_ETH);
this.props.dispatcher.showFlashMessage(`Successfully wrapped ${ethAmount.toString()} ETH to WETH`);
} else {
await this.props.blockchain.convertWrappedEthTokensToEthAsync(token.address, value);
- const tokenAmount = ZeroEx.toUnitAmount(value, token.decimals);
+ const tokenAmount = Web3Wrapper.toUnitAmount(value, token.decimals);
this.props.dispatcher.showFlashMessage(`Successfully unwrapped ${tokenAmount.toString()} WETH to ETH`);
}
if (!this.props.isOutdatedWrappedEther) {
@@ -118,7 +118,7 @@ export class EthWethConversionButton extends React.Component<
? 'Failed to wrap your ETH. Please try again.'
: 'Failed to unwrap your WETH. Please try again.';
this.props.dispatcher.showFlashMessage(errorMsg);
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
}
}
this.setState({
diff --git a/packages/website/ts/components/eth_wrappers.tsx b/packages/website/ts/components/eth_wrappers.tsx
index 59afeb50b..0b282b2a1 100644
--- a/packages/website/ts/components/eth_wrappers.tsx
+++ b/packages/website/ts/components/eth_wrappers.tsx
@@ -1,6 +1,6 @@
-import { ZeroEx } from '0x.js';
import { colors, EtherscanLinkSuffixes, utils as sharedUtils } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import Divider from 'material-ui/Divider';
import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn } from 'material-ui/Table';
@@ -33,8 +33,9 @@ interface EthWrappersProps {
dispatcher: Dispatcher;
tokenByAddress: TokenByAddress;
userAddress: string;
- userEtherBalanceInWei: BigNumber;
+ userEtherBalanceInWei?: BigNumber;
lastForceTokenStateRefetch: number;
+ isFullWidth?: boolean;
}
interface EthWrappersState {
@@ -43,6 +44,9 @@ interface EthWrappersState {
}
export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersState> {
+ public static defaultProps: Partial<EthWrappersProps> = {
+ isFullWidth: false,
+ };
private _isUnmounted: boolean;
constructor(props: EthWrappersProps) {
super(props);
@@ -65,7 +69,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
},
};
}
- public componentWillReceiveProps(nextProps: EthWrappersProps) {
+ public componentWillReceiveProps(nextProps: EthWrappersProps): void {
if (
nextProps.userAddress !== this.props.userAddress ||
nextProps.networkId !== this.props.networkId ||
@@ -75,30 +79,34 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
this._fetchWETHStateAsync();
}
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
// tslint:disable-next-line:no-floating-promises
this._fetchWETHStateAsync();
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public render() {
+ public render(): React.ReactNode {
const etherToken = this._getEthToken();
- const wethBalance = ZeroEx.toUnitAmount(this.state.ethTokenState.balance, constants.DECIMAL_PLACES_ETH);
+ const wethBalance = Web3Wrapper.toUnitAmount(this.state.ethTokenState.balance, constants.DECIMAL_PLACES_ETH);
const isBidirectional = true;
const etherscanUrl = sharedUtils.getEtherScanLinkIfExists(
etherToken.address,
this.props.networkId,
EtherscanLinkSuffixes.Address,
);
- const tokenLabel = this._renderToken('Wrapped Ether', etherToken.address, configs.ICON_URL_BY_SYMBOL.WETH);
- const userEtherBalanceInEth = ZeroEx.toUnitAmount(
- this.props.userEtherBalanceInWei,
- constants.DECIMAL_PLACES_ETH,
+ const tokenLabel = this._renderToken(
+ 'Wrapped Ether',
+ etherToken.address,
+ utils.getTokenIconUrl(etherToken.symbol),
);
+ const userEtherBalanceInEth = !_.isUndefined(this.props.userEtherBalanceInWei)
+ ? Web3Wrapper.toUnitAmount(this.props.userEtherBalanceInWei, constants.DECIMAL_PLACES_ETH)
+ : undefined;
+ const rootClassName = this.props.isFullWidth ? 'clearfix' : 'clearfix lg-px4 md-px4 sm-px2';
return (
- <div className="clearfix lg-px4 md-px4 sm-px2" style={{ minHeight: 600 }}>
+ <div className={rootClassName} style={{ minHeight: 600 }}>
<div className="relative">
<h3>ETH Wrapper</h3>
<div className="absolute" style={{ top: 0, right: 0 }}>
@@ -116,7 +124,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
<div>
<div className="py2">Wrap ETH into an ERC20-compliant Ether token. 1 ETH = 1 WETH.</div>
<div>
- <Table selectable={false} style={{ backgroundColor: colors.grey50 }}>
+ <Table selectable={false} style={{ backgroundColor: 'transparent' }}>
<TableHeader displaySelectAll={false} adjustForCheckbox={false}>
<TableRow>
<TableHeaderColumn>ETH Token</TableHeaderColumn>
@@ -143,7 +151,11 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
</div>
</TableRowColumn>
<TableRowColumn>
- {userEtherBalanceInEth.toFixed(configs.AMOUNT_DISPLAY_PRECSION)} ETH
+ {!_.isUndefined(userEtherBalanceInEth) ? (
+ `${userEtherBalanceInEth.toFixed(configs.AMOUNT_DISPLAY_PRECSION)} ETH`
+ ) : (
+ <i className="zmdi zmdi-spinner zmdi-hc-spin" />
+ )}
</TableRowColumn>
<TableRowColumn>
<EthWethConversionButton
@@ -157,6 +169,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
dispatcher={this.props.dispatcher}
blockchain={this.props.blockchain}
userEtherBalanceInWei={this.props.userEtherBalanceInWei}
+ isDisabled={_.isUndefined(userEtherBalanceInEth)}
/>
</TableRowColumn>
</TableRow>
@@ -203,7 +216,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
it to the updated WETH token.
</div>
<div>
- <Table selectable={false} style={{ backgroundColor: colors.grey50 }}>
+ <Table selectable={false} style={{ backgroundColor: 'transparent' }}>
<TableHeader displaySelectAll={false} adjustForCheckbox={false}>
<TableRow>
<TableHeaderColumn>WETH Version</TableHeaderColumn>
@@ -213,16 +226,14 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
</TableHeaderColumn>
</TableRow>
</TableHeader>
- <TableBody displayRowCheckbox={false}>
- {this._renderOutdatedWeths(etherToken, this.state.ethTokenState)}
- </TableBody>
+ <TableBody displayRowCheckbox={false}>{this._renderOutdatedWeths(etherToken)}</TableBody>
</Table>
</div>
</div>
</div>
);
}
- private _renderActionColumnTitle(isBidirectional: boolean) {
+ private _renderActionColumnTitle(isBidirectional: boolean): React.ReactNode {
let iconClass = 'zmdi-long-arrow-right';
let leftSymbol = 'WETH';
let rightSymbol = 'ETH';
@@ -241,7 +252,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
</div>
);
}
- private _renderOutdatedWeths(etherToken: Token, etherTokenState: TokenState) {
+ private _renderOutdatedWeths(etherToken: Token): React.ReactNode {
const rows = _.map(
configs.OUTDATED_WRAPPED_ETHERS,
(outdatedWETHByNetworkId: OutdatedWrappedEtherByNetworkId) => {
@@ -265,7 +276,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
const outdatedEtherTokenState = this.state.outdatedWETHStateByAddress[outdatedWETHIfExists.address];
const isStateLoaded = outdatedEtherTokenState.isLoaded;
const balanceInEthIfExists = isStateLoaded
- ? ZeroEx.toUnitAmount(outdatedEtherTokenState.balance, constants.DECIMAL_PLACES_ETH).toFixed(
+ ? Web3Wrapper.toUnitAmount(outdatedEtherTokenState.balance, constants.DECIMAL_PLACES_ETH).toFixed(
configs.AMOUNT_DISPLAY_PRECSION,
)
: undefined;
@@ -313,7 +324,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
);
return rows;
}
- private _renderTokenLink(tokenLabel: React.ReactNode, etherscanUrl: string) {
+ private _renderTokenLink(tokenLabel: React.ReactNode, etherscanUrl: string): React.ReactNode {
return (
<span>
{_.isUndefined(etherscanUrl) ? (
@@ -326,7 +337,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
</span>
);
}
- private _renderToken(name: string, address: string, imgPath: string) {
+ private _renderToken(name: string, address: string, imgPath: string): React.ReactNode {
const tooltipId = `tooltip-${address}`;
return (
<div className="flex">
@@ -340,7 +351,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
</div>
);
}
- private async _onOutdatedConversionSuccessfulAsync(outdatedWETHAddress: string) {
+ private async _onOutdatedConversionSuccessfulAsync(outdatedWETHAddress: string): Promise<void> {
const currentOutdatedWETHState = this.state.outdatedWETHStateByAddress[outdatedWETHAddress];
this.setState({
outdatedWETHStateByAddress: {
@@ -368,7 +379,7 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
},
});
}
- private async _fetchWETHStateAsync() {
+ private async _fetchWETHStateAsync(): Promise<void> {
const tokens = _.values(this.props.tokenByAddress);
const wethToken = _.find(tokens, token => token.symbol === 'WETH');
const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
@@ -414,12 +425,12 @@ export class EthWrappers extends React.Component<EthWrappersProps, EthWrappersSt
);
return outdatedWETHAddresses;
}
- private _getEthToken() {
+ private _getEthToken(): Token {
const tokens = _.values(this.props.tokenByAddress);
const etherToken = _.find(tokens, { symbol: 'WETH' });
return etherToken;
}
- private async _refetchEthTokenStateAsync() {
+ private async _refetchEthTokenStateAsync(): Promise<void> {
const etherToken = this._getEthToken();
const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync(
diff --git a/packages/website/ts/components/fill_order.tsx b/packages/website/ts/components/fill_order.tsx
index ea94e0987..7da2e0870 100644
--- a/packages/website/ts/components/fill_order.tsx
+++ b/packages/website/ts/components/fill_order.tsx
@@ -1,6 +1,8 @@
-import { Order as ZeroExOrder, ZeroEx } from '0x.js';
-import { colors, constants as sharedConstants } from '@0xproject/react-shared';
+import { getOrderHashHex, isValidSignature } from '@0xproject/order-utils';
+import { colors } from '@0xproject/react-shared';
+import { Order as ZeroExOrder } from '@0xproject/types';
import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as accounting from 'accounting';
import * as _ from 'lodash';
import { Card, CardHeader, CardText } from 'material-ui/Card';
@@ -37,6 +39,8 @@ interface FillOrderProps {
initialOrder: Order;
dispatcher: Dispatcher;
lastForceTokenStateRefetch: number;
+ isFullWidth?: boolean;
+ shouldHideHeader?: boolean;
}
interface FillOrderState {
@@ -59,6 +63,10 @@ interface FillOrderState {
}
export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
+ public static defaultProps: Partial<FillOrderProps> = {
+ isFullWidth: false,
+ shouldHideHeader: false,
+ };
private _isUnmounted: boolean;
constructor(props: FillOrderProps) {
super(props);
@@ -82,23 +90,28 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
tokensToTrack: [],
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
if (!_.isEmpty(this.state.orderJSON)) {
// tslint:disable-next-line:no-floating-promises
this._validateFillOrderFireAndForgetAsync(this.state.orderJSON);
}
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public render() {
+ public render(): React.ReactNode {
+ const rootClassName = this.props.isFullWidth ? 'clearfix' : 'lg-px4 md-px4 sm-px2';
return (
- <div className="clearfix lg-px4 md-px4 sm-px2" style={{ minHeight: 600 }}>
- <h3>Fill an order</h3>
- <Divider />
+ <div className={rootClassName} style={{ minHeight: 600 }}>
+ {!this.props.shouldHideHeader && (
+ <div>
+ <h3>Fill an order</h3>
+ <Divider />
+ </div>
+ )}
<div>
{!this.props.isOrderInUrl && (
<div>
@@ -159,7 +172,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
</div>
);
}
- private _renderOrderJsonNotices() {
+ private _renderOrderJsonNotices(): React.ReactNode {
return (
<div>
{!_.isUndefined(this.props.initialOrder) &&
@@ -177,7 +190,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
</div>
);
}
- private _renderVisualOrder() {
+ private _renderVisualOrder(): React.ReactNode {
const takerTokenAddress = this.state.parsedOrder.signedOrder.takerTokenAddress;
const takerToken = this.props.tokenByAddress[takerTokenAddress];
const orderTakerAmount = new BigNumber(this.state.parsedOrder.signedOrder.takerTokenAmount);
@@ -306,7 +319,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
</div>
);
}
- private _renderFillSuccessMsg() {
+ private _renderFillSuccessMsg(): React.ReactNode {
return (
<div>
Order successfully filled. See the trade details in your{' '}
@@ -316,10 +329,10 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
</div>
);
}
- private _renderCancelSuccessMsg() {
+ private _renderCancelSuccessMsg(): React.ReactNode {
return <div>Order successfully cancelled.</div>;
}
- private _onFillOrderClick() {
+ private _onFillOrderClick(): void {
if (!this.state.isMakerTokenAddressInRegistry || !this.state.isTakerTokenAddressInRegistry) {
this.setState({
isFillWarningDialogOpen: true,
@@ -329,7 +342,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
this._onFillOrderClickFireAndForgetAsync();
}
}
- private _onFillWarningClosed(didUserCancel: boolean) {
+ private _onFillWarningClosed(didUserCancel: boolean): void {
this.setState({
isFillWarningDialogOpen: false,
});
@@ -338,10 +351,10 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
this._onFillOrderClickFireAndForgetAsync();
}
}
- private _onFillAmountChange(isValid: boolean, amount?: BigNumber) {
+ private _onFillAmountChange(_isValid: boolean, amount?: BigNumber): void {
this.props.dispatcher.updateOrderFillAmount(amount);
}
- private _onFillOrderJSONChanged(event: any) {
+ private _onFillOrderJSONChanged(event: any): void {
const orderJSON = event.target.value;
this.setState({
didOrderValidationRun: _.isEmpty(orderJSON) && _.isEmpty(this.state.orderJSONErrMsg),
@@ -350,7 +363,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
// tslint:disable-next-line:no-floating-promises
this._validateFillOrderFireAndForgetAsync(orderJSON);
}
- private async _checkForUntrackedTokensAndAskToAdd() {
+ private async _checkForUntrackedTokensAndAskToAddAsync(): Promise<void> {
if (!_.isEmpty(this.state.orderJSONErrMsg)) {
return;
}
@@ -360,26 +373,26 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
const tokensToTrack: Token[] = [];
const isUnseenMakerToken = _.isUndefined(makerTokenIfExists);
- const isMakerTokenTracked = !_.isUndefined(makerTokenIfExists) && makerTokenIfExists.isTracked;
+ const isMakerTokenTracked = !_.isUndefined(makerTokenIfExists) && utils.isTokenTracked(makerTokenIfExists);
if (isUnseenMakerToken) {
tokensToTrack.push({
...this.state.parsedOrder.metadata.makerToken,
address: this.state.parsedOrder.signedOrder.makerTokenAddress,
iconUrl: undefined,
- isTracked: false,
+ trackedTimestamp: undefined,
isRegistered: false,
});
} else if (!isMakerTokenTracked) {
tokensToTrack.push(makerTokenIfExists);
}
const isUnseenTakerToken = _.isUndefined(takerTokenIfExists);
- const isTakerTokenTracked = !_.isUndefined(takerTokenIfExists) && takerTokenIfExists.isTracked;
+ const isTakerTokenTracked = !_.isUndefined(takerTokenIfExists) && utils.isTokenTracked(takerTokenIfExists);
if (isUnseenTakerToken) {
tokensToTrack.push({
...this.state.parsedOrder.metadata.takerToken,
address: this.state.parsedOrder.signedOrder.takerTokenAddress,
iconUrl: undefined,
- isTracked: false,
+ trackedTimestamp: undefined,
isRegistered: false,
});
} else if (!isTakerTokenTracked) {
@@ -396,7 +409,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
});
}
}
- private async _validateFillOrderFireAndForgetAsync(orderJSON: string) {
+ private async _validateFillOrderFireAndForgetAsync(orderJSON: string): Promise<void> {
let orderJSONErrMsg = '';
let parsedOrder: Order;
let orderHash: string;
@@ -433,15 +446,15 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
takerTokenAddress: parsedOrder.signedOrder.takerTokenAddress,
takerTokenAmount: takerAmount,
};
- orderHash = ZeroEx.getOrderHashHex(zeroExOrder);
+ orderHash = getOrderHashHex(zeroExOrder);
const exchangeContractAddr = this.props.blockchain.getExchangeContractAddressIfExists();
const signature = parsedOrder.signedOrder.ecSignature;
- const isValidSignature = ZeroEx.isValidSignature(orderHash, signature, parsedOrder.signedOrder.maker);
+ const isSignatureValid = isValidSignature(orderHash, signature, parsedOrder.signedOrder.maker);
if (exchangeContractAddr !== parsedOrder.signedOrder.exchangeContractAddress) {
orderJSONErrMsg = 'This order was made on another network or using a deprecated Exchange contract';
parsedOrder = undefined;
- } else if (!isValidSignature) {
+ } else if (!isSignatureValid) {
orderJSONErrMsg = 'Order signature is invalid';
parsedOrder = undefined;
} else {
@@ -491,7 +504,11 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
unavailableTakerAmount,
});
- await this._checkForUntrackedTokensAndAskToAdd();
+ await this._checkForUntrackedTokensAndAskToAddAsync();
+ }
+ private _trackOrderEvent(eventName: string): void {
+ const parsedOrder = this.state.parsedOrder;
+ analytics.trackOrderEvent(eventName, parsedOrder);
}
private async _onFillOrderClickFireAndForgetAsync(): Promise<void> {
if (this.props.blockchainErr !== BlockchainErrs.NoError || _.isEmpty(this.props.userAddress)) {
@@ -539,14 +556,12 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
});
return;
}
- const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
- const eventLabel = `${parsedOrder.metadata.takerToken.symbol}-${networkName}`;
try {
const orderFilledAmount: BigNumber = await this.props.blockchain.fillOrderAsync(
signedOrder,
this.props.orderFillAmount,
);
- analytics.logEvent('Portal', 'Fill Order Success', eventLabel, parsedOrder.signedOrder.takerTokenAmount);
+ this._trackOrderEvent('Fill Order Success');
// After fill completes, let's force fetch the token balances
this.props.dispatcher.forceTokenStateRefetch();
this.setState({
@@ -560,7 +575,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
this.setState({
isFilling: false,
});
- analytics.logEvent('Portal', 'Fill Order Failure', eventLabel, parsedOrder.signedOrder.takerTokenAmount);
+ this._trackOrderEvent('Fill Order Failure');
const errMsg = `${err}`;
if (utils.didUserDenyWeb3Request(errMsg)) {
return;
@@ -570,7 +585,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
this.setState({
globalErrMsg,
});
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
return;
}
}
@@ -600,7 +615,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
const takerTokenAmount = new BigNumber(parsedOrder.signedOrder.takerTokenAmount);
const signedOrder = this.props.blockchain.portalOrderToZeroExOrder(parsedOrder);
- const orderHash = ZeroEx.getOrderHashHex(signedOrder);
+ const orderHash = getOrderHashHex(signedOrder);
const unavailableTakerAmount = await this.props.blockchain.getUnavailableTakerAmountAsync(orderHash);
const availableTakerTokenAmount = takerTokenAmount.minus(unavailableTakerAmount);
try {
@@ -615,8 +630,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
});
return;
}
- const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
- const eventLabel = `${parsedOrder.metadata.makerToken.symbol}-${networkName}`;
try {
await this.props.blockchain.cancelOrderAsync(signedOrder, availableTakerTokenAmount);
this.setState({
@@ -625,7 +638,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
globalErrMsg: '',
unavailableTakerAmount: takerTokenAmount,
});
- analytics.logEvent('Portal', 'Cancel Order Success', eventLabel, parsedOrder.signedOrder.makerTokenAmount);
+ this._trackOrderEvent('Cancel Order Success');
return;
} catch (err) {
this.setState({
@@ -635,22 +648,22 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
if (utils.didUserDenyWeb3Request(errMsg)) {
return;
}
- analytics.logEvent('Portal', 'Cancel Order Failure', eventLabel, parsedOrder.signedOrder.makerTokenAmount);
+ this._trackOrderEvent('Cancel Order Failure');
globalErrMsg = 'Failed to cancel order, please refresh and try again';
logUtils.log(`${err}`);
this.setState({
globalErrMsg,
});
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
return;
}
}
private _formatCurrencyAmount(amount: BigNumber, decimals: number): number {
- const unitAmount = ZeroEx.toUnitAmount(amount, decimals);
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
const roundedUnitAmount = Math.round(unitAmount.toNumber() * 100000) / 100000;
return roundedUnitAmount;
}
- private _onToggleTrackConfirmDialog(didConfirmTokenTracking: boolean) {
+ private _onToggleTrackConfirmDialog(didConfirmTokenTracking: boolean): void {
if (!didConfirmTokenTracking) {
this.setState({
orderJSON: '',
diff --git a/packages/website/ts/components/fill_order_json.tsx b/packages/website/ts/components/fill_order_json.tsx
index 7d5351ec4..90eedbb18 100644
--- a/packages/website/ts/components/fill_order_json.tsx
+++ b/packages/website/ts/components/fill_order_json.tsx
@@ -1,4 +1,4 @@
-import { ZeroEx } from '0x.js';
+import { generatePseudoRandomSalt } from '@0xproject/order-utils';
import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
import Paper from 'material-ui/Paper';
@@ -19,7 +19,7 @@ interface FillOrderJSONProps {
interface FillOrderJSONState {}
export class FillOrderJSON extends React.Component<FillOrderJSONProps, FillOrderJSONState> {
- public render() {
+ public render(): React.ReactNode {
const tokenAddresses = _.keys(this.props.tokenByAddress);
const exchangeContract = this.props.blockchain.getExchangeContractAddressIfExists();
const hintSideToAssetToken = {
@@ -38,7 +38,7 @@ export class FillOrderJSON extends React.Component<FillOrderJSONProps, FillOrder
s: '937862111edcba395f8a9e0cc1b2c5e12320...',
v: 27,
};
- const hintSalt = ZeroEx.generatePseudoRandomSalt();
+ const hintSalt = generatePseudoRandomSalt();
const feeRecipient = constants.NULL_ADDRESS;
const hintOrder = utils.generateOrder(
exchangeContract,
diff --git a/packages/website/ts/components/fill_warning_dialog.tsx b/packages/website/ts/components/fill_warning_dialog.tsx
index d3215a6c1..45c492221 100644
--- a/packages/website/ts/components/fill_warning_dialog.tsx
+++ b/packages/website/ts/components/fill_warning_dialog.tsx
@@ -8,7 +8,7 @@ interface FillWarningDialogProps {
onToggleDialog: (didUserCancel: boolean) => void;
}
-export function FillWarningDialog(props: FillWarningDialogProps) {
+export const FillWarningDialog = (props: FillWarningDialogProps) => {
const didCancel = true;
return (
<Dialog
@@ -18,16 +18,16 @@ export function FillWarningDialog(props: FillWarningDialogProps) {
<FlatButton
key="fillWarningCancel"
label="Cancel"
- onTouchTap={props.onToggleDialog.bind(this, didCancel)}
+ onTouchTap={() => props.onToggleDialog(didCancel)} // tslint:disable-line:jsx-no-lambda
/>,
<FlatButton
key="fillWarningContinue"
label="Fill Order"
- onTouchTap={props.onToggleDialog.bind(this, !didCancel)}
+ onTouchTap={() => props.onToggleDialog(!didCancel)} // tslint:disable-line:jsx-no-lambda
/>,
]}
open={props.isOpen}
- onRequestClose={props.onToggleDialog.bind(this)}
+ onRequestClose={() => props.onToggleDialog(didCancel)} // tslint:disable-line:jsx-no-lambda
autoScrollBodyContent={true}
modal={true}
>
@@ -42,4 +42,4 @@ export function FillWarningDialog(props: FillWarningDialogProps) {
</div>
</Dialog>
);
-}
+};
diff --git a/packages/website/ts/components/flash_messages/asset_send_completed.tsx b/packages/website/ts/components/flash_messages/asset_send_completed.tsx
new file mode 100644
index 000000000..f76e05fe1
--- /dev/null
+++ b/packages/website/ts/components/flash_messages/asset_send_completed.tsx
@@ -0,0 +1,34 @@
+import { colors } from '@0xproject/react-shared';
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as _ from 'lodash';
+import * as React from 'react';
+import { utils } from 'ts/utils/utils';
+
+interface AssetSendCompletedProps {
+ etherScanLinkIfExists?: string;
+ toAddress: string;
+ amountInBaseUnits: BigNumber;
+ decimals: number;
+ symbol: string;
+}
+
+interface AssetSendCompletedState {}
+
+export class AssetSendCompleted extends React.Component<AssetSendCompletedProps, AssetSendCompletedState> {
+ public render(): React.ReactNode {
+ const etherScanLink = !_.isUndefined(this.props.etherScanLinkIfExists) && (
+ <a style={{ color: colors.white }} href={`${this.props.etherScanLinkIfExists}`} target="_blank">
+ Verify on Etherscan
+ </a>
+ );
+ const amountInUnits = Web3Wrapper.toUnitAmount(this.props.amountInBaseUnits, this.props.decimals);
+ const truncatedAddress = utils.getAddressBeginAndEnd(this.props.toAddress);
+ return (
+ <div>
+ {`Sent ${amountInUnits} ${this.props.symbol} to ${truncatedAddress}: `}
+ {etherScanLink}
+ </div>
+ );
+ }
+}
diff --git a/packages/website/ts/components/flash_messages/token_send_completed.tsx b/packages/website/ts/components/flash_messages/token_send_completed.tsx
deleted file mode 100644
index a3b056758..000000000
--- a/packages/website/ts/components/flash_messages/token_send_completed.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import { ZeroEx } from '0x.js';
-import { colors } from '@0xproject/react-shared';
-import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
-import * as React from 'react';
-import { Token } from 'ts/types';
-import { utils } from 'ts/utils/utils';
-
-interface TokenSendCompletedProps {
- etherScanLinkIfExists?: string;
- token: Token;
- toAddress: string;
- amountInBaseUnits: BigNumber;
-}
-
-interface TokenSendCompletedState {}
-
-export class TokenSendCompleted extends React.Component<TokenSendCompletedProps, TokenSendCompletedState> {
- public render() {
- const etherScanLink = !_.isUndefined(this.props.etherScanLinkIfExists) && (
- <a style={{ color: colors.white }} href={`${this.props.etherScanLinkIfExists}`} target="_blank">
- Verify on Etherscan
- </a>
- );
- const amountInUnits = ZeroEx.toUnitAmount(this.props.amountInBaseUnits, this.props.token.decimals);
- const truncatedAddress = utils.getAddressBeginAndEnd(this.props.toAddress);
- return (
- <div>
- {`Sent ${amountInUnits} ${this.props.token.symbol} to ${truncatedAddress}: `}
- {etherScanLink}
- </div>
- );
- }
-}
diff --git a/packages/website/ts/components/flash_messages/transaction_submitted.tsx b/packages/website/ts/components/flash_messages/transaction_submitted.tsx
index 188f1f9a6..2a6d2a64b 100644
--- a/packages/website/ts/components/flash_messages/transaction_submitted.tsx
+++ b/packages/website/ts/components/flash_messages/transaction_submitted.tsx
@@ -9,7 +9,7 @@ interface TransactionSubmittedProps {
interface TransactionSubmittedState {}
export class TransactionSubmitted extends React.Component<TransactionSubmittedProps, TransactionSubmittedState> {
- public render() {
+ public render(): React.ReactNode {
if (_.isUndefined(this.props.etherScanLinkIfExists)) {
return <div>Transaction submitted to the network</div>;
} else {
diff --git a/packages/website/ts/components/footer.tsx b/packages/website/ts/components/footer.tsx
index 6c0186ac0..6dcb5a0e9 100644
--- a/packages/website/ts/components/footer.tsx
+++ b/packages/website/ts/components/footer.tsx
@@ -50,7 +50,7 @@ export class Footer extends React.Component<FooterProps, FooterState> {
selectedLanguage: props.translate.getLanguage(),
};
}
- public render() {
+ public render(): React.ReactNode {
const menuItemsBySection: MenuItemsBySection = {
[Key.Documentation]: [
{
@@ -114,8 +114,8 @@ export class Footer extends React.Component<FooterProps, FooterState> {
},
{
title: this.props.translate.get(Key.Careers, Deco.Cap),
- isExternal: true,
- path: constants.URL_ANGELLIST,
+ isExternal: false,
+ path: WebsitePaths.Careers,
},
{
title: this.props.translate.get(Key.Contact, Deco.Cap),
@@ -180,14 +180,14 @@ export class Footer extends React.Component<FooterProps, FooterState> {
</div>
);
}
- private _renderIcon(fileName: string) {
+ private _renderIcon(fileName: string): React.ReactNode {
return (
<div style={{ height: ICON_DIMENSION, width: ICON_DIMENSION }}>
<img src={`/images/social/${fileName}`} style={{ width: ICON_DIMENSION }} />
</div>
);
}
- private _renderMenuItem(item: FooterMenuItem) {
+ private _renderMenuItem(item: FooterMenuItem): React.ReactNode {
const titleToIcon: { [title: string]: string } = {
[this.props.translate.get(Key.RocketChat, Deco.Cap)]: 'rocketchat.png',
[this.props.translate.get(Key.Blog, Deco.Cap)]: 'medium.png',
@@ -222,7 +222,7 @@ export class Footer extends React.Component<FooterProps, FooterState> {
</div>
);
}
- private _renderHeader(key: Key) {
+ private _renderHeader(key: Key): React.ReactNode {
const headerStyle = {
color: colors.grey400,
letterSpacing: 2,
@@ -235,7 +235,7 @@ export class Footer extends React.Component<FooterProps, FooterState> {
</div>
);
}
- private _updateLanguage(e: any, index: number, value: Language) {
+ private _updateLanguage(_event: any, _index: number, value: Language): void {
this.setState({
selectedLanguage: value,
});
diff --git a/packages/website/ts/components/forms/subscribe_form.tsx b/packages/website/ts/components/forms/subscribe_form.tsx
new file mode 100644
index 000000000..761db7517
--- /dev/null
+++ b/packages/website/ts/components/forms/subscribe_form.tsx
@@ -0,0 +1,127 @@
+import { colors } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { Button } from 'ts/components/ui/button';
+import { Container } from 'ts/components/ui/container';
+import { Input } from 'ts/components/ui/input';
+import { Text } from 'ts/components/ui/text';
+import { analytics } from 'ts/utils/analytics';
+import { backendClient } from 'ts/utils/backend_client';
+
+export interface SubscribeFormProps {}
+
+export enum SubscribeFormStatus {
+ None,
+ Error,
+ Success,
+ Loading,
+ Other,
+}
+
+export interface SubscribeFormState {
+ emailText: string;
+ lastSubmittedEmail: string;
+ status: SubscribeFormStatus;
+}
+
+const FORM_FONT_SIZE = '15px';
+
+// TODO: Translate visible strings. https://app.asana.com/0/628666249318202/697485674422001
+export class SubscribeForm extends React.Component<SubscribeFormProps, SubscribeFormState> {
+ public state = {
+ emailText: '',
+ lastSubmittedEmail: '',
+ status: SubscribeFormStatus.None,
+ };
+ public render(): React.ReactNode {
+ return (
+ <Container className="flex flex-column items-center justify-between md-mx2 sm-mx2">
+ <Container marginBottom="15px">
+ <Text fontFamily="Roboto Mono" fontColor={colors.grey} center={true}>
+ Subscribe to our newsletter for 0x relayer and dApp updates
+ </Text>
+ </Container>
+ <form onSubmit={this._handleFormSubmitAsync.bind(this)}>
+ <Container className="flex flex-wrap justify-center items-center">
+ <Container marginTop="15px">
+ <Input
+ placeholder="you@email.com"
+ value={this.state.emailText}
+ fontColor={colors.white}
+ fontSize={FORM_FONT_SIZE}
+ backgroundColor={colors.projectsGrey}
+ width="300px"
+ onChange={this._handleEmailInputChange.bind(this)}
+ />
+ </Container>
+ <Container marginLeft="15px" marginTop="15px">
+ <Button
+ type="submit"
+ backgroundColor={colors.darkestGrey}
+ fontColor={colors.white}
+ fontSize={FORM_FONT_SIZE}
+ >
+ Subscribe
+ </Button>
+ </Container>
+ </Container>
+ </form>
+ {this._renderMessage()}
+ </Container>
+ );
+ }
+ private _renderMessage(): React.ReactNode {
+ let message = null;
+ switch (this.state.status) {
+ case SubscribeFormStatus.Error:
+ message = 'Sorry, something went wrong. Try again later.';
+ break;
+ case SubscribeFormStatus.Loading:
+ message = 'One second...';
+ break;
+ case SubscribeFormStatus.Success:
+ message = `Thanks! ${this.state.lastSubmittedEmail} is now on the mailing list.`;
+ break;
+ case SubscribeFormStatus.None:
+ break;
+ default:
+ throw new Error(
+ 'The SubscribeFormStatus switch statement is not exhaustive when choosing an error message.',
+ );
+ }
+ return (
+ <Container isHidden={!message} marginTop="30px">
+ <Text center={true} fontFamily="Roboto Mono" fontColor={colors.grey}>
+ {message || 'spacer text (never shown to user)'}
+ </Text>
+ </Container>
+ );
+ }
+ private _handleEmailInputChange(event: React.ChangeEvent<HTMLInputElement>): void {
+ this.setState({ emailText: event.target.value });
+ }
+ private async _handleFormSubmitAsync(event: React.FormEvent<HTMLInputElement>): Promise<void> {
+ event.preventDefault();
+ if (_.isUndefined(this.state.emailText) || _.isEmpty(this.state.emailText)) {
+ return;
+ }
+ this.setState({
+ status: SubscribeFormStatus.Loading,
+ lastSubmittedEmail: this.state.emailText,
+ });
+ try {
+ const response = await backendClient.subscribeToNewsletterAsync(this.state.emailText);
+ const status = response.status === 200 ? SubscribeFormStatus.Success : SubscribeFormStatus.Error;
+ if (status === SubscribeFormStatus.Success) {
+ analytics.identify(this.state.emailText, 'email');
+ }
+ this.setState({ status, emailText: '' });
+ } catch (error) {
+ this._setStatus(SubscribeFormStatus.Error);
+ }
+ }
+ private _setStatus(status: SubscribeFormStatus): void {
+ this.setState({ status });
+ }
+}
diff --git a/packages/website/ts/components/generate_order/asset_picker.tsx b/packages/website/ts/components/generate_order/asset_picker.tsx
index 69fb32a21..2dca3483f 100644
--- a/packages/website/ts/components/generate_order/asset_picker.tsx
+++ b/packages/website/ts/components/generate_order/asset_picker.tsx
@@ -1,7 +1,10 @@
import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';
+import * as moment from 'moment';
import * as React from 'react';
+import firstBy = require('thenby');
+
import { Blockchain } from 'ts/blockchain';
import { NewTokenForm } from 'ts/components/generate_order/new_token_form';
import { TrackTokenConfirmation } from 'ts/components/track_token_confirmation';
@@ -9,6 +12,8 @@ import { TokenIcon } from 'ts/components/ui/token_icon';
import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
import { Dispatcher } from 'ts/redux/dispatcher';
import { DialogConfigs, Token, TokenByAddress, TokenVisibility } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+import { utils } from 'ts/utils/utils';
const TOKEN_ICON_DIMENSION = 100;
const TILE_DIMENSION = 146;
@@ -41,7 +46,7 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
public static defaultProps: Partial<AssetPickerProps> = {
tokenVisibility: TokenVisibility.ALL,
};
- private _dialogConfigsByAssetView: { [assetView: string]: DialogConfigs };
+ private readonly _dialogConfigsByAssetView: { [assetView: string]: DialogConfigs };
constructor(props: AssetPickerProps) {
super(props);
this.state = {
@@ -79,15 +84,15 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
},
};
}
- public render() {
+ public render(): React.ReactNode {
const dialogConfigs: DialogConfigs = this._dialogConfigsByAssetView[this.state.assetView];
return (
<Dialog
title={dialogConfigs.title}
- titleStyle={{ fontWeight: 100 }}
modal={dialogConfigs.isModal}
open={this.props.isOpen}
actions={dialogConfigs.actions}
+ autoScrollBodyContent={true}
onRequestClose={this._onCloseDialog.bind(this)}
>
{this.state.assetView === AssetViews.ASSET_PICKER && this._renderAssetPicker()}
@@ -102,7 +107,7 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
</Dialog>
);
}
- private _renderConfirmTrackToken() {
+ private _renderConfirmTrackToken(): React.ReactNode {
const token = this.props.tokenByAddress[this.state.chosenTrackTokenAddress];
return (
<TrackTokenConfirmation
@@ -113,14 +118,13 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
/>
);
}
- private _renderAssetPicker() {
+ private _renderAssetPicker(): React.ReactNode {
return (
<div
- className="clearfix flex flex-wrap"
+ className="flex flex-wrap"
style={{
- overflowY: 'auto',
- maxWidth: 720,
- maxHeight: 356,
+ maxWidth: 1000,
+ maxHeight: 600,
marginBottom: 10,
}}
>
@@ -128,16 +132,31 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
</div>
);
}
- private _renderGridTiles() {
+ private _renderGridTiles(): React.ReactNode {
let isHovered;
let tileStyles;
- const gridTiles = _.map(this.props.tokenByAddress, (token: Token, address: string) => {
- if (
- (this.props.tokenVisibility === TokenVisibility.TRACKED && !token.isTracked) ||
- (this.props.tokenVisibility === TokenVisibility.UNTRACKED && token.isTracked)
- ) {
- return null; // Skip
- }
+ const allTokens = _.values(this.props.tokenByAddress);
+ // filter tokens based on visibility specified in props, do not show ZRX or ETHER as tracked or untracked
+ const filteredTokens =
+ this.props.tokenVisibility === TokenVisibility.ALL
+ ? allTokens
+ : _.filter(allTokens, token => {
+ return (
+ token.symbol !== constants.ZRX_TOKEN_SYMBOL &&
+ token.symbol !== constants.ETHER_TOKEN_SYMBOL &&
+ ((this.props.tokenVisibility === TokenVisibility.TRACKED && utils.isTokenTracked(token)) ||
+ (this.props.tokenVisibility === TokenVisibility.UNTRACKED &&
+ !utils.isTokenTracked(token)))
+ );
+ });
+ // if we are showing tracked tokens, sort by date added, otherwise sort by symbol
+ const sortKey = this.props.tokenVisibility === TokenVisibility.TRACKED ? 'trackedTimestamp' : 'symbol';
+ const sortedTokens = filteredTokens.sort(firstBy(sortKey));
+ if (_.isEmpty(sortedTokens)) {
+ return <div className="mx-auto p4 h2">No tokens to remove.</div>;
+ }
+ const gridTiles = _.map(sortedTokens, token => {
+ const address = token.address;
isHovered = this.state.hoveredAddress === address;
tileStyles = {
cursor: 'pointer',
@@ -151,15 +170,15 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
height: TILE_DIMENSION,
...tileStyles,
}}
- className="p2 mx-auto"
+ className="p2 flex sm-col-6 md-col-3 lg-col-3 flex-column items-center mx-auto"
onClick={this._onChooseToken.bind(this, address)}
onMouseEnter={this._onToggleHover.bind(this, address, true)}
onMouseLeave={this._onToggleHover.bind(this, address, false)}
>
- <div className="p1 center">
+ <div className="p1">
<TokenIcon token={token} diameter={TOKEN_ICON_DIMENSION} />
</div>
- <div className="center">{token.name}</div>
+ <div className="center">{token.symbol}</div>
</div>
);
});
@@ -178,7 +197,7 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
height: TILE_DIMENSION,
...tileStyles,
}}
- className="p2 mx-auto"
+ className="p2 flex sm-col-6 md-col-3 lg-col-3 flex-column items-center mx-auto"
onClick={this._onCustomAssetChosen.bind(this)}
onMouseEnter={this._onToggleHover.bind(this, otherTokenKey, true)}
onMouseLeave={this._onToggleHover.bind(this, otherTokenKey, false)}
@@ -195,21 +214,21 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
}
return gridTiles;
}
- private _onToggleHover(address: string, isHovered: boolean) {
+ private _onToggleHover(address: string, isHovered: boolean): void {
const hoveredAddress = isHovered ? address : undefined;
this.setState({
hoveredAddress,
});
}
- private _onCloseDialog() {
+ private _onCloseDialog(): void {
this.setState({
assetView: AssetViews.ASSET_PICKER,
});
this.props.onTokenChosen(this.props.currentTokenAddress);
}
- private _onChooseToken(tokenAddress: string) {
+ private _onChooseToken(tokenAddress: string): void {
const token = this.props.tokenByAddress[tokenAddress];
- if (token.isTracked) {
+ if (utils.isTokenTracked(token)) {
this.props.onTokenChosen(tokenAddress);
} else {
this.setState({
@@ -218,12 +237,12 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
});
}
}
- private _onCustomAssetChosen() {
+ private _onCustomAssetChosen(): void {
this.setState({
assetView: AssetViews.NEW_TOKEN_FORM,
});
}
- private _onNewTokenSubmitted(newToken: Token) {
+ private _onNewTokenSubmitted(newToken: Token): void {
trackedTokenStorage.addTrackedTokenToUser(this.props.userAddress, this.props.networkId, newToken);
this.props.dispatcher.addTokenToTokenByAddress(newToken);
this.setState({
@@ -231,13 +250,15 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
});
this.props.onTokenChosen(newToken.address);
}
- private async _onTrackConfirmationRespondedAsync(didUserAcceptTracking: boolean) {
+ private async _onTrackConfirmationRespondedAsync(didUserAcceptTracking: boolean): Promise<void> {
+ const resetState: AssetPickerState = {
+ ...this.state,
+ isAddingTokenToTracked: false,
+ assetView: AssetViews.ASSET_PICKER,
+ chosenTrackTokenAddress: undefined,
+ };
if (!didUserAcceptTracking) {
- this.setState({
- isAddingTokenToTracked: false,
- assetView: AssetViews.ASSET_PICKER,
- chosenTrackTokenAddress: undefined,
- });
+ this.setState(resetState);
this._onCloseDialog();
return;
}
@@ -246,19 +267,18 @@ export class AssetPicker extends React.Component<AssetPickerProps, AssetPickerSt
});
const tokenAddress = this.state.chosenTrackTokenAddress;
const token = this.props.tokenByAddress[tokenAddress];
+ if (_.isUndefined(tokenAddress)) {
+ this.setState(resetState);
+ return;
+ }
const newTokenEntry = {
...token,
+ trackedTimestamp: moment().unix(),
};
-
- newTokenEntry.isTracked = true;
trackedTokenStorage.addTrackedTokenToUser(this.props.userAddress, this.props.networkId, newTokenEntry);
this.props.dispatcher.updateTokenByAddress([newTokenEntry]);
- this.setState({
- isAddingTokenToTracked: false,
- assetView: AssetViews.ASSET_PICKER,
- chosenTrackTokenAddress: undefined,
- });
+ this.setState(resetState);
this.props.onTokenChosen(tokenAddress);
}
}
diff --git a/packages/website/ts/components/generate_order/generate_order_form.tsx b/packages/website/ts/components/generate_order/generate_order_form.tsx
index eb76cb529..72efab033 100644
--- a/packages/website/ts/components/generate_order/generate_order_form.tsx
+++ b/packages/website/ts/components/generate_order/generate_order_form.tsx
@@ -1,5 +1,6 @@
-import { ECSignature, Order, ZeroEx } from '0x.js';
-import { colors, constants as sharedConstants } from '@0xproject/react-shared';
+import { generatePseudoRandomSalt, getOrderHashHex } from '@0xproject/order-utils';
+import { colors } from '@0xproject/react-shared';
+import { ECSignature, Order as ZeroExOrder } from '@0xproject/types';
import { BigNumber, logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
@@ -19,7 +20,7 @@ import { SwapIcon } from 'ts/components/ui/swap_icon';
import { Dispatcher } from 'ts/redux/dispatcher';
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
import { validator } from 'ts/schemas/validator';
-import { AlertTypes, BlockchainErrs, HashData, Side, SideToAssetToken, Token, TokenByAddress } from 'ts/types';
+import { AlertTypes, BlockchainErrs, HashData, Order, Side, SideToAssetToken, Token, TokenByAddress } from 'ts/types';
import { analytics } from 'ts/utils/analytics';
import { constants } from 'ts/utils/constants';
import { errorReporter } from 'ts/utils/error_reporter';
@@ -46,6 +47,8 @@ interface GenerateOrderFormProps {
sideToAssetToken: SideToAssetToken;
tokenByAddress: TokenByAddress;
lastForceTokenStateRefetch: number;
+ isFullWidth?: boolean;
+ shouldHideHeader?: boolean;
}
interface GenerateOrderFormState {
@@ -55,6 +58,10 @@ interface GenerateOrderFormState {
}
export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, GenerateOrderFormState> {
+ public static defaultProps: Partial<GenerateOrderFormProps> = {
+ isFullWidth: false,
+ shouldHideHeader: false,
+ };
constructor(props: GenerateOrderFormProps) {
super(props);
this.state = {
@@ -63,10 +70,10 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
signingState: SigningState.UNSIGNED,
};
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public render() {
+ public render(): React.ReactNode {
const dispatcher = this.props.dispatcher;
const depositTokenAddress = this.props.sideToAssetToken[Side.Deposit].address;
const depositToken = this.props.tokenByAddress[depositTokenAddress];
@@ -78,11 +85,16 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
specified, anyone is able to fill it.';
const exchangeContractIfExists = this.props.blockchain.getExchangeContractAddressIfExists();
const initialTakerAddress =
- this.props.orderTakerAddress === ZeroEx.NULL_ADDRESS ? '' : this.props.orderTakerAddress;
+ this.props.orderTakerAddress === constants.NULL_ADDRESS ? '' : this.props.orderTakerAddress;
+ const rootClassName = this.props.isFullWidth ? 'clearfix mb2' : 'clearfix mb2 lg-px4 md-px4 sm-px2';
return (
- <div className="clearfix mb2 lg-px4 md-px4 sm-px2">
- <h3>Generate an order</h3>
- <Divider />
+ <div className={rootClassName}>
+ {!this.props.shouldHideHeader && (
+ <div>
+ <h3>Generate an order</h3>
+ <Divider />
+ </div>
+ )}
<div className="mx-auto" style={{ maxWidth: 580 }}>
<div className="pt3">
<div className="mx-auto clearfix">
@@ -214,17 +226,17 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
</div>
);
}
- private _onTokenAmountChange(token: Token, side: Side, isValid: boolean, amount?: BigNumber) {
+ private _onTokenAmountChange(token: Token, side: Side, _isValid: boolean, amount?: BigNumber): void {
this.props.dispatcher.updateChosenAssetToken(side, {
address: token.address,
amount,
});
}
- private _onCloseOrderJSONDialog() {
+ private _onCloseOrderJSONDialog(): void {
// Upon closing the order JSON dialog, we update the orderSalt stored in the Redux store
// with a new value so that if a user signs the identical order again, the newly signed
// orderHash will not collide with the previously generated orderHash.
- this.props.dispatcher.updateOrderSalt(ZeroEx.generatePseudoRandomSalt());
+ this.props.dispatcher.updateOrderSalt(generatePseudoRandomSalt());
this.setState({
signingState: SigningState.UNSIGNED,
});
@@ -242,7 +254,8 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
userAddressIfExists,
debitToken.address,
);
- const receiveAmount = this.props.sideToAssetToken[Side.Receive].amount;
+ const receiveToken = this.props.sideToAssetToken[Side.Receive];
+ const receiveAmount = receiveToken.amount;
if (
!_.isUndefined(debitToken.amount) &&
!_.isUndefined(receiveAmount) &&
@@ -252,24 +265,28 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
debitBalance.gte(debitToken.amount) &&
debitAllowance.gte(debitToken.amount)
) {
- const didSignSuccessfully = await this._signTransactionAsync();
- if (didSignSuccessfully) {
- const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
- const eventLabel = `${this.props.tokenByAddress[debitToken.address].symbol}-${networkName}`;
- analytics.logEvent('Portal', 'Sign Order Success', eventLabel, debitToken.amount.toNumber());
+ const signedOrder = await this._signTransactionAsync();
+ const doesSignedOrderExist = !_.isUndefined(signedOrder);
+ if (doesSignedOrderExist) {
+ analytics.trackOrderEvent('Sign Order Success', signedOrder);
this.setState({
globalErrMsg: '',
shouldShowIncompleteErrs: false,
});
}
- return didSignSuccessfully;
+ return doesSignedOrderExist;
} else {
let globalErrMsg = 'You must fix the above errors in order to generate a valid order';
if (this.props.userAddress === '') {
globalErrMsg = 'You must enable wallet communication';
this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
}
- analytics.logEvent('Portal', 'Sign Order Failure', globalErrMsg);
+ analytics.track('Sign Order Failure', {
+ makerTokenAmount: debitToken.amount.toString(),
+ makerToken: this.props.tokenByAddress[debitToken.address].symbol,
+ takerTokenAmount: receiveToken.amount.toString(),
+ takerToken: this.props.tokenByAddress[receiveToken.address].symbol,
+ });
this.setState({
globalErrMsg,
shouldShowIncompleteErrs: true,
@@ -277,7 +294,7 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
return false;
}
}
- private async _signTransactionAsync(): Promise<boolean> {
+ private async _signTransactionAsync(): Promise<Order | undefined> {
this.setState({
signingState: SigningState.SIGNING,
});
@@ -287,11 +304,11 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
this.setState({
signingState: SigningState.UNSIGNED,
});
- return false;
+ return undefined;
}
const hashData = this.props.hashData;
- const zeroExOrder: Order = {
+ const zeroExOrder: ZeroExOrder = {
exchangeContractAddress: exchangeContractAddr,
expirationUnixTimestampSec: hashData.orderExpiryTimestamp,
feeRecipient: hashData.feeRecipientAddress,
@@ -305,12 +322,13 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
takerTokenAddress: hashData.receiveTokenContractAddr,
takerTokenAmount: hashData.receiveAmount,
};
- const orderHash = ZeroEx.getOrderHashHex(zeroExOrder);
+ const orderHash = getOrderHashHex(zeroExOrder);
let globalErrMsg = '';
+ let order;
try {
const ecSignature = await this.props.blockchain.signOrderHashAsync(orderHash);
- const order = utils.generateOrder(
+ order = utils.generateOrder(
exchangeContractAddr,
this.props.sideToAssetToken,
hashData.orderExpiryTimestamp,
@@ -337,18 +355,18 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
globalErrMsg = 'An unexpected error occured. Please try refreshing the page';
logUtils.log(`Unexpected error occured: ${err}`);
logUtils.log(err.stack);
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
}
}
this.setState({
signingState: globalErrMsg === '' ? SigningState.SIGNED : SigningState.UNSIGNED,
globalErrMsg,
});
- return globalErrMsg === '';
+ return order;
}
private _updateOrderAddress(address?: string): void {
if (!_.isUndefined(address)) {
- const normalizedAddress = _.isEmpty(address) ? ZeroEx.NULL_ADDRESS : address;
+ const normalizedAddress = _.isEmpty(address) ? constants.NULL_ADDRESS : address;
this.props.dispatcher.updateOrderTakerAddress(normalizedAddress);
}
}
diff --git a/packages/website/ts/components/generate_order/new_token_form.tsx b/packages/website/ts/components/generate_order/new_token_form.tsx
index e7f3b93c6..3d7eda84c 100644
--- a/packages/website/ts/components/generate_order/new_token_form.tsx
+++ b/packages/website/ts/components/generate_order/new_token_form.tsx
@@ -1,6 +1,7 @@
import { colors } from '@0xproject/react-shared';
import * as _ from 'lodash';
import TextField from 'material-ui/TextField';
+import * as moment from 'moment';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
import { AddressInput } from 'ts/components/inputs/address_input';
@@ -42,7 +43,7 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
decimalsErrText: '',
};
}
- public render() {
+ public render(): React.ReactNode {
return (
<div className="mx-auto pb2" style={{ width: 256 }}>
<div>
@@ -96,7 +97,7 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
</div>
);
}
- private async _onAddNewTokenClickAsync() {
+ private async _onAddNewTokenClickAsync(): Promise<void> {
// Trigger validation of name and symbol
this._onTokenNameChanged(undefined, this.state.name);
this._onTokenSymbolChanged(undefined, this.state.symbol);
@@ -147,24 +148,24 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
iconUrl: undefined,
name: this.state.name,
symbol: this.state.symbol.toUpperCase(),
- isTracked: true,
+ trackedTimestamp: moment().unix(),
isRegistered: false,
};
this.props.onNewTokenSubmitted(newToken);
}
- private _onTokenNameChanged(e: any, name: string) {
+ private _onTokenNameChanged(_event: any, name: string): void {
let nameErrText = '';
const maxLength = 30;
const tokens = _.values(this.props.tokenByAddress);
const tokenWithNameIfExists = _.find(tokens, { name });
- const tokenWithNameExists = !_.isUndefined(tokenWithNameIfExists);
+ const doesTokenWithNameExists = !_.isUndefined(tokenWithNameIfExists);
if (name === '') {
nameErrText = 'Name is required';
} else if (!this._isValidName(name)) {
nameErrText = 'Name should only contain letters, digits and spaces';
} else if (name.length > maxLength) {
nameErrText = `Max length is ${maxLength}`;
- } else if (tokenWithNameExists) {
+ } else if (doesTokenWithNameExists) {
nameErrText = 'Token with this name already exists';
}
@@ -173,18 +174,18 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
nameErrText,
});
}
- private _onTokenSymbolChanged(e: any, symbol: string) {
+ private _onTokenSymbolChanged(_event: any, symbol: string): void {
let symbolErrText = '';
const maxLength = 5;
const tokens = _.values(this.props.tokenByAddress);
- const tokenWithSymbolExists = !_.isUndefined(_.find(tokens, { symbol }));
+ const doesTokenWithSymbolExists = !_.isUndefined(_.find(tokens, { symbol }));
if (symbol === '') {
symbolErrText = 'Symbol is required';
} else if (!this._isAlphanumeric(symbol)) {
symbolErrText = 'Can only include alphanumeric characters';
} else if (symbol.length > maxLength) {
symbolErrText = `Max length is ${maxLength}`;
- } else if (tokenWithSymbolExists) {
+ } else if (doesTokenWithSymbolExists) {
symbolErrText = 'Token with symbol already exists';
}
@@ -193,7 +194,7 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
symbolErrText,
});
}
- private _onTokenDecimalsChanged(e: any, decimals: string) {
+ private _onTokenDecimalsChanged(_event: any, decimals: string): void {
let decimalsErrText = '';
const maxLength = 2;
if (decimals === '') {
@@ -209,20 +210,20 @@ export class NewTokenForm extends React.Component<NewTokenFormProps, NewTokenFor
decimalsErrText,
});
}
- private _onTokenAddressChanged(address?: string) {
+ private _onTokenAddressChanged(address?: string): void {
if (!_.isUndefined(address)) {
this.setState({
address,
});
}
}
- private _isValidName(input: string) {
+ private _isValidName(input: string): boolean {
return /^[a-z0-9 ]+$/i.test(input);
}
- private _isInteger(input: string) {
+ private _isInteger(input: string): boolean {
return /^[0-9]+$/i.test(input);
}
- private _isAlphanumeric(input: string) {
+ private _isAlphanumeric(input: string): boolean {
return /^[a-zA-Z0-9]+$/i.test(input);
}
}
diff --git a/packages/website/ts/components/inputs/address_input.tsx b/packages/website/ts/components/inputs/address_input.tsx
index 7ca4af968..39ec72f8a 100644
--- a/packages/website/ts/components/inputs/address_input.tsx
+++ b/packages/website/ts/components/inputs/address_input.tsx
@@ -29,14 +29,14 @@ export class AddressInput extends React.Component<AddressInputProps, AddressInpu
errMsg: '',
};
}
- public componentWillReceiveProps(nextProps: AddressInputProps) {
+ public componentWillReceiveProps(nextProps: AddressInputProps): void {
if (nextProps.shouldShowIncompleteErrs && this.props.isRequired && this.state.address === '') {
this.setState({
errMsg: 'Address is required',
});
}
}
- public render() {
+ public render(): React.ReactNode {
const label = this.props.isRequired ? <RequiredLabel label={this.props.label} /> : this.props.label;
const labelDisplay = this.props.shouldHideLabel ? 'hidden' : 'block';
const hintText = this.props.hintText ? this.props.hintText : '';
@@ -57,7 +57,7 @@ export class AddressInput extends React.Component<AddressInputProps, AddressInpu
</div>
);
}
- private _onOrderTakerAddressUpdated(e: any) {
+ private _onOrderTakerAddressUpdated(e: any): void {
const address = e.target.value.toLowerCase();
const isValidAddress = addressUtils.isAddress(address) || address === '';
const errMsg = isValidAddress ? '' : 'Invalid ethereum address';
diff --git a/packages/website/ts/components/inputs/allowance_state_toggle.tsx b/packages/website/ts/components/inputs/allowance_state_toggle.tsx
new file mode 100644
index 000000000..39d2e3030
--- /dev/null
+++ b/packages/website/ts/components/inputs/allowance_state_toggle.tsx
@@ -0,0 +1,160 @@
+import { colors } from '@0xproject/react-shared';
+import { BigNumber, logUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+import * as React from 'react';
+import ReactTooltip = require('react-tooltip');
+import { Blockchain } from 'ts/blockchain';
+import { AllowanceState, AllowanceStateView } from 'ts/components/ui/allowance_state_view';
+import { Container } from 'ts/components/ui/container';
+import { PointerDirection } from 'ts/components/ui/pointer';
+import { Text } from 'ts/components/ui/text';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { BalanceErrs, Token, TokenState } from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
+import { errorReporter } from 'ts/utils/error_reporter';
+import { utils } from 'ts/utils/utils';
+
+export interface AllowanceStateToggleProps {
+ networkId: number;
+ blockchain: Blockchain;
+ dispatcher: Dispatcher;
+ token: Token;
+ tokenState: TokenState;
+ userAddress: string;
+ onErrorOccurred?: (errType: BalanceErrs) => void;
+ refetchTokenStateAsync: () => Promise<void>;
+ tooltipDirection?: PointerDirection;
+}
+
+export interface AllowanceStateToggleState {
+ allowanceState: AllowanceState;
+ prevTokenState: TokenState;
+ loadingMessage?: string;
+}
+
+const DEFAULT_ALLOWANCE_AMOUNT_IN_BASE_UNITS = new BigNumber(2).pow(256).minus(1);
+
+export class AllowanceStateToggle extends React.Component<AllowanceStateToggleProps, AllowanceStateToggleState> {
+ public static defaultProps = {
+ onErrorOccurred: _.noop.bind(_),
+ tooltipDirection: PointerDirection.Right,
+ };
+ private static _getAllowanceState(tokenState: TokenState): AllowanceState {
+ if (!tokenState.isLoaded) {
+ return AllowanceState.Loading;
+ }
+ if (tokenState.allowance.gt(0)) {
+ return AllowanceState.Unlocked;
+ }
+ return AllowanceState.Locked;
+ }
+ constructor(props: AllowanceStateToggleProps) {
+ super(props);
+ const tokenState = props.tokenState;
+ this.state = {
+ allowanceState: AllowanceStateToggle._getAllowanceState(tokenState),
+ prevTokenState: tokenState,
+ };
+ }
+
+ public render(): React.ReactNode {
+ const tooltipId = `tooltip-id-${this.props.token.symbol}`;
+ return (
+ <Container cursor="pointer">
+ <ReactTooltip id={tooltipId} effect="solid" offset={{ top: 3 }}>
+ {this._getTooltipContent()}
+ </ReactTooltip>
+ <div
+ data-tip={true}
+ data-for={tooltipId}
+ data-place={this.props.tooltipDirection}
+ onClick={this._onToggleAllowanceAsync.bind(this)}
+ >
+ <AllowanceStateView allowanceState={this.state.allowanceState} />
+ </div>
+ </Container>
+ );
+ }
+ public componentWillReceiveProps(nextProps: AllowanceStateToggleProps): void {
+ const nextTokenState = nextProps.tokenState;
+ const prevTokenState = this.state.prevTokenState;
+ if (
+ !nextTokenState.allowance.eq(prevTokenState.allowance) ||
+ nextTokenState.isLoaded !== prevTokenState.isLoaded
+ ) {
+ const tokenState = nextProps.tokenState;
+ this.setState({
+ prevTokenState: tokenState,
+ allowanceState: AllowanceStateToggle._getAllowanceState(nextTokenState),
+ });
+ }
+ }
+ private _getTooltipContent(): React.ReactNode {
+ const symbol = this.props.token.symbol;
+ switch (this.state.allowanceState) {
+ case AllowanceState.Loading:
+ return (
+ <Text noWrap={true} fontColor={colors.white}>
+ {this.state.loadingMessage || 'Loading...'}
+ </Text>
+ );
+ case AllowanceState.Locked:
+ return (
+ <Text noWrap={true} fontColor={colors.white}>
+ Click to enable <b>{symbol}</b> for trading
+ </Text>
+ );
+ case AllowanceState.Unlocked:
+ return (
+ <Text noWrap={true} fontColor={colors.white}>
+ <b>{symbol}</b> is available for trading
+ </Text>
+ );
+ default:
+ return null;
+ }
+ }
+ private async _onToggleAllowanceAsync(): Promise<void> {
+ // Close all tooltips
+ ReactTooltip.hide();
+ if (this.props.userAddress === '') {
+ this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
+ return;
+ }
+
+ let newAllowanceAmountInBaseUnits = new BigNumber(0);
+ if (!this._isAllowanceSet()) {
+ newAllowanceAmountInBaseUnits = DEFAULT_ALLOWANCE_AMOUNT_IN_BASE_UNITS;
+ }
+ const isUnlockingToken = newAllowanceAmountInBaseUnits.gt(0);
+ this.setState({
+ allowanceState: AllowanceState.Loading,
+ loadingMessage: `${isUnlockingToken ? 'Unlocking' : 'Locking'} ${this.props.token.symbol}`,
+ });
+ const logData = {
+ tokenSymbol: this.props.token.symbol,
+ newAllowance: newAllowanceAmountInBaseUnits.toNumber(),
+ };
+ try {
+ await this.props.blockchain.setProxyAllowanceAsync(this.props.token, newAllowanceAmountInBaseUnits);
+ analytics.track('Set Allowances Success', logData);
+ await this.props.refetchTokenStateAsync();
+ } catch (err) {
+ analytics.track('Set Allowance Failure', logData);
+ this.setState({
+ allowanceState: AllowanceStateToggle._getAllowanceState(this.state.prevTokenState),
+ });
+ const errMsg = `${err}`;
+ if (utils.didUserDenyWeb3Request(errMsg)) {
+ return;
+ }
+ logUtils.log(`Unexpected error encountered: ${err}`);
+ logUtils.log(err.stack);
+ this.props.onErrorOccurred(BalanceErrs.allowanceSettingFailed);
+ errorReporter.report(err);
+ }
+ }
+ private _isAllowanceSet(): boolean {
+ return !this.props.tokenState.allowance.eq(0);
+ }
+}
diff --git a/packages/website/ts/components/inputs/allowance_toggle.tsx b/packages/website/ts/components/inputs/allowance_toggle.tsx
deleted file mode 100644
index cfe75b751..000000000
--- a/packages/website/ts/components/inputs/allowance_toggle.tsx
+++ /dev/null
@@ -1,134 +0,0 @@
-import { colors, constants as sharedConstants, Styles } from '@0xproject/react-shared';
-import { BigNumber, logUtils } from '@0xproject/utils';
-import * as _ from 'lodash';
-import Toggle from 'material-ui/Toggle';
-import * as React from 'react';
-import { Blockchain } from 'ts/blockchain';
-import { Dispatcher } from 'ts/redux/dispatcher';
-import { BalanceErrs, Token, TokenState } from 'ts/types';
-import { analytics } from 'ts/utils/analytics';
-import { constants } from 'ts/utils/constants';
-import { errorReporter } from 'ts/utils/error_reporter';
-import { utils } from 'ts/utils/utils';
-
-const DEFAULT_ALLOWANCE_AMOUNT_IN_BASE_UNITS = new BigNumber(2).pow(256).minus(1);
-
-interface AllowanceToggleProps {
- networkId: number;
- blockchain: Blockchain;
- dispatcher: Dispatcher;
- onErrorOccurred: (errType: BalanceErrs) => void;
- token: Token;
- tokenState: TokenState;
- userAddress: string;
- isDisabled: boolean;
- refetchTokenStateAsync: () => Promise<void>;
-}
-
-interface AllowanceToggleState {
- isSpinnerVisible: boolean;
- prevAllowance: BigNumber;
-}
-
-const styles: Styles = {
- baseThumbStyle: {
- height: 10,
- width: 10,
- top: 6,
- backgroundColor: colors.white,
- boxShadow: `0px 0px 0px ${colors.allowanceToggleShadow}`,
- },
- offThumbStyle: {
- left: 4,
- },
- onThumbStyle: {
- left: 25,
- },
- baseTrackStyle: {
- width: 25,
- },
- offTrackStyle: {
- backgroundColor: colors.allowanceToggleOffTrack,
- },
- onTrackStyle: {
- backgroundColor: colors.allowanceToggleOnTrack,
- },
-};
-
-export class AllowanceToggle extends React.Component<AllowanceToggleProps, AllowanceToggleState> {
- constructor(props: AllowanceToggleProps) {
- super(props);
- this.state = {
- isSpinnerVisible: false,
- prevAllowance: props.tokenState.allowance,
- };
- }
- public componentWillReceiveProps(nextProps: AllowanceToggleProps) {
- if (!nextProps.tokenState.allowance.eq(this.state.prevAllowance)) {
- this.setState({
- isSpinnerVisible: false,
- prevAllowance: nextProps.tokenState.allowance,
- });
- }
- }
- public render() {
- return (
- <div className="flex">
- <div>
- <Toggle
- disabled={this.state.isSpinnerVisible || this.props.isDisabled}
- toggled={this._isAllowanceSet()}
- onToggle={this._onToggleAllowanceAsync.bind(this)}
- thumbStyle={{ ...styles.baseThumbStyle, ...styles.offThumbStyle }}
- thumbSwitchedStyle={{ ...styles.baseThumbStyle, ...styles.onThumbStyle }}
- trackStyle={{ ...styles.baseTrackStyle, ...styles.offTrackStyle }}
- trackSwitchedStyle={{ ...styles.baseTrackStyle, ...styles.onTrackStyle }}
- />
- </div>
- {this.state.isSpinnerVisible && (
- <div className="pl1" style={{ paddingTop: 3 }}>
- <i className="zmdi zmdi-spinner zmdi-hc-spin" />
- </div>
- )}
- </div>
- );
- }
- private async _onToggleAllowanceAsync(): Promise<void> {
- if (this.props.userAddress === '') {
- this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
- return;
- }
-
- this.setState({
- isSpinnerVisible: true,
- });
-
- let newAllowanceAmountInBaseUnits = new BigNumber(0);
- if (!this._isAllowanceSet()) {
- newAllowanceAmountInBaseUnits = DEFAULT_ALLOWANCE_AMOUNT_IN_BASE_UNITS;
- }
- const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
- const eventLabel = `${this.props.token.symbol}-${networkName}`;
- try {
- await this.props.blockchain.setProxyAllowanceAsync(this.props.token, newAllowanceAmountInBaseUnits);
- analytics.logEvent('Portal', 'Set Allowance Success', eventLabel, newAllowanceAmountInBaseUnits.toNumber());
- await this.props.refetchTokenStateAsync();
- } catch (err) {
- analytics.logEvent('Portal', 'Set Allowance Failure', eventLabel, newAllowanceAmountInBaseUnits.toNumber());
- this.setState({
- isSpinnerVisible: false,
- });
- const errMsg = `${err}`;
- if (utils.didUserDenyWeb3Request(errMsg)) {
- return;
- }
- logUtils.log(`Unexpected error encountered: ${err}`);
- logUtils.log(err.stack);
- this.props.onErrorOccurred(BalanceErrs.allowanceSettingFailed);
- await errorReporter.reportAsync(err);
- }
- }
- private _isAllowanceSet() {
- return !this.props.tokenState.allowance.eq(0);
- }
-}
diff --git a/packages/website/ts/components/inputs/balance_bounded_input.tsx b/packages/website/ts/components/inputs/balance_bounded_input.tsx
index e9b8dd369..eb01e3ea6 100644
--- a/packages/website/ts/components/inputs/balance_bounded_input.tsx
+++ b/packages/website/ts/components/inputs/balance_bounded_input.tsx
@@ -3,9 +3,8 @@ import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
import TextField from 'material-ui/TextField';
import * as React from 'react';
-import { Link } from 'react-router-dom';
import { RequiredLabel } from 'ts/components/ui/required_label';
-import { InputErrMsg, ValidatedBigNumberCallback, WebsitePaths } from 'ts/types';
+import { ValidatedBigNumberCallback } from 'ts/types';
import { utils } from 'ts/utils/utils';
interface BalanceBoundedInputProps {
@@ -14,28 +13,29 @@ interface BalanceBoundedInputProps {
amount?: BigNumber;
hintText?: string;
onChange: ValidatedBigNumberCallback;
+ onErrorMsgChange?: (errorMsg: React.ReactNode) => void;
shouldShowIncompleteErrs?: boolean;
shouldCheckBalance: boolean;
- validate?: (amount: BigNumber) => InputErrMsg;
- onVisitBalancesPageClick?: () => void;
- shouldHideVisitBalancesLink?: boolean;
+ validate?: (amount: BigNumber) => React.ReactNode;
isDisabled?: boolean;
shouldShowErrs?: boolean;
shouldShowUnderline?: boolean;
+ inputStyle?: React.CSSProperties;
+ inputHintStyle?: React.CSSProperties;
}
interface BalanceBoundedInputState {
- errMsg: InputErrMsg;
+ errMsg: React.ReactNode;
amountString: string;
}
export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProps, BalanceBoundedInputState> {
public static defaultProps: Partial<BalanceBoundedInputProps> = {
shouldShowIncompleteErrs: false,
- shouldHideVisitBalancesLink: false,
isDisabled: false,
shouldShowErrs: true,
hintText: 'amount',
+ onErrorMsgChange: _.noop.bind(_),
shouldShowUnderline: true,
};
constructor(props: BalanceBoundedInputProps) {
@@ -46,7 +46,7 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
amountString,
};
}
- public componentWillReceiveProps(nextProps: BalanceBoundedInputProps) {
+ public componentWillReceiveProps(nextProps: BalanceBoundedInputProps): void {
if (nextProps === this.props) {
return;
}
@@ -63,20 +63,14 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
}
if (shouldResetState) {
const amountString = nextProps.amount.toString();
- this.setState({
- errMsg: this._validate(amountString, nextProps.balance),
- amountString,
- });
+ this._setAmountState(amountString, nextProps.balance);
}
} else if (isCurrentAmountNumeric) {
const amountString = '';
- this.setState({
- errMsg: this._validate(amountString, nextProps.balance),
- amountString,
- });
+ this._setAmountState(amountString, nextProps.balance);
}
}
- public render() {
+ public render(): React.ReactNode {
let errorText;
if (this.props.shouldShowErrs) {
errorText =
@@ -99,29 +93,25 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
hintText={<span style={{ textTransform: 'capitalize' }}>{this.props.hintText}</span>}
onChange={this._onValueChange.bind(this)}
underlineStyle={{ width: 'calc(100% + 50px)' }}
+ inputStyle={this.props.inputStyle}
+ hintStyle={this.props.inputHintStyle}
underlineShow={this.props.shouldShowUnderline}
disabled={this.props.isDisabled}
/>
);
}
- private _onValueChange(e: any, amountString: string) {
- const errMsg = this._validate(amountString, this.props.balance);
- this.setState(
- {
- amountString,
- errMsg,
- },
- () => {
- const isValid = _.isUndefined(errMsg);
- if (utils.isNumeric(amountString) && !_.includes(amountString, '-')) {
- this.props.onChange(isValid, new BigNumber(amountString));
- } else {
- this.props.onChange(isValid);
- }
- },
- );
+ private _onValueChange(_event: any, amountString: string): void {
+ this._setAmountState(amountString, this.props.balance, () => {
+ const isValid = _.isUndefined(this._validate(amountString, this.props.balance));
+ const isPositiveNumber = utils.isNumeric(amountString) && !_.includes(amountString, '-');
+ if (isPositiveNumber) {
+ this.props.onChange(isValid, new BigNumber(amountString));
+ } else {
+ this.props.onChange(isValid);
+ }
+ });
}
- private _validate(amountString: string, balance: BigNumber): InputErrMsg {
+ private _validate(amountString: string, balance: BigNumber): React.ReactNode {
if (!utils.isNumeric(amountString)) {
return amountString !== '' ? 'Must be a number' : '';
}
@@ -130,35 +120,20 @@ export class BalanceBoundedInput extends React.Component<BalanceBoundedInputProp
return 'Cannot be zero';
}
if (this.props.shouldCheckBalance && amount.gt(balance)) {
- return <span>Insufficient balance. {this._renderIncreaseBalanceLink()}</span>;
+ return <span>Insufficient balance.</span>;
}
const errMsg = _.isUndefined(this.props.validate) ? undefined : this.props.validate(amount);
return errMsg;
}
- private _renderIncreaseBalanceLink() {
- if (this.props.shouldHideVisitBalancesLink) {
- return null;
- }
-
- const increaseBalanceText = 'Increase balance';
- const linkStyle = {
- cursor: 'pointer',
- color: colors.darkestGrey,
- textDecoration: 'underline',
- display: 'inline',
- };
- if (_.isUndefined(this.props.onVisitBalancesPageClick)) {
- return (
- <Link to={`${WebsitePaths.Portal}/balances`} style={linkStyle}>
- {increaseBalanceText}
- </Link>
- );
- } else {
- return (
- <div onClick={this.props.onVisitBalancesPageClick} style={linkStyle}>
- {increaseBalanceText}
- </div>
- );
- }
+ private _setAmountState(amount: string, balance: BigNumber, callback: () => void = _.noop.bind(_)): void {
+ const errorMsg = this._validate(amount, balance);
+ this.props.onErrorMsgChange(errorMsg);
+ this.setState(
+ {
+ amountString: amount,
+ errMsg: errorMsg,
+ },
+ callback,
+ );
}
}
diff --git a/packages/website/ts/components/inputs/eth_amount_input.tsx b/packages/website/ts/components/inputs/eth_amount_input.tsx
index f3a879065..3a7905442 100644
--- a/packages/website/ts/components/inputs/eth_amount_input.tsx
+++ b/packages/website/ts/components/inputs/eth_amount_input.tsx
@@ -1,5 +1,5 @@
-import { ZeroEx } from '0x.js';
import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import * as React from 'react';
import { BalanceBoundedInput } from 'ts/components/inputs/balance_bounded_input';
@@ -12,13 +12,14 @@ interface EthAmountInputProps {
amount?: BigNumber;
hintText?: string;
onChange: ValidatedBigNumberCallback;
+ onErrorMsgChange?: (errorMsg: React.ReactNode) => void;
shouldShowIncompleteErrs: boolean;
- onVisitBalancesPageClick?: () => void;
shouldCheckBalance: boolean;
- shouldHideVisitBalancesLink?: boolean;
shouldShowErrs?: boolean;
shouldShowUnderline?: boolean;
style?: React.CSSProperties;
+ labelStyle?: React.CSSProperties;
+ inputHintStyle?: React.CSSProperties;
}
interface EthAmountInputState {}
@@ -27,35 +28,38 @@ export class EthAmountInput extends React.Component<EthAmountInputProps, EthAmou
public static defaultProps: Partial<EthAmountInputProps> = {
shouldShowErrs: true,
shouldShowUnderline: true,
- style: { height: 63 },
};
- public render() {
+ public render(): React.ReactNode {
const amount = this.props.amount
- ? ZeroEx.toUnitAmount(this.props.amount, constants.DECIMAL_PLACES_ETH)
+ ? Web3Wrapper.toUnitAmount(this.props.amount, constants.DECIMAL_PLACES_ETH)
: undefined;
return (
- <div className="flex overflow-hidden" style={this.props.style}>
+ <div className="flex" style={this.props.style}>
<BalanceBoundedInput
label={this.props.label}
balance={this.props.balance}
amount={amount}
onChange={this._onChange.bind(this)}
+ onErrorMsgChange={this.props.onErrorMsgChange}
shouldCheckBalance={this.props.shouldCheckBalance}
shouldShowIncompleteErrs={this.props.shouldShowIncompleteErrs}
- onVisitBalancesPageClick={this.props.onVisitBalancesPageClick}
- shouldHideVisitBalancesLink={this.props.shouldHideVisitBalancesLink}
hintText={this.props.hintText}
shouldShowErrs={this.props.shouldShowErrs}
shouldShowUnderline={this.props.shouldShowUnderline}
+ inputStyle={this.props.style}
+ inputHintStyle={this.props.inputHintStyle}
/>
- <div style={{ paddingTop: _.isUndefined(this.props.label) ? 15 : 40 }}>ETH</div>
+ <div style={this._getLabelStyle()}>ETH</div>
</div>
);
}
- private _onChange(isValid: boolean, amount?: BigNumber) {
+ private _onChange(isValid: boolean, amount?: BigNumber): void {
const baseUnitAmountIfExists = _.isUndefined(amount)
? undefined
- : ZeroEx.toBaseUnitAmount(amount, constants.DECIMAL_PLACES_ETH);
+ : Web3Wrapper.toBaseUnitAmount(amount, constants.DECIMAL_PLACES_ETH);
this.props.onChange(isValid, baseUnitAmountIfExists);
}
+ private _getLabelStyle(): React.CSSProperties {
+ return this.props.labelStyle || { paddingTop: _.isUndefined(this.props.label) ? 15 : 40 };
+ }
}
diff --git a/packages/website/ts/components/inputs/expiration_input.tsx b/packages/website/ts/components/inputs/expiration_input.tsx
index e473648d2..5417ce715 100644
--- a/packages/website/ts/components/inputs/expiration_input.tsx
+++ b/packages/website/ts/components/inputs/expiration_input.tsx
@@ -17,7 +17,7 @@ interface ExpirationInputState {
}
export class ExpirationInput extends React.Component<ExpirationInputProps, ExpirationInputState> {
- private _earliestPickableMoment: moment.Moment;
+ private readonly _earliestPickableMoment: moment.Moment;
constructor(props: ExpirationInputProps) {
super(props);
// Set the earliest pickable date to today at 00:00, so users can only pick the current or later dates
@@ -30,7 +30,7 @@ export class ExpirationInput extends React.Component<ExpirationInputProps, Expir
timeMoment: didUserSetExpiry ? expirationMoment : undefined,
};
}
- public render() {
+ public render(): React.ReactNode {
const date = this.state.dateMoment ? this.state.dateMoment.toDate() : undefined;
const time = this.state.timeMoment ? this.state.timeMoment.toDate() : undefined;
return (
@@ -72,7 +72,7 @@ export class ExpirationInput extends React.Component<ExpirationInputProps, Expir
.startOf('day')
.isBefore(this._earliestPickableMoment);
}
- private _clearDates() {
+ private _clearDates(): void {
this.setState({
dateMoment: undefined,
timeMoment: undefined,
@@ -80,7 +80,7 @@ export class ExpirationInput extends React.Component<ExpirationInputProps, Expir
const defaultDateTime = utils.initialOrderExpiryUnixTimestampSec();
this.props.updateOrderExpiry(defaultDateTime);
}
- private _onDateChanged(e: any, date: Date) {
+ private _onDateChanged(_event: any, date: Date): void {
const dateMoment = moment(date);
this.setState({
dateMoment,
@@ -88,7 +88,7 @@ export class ExpirationInput extends React.Component<ExpirationInputProps, Expir
const timestamp = utils.convertToUnixTimestampSeconds(dateMoment, this.state.timeMoment);
this.props.updateOrderExpiry(timestamp);
}
- private _onTimeChanged(e: any, time: Date) {
+ private _onTimeChanged(_event: any, time: Date): void {
const timeMoment = moment(time);
this.setState({
timeMoment,
diff --git a/packages/website/ts/components/inputs/hash_input.tsx b/packages/website/ts/components/inputs/hash_input.tsx
index 28305637d..8d9cdfc0b 100644
--- a/packages/website/ts/components/inputs/hash_input.tsx
+++ b/packages/website/ts/components/inputs/hash_input.tsx
@@ -1,5 +1,6 @@
-import { Order, ZeroEx } from '0x.js';
+import { getOrderHashHex } from '@0xproject/order-utils';
import { Styles } from '@0xproject/react-shared';
+import { Order } from '@0xproject/types';
import * as _ from 'lodash';
import * as React from 'react';
import ReactTooltip = require('react-tooltip');
@@ -27,7 +28,7 @@ interface HashInputProps {
interface HashInputState {}
export class HashInput extends React.Component<HashInputProps, HashInputState> {
- public render() {
+ public render(): React.ReactNode {
const msgHashHex = this.props.blockchainIsLoaded ? this._generateMessageHashHex() : '';
return (
<div>
@@ -40,7 +41,7 @@ export class HashInput extends React.Component<HashInputProps, HashInputState> {
</div>
);
}
- private _generateMessageHashHex() {
+ private _generateMessageHashHex(): string {
const exchangeContractAddress = this.props.blockchain.getExchangeContractAddressIfExists();
const hashData = this.props.hashData;
const order: Order = {
@@ -57,7 +58,7 @@ export class HashInput extends React.Component<HashInputProps, HashInputState> {
takerTokenAddress: hashData.receiveTokenContractAddr,
takerTokenAmount: hashData.receiveAmount,
};
- const orderHash = ZeroEx.getOrderHashHex(order);
+ const orderHash = getOrderHashHex(order);
return orderHash;
}
}
diff --git a/packages/website/ts/components/inputs/identicon_address_input.tsx b/packages/website/ts/components/inputs/identicon_address_input.tsx
index 4cf9af64d..6ba7584a7 100644
--- a/packages/website/ts/components/inputs/identicon_address_input.tsx
+++ b/packages/website/ts/components/inputs/identicon_address_input.tsx
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { AddressInput } from 'ts/components/inputs/address_input';
import { Identicon } from 'ts/components/ui/identicon';
@@ -23,7 +22,7 @@ export class IdenticonAddressInput extends React.Component<IdenticonAddressInput
address: props.initialAddress,
};
}
- public render() {
+ public render(): React.ReactNode {
const label = this.props.isRequired ? <RequiredLabel label={this.props.label} /> : this.props.label;
return (
<div className="relative" style={{ width: '100%' }}>
diff --git a/packages/website/ts/components/inputs/token_amount_input.tsx b/packages/website/ts/components/inputs/token_amount_input.tsx
index 9e638b67b..93ef516cf 100644
--- a/packages/website/ts/components/inputs/token_amount_input.tsx
+++ b/packages/website/ts/components/inputs/token_amount_input.tsx
@@ -1,12 +1,12 @@
-import { ZeroEx } from '0x.js';
import { colors } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import * as React from 'react';
import { Link } from 'react-router-dom';
import { Blockchain } from 'ts/blockchain';
import { BalanceBoundedInput } from 'ts/components/inputs/balance_bounded_input';
-import { InputErrMsg, Token, ValidatedBigNumberCallback, WebsitePaths } from 'ts/types';
+import { Token, ValidatedBigNumberCallback, WebsitePaths } from 'ts/types';
interface TokenAmountInputProps {
userAddress: string;
@@ -20,11 +20,13 @@ interface TokenAmountInputProps {
shouldCheckBalance: boolean;
shouldCheckAllowance: boolean;
onChange: ValidatedBigNumberCallback;
- onVisitBalancesPageClick?: () => void;
+ onErrorMsgChange?: (errorMsg: React.ReactNode) => void;
lastForceTokenStateRefetch: number;
shouldShowErrs?: boolean;
shouldShowUnderline?: boolean;
style?: React.CSSProperties;
+ labelStyle?: React.CSSProperties;
+ inputHintStyle?: React.CSSProperties;
}
interface TokenAmountInputState {
@@ -52,14 +54,14 @@ export class TokenAmountInput extends React.Component<TokenAmountInputProps, Tok
isBalanceAndAllowanceLoaded: false,
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
// tslint:disable-next-line:no-floating-promises
this._fetchBalanceAndAllowanceAsync(this.props.token.address, this.props.userAddress);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public componentWillReceiveProps(nextProps: TokenAmountInputProps) {
+ public componentWillReceiveProps(nextProps: TokenAmountInputProps): void {
if (
nextProps.userAddress !== this.props.userAddress ||
nextProps.networkId !== this.props.networkId ||
@@ -70,42 +72,40 @@ export class TokenAmountInput extends React.Component<TokenAmountInputProps, Tok
this._fetchBalanceAndAllowanceAsync(nextProps.token.address, nextProps.userAddress);
}
}
- public render() {
+ public render(): React.ReactNode {
const amount = this.props.amount
- ? ZeroEx.toUnitAmount(this.props.amount, this.props.token.decimals)
+ ? Web3Wrapper.toUnitAmount(this.props.amount, this.props.token.decimals)
: undefined;
- const hasLabel = !_.isUndefined(this.props.label);
- const style = !_.isUndefined(this.props.style)
- ? this.props.style
- : { height: hasLabel ? HEIGHT_WITH_LABEL : HEIGHT_WITHOUT_LABEL };
return (
- <div className="flex overflow-hidden" style={style}>
+ <div className="flex overflow-hidden" style={this._getStyle()}>
<BalanceBoundedInput
label={this.props.label}
amount={amount}
- balance={ZeroEx.toUnitAmount(this.state.balance, this.props.token.decimals)}
+ balance={Web3Wrapper.toUnitAmount(this.state.balance, this.props.token.decimals)}
onChange={this._onChange.bind(this)}
+ onErrorMsgChange={this.props.onErrorMsgChange}
validate={this._validate.bind(this)}
shouldCheckBalance={this.props.shouldCheckBalance}
shouldShowIncompleteErrs={this.props.shouldShowIncompleteErrs}
- onVisitBalancesPageClick={this.props.onVisitBalancesPageClick}
isDisabled={!this.state.isBalanceAndAllowanceLoaded}
hintText={this.props.hintText}
shouldShowErrs={this.props.shouldShowErrs}
shouldShowUnderline={this.props.shouldShowUnderline}
+ inputStyle={this.props.style}
+ inputHintStyle={this.props.inputHintStyle}
/>
- <div style={{ paddingTop: hasLabel ? 39 : 14 }}>{this.props.token.symbol}</div>
+ <div style={this._getLabelStyle()}>{this.props.token.symbol}</div>
</div>
);
}
- private _onChange(isValid: boolean, amount?: BigNumber) {
+ private _onChange(isValid: boolean, amount?: BigNumber): void {
let baseUnitAmount;
if (!_.isUndefined(amount)) {
- baseUnitAmount = ZeroEx.toBaseUnitAmount(amount, this.props.token.decimals);
+ baseUnitAmount = Web3Wrapper.toBaseUnitAmount(amount, this.props.token.decimals);
}
this.props.onChange(isValid, baseUnitAmount);
}
- private _validate(amount: BigNumber): InputErrMsg {
+ private _validate(amount: BigNumber): React.ReactNode {
if (this.props.shouldCheckAllowance && amount.gt(this.state.allowance)) {
return (
<span>
@@ -122,7 +122,7 @@ export class TokenAmountInput extends React.Component<TokenAmountInputProps, Tok
return undefined;
}
}
- private async _fetchBalanceAndAllowanceAsync(tokenAddress: string, userAddress: string) {
+ private async _fetchBalanceAndAllowanceAsync(tokenAddress: string, userAddress: string): Promise<void> {
this.setState({
isBalanceAndAllowanceLoaded: false,
});
@@ -139,4 +139,14 @@ export class TokenAmountInput extends React.Component<TokenAmountInputProps, Tok
});
}
}
+ private _getStyle(): React.CSSProperties {
+ const hasLabel = !_.isUndefined(this.props.label);
+ return !_.isUndefined(this.props.style)
+ ? this.props.style
+ : { height: hasLabel ? HEIGHT_WITH_LABEL : HEIGHT_WITHOUT_LABEL };
+ }
+ private _getLabelStyle(): React.CSSProperties {
+ const hasLabel = !_.isUndefined(this.props.label);
+ return this.props.labelStyle || { paddingTop: hasLabel ? 39 : 14 };
+ }
}
diff --git a/packages/website/ts/components/inputs/token_input.tsx b/packages/website/ts/components/inputs/token_input.tsx
index 545e9a095..0bd36781e 100644
--- a/packages/website/ts/components/inputs/token_input.tsx
+++ b/packages/website/ts/components/inputs/token_input.tsx
@@ -1,5 +1,4 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import Paper from 'material-ui/Paper';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
@@ -38,7 +37,7 @@ export class TokenInput extends React.Component<TokenInputProps, TokenInputState
isPickerOpen: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const token = this.props.tokenByAddress[this.props.assetToken.address];
const iconStyles = {
cursor: 'pointer',
@@ -76,7 +75,7 @@ export class TokenInput extends React.Component<TokenInputProps, TokenInputState
</div>
);
}
- private _onTokenChosen(tokenAddress: string) {
+ private _onTokenChosen(tokenAddress: string): void {
const assetToken: AssetToken = {
address: tokenAddress,
amount: this.props.assetToken.amount,
@@ -86,12 +85,12 @@ export class TokenInput extends React.Component<TokenInputProps, TokenInputState
isPickerOpen: false,
});
}
- private _onToggleHover(isHoveringIcon: boolean) {
+ private _onToggleHover(isHoveringIcon: boolean): void {
this.setState({
isHoveringIcon,
});
}
- private _onAssetClicked() {
+ private _onAssetClicked(): void {
if (this.props.blockchainErr !== BlockchainErrs.NoError) {
this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen(true);
return;
diff --git a/packages/website/ts/components/meta_tags.tsx b/packages/website/ts/components/meta_tags.tsx
new file mode 100644
index 000000000..f6c43d23f
--- /dev/null
+++ b/packages/website/ts/components/meta_tags.tsx
@@ -0,0 +1,25 @@
+import * as React from 'react';
+import { Helmet } from 'react-helmet';
+
+export interface MetaTagsProps {
+ title: string;
+ description: string;
+ imgSrc?: string;
+}
+
+export const MetaTags: React.StatelessComponent<MetaTagsProps> = ({ title, description, imgSrc }) => (
+ <Helmet>
+ <title>{title}</title>
+ <meta name="description" content={description} />
+ <meta property="og:title" content={title} />
+ <meta property="og:description" content={description} />
+ <meta property="og:type" content="website" />
+ <meta property="og:image" content={imgSrc} />
+ <meta name="twitter:site" content="@0xproject" />
+ <meta name="twitter:image" content={imgSrc} />
+ </Helmet>
+);
+
+MetaTags.defaultProps = {
+ imgSrc: '/images/og_image.png',
+};
diff --git a/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx b/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx
new file mode 100644
index 000000000..ca71fcd50
--- /dev/null
+++ b/packages/website/ts/components/onboarding/add_eth_onboarding_step.tsx
@@ -0,0 +1,40 @@
+import { BigNumber } from '@0xproject/utils';
+import * as React from 'react';
+import { Balance } from 'ts/components/ui/balance';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+import { constants } from 'ts/utils/constants';
+
+export interface AddEthOnboardingStepProps {
+ userEthBalanceInWei: BigNumber;
+}
+
+export const AddEthOnboardingStep: React.StatelessComponent<AddEthOnboardingStepProps> = props =>
+ props.userEthBalanceInWei.gt(0) ? (
+ <div className="flex items-center flex-column">
+ <Text>
+ Great! Looks like you already have{' '}
+ <Balance
+ amount={props.userEthBalanceInWei}
+ decimals={constants.DECIMAL_PLACES_ETH}
+ symbol={constants.ETHER_SYMBOL}
+ />{' '}
+ in your wallet.
+ </Text>
+ <Container marginTop="15px" marginBottom="15px">
+ <Image src="/images/ether_alt.svg" height="50px" width="50px" />
+ </Container>
+ </div>
+ ) : (
+ <div className="flex items-center flex-column">
+ <Text> Before you begin you will need to send some ETH to your wallet.</Text>
+ <Container marginTop="15px" marginBottom="15px">
+ <Image src="/images/ether_alt.svg" height="50px" width="50px" />
+ </Container>
+ <Text className="xs-hide">
+ Click on the <Image src="/images/metamask_icon.png" height="20px" width="20px" /> MetaMask extension in
+ your browser and click either <b>BUY</b> or <b>DEPOSIT</b>.
+ </Text>
+ </div>
+ );
diff --git a/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx b/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx
new file mode 100644
index 000000000..8100fd2c0
--- /dev/null
+++ b/packages/website/ts/components/onboarding/congrats_onboarding_step.tsx
@@ -0,0 +1,15 @@
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+
+export interface CongratsOnboardingStepProps {}
+
+export const CongratsOnboardingStep: React.StatelessComponent<CongratsOnboardingStepProps> = () => (
+ <div className="flex items-center flex-column">
+ <Text>Your wallet is now set up for trading. Use it on any relayer in the 0x ecosystem.</Text>
+ <Container marginTop="25px" marginBottom="15px" className="flex justify-center">
+ <img src="/images/zrx_ecosystem.svg" height="150px" />
+ </Container>
+ <Text>No need to log in. Each relayer automatically detects and connects to your wallet.</Text>
+ </div>
+);
diff --git a/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx b/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx
new file mode 100644
index 000000000..d618c8318
--- /dev/null
+++ b/packages/website/ts/components/onboarding/install_wallet_onboarding_step.tsx
@@ -0,0 +1,42 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+import { utils } from 'ts/utils/utils';
+
+export interface InstallWalletOnboardingStepProps {}
+
+export const InstallWalletOnboardingStep: React.StatelessComponent<InstallWalletOnboardingStepProps> = () => {
+ const [downloadLink, isOnMobile] = utils.getBestWalletDownloadLinkAndIsMobile();
+ const followupText = isOnMobile
+ ? `Please revisit this site in your mobile dApp browser to continue!`
+ : `Please refresh the page once you've done this to continue!`;
+ const downloadText = isOnMobile ? 'Get the Toshi Wallet' : 'Get the MetaMask extension';
+ return (
+ <div className="flex items-center flex-column">
+ <Text>First, you need to connect to a wallet. This will be used across all 0x relayers and dApps.</Text>
+ <Container className="flex items-center" marginTop="15px" marginBottom="15px">
+ <Image
+ height="50px"
+ width="50px"
+ borderRadius="22%"
+ src={isOnMobile ? '/images/toshi_logo.jpg' : '/images/metamask_icon.png'}
+ />
+ <Container marginLeft="10px">
+ <a href={downloadLink} target="_blank">
+ <Text
+ fontWeight={700}
+ fontSize="18px"
+ fontColor={colors.mediumBlue}
+ textDecorationLine="underline"
+ >
+ {downloadText}
+ </Text>
+ </a>
+ </Container>
+ </Container>
+ <Text>{followupText}</Text>
+ </div>
+ );
+};
diff --git a/packages/website/ts/components/onboarding/intro_onboarding_step.tsx b/packages/website/ts/components/onboarding/intro_onboarding_step.tsx
new file mode 100644
index 000000000..3a27b6854
--- /dev/null
+++ b/packages/website/ts/components/onboarding/intro_onboarding_step.tsx
@@ -0,0 +1,28 @@
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+
+export interface IntroOnboardingStepProps {}
+
+export const IntroOnboardingStep: React.StatelessComponent<IntroOnboardingStepProps> = () => (
+ <div className="flex items-center flex-column">
+ <Text>
+ In order to start trading on any 0x relayer in the 0x ecosystem, you need to complete three simple steps.
+ </Text>
+ <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-around">
+ <div className="flex flex-column items-center">
+ <Image src="/images/ether.png" height="50px" width="50px" />
+ <Text> Add ETH </Text>
+ </div>
+ <div className="flex flex-column items-center">
+ <Image src="/images/eth_token.svg" height="50px" width="50x" />
+ <Text> Wrap ETH </Text>
+ </div>
+ <div className="flex flex-column items-center">
+ <Image src="/images/fake_toggle.svg" height="50px" width="50px" />
+ <Text> Unlock tokens </Text>
+ </div>
+ </Container>
+ </div>
+);
diff --git a/packages/website/ts/components/onboarding/onboarding_card.tsx b/packages/website/ts/components/onboarding/onboarding_card.tsx
new file mode 100644
index 000000000..e1b0f304b
--- /dev/null
+++ b/packages/website/ts/components/onboarding/onboarding_card.tsx
@@ -0,0 +1,115 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+
+import * as _ from 'lodash';
+import { Button } from 'ts/components/ui/button';
+import { Container } from 'ts/components/ui/container';
+import { IconButton } from 'ts/components/ui/icon_button';
+import { Island } from 'ts/components/ui/island';
+import { Text, Title } from 'ts/components/ui/text';
+
+export type ContinueButtonDisplay = 'enabled' | 'disabled';
+
+export interface OnboardingCardProps {
+ title?: string;
+ shouldCenterTitle?: boolean;
+ content: React.ReactNode;
+ isLastStep: boolean;
+ onClose: () => void;
+ onClickNext: () => void;
+ onClickBack: () => void;
+ onContinueButtonClick?: () => void;
+ continueButtonDisplay?: ContinueButtonDisplay;
+ shouldHideBackButton?: boolean;
+ shouldHideNextButton?: boolean;
+ continueButtonText?: string;
+ borderRadius?: string;
+ // Used for super-custom content.
+ shouldRemoveExtraSpacing?: boolean;
+}
+
+export const OnboardingCard: React.StatelessComponent<OnboardingCardProps> = ({
+ title,
+ shouldCenterTitle,
+ content,
+ continueButtonDisplay,
+ continueButtonText,
+ onContinueButtonClick,
+ onClickNext,
+ onClickBack,
+ onClose,
+ shouldHideBackButton,
+ shouldHideNextButton,
+ borderRadius,
+ shouldRemoveExtraSpacing,
+}) => {
+ const padding = shouldRemoveExtraSpacing
+ ? {}
+ : {
+ paddingRight: '30px',
+ paddingLeft: '30px',
+ paddingTop: '15px',
+ paddingBottom: '15px',
+ };
+ const closeIconPositioning = shouldRemoveExtraSpacing
+ ? { right: '15px', bottom: '3px' }
+ : { bottom: '20px', left: '15px' };
+ return (
+ <Island borderRadius={borderRadius}>
+ <Container {...padding}>
+ <div className="flex flex-column">
+ <Container className="flex justify-between">
+ <Container width="100%">
+ <Title center={shouldCenterTitle}>{title}</Title>
+ </Container>
+ <Container position="relative" {...closeIconPositioning}>
+ <IconButton color={colors.grey} iconName="zmdi-close" onClick={onClose}>
+ Close
+ </IconButton>
+ </Container>
+ </Container>
+ <Container marginBottom={shouldRemoveExtraSpacing ? undefined : '15px'}>
+ <Text>{content}</Text>
+ </Container>
+ {continueButtonDisplay && (
+ <Button
+ isDisabled={continueButtonDisplay === 'disabled'}
+ onClick={!_.isUndefined(onContinueButtonClick) ? onContinueButtonClick : onClickNext}
+ fontColor={colors.white}
+ fontSize="15px"
+ backgroundColor={colors.mediumBlue}
+ >
+ {continueButtonText}
+ </Button>
+ )}
+ {!(shouldHideBackButton && shouldHideNextButton) && (
+ <Container className="clearfix" marginTop="15px">
+ <div className="left">
+ {!shouldHideBackButton && (
+ <Text fontColor={colors.grey} onClick={onClickBack}>
+ Back
+ </Text>
+ )}
+ </div>
+ <div className="right">
+ {!shouldHideNextButton && (
+ <Text fontColor={colors.grey} onClick={onClickNext}>
+ Skip
+ </Text>
+ )}
+ </div>
+ </Container>
+ )}
+ </div>
+ </Container>
+ </Island>
+ );
+};
+
+OnboardingCard.defaultProps = {
+ continueButtonText: 'Continue',
+ shouldCenterTitle: false,
+ shouldRemoveExtraSpacing: false,
+};
+
+OnboardingCard.displayName = 'OnboardingCard';
diff --git a/packages/website/ts/components/onboarding/onboarding_flow.tsx b/packages/website/ts/components/onboarding/onboarding_flow.tsx
new file mode 100644
index 000000000..91d5f2476
--- /dev/null
+++ b/packages/website/ts/components/onboarding/onboarding_flow.tsx
@@ -0,0 +1,182 @@
+import * as React from 'react';
+import { Placement, Popper, PopperChildrenProps } from 'react-popper';
+
+import { OnboardingCard } from 'ts/components/onboarding/onboarding_card';
+import {
+ ContinueButtonDisplay,
+ OnboardingTooltip,
+ TooltipPointerDisplay,
+} from 'ts/components/onboarding/onboarding_tooltip';
+import { Animation } from 'ts/components/ui/animation';
+import { Container } from 'ts/components/ui/container';
+import { Overlay } from 'ts/components/ui/overlay';
+import { zIndex } from 'ts/style/z_index';
+
+export interface FixedPositionSettings {
+ type: 'fixed';
+ top?: string;
+ bottom?: string;
+ left?: string;
+ right?: string;
+ tooltipPointerDisplay?: TooltipPointerDisplay;
+}
+
+export interface TargetPositionSettings {
+ type: 'target';
+ target: string;
+ placement: Placement;
+}
+
+export interface Step {
+ // Provide either a CSS selector, or fixed position settings. Only applies to desktop.
+ position: TargetPositionSettings | FixedPositionSettings;
+ title?: string;
+ shouldCenterTitle?: boolean;
+ content: React.ReactNode;
+ shouldHideBackButton?: boolean;
+ shouldHideNextButton?: boolean;
+ continueButtonDisplay?: ContinueButtonDisplay;
+ continueButtonText?: string;
+ onContinueButtonClick?: () => void;
+ // Only used for very custom steps.
+ shouldRemoveExtraSpacing?: boolean;
+}
+
+export interface OnboardingFlowProps {
+ steps: Step[];
+ stepIndex: number;
+ isRunning: boolean;
+ onClose: () => void;
+ updateOnboardingStep: (stepIndex: number) => void;
+ disableOverlay?: boolean;
+ isMobile: boolean;
+ disableCloseOnClickOutside?: boolean;
+}
+
+export class OnboardingFlow extends React.Component<OnboardingFlowProps> {
+ public static defaultProps = {
+ disableOverlay: false,
+ isMobile: false,
+ disableCloseOnClickOutside: false,
+ };
+ public render(): React.ReactNode {
+ if (!this.props.isRunning) {
+ return null;
+ }
+ let onboardingElement = null;
+ const currentStep = this._getCurrentStep();
+ if (this.props.isMobile) {
+ onboardingElement = <Animation type="easeUpFromBottom">{this._renderOnboardingCard()}</Animation>;
+ } else if (currentStep.position.type === 'target') {
+ const { placement, target } = currentStep.position;
+ onboardingElement = (
+ <Popper referenceElement={document.querySelector(target)} placement={placement} positionFixed={true}>
+ {this._renderPopperChildren.bind(this)}
+ </Popper>
+ );
+ } else if (currentStep.position.type === 'fixed') {
+ const { top, right, bottom, left, tooltipPointerDisplay } = currentStep.position;
+ onboardingElement = (
+ <Container
+ position="fixed"
+ zIndex={zIndex.aboveOverlay}
+ top={top}
+ right={right}
+ bottom={bottom}
+ left={left}
+ >
+ {this._renderToolTip(tooltipPointerDisplay)}
+ </Container>
+ );
+ }
+ if (this.props.disableOverlay) {
+ return onboardingElement;
+ }
+ return (
+ <div>
+ <Overlay onClick={this.props.disableCloseOnClickOutside ? undefined : this.props.onClose} />
+ {onboardingElement}
+ </div>
+ );
+ }
+ private _renderPopperChildren(props: PopperChildrenProps): React.ReactNode {
+ const customStyles = { zIndex: zIndex.aboveOverlay };
+ // On re-render, we want to re-center the popper.
+ props.scheduleUpdate();
+ return (
+ <div ref={props.ref} style={{ ...props.style, ...customStyles }} data-placement={props.placement}>
+ {this._renderToolTip()}
+ </div>
+ );
+ }
+ private _renderToolTip(tooltipPointerDisplay?: TooltipPointerDisplay): React.ReactNode {
+ const { steps, stepIndex } = this.props;
+ const step = steps[stepIndex];
+ const isLastStep = steps.length - 1 === stepIndex;
+ return (
+ <Container marginLeft="30px" width="400px">
+ <OnboardingTooltip
+ title={step.title}
+ shouldCenterTitle={step.shouldCenterTitle}
+ content={step.content}
+ isLastStep={isLastStep}
+ shouldHideBackButton={step.shouldHideBackButton}
+ shouldHideNextButton={step.shouldHideNextButton}
+ onClose={this.props.onClose}
+ onClickNext={this._goToNextStep.bind(this)}
+ onClickBack={this._goToPrevStep.bind(this)}
+ continueButtonDisplay={step.continueButtonDisplay}
+ continueButtonText={step.continueButtonText}
+ onContinueButtonClick={step.onContinueButtonClick}
+ pointerDisplay={tooltipPointerDisplay}
+ shouldRemoveExtraSpacing={step.shouldRemoveExtraSpacing}
+ />
+ </Container>
+ );
+ }
+
+ private _renderOnboardingCard(): React.ReactNode {
+ const { steps, stepIndex } = this.props;
+ const step = steps[stepIndex];
+ const isLastStep = steps.length - 1 === stepIndex;
+ return (
+ <Container position="relative" zIndex={1}>
+ <OnboardingCard
+ title={step.title}
+ shouldCenterTitle={step.shouldCenterTitle}
+ content={step.content}
+ isLastStep={isLastStep}
+ shouldHideBackButton={step.shouldHideBackButton}
+ shouldHideNextButton={step.shouldHideNextButton}
+ onClose={this.props.onClose}
+ onClickNext={this._goToNextStep.bind(this)}
+ onClickBack={this._goToPrevStep.bind(this)}
+ continueButtonDisplay={step.continueButtonDisplay}
+ continueButtonText={step.continueButtonText}
+ onContinueButtonClick={step.onContinueButtonClick}
+ borderRadius="10px 10px 0px 0px"
+ shouldRemoveExtraSpacing={step.shouldRemoveExtraSpacing}
+ />
+ </Container>
+ );
+ }
+ private _getCurrentStep(): Step {
+ return this.props.steps[this.props.stepIndex];
+ }
+ private _goToNextStep(): void {
+ const nextStep = this.props.stepIndex + 1;
+ if (nextStep < this.props.steps.length) {
+ this.props.updateOnboardingStep(nextStep);
+ } else {
+ this.props.onClose();
+ }
+ }
+ private _goToPrevStep(): void {
+ const nextStep = this.props.stepIndex - 1;
+ if (nextStep >= 0) {
+ this.props.updateOnboardingStep(nextStep);
+ } else {
+ this.props.onClose();
+ }
+ }
+}
diff --git a/packages/website/ts/components/onboarding/onboarding_tooltip.tsx b/packages/website/ts/components/onboarding/onboarding_tooltip.tsx
new file mode 100644
index 000000000..ff5f0bab6
--- /dev/null
+++ b/packages/website/ts/components/onboarding/onboarding_tooltip.tsx
@@ -0,0 +1,30 @@
+import * as React from 'react';
+
+import { OnboardingCard, OnboardingCardProps } from 'ts/components/onboarding/onboarding_card';
+import { Pointer, PointerDirection } from 'ts/components/ui/pointer';
+
+export type ContinueButtonDisplay = 'enabled' | 'disabled';
+export type TooltipPointerDisplay = PointerDirection | 'none';
+
+export interface OnboardingTooltipProps extends OnboardingCardProps {
+ className?: string;
+ pointerDisplay?: TooltipPointerDisplay;
+}
+
+export const OnboardingTooltip: React.StatelessComponent<OnboardingTooltipProps> = props => {
+ const { pointerDisplay, className, ...cardProps } = props;
+ const card = <OnboardingCard {...cardProps} />;
+ if (pointerDisplay === 'none') {
+ return card;
+ }
+ return (
+ <Pointer className={className} direction={pointerDisplay}>
+ <OnboardingCard {...cardProps} />
+ </Pointer>
+ );
+};
+OnboardingTooltip.defaultProps = {
+ pointerDisplay: PointerDirection.Left,
+};
+
+OnboardingTooltip.displayName = 'OnboardingTooltip';
diff --git a/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx b/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx
new file mode 100644
index 000000000..522687758
--- /dev/null
+++ b/packages/website/ts/components/onboarding/portal_onboarding_flow.tsx
@@ -0,0 +1,281 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import { RouteComponentProps, withRouter } from 'react-router';
+
+import { BigNumber } from '@0xproject/utils';
+import { Blockchain } from 'ts/blockchain';
+import { AddEthOnboardingStep } from 'ts/components/onboarding/add_eth_onboarding_step';
+import { CongratsOnboardingStep } from 'ts/components/onboarding/congrats_onboarding_step';
+import { InstallWalletOnboardingStep } from 'ts/components/onboarding/install_wallet_onboarding_step';
+import { IntroOnboardingStep } from 'ts/components/onboarding/intro_onboarding_step';
+import {
+ FixedPositionSettings,
+ OnboardingFlow,
+ Step,
+ TargetPositionSettings,
+} from 'ts/components/onboarding/onboarding_flow';
+import { SetAllowancesOnboardingStep } from 'ts/components/onboarding/set_allowances_onboarding_step';
+import { UnlockWalletOnboardingStep } from 'ts/components/onboarding/unlock_wallet_onboarding_step';
+import {
+ WrapEthOnboardingStep1,
+ WrapEthOnboardingStep2,
+ WrapEthOnboardingStep3,
+} from 'ts/components/onboarding/wrap_eth_onboarding_step';
+import { AllowanceStateToggle } from 'ts/containers/inputs/allowance_state_toggle';
+import { BrowserType, ProviderType, ScreenWidths, Token, TokenByAddress, TokenStateByAddress } from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
+import { utils } from 'ts/utils/utils';
+
+export interface PortalOnboardingFlowProps extends RouteComponentProps<any> {
+ networkId: number;
+ blockchain: Blockchain;
+ stepIndex: number;
+ isRunning: boolean;
+ userAddress: string;
+ hasBeenClosed: boolean;
+ providerType: ProviderType;
+ injectedProviderName: string;
+ blockchainIsLoaded: boolean;
+ userEtherBalanceInWei?: BigNumber;
+ tokenByAddress: TokenByAddress;
+ trackedTokenStateByAddress: TokenStateByAddress;
+ updateIsRunning: (isRunning: boolean) => void;
+ updateOnboardingStep: (stepIndex: number) => void;
+ refetchTokenStateAsync: (tokenAddress: string) => Promise<void>;
+ screenWidth: ScreenWidths;
+}
+
+class PlainPortalOnboardingFlow extends React.Component<PortalOnboardingFlowProps> {
+ private _unlisten: () => void;
+ public componentDidMount(): void {
+ this._adjustStepIfShould();
+ // If there is a route change, just close onboarding.
+ this._unlisten = this.props.history.listen(() => this.props.updateIsRunning(false));
+ }
+ public componentWillUnmount(): void {
+ this._unlisten();
+ }
+ public componentDidUpdate(prevProps: PortalOnboardingFlowProps): void {
+ // Any one of steps 0-3 could be the starting step, and we only want to reset the scroll on the starting step.
+ if (this.props.isRunning && utils.isMobileWidth(this.props.screenWidth) && this.props.stepIndex < 3) {
+ // On mobile, make sure the wallet is completely visible.
+ document.querySelector('.wallet').scrollIntoView();
+ }
+ this._adjustStepIfShould();
+ if (!prevProps.blockchainIsLoaded && this.props.blockchainIsLoaded) {
+ this._autoStartOnboardingIfShould();
+ }
+ }
+ public render(): React.ReactNode {
+ const browserType = utils.getBrowserType();
+ return (
+ <OnboardingFlow
+ steps={this._getSteps()}
+ stepIndex={this.props.stepIndex}
+ isRunning={this.props.isRunning}
+ onClose={this._closeOnboarding.bind(this)}
+ updateOnboardingStep={this._updateOnboardingStep.bind(this)}
+ disableOverlay={this.props.screenWidth === ScreenWidths.Sm}
+ isMobile={this.props.screenWidth === ScreenWidths.Sm}
+ // This is necessary to ensure onboarding stays open once the user unlocks metamask and clicks away
+ disableCloseOnClickOutside={browserType === BrowserType.Firefox || browserType === BrowserType.Opera}
+ />
+ );
+ }
+ private _getSteps(): Step[] {
+ const nextToWalletPosition: TargetPositionSettings = {
+ type: 'target',
+ target: '.wallet',
+ placement: 'right',
+ };
+ const underMetamaskExtension: FixedPositionSettings = {
+ type: 'fixed',
+ top: '10px',
+ right: '10px',
+ tooltipPointerDisplay: 'none',
+ };
+ const steps: Step[] = [
+ {
+ position: nextToWalletPosition,
+ title: '0x Ecosystem Setup',
+ content: <InstallWalletOnboardingStep />,
+ shouldHideBackButton: true,
+ shouldHideNextButton: true,
+ },
+ {
+ position: underMetamaskExtension,
+ title: 'Please Unlock Metamask...',
+ content: <UnlockWalletOnboardingStep />,
+ shouldHideBackButton: true,
+ shouldHideNextButton: true,
+ shouldCenterTitle: true,
+ shouldRemoveExtraSpacing: true,
+ },
+ {
+ position: nextToWalletPosition,
+ title: '0x Ecosystem Account Setup',
+ content: <IntroOnboardingStep />,
+ shouldHideBackButton: true,
+ continueButtonDisplay: 'enabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: 'Step 1: Add ETH',
+ content: (
+ <AddEthOnboardingStep userEthBalanceInWei={this.props.userEtherBalanceInWei || new BigNumber(0)} />
+ ),
+ continueButtonDisplay: this._userHasVisibleEth() ? 'enabled' : 'disabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: 'Step 2: Wrap ETH',
+ content: <WrapEthOnboardingStep1 />,
+ continueButtonDisplay: 'enabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: 'Step 2: Wrap ETH',
+ content: <WrapEthOnboardingStep2 />,
+ continueButtonDisplay: this._userHasVisibleWeth() ? 'enabled' : 'disabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: 'Step 2: Wrap ETH',
+ content: <WrapEthOnboardingStep3 wethAmount={this._getWethBalance()} />,
+ continueButtonDisplay: this._userHasVisibleWeth() ? 'enabled' : 'disabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: 'Step 3: Unlock Tokens',
+ content: (
+ <SetAllowancesOnboardingStep
+ zrxAllowanceToggle={this._renderZrxAllowanceStateToggle()}
+ ethAllowanceToggle={this._renderEthAllowanceStateToggle()}
+ doesUserHaveAllowancesForWethAndZrx={this._doesUserHaveAllowancesForWethAndZrx()}
+ />
+ ),
+ continueButtonDisplay: this._doesUserHaveAllowancesForWethAndZrx() ? 'enabled' : 'disabled',
+ },
+ {
+ position: nextToWalletPosition,
+ title: '🎉 The Ecosystem Awaits',
+ content: <CongratsOnboardingStep />,
+ continueButtonDisplay: 'enabled',
+ shouldHideNextButton: true,
+ continueButtonText: 'Enter the 0x Ecosystem',
+ onContinueButtonClick: this._handleFinalStepContinueClick.bind(this),
+ },
+ ];
+ return steps;
+ }
+ private _isAddressAvailable(): boolean {
+ return !_.isEmpty(this.props.userAddress);
+ }
+ private _userHasVisibleEth(): boolean {
+ return this.props.userEtherBalanceInWei > new BigNumber(0);
+ }
+ private _getWethBalance(): BigNumber {
+ const ethToken = utils.getEthToken(this.props.tokenByAddress);
+ if (!ethToken) {
+ return new BigNumber(0);
+ }
+ const ethTokenState = this.props.trackedTokenStateByAddress[ethToken.address];
+ return ethTokenState.balance;
+ }
+ private _userHasVisibleWeth(): boolean {
+ return this._getWethBalance() > new BigNumber(0);
+ }
+ private _doesUserHaveAllowancesForWethAndZrx(): boolean {
+ const ethToken = utils.getEthToken(this.props.tokenByAddress);
+ const zrxToken = utils.getZrxToken(this.props.tokenByAddress);
+ if (ethToken && zrxToken) {
+ const ethTokenState = this.props.trackedTokenStateByAddress[ethToken.address];
+ const zrxTokenState = this.props.trackedTokenStateByAddress[zrxToken.address];
+ if (ethTokenState && zrxTokenState) {
+ return ethTokenState.allowance.gt(0) && zrxTokenState.allowance.gt(0);
+ }
+ }
+ return false;
+ }
+ private _adjustStepIfShould(): void {
+ const stepIndex = this.props.stepIndex;
+ if (this._isAddressAvailable()) {
+ if (stepIndex < 2) {
+ this.props.updateOnboardingStep(2);
+ }
+ return;
+ }
+ const isExternallyInjected = utils.isExternallyInjected(
+ this.props.providerType,
+ this.props.injectedProviderName,
+ );
+ if (isExternallyInjected) {
+ if (stepIndex !== 1) {
+ this.props.updateOnboardingStep(1);
+ }
+ return;
+ }
+ if (stepIndex !== 0) {
+ this.props.updateOnboardingStep(0);
+ }
+ }
+ private _autoStartOnboardingIfShould(): void {
+ if (
+ (this.props.stepIndex === 0 && !this.props.isRunning && this.props.blockchainIsLoaded) ||
+ (!this.props.isRunning && !this.props.hasBeenClosed && this.props.blockchainIsLoaded)
+ ) {
+ analytics.track('Onboarding Started', {
+ reason: 'automatic',
+ stepIndex: this.props.stepIndex,
+ });
+ this.props.updateIsRunning(true);
+ }
+ }
+ private _updateOnboardingStep(stepIndex: number): void {
+ this.props.updateOnboardingStep(stepIndex);
+ analytics.track('Update Onboarding Step', {
+ stepIndex,
+ });
+ }
+ private _closeOnboarding(): void {
+ this.props.updateIsRunning(false);
+ analytics.track('Onboarding Closed', {
+ stepIndex: this.props.stepIndex,
+ });
+ }
+ private _renderZrxAllowanceStateToggle(): React.ReactNode {
+ const zrxToken = utils.getZrxToken(this.props.tokenByAddress);
+ return this._renderAllowanceStateToggle(zrxToken);
+ }
+ private _renderEthAllowanceStateToggle(): React.ReactNode {
+ const ethToken = utils.getEthToken(this.props.tokenByAddress);
+ return this._renderAllowanceStateToggle(ethToken);
+ }
+ private _renderAllowanceStateToggle(token: Token): React.ReactNode {
+ if (!token) {
+ return null;
+ }
+ const tokenStateIfExists = this.props.trackedTokenStateByAddress[token.address];
+ if (_.isUndefined(tokenStateIfExists)) {
+ return null;
+ }
+ return (
+ <AllowanceStateToggle
+ token={token}
+ tokenState={tokenStateIfExists}
+ blockchain={this.props.blockchain}
+ // tslint:disable-next-line:jsx-no-lambda
+ refetchTokenStateAsync={async () => this.props.refetchTokenStateAsync(token.address)}
+ />
+ );
+ }
+ private _handleFinalStepContinueClick(): void {
+ if (utils.isMobileWidth(this.props.screenWidth)) {
+ window.scrollTo(0, 0);
+ this.props.history.push('/portal');
+ }
+ this._closeOnboarding();
+ }
+}
+
+export const PortalOnboardingFlow = withRouter(PlainPortalOnboardingFlow);
diff --git a/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx b/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx
new file mode 100644
index 000000000..5ddfe38d7
--- /dev/null
+++ b/packages/website/ts/components/onboarding/set_allowances_onboarding_step.tsx
@@ -0,0 +1,30 @@
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+
+export interface SetAllowancesOnboardingStepProps {
+ zrxAllowanceToggle: React.ReactNode;
+ ethAllowanceToggle: React.ReactNode;
+ doesUserHaveAllowancesForWethAndZrx: boolean;
+}
+
+export const SetAllowancesOnboardingStep: React.StatelessComponent<SetAllowancesOnboardingStepProps> = ({
+ ethAllowanceToggle,
+ zrxAllowanceToggle,
+ doesUserHaveAllowancesForWethAndZrx,
+}) => (
+ <div className="flex items-center flex-column">
+ <Text>Unlock your tokens for trading. You only need to do this once for each token.</Text>
+ <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-around">
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> Enable WETH </Text>
+ <Container marginTop="10px">{ethAllowanceToggle}</Container>
+ </div>
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> Enable ZRX </Text>
+ <Container marginTop="10px">{zrxAllowanceToggle}</Container>
+ </div>
+ </Container>
+ {doesUserHaveAllowancesForWethAndZrx && <Text>Perfect! Both your ZRX and WETH tokens are unlocked.</Text>}
+ </div>
+);
diff --git a/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx b/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx
new file mode 100644
index 000000000..358141520
--- /dev/null
+++ b/packages/website/ts/components/onboarding/unlock_wallet_onboarding_step.tsx
@@ -0,0 +1,8 @@
+import * as React from 'react';
+import { Image } from 'ts/components/ui/image';
+
+export interface UnlockWalletOnboardingStepProps {}
+
+export const UnlockWalletOnboardingStep: React.StatelessComponent<UnlockWalletOnboardingStepProps> = () => (
+ <Image src="/images/unlock-mm.png" />
+);
diff --git a/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx b/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx
new file mode 100644
index 000000000..e4332de75
--- /dev/null
+++ b/packages/website/ts/components/onboarding/wrap_eth_onboarding_step.tsx
@@ -0,0 +1,88 @@
+import { colors } from '@0xproject/react-shared';
+import { BigNumber } from '@0xproject/utils';
+import * as React from 'react';
+import { Balance } from 'ts/components/ui/balance';
+import { Container } from 'ts/components/ui/container';
+import { IconButton } from 'ts/components/ui/icon_button';
+import { Text } from 'ts/components/ui/text';
+import { constants } from 'ts/utils/constants';
+
+export interface WrapEthOnboardingStep1Props {}
+
+export const WrapEthOnboardingStep1: React.StatelessComponent<WrapEthOnboardingStep1Props> = () => (
+ <div className="flex items-center flex-column">
+ <Text>
+ You need to convert some of your ETH into tradeable <b>Wrapped ETH (WETH)</b>.
+ </Text>
+ <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-center">
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> 1 ETH </Text>
+ <img src="/images/eth_dollar.svg" height="75px" width="75x" />
+ </div>
+ <Container marginRight="25px" marginLeft="25px" position="relative" top="20px">
+ <Text fontSize="36px">=</Text>
+ </Container>
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> 1 WETH </Text>
+ <img src="/images/eth_token_erc20.svg" height="75px" width="75px" />
+ </div>
+ </Container>
+ <Text>
+ Think of it like the coin version of a paper note. It has the same value, but some machines only take coins.
+ </Text>
+ </div>
+);
+
+export interface WrapEthOnboardingStep2Props {}
+
+export const WrapEthOnboardingStep2: React.StatelessComponent<WrapEthOnboardingStep2Props> = () => (
+ <div className="flex items-center flex-column">
+ <Text>Wrapping your ETH is a reversable transaction, so don't worry about losing your ETH.</Text>
+ <Text>
+ Click
+ <Container display="inline-block" marginLeft="10px" marginRight="10px">
+ <IconButton
+ iconName="zmdi-long-arrow-down"
+ color={colors.mediumBlue}
+ labelText="wrap"
+ display="inline-flex"
+ />
+ </Container>
+ to wrap your ETH.
+ </Text>
+ </div>
+);
+
+export interface WrapEthOnboardingStep3Props {
+ wethAmount: BigNumber;
+}
+
+export const WrapEthOnboardingStep3: React.StatelessComponent<WrapEthOnboardingStep3Props> = ({ wethAmount }) => (
+ <div className="flex items-center flex-column">
+ <Text>
+ You have{' '}
+ <Balance
+ amount={wethAmount}
+ decimals={constants.DECIMAL_PLACES_ETH}
+ symbol={constants.ETHER_TOKEN_SYMBOL}
+ />{' '}
+ in your wallet.
+ {wethAmount.gt(0) && ' Great!'}
+ </Text>
+ <Container width="100%" marginTop="25px" marginBottom="15px" className="flex justify-center">
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> 1 ETH </Text>
+ <img src="/images/eth_dollar.svg" height="75px" width="75x" />
+ </div>
+ <Container marginRight="25px" marginLeft="25px" position="relative" top="20px">
+ <Text fontSize="25px">
+ <i className="zmdi zmdi-long-arrow-right" />
+ </Text>
+ </Container>
+ <div className="flex flex-column items-center">
+ <Text fontWeight={700}> 1 WETH </Text>
+ <img src="/images/eth_token_erc20.svg" height="75px" width="75px" />
+ </div>
+ </Container>
+ </div>
+);
diff --git a/packages/website/ts/components/order_json.tsx b/packages/website/ts/components/order_json.tsx
index 02b88b888..cf06f10c8 100644
--- a/packages/website/ts/components/order_json.tsx
+++ b/packages/website/ts/components/order_json.tsx
@@ -1,5 +1,5 @@
-import { ECSignature } from '0x.js';
-import { BigNumber, logUtils } from '@0xproject/utils';
+import { ECSignature } from '@0xproject/types';
+import { BigNumber, fetchAsync, logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import Paper from 'material-ui/Paper';
import TextField from 'material-ui/TextField';
@@ -38,7 +38,7 @@ export class OrderJSON extends React.Component<OrderJSONProps, OrderJSONState> {
// tslint:disable-next-line:no-floating-promises
this._setShareLinkAsync();
}
- public render() {
+ public render(): React.ReactNode {
const order = utils.generateOrder(
this.props.exchangeContractIfExists,
this.props.sideToAssetToken,
@@ -116,28 +116,28 @@ export class OrderJSON extends React.Component<OrderJSONProps, OrderJSONState> {
</div>
);
}
- private async _shareViaTwitterAsync() {
+ private _shareViaTwitterAsync(): void {
const tweetText = encodeURIComponent(`Fill my order using the 0x protocol: ${this.state.shareLink}`);
window.open(`https://twitter.com/intent/tweet?text=${tweetText}`, 'Share your order', 'width=500,height=400');
}
- private async _shareViaFacebook() {
+ private _shareViaFacebook(): void {
(window as any).FB.ui(
{
display: 'popup',
href: this.state.shareLink,
method: 'share',
},
- _.noop,
+ _.noop.bind(_),
);
}
- private async _shareViaEmailAsync() {
+ private _shareViaEmailAsync(): void {
const encodedSubject = encodeURIComponent("Let's trade using the 0x protocol");
const encodedBody = encodeURIComponent(`I generated an order with the 0x protocol.
You can see and fill it here: ${this.state.shareLink}`);
const mailToLink = `mailto:mail@example.org?subject=${encodedSubject}&body=${encodedBody}`;
window.open(mailToLink, '_blank');
}
- private async _setShareLinkAsync() {
+ private async _setShareLinkAsync(): Promise<void> {
const shareLink = await this._generateShareLinkAsync();
this.setState({
shareLink,
@@ -148,18 +148,18 @@ You can see and fill it here: ${this.state.shareLink}`);
const bitlyRequestUrl = `${constants.URL_BITLY_API}/v3/shorten?access_token=${
configs.BITLY_ACCESS_TOKEN
}&longUrl=${longUrl}`;
- const response = await fetch(bitlyRequestUrl);
+ const response = await fetchAsync(bitlyRequestUrl);
const responseBody = await response.text();
const bodyObj = JSON.parse(responseBody);
if (response.status !== 200 || bodyObj.status_code !== 200) {
// TODO: Show error message in UI
logUtils.log(`Unexpected status code: ${response.status} -> ${responseBody}`);
- await errorReporter.reportAsync(new Error(`Bitly returned non-200: ${JSON.stringify(response)}`));
+ errorReporter.report(new Error(`Bitly returned non-200: ${JSON.stringify(response)}`));
return '';
}
return bodyObj.data.url;
}
- private _getOrderUrl() {
+ private _getOrderUrl(): string {
const order = utils.generateOrder(
this.props.exchangeContractIfExists,
this.props.sideToAssetToken,
diff --git a/packages/website/ts/components/portal.tsx b/packages/website/ts/components/portal.tsx
deleted file mode 100644
index ceb0ecc72..000000000
--- a/packages/website/ts/components/portal.tsx
+++ /dev/null
@@ -1,427 +0,0 @@
-import { colors } from '@0xproject/react-shared';
-import { BigNumber, logUtils } from '@0xproject/utils';
-import * as _ from 'lodash';
-import CircularProgress from 'material-ui/CircularProgress';
-import Paper from 'material-ui/Paper';
-import * as React from 'react';
-import * as DocumentTitle from 'react-document-title';
-import { Route, Switch } from 'react-router-dom';
-import { Blockchain } from 'ts/blockchain';
-import { BlockchainErrDialog } from 'ts/components/dialogs/blockchain_err_dialog';
-import { LedgerConfigDialog } from 'ts/components/dialogs/ledger_config_dialog';
-import { PortalDisclaimerDialog } from 'ts/components/dialogs/portal_disclaimer_dialog';
-import { WrappedEthSectionNoticeDialog } from 'ts/components/dialogs/wrapped_eth_section_notice_dialog';
-import { EthWrappers } from 'ts/components/eth_wrappers';
-import { FillOrder } from 'ts/components/fill_order';
-import { Footer } from 'ts/components/footer';
-import { PortalMenu } from 'ts/components/portal_menu';
-import { TokenBalances } from 'ts/components/token_balances';
-import { TopBar } from 'ts/components/top_bar/top_bar';
-import { TradeHistory } from 'ts/components/trade_history/trade_history';
-import { FlashMessage } from 'ts/components/ui/flash_message';
-import { Wallet } from 'ts/components/wallet/wallet';
-import { GenerateOrderForm } from 'ts/containers/generate_order_form';
-import { localStorage } from 'ts/local_storage/local_storage';
-import { Dispatcher } from 'ts/redux/dispatcher';
-import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
-import { validator } from 'ts/schemas/validator';
-import {
- BlockchainErrs,
- Environments,
- HashData,
- Order,
- ProviderType,
- ScreenWidths,
- TokenByAddress,
- WebsitePaths,
-} from 'ts/types';
-import { configs } from 'ts/utils/configs';
-import { constants } from 'ts/utils/constants';
-import { Translate } from 'ts/utils/translate';
-import { utils } from 'ts/utils/utils';
-
-const THROTTLE_TIMEOUT = 100;
-
-export interface PortalPassedProps {}
-
-export interface PortalAllProps {
- blockchainErr: BlockchainErrs;
- blockchainIsLoaded: boolean;
- dispatcher: Dispatcher;
- hashData: HashData;
- injectedProviderName: string;
- networkId: number;
- nodeVersion: string;
- orderFillAmount: BigNumber;
- providerType: ProviderType;
- screenWidth: ScreenWidths;
- tokenByAddress: TokenByAddress;
- userEtherBalanceInWei: BigNumber;
- userAddress: string;
- shouldBlockchainErrDialogBeOpen: boolean;
- userSuppliedOrderCache: Order;
- location: Location;
- flashMessage?: string | React.ReactNode;
- lastForceTokenStateRefetch: number;
- translate: Translate;
-}
-
-interface PortalAllState {
- prevNetworkId: number;
- prevNodeVersion: string;
- prevUserAddress: string;
- prevPathname: string;
- isDisclaimerDialogOpen: boolean;
- isWethNoticeDialogOpen: boolean;
- isLedgerDialogOpen: boolean;
-}
-
-export class Portal extends React.Component<PortalAllProps, PortalAllState> {
- private _blockchain: Blockchain;
- private _sharedOrderIfExists: Order;
- private _throttledScreenWidthUpdate: () => void;
- public static hasAlreadyDismissedWethNotice() {
- const didDismissWethNotice = localStorage.getItemIfExists(constants.LOCAL_STORAGE_KEY_DISMISS_WETH_NOTICE);
- const hasAlreadyDismissedWethNotice = !_.isUndefined(didDismissWethNotice) && !_.isEmpty(didDismissWethNotice);
- return hasAlreadyDismissedWethNotice;
- }
- constructor(props: PortalAllProps) {
- super(props);
- this._sharedOrderIfExists = this._getSharedOrderIfExists();
- this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT);
-
- const isViewingBalances = _.includes(props.location.pathname, `${WebsitePaths.Portal}/balances`);
- const hasAlreadyDismissedWethNotice = Portal.hasAlreadyDismissedWethNotice();
-
- const didAcceptPortalDisclaimer = localStorage.getItemIfExists(constants.LOCAL_STORAGE_KEY_ACCEPT_DISCLAIMER);
- const hasAcceptedDisclaimer =
- !_.isUndefined(didAcceptPortalDisclaimer) && !_.isEmpty(didAcceptPortalDisclaimer);
- this.state = {
- prevNetworkId: this.props.networkId,
- prevNodeVersion: this.props.nodeVersion,
- prevUserAddress: this.props.userAddress,
- prevPathname: this.props.location.pathname,
- isDisclaimerDialogOpen: !hasAcceptedDisclaimer,
- isWethNoticeDialogOpen: !hasAlreadyDismissedWethNotice && isViewingBalances,
- isLedgerDialogOpen: false,
- };
- }
- public componentDidMount() {
- window.addEventListener('resize', this._throttledScreenWidthUpdate);
- window.scrollTo(0, 0);
- }
- public componentWillMount() {
- this._blockchain = new Blockchain(this.props.dispatcher);
- }
- public componentWillUnmount() {
- this._blockchain.destroy();
- window.removeEventListener('resize', this._throttledScreenWidthUpdate);
- // We re-set the entire redux state when the portal is unmounted so that when it is re-rendered
- // the initialization process always occurs from the same base state. This helps avoid
- // initialization inconsistencies (i.e While the portal was unrendered, the user might have
- // become disconnected from their backing Ethereum node, changes user accounts, etc...)
- this.props.dispatcher.resetState();
- }
- public componentWillReceiveProps(nextProps: PortalAllProps) {
- if (nextProps.networkId !== this.state.prevNetworkId) {
- // tslint:disable-next-line:no-floating-promises
- this._blockchain.networkIdUpdatedFireAndForgetAsync(nextProps.networkId);
- this.setState({
- prevNetworkId: nextProps.networkId,
- });
- }
- if (nextProps.userAddress !== this.state.prevUserAddress) {
- const newUserAddress = _.isEmpty(nextProps.userAddress) ? undefined : nextProps.userAddress;
- // tslint:disable-next-line:no-floating-promises
- this._blockchain.userAddressUpdatedFireAndForgetAsync(newUserAddress);
- this.setState({
- prevUserAddress: nextProps.userAddress,
- });
- }
- if (nextProps.nodeVersion !== this.state.prevNodeVersion) {
- // tslint:disable-next-line:no-floating-promises
- this._blockchain.nodeVersionUpdatedFireAndForgetAsync(nextProps.nodeVersion);
- }
- if (nextProps.location.pathname !== this.state.prevPathname) {
- const isViewingBalances = _.includes(nextProps.location.pathname, `${WebsitePaths.Portal}/balances`);
- const hasAlreadyDismissedWethNotice = Portal.hasAlreadyDismissedWethNotice();
- this.setState({
- prevPathname: nextProps.location.pathname,
- isWethNoticeDialogOpen: !hasAlreadyDismissedWethNotice && isViewingBalances,
- });
- }
- }
- public render() {
- const updateShouldBlockchainErrDialogBeOpen = this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen.bind(
- this.props.dispatcher,
- );
- const portalStyle: React.CSSProperties = {
- minHeight: '100vh',
- display: 'flex',
- flexDirection: 'column',
- justifyContent: 'space-between',
- };
- const portalMenuContainerStyle: React.CSSProperties = {
- overflow: 'hidden',
- backgroundColor: colors.darkestGrey,
- color: colors.white,
- };
- return (
- <div style={portalStyle}>
- <DocumentTitle title="0x Portal DApp" />
- <TopBar
- userAddress={this.props.userAddress}
- networkId={this.props.networkId}
- injectedProviderName={this.props.injectedProviderName}
- onToggleLedgerDialog={this.onToggleLedgerDialog.bind(this)}
- dispatcher={this.props.dispatcher}
- providerType={this.props.providerType}
- blockchainIsLoaded={this.props.blockchainIsLoaded}
- location={this.props.location}
- blockchain={this._blockchain}
- translate={this.props.translate}
- />
- <div id="portal" className="mx-auto max-width-4" style={{ width: '100%' }}>
- <Paper className="mb3 mt2">
- {!configs.IS_MAINNET_ENABLED && this.props.networkId === constants.NETWORK_ID_MAINNET ? (
- <div className="p3 center">
- <div className="h2 py2">Mainnet unavailable</div>
- <div className="mx-auto pb2 pt2">
- <img src="/images/zrx_token.png" style={{ width: 150 }} />
- </div>
- <div>
- 0x portal is currently unavailable on the Ethereum mainnet.
- <div>To try it out, switch to the Kovan test network (networkId: 42).</div>
- <div className="py2">Check back soon!</div>
- </div>
- </div>
- ) : (
- <div className="mx-auto flex">
- <div className="col col-2 pr2 pt1 sm-hide xs-hide" style={portalMenuContainerStyle}>
- <PortalMenu menuItemStyle={{ color: colors.white }} />
- </div>
- <div className="col col-12 lg-col-10 md-col-10 sm-col sm-col-12">
- <div className="py2" style={{ backgroundColor: colors.grey50 }}>
- {this.props.blockchainIsLoaded ? (
- <Switch>
- {configs.ENVIRONMENT === Environments.DEVELOPMENT && (
- <Route
- path={`${WebsitePaths.Portal}/wallet`}
- render={this._renderWallet.bind(this)}
- />
- )}
- <Route
- path={`${WebsitePaths.Portal}/weth`}
- render={this._renderEthWrapper.bind(this)}
- />
- <Route
- path={`${WebsitePaths.Portal}/fill`}
- render={this._renderFillOrder.bind(this)}
- />
- <Route
- path={`${WebsitePaths.Portal}/balances`}
- render={this._renderTokenBalances.bind(this)}
- />
- <Route
- path={`${WebsitePaths.Portal}/trades`}
- component={this._renderTradeHistory.bind(this)}
- />
- <Route
- path={`${WebsitePaths.Home}`}
- render={this._renderGenerateOrderForm.bind(this)}
- />
- </Switch>
- ) : (
- <div className="pt4 sm-px2 sm-pt2 sm-m1" style={{ height: 500 }}>
- <div
- className="relative sm-px2 sm-pt2 sm-m1"
- style={{ height: 122, top: '50%', transform: 'translateY(-50%)' }}
- >
- <div className="center pb2">
- <CircularProgress size={40} thickness={5} />
- </div>
- <div className="center pt2" style={{ paddingBottom: 11 }}>
- Loading Portal...
- </div>
- </div>
- </div>
- )}
- </div>
- </div>
- </div>
- )}
- </Paper>
- <BlockchainErrDialog
- blockchain={this._blockchain}
- blockchainErr={this.props.blockchainErr}
- isOpen={this.props.shouldBlockchainErrDialogBeOpen}
- userAddress={this.props.userAddress}
- toggleDialogFn={updateShouldBlockchainErrDialogBeOpen}
- networkId={this.props.networkId}
- />
- <WrappedEthSectionNoticeDialog
- isOpen={this.state.isWethNoticeDialogOpen}
- onToggleDialog={this._onWethNoticeAccepted.bind(this)}
- />
- <PortalDisclaimerDialog
- isOpen={this.state.isDisclaimerDialogOpen}
- onToggleDialog={this._onPortalDisclaimerAccepted.bind(this)}
- />
- <FlashMessage dispatcher={this.props.dispatcher} flashMessage={this.props.flashMessage} />
- {this.props.blockchainIsLoaded && (
- <LedgerConfigDialog
- providerType={this.props.providerType}
- networkId={this.props.networkId}
- blockchain={this._blockchain}
- dispatcher={this.props.dispatcher}
- toggleDialogFn={this.onToggleLedgerDialog.bind(this)}
- isOpen={this.state.isLedgerDialogOpen}
- />
- )}
- </div>
- <Footer translate={this.props.translate} dispatcher={this.props.dispatcher} />
- </div>
- );
- }
- public onToggleLedgerDialog() {
- this.setState({
- isLedgerDialogOpen: !this.state.isLedgerDialogOpen,
- });
- }
- private _renderWallet() {
- const allTokens = _.values(this.props.tokenByAddress);
- const trackedTokens = _.filter(allTokens, t => t.isTracked);
- return (
- <div className="flex flex-center">
- <div className="mx-auto">
- <Wallet
- userAddress={this.props.userAddress}
- networkId={this.props.networkId}
- blockchain={this._blockchain}
- blockchainIsLoaded={this.props.blockchainIsLoaded}
- blockchainErr={this.props.blockchainErr}
- dispatcher={this.props.dispatcher}
- tokenByAddress={this.props.tokenByAddress}
- trackedTokens={trackedTokens}
- userEtherBalanceInWei={this.props.userEtherBalanceInWei}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- injectedProviderName={this.props.injectedProviderName}
- providerType={this.props.providerType}
- onToggleLedgerDialog={this.onToggleLedgerDialog.bind(this)}
- />
- </div>
- </div>
- );
- }
- private _renderEthWrapper() {
- return (
- <EthWrappers
- networkId={this.props.networkId}
- blockchain={this._blockchain}
- dispatcher={this.props.dispatcher}
- tokenByAddress={this.props.tokenByAddress}
- userAddress={this.props.userAddress}
- userEtherBalanceInWei={this.props.userEtherBalanceInWei}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- />
- );
- }
- private _renderTradeHistory() {
- return (
- <TradeHistory
- tokenByAddress={this.props.tokenByAddress}
- userAddress={this.props.userAddress}
- networkId={this.props.networkId}
- />
- );
- }
- private _renderTokenBalances() {
- const allTokens = _.values(this.props.tokenByAddress);
- const trackedTokens = _.filter(allTokens, t => t.isTracked);
- return (
- <TokenBalances
- blockchain={this._blockchain}
- blockchainErr={this.props.blockchainErr}
- blockchainIsLoaded={this.props.blockchainIsLoaded}
- dispatcher={this.props.dispatcher}
- screenWidth={this.props.screenWidth}
- tokenByAddress={this.props.tokenByAddress}
- trackedTokens={trackedTokens}
- userAddress={this.props.userAddress}
- userEtherBalanceInWei={this.props.userEtherBalanceInWei}
- networkId={this.props.networkId}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- />
- );
- }
- private _renderFillOrder(match: any, location: Location, history: History) {
- const initialFillOrder = !_.isUndefined(this.props.userSuppliedOrderCache)
- ? this.props.userSuppliedOrderCache
- : this._sharedOrderIfExists;
- return (
- <FillOrder
- blockchain={this._blockchain}
- blockchainErr={this.props.blockchainErr}
- initialOrder={initialFillOrder}
- isOrderInUrl={!_.isUndefined(this._sharedOrderIfExists)}
- orderFillAmount={this.props.orderFillAmount}
- networkId={this.props.networkId}
- userAddress={this.props.userAddress}
- tokenByAddress={this.props.tokenByAddress}
- dispatcher={this.props.dispatcher}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- />
- );
- }
- private _renderGenerateOrderForm(match: any, location: Location, history: History) {
- return (
- <GenerateOrderForm
- blockchain={this._blockchain}
- hashData={this.props.hashData}
- dispatcher={this.props.dispatcher}
- />
- );
- }
- private _onPortalDisclaimerAccepted() {
- localStorage.setItem(constants.LOCAL_STORAGE_KEY_ACCEPT_DISCLAIMER, 'set');
- this.setState({
- isDisclaimerDialogOpen: false,
- });
- }
- private _onWethNoticeAccepted() {
- localStorage.setItem(constants.LOCAL_STORAGE_KEY_DISMISS_WETH_NOTICE, 'set');
- this.setState({
- isWethNoticeDialogOpen: false,
- });
- }
- private _getSharedOrderIfExists(): Order | undefined {
- const queryString = window.location.search;
- if (queryString.length === 0) {
- return undefined;
- }
- const queryParams = queryString.substring(1).split('&');
- const orderQueryParam = _.find(queryParams, queryParam => {
- const queryPair = queryParam.split('=');
- return queryPair[0] === 'order';
- });
- if (_.isUndefined(orderQueryParam)) {
- return undefined;
- }
- const orderPair = orderQueryParam.split('=');
- if (orderPair.length !== 2) {
- return undefined;
- }
-
- const order = JSON.parse(decodeURIComponent(orderPair[1]));
- const validationResult = validator.validate(order, portalOrderSchema);
- if (validationResult.errors.length > 0) {
- logUtils.log(`Invalid shared order: ${validationResult.errors}`);
- return undefined;
- }
- return order;
- }
- private _updateScreenWidth() {
- const newScreenWidth = utils.getScreenWidth();
- this.props.dispatcher.updateScreenWidth(newScreenWidth);
- }
-}
diff --git a/packages/website/ts/components/portal/back_button.tsx b/packages/website/ts/components/portal/back_button.tsx
new file mode 100644
index 000000000..ca35abc2b
--- /dev/null
+++ b/packages/website/ts/components/portal/back_button.tsx
@@ -0,0 +1,42 @@
+import { Styles } from '@0xproject/react-shared';
+import * as React from 'react';
+import { Link } from 'react-router-dom';
+
+import { Island } from 'ts/components/ui/island';
+import { colors } from 'ts/style/colors';
+
+export interface BackButtonProps {
+ to: string;
+ labelText: string;
+}
+
+const BACK_BUTTON_HEIGHT = 28;
+
+const styles: Styles = {
+ backButton: {
+ height: BACK_BUTTON_HEIGHT,
+ paddingTop: 10,
+ borderRadius: BACK_BUTTON_HEIGHT,
+ },
+ backButtonIcon: {
+ color: colors.mediumBlue,
+ fontSize: 20,
+ },
+};
+
+export const BackButton = (props: BackButtonProps) => {
+ return (
+ <div style={{ height: 65, paddingTop: 25 }}>
+ <Link to={props.to} style={{ textDecoration: 'none' }}>
+ <Island className="flex right" style={styles.backButton}>
+ <div style={{ marginLeft: 12 }}>
+ <i style={styles.backButtonIcon} className={`zmdi zmdi-arrow-left`} />
+ </div>
+ <div style={{ marginLeft: 12, marginRight: 12 }}>
+ <div style={{ fontSize: 16, color: colors.lightGrey }}>{props.labelText}</div>
+ </div>
+ </Island>
+ </Link>
+ </div>
+ );
+};
diff --git a/packages/website/ts/components/portal/drawer_menu.tsx b/packages/website/ts/components/portal/drawer_menu.tsx
new file mode 100644
index 000000000..a6707e86c
--- /dev/null
+++ b/packages/website/ts/components/portal/drawer_menu.tsx
@@ -0,0 +1,77 @@
+import { Styles } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { Blockchain } from 'ts/blockchain';
+import { defaultMenuItemEntries, Menu } from 'ts/components/portal/menu';
+import { Identicon } from 'ts/components/ui/identicon';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { ProviderType, WebsitePaths } from 'ts/types';
+import { utils } from 'ts/utils/utils';
+
+const IDENTICON_DIAMETER = 45;
+const BORDER_RADIUS = '50%';
+
+const styles: Styles = {
+ root: {
+ backgroundColor: colors.drawerMenuBackground,
+ width: '100%',
+ height: '100%',
+ },
+ identicon: {
+ borderWidth: 3,
+ borderStyle: 'solid',
+ borderColor: colors.white,
+ borderRadius: BORDER_RADIUS,
+ MozBorderRadius: BORDER_RADIUS,
+ WebkitBorderRadius: BORDER_RADIUS,
+ },
+};
+
+export interface DrawerMenuProps {
+ selectedPath?: string;
+ userAddress?: string;
+ injectedProviderName: string;
+ providerType: ProviderType;
+ blockchain?: Blockchain;
+ blockchainIsLoaded: boolean;
+}
+export const DrawerMenu = (props: DrawerMenuProps) => {
+ const relayerItemEntry = {
+ to: `${WebsitePaths.Portal}`,
+ labelText: 'Relayer ecosystem',
+ iconName: 'zmdi-portable-wifi',
+ };
+ const menuItemEntries = _.concat(relayerItemEntry, defaultMenuItemEntries);
+ const accountState = utils.getAccountState(
+ props.blockchainIsLoaded && !_.isUndefined(props.blockchain),
+ props.providerType,
+ props.injectedProviderName,
+ props.userAddress,
+ );
+ const displayMessage = utils.getReadableAccountState(accountState, props.userAddress);
+ return (
+ <div style={styles.root}>
+ <Header userAddress={props.userAddress} displayMessage={displayMessage} />
+ <Menu selectedPath={props.selectedPath} menuItemEntries={menuItemEntries} />
+ </div>
+ );
+};
+
+interface HeaderProps {
+ userAddress?: string;
+ displayMessage: string;
+}
+const Header = (props: HeaderProps) => {
+ return (
+ <div className="flex flex-center py4">
+ <div className="flex flex-column mx-auto items-center">
+ <Identicon address={props.userAddress} diameter={IDENTICON_DIAMETER} style={styles.identicon} />
+ <Text className="pt2" fontColor={colors.white}>
+ {props.displayMessage}
+ </Text>
+ </div>
+ </div>
+ );
+};
diff --git a/packages/website/ts/components/portal/loading.tsx b/packages/website/ts/components/portal/loading.tsx
new file mode 100644
index 000000000..d804dd1b8
--- /dev/null
+++ b/packages/website/ts/components/portal/loading.tsx
@@ -0,0 +1,21 @@
+import CircularProgress from 'material-ui/CircularProgress';
+import * as React from 'react';
+
+const CIRCULAR_PROGRESS_SIZE = 40;
+const CIRCULAR_PROGRESS_THICKNESS = 5;
+
+export interface LoadingProps {
+ isLoading: boolean;
+ content: React.ReactNode;
+}
+export const Loading = (props: LoadingProps) => {
+ if (props.isLoading) {
+ return (
+ <div className="center">
+ <CircularProgress size={CIRCULAR_PROGRESS_SIZE} thickness={CIRCULAR_PROGRESS_THICKNESS} />
+ </div>
+ );
+ } else {
+ return <div>{props.content}</div>;
+ }
+};
diff --git a/packages/website/ts/components/portal/menu.tsx b/packages/website/ts/components/portal/menu.tsx
new file mode 100644
index 000000000..39dab77f5
--- /dev/null
+++ b/packages/website/ts/components/portal/menu.tsx
@@ -0,0 +1,120 @@
+import { Styles } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+import { MenuItem } from 'ts/components/ui/menu_item';
+import { colors } from 'ts/style/colors';
+import { WebsitePaths } from 'ts/types';
+
+export interface MenuTheme {
+ paddingLeft: number;
+ textColor: string;
+ iconColor: string;
+ selectedIconColor: string;
+ selectedBackgroundColor: string;
+}
+
+export interface MenuItemEntry {
+ to: string;
+ labelText: string;
+ iconName: string;
+}
+
+export interface MenuProps {
+ selectedPath?: string;
+ theme?: MenuTheme;
+ menuItemEntries?: MenuItemEntry[];
+}
+
+export const defaultMenuItemEntries: MenuItemEntry[] = [
+ {
+ to: `${WebsitePaths.Portal}/account`,
+ labelText: 'Account overview',
+ iconName: 'zmdi-balance-wallet',
+ },
+ {
+ to: `${WebsitePaths.Portal}/trades`,
+ labelText: 'Trade history',
+ iconName: 'zmdi-format-list-bulleted',
+ },
+ {
+ to: `${WebsitePaths.Portal}/weth`,
+ labelText: 'Wrapped ETH',
+ iconName: 'zmdi-circle-o',
+ },
+ {
+ to: `${WebsitePaths.Portal}/generate`,
+ labelText: 'Generate order',
+ iconName: 'zmdi-arrow-right-top',
+ },
+ {
+ to: `${WebsitePaths.Portal}/fill`,
+ labelText: 'Fill order',
+ iconName: 'zmdi-arrow-left-bottom',
+ },
+];
+
+const DEFAULT_MENU_THEME: MenuTheme = {
+ paddingLeft: 30,
+ textColor: colors.white,
+ iconColor: colors.white,
+ selectedIconColor: colors.white,
+ selectedBackgroundColor: colors.menuItemDefaultSelectedBackground,
+};
+
+export const Menu: React.StatelessComponent<MenuProps> = (props: MenuProps) => {
+ return (
+ <div>
+ {_.map(props.menuItemEntries, entry => {
+ const isSelected = entry.to === props.selectedPath;
+ return (
+ <MenuItem key={entry.to} to={entry.to}>
+ <MenuItemLabel
+ title={entry.labelText}
+ iconName={entry.iconName}
+ selected={isSelected}
+ theme={props.theme}
+ />
+ </MenuItem>
+ );
+ })}
+ </div>
+ );
+};
+Menu.defaultProps = {
+ theme: DEFAULT_MENU_THEME,
+ menuItemEntries: defaultMenuItemEntries,
+};
+
+interface MenuItemLabelProps {
+ title: string;
+ iconName: string;
+ selected: boolean;
+ theme: MenuTheme;
+}
+const MenuItemLabel: React.StatelessComponent<MenuItemLabelProps> = (props: MenuItemLabelProps) => {
+ const styles: Styles = {
+ root: {
+ backgroundColor: props.selected ? props.theme.selectedBackgroundColor : undefined,
+ paddingLeft: props.theme.paddingLeft,
+ },
+ icon: {
+ color: props.selected ? props.theme.selectedIconColor : props.theme.iconColor,
+ fontSize: 20,
+ },
+ text: {
+ color: props.theme.textColor,
+ fontWeight: props.selected ? 'bold' : 'normal',
+ fontSize: 16,
+ },
+ };
+ return (
+ <div className="flex py2" style={styles.root}>
+ <div className="pr1">
+ <i style={styles.icon} className={`zmdi ${props.iconName}`} />
+ </div>
+ <div className="pl1" style={styles.text}>
+ {props.title}
+ </div>
+ </div>
+ );
+};
diff --git a/packages/website/ts/components/portal/portal.tsx b/packages/website/ts/components/portal/portal.tsx
new file mode 100644
index 000000000..ff11880e3
--- /dev/null
+++ b/packages/website/ts/components/portal/portal.tsx
@@ -0,0 +1,738 @@
+import { colors } from '@0xproject/react-shared';
+import { BigNumber } from '@0xproject/utils';
+import * as _ from 'lodash';
+import * as React from 'react';
+import * as DocumentTitle from 'react-document-title';
+import { Link, Route, RouteComponentProps, Switch } from 'react-router-dom';
+
+import { Blockchain } from 'ts/blockchain';
+import { BlockchainErrDialog } from 'ts/components/dialogs/blockchain_err_dialog';
+import { LedgerConfigDialog } from 'ts/components/dialogs/ledger_config_dialog';
+import { PortalDisclaimerDialog } from 'ts/components/dialogs/portal_disclaimer_dialog';
+import { EthWrappers } from 'ts/components/eth_wrappers';
+import { FillOrder } from 'ts/components/fill_order';
+import { AssetPicker } from 'ts/components/generate_order/asset_picker';
+import { MetaTags } from 'ts/components/meta_tags';
+import { BackButton } from 'ts/components/portal/back_button';
+import { Loading } from 'ts/components/portal/loading';
+import { Menu, MenuTheme } from 'ts/components/portal/menu';
+import { Section } from 'ts/components/portal/section';
+import { TextHeader } from 'ts/components/portal/text_header';
+import { RelayerIndex } from 'ts/components/relayer_index/relayer_index';
+import { TokenBalances } from 'ts/components/token_balances';
+import { TopBar, TopBarDisplayType } from 'ts/components/top_bar/top_bar';
+import { TradeHistory } from 'ts/components/trade_history/trade_history';
+import { Container } from 'ts/components/ui/container';
+import { FlashMessage } from 'ts/components/ui/flash_message';
+import { Image } from 'ts/components/ui/image';
+import { PointerDirection } from 'ts/components/ui/pointer';
+import { Text } from 'ts/components/ui/text';
+import { Wallet } from 'ts/components/wallet/wallet';
+import { GenerateOrderForm } from 'ts/containers/generate_order_form';
+import { PortalOnboardingFlow } from 'ts/containers/portal_onboarding_flow';
+import { localStorage } from 'ts/local_storage/local_storage';
+import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
+import { FullscreenMessage } from 'ts/pages/fullscreen_message';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { zIndex } from 'ts/style/z_index';
+import {
+ BlockchainErrs,
+ HashData,
+ ItemByAddress,
+ Order,
+ ProviderType,
+ ScreenWidths,
+ Token,
+ TokenByAddress,
+ TokenStateByAddress,
+ TokenVisibility,
+ WebsitePaths,
+} from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
+import { backendClient } from 'ts/utils/backend_client';
+import { configs } from 'ts/utils/configs';
+import { constants } from 'ts/utils/constants';
+import { orderParser } from 'ts/utils/order_parser';
+import { Translate } from 'ts/utils/translate';
+import { utils } from 'ts/utils/utils';
+
+export interface PortalProps {
+ blockchainErr: BlockchainErrs;
+ blockchainIsLoaded: boolean;
+ dispatcher: Dispatcher;
+ hashData: HashData;
+ injectedProviderName: string;
+ networkId: number;
+ nodeVersion: string;
+ orderFillAmount: BigNumber;
+ providerType: ProviderType;
+ screenWidth: ScreenWidths;
+ tokenByAddress: TokenByAddress;
+ userEtherBalanceInWei?: BigNumber;
+ userAddress: string;
+ shouldBlockchainErrDialogBeOpen: boolean;
+ userSuppliedOrderCache: Order;
+ location: Location;
+ flashMessage?: string | React.ReactNode;
+ lastForceTokenStateRefetch: number;
+ translate: Translate;
+ isPortalOnboardingShowing: boolean;
+ portalOnboardingStep: number;
+}
+
+interface PortalState {
+ prevNetworkId: number;
+ prevNodeVersion: string;
+ prevUserAddress: string;
+ prevPathname: string;
+ isDisclaimerDialogOpen: boolean;
+ isLedgerDialogOpen: boolean;
+ tokenManagementState: TokenManagementState;
+ trackedTokenStateByAddress: TokenStateByAddress;
+}
+
+interface AccountManagementItem {
+ pathName: string;
+ headerText?: string;
+ render: () => React.ReactNode;
+}
+
+enum TokenManagementState {
+ Add = 'Add',
+ Remove = 'Remove',
+ None = 'None',
+}
+
+const THROTTLE_TIMEOUT = 100;
+const TOP_BAR_HEIGHT = TopBar.heightForDisplayType(TopBarDisplayType.Expanded);
+const LEFT_COLUMN_WIDTH = 346;
+const MENU_PADDING_LEFT = 185;
+const LARGE_LAYOUT_MAX_WIDTH = 1200;
+const SIDE_PADDING = 20;
+const DOCUMENT_TITLE = '0x Portal';
+const DOCUMENT_DESCRIPTION = 'Learn about and trade on 0x Relayers';
+
+export class Portal extends React.Component<PortalProps, PortalState> {
+ private _blockchain: Blockchain;
+ private readonly _sharedOrderIfExists: Order;
+ private readonly _throttledScreenWidthUpdate: () => void;
+ constructor(props: PortalProps) {
+ super(props);
+ this._sharedOrderIfExists = orderParser.parse(window.location.search);
+ this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT);
+ const didAcceptPortalDisclaimer = localStorage.getItemIfExists(constants.LOCAL_STORAGE_KEY_ACCEPT_DISCLAIMER);
+ const hasAcceptedDisclaimer =
+ !_.isUndefined(didAcceptPortalDisclaimer) && !_.isEmpty(didAcceptPortalDisclaimer);
+ const initialTrackedTokenStateByAddress = this._getInitialTrackedTokenStateByAddress(
+ this._getCurrentTrackedTokens(),
+ );
+ this.state = {
+ prevNetworkId: this.props.networkId,
+ prevNodeVersion: this.props.nodeVersion,
+ prevUserAddress: this.props.userAddress,
+ prevPathname: this.props.location.pathname,
+ isDisclaimerDialogOpen: !hasAcceptedDisclaimer,
+ tokenManagementState: TokenManagementState.None,
+ isLedgerDialogOpen: false,
+ trackedTokenStateByAddress: initialTrackedTokenStateByAddress,
+ };
+ }
+ public componentDidMount(): void {
+ window.addEventListener('resize', this._throttledScreenWidthUpdate);
+ window.scrollTo(0, 0);
+ }
+ public componentWillMount(): void {
+ this._blockchain = new Blockchain(this.props.dispatcher);
+ }
+ public componentWillUnmount(): void {
+ this._blockchain.destroy();
+ window.removeEventListener('resize', this._throttledScreenWidthUpdate);
+ // We re-set the entire redux state when the portal is unmounted so that when it is re-rendered
+ // the initialization process always occurs from the same base state. This helps avoid
+ // initialization inconsistencies (i.e While the portal was unrendered, the user might have
+ // become disconnected from their backing Ethereum node, changed user accounts, etc...)
+ this.props.dispatcher.resetState();
+ }
+ public componentDidUpdate(prevProps: PortalProps): void {
+ if (!prevProps.blockchainIsLoaded && this.props.blockchainIsLoaded) {
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchBalancesAndAllowancesAsync(this._getCurrentTrackedTokensAddresses());
+ }
+ }
+ public componentWillReceiveProps(nextProps: PortalProps): void {
+ if (nextProps.networkId !== this.state.prevNetworkId) {
+ // tslint:disable-next-line:no-floating-promises
+ this._blockchain.networkIdUpdatedFireAndForgetAsync(nextProps.networkId);
+ this.setState({
+ prevNetworkId: nextProps.networkId,
+ });
+ }
+ if (nextProps.userAddress !== this.state.prevUserAddress) {
+ const newUserAddress = _.isEmpty(nextProps.userAddress) ? undefined : nextProps.userAddress;
+ // tslint:disable-next-line:no-floating-promises
+ this._blockchain.userAddressUpdatedFireAndForgetAsync(newUserAddress);
+ this.setState({
+ prevUserAddress: nextProps.userAddress,
+ });
+ }
+ if (nextProps.nodeVersion !== this.state.prevNodeVersion) {
+ // tslint:disable-next-line:no-floating-promises
+ this._blockchain.nodeVersionUpdatedFireAndForgetAsync(nextProps.nodeVersion);
+ }
+ if (nextProps.location.pathname !== this.state.prevPathname) {
+ this.setState({
+ prevPathname: nextProps.location.pathname,
+ });
+ }
+
+ // If the address changed, but the network did not, we can just refetch the currently tracked tokens.
+ if (
+ (nextProps.userAddress !== this.props.userAddress && nextProps.networkId === this.props.networkId) ||
+ nextProps.lastForceTokenStateRefetch !== this.props.lastForceTokenStateRefetch
+ ) {
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchBalancesAndAllowancesAsync(this._getCurrentTrackedTokensAddresses());
+ }
+
+ const nextTrackedTokens = utils.getTrackedTokens(nextProps.tokenByAddress);
+ const trackedTokens = this._getCurrentTrackedTokens();
+
+ if (!_.isEqual(nextTrackedTokens, trackedTokens)) {
+ const newTokens = _.difference(nextTrackedTokens, trackedTokens);
+ const newTokenAddresses = _.map(newTokens, token => token.address);
+ // Add placeholder entry for this token to the state, since fetching the
+ // balance/allowance is asynchronous
+ const trackedTokenStateByAddress = { ...this.state.trackedTokenStateByAddress };
+ for (const tokenAddress of newTokenAddresses) {
+ trackedTokenStateByAddress[tokenAddress] = {
+ balance: new BigNumber(0),
+ allowance: new BigNumber(0),
+ isLoaded: false,
+ };
+ }
+ this.setState({
+ trackedTokenStateByAddress,
+ });
+ // Fetch the actual balance/allowance.
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchBalancesAndAllowancesAsync(newTokenAddresses);
+ }
+ }
+ public render(): React.ReactNode {
+ const updateShouldBlockchainErrDialogBeOpen = this.props.dispatcher.updateShouldBlockchainErrDialogBeOpen.bind(
+ this.props.dispatcher,
+ );
+ const isAssetPickerDialogOpen = this.state.tokenManagementState !== TokenManagementState.None;
+ const tokenVisibility =
+ this.state.tokenManagementState === TokenManagementState.Add
+ ? TokenVisibility.UNTRACKED
+ : TokenVisibility.TRACKED;
+ return (
+ <Container>
+ <MetaTags title={DOCUMENT_TITLE} description={DOCUMENT_DESCRIPTION} />
+ <DocumentTitle title={DOCUMENT_TITLE} />
+ <TopBar
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ injectedProviderName={this.props.injectedProviderName}
+ onToggleLedgerDialog={this._onToggleLedgerDialog.bind(this)}
+ dispatcher={this.props.dispatcher}
+ providerType={this.props.providerType}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
+ location={this.props.location}
+ blockchain={this._blockchain}
+ translate={this.props.translate}
+ displayType={TopBarDisplayType.Expanded}
+ style={{
+ backgroundColor: colors.lightestGrey,
+ position: 'fixed',
+ zIndex: zIndex.topBar,
+ }}
+ maxWidth={LARGE_LAYOUT_MAX_WIDTH}
+ />
+ <Container marginTop={TOP_BAR_HEIGHT} minHeight="100vh" backgroundColor={colors.lightestGrey}>
+ <Switch>
+ <Route path={`${WebsitePaths.Portal}/:route`} render={this._renderOtherRoutes.bind(this)} />
+ <Route
+ exact={true}
+ path={`${WebsitePaths.Portal}/`}
+ render={this._renderMainRoute.bind(this)}
+ />
+ </Switch>
+ <BlockchainErrDialog
+ blockchain={this._blockchain}
+ blockchainErr={this.props.blockchainErr}
+ isOpen={this.props.shouldBlockchainErrDialogBeOpen}
+ userAddress={this.props.userAddress}
+ toggleDialogFn={updateShouldBlockchainErrDialogBeOpen}
+ networkId={this.props.networkId}
+ />
+ <FlashMessage dispatcher={this.props.dispatcher} flashMessage={this.props.flashMessage} />
+
+ <LedgerConfigDialog
+ providerType={this.props.providerType}
+ networkId={this.props.networkId}
+ blockchain={this._blockchain}
+ dispatcher={this.props.dispatcher}
+ toggleDialogFn={this._onToggleLedgerDialog.bind(this)}
+ isOpen={this.state.isLedgerDialogOpen}
+ />
+
+ <AssetPicker
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ blockchain={this._blockchain}
+ dispatcher={this.props.dispatcher}
+ isOpen={isAssetPickerDialogOpen}
+ currentTokenAddress={''}
+ onTokenChosen={this._onTokenChosen.bind(this)}
+ tokenByAddress={this.props.tokenByAddress}
+ tokenVisibility={tokenVisibility}
+ />
+ </Container>
+ </Container>
+ );
+ }
+ private _renderMainRoute(): React.ReactNode {
+ if (this._isSmallScreen()) {
+ return <SmallLayout content={this._renderRelayerIndexSection()} />;
+ } else {
+ return <LargeLayout left={this._renderWalletSection()} right={this._renderRelayerIndexSection()} />;
+ }
+ }
+ private _renderOtherRoutes(routeComponentProps: RouteComponentProps<any>): React.ReactNode {
+ if (this._isSmallScreen()) {
+ return <SmallLayout content={this._renderAccountManagement()} />;
+ } else {
+ return <LargeLayout left={this._renderMenu(routeComponentProps)} right={this._renderAccountManagement()} />;
+ }
+ }
+ private _renderMenu(routeComponentProps: RouteComponentProps<any>): React.ReactNode {
+ const menuTheme: MenuTheme = {
+ paddingLeft: MENU_PADDING_LEFT,
+ textColor: colors.darkerGrey,
+ iconColor: colors.darkerGrey,
+ selectedIconColor: colors.yellow800,
+ selectedBackgroundColor: 'transparent',
+ };
+ return (
+ <Section
+ header={<BackButton to={`${WebsitePaths.Portal}`} labelText="back to Relayers" />}
+ body={<Menu selectedPath={routeComponentProps.location.pathname} theme={menuTheme} />}
+ />
+ );
+ }
+ private _renderWallet(): React.ReactNode {
+ const isMobile = utils.isMobileWidth(this.props.screenWidth);
+ // We need room to scroll down for mobile onboarding
+ const marginBottom = isMobile ? '250px' : '15px';
+ return (
+ <div>
+ <Container className="flex flex-column items-center">
+ {isMobile && (
+ <Container marginTop="20px" marginBottom="20px">
+ {this._renderStartOnboarding()}
+ </Container>
+ )}
+ <Container marginBottom={marginBottom} width="100%">
+ <Wallet
+ style={
+ !isMobile && this.props.isPortalOnboardingShowing
+ ? { zIndex: zIndex.aboveOverlay, position: 'relative' }
+ : undefined
+ }
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ blockchain={this._blockchain}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
+ blockchainErr={this.props.blockchainErr}
+ dispatcher={this.props.dispatcher}
+ tokenByAddress={this.props.tokenByAddress}
+ trackedTokens={this._getCurrentTrackedTokens()}
+ userEtherBalanceInWei={this.props.userEtherBalanceInWei}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ injectedProviderName={this.props.injectedProviderName}
+ providerType={this.props.providerType}
+ screenWidth={this.props.screenWidth}
+ location={this.props.location}
+ trackedTokenStateByAddress={this.state.trackedTokenStateByAddress}
+ onToggleLedgerDialog={this._onToggleLedgerDialog.bind(this)}
+ onAddToken={this._onAddToken.bind(this)}
+ onRemoveToken={this._onRemoveToken.bind(this)}
+ refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this)}
+ toggleTooltipDirection={
+ this.props.isPortalOnboardingShowing ? PointerDirection.Left : PointerDirection.Right
+ }
+ />
+ </Container>
+ {!isMobile && <Container marginTop="8px">{this._renderStartOnboarding()}</Container>}
+ </Container>
+ <PortalOnboardingFlow
+ blockchain={this._blockchain}
+ trackedTokenStateByAddress={this.state.trackedTokenStateByAddress}
+ refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this)}
+ />
+ </div>
+ );
+ }
+ private _renderStartOnboarding(): React.ReactNode {
+ const isMobile = utils.isMobileWidth(this.props.screenWidth);
+ const shouldStartOnboarding = !isMobile || this.props.location.pathname === `${WebsitePaths.Portal}/account`;
+ const startOnboarding = (
+ <Container className="flex items-center center">
+ <Text fontColor={colors.mediumBlue} fontSize="16px" onClick={this._startOnboarding.bind(this)}>
+ Set up your account to start trading
+ </Text>
+ <Container marginLeft="8px" paddingTop="3px">
+ <Image src="/images/setup_account_icon.svg" height="20px" width="20x" />
+ </Container>
+ </Container>
+ );
+ return !shouldStartOnboarding ? (
+ <Link to={{ pathname: `${WebsitePaths.Portal}/account` }} style={{ textDecoration: 'none' }}>
+ {startOnboarding}
+ </Link>
+ ) : (
+ startOnboarding
+ );
+ }
+ private _startOnboarding(): void {
+ analytics.track('Onboarding Started', {
+ reason: 'manual',
+ stepIndex: this.props.portalOnboardingStep,
+ });
+ this.props.dispatcher.updatePortalOnboardingShowing(true);
+ }
+ private _renderWalletSection(): React.ReactNode {
+ return <Section header={<TextHeader labelText="Your Account" />} body={this._renderWallet()} />;
+ }
+ private _renderAccountManagement(): React.ReactNode {
+ const accountManagementItems: AccountManagementItem[] = [
+ {
+ pathName: `${WebsitePaths.Portal}/weth`,
+ headerText: 'Wrapped ETH',
+ render: this._renderEthWrapper.bind(this),
+ },
+ {
+ pathName: `${WebsitePaths.Portal}/account`,
+ headerText: this._isSmallScreen() ? undefined : 'Your Account',
+ render: this._isSmallScreen() ? this._renderWallet.bind(this) : this._renderTokenBalances.bind(this),
+ },
+ {
+ pathName: `${WebsitePaths.Portal}/trades`,
+ headerText: 'Trade History',
+ render: this._renderTradeHistory.bind(this),
+ },
+ {
+ pathName: `${WebsitePaths.Portal}/generate`,
+ headerText: 'Generate Order',
+ render: this._renderGenerateOrderForm.bind(this),
+ },
+ {
+ pathName: `${WebsitePaths.Portal}/fill`,
+ headerText: 'Fill Order',
+ render: this._renderFillOrder.bind(this),
+ },
+ ];
+ return (
+ <div>
+ <Switch>
+ {_.map(accountManagementItems, item => {
+ return (
+ <Route
+ key={item.pathName}
+ path={item.pathName}
+ render={this._renderAccountManagementItem.bind(this, item)}
+ />
+ );
+ })}}
+ <Route render={this._renderNotFoundMessage.bind(this)} />
+ </Switch>
+ <PortalDisclaimerDialog
+ isOpen={this.state.isDisclaimerDialogOpen}
+ onToggleDialog={this._onPortalDisclaimerAccepted.bind(this)}
+ />
+ </div>
+ );
+ }
+ private _renderAccountManagementItem(item: AccountManagementItem): React.ReactNode {
+ return (
+ <Section
+ header={!_.isUndefined(item.headerText) && <TextHeader labelText={item.headerText} />}
+ body={<Loading isLoading={!this.props.blockchainIsLoaded} content={item.render()} />}
+ />
+ );
+ }
+ private _renderEthWrapper(): React.ReactNode {
+ return (
+ <EthWrappers
+ networkId={this.props.networkId}
+ blockchain={this._blockchain}
+ dispatcher={this.props.dispatcher}
+ tokenByAddress={this.props.tokenByAddress}
+ userAddress={this.props.userAddress}
+ userEtherBalanceInWei={this.props.userEtherBalanceInWei}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ isFullWidth={true}
+ />
+ );
+ }
+ private _renderTradeHistory(): React.ReactNode {
+ return (
+ <TradeHistory
+ tokenByAddress={this.props.tokenByAddress}
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ isFullWidth={true}
+ shouldHideHeader={true}
+ isScrollable={false}
+ />
+ );
+ }
+ private _renderGenerateOrderForm(): React.ReactNode {
+ return (
+ <GenerateOrderForm
+ blockchain={this._blockchain}
+ hashData={this.props.hashData}
+ dispatcher={this.props.dispatcher}
+ isFullWidth={true}
+ shouldHideHeader={true}
+ />
+ );
+ }
+ private _renderFillOrder(): React.ReactNode {
+ const initialFillOrder = !_.isUndefined(this.props.userSuppliedOrderCache)
+ ? this.props.userSuppliedOrderCache
+ : this._sharedOrderIfExists;
+ return (
+ <FillOrder
+ blockchain={this._blockchain}
+ blockchainErr={this.props.blockchainErr}
+ initialOrder={initialFillOrder}
+ isOrderInUrl={!_.isUndefined(this._sharedOrderIfExists)}
+ orderFillAmount={this.props.orderFillAmount}
+ networkId={this.props.networkId}
+ userAddress={this.props.userAddress}
+ tokenByAddress={this.props.tokenByAddress}
+ dispatcher={this.props.dispatcher}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ isFullWidth={true}
+ shouldHideHeader={true}
+ />
+ );
+ }
+ private _renderTokenBalances(): React.ReactNode {
+ return (
+ <TokenBalances
+ blockchain={this._blockchain}
+ blockchainErr={this.props.blockchainErr}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
+ dispatcher={this.props.dispatcher}
+ screenWidth={this.props.screenWidth}
+ tokenByAddress={this.props.tokenByAddress}
+ trackedTokens={this._getCurrentTrackedTokens()}
+ userAddress={this.props.userAddress}
+ userEtherBalanceInWei={this.props.userEtherBalanceInWei}
+ networkId={this.props.networkId}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ isFullWidth={true}
+ />
+ );
+ }
+ private _renderRelayerIndexSection(): React.ReactNode {
+ const isMobile = utils.isMobileWidth(this.props.screenWidth);
+ return (
+ <Section
+ header={!isMobile && <TextHeader labelText="0x Relayers" />}
+ body={
+ <Container className="flex flex-column items-center">
+ {isMobile && (
+ <Container marginTop="20px" marginBottom="20px">
+ {this._renderStartOnboarding()}
+ </Container>
+ )}
+ <RelayerIndex networkId={this.props.networkId} screenWidth={this.props.screenWidth} />
+ </Container>
+ }
+ />
+ );
+ }
+ private _renderNotFoundMessage(): React.ReactNode {
+ return (
+ <FullscreenMessage
+ headerText="404 Not Found"
+ bodyText="Hm... looks like we couldn't find what you are looking for."
+ />
+ );
+ }
+ private _onTokenChosen(tokenAddress: string): void {
+ if (_.isEmpty(tokenAddress)) {
+ this.setState({
+ tokenManagementState: TokenManagementState.None,
+ });
+ return;
+ }
+ const token = this.props.tokenByAddress[tokenAddress];
+ const isDefaultTrackedToken = _.includes(configs.DEFAULT_TRACKED_TOKEN_SYMBOLS, token.symbol);
+ if (this.state.tokenManagementState === TokenManagementState.Remove && !isDefaultTrackedToken) {
+ if (token.isRegistered) {
+ // Remove the token from tracked tokens
+ const newToken: Token = {
+ ...token,
+ trackedTimestamp: undefined,
+ };
+ this.props.dispatcher.updateTokenByAddress([newToken]);
+ } else {
+ this.props.dispatcher.removeTokenToTokenByAddress(token);
+ }
+ trackedTokenStorage.removeTrackedToken(this.props.userAddress, this.props.networkId, tokenAddress);
+ } else if (isDefaultTrackedToken) {
+ this.props.dispatcher.showFlashMessage(`Cannot remove ${token.name} because it's a default token`);
+ }
+ this.setState({
+ tokenManagementState: TokenManagementState.None,
+ });
+ }
+ private _onToggleLedgerDialog(): void {
+ this.setState({
+ isLedgerDialogOpen: !this.state.isLedgerDialogOpen,
+ });
+ }
+ private _onAddToken(): void {
+ this.setState({
+ tokenManagementState: TokenManagementState.Add,
+ });
+ }
+ private _onRemoveToken(): void {
+ this.setState({
+ tokenManagementState: TokenManagementState.Remove,
+ });
+ }
+ private _onPortalDisclaimerAccepted(): void {
+ localStorage.setItem(constants.LOCAL_STORAGE_KEY_ACCEPT_DISCLAIMER, 'set');
+ this.setState({
+ isDisclaimerDialogOpen: false,
+ });
+ }
+ private _updateScreenWidth(): void {
+ const newScreenWidth = utils.getScreenWidth();
+ this.props.dispatcher.updateScreenWidth(newScreenWidth);
+ }
+ private _isSmallScreen(): boolean {
+ const isSmallScreen = this.props.screenWidth === ScreenWidths.Sm;
+ return isSmallScreen;
+ }
+ private _getCurrentTrackedTokens(): Token[] {
+ return utils.getTrackedTokens(this.props.tokenByAddress);
+ }
+ private _getCurrentTrackedTokensAddresses(): string[] {
+ return _.map(this._getCurrentTrackedTokens(), token => token.address);
+ }
+ private _getInitialTrackedTokenStateByAddress(trackedTokens: Token[]): TokenStateByAddress {
+ const trackedTokenStateByAddress: TokenStateByAddress = {};
+ _.each(trackedTokens, token => {
+ trackedTokenStateByAddress[token.address] = {
+ balance: new BigNumber(0),
+ allowance: new BigNumber(0),
+ isLoaded: false,
+ };
+ });
+ return trackedTokenStateByAddress;
+ }
+
+ private async _fetchBalancesAndAllowancesAsync(tokenAddresses: string[]): Promise<void> {
+ const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress;
+ const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
+ const balancesAndAllowances = await Promise.all(
+ tokenAddresses.map(async tokenAddress => {
+ return this._blockchain.getTokenBalanceAndAllowanceAsync(userAddressIfExists, tokenAddress);
+ }),
+ );
+ const priceByAddress = await this._getPriceByAddressAsync(tokenAddresses);
+ for (let i = 0; i < tokenAddresses.length; i++) {
+ // Order is preserved in Promise.all
+ const [balance, allowance] = balancesAndAllowances[i];
+ const tokenAddress = tokenAddresses[i];
+ trackedTokenStateByAddress[tokenAddress] = {
+ balance,
+ allowance,
+ isLoaded: true,
+ price: priceByAddress[tokenAddress],
+ };
+ }
+ this.setState({
+ trackedTokenStateByAddress,
+ });
+ }
+
+ private async _getPriceByAddressAsync(tokenAddresses: string[]): Promise<ItemByAddress<BigNumber>> {
+ if (_.isEmpty(tokenAddresses)) {
+ return {};
+ }
+ // for each input token address, search for the corresponding symbol in this.props.tokenByAddress, if it exists
+ // create a mapping from existing symbols -> address
+ const tokenAddressBySymbol: { [symbol: string]: string } = {};
+ _.each(tokenAddresses, address => {
+ const tokenIfExists = _.get(this.props.tokenByAddress, address);
+ if (!_.isUndefined(tokenIfExists)) {
+ const symbol = tokenIfExists.symbol;
+ tokenAddressBySymbol[symbol] = address;
+ }
+ });
+ const tokenSymbols = _.keys(tokenAddressBySymbol);
+ try {
+ const priceBySymbol = await backendClient.getPriceInfoAsync(tokenSymbols);
+ const priceByAddress = _.mapKeys(priceBySymbol, (_value, symbol) => _.get(tokenAddressBySymbol, symbol));
+ const result = _.mapValues(priceByAddress, price => {
+ const priceBigNumber = new BigNumber(price);
+ return priceBigNumber;
+ });
+ return result;
+ } catch (err) {
+ return {};
+ }
+ }
+
+ private async _refetchTokenStateAsync(tokenAddress: string): Promise<void> {
+ await this._fetchBalancesAndAllowancesAsync([tokenAddress]);
+ }
+}
+
+interface LargeLayoutProps {
+ left: React.ReactNode;
+ right: React.ReactNode;
+}
+const LargeLayout = (props: LargeLayoutProps) => {
+ return (
+ <Container
+ className="mx-auto flex flex-center"
+ maxWidth={LARGE_LAYOUT_MAX_WIDTH}
+ paddingLeft={SIDE_PADDING}
+ paddingRight={SIDE_PADDING}
+ >
+ <div className="flex-last">
+ <Container width={LEFT_COLUMN_WIDTH} position="fixed" zIndex={zIndex.aboveTopBar}>
+ {props.left}
+ </Container>
+ </div>
+ <Container className="flex-auto" marginLeft={LEFT_COLUMN_WIDTH}>
+ <Container className="flex-auto" marginLeft={SIDE_PADDING}>
+ {props.right}
+ </Container>
+ </Container>
+ </Container>
+ );
+};
+
+interface SmallLayoutProps {
+ content: React.ReactNode;
+}
+const SmallLayout = (props: SmallLayoutProps) => {
+ return (
+ <div className="flex flex-center">
+ <Container className="flex-auto" paddingLeft={SIDE_PADDING} paddingRight={SIDE_PADDING}>
+ {props.content}
+ </Container>
+ </div>
+ );
+}; // tslint:disable:max-file-line-count
diff --git a/packages/website/ts/components/portal/section.tsx b/packages/website/ts/components/portal/section.tsx
new file mode 100644
index 000000000..b6c9fd098
--- /dev/null
+++ b/packages/website/ts/components/portal/section.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react';
+
+export interface SectionProps {
+ header: React.ReactNode;
+ body: React.ReactNode;
+}
+export const Section = (props: SectionProps) => {
+ return (
+ <div className="flex flex-column">
+ {props.header}
+ {props.body}
+ </div>
+ );
+};
diff --git a/packages/website/ts/components/portal/text_header.tsx b/packages/website/ts/components/portal/text_header.tsx
new file mode 100644
index 000000000..853da3a29
--- /dev/null
+++ b/packages/website/ts/components/portal/text_header.tsx
@@ -0,0 +1,16 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+
+import { Text } from 'ts/components/ui/text';
+
+export interface TextHeaderProps {
+ labelText: string;
+}
+
+export const TextHeader = (props: TextHeaderProps) => {
+ return (
+ <Text className="pt3 pb2" fontWeight="bold" fontSize="16px" fontColor={colors.darkestGrey}>
+ {props.labelText}
+ </Text>
+ );
+};
diff --git a/packages/website/ts/components/portal_menu.tsx b/packages/website/ts/components/portal_menu.tsx
deleted file mode 100644
index 9ab611556..000000000
--- a/packages/website/ts/components/portal_menu.tsx
+++ /dev/null
@@ -1,84 +0,0 @@
-import * as _ from 'lodash';
-import * as React from 'react';
-import { MenuItem } from 'ts/components/ui/menu_item';
-import { Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
-
-export interface PortalMenuProps {
- menuItemStyle: React.CSSProperties;
- onClick?: () => void;
-}
-
-interface PortalMenuState {}
-
-export class PortalMenu extends React.Component<PortalMenuProps, PortalMenuState> {
- public static defaultProps: Partial<PortalMenuProps> = {
- onClick: _.noop,
- };
- public render() {
- return (
- <div>
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Generate order', 'zmdi-arrow-right-top')}
- </MenuItem>
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}/fill`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Fill order', 'zmdi-arrow-left-bottom')}
- </MenuItem>
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}/balances`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Balances', 'zmdi-balance-wallet')}
- </MenuItem>
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}/trades`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Trade history', 'zmdi-format-list-bulleted')}
- </MenuItem>
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}/weth`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Wrap ETH', 'zmdi-circle-o')}
- </MenuItem>
- {configs.ENVIRONMENT === Environments.DEVELOPMENT && (
- <MenuItem
- style={this.props.menuItemStyle}
- className="py2"
- to={`${WebsitePaths.Portal}/wallet`}
- onClick={this.props.onClick.bind(this)}
- >
- {this._renderMenuItemWithIcon('Wallet', 'zmdi-balance-wallet')}
- </MenuItem>
- )}
- </div>
- );
- }
- private _renderMenuItemWithIcon(title: string, iconName: string) {
- return (
- <div className="flex" style={{ fontWeight: 100 }}>
- <div className="pr1 pl2">
- <i style={{ fontSize: 20 }} className={`zmdi ${iconName}`} />
- </div>
- <div className="pl1">{title}</div>
- </div>
- );
- }
-}
diff --git a/packages/website/ts/components/redirector.tsx b/packages/website/ts/components/redirector.tsx
new file mode 100644
index 000000000..a02693003
--- /dev/null
+++ b/packages/website/ts/components/redirector.tsx
@@ -0,0 +1,9 @@
+import { constants } from 'ts/utils/constants';
+
+interface RedirectorProps {
+ location: string;
+}
+
+export function Redirector(_props: RedirectorProps): void {
+ window.location.href = constants.URL_ANGELLIST;
+}
diff --git a/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx
new file mode 100644
index 000000000..193dd237a
--- /dev/null
+++ b/packages/website/ts/components/relayer_index/relayer_grid_tile.tsx
@@ -0,0 +1,134 @@
+import { Styles } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import { GridTile as PlainGridTile } from 'material-ui/GridList';
+import * as React from 'react';
+import { analytics } from 'ts/utils/analytics';
+
+import { TopTokens } from 'ts/components/relayer_index/relayer_top_tokens';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Island } from 'ts/components/ui/island';
+import { colors } from 'ts/style/colors';
+import { media } from 'ts/style/media';
+import { styled } from 'ts/style/theme';
+import { WebsiteBackendRelayerInfo } from 'ts/types';
+import { utils } from 'ts/utils/utils';
+
+export interface RelayerGridTileProps {
+ relayerInfo: WebsiteBackendRelayerInfo;
+ networkId: number;
+}
+
+const styles: Styles = {
+ root: {
+ boxSizing: 'border-box',
+ // All material UI components have position: relative
+ // which creates a new stacking context and makes z-index stuff impossible. So reset.
+ position: 'static',
+ },
+ innerDiv: {
+ height: '100%',
+ boxSizing: 'border-box',
+ },
+ header: {
+ height: '50%',
+ width: '100%',
+ },
+ body: {
+ height: '50%',
+ width: '100%',
+ boxSizing: 'border-box',
+ padding: 12,
+ },
+ weeklyTradeVolumeLabel: {
+ fontSize: 14,
+ color: colors.mediumBlue,
+ },
+ subLabel: {
+ fontSize: 12,
+ color: colors.lightGrey,
+ },
+ relayerNameLabel: {
+ fontSize: 16,
+ fontWeight: 'bold',
+ color: colors.black,
+ },
+};
+
+const FALLBACK_IMG_SRC = '/images/relayer_fallback.png';
+const FALLBACK_PRIMARY_COLOR = colors.grey300;
+const NO_CONTENT_MESSAGE = '--';
+const RELAYER_ICON_HEIGHT = '110px';
+
+export const RelayerGridTile: React.StatelessComponent<RelayerGridTileProps> = (props: RelayerGridTileProps) => {
+ const link = props.relayerInfo.appUrl || props.relayerInfo.url;
+ const topTokens = props.relayerInfo.topTokens;
+ const weeklyTxnVolume = props.relayerInfo.weeklyTxnVolume;
+ const onClick = () => {
+ analytics.track('Relayer Click', {
+ name: props.relayerInfo.name,
+ });
+ utils.openUrl(link);
+ };
+ const headerImageUrl = props.relayerInfo.logoImgUrl;
+ const headerBackgroundColor =
+ !_.isUndefined(headerImageUrl) && !_.isUndefined(props.relayerInfo.primaryColor)
+ ? props.relayerInfo.primaryColor
+ : FALLBACK_PRIMARY_COLOR;
+ return (
+ <Island style={styles.root} Component={GridTile}>
+ <div style={styles.innerDiv} onClick={onClick}>
+ <div className="flex items-center" style={{ ...styles.header, backgroundColor: headerBackgroundColor }}>
+ <Image
+ className="mx-auto"
+ src={props.relayerInfo.logoImgUrl}
+ fallbackSrc={FALLBACK_IMG_SRC}
+ height={RELAYER_ICON_HEIGHT}
+ />
+ </div>
+ <div style={styles.body}>
+ <div className="pb1" style={styles.relayerNameLabel}>
+ {props.relayerInfo.name}
+ </div>
+ <Section titleText="Weekly Trade Volume">
+ {!_.isUndefined(weeklyTxnVolume) && (
+ <div style={styles.weeklyTradeVolumeLabel}>{props.relayerInfo.weeklyTxnVolume}</div>
+ )}
+ </Section>
+ <Container marginTop="10px">
+ <Section titleText="Top Tokens">
+ {!_.isEmpty(topTokens) && <TopTokens tokens={topTokens} networkId={props.networkId} />}
+ </Section>
+ </Container>
+ </div>
+ </div>
+ </Island>
+ );
+};
+
+const GridTile = styled(PlainGridTile)`
+ cursor: pointer;
+ &:hover {
+ transition: transform 0.2s ease;
+ transform: translate(0px, -3px);
+ }
+ ${media.small`
+ transform: none !important;
+ transition: none !important;
+ `};
+`;
+
+interface SectionProps {
+ titleText: string;
+ children?: React.ReactNode;
+}
+const Section = (props: SectionProps) => {
+ return (
+ <div>
+ <div style={styles.subLabel}>{props.titleText}</div>
+ <Container marginTop="6px">{props.children || <NoContent />}</Container>
+ </div>
+ );
+};
+
+const NoContent = () => <div style={styles.subLabel}>{NO_CONTENT_MESSAGE}</div>;
diff --git a/packages/website/ts/components/relayer_index/relayer_index.tsx b/packages/website/ts/components/relayer_index/relayer_index.tsx
new file mode 100644
index 000000000..4aea1bbbb
--- /dev/null
+++ b/packages/website/ts/components/relayer_index/relayer_index.tsx
@@ -0,0 +1,107 @@
+import * as _ from 'lodash';
+import CircularProgress from 'material-ui/CircularProgress';
+import { GridList } from 'material-ui/GridList';
+import * as React from 'react';
+
+import { RelayerGridTile } from 'ts/components/relayer_index/relayer_grid_tile';
+import { Retry } from 'ts/components/ui/retry';
+import { ScreenWidths, WebsiteBackendRelayerInfo } from 'ts/types';
+import { backendClient } from 'ts/utils/backend_client';
+
+export interface RelayerIndexProps {
+ networkId: number;
+ screenWidth: ScreenWidths;
+}
+
+interface RelayerIndexState {
+ relayerInfos?: WebsiteBackendRelayerInfo[];
+ error?: Error;
+}
+
+const CELL_HEIGHT = 290;
+const NUMBER_OF_COLUMNS_LARGE = 3;
+const NUMBER_OF_COLUMNS_MEDIUM = 2;
+const NUMBER_OF_COLUMNS_SMALL = 2;
+const GRID_PADDING = 20;
+
+export class RelayerIndex extends React.Component<RelayerIndexProps, RelayerIndexState> {
+ private _isUnmounted: boolean;
+ constructor(props: RelayerIndexProps) {
+ super(props);
+ this._isUnmounted = false;
+ this.state = {
+ relayerInfos: undefined,
+ error: undefined,
+ };
+ }
+ public componentWillMount(): void {
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchRelayerInfosAsync();
+ }
+ public componentWillUnmount(): void {
+ this._isUnmounted = true;
+ }
+ public render(): React.ReactNode {
+ const isReadyToRender = _.isUndefined(this.state.error) && !_.isUndefined(this.state.relayerInfos);
+ if (!isReadyToRender) {
+ return (
+ // TODO: consolidate this loading component with the one in portal and OpenPositions
+ // TODO: possibly refactor into a generic loading container with spinner and retry UI
+ <div className="center">
+ {_.isUndefined(this.state.error) ? (
+ <CircularProgress size={40} thickness={5} />
+ ) : (
+ <Retry onRetry={this._fetchRelayerInfosAsync.bind(this)} />
+ )}
+ </div>
+ );
+ } else {
+ const numberOfColumns = this._numberOfColumnsForScreenWidth(this.props.screenWidth);
+ return (
+ <GridList
+ cellHeight={CELL_HEIGHT}
+ cols={numberOfColumns}
+ padding={GRID_PADDING}
+ style={{ marginTop: -10, marginBottom: 0 }}
+ >
+ {this.state.relayerInfos.map((relayerInfo: WebsiteBackendRelayerInfo, index) => (
+ <RelayerGridTile key={index} relayerInfo={relayerInfo} networkId={this.props.networkId} />
+ ))}
+ </GridList>
+ );
+ }
+ }
+ private async _fetchRelayerInfosAsync(): Promise<void> {
+ try {
+ if (!this._isUnmounted) {
+ this.setState({
+ relayerInfos: undefined,
+ error: undefined,
+ });
+ }
+ const relayerInfos = await backendClient.getRelayerInfosAsync();
+ if (!this._isUnmounted) {
+ this.setState({
+ relayerInfos,
+ });
+ }
+ } catch (error) {
+ if (!this._isUnmounted) {
+ this.setState({
+ error,
+ });
+ }
+ }
+ }
+ private _numberOfColumnsForScreenWidth(screenWidth: ScreenWidths): number {
+ switch (screenWidth) {
+ case ScreenWidths.Md:
+ return NUMBER_OF_COLUMNS_MEDIUM;
+ case ScreenWidths.Sm:
+ return NUMBER_OF_COLUMNS_SMALL;
+ case ScreenWidths.Lg:
+ default:
+ return NUMBER_OF_COLUMNS_LARGE;
+ }
+ }
+}
diff --git a/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx b/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx
new file mode 100644
index 000000000..f3787bd27
--- /dev/null
+++ b/packages/website/ts/components/relayer_index/relayer_top_tokens.tsx
@@ -0,0 +1,61 @@
+import { colors, EtherscanLinkSuffixes, utils as sharedUtils } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+import { WebsiteBackendTokenInfo } from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
+import { utils } from 'ts/utils/utils';
+
+export interface TopTokensProps {
+ tokens: WebsiteBackendTokenInfo[];
+ networkId: number;
+}
+
+export const TopTokens: React.StatelessComponent<TopTokensProps> = (props: TopTokensProps) => {
+ return (
+ <div className="flex">
+ {_.map(props.tokens, (tokenInfo: WebsiteBackendTokenInfo) => {
+ return (
+ <Container key={tokenInfo.address} marginRight="16px">
+ <TokenLink tokenInfo={tokenInfo} networkId={props.networkId} />
+ </Container>
+ );
+ })}
+ </div>
+ );
+};
+
+interface TokenLinkProps {
+ tokenInfo: WebsiteBackendTokenInfo;
+ networkId: number;
+}
+interface TokenLinkState {}
+
+class TokenLink extends React.Component<TokenLinkProps, TokenLinkState> {
+ constructor(props: TokenLinkProps) {
+ super(props);
+ this.state = {
+ isHovering: false,
+ };
+ }
+ public render(): React.ReactNode {
+ const onClick = (event: React.MouseEvent<HTMLElement>) => {
+ event.stopPropagation();
+ analytics.track('Token Click', {
+ tokenSymbol: this.props.tokenInfo.symbol,
+ });
+ const tokenLink = this._tokenLinkFromToken(this.props.tokenInfo, this.props.networkId);
+ utils.openUrl(tokenLink);
+ };
+ return (
+ <Text fontSize="14px" fontColor={colors.mediumBlue} onClick={onClick}>
+ {this.props.tokenInfo.symbol}
+ </Text>
+ );
+ }
+ private _tokenLinkFromToken(tokenInfo: WebsiteBackendTokenInfo, networkId: number): string {
+ return sharedUtils.getEtherScanLinkIfExists(tokenInfo.address, networkId, EtherscanLinkSuffixes.Address);
+ }
+}
diff --git a/packages/website/ts/components/send_button.tsx b/packages/website/ts/components/send_button.tsx
index 79c103e05..107983dee 100644
--- a/packages/website/ts/components/send_button.tsx
+++ b/packages/website/ts/components/send_button.tsx
@@ -12,7 +12,7 @@ import { utils } from 'ts/utils/utils';
interface SendButtonProps {
userAddress: string;
networkId: number;
- token: Token;
+ asset: Token | 'ETH';
dispatcher: Dispatcher;
blockchain: Blockchain;
onError: () => void;
@@ -33,7 +33,7 @@ export class SendButton extends React.Component<SendButtonProps, SendButtonState
isSending: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const labelStyle = this.state.isSending ? { fontSize: 10 } : {};
return (
<div>
@@ -51,26 +51,30 @@ export class SendButton extends React.Component<SendButtonProps, SendButtonState
isOpen={this.state.isSendDialogVisible}
onComplete={this._onSendAmountSelectedAsync.bind(this)}
onCancelled={this._toggleSendDialog.bind(this)}
- token={this.props.token}
+ asset={this.props.asset}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
/>
</div>
);
}
- private _toggleSendDialog() {
+ private _toggleSendDialog(): void {
this.setState({
isSendDialogVisible: !this.state.isSendDialogVisible,
});
}
- private async _onSendAmountSelectedAsync(recipient: string, value: BigNumber) {
+ private async _onSendAmountSelectedAsync(recipient: string, value: BigNumber): Promise<void> {
this.setState({
isSending: true,
});
this._toggleSendDialog();
- const token = this.props.token;
try {
- await this.props.blockchain.transferAsync(token, recipient, value);
- await this.props.refetchTokenStateAsync(token.address);
+ if (this.props.asset === 'ETH') {
+ await this.props.blockchain.sendAsync(recipient, value);
+ } else {
+ const token = this.props.asset;
+ await this.props.blockchain.transferAsync(token, recipient, value);
+ await this.props.refetchTokenStateAsync(token.address);
+ }
} catch (err) {
const errMsg = `${err}`;
if (_.includes(errMsg, BlockchainCallErrs.UserHasNoAssociatedAddresses)) {
@@ -80,7 +84,7 @@ export class SendButton extends React.Component<SendButtonProps, SendButtonState
logUtils.log(`Unexpected error encountered: ${err}`);
logUtils.log(err.stack);
this.props.onError();
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
}
}
this.setState({
diff --git a/packages/website/ts/components/sidebar_header.tsx b/packages/website/ts/components/sidebar_header.tsx
index a0ea869fb..a14ab54f5 100644
--- a/packages/website/ts/components/sidebar_header.tsx
+++ b/packages/website/ts/components/sidebar_header.tsx
@@ -1,9 +1,6 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
-const SHOW_DURATION_MS = 4000;
-
interface SidebarHeaderProps {
title: string;
iconUrl: string;
@@ -12,7 +9,7 @@ interface SidebarHeaderProps {
interface SidebarHeaderState {}
export class SidebarHeader extends React.Component<SidebarHeaderProps, SidebarHeaderState> {
- public render() {
+ public render(): React.ReactNode {
return (
<div className="pt2 md-px1 sm-px2" style={{ color: colors.black, paddingBottom: 18 }}>
<div className="flex" style={{ fontSize: 25 }}>
diff --git a/packages/website/ts/components/token_balances.tsx b/packages/website/ts/components/token_balances.tsx
index b4a710ef4..969ef32ff 100644
--- a/packages/website/ts/components/token_balances.tsx
+++ b/packages/website/ts/components/token_balances.tsx
@@ -1,20 +1,17 @@
-import { ZeroEx } from '0x.js';
import {
- colors,
constants as sharedConstants,
EtherscanLinkSuffixes,
Networks,
Styles,
utils as sharedUtils,
} from '@0xproject/react-shared';
-import { BigNumber, logUtils } from '@0xproject/utils';
-import DharmaLoanFrame from 'dharma-loan-frame';
+import { BigNumber, errorUtils, fetchAsync, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import Dialog from 'material-ui/Dialog';
import Divider from 'material-ui/Divider';
import FlatButton from 'material-ui/FlatButton';
import FloatingActionButton from 'material-ui/FloatingActionButton';
-import RaisedButton from 'material-ui/RaisedButton';
import ContentAdd from 'material-ui/svg-icons/content/add';
import ContentRemove from 'material-ui/svg-icons/content/remove';
import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn } from 'material-ui/Table';
@@ -23,11 +20,11 @@ import ReactTooltip = require('react-tooltip');
import firstBy = require('thenby');
import { Blockchain } from 'ts/blockchain';
import { AssetPicker } from 'ts/components/generate_order/asset_picker';
-import { AllowanceToggle } from 'ts/components/inputs/allowance_toggle';
import { SendButton } from 'ts/components/send_button';
import { HelpTooltip } from 'ts/components/ui/help_tooltip';
import { LifeCycleRaisedButton } from 'ts/components/ui/lifecycle_raised_button';
import { TokenIcon } from 'ts/components/ui/token_icon';
+import { AllowanceStateToggle } from 'ts/containers/inputs/allowance_state_toggle';
import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
import { Dispatcher } from 'ts/redux/dispatcher';
import {
@@ -58,7 +55,7 @@ const TOKEN_COL_SPAN_SM = 1;
const styles: Styles = {
bgColor: {
- backgroundColor: colors.grey50,
+ backgroundColor: 'transparent',
},
};
@@ -74,19 +71,23 @@ interface TokenBalancesProps {
userEtherBalanceInWei: BigNumber;
networkId: number;
lastForceTokenStateRefetch: number;
+ isFullWidth?: boolean;
}
interface TokenBalancesState {
errorType: BalanceErrs;
+ trackedTokenStateByAddress: TokenStateByAddress;
isBalanceSpinnerVisible: boolean;
- isDharmaDialogVisible: boolean;
isZRXSpinnerVisible: boolean;
isTokenPickerOpen: boolean;
isAddingToken: boolean;
- trackedTokenStateByAddress: TokenStateByAddress;
}
export class TokenBalances extends React.Component<TokenBalancesProps, TokenBalancesState> {
+ public static defaultProps: Partial<TokenBalancesProps> = {
+ userEtherBalanceInWei: new BigNumber(0),
+ isFullWidth: false,
+ };
private _isUnmounted: boolean;
public constructor(props: TokenBalancesProps) {
super(props);
@@ -96,25 +97,24 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
errorType: undefined,
isBalanceSpinnerVisible: false,
isZRXSpinnerVisible: false,
- isDharmaDialogVisible: DharmaLoanFrame.isAuthTokenPresent(),
isTokenPickerOpen: false,
isAddingToken: false,
trackedTokenStateByAddress: initialTrackedTokenStateByAddress,
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
const trackedTokenAddresses = _.keys(this.state.trackedTokenStateByAddress);
// tslint:disable-next-line:no-floating-promises
this._fetchBalancesAndAllowancesAsync(trackedTokenAddresses);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public componentWillReceiveProps(nextProps: TokenBalancesProps) {
+ public componentWillReceiveProps(nextProps: TokenBalancesProps): void {
if (nextProps.userEtherBalanceInWei !== this.props.userEtherBalanceInWei) {
if (this.state.isBalanceSpinnerVisible) {
const receivedAmountInWei = nextProps.userEtherBalanceInWei.minus(this.props.userEtherBalanceInWei);
- const receivedAmountInEth = ZeroEx.toUnitAmount(receivedAmountInWei, constants.DECIMAL_PLACES_ETH);
+ const receivedAmountInEth = Web3Wrapper.toUnitAmount(receivedAmountInWei, constants.DECIMAL_PLACES_ETH);
const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
this.props.dispatcher.showFlashMessage(
`Received ${receivedAmountInEth.toString(10)} ${networkName} Ether`,
@@ -156,10 +156,10 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
this._fetchBalancesAndAllowancesAsync(newTokenAddresses);
}
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public render() {
+ public render(): React.ReactNode {
const errorDialogActions = [
<FlatButton
key="errorOkBtn"
@@ -168,20 +168,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
onTouchTap={this._onErrorDialogToggle.bind(this, false)}
/>,
];
- const dharmaDialogActions = [
- <FlatButton
- key="dharmaCloseBtn"
- label="Close"
- primary={true}
- onTouchTap={this._onDharmaDialogToggle.bind(this, false)}
- />,
- ];
const isTestNetwork = utils.isTestNetwork(this.props.networkId);
- const isKovanTestNetwork = this.props.networkId === constants.NETWORK_ID_KOVAN;
- const dharmaButtonColumnStyle = {
- paddingLeft: 3,
- display: isKovanTestNetwork ? 'table-cell' : 'none',
- };
const stubColumnStyle = {
display: isTestNetwork ? 'none' : 'table-cell',
};
@@ -190,22 +177,18 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
allTokenRowHeight < MAX_TOKEN_TABLE_HEIGHT ? allTokenRowHeight : MAX_TOKEN_TABLE_HEIGHT;
const isSmallScreen = this.props.screenWidth === ScreenWidths.Sm;
const tokenColSpan = isSmallScreen ? TOKEN_COL_SPAN_SM : TOKEN_COL_SPAN_LG;
- const dharmaLoanExplanation =
- 'If you need access to larger amounts of ether,<br> \
- you can request a loan from the Dharma Loan<br> \
- network. Your loan should be funded in 5<br> \
- minutes or less.';
const allowanceExplanation =
'0x smart contracts require access to your<br> \
token balances in order to execute trades.<br> \
Toggling sets an allowance for the<br> \
smart contract so you can start trading that token.';
- const userEtherBalanceInEth = ZeroEx.toUnitAmount(
+ const userEtherBalanceInEth = Web3Wrapper.toUnitAmount(
this.props.userEtherBalanceInWei,
constants.DECIMAL_PLACES_ETH,
);
+ const rootClassName = this.props.isFullWidth ? 'pb2' : 'lg-px4 md-px4 sm-px1 pb2';
return (
- <div className="lg-px4 md-px4 sm-px1 pb2">
+ <div className={rootClassName}>
<h3>{isTestNetwork ? 'Test ether' : 'Ether'}</h3>
<Divider />
<div className="pt2 pb2">
@@ -221,17 +204,8 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
<TableHeaderColumn>Currency</TableHeaderColumn>
<TableHeaderColumn>Balance</TableHeaderColumn>
<TableRowColumn className="sm-hide xs-hide" style={stubColumnStyle} />
- {isTestNetwork && (
- <TableHeaderColumn style={{ paddingLeft: 3 }}>
- {isSmallScreen ? 'Faucet' : 'Request from faucet'}
- </TableHeaderColumn>
- )}
- {isKovanTestNetwork && (
- <TableHeaderColumn style={dharmaButtonColumnStyle}>
- {isSmallScreen ? 'Loan' : 'Request Dharma loan'}
- <HelpTooltip style={{ paddingLeft: 4 }} explanation={dharmaLoanExplanation} />
- </TableHeaderColumn>
- )}
+ {isTestNetwork && <TableHeaderColumn style={{ paddingLeft: 3 }}>Action</TableHeaderColumn>}
+ <TableHeaderColumn>Send</TableHeaderColumn>
</TableRow>
</TableHeader>
<TableBody displayRowCheckbox={false}>
@@ -258,15 +232,20 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
/>
</TableRowColumn>
)}
- {isKovanTestNetwork && (
- <TableRowColumn style={dharmaButtonColumnStyle}>
- <RaisedButton
- label="Request"
- style={{ width: '100%' }}
- onTouchTap={this._onDharmaDialogToggle.bind(this)}
- />
- </TableRowColumn>
- )}
+ <TableRowColumn>
+ <SendButton
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ blockchain={this.props.blockchain}
+ dispatcher={this.props.dispatcher}
+ asset="ETH"
+ onError={this._onSendFailed.bind(this)}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ // This is not necessary for ETH.
+ // tslint:disable:jsx-no-lambda
+ refetchTokenStateAsync={() => undefined}
+ />
+ </TableRowColumn>
</TableRow>
</TableBody>
</Table>
@@ -300,7 +279,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
<div className="inline-block">Allowance</div>
<HelpTooltip style={{ paddingLeft: 4 }} explanation={allowanceExplanation} />
</TableHeaderColumn>
- <TableHeaderColumn>Action</TableHeaderColumn>
+ {isTestNetwork && <TableHeaderColumn>Action</TableHeaderColumn>}
{this.props.screenWidth !== ScreenWidths.Sm && <TableHeaderColumn>Send</TableHeaderColumn>}
</TableRow>
</TableHeader>
@@ -315,17 +294,6 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
>
{this._renderErrorDialogBody()}
</Dialog>
- <Dialog
- title="Request Dharma Loan"
- titleStyle={{ fontWeight: 100, backgroundColor: colors.white }}
- bodyStyle={{ backgroundColor: colors.dharmaDarkGrey }}
- actionsContainerStyle={{ backgroundColor: colors.white }}
- autoScrollBodyContent={true}
- actions={dharmaDialogActions}
- open={this.state.isDharmaDialogVisible}
- >
- {this._renderDharmaLoanFrame()}
- </Dialog>
<AssetPicker
userAddress={this.props.userAddress}
networkId={this.props.networkId}
@@ -340,7 +308,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
</div>
);
}
- private _renderTokenTableRows() {
+ private _renderTokenTableRows(): React.ReactNode {
if (!this.props.blockchainIsLoaded || this.props.blockchainErr !== BlockchainErrs.NoError) {
return '';
}
@@ -351,7 +319,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
const trackedTokensStartingWithEtherToken = trackedTokens.sort(
firstBy((t: Token) => t.symbol !== ETHER_TOKEN_SYMBOL)
.thenBy((t: Token) => t.symbol !== ZRX_TOKEN_SYMBOL)
- .thenBy('address'),
+ .thenBy('trackedTimestamp'),
);
const tableRows = _.map(
trackedTokensStartingWithEtherToken,
@@ -359,7 +327,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
);
return tableRows;
}
- private _renderTokenRow(tokenColSpan: number, actionPaddingX: number, token: Token) {
+ private _renderTokenRow(tokenColSpan: number, actionPaddingX: number, token: Token): React.ReactNode {
const tokenState = this.state.trackedTokenStateByAddress[token.address];
const tokenLink = sharedUtils.getEtherScanLinkIfExists(
token.address,
@@ -404,29 +372,27 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
)}
</TableRowColumn>
<TableRowColumn>
- <AllowanceToggle
- networkId={this.props.networkId}
- blockchain={this.props.blockchain}
- dispatcher={this.props.dispatcher}
- token={token}
- tokenState={tokenState}
- onErrorOccurred={this._onErrorOccurred.bind(this)}
- userAddress={this.props.userAddress}
- isDisabled={!tokenState.isLoaded}
- refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this, token.address)}
- />
- </TableRowColumn>
- <TableRowColumn style={{ paddingLeft: actionPaddingX, paddingRight: actionPaddingX }}>
- {isMintable && (
- <LifeCycleRaisedButton
- labelReady="Mint"
- labelLoading={<span style={{ fontSize: 12 }}>Minting...</span>}
- labelComplete="Minted!"
- onClickAsyncFn={this._onMintTestTokensAsync.bind(this, token)}
+ <div className="flex justify-center">
+ <AllowanceStateToggle
+ blockchain={this.props.blockchain}
+ token={token}
+ tokenState={tokenState}
+ onErrorOccurred={this._onErrorOccurred.bind(this)}
+ refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this, token.address)}
/>
- )}
- {token.symbol === ZRX_TOKEN_SYMBOL &&
- utils.isTestNetwork(this.props.networkId) && (
+ </div>
+ </TableRowColumn>
+ {utils.isTestNetwork(this.props.networkId) && (
+ <TableRowColumn style={{ paddingLeft: actionPaddingX, paddingRight: actionPaddingX }}>
+ {isMintable && (
+ <LifeCycleRaisedButton
+ labelReady="Mint"
+ labelLoading={<span style={{ fontSize: 12 }}>Minting...</span>}
+ labelComplete="Minted!"
+ onClickAsyncFn={this._onMintTestTokensAsync.bind(this, token)}
+ />
+ )}
+ {token.symbol === ZRX_TOKEN_SYMBOL && (
<LifeCycleRaisedButton
labelReady="Request"
labelLoading="Sending..."
@@ -434,7 +400,8 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
onClickAsyncFn={this._faucetRequestAsync.bind(this, false)}
/>
)}
- </TableRowColumn>
+ </TableRowColumn>
+ )}
{this.props.screenWidth !== ScreenWidths.Sm && (
<TableRowColumn
style={{
@@ -447,7 +414,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
networkId={this.props.networkId}
blockchain={this.props.blockchain}
dispatcher={this.props.dispatcher}
- token={token}
+ asset={token}
onError={this._onSendFailed.bind(this)}
lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this, token.address)}
@@ -457,7 +424,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
</TableRow>
);
}
- private _onAssetTokenPicked(tokenAddress: string) {
+ private _onAssetTokenPicked(tokenAddress: string): void {
if (_.isEmpty(tokenAddress)) {
this.setState({
isTokenPickerOpen: false,
@@ -469,9 +436,9 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
if (!this.state.isAddingToken && !isDefaultTrackedToken) {
if (token.isRegistered) {
// Remove the token from tracked tokens
- const newToken = {
+ const newToken: Token = {
...token,
- isTracked: false,
+ trackedTimestamp: undefined,
};
this.props.dispatcher.updateTokenByAddress([newToken]);
} else {
@@ -485,16 +452,16 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
isTokenPickerOpen: false,
});
}
- private _onSendFailed() {
+ private _onSendFailed(): void {
this.setState({
errorType: BalanceErrs.sendFailed,
});
}
- private _renderAmount(amount: BigNumber, decimals: number) {
- const unitAmount = ZeroEx.toUnitAmount(amount, decimals);
+ private _renderAmount(amount: BigNumber, decimals: number): React.ReactNode {
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
return unitAmount.toNumber().toFixed(configs.AMOUNT_DISPLAY_PRECSION);
}
- private _renderTokenName(token: Token) {
+ private _renderTokenName(token: Token): React.ReactNode {
const tooltipId = `tooltip-${token.address}`;
return (
<div className="flex">
@@ -506,7 +473,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
</div>
);
}
- private _renderErrorDialogBody() {
+ private _renderErrorDialogBody(): React.ReactNode {
switch (this.state.errorType) {
case BalanceErrs.incorrectNetworkForFaucet:
return (
@@ -542,28 +509,10 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
return null; // No error to show
default:
- throw utils.spawnSwitchErr('errorType', this.state.errorType);
- }
- }
- private _renderDharmaLoanFrame() {
- if (sharedUtils.isUserOnMobile()) {
- return (
- <h4 style={{ textAlign: 'center' }}>
- We apologize -- Dharma loan requests are not available on mobile yet. Please try again through your
- desktop browser.
- </h4>
- );
- } else {
- return (
- <DharmaLoanFrame
- partner="0x"
- env={utils.getCurrentEnvironment()}
- screenWidth={this.props.screenWidth}
- />
- );
+ throw errorUtils.spawnSwitchErr('errorType', this.state.errorType);
}
}
- private _onErrorOccurred(errorType: BalanceErrs) {
+ private _onErrorOccurred(errorType: BalanceErrs): void {
this.setState({
errorType,
});
@@ -572,7 +521,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
try {
await this.props.blockchain.mintTestTokensAsync(token);
await this._refetchTokenStateAsync(token.address);
- const amount = ZeroEx.toUnitAmount(constants.MINT_AMOUNT, token.decimals);
+ const amount = Web3Wrapper.toUnitAmount(constants.MINT_AMOUNT, token.decimals);
this.props.dispatcher.showFlashMessage(`Successfully minted ${amount.toString(10)} ${token.symbol}`);
return true;
} catch (err) {
@@ -589,7 +538,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
this.setState({
errorType: BalanceErrs.mintingFailed,
});
- await errorReporter.reportAsync(err);
+ errorReporter.report(err);
return false;
}
}
@@ -611,7 +560,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
await utils.sleepAsync(ARTIFICIAL_FAUCET_REQUEST_DELAY);
const segment = isEtherRequest ? 'ether' : 'zrx';
- const response = await fetch(
+ const response = await fetchAsync(
`${constants.URL_TESTNET_FAUCET}/${segment}/${this.props.userAddress}?networkId=${this.props.networkId}`,
);
const responseBody = await response.text();
@@ -624,7 +573,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
this.setState({
errorType,
});
- await errorReporter.reportAsync(new Error(`Faucet returned non-200: ${JSON.stringify(response)}`));
+ errorReporter.report(new Error(`Faucet returned non-200: ${JSON.stringify(response)}`));
return false;
}
@@ -641,29 +590,24 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
}
return true;
}
- private _onErrorDialogToggle(isOpen: boolean) {
+ private _onErrorDialogToggle(_isOpen: boolean): void {
this.setState({
errorType: undefined,
});
}
- private _onDharmaDialogToggle() {
- this.setState({
- isDharmaDialogVisible: !this.state.isDharmaDialogVisible,
- });
- }
- private _onAddTokenClicked() {
+ private _onAddTokenClicked(): void {
this.setState({
isTokenPickerOpen: true,
isAddingToken: true,
});
}
- private _onRemoveTokenClicked() {
+ private _onRemoveTokenClicked(): void {
this.setState({
isTokenPickerOpen: true,
isAddingToken: false,
});
}
- private async _startPollingZrxBalanceAsync() {
+ private async _startPollingZrxBalanceAsync(): Promise<void> {
const tokens = _.values(this.props.tokenByAddress);
const zrxToken = _.find(tokens, t => t.symbol === ZRX_TOKEN_SYMBOL);
@@ -678,7 +622,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
isZRXSpinnerVisible: false,
});
}
- private async _fetchBalancesAndAllowancesAsync(tokenAddresses: string[]) {
+ private async _fetchBalancesAndAllowancesAsync(tokenAddresses: string[]): Promise<void> {
const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress;
const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
for (const tokenAddress of tokenAddresses) {
@@ -698,7 +642,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
});
}
}
- private _getInitialTrackedTokenStateByAddress(trackedTokens: Token[]) {
+ private _getInitialTrackedTokenStateByAddress(trackedTokens: Token[]): TokenStateByAddress {
const trackedTokenStateByAddress: TokenStateByAddress = {};
_.each(trackedTokens, token => {
trackedTokenStateByAddress[token.address] = {
@@ -709,7 +653,7 @@ export class TokenBalances extends React.Component<TokenBalancesProps, TokenBala
});
return trackedTokenStateByAddress;
}
- private async _refetchTokenStateAsync(tokenAddress: string) {
+ private async _refetchTokenStateAsync(tokenAddress: string): Promise<void> {
const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync(
userAddressIfExists,
diff --git a/packages/website/ts/components/top_bar/provider_display.tsx b/packages/website/ts/components/top_bar/provider_display.tsx
index 221c34f8c..806eaeea5 100644
--- a/packages/website/ts/components/top_bar/provider_display.tsx
+++ b/packages/website/ts/components/top_bar/provider_display.tsx
@@ -1,149 +1,154 @@
-import { colors } from '@0xproject/react-shared';
+import { Styles } from '@0xproject/react-shared';
import * as _ from 'lodash';
-import RaisedButton from 'material-ui/RaisedButton';
+import CircularProgress from 'material-ui/CircularProgress';
+import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet';
import * as React from 'react';
+
import { Blockchain } from 'ts/blockchain';
-import { ProviderPicker } from 'ts/components/top_bar/provider_picker';
+import { AccountConnection } from 'ts/components/ui/account_connection';
+import { Container } from 'ts/components/ui/container';
import { DropDown } from 'ts/components/ui/drop_down';
import { Identicon } from 'ts/components/ui/identicon';
+import { Image } from 'ts/components/ui/image';
+import { Island } from 'ts/components/ui/island';
+import {
+ CopyAddressSimpleMenuItem,
+ DifferentWalletSimpleMenuItem,
+ GoToAccountManagementSimpleMenuItem,
+ SimpleMenu,
+} from 'ts/components/ui/simple_menu';
+import { Text } from 'ts/components/ui/text';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { ProviderType } from 'ts/types';
-import { constants } from 'ts/utils/constants';
+import { colors } from 'ts/style/colors';
+import { AccountState, ProviderType } from 'ts/types';
import { utils } from 'ts/utils/utils';
-const IDENTICON_DIAMETER = 32;
+const ROOT_HEIGHT = 24;
-interface ProviderDisplayProps {
+export interface ProviderDisplayProps {
dispatcher: Dispatcher;
userAddress: string;
networkId: number;
injectedProviderName: string;
providerType: ProviderType;
onToggleLedgerDialog: () => void;
- blockchain: Blockchain;
+ blockchain?: Blockchain;
+ blockchainIsLoaded: boolean;
}
interface ProviderDisplayState {}
+const styles: Styles = {
+ root: {
+ height: ROOT_HEIGHT,
+ borderRadius: ROOT_HEIGHT,
+ },
+};
+
export class ProviderDisplay extends React.Component<ProviderDisplayProps, ProviderDisplayState> {
- public render() {
- const isAddressAvailable = !_.isEmpty(this.props.userAddress);
- const isExternallyInjectedProvider =
- this.props.providerType === ProviderType.Injected && this.props.injectedProviderName !== '0x Public';
- const displayAddress = isAddressAvailable
- ? utils.getAddressBeginAndEnd(this.props.userAddress)
- : isExternallyInjectedProvider ? 'Account locked' : '0x0000...0000';
- // If the "injected" provider is our fallback public node, then we want to
- // show the "connect a wallet" message instead of the providerName
- const injectedProviderName = isExternallyInjectedProvider
- ? this.props.injectedProviderName
- : 'Connect a wallet';
- const providerTitle =
- this.props.providerType === ProviderType.Injected ? injectedProviderName : 'Ledger Nano S';
- const hoverActiveNode = (
- <div className="flex right lg-pr0 md-pr2 sm-pr2" style={{ paddingTop: 16 }}>
- <div>
- <Identicon address={this.props.userAddress} diameter={IDENTICON_DIAMETER} />
- </div>
- <div style={{ marginLeft: 12, paddingTop: 1 }}>
- <div style={{ fontSize: 12, color: colors.amber800 }}>{providerTitle}</div>
- <div style={{ fontSize: 14 }}>{displayAddress}</div>
- </div>
- <div
- style={{ borderLeft: `1px solid ${colors.grey300}`, marginLeft: 17, paddingTop: 1 }}
- className="px2"
- >
- <i style={{ fontSize: 30, color: colors.grey300 }} className="zmdi zmdi zmdi-chevron-down" />
- </div>
- </div>
+ public render(): React.ReactNode {
+ const activeNode = (
+ <Island className="flex items-center py1 px2" style={styles.root}>
+ {this._renderIcon()}
+ <Container marginLeft="12px" marginRight="12px">
+ {this._renderDisplayMessage()}
+ </Container>
+ {this._renderInjectedProvider()}
+ </Island>
);
- const hasInjectedProvider =
- this.props.injectedProviderName !== '0x Public' && this.props.providerType === ProviderType.Injected;
- const hasLedgerProvider = this.props.providerType === ProviderType.Ledger;
- const horizontalPosition = hasInjectedProvider || hasLedgerProvider ? 'left' : 'middle';
return (
<div style={{ width: 'fit-content', height: 48, float: 'right' }}>
<DropDown
- hoverActiveNode={hoverActiveNode}
- popoverContent={this.renderPopoverContent(hasInjectedProvider, hasLedgerProvider)}
- anchorOrigin={{ horizontal: horizontalPosition, vertical: 'bottom' }}
- targetOrigin={{ horizontal: horizontalPosition, vertical: 'top' }}
+ activeNode={activeNode}
+ popoverContent={this._renderPopoverContent()}
+ anchorOrigin={{ horizontal: 'middle', vertical: 'bottom' }}
+ targetOrigin={{ horizontal: 'middle', vertical: 'top' }}
zDepth={1}
/>
</div>
);
}
- public renderPopoverContent(hasInjectedProvider: boolean, hasLedgerProvider: boolean) {
- if (hasInjectedProvider || hasLedgerProvider) {
- return (
- <ProviderPicker
- dispatcher={this.props.dispatcher}
- networkId={this.props.networkId}
- injectedProviderName={this.props.injectedProviderName}
- providerType={this.props.providerType}
- onToggleLedgerDialog={this.props.onToggleLedgerDialog}
- blockchain={this.props.blockchain}
- />
- );
- } else {
- // Nothing to connect to, show install/info popover
- return (
- <div className="px2" style={{ maxWidth: 420 }}>
- <div className="center h4 py2" style={{ color: colors.grey700 }}>
- Choose a wallet:
- </div>
- <div className="flex pb3">
- <div className="center px2">
- <div style={{ color: colors.darkGrey }}>Install a browser wallet</div>
- <div className="py2">
- <img src="/images/metamask_or_parity.png" width="135" />
- </div>
- <div>
- Use{' '}
- <a
- href={constants.URL_METAMASK_CHROME_STORE}
- target="_blank"
- style={{ color: colors.lightBlueA700 }}
- >
- Metamask
- </a>{' '}
- or{' '}
- <a
- href={constants.URL_PARITY_CHROME_STORE}
- target="_blank"
- style={{ color: colors.lightBlueA700 }}
- >
- Parity Signer
- </a>
- </div>
- </div>
- <div>
- <div
- className="pl1 ml1"
- style={{ borderLeft: `1px solid ${colors.grey300}`, height: 65 }}
- />
- <div className="py1">or</div>
- <div
- className="pl1 ml1"
- style={{ borderLeft: `1px solid ${colors.grey300}`, height: 68 }}
- />
- </div>
- <div className="px2 center">
- <div style={{ color: colors.darkGrey }}>Connect to a ledger hardware wallet</div>
- <div style={{ paddingTop: 21, paddingBottom: 29 }}>
- <img src="/images/ledger_icon.png" style={{ width: 80 }} />
- </div>
- <div>
- <RaisedButton
- style={{ width: '100%' }}
- label="Use Ledger"
- onClick={this.props.onToggleLedgerDialog}
- />
- </div>
- </div>
- </div>
- </div>
- );
+ private _renderPopoverContent(): React.ReactNode {
+ const accountState = this._getAccountState();
+ switch (accountState) {
+ case AccountState.Ready:
+ return (
+ <SimpleMenu>
+ <CopyAddressSimpleMenuItem userAddress={this.props.userAddress} />
+ <DifferentWalletSimpleMenuItem onClick={this.props.onToggleLedgerDialog} />
+ <GoToAccountManagementSimpleMenuItem />
+ </SimpleMenu>
+ );
+ case AccountState.Disconnected:
+ case AccountState.Locked:
+ case AccountState.Loading:
+ default:
+ return null;
+ }
+ }
+ private _renderIcon(): React.ReactNode {
+ const accountState = this._getAccountState();
+ switch (accountState) {
+ case AccountState.Ready:
+ return <Identicon address={this.props.userAddress} diameter={ROOT_HEIGHT} />;
+ case AccountState.Loading:
+ return <CircularProgress size={ROOT_HEIGHT} thickness={2} />;
+ case AccountState.Locked:
+ return <Image src="/images/lock_icon.svg" height="20px" width="20px" />;
+ case AccountState.Disconnected:
+ return <ActionAccountBalanceWallet color={colors.mediumBlue} />;
+ default:
+ return null;
+ }
+ }
+ private _renderDisplayMessage(): React.ReactNode {
+ const accountState = this._getAccountState();
+ const displayMessage = utils.getReadableAccountState(accountState, this.props.userAddress);
+ const fontColor = this._getDisplayMessageFontColor();
+ return (
+ <Text fontSize="16px" fontColor={fontColor} fontWeight={500}>
+ {displayMessage}
+ </Text>
+ );
+ }
+ private _getDisplayMessageFontColor(): string {
+ const accountState = this._getAccountState();
+ switch (accountState) {
+ case AccountState.Loading:
+ return colors.darkGrey;
+ case AccountState.Ready:
+ case AccountState.Locked:
+ case AccountState.Disconnected:
+ default:
+ return colors.black;
+ }
+ }
+ private _renderInjectedProvider(): React.ReactNode {
+ const accountState = this._getAccountState();
+ switch (accountState) {
+ case AccountState.Ready:
+ case AccountState.Locked:
+ return (
+ <AccountConnection
+ accountState={accountState}
+ injectedProviderName={this.props.injectedProviderName}
+ />
+ );
+ case AccountState.Disconnected:
+ case AccountState.Loading:
+ default:
+ return null;
}
}
+ private _isBlockchainReady(): boolean {
+ return this.props.blockchainIsLoaded && !_.isUndefined(this.props.blockchain);
+ }
+ private _getAccountState(): AccountState {
+ return utils.getAccountState(
+ this._isBlockchainReady(),
+ this.props.providerType,
+ this.props.injectedProviderName,
+ this.props.userAddress,
+ );
+ }
}
diff --git a/packages/website/ts/components/top_bar/provider_picker.tsx b/packages/website/ts/components/top_bar/provider_picker.tsx
deleted file mode 100644
index b986da873..000000000
--- a/packages/website/ts/components/top_bar/provider_picker.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { colors, constants as sharedConstants } from '@0xproject/react-shared';
-import * as _ from 'lodash';
-import { RadioButton, RadioButtonGroup } from 'material-ui/RadioButton';
-import * as React from 'react';
-import { Blockchain } from 'ts/blockchain';
-import { Dispatcher } from 'ts/redux/dispatcher';
-import { ProviderType } from 'ts/types';
-import { constants } from 'ts/utils/constants';
-
-interface ProviderPickerProps {
- networkId: number;
- injectedProviderName: string;
- providerType: ProviderType;
- onToggleLedgerDialog: () => void;
- dispatcher: Dispatcher;
- blockchain: Blockchain;
-}
-
-interface ProviderPickerState {}
-
-export class ProviderPicker extends React.Component<ProviderPickerProps, ProviderPickerState> {
- public render() {
- const isLedgerSelected = this.props.providerType === ProviderType.Ledger;
- const menuStyle = {
- padding: 10,
- paddingTop: 15,
- paddingBottom: 15,
- };
- // Show dropdown with two options
- return (
- <div style={{ width: 225, overflow: 'hidden' }}>
- <RadioButtonGroup name="provider" defaultSelected={this.props.providerType}>
- <RadioButton
- onClick={this._onProviderRadioChanged.bind(this, ProviderType.Injected)}
- style={{ ...menuStyle, backgroundColor: !isLedgerSelected && colors.grey50 }}
- value={ProviderType.Injected}
- label={this._renderLabel(this.props.injectedProviderName, !isLedgerSelected)}
- />
- <RadioButton
- onClick={this._onProviderRadioChanged.bind(this, ProviderType.Ledger)}
- style={{ ...menuStyle, backgroundColor: isLedgerSelected && colors.grey50 }}
- value={ProviderType.Ledger}
- label={this._renderLabel('Ledger Nano S', isLedgerSelected)}
- />
- </RadioButtonGroup>
- </div>
- );
- }
- private _renderLabel(title: string, shouldShowNetwork: boolean) {
- const label = (
- <div className="flex">
- <div style={{ fontSize: 14 }}>{title}</div>
- {shouldShowNetwork && this._renderNetwork()}
- </div>
- );
- return label;
- }
- private _renderNetwork() {
- const networkName = sharedConstants.NETWORK_NAME_BY_ID[this.props.networkId];
- return (
- <div className="flex" style={{ marginTop: 1 }}>
- <div className="relative" style={{ width: 14, paddingLeft: 14 }}>
- <img
- src={`/images/network_icons/${networkName.toLowerCase()}.png`}
- className="absolute"
- style={{ top: 6, width: 10 }}
- />
- </div>
- <div style={{ color: colors.lightGrey, fontSize: 11 }}>{networkName}</div>
- </div>
- );
- }
- private _onProviderRadioChanged(value: string) {
- if (value === ProviderType.Ledger) {
- this.props.onToggleLedgerDialog();
- } else {
- // tslint:disable-next-line:no-floating-promises
- this.props.blockchain.updateProviderToInjectedAsync();
- }
- }
-}
diff --git a/packages/website/ts/components/top_bar/top_bar.tsx b/packages/website/ts/components/top_bar/top_bar.tsx
index 4b2e82119..646d3fc94 100644
--- a/packages/website/ts/components/top_bar/top_bar.tsx
+++ b/packages/website/ts/components/top_bar/top_bar.tsx
@@ -6,20 +6,23 @@ import Menu from 'material-ui/Menu';
import MenuItem from 'material-ui/MenuItem';
import * as React from 'react';
import { Link } from 'react-router-dom';
-import ReactTooltip = require('react-tooltip');
import { Blockchain } from 'ts/blockchain';
-import { PortalMenu } from 'ts/components/portal_menu';
-import { SidebarHeader } from 'ts/components/sidebar_header';
+import { DrawerMenu } from 'ts/components/portal/drawer_menu';
import { ProviderDisplay } from 'ts/components/top_bar/provider_display';
import { TopBarMenuItem } from 'ts/components/top_bar/top_bar_menu_item';
+import { Container } from 'ts/components/ui/container';
import { DropDown } from 'ts/components/ui/drop_down';
-import { Identicon } from 'ts/components/ui/identicon';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { Deco, Key, ProviderType, WebsitePaths } from 'ts/types';
+import { Deco, Key, ProviderType, WebsiteLegacyPaths, WebsitePaths } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
-interface TopBarProps {
+export enum TopBarDisplayType {
+ Default,
+ Expanded,
+}
+
+export interface TopBarProps {
userAddress?: string;
networkId?: number;
injectedProviderName?: string;
@@ -34,12 +37,15 @@ interface TopBarProps {
availableDocVersions?: string[];
menu?: DocsMenu;
menuSubsectionsBySection?: MenuSubsectionsBySection;
- shouldFullWidth?: boolean;
+ displayType?: TopBarDisplayType;
docsInfo?: DocsInfo;
style?: React.CSSProperties;
isNightVersion?: boolean;
onVersionSelected?: (semver: string) => void;
sidebarHeader?: React.ReactNode;
+ maxWidth?: number;
+ paddingLeft?: number;
+ paddingRight?: number;
}
interface TopBarState {
@@ -47,22 +53,13 @@ interface TopBarState {
}
const styles: Styles = {
- address: {
- marginRight: 12,
- overflow: 'hidden',
- paddingTop: 4,
- textOverflow: 'ellipsis',
- whiteSpace: 'nowrap',
- width: 70,
- },
topBar: {
- backgroundcolor: colors.white,
- height: 59,
+ backgroundColor: colors.white,
width: '100%',
position: 'relative',
top: 0,
- zIndex: 1100,
paddingBottom: 1,
+ zIndex: 1,
},
bottomBar: {
boxShadow: 'rgba(0, 0, 0, 0.187647) 0px 1px 3px',
@@ -72,28 +69,46 @@ const styles: Styles = {
color: colors.darkestGrey,
paddingTop: 6,
paddingBottom: 6,
- marginTop: 17,
cursor: 'pointer',
fontWeight: 400,
},
};
+const DEFAULT_HEIGHT = 68;
+const EXPANDED_HEIGHT = 75;
+
export class TopBar extends React.Component<TopBarProps, TopBarState> {
public static defaultProps: Partial<TopBarProps> = {
- shouldFullWidth: false,
+ displayType: TopBarDisplayType.Default,
style: {},
isNightVersion: false,
+ paddingLeft: 20,
+ paddingRight: 20,
};
+ public static heightForDisplayType(displayType: TopBarDisplayType): number {
+ const result = displayType === TopBarDisplayType.Expanded ? EXPANDED_HEIGHT : DEFAULT_HEIGHT;
+ return result + 1;
+ }
constructor(props: TopBarProps) {
super(props);
this.state = {
isDrawerOpen: false,
};
}
- public render() {
+ public componentWillReceiveProps(nextProps: TopBarProps): void {
+ if (nextProps.location.pathname !== this.props.location.pathname) {
+ this.setState({
+ isDrawerOpen: false,
+ });
+ }
+ }
+ public render(): React.ReactNode {
const isNightVersion = this.props.isNightVersion;
- const isFullWidthPage = this.props.shouldFullWidth;
- const parentClassNames = `flex mx-auto ${isFullWidthPage ? 'pl2' : 'max-width-4'}`;
+ const isExpandedDisplayType = this.props.displayType === TopBarDisplayType.Expanded;
+ const parentClassNames = !isExpandedDisplayType
+ ? 'flex mx-auto items-center max-width-4'
+ : 'flex mx-auto items-center';
+ const height = isExpandedDisplayType ? EXPANDED_HEIGHT : DEFAULT_HEIGHT;
const developerSectionMenuItems = [
<Link key="subMenuItem-zeroEx" to={WebsitePaths.ZeroExJs} className="text-decoration-none">
<MenuItem style={{ fontSize: styles.menuItem.fontSize }} primaryText="0x.js" />
@@ -139,10 +154,10 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
primaryText={this.props.translate.get(Key.Web3Wrapper, Deco.CapWords)}
/>
</Link>,
- <Link key="subMenuItem-deployer" to={WebsitePaths.Deployer} className="text-decoration-none">
+ <Link key="subMenuItem-sol-compiler" to={WebsitePaths.SolCompiler} className="text-decoration-none">
<MenuItem
style={{ fontSize: styles.menuItem.fontSize }}
- primaryText={this.props.translate.get(Key.Deployer, Deco.CapWords)}
+ primaryText={this.props.translate.get(Key.SolCompiler, Deco.CapWords)}
/>
</Link>,
<Link key="subMenuItem-sol-cov" to={WebsitePaths.SolCov} className="text-decoration-none">
@@ -151,6 +166,12 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
primaryText={this.props.translate.get(Key.SolCov, Deco.CapWords)}
/>
</Link>,
+ <Link key="subMenuItem-ethereum-types" to={WebsitePaths.EthereumTypes} className="text-decoration-none">
+ <MenuItem
+ style={{ fontSize: styles.menuItem.fontSize }}
+ primaryText={this.props.translate.get(Key.EthereumTypes, Deco.CapWords)}
+ />
+ </Link>,
<a
key="subMenuItem-whitePaper"
target="_blank"
@@ -172,16 +193,17 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
</a>,
];
const bottomBorderStyle = this._shouldDisplayBottomBar() ? styles.bottomBar : {};
- const fullWidthClasses = isFullWidthPage ? 'pr4' : '';
+ const fullWidthClasses = isExpandedDisplayType ? 'pr4' : '';
const logoUrl = isNightVersion ? '/images/protocol_logo_white.png' : '/images/protocol_logo_black.png';
- const menuClasses = `col col-${isFullWidthPage ? '4' : '5'} ${fullWidthClasses} lg-pr0 md-pr2 sm-hide xs-hide`;
+ const menuClasses = `col col-${
+ isExpandedDisplayType ? '4' : '5'
+ } ${fullWidthClasses} lg-pr0 md-pr2 sm-hide xs-hide`;
const menuIconStyle = {
fontSize: 25,
color: isNightVersion ? 'white' : 'black',
cursor: 'pointer',
- paddingTop: 16,
};
- const hoverActiveNode = (
+ const activeNode = (
<div className="flex relative" style={{ color: menuIconStyle.color }}>
<div style={{ paddingRight: 10 }}>{this.props.translate.get(Key.Developers, Deco.Cap)}</div>
<div className="absolute" style={{ paddingLeft: 3, right: 3, top: -2 }}>
@@ -191,20 +213,26 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
);
const popoverContent = <Menu style={{ color: colors.darkGrey }}>{developerSectionMenuItems}</Menu>;
return (
- <div style={{ ...styles.topBar, ...bottomBorderStyle, ...this.props.style }} className="pb1">
- <div className={parentClassNames}>
- <div className="col col-2 sm-pl2 md-pl2 lg-pl0" style={{ paddingTop: 15 }}>
- <Link to={`${WebsitePaths.Home}`} className="text-decoration-none">
- <img src={logoUrl} height="30" />
- </Link>
- </div>
- <div className={`col col-${isFullWidthPage ? '8' : '9'} lg-hide md-hide`} />
- <div className={`col col-${isFullWidthPage ? '6' : '5'} sm-hide xs-hide`} />
+ <div
+ style={{ ...styles.topBar, ...bottomBorderStyle, ...this.props.style, ...{ height } }}
+ className="pb1 flex items-center"
+ >
+ <Container
+ className={parentClassNames}
+ width="100%"
+ maxWidth={this.props.maxWidth}
+ paddingLeft={this.props.paddingLeft}
+ paddingRight={this.props.paddingRight}
+ >
+ <Link to={`${WebsitePaths.Home}`} className="text-decoration-none">
+ <img src={logoUrl} height="30" />
+ </Link>
+ <div className="flex-auto" />
{!this._isViewingPortal() && (
<div className={menuClasses}>
- <div className="flex justify-between">
+ <div className="flex items-center justify-between">
<DropDown
- hoverActiveNode={hoverActiveNode}
+ activeNode={activeNode}
popoverContent={popoverContent}
anchorOrigin={{ horizontal: 'middle', vertical: 'bottom' }}
targetOrigin={{ horizontal: 'middle', vertical: 'top' }}
@@ -232,19 +260,19 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
isExternal={false}
/>
<TopBarMenuItem
- title={this.props.translate.get(Key.PortalDApp, Deco.CapWords)}
+ title={this.props.translate.get(Key.TradeCallToAction, Deco.Cap)}
path={`${WebsitePaths.Portal}`}
isPrimary={true}
style={styles.menuItem}
- className={`${isFullWidthPage && 'md-hide'}`}
+ className={`${isExpandedDisplayType && 'md-hide'}`}
isNightVersion={isNightVersion}
isExternal={false}
/>
</div>
</div>
)}
- {this.props.blockchainIsLoaded && (
- <div className="sm-hide xs-hide col col-5">
+ {this._isViewingPortal() && (
+ <div className="sm-hide xs-hide">
<ProviderDisplay
dispatcher={this.props.dispatcher}
userAddress={this.props.userAddress}
@@ -253,20 +281,40 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
providerType={this.props.providerType}
onToggleLedgerDialog={this.props.onToggleLedgerDialog}
blockchain={this.props.blockchain}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
/>
</div>
)}
- <div className={`col ${isFullWidthPage ? 'col-2 pl2' : 'col-1'} md-hide lg-hide`}>
+ <div className={'md-hide lg-hide'}>
<div style={menuIconStyle}>
<i className="zmdi zmdi-menu" onClick={this._onMenuButtonClick.bind(this)} />
</div>
</div>
- </div>
- {this._renderDrawer()}
+ </Container>
+ {this._isViewingPortal() ? this._renderPortalDrawer() : this._renderDrawer()}
</div>
);
}
- private _renderDrawer() {
+ private _renderPortalDrawer(): React.ReactNode {
+ return (
+ <Drawer
+ open={this.state.isDrawerOpen}
+ docked={false}
+ openSecondary={true}
+ onRequestChange={this._onMenuButtonClick.bind(this)}
+ >
+ <DrawerMenu
+ selectedPath={this.props.location.pathname}
+ userAddress={this.props.userAddress}
+ injectedProviderName={this.props.injectedProviderName}
+ providerType={this.props.providerType}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
+ blockchain={this.props.blockchain}
+ />
+ </Drawer>
+ );
+ }
+ private _renderDrawer(): React.ReactNode {
return (
<Drawer
open={this.state.isDrawerOpen}
@@ -275,7 +323,6 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
onRequestChange={this._onMenuButtonClick.bind(this)}
>
<div className="clearfix">
- {this._renderPortalMenu()}
{this._renderDocsMenu()}
{this._renderWiki()}
<div className="pl1 py1 mt3" style={{ backgroundColor: colors.lightGrey }}>
@@ -316,10 +363,10 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
</MenuItem>
</Link>
)}
- {!this._isViewingDeployerDocs() && (
- <Link to={WebsitePaths.Deployer} className="text-decoration-none">
+ {!this._isViewingSolCompilerDocs() && (
+ <Link to={WebsitePaths.SolCompiler} className="text-decoration-none">
<MenuItem className="py2">
- {this.props.translate.get(Key.Deployer, Deco.Cap)}{' '}
+ {this.props.translate.get(Key.SolCompiler, Deco.Cap)}{' '}
{this.props.translate.get(Key.Docs, Deco.Cap)}
</MenuItem>
</Link>
@@ -348,6 +395,14 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
</MenuItem>
</Link>
)}
+ {!this._isViewingEthereumTypesDocs() && (
+ <Link to={WebsitePaths.EthereumTypes} className="text-decoration-none">
+ <MenuItem className="py2">
+ {this.props.translate.get(Key.EthereumTypes, Deco.Cap)}{' '}
+ {this.props.translate.get(Key.Docs, Deco.Cap)}
+ </MenuItem>
+ </Link>
+ )}
{!this._isViewingPortal() && (
<Link to={`${WebsitePaths.Portal}`} className="text-decoration-none">
<MenuItem className="py2">
@@ -378,7 +433,7 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
(!this._isViewing0xjsDocs() &&
!this._isViewingSmartContractsDocs() &&
!this._isViewingWeb3WrapperDocs() &&
- !this._isViewingDeployerDocs() &&
+ !this._isViewingSolCompilerDocs() &&
!this._isViewingJsonSchemasDocs() &&
!this._isViewingSolCovDocs() &&
!this._isViewingSubprovidersDocs() &&
@@ -387,8 +442,6 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
) {
return undefined;
}
-
- const sectionTitle = `${this.props.docsInfo.displayName} Docs`;
return (
<div className="lg-hide md-hide">
<NestedSidebarMenu
@@ -421,85 +474,70 @@ export class TopBar extends React.Component<TopBarProps, TopBarState> {
</div>
);
}
- private _renderPortalMenu(): React.ReactNode {
- if (!this._isViewingPortal()) {
- return undefined;
- }
-
- return (
- <div className="lg-hide md-hide">
- <div className="pl1 py1" style={{ backgroundColor: colors.lightGrey }}>
- {this.props.translate.get(Key.PortalDApp, Deco.CapWords)}
- </div>
- <PortalMenu menuItemStyle={{ color: 'black' }} onClick={this._onMenuButtonClick.bind(this)} />
- </div>
- );
- }
- private _renderUser() {
- const userAddress = this.props.userAddress;
- const identiconDiameter = 26;
- return (
- <div className="flex right lg-pr0 md-pr2 sm-pr2" style={{ paddingTop: 16 }}>
- <div style={styles.address} data-tip={true} data-for="userAddressTooltip">
- {!_.isEmpty(userAddress) ? userAddress : ''}
- </div>
- <ReactTooltip id="userAddressTooltip">{userAddress}</ReactTooltip>
- <div>
- <Identicon address={userAddress} diameter={identiconDiameter} />
- </div>
- </div>
- );
- }
- private _onMenuButtonClick() {
+ private _onMenuButtonClick(): void {
this.setState({
isDrawerOpen: !this.state.isDrawerOpen,
});
}
- private _isViewingPortal() {
+ private _isViewingPortal(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.Portal);
}
- private _isViewingFAQ() {
+ private _isViewingDocs(): boolean {
+ return _.includes(this.props.location.pathname, WebsitePaths.Docs);
+ }
+ private _isViewingFAQ(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.FAQ);
}
- private _isViewing0xjsDocs() {
- return _.includes(this.props.location.pathname, WebsitePaths.ZeroExJs);
+ private _isViewing0xjsDocs(): boolean {
+ return (
+ _.includes(this.props.location.pathname, WebsitePaths.ZeroExJs) ||
+ _.includes(this.props.location.pathname, WebsiteLegacyPaths.ZeroExJs)
+ );
}
- private _isViewingConnectDocs() {
+ private _isViewingConnectDocs(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.Connect);
}
- private _isViewingSmartContractsDocs() {
+ private _isViewingSmartContractsDocs(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.SmartContracts);
}
- private _isViewingWeb3WrapperDocs() {
- return _.includes(this.props.location.pathname, WebsitePaths.Web3Wrapper);
+ private _isViewingWeb3WrapperDocs(): boolean {
+ return (
+ _.includes(this.props.location.pathname, WebsitePaths.Web3Wrapper) ||
+ _.includes(this.props.location.pathname, WebsiteLegacyPaths.Web3Wrapper)
+ );
}
- private _isViewingDeployerDocs() {
- return _.includes(this.props.location.pathname, WebsitePaths.Deployer);
+ private _isViewingSolCompilerDocs(): boolean {
+ return _.includes(this.props.location.pathname, WebsitePaths.SolCompiler);
}
- private _isViewingJsonSchemasDocs() {
+ private _isViewingJsonSchemasDocs(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.JSONSchemas);
}
- private _isViewingSolCovDocs() {
+ private _isViewingSolCovDocs(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.SolCov);
}
- private _isViewingSubprovidersDocs() {
+ private _isViewingSubprovidersDocs(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.Subproviders);
}
- private _isViewingWiki() {
+ private _isViewingEthereumTypesDocs(): boolean {
+ return _.includes(this.props.location.pathname, WebsitePaths.EthereumTypes);
+ }
+ private _isViewingWiki(): boolean {
return _.includes(this.props.location.pathname, WebsitePaths.Wiki);
}
- private _shouldDisplayBottomBar() {
+ private _shouldDisplayBottomBar(): boolean {
return (
this._isViewingWiki() ||
- this._isViewing0xjsDocs() ||
this._isViewingFAQ() ||
+ this._isViewingDocs() ||
+ this._isViewing0xjsDocs() ||
this._isViewingSmartContractsDocs() ||
this._isViewingWeb3WrapperDocs() ||
- this._isViewingDeployerDocs() ||
+ this._isViewingSolCompilerDocs() ||
this._isViewingJsonSchemasDocs() ||
this._isViewingSolCovDocs() ||
this._isViewingSubprovidersDocs() ||
- this._isViewingConnectDocs()
+ this._isViewingConnectDocs() ||
+ this._isViewingPortal()
);
}
} // tslint:disable:max-file-line-count
diff --git a/packages/website/ts/components/top_bar/top_bar_menu_item.tsx b/packages/website/ts/components/top_bar/top_bar_menu_item.tsx
index c0e674b17..25fab2868 100644
--- a/packages/website/ts/components/top_bar/top_bar_menu_item.tsx
+++ b/packages/website/ts/components/top_bar/top_bar_menu_item.tsx
@@ -3,6 +3,8 @@ import * as _ from 'lodash';
import * as React from 'react';
import { Link } from 'react-router-dom';
+import { CallToAction } from 'ts/components/ui/button';
+
const DEFAULT_STYLE = {
color: colors.darkestGrey,
};
@@ -26,24 +28,16 @@ export class TopBarMenuItem extends React.Component<TopBarMenuItemProps, TopBarM
className: '',
isNightVersion: false,
};
- public render() {
- const primaryStyles = this.props.isPrimary
- ? {
- borderRadius: 4,
- border: `1px solid ${this.props.isNightVersion ? colors.grey : colors.greyishPink}`,
- marginTop: 15,
- paddingLeft: 9,
- paddingRight: 9,
- minWidth: 77,
- }
- : {};
+ public render(): React.ReactNode {
const menuItemColor = this.props.isNightVersion ? 'white' : this.props.style.color;
const linkColor = _.isUndefined(menuItemColor) ? colors.darkestGrey : menuItemColor;
+ const itemContent = this.props.isPrimary ? (
+ <CallToAction padding="0.8em 1.5em">{this.props.title}</CallToAction>
+ ) : (
+ this.props.title
+ );
return (
- <div
- className={`center ${this.props.className}`}
- style={{ ...this.props.style, ...primaryStyles, color: menuItemColor }}
- >
+ <div className={`center ${this.props.className}`} style={{ ...this.props.style, color: menuItemColor }}>
{this.props.isExternal ? (
<a
className="text-decoration-none"
@@ -51,11 +45,11 @@ export class TopBarMenuItem extends React.Component<TopBarMenuItemProps, TopBarM
target="_blank"
href={this.props.path}
>
- {this.props.title}
+ {itemContent}
</a>
) : (
<Link to={this.props.path} className="text-decoration-none" style={{ color: linkColor }}>
- {this.props.title}
+ {itemContent}
</Link>
)}
</div>
diff --git a/packages/website/ts/components/track_token_confirmation.tsx b/packages/website/ts/components/track_token_confirmation.tsx
index 8c5ba7e6f..294fb8590 100644
--- a/packages/website/ts/components/track_token_confirmation.tsx
+++ b/packages/website/ts/components/track_token_confirmation.tsx
@@ -15,7 +15,7 @@ interface TrackTokenConfirmationProps {
interface TrackTokenConfirmationState {}
export class TrackTokenConfirmation extends React.Component<TrackTokenConfirmationProps, TrackTokenConfirmationState> {
- public render() {
+ public render(): React.ReactNode {
const isMultipleTokens = this.props.tokens.length > 1;
const allTokens = _.values(this.props.tokenByAddress);
return (
diff --git a/packages/website/ts/components/trade_history/trade_history.tsx b/packages/website/ts/components/trade_history/trade_history.tsx
index 635358627..84c0f70a8 100644
--- a/packages/website/ts/components/trade_history/trade_history.tsx
+++ b/packages/website/ts/components/trade_history/trade_history.tsx
@@ -13,6 +13,9 @@ interface TradeHistoryProps {
tokenByAddress: TokenByAddress;
userAddress: string;
networkId: number;
+ isFullWidth?: boolean;
+ shouldHideHeader?: boolean;
+ isScrollable?: boolean;
}
interface TradeHistoryState {
@@ -20,6 +23,11 @@ interface TradeHistoryState {
}
export class TradeHistory extends React.Component<TradeHistoryProps, TradeHistoryState> {
+ public static defaultProps: Partial<TradeHistoryProps> = {
+ isFullWidth: false,
+ shouldHideHeader: false,
+ isScrollable: true,
+ };
private _fillPollingIntervalId: number;
public constructor(props: TradeHistoryProps) {
super(props);
@@ -28,27 +36,36 @@ export class TradeHistory extends React.Component<TradeHistoryProps, TradeHistor
sortedFills,
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
this._startPollingForFills();
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._stopPollingForFills();
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public render() {
+ public render(): React.ReactNode {
+ const rootClassName = !this.props.isFullWidth ? 'lg-px4 md-px4 sm-px2' : undefined;
return (
- <div className="lg-px4 md-px4 sm-px2">
- <h3>Trade history</h3>
- <Divider />
- <div className="pt2" style={{ height: 608, overflow: 'scroll' }}>
- {this._renderTrades()}
- </div>
+ <div className={rootClassName}>
+ {!this.props.shouldHideHeader && (
+ <div>
+ <h3>Trade history</h3>
+ <Divider />
+ </div>
+ )}
+ {this.props.isScrollable ? (
+ <div className="pt2" style={{ height: 608, overflow: 'scroll' }}>
+ {this._renderTrades()}
+ </div>
+ ) : (
+ this._renderTrades()
+ )}
</div>
);
}
- private _renderTrades() {
+ private _renderTrades(): React.ReactNode {
const numNonCustomFills = this._numFillsWithoutCustomERC20Tokens();
if (numNonCustomFills === 0) {
return this._renderEmptyNotice();
@@ -66,14 +83,14 @@ export class TradeHistory extends React.Component<TradeHistoryProps, TradeHistor
);
});
}
- private _renderEmptyNotice() {
+ private _renderEmptyNotice(): React.ReactNode {
return (
<Paper className="mt1 p2 mx-auto center" style={{ width: '80%' }}>
No filled orders yet.
</Paper>
);
}
- private _numFillsWithoutCustomERC20Tokens() {
+ private _numFillsWithoutCustomERC20Tokens(): number {
let numNonCustomFills = 0;
const tokens = _.values(this.props.tokenByAddress);
_.each(this.state.sortedFills, fill => {
@@ -93,7 +110,7 @@ export class TradeHistory extends React.Component<TradeHistoryProps, TradeHistor
});
return numNonCustomFills;
}
- private _startPollingForFills() {
+ private _startPollingForFills(): void {
this._fillPollingIntervalId = window.setInterval(() => {
const sortedFills = this._getSortedFills();
if (!utils.deepEqual(sortedFills, this.state.sortedFills)) {
@@ -103,10 +120,10 @@ export class TradeHistory extends React.Component<TradeHistoryProps, TradeHistor
}
}, FILL_POLLING_INTERVAL);
}
- private _stopPollingForFills() {
+ private _stopPollingForFills(): void {
clearInterval(this._fillPollingIntervalId);
}
- private _getSortedFills() {
+ private _getSortedFills(): Fill[] {
const fillsByHash = tradeHistoryStorage.getUserFillsByHash(this.props.userAddress, this.props.networkId);
const fills = _.values(fillsByHash);
const sortedFills = _.sortBy(fills, [(fill: Fill) => fill.blockTimestamp * -1]);
diff --git a/packages/website/ts/components/trade_history/trade_history_item.tsx b/packages/website/ts/components/trade_history/trade_history_item.tsx
index dbe72259b..321a8b0e1 100644
--- a/packages/website/ts/components/trade_history/trade_history_item.tsx
+++ b/packages/website/ts/components/trade_history/trade_history_item.tsx
@@ -1,6 +1,6 @@
-import { ZeroEx } from '0x.js';
import { colors, EtherscanLinkSuffixes } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import Paper from 'material-ui/Paper';
import * as moment from 'moment';
@@ -23,7 +23,7 @@ interface TradeHistoryItemProps {
interface TradeHistoryItemState {}
export class TradeHistoryItem extends React.Component<TradeHistoryItemProps, TradeHistoryItemState> {
- public render() {
+ public render(): React.ReactNode {
const fill = this.props.fill;
const tokens = _.values(this.props.tokenByAddress);
const takerToken = _.find(tokens, token => {
@@ -88,12 +88,18 @@ export class TradeHistoryItem extends React.Component<TradeHistoryItemProps, Tra
</Paper>
);
}
- private _renderAmounts(makerToken: Token, takerToken: Token) {
+ private _renderAmounts(makerToken: Token, takerToken: Token): React.ReactNode {
const fill = this.props.fill;
- const filledTakerTokenAmountInUnits = ZeroEx.toUnitAmount(fill.filledTakerTokenAmount, takerToken.decimals);
- const filledMakerTokenAmountInUnits = ZeroEx.toUnitAmount(fill.filledMakerTokenAmount, takerToken.decimals);
+ const filledTakerTokenAmountInUnits = Web3Wrapper.toUnitAmount(
+ fill.filledTakerTokenAmount,
+ takerToken.decimals,
+ );
+ const filledMakerTokenAmountInUnits = Web3Wrapper.toUnitAmount(
+ fill.filledMakerTokenAmount,
+ takerToken.decimals,
+ );
let exchangeRate = filledTakerTokenAmountInUnits.div(filledMakerTokenAmountInUnits);
- const fillMakerTokenAmount = ZeroEx.toBaseUnitAmount(filledMakerTokenAmountInUnits, makerToken.decimals);
+ const fillMakerTokenAmount = Web3Wrapper.toBaseUnitAmount(filledMakerTokenAmountInUnits, makerToken.decimals);
let receiveAmount;
let receiveToken;
@@ -136,7 +142,7 @@ export class TradeHistoryItem extends React.Component<TradeHistoryItemProps, Tra
</div>
);
}
- private _renderDate() {
+ private _renderDate(): React.ReactNode {
const blockMoment = moment.unix(this.props.fill.blockTimestamp);
if (!blockMoment.isValid()) {
return null;
@@ -159,8 +165,8 @@ export class TradeHistoryItem extends React.Component<TradeHistoryItemProps, Tra
</div>
);
}
- private _renderAmount(amount: BigNumber, symbol: string, decimals: number) {
- const unitAmount = ZeroEx.toUnitAmount(amount, decimals);
+ private _renderAmount(amount: BigNumber, symbol: string, decimals: number): React.ReactNode {
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
return (
<span>
{unitAmount.toFixed(configs.AMOUNT_DISPLAY_PRECSION)} {symbol}
diff --git a/packages/website/ts/components/ui/account_connection.tsx b/packages/website/ts/components/ui/account_connection.tsx
new file mode 100644
index 000000000..6d0b90922
--- /dev/null
+++ b/packages/website/ts/components/ui/account_connection.tsx
@@ -0,0 +1,40 @@
+import * as React from 'react';
+
+import { Circle } from 'ts/components/ui/circle';
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { AccountState } from 'ts/types';
+
+export interface AccountConnectionProps {
+ accountState: AccountState;
+ injectedProviderName: string;
+}
+
+export const AccountConnection: React.StatelessComponent<AccountConnectionProps> = ({
+ accountState,
+ injectedProviderName,
+}) => {
+ return (
+ <Container className="flex items-center">
+ <Circle diameter={6} fillColor={getInjectedProviderColor(accountState)} />
+ <Container marginLeft="6px">
+ <Text fontSize="12px" lineHeight="14px" fontColor={colors.darkGrey}>
+ {injectedProviderName}
+ </Text>
+ </Container>
+ </Container>
+ );
+};
+
+const getInjectedProviderColor = (accountState: AccountState) => {
+ switch (accountState) {
+ case AccountState.Ready:
+ return colors.limeGreen;
+ case AccountState.Locked:
+ case AccountState.Loading:
+ case AccountState.Disconnected:
+ default:
+ return colors.red;
+ }
+};
diff --git a/packages/website/ts/components/ui/alert.tsx b/packages/website/ts/components/ui/alert.tsx
index f81939255..b571d8c1c 100644
--- a/packages/website/ts/components/ui/alert.tsx
+++ b/packages/website/ts/components/ui/alert.tsx
@@ -7,7 +7,7 @@ interface AlertProps {
message: string | React.ReactNode;
}
-export function Alert(props: AlertProps) {
+export const Alert = (props: AlertProps) => {
const isAlert = props.type === AlertTypes.ERROR;
const errMsgStyles = {
background: isAlert ? colors.red200 : colors.lightestGreen,
@@ -22,4 +22,4 @@ export function Alert(props: AlertProps) {
{props.message}
</div>
);
-}
+};
diff --git a/packages/website/ts/components/ui/allowance_state_view.tsx b/packages/website/ts/components/ui/allowance_state_view.tsx
new file mode 100644
index 000000000..93d6b0ebb
--- /dev/null
+++ b/packages/website/ts/components/ui/allowance_state_view.tsx
@@ -0,0 +1,51 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Spinner } from 'ts/components/ui/spinner';
+
+export enum AllowanceState {
+ Locked,
+ Unlocked,
+ Loading,
+}
+
+export interface AllowanceStateViewProps {
+ allowanceState: AllowanceState;
+}
+
+export const AllowanceStateView: React.StatelessComponent<AllowanceStateViewProps> = ({ allowanceState }) => {
+ switch (allowanceState) {
+ case AllowanceState.Locked:
+ return renderLock();
+ case AllowanceState.Unlocked:
+ return renderCheck();
+ case AllowanceState.Loading:
+ return (
+ <Container position="relative" top="3px" left="5px">
+ <Spinner size={18} strokeSize={2} />
+ </Container>
+ );
+ default:
+ return null;
+ }
+};
+
+const renderCheck = (color: string = colors.lightGreen) => (
+ <svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="8.5" cy="8.5" r="8.5" fill={color} />
+ <path
+ d="M2.5 4.5L1.79289 5.20711L2.5 5.91421L3.20711 5.20711L2.5 4.5ZM-0.707107 2.70711L1.79289 5.20711L3.20711 3.79289L0.707107 1.29289L-0.707107 2.70711ZM3.20711 5.20711L7.70711 0.707107L6.29289 -0.707107L1.79289 3.79289L3.20711 5.20711Z"
+ transform="translate(5 6.5)"
+ fill="white"
+ />
+ </svg>
+);
+
+const renderLock = () => (
+ <svg width="12" height="15" viewBox="0 0 12 15" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path
+ d="M6 0C3.51604 0 1.48688 2.0495 1.48688 4.55837V5.86581C0.664723 5.86581 -3.33647e-08 6.53719 -3.33647e-08 7.36759V13.3217C-3.33647e-08 14.1521 0.664723 14.8235 1.48688 14.8235H10.5131C11.3353 14.8235 12 14.1521 12 13.3217V7.36759C12 6.53719 11.3353 5.86581 10.5131 5.86581V4.55837C10.5131 2.0495 8.48396 0 6 0ZM8.93878 5.86581H3.06122V4.55837C3.06122 2.9329 4.37318 1.59013 6 1.59013C7.62682 1.59013 8.93878 2.9329 8.93878 4.55837V5.86581Z"
+ fill="black"
+ />
+ </svg>
+);
diff --git a/packages/website/ts/components/ui/animation.tsx b/packages/website/ts/components/ui/animation.tsx
new file mode 100644
index 000000000..943e3bf28
--- /dev/null
+++ b/packages/website/ts/components/ui/animation.tsx
@@ -0,0 +1,42 @@
+import * as React from 'react';
+import { keyframes, styled } from 'ts/style/theme';
+
+export type AnimationType = 'easeUpFromBottom';
+
+export interface AnimationProps {
+ type: AnimationType;
+}
+
+const PlainAnimation: React.StatelessComponent<AnimationProps> = props => <div {...props} />;
+
+const appearFromBottomFrames = keyframes`
+ from {
+ position: fixed;
+ bottom: -500px;
+ left: 0px;
+ right: 0px;
+ }
+
+ to {
+ position: fixed;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ }
+`;
+
+const stylesForAnimation: { [K in AnimationType]: string } = {
+ // Needed for safari
+ easeUpFromBottom: `position: fixed`,
+};
+
+const animations: { [K in AnimationType]: string } = {
+ easeUpFromBottom: `${appearFromBottomFrames} 1s ease 0s 1 forwards`,
+};
+
+export const Animation = styled(PlainAnimation)`
+ animation: ${props => animations[props.type]};
+ ${props => stylesForAnimation[props.type]};
+`;
+
+Animation.displayName = 'Animation';
diff --git a/packages/website/ts/components/ui/balance.tsx b/packages/website/ts/components/ui/balance.tsx
new file mode 100644
index 000000000..9e5a256b6
--- /dev/null
+++ b/packages/website/ts/components/ui/balance.tsx
@@ -0,0 +1,27 @@
+import { BigNumber } from '@0xproject/utils';
+import * as React from 'react';
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+import { utils } from 'ts/utils/utils';
+
+export interface BalanceProps {
+ amount: BigNumber;
+ decimals: number;
+ symbol: string;
+}
+
+export const Balance: React.StatelessComponent<BalanceProps> = ({ amount, decimals, symbol }) => {
+ const formattedAmout = utils.getFormattedAmount(amount, decimals);
+ return (
+ <span>
+ <Text Tag="span" fontSize="16px" fontWeight="700" lineHeight="1em">
+ {formattedAmout}
+ </Text>
+ <Container marginLeft="0.3em" Tag="span">
+ <Text Tag="span" fontSize="12px" fontWeight="700" lineHeight="1em">
+ {symbol}
+ </Text>
+ </Container>
+ </span>
+ );
+};
diff --git a/packages/website/ts/components/ui/button.tsx b/packages/website/ts/components/ui/button.tsx
new file mode 100644
index 000000000..2952c8859
--- /dev/null
+++ b/packages/website/ts/components/ui/button.tsx
@@ -0,0 +1,99 @@
+import { colors } from '@0xproject/react-shared';
+import { darken, saturate } from 'polished';
+import * as React from 'react';
+import { styled } from 'ts/style/theme';
+
+export interface ButtonProps {
+ className?: string;
+ fontSize?: string;
+ fontColor?: string;
+ fontFamily?: string;
+ backgroundColor?: string;
+ borderColor?: string;
+ width?: string;
+ padding?: string;
+ type?: string;
+ isDisabled?: boolean;
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
+}
+
+const PlainButton: React.StatelessComponent<ButtonProps> = ({ children, isDisabled, onClick, type, className }) => (
+ <button type={type} className={className} onClick={isDisabled ? undefined : onClick} disabled={isDisabled}>
+ {children}
+ </button>
+);
+
+export const Button = styled(PlainButton)`
+ cursor: ${props => (props.isDisabled ? 'default' : 'pointer')};
+ font-size: ${props => props.fontSize};
+ color: ${props => props.fontColor};
+ transition: background-color, opacity 0.5s ease;
+ padding: ${props => props.padding};
+ border-radius: 6px;
+ font-weight: 500;
+ outline: none;
+ font-family: ${props => props.fontFamily};
+ width: ${props => props.width};
+ background-color: ${props => props.backgroundColor};
+ border: ${props => (props.borderColor ? `1px solid ${props.borderColor}` : 'none')};
+ &:hover {
+ background-color: ${props => (!props.isDisabled ? darken(0.1, props.backgroundColor) : '')} !important;
+ }
+ &:active {
+ background-color: ${props => (!props.isDisabled ? darken(0.2, props.backgroundColor) : '')};
+ }
+ &:disabled {
+ opacity: 0.5;
+ }
+ &:focus {
+ background-color: ${props => saturate(0.2, props.backgroundColor)};
+ }
+`;
+
+Button.defaultProps = {
+ fontSize: '12px',
+ backgroundColor: colors.white,
+ width: 'auto',
+ fontFamily: 'Roboto',
+ isDisabled: false,
+ padding: '0.8em 2.2em',
+};
+
+Button.displayName = 'Button';
+
+type CallToActionType = 'light' | 'dark';
+
+export interface CallToActionProps {
+ type?: CallToActionType;
+ fontSize?: string;
+ width?: string;
+ padding?: string;
+}
+
+export const CallToAction: React.StatelessComponent<CallToActionProps> = ({
+ children,
+ type,
+ fontSize,
+ padding,
+ width,
+}) => {
+ const isLight = type === 'light';
+ const backgroundColor = isLight ? colors.white : colors.mediumBlue;
+ const fontColor = isLight ? colors.heroGrey : colors.white;
+ return (
+ <Button
+ fontSize={fontSize}
+ padding={padding}
+ backgroundColor={backgroundColor}
+ fontColor={fontColor}
+ width={width}
+ >
+ {children}
+ </Button>
+ );
+};
+
+CallToAction.defaultProps = {
+ type: 'dark',
+ fontSize: '14px',
+};
diff --git a/packages/website/ts/components/ui/circle.tsx b/packages/website/ts/components/ui/circle.tsx
new file mode 100644
index 000000000..75103d066
--- /dev/null
+++ b/packages/website/ts/components/ui/circle.tsx
@@ -0,0 +1,16 @@
+import * as React from 'react';
+
+export interface CircleProps {
+ className?: string;
+ diameter: number;
+ fillColor: string;
+}
+
+export const Circle: React.StatelessComponent<CircleProps> = ({ className, diameter, fillColor }) => {
+ const radius = diameter / 2;
+ return (
+ <svg className={className} height={diameter} width={diameter}>
+ <circle cx={radius} cy={radius} r={radius} fill={fillColor} />
+ </svg>
+ );
+};
diff --git a/packages/website/ts/components/ui/container.tsx b/packages/website/ts/components/ui/container.tsx
new file mode 100644
index 000000000..f2ae68b70
--- /dev/null
+++ b/packages/website/ts/components/ui/container.tsx
@@ -0,0 +1,55 @@
+import * as React from 'react';
+
+type StringOrNum = string | number;
+
+export type ContainerTag = 'div' | 'span';
+
+export interface ContainerProps {
+ marginTop?: StringOrNum;
+ marginBottom?: StringOrNum;
+ marginRight?: StringOrNum;
+ marginLeft?: StringOrNum;
+ padding?: StringOrNum;
+ paddingTop?: StringOrNum;
+ paddingBottom?: StringOrNum;
+ paddingRight?: StringOrNum;
+ paddingLeft?: StringOrNum;
+ backgroundColor?: string;
+ borderRadius?: StringOrNum;
+ maxWidth?: StringOrNum;
+ maxHeight?: StringOrNum;
+ width?: StringOrNum;
+ height?: StringOrNum;
+ minWidth?: StringOrNum;
+ minHeight?: StringOrNum;
+ isHidden?: boolean;
+ className?: string;
+ position?: 'absolute' | 'fixed' | 'relative' | 'unset';
+ display?: 'inline-block' | 'block' | 'inline-flex' | 'inline';
+ top?: string;
+ left?: string;
+ right?: string;
+ bottom?: string;
+ zIndex?: number;
+ Tag?: ContainerTag;
+ cursor?: string;
+ id?: string;
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
+ overflowX?: 'scroll' | 'hidden' | 'auto' | 'visible';
+}
+
+export const Container: React.StatelessComponent<ContainerProps> = props => {
+ const { children, className, Tag, isHidden, id, onClick, ...style } = props;
+ const visibility = isHidden ? 'hidden' : undefined;
+ return (
+ <Tag id={id} style={{ ...style, visibility }} className={className} onClick={onClick}>
+ {children}
+ </Tag>
+ );
+};
+
+Container.defaultProps = {
+ Tag: 'div',
+};
+
+Container.displayName = 'Container';
diff --git a/packages/website/ts/components/ui/copy_icon.tsx b/packages/website/ts/components/ui/copy_icon.tsx
index d58e50815..0330d1843 100644
--- a/packages/website/ts/components/ui/copy_icon.tsx
+++ b/packages/website/ts/components/ui/copy_icon.tsx
@@ -1,5 +1,4 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
import * as CopyToClipboard from 'react-copy-to-clipboard';
import * as ReactDOM from 'react-dom';
@@ -23,14 +22,14 @@ export class CopyIcon extends React.Component<CopyIconProps, CopyIconState> {
isHovering: false,
};
}
- public componentDidUpdate() {
+ public componentDidUpdate(): void {
// Remove tooltip if hover away
if (!this.state.isHovering && this._copyTooltipTimeoutId) {
clearInterval(this._copyTooltipTimeoutId);
this._hideTooltip();
}
}
- public render() {
+ public render(): React.ReactNode {
return (
<div className="inline-block">
<CopyToClipboard text={this.props.data} onCopy={this._onCopy.bind(this)}>
@@ -55,15 +54,15 @@ export class CopyIcon extends React.Component<CopyIconProps, CopyIconState> {
</div>
);
}
- private _setRefToProperty(el: HTMLInputElement) {
+ private _setRefToProperty(el: HTMLInputElement): void {
this._copyable = el;
}
- private _setHoverState(isHovering: boolean) {
+ private _setHoverState(isHovering: boolean): void {
this.setState({
isHovering,
});
}
- private _onCopy() {
+ private _onCopy(): void {
if (this._copyTooltipTimeoutId) {
clearInterval(this._copyTooltipTimeoutId);
}
@@ -73,7 +72,7 @@ export class CopyIcon extends React.Component<CopyIconProps, CopyIconState> {
this._hideTooltip();
}, tooltipLifespanMs);
}
- private _hideTooltip() {
+ private _hideTooltip(): void {
ReactTooltip.hide(ReactDOM.findDOMNode(this._copyable));
}
}
diff --git a/packages/website/ts/components/ui/drop_down.tsx b/packages/website/ts/components/ui/drop_down.tsx
index 63b9eec0b..4d5caef08 100644
--- a/packages/website/ts/components/ui/drop_down.tsx
+++ b/packages/website/ts/components/ui/drop_down.tsx
@@ -1,5 +1,4 @@
-import * as _ from 'lodash';
-import Popover, { PopoverAnimationVertical } from 'material-ui/Popover';
+import Popover from 'material-ui/Popover';
import * as React from 'react';
import { MaterialUIPosition } from 'ts/types';
@@ -8,13 +7,20 @@ const DEFAULT_STYLE = {
fontSize: 14,
};
-interface DropDownProps {
- hoverActiveNode: React.ReactNode;
+export enum DropdownMouseEvent {
+ Hover = 'hover',
+ Click = 'click',
+}
+
+export interface DropDownProps {
+ activeNode: React.ReactNode;
popoverContent: React.ReactNode;
anchorOrigin: MaterialUIPosition;
targetOrigin: MaterialUIPosition;
style?: React.CSSProperties;
zDepth?: number;
+ activateEvent?: DropdownMouseEvent;
+ closeEvent?: DropdownMouseEvent;
}
interface DropDownState {
@@ -26,6 +32,8 @@ export class DropDown extends React.Component<DropDownProps, DropDownState> {
public static defaultProps: Partial<DropDownProps> = {
style: DEFAULT_STYLE,
zDepth: 1,
+ activateEvent: DropdownMouseEvent.Hover,
+ closeEvent: DropdownMouseEvent.Hover,
};
private _isHovering: boolean;
private _popoverCloseCheckIntervalId: number;
@@ -35,15 +43,15 @@ export class DropDown extends React.Component<DropDownProps, DropDownState> {
isDropDownOpen: false,
};
}
- public componentDidMount() {
+ public componentDidMount(): void {
this._popoverCloseCheckIntervalId = window.setInterval(() => {
this._checkIfShouldClosePopover();
}, CHECK_CLOSE_POPOVER_INTERVAL_MS);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
window.clearInterval(this._popoverCloseCheckIntervalId);
}
- public componentWillReceiveProps(nextProps: DropDownProps) {
+ public componentWillReceiveProps(_nextProps: DropDownProps): void {
// HACK: If the popoverContent is updated to a different dimension and the users
// mouse is no longer above it, the dropdown can enter an inconsistent state where
// it believes the user is still hovering over it. In order to remedy this, we
@@ -52,55 +60,70 @@ export class DropDown extends React.Component<DropDownProps, DropDownState> {
// dropdowns from having dynamic content.
this._onHoverOff();
}
- public render() {
+ public render(): React.ReactNode {
return (
<div
style={{ ...this.props.style, width: 'fit-content', height: '100%' }}
onMouseEnter={this._onHover.bind(this)}
onMouseLeave={this._onHoverOff.bind(this)}
>
- {this.props.hoverActiveNode}
+ <div onClick={this._onActiveNodeClick.bind(this)}>{this.props.activeNode}</div>
<Popover
open={this.state.isDropDownOpen}
anchorEl={this.state.anchorEl}
anchorOrigin={this.props.anchorOrigin}
targetOrigin={this.props.targetOrigin}
onRequestClose={this._closePopover.bind(this)}
- useLayerForClickAway={false}
- animation={PopoverAnimationVertical}
+ useLayerForClickAway={this.props.closeEvent === DropdownMouseEvent.Click}
+ animated={false}
zDepth={this.props.zDepth}
>
- <div onMouseEnter={this._onHover.bind(this)} onMouseLeave={this._onHoverOff.bind(this)}>
+ <div
+ onMouseEnter={this._onHover.bind(this)}
+ onMouseLeave={this._onHoverOff.bind(this)}
+ onClick={this._closePopover.bind(this)}
+ >
{this.props.popoverContent}
</div>
</Popover>
</div>
);
}
- private _onHover(event: React.FormEvent<HTMLInputElement>) {
+ private _onActiveNodeClick(event: React.FormEvent<HTMLInputElement>): void {
+ if (this.props.activateEvent === DropdownMouseEvent.Click) {
+ this.setState({
+ isDropDownOpen: true,
+ anchorEl: event.currentTarget,
+ });
+ }
+ }
+ private _onHover(event: React.FormEvent<HTMLInputElement>): void {
this._isHovering = true;
- this._checkIfShouldOpenPopover(event);
+ if (this.props.activateEvent === DropdownMouseEvent.Hover) {
+ this._checkIfShouldOpenPopover(event);
+ }
}
- private _checkIfShouldOpenPopover(event: React.FormEvent<HTMLInputElement>) {
+ private _onHoverOff(): void {
+ this._isHovering = false;
+ }
+ private _checkIfShouldOpenPopover(event: React.FormEvent<HTMLInputElement>): void {
if (this.state.isDropDownOpen) {
return; // noop
}
-
this.setState({
isDropDownOpen: true,
anchorEl: event.currentTarget,
});
}
- private _onHoverOff() {
- this._isHovering = false;
- }
- private _checkIfShouldClosePopover() {
- if (!this.state.isDropDownOpen || this._isHovering) {
+ private _checkIfShouldClosePopover(): void {
+ if (!this.state.isDropDownOpen) {
return; // noop
}
- this._closePopover();
+ if (this.props.closeEvent === DropdownMouseEvent.Hover && !this._isHovering) {
+ this._closePopover();
+ }
}
- private _closePopover() {
+ private _closePopover(): void {
this.setState({
isDropDownOpen: false,
});
diff --git a/packages/website/ts/components/ui/etherscan_icon.tsx b/packages/website/ts/components/ui/etherscan_icon.tsx
index c1154d3d6..0beb69123 100644
--- a/packages/website/ts/components/ui/etherscan_icon.tsx
+++ b/packages/website/ts/components/ui/etherscan_icon.tsx
@@ -2,7 +2,6 @@ import { colors, EtherscanLinkSuffixes, utils as sharedUtils } from '@0xproject/
import * as _ from 'lodash';
import * as React from 'react';
import ReactTooltip = require('react-tooltip');
-import { utils } from 'ts/utils/utils';
interface EtherScanIconProps {
addressOrTxHash: string;
@@ -35,6 +34,6 @@ export const EtherScanIcon = (props: EtherScanIconProps) => {
);
};
-function renderIcon() {
+function renderIcon(): React.ReactNode {
return <i style={{ color: colors.amber600 }} className="zmdi zmdi-open-in-new" />;
}
diff --git a/packages/website/ts/components/ui/fake_text_field.tsx b/packages/website/ts/components/ui/fake_text_field.tsx
index 646ae98f6..ac3c30fec 100644
--- a/packages/website/ts/components/ui/fake_text_field.tsx
+++ b/packages/website/ts/components/ui/fake_text_field.tsx
@@ -21,7 +21,7 @@ interface FakeTextFieldProps {
children?: any;
}
-export function FakeTextField(props: FakeTextFieldProps) {
+export const FakeTextField = (props: FakeTextFieldProps) => {
return (
<div className="relative">
{props.label !== '' && <InputLabel text={props.label} />}
@@ -31,4 +31,4 @@ export function FakeTextField(props: FakeTextFieldProps) {
<hr style={styles.hr} />
</div>
);
-}
+};
diff --git a/packages/website/ts/components/ui/filled_image.tsx b/packages/website/ts/components/ui/filled_image.tsx
new file mode 100644
index 000000000..7f58ee5b9
--- /dev/null
+++ b/packages/website/ts/components/ui/filled_image.tsx
@@ -0,0 +1,18 @@
+import * as React from 'react';
+
+export interface FilledImageProps {
+ src: string;
+}
+export const FilledImage = (props: FilledImageProps) => (
+ <div
+ style={{
+ width: '100%',
+ height: '100%',
+ objectFit: 'cover',
+ backgroundImage: `url(${props.src})`,
+ backgroundRepeat: 'no-repeat',
+ backgroundPosition: 'center',
+ backgroundSize: 'cover',
+ }}
+ />
+);
diff --git a/packages/website/ts/components/ui/flash_message.tsx b/packages/website/ts/components/ui/flash_message.tsx
index 2cb1fc764..2b866676d 100644
--- a/packages/website/ts/components/ui/flash_message.tsx
+++ b/packages/website/ts/components/ui/flash_message.tsx
@@ -19,7 +19,7 @@ export class FlashMessage extends React.Component<FlashMessageProps, FlashMessag
showDurationMs: SHOW_DURATION_MS,
bodyStyle: {},
};
- public render() {
+ public render(): React.ReactNode {
if (!_.isUndefined(this.props.flashMessage)) {
return (
<Snackbar
@@ -34,7 +34,7 @@ export class FlashMessage extends React.Component<FlashMessageProps, FlashMessag
return null;
}
}
- private _onClose() {
+ private _onClose(): void {
this.props.dispatcher.hideFlashMessage();
}
}
diff --git a/packages/website/ts/components/ui/icon_button.tsx b/packages/website/ts/components/ui/icon_button.tsx
new file mode 100644
index 000000000..13cd239da
--- /dev/null
+++ b/packages/website/ts/components/ui/icon_button.tsx
@@ -0,0 +1,64 @@
+import { colors, Styles } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+
+export interface IconButtonProps {
+ iconName: string;
+ labelText?: string;
+ onClick?: () => void;
+ color?: string;
+ display?: string;
+}
+interface IconButtonState {
+ isHovering: boolean;
+}
+export class IconButton extends React.Component<IconButtonProps, IconButtonState> {
+ public static defaultProps: Partial<IconButtonProps> = {
+ labelText: '',
+ color: colors.mediumBlue,
+ };
+ public constructor(props: IconButtonProps) {
+ super(props);
+ this.state = {
+ isHovering: false,
+ };
+ }
+ public render(): React.ReactNode {
+ const styles: Styles = {
+ root: {
+ cursor: this.props.onClick ? 'pointer' : 'undefined',
+ opacity: this.state.isHovering && this.props.onClick ? 0.5 : 1,
+ display: this.props.display,
+ },
+ icon: {
+ color: this.props.color,
+ fontSize: 20,
+ },
+ label: {
+ color: this.props.color,
+ fontSize: 10,
+ },
+ };
+ return (
+ <div
+ className="flex items-center py2"
+ onClick={this.props.onClick}
+ onMouseEnter={this._onToggleHover.bind(this, true)}
+ onMouseLeave={this._onToggleHover.bind(this, false)}
+ style={styles.root}
+ >
+ <i style={styles.icon} className={`zmdi ${this.props.iconName}`} />
+ {!_.isEmpty(this.props.labelText) && (
+ <div className="pl1" style={styles.label}>
+ {this.props.labelText}
+ </div>
+ )}
+ </div>
+ );
+ }
+ private _onToggleHover(isHovering: boolean): void {
+ this.setState({
+ isHovering,
+ });
+ }
+}
diff --git a/packages/website/ts/components/ui/identicon.tsx b/packages/website/ts/components/ui/identicon.tsx
index bad6c2a78..b5b374973 100644
--- a/packages/website/ts/components/ui/identicon.tsx
+++ b/packages/website/ts/components/ui/identicon.tsx
@@ -1,7 +1,10 @@
import blockies = require('blockies');
import * as _ from 'lodash';
import * as React from 'react';
-import { constants } from 'ts/utils/constants';
+
+import { Circle } from 'ts/components/ui/circle';
+import { Image } from 'ts/components/ui/image';
+import { colors } from 'ts/style/colors';
interface IdenticonProps {
address: string;
@@ -15,18 +18,12 @@ export class Identicon extends React.Component<IdenticonProps, IdenticonState> {
public static defaultProps: Partial<IdenticonProps> = {
style: {},
};
- public render() {
- let address = this.props.address;
- if (_.isEmpty(address)) {
- address = constants.NULL_ADDRESS;
- }
+ public render(): React.ReactNode {
+ const address = this.props.address;
const diameter = this.props.diameter;
- const icon = blockies({
- seed: address.toLowerCase(),
- });
return (
<div
- className="circle mx-auto relative transitionFix"
+ className="circle relative transitionFix"
style={{
width: diameter,
height: diameter,
@@ -34,14 +31,17 @@ export class Identicon extends React.Component<IdenticonProps, IdenticonState> {
...this.props.style,
}}
>
- <img
- src={icon.toDataURL()}
- style={{
- width: diameter,
- height: diameter,
- imageRendering: 'pixelated',
- }}
- />
+ {!_.isEmpty(address) ? (
+ <Image
+ src={blockies({
+ seed: address.toLowerCase(),
+ }).toDataURL()}
+ height={diameter}
+ width={diameter}
+ />
+ ) : (
+ <Circle diameter={diameter} fillColor={colors.grey200} />
+ )}
</div>
);
}
diff --git a/packages/website/ts/components/ui/image.tsx b/packages/website/ts/components/ui/image.tsx
new file mode 100644
index 000000000..c8d39352b
--- /dev/null
+++ b/packages/website/ts/components/ui/image.tsx
@@ -0,0 +1,47 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+export interface ImageProps {
+ className?: string;
+ src?: string;
+ fallbackSrc?: string;
+ borderRadius?: string;
+ width?: string | number;
+ height?: string | number;
+ maxWidth?: string | number;
+ maxHeight?: string | number;
+}
+interface ImageState {
+ imageLoadFailed: boolean;
+}
+export class Image extends React.Component<ImageProps, ImageState> {
+ constructor(props: ImageProps) {
+ super(props);
+ this.state = {
+ imageLoadFailed: false,
+ };
+ }
+ public render(): React.ReactNode {
+ const src =
+ this.state.imageLoadFailed || _.isUndefined(this.props.src) ? this.props.fallbackSrc : this.props.src;
+ return (
+ <img
+ className={this.props.className}
+ onError={this._onError.bind(this)}
+ src={src}
+ style={{
+ borderRadius: this.props.borderRadius,
+ maxWidth: this.props.maxWidth,
+ maxHeight: this.props.maxHeight,
+ }}
+ height={this.props.height}
+ width={this.props.width}
+ />
+ );
+ }
+ private _onError(): void {
+ this.setState({
+ imageLoadFailed: true,
+ });
+ }
+}
diff --git a/packages/website/ts/components/ui/input.tsx b/packages/website/ts/components/ui/input.tsx
new file mode 100644
index 000000000..e01a71a53
--- /dev/null
+++ b/packages/website/ts/components/ui/input.tsx
@@ -0,0 +1,43 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+import { styled } from 'ts/style/theme';
+
+export interface InputProps {
+ className?: string;
+ value?: string;
+ width?: string;
+ fontSize?: string;
+ fontColor?: string;
+ placeholderColor?: string;
+ placeholder?: string;
+ backgroundColor?: string;
+ onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
+}
+
+const PlainInput: React.StatelessComponent<InputProps> = ({ value, className, placeholder, onChange }) => (
+ <input className={className} value={value} onChange={onChange} placeholder={placeholder} />
+);
+
+export const Input = styled(PlainInput)`
+ font-size: ${props => props.fontSize};
+ width: ${props => props.width};
+ padding: 0.8em 1.2em;
+ border-radius: 3px;
+ font-family: 'Roboto Mono';
+ color: ${props => props.fontColor};
+ border: none;
+ background-color: ${props => props.backgroundColor};
+ &::placeholder {
+ color: ${props => props.placeholderColor};
+ }
+`;
+
+Input.defaultProps = {
+ width: 'auto',
+ backgroundColor: colors.white,
+ fontColor: colors.darkestGrey,
+ placeholderColor: colors.darkGrey,
+ fontSize: '12px',
+};
+
+Input.displayName = 'Input';
diff --git a/packages/website/ts/components/ui/input_label.tsx b/packages/website/ts/components/ui/input_label.tsx
index 6a3f26155..8eda45a5d 100644
--- a/packages/website/ts/components/ui/input_label.tsx
+++ b/packages/website/ts/components/ui/input_label.tsx
@@ -1,11 +1,11 @@
-import { colors } from '@0xproject/react-shared';
+import { colors, Styles } from '@0xproject/react-shared';
import * as React from 'react';
export interface InputLabelProps {
text: string | Element | React.ReactNode;
}
-const styles = {
+const styles: Styles = {
label: {
color: colors.grey,
fontSize: 12,
@@ -17,7 +17,7 @@ const styles = {
userSelect: 'none',
width: 240,
zIndex: 1,
- },
+ } as React.CSSProperties,
};
export const InputLabel = (props: InputLabelProps) => {
diff --git a/packages/website/ts/components/ui/island.tsx b/packages/website/ts/components/ui/island.tsx
new file mode 100644
index 000000000..c8abfb7e0
--- /dev/null
+++ b/packages/website/ts/components/ui/island.tsx
@@ -0,0 +1,29 @@
+import * as React from 'react';
+import { colors } from 'ts/style/colors';
+import { styled } from 'ts/style/theme';
+
+export interface IslandProps {
+ style?: React.CSSProperties;
+ className?: string;
+ Component?: string | React.ComponentClass<any> | React.StatelessComponent<any>;
+ borderRadius?: string;
+}
+
+const PlainIsland: React.StatelessComponent<IslandProps> = ({ Component, style, className, children }) => (
+ <Component style={style} className={className} children={children} />
+);
+
+export const Island = styled(PlainIsland)`
+ background-color: ${colors.white};
+ border-radius: ${props => props.borderRadius};
+ box-shadow: 0px 4px 6px ${colors.walletBoxShadow};
+ overflow: hidden;
+`;
+
+Island.defaultProps = {
+ Component: 'div',
+ borderRadius: '10px',
+ style: {},
+};
+
+Island.displayName = 'Island';
diff --git a/packages/website/ts/components/ui/lifecycle_raised_button.tsx b/packages/website/ts/components/ui/lifecycle_raised_button.tsx
index c85e11884..380fbc77d 100644
--- a/packages/website/ts/components/ui/lifecycle_raised_button.tsx
+++ b/packages/website/ts/components/ui/lifecycle_raised_button.tsx
@@ -1,8 +1,7 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
+import { errorUtils } from '@0xproject/utils';
import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react';
-import { utils } from 'ts/utils/utils';
const COMPLETE_STATE_SHOW_LENGTH_MS = 2000;
@@ -42,11 +41,11 @@ export class LifeCycleRaisedButton extends React.Component<LifeCycleRaisedButton
buttonState: ButtonState.READY,
};
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
clearTimeout(this._buttonTimeoutId);
this._didUnmount = true;
}
- public render() {
+ public render(): React.ReactNode {
if (this.props.isHidden) {
return <span />;
}
@@ -63,7 +62,7 @@ export class LifeCycleRaisedButton extends React.Component<LifeCycleRaisedButton
label = this.props.labelComplete;
break;
default:
- throw utils.spawnSwitchErr('ButtonState', this.state.buttonState);
+ throw errorUtils.spawnSwitchErr('ButtonState', this.state.buttonState);
}
return (
<RaisedButton
@@ -77,7 +76,7 @@ export class LifeCycleRaisedButton extends React.Component<LifeCycleRaisedButton
/>
);
}
- public async onClickAsync() {
+ public async onClickAsync(): Promise<void> {
this.setState({
buttonState: ButtonState.LOADING,
});
diff --git a/packages/website/ts/components/ui/menu_item.tsx b/packages/website/ts/components/ui/menu_item.tsx
index 3482f436c..0cb4b387c 100644
--- a/packages/website/ts/components/ui/menu_item.tsx
+++ b/packages/website/ts/components/ui/menu_item.tsx
@@ -15,7 +15,7 @@ interface MenuItemState {
export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
public static defaultProps: Partial<MenuItemProps> = {
- onClick: _.noop,
+ onClick: _.noop.bind(_),
className: '',
};
public constructor(props: MenuItemProps) {
@@ -24,7 +24,7 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
isHovering: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const menuItemStyles = {
cursor: 'pointer',
opacity: this.state.isHovering ? 0.5 : 1,
@@ -43,7 +43,7 @@ export class MenuItem extends React.Component<MenuItemProps, MenuItemState> {
</Link>
);
}
- private _onToggleHover(isHovering: boolean) {
+ private _onToggleHover(isHovering: boolean): void {
this.setState({
isHovering,
});
diff --git a/packages/website/ts/components/ui/overlay.tsx b/packages/website/ts/components/ui/overlay.tsx
new file mode 100644
index 000000000..fc7507475
--- /dev/null
+++ b/packages/website/ts/components/ui/overlay.tsx
@@ -0,0 +1,32 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { zIndex } from 'ts/style/z_index';
+
+export interface OverlayProps {
+ style?: React.CSSProperties;
+ onClick?: () => void;
+}
+
+const style: React.CSSProperties = {
+ position: 'fixed',
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ zIndex: zIndex.overlay,
+ backgroundColor: 'rgba(0, 0, 0, 0.6)',
+};
+
+export const Overlay: React.StatelessComponent<OverlayProps> = props => (
+ <div style={{ ...style, ...props.style }} onClick={props.onClick}>
+ {props.children}
+ </div>
+);
+
+Overlay.defaultProps = {
+ style: {},
+ onClick: _.noop.bind(_),
+};
+
+Overlay.displayName = 'Overlay';
diff --git a/packages/website/ts/components/ui/party.tsx b/packages/website/ts/components/ui/party.tsx
index 3d94903d1..a25550475 100644
--- a/packages/website/ts/components/ui/party.tsx
+++ b/packages/website/ts/components/ui/party.tsx
@@ -4,7 +4,6 @@ import * as React from 'react';
import ReactTooltip = require('react-tooltip');
import { EthereumAddress } from 'ts/components/ui/ethereum_address';
import { Identicon } from 'ts/components/ui/identicon';
-import { utils } from 'ts/utils/utils';
const IMAGE_DIMENSION = 100;
const IDENTICON_DIAMETER = 95;
@@ -27,7 +26,7 @@ export class Party extends React.Component<PartyProps, PartyState> {
identiconStyle: {},
identiconDiameter: IDENTICON_DIAMETER,
};
- public render() {
+ public render(): React.ReactNode {
const label = this.props.label;
const address = this.props.address;
const identiconDiameter = this.props.identiconDiameter;
diff --git a/packages/website/ts/components/ui/pointer.tsx b/packages/website/ts/components/ui/pointer.tsx
new file mode 100644
index 000000000..db0a4188d
--- /dev/null
+++ b/packages/website/ts/components/ui/pointer.tsx
@@ -0,0 +1,72 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+import { styled } from 'ts/style/theme';
+
+export enum PointerDirection {
+ Top = 'top',
+ Right = 'right',
+ Bottom = 'bottom',
+ Left = 'left',
+}
+
+export interface PointerProps {
+ className?: string;
+ color?: string;
+ size?: number;
+ direction: PointerDirection;
+}
+
+const PlainPointer: React.StatelessComponent<PointerProps> = props => <div {...props} />;
+
+const positionToCss = (props: PointerProps) => {
+ const position = {
+ top: `bottom: 100%; left: 50%;`,
+ right: `left: 100%; top: 50%;`,
+ bottom: `top: 100%; left: 50%;`,
+ left: `right: 100%; top: 50%;`,
+ }[props.direction];
+
+ const borderColorSide = {
+ top: 'border-bottom-color',
+ right: 'border-left-color',
+ bottom: 'border-top-color',
+ left: 'border-right-color',
+ }[props.direction];
+ const border = `${borderColorSide}: ${props.color};`;
+ const marginSide = {
+ top: 'margin-left',
+ right: 'margin-top',
+ bottom: 'margin-left',
+ left: 'margin-top',
+ }[props.direction];
+ const margin = `${marginSide}: -${props.size}px`;
+ return {
+ position,
+ border,
+ margin,
+ };
+};
+
+export const Pointer = styled(PlainPointer)`
+ position: relative;
+ &:after {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+ border-color: rgba(136, 183, 213, 0);
+ border-width: ${props => `${props.size}px`};
+ ${props => positionToCss(props).position}
+ ${props => positionToCss(props).border}
+ ${props => positionToCss(props).margin}
+ }
+`;
+
+Pointer.defaultProps = {
+ color: colors.white,
+ size: 16,
+};
+
+Pointer.displayName = 'Pointer';
diff --git a/packages/website/ts/components/ui/retry.tsx b/packages/website/ts/components/ui/retry.tsx
new file mode 100644
index 000000000..543b7df4b
--- /dev/null
+++ b/packages/website/ts/components/ui/retry.tsx
@@ -0,0 +1,32 @@
+import * as React from 'react';
+
+import { Button } from 'ts/components/ui/button';
+import { colors } from 'ts/style/colors';
+
+const BUTTON_TEXT = 'reload';
+
+export interface RetryProps {
+ onRetry: () => void;
+}
+export const Retry = (props: RetryProps) => (
+ <div className="clearfix center" style={{ color: colors.black }}>
+ <div className="mx-auto inline-block align-middle" style={{ lineHeight: '44px', textAlign: 'center' }}>
+ <div className="h2" style={{ fontFamily: 'Roboto Mono' }}>
+ Something went wrong.
+ </div>
+ <div className="py3">
+ <Button
+ type="button"
+ backgroundColor={colors.black}
+ width="290px"
+ fontColor={colors.white}
+ fontSize="18px"
+ fontFamily="Roboto Mono"
+ onClick={props.onRetry}
+ >
+ {BUTTON_TEXT}
+ </Button>
+ </div>
+ </div>
+ </div>
+);
diff --git a/packages/website/ts/components/ui/simple_menu.tsx b/packages/website/ts/components/ui/simple_menu.tsx
new file mode 100644
index 000000000..8a9349c6d
--- /dev/null
+++ b/packages/website/ts/components/ui/simple_menu.tsx
@@ -0,0 +1,88 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+import * as CopyToClipboard from 'react-copy-to-clipboard';
+import { Link } from 'react-router-dom';
+
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { WebsitePaths } from 'ts/types';
+
+export interface SimpleMenuProps {
+ minWidth?: number | string;
+}
+
+export const SimpleMenu: React.StatelessComponent<SimpleMenuProps> = ({ children, minWidth }) => {
+ return (
+ <Container
+ marginLeft="16px"
+ marginRight="16px"
+ marginBottom="16px"
+ minWidth={minWidth}
+ className="flex flex-column"
+ >
+ {children}
+ </Container>
+ );
+};
+
+SimpleMenu.defaultProps = {
+ minWidth: '220px',
+};
+
+export interface SimpleMenuItemProps {
+ displayText: string;
+ onClick?: () => void;
+}
+export const SimpleMenuItem: React.StatelessComponent<SimpleMenuItemProps> = ({ displayText, onClick }) => {
+ // Falling back to _.noop for onclick retains the hovering effect
+ return (
+ <Container marginTop="16px" className="flex flex-column">
+ <Text
+ fontSize="14px"
+ fontColor={colors.darkGrey}
+ onClick={onClick || _.noop.bind(_)}
+ hoverColor={colors.mediumBlue}
+ >
+ {displayText}
+ </Text>
+ </Container>
+ );
+};
+
+export interface CopyAddressSimpleMenuItemProps {
+ userAddress: string;
+ onClick?: () => void;
+}
+export const CopyAddressSimpleMenuItem: React.StatelessComponent<CopyAddressSimpleMenuItemProps> = ({
+ userAddress,
+ onClick,
+}) => {
+ return (
+ <CopyToClipboard text={userAddress}>
+ <SimpleMenuItem displayText="Copy Address to Clipboard" onClick={onClick} />
+ </CopyToClipboard>
+ );
+};
+
+export interface GoToAccountManagementSimpleMenuItemProps {
+ onClick?: () => void;
+}
+export const GoToAccountManagementSimpleMenuItem: React.StatelessComponent<
+ GoToAccountManagementSimpleMenuItemProps
+> = ({ onClick }) => {
+ return (
+ <Link to={`${WebsitePaths.Portal}/account`} style={{ textDecoration: 'none' }}>
+ <SimpleMenuItem displayText="Manage Account..." onClick={onClick} />
+ </Link>
+ );
+};
+
+export interface DifferentWalletSimpleMenuItemProps {
+ onClick?: () => void;
+}
+export const DifferentWalletSimpleMenuItem: React.StatelessComponent<DifferentWalletSimpleMenuItemProps> = ({
+ onClick,
+}) => {
+ return <SimpleMenuItem displayText="Use Ledger Wallet..." onClick={onClick} />;
+};
diff --git a/packages/website/ts/components/ui/spinner.tsx b/packages/website/ts/components/ui/spinner.tsx
new file mode 100644
index 000000000..e8670cc3e
--- /dev/null
+++ b/packages/website/ts/components/ui/spinner.tsx
@@ -0,0 +1,54 @@
+import { colors } from '@0xproject/react-shared';
+import * as React from 'react';
+import { styled } from 'ts/style/theme';
+
+import { dash, rotate } from 'ts/style/keyframes';
+
+interface SpinnerSvgProps {
+ color: string;
+ size: number;
+ viewBox?: string;
+}
+
+const SpinnerSvg: React.StatelessComponent<SpinnerSvgProps> = props => <svg {...props} />;
+
+const StyledSpinner = styled(SpinnerSvg)`
+ animation: ${rotate} 3s linear infinite;
+ margin: ${props => `-${props.size / 2}px 0 0 -${props.size / 2}px`};
+ margin-top: ${props => `-${props.size / 2}px`};
+ margin-left: ${props => `-${props.size / 2}px`};
+ margin-bottom: 0px;
+ margin-right: 0px;
+ size: ${props => `${props.size}px`};
+ height: ${props => `${props.size}px`};
+
+ & .path {
+ stroke: ${props => props.color};
+ stroke-linecap: round;
+ animation: ${dash} 2.5s ease-in-out infinite;
+ }
+`;
+
+export interface SpinnerProps {
+ size?: number;
+ strokeSize?: number;
+ color?: string;
+}
+
+export const Spinner: React.StatelessComponent<SpinnerProps> = ({ size, strokeSize, color }) => {
+ const c = size / 2;
+ const r = c - strokeSize;
+ return (
+ <StyledSpinner color={color} size={size} viewBox={`0 0 ${size} ${size}`}>
+ <circle className="path" cx={c} cy={c} r={r} fill="none" strokeWidth={strokeSize} />
+ </StyledSpinner>
+ );
+};
+
+Spinner.defaultProps = {
+ size: 50,
+ color: colors.mediumBlue,
+ strokeSize: 4,
+};
+
+Spinner.displayName = 'Spinner';
diff --git a/packages/website/ts/components/ui/swap_icon.tsx b/packages/website/ts/components/ui/swap_icon.tsx
index e465a8074..f1d1ae7d4 100644
--- a/packages/website/ts/components/ui/swap_icon.tsx
+++ b/packages/website/ts/components/ui/swap_icon.tsx
@@ -1,5 +1,4 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
interface SwapIconProps {
@@ -17,7 +16,7 @@ export class SwapIcon extends React.Component<SwapIconProps, SwapIconState> {
isHovering: false,
};
}
- public render() {
+ public render(): React.ReactNode {
const swapStyles = {
color: this.state.isHovering ? colors.amber600 : colors.amber800,
fontSize: 50,
@@ -34,7 +33,7 @@ export class SwapIcon extends React.Component<SwapIconProps, SwapIconState> {
</div>
);
}
- private _onToggleHover(isHovering: boolean) {
+ private _onToggleHover(isHovering: boolean): void {
this.setState({
isHovering,
});
diff --git a/packages/website/ts/components/ui/text.tsx b/packages/website/ts/components/ui/text.tsx
new file mode 100644
index 000000000..734483564
--- /dev/null
+++ b/packages/website/ts/components/ui/text.tsx
@@ -0,0 +1,72 @@
+import { colors } from '@0xproject/react-shared';
+import { darken } from 'polished';
+import * as React from 'react';
+import { styled } from 'ts/style/theme';
+
+export type TextTag = 'p' | 'div' | 'span' | 'label' | 'h1' | 'h2' | 'h3' | 'h4' | 'i';
+
+export interface TextProps {
+ className?: string;
+ Tag?: TextTag;
+ fontSize?: string;
+ fontFamily?: string;
+ fontStyle?: string;
+ fontColor?: string;
+ lineHeight?: string;
+ minHeight?: string;
+ center?: boolean;
+ fontWeight?: number | string;
+ textDecorationLine?: string;
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
+ hoverColor?: string;
+ noWrap?: boolean;
+}
+
+const PlainText: React.StatelessComponent<TextProps> = ({ children, className, onClick, Tag }) => (
+ <Tag className={className} onClick={onClick}>
+ {children}
+ </Tag>
+);
+
+export const Text = styled(PlainText)`
+ font-family: ${props => props.fontFamily};
+ font-style: ${props => props.fontStyle};
+ font-weight: ${props => props.fontWeight};
+ font-size: ${props => props.fontSize};
+ text-decoration-line: ${props => props.textDecorationLine};
+ ${props => (props.lineHeight ? `line-height: ${props.lineHeight}` : '')};
+ ${props => (props.center ? 'text-align: center' : '')};
+ color: ${props => props.fontColor};
+ ${props => (props.minHeight ? `min-height: ${props.minHeight}` : '')};
+ ${props => (props.onClick ? 'cursor: pointer' : '')};
+ transition: color 0.5s ease;
+ ${props => (props.noWrap ? 'white-space: nowrap' : '')};
+ &:hover {
+ ${props => (props.onClick ? `color: ${props.hoverColor || darken(0.3, props.fontColor)}` : '')};
+ }
+`;
+
+Text.defaultProps = {
+ fontFamily: 'Roboto',
+ fontStyle: 'normal',
+ fontWeight: 400,
+ fontColor: colors.black,
+ fontSize: '15px',
+ lineHeight: '1.5em',
+ textDecorationLine: 'none',
+ Tag: 'div',
+ noWrap: false,
+};
+
+Text.displayName = 'Text';
+
+export const Title: React.StatelessComponent<TextProps> = props => <Text {...props} />;
+
+Title.defaultProps = {
+ Tag: 'h2',
+ fontSize: '20px',
+ fontWeight: 600,
+ fontColor: colors.black,
+};
+
+Title.displayName = 'Title';
diff --git a/packages/website/ts/components/ui/token_icon.tsx b/packages/website/ts/components/ui/token_icon.tsx
index ff57a96de..0875cc56b 100644
--- a/packages/website/ts/components/ui/token_icon.tsx
+++ b/packages/website/ts/components/ui/token_icon.tsx
@@ -6,22 +6,29 @@ import { Token } from 'ts/types';
interface TokenIconProps {
token: Token;
diameter: number;
+ link?: string;
}
interface TokenIconState {}
export class TokenIcon extends React.Component<TokenIconProps, TokenIconState> {
- public render() {
+ public render(): React.ReactNode {
const token = this.props.token;
const diameter = this.props.diameter;
- return (
- <div>
- {token.isRegistered && !_.isUndefined(token.iconUrl) ? (
- <img style={{ width: diameter, height: diameter }} src={token.iconUrl} />
- ) : (
- <Identicon address={token.address} diameter={diameter} />
- )}
- </div>
- );
+ const icon =
+ token.isRegistered && !_.isUndefined(token.iconUrl) ? (
+ <img style={{ width: diameter, height: diameter }} src={token.iconUrl} />
+ ) : (
+ <Identicon address={token.address} diameter={diameter} />
+ );
+ if (_.isEmpty(this.props.link)) {
+ return icon;
+ } else {
+ return (
+ <a href={this.props.link} target="_blank" style={{ textDecoration: 'none' }}>
+ {icon}
+ </a>
+ );
+ }
}
}
diff --git a/packages/website/ts/components/visual_order.tsx b/packages/website/ts/components/visual_order.tsx
index 3bf464e92..a8d18006e 100644
--- a/packages/website/ts/components/visual_order.tsx
+++ b/packages/website/ts/components/visual_order.tsx
@@ -1,4 +1,4 @@
-import { ZeroEx } from '0x.js';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import * as React from 'react';
import { Party } from 'ts/components/ui/party';
@@ -20,7 +20,7 @@ interface VisualOrderProps {
interface VisualOrderState {}
export class VisualOrder extends React.Component<VisualOrderProps, VisualOrderState> {
- public render() {
+ public render(): React.ReactNode {
const allTokens = _.values(this.props.tokenByAddress);
const makerImage = this.props.makerToken.iconUrl;
const takerImage = this.props.takerToken.iconUrl;
@@ -62,8 +62,8 @@ export class VisualOrder extends React.Component<VisualOrderProps, VisualOrderSt
</div>
);
}
- private _renderAmount(assetToken: AssetToken, token: Token) {
- const unitAmount = ZeroEx.toUnitAmount(assetToken.amount, token.decimals);
+ private _renderAmount(assetToken: AssetToken, token: Token): React.ReactNode {
+ const unitAmount = Web3Wrapper.toUnitAmount(assetToken.amount, token.decimals);
return (
<div style={{ fontSize: 13 }}>
{unitAmount.toNumber().toFixed(configs.AMOUNT_DISPLAY_PRECSION)} {token.symbol}
diff --git a/packages/website/ts/components/wallet/body_overlay.tsx b/packages/website/ts/components/wallet/body_overlay.tsx
new file mode 100644
index 000000000..26359d0d2
--- /dev/null
+++ b/packages/website/ts/components/wallet/body_overlay.tsx
@@ -0,0 +1,136 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { Blockchain } from 'ts/blockchain';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Island } from 'ts/components/ui/island';
+import { Text } from 'ts/components/ui/text';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { colors } from 'ts/style/colors';
+import { styled } from 'ts/style/theme';
+import { AccountState, ProviderType } from 'ts/types';
+import { utils } from 'ts/utils/utils';
+
+const METAMASK_IMG_SRC = '/images/metamask_icon.png';
+const TOSHI_IMG_SRC = '/images/toshi_logo.jpg';
+
+export interface BodyOverlayProps {
+ dispatcher: Dispatcher;
+ userAddress: string;
+ injectedProviderName: string;
+ providerType: ProviderType;
+ onToggleLedgerDialog: () => void;
+ blockchain?: Blockchain;
+ blockchainIsLoaded: boolean;
+}
+
+interface BodyOverlayState {}
+
+export class BodyOverlay extends React.Component<BodyOverlayProps, BodyOverlayState> {
+ public render(): React.ReactNode {
+ const accountState = this._getAccountState();
+ switch (accountState) {
+ case AccountState.Locked:
+ return <LockedOverlay onUseDifferentWalletClicked={this.props.onToggleLedgerDialog} />;
+ case AccountState.Disconnected:
+ return <DisconnectedOverlay onUseDifferentWalletClicked={this.props.onToggleLedgerDialog} />;
+ case AccountState.Ready:
+ case AccountState.Loading:
+ default:
+ return null;
+ }
+ }
+ private _isBlockchainReady(): boolean {
+ return this.props.blockchainIsLoaded && !_.isUndefined(this.props.blockchain);
+ }
+ private _getAccountState(): AccountState {
+ return utils.getAccountState(
+ this._isBlockchainReady(),
+ this.props.providerType,
+ this.props.injectedProviderName,
+ this.props.userAddress,
+ );
+ }
+}
+
+interface LockedOverlayProps {
+ className?: string;
+ onUseDifferentWalletClicked?: () => void;
+}
+const PlainLockedOverlay: React.StatelessComponent<LockedOverlayProps> = ({
+ className,
+ onUseDifferentWalletClicked,
+}) => (
+ <div className={className}>
+ <Container
+ className="flex flex-column items-center"
+ marginBottom="24px"
+ marginTop="24px"
+ marginLeft="48px"
+ marginRight="48px"
+ >
+ <Image src={METAMASK_IMG_SRC} height="70px" />
+ <Container marginTop="12px">
+ <Text fontColor={colors.metaMaskOrange} fontSize="16px" fontWeight="bold">
+ Please Unlock MetaMask
+ </Text>
+ </Container>
+ <UseDifferentWallet fontColor={colors.darkGrey} onClick={onUseDifferentWalletClicked} />
+ </Container>
+ </div>
+);
+const LockedOverlay = styled(PlainLockedOverlay)`
+ background: ${colors.metaMaskTransparentOrange};
+ border: 1px solid ${colors.metaMaskOrange};
+ border-radius: 10px;
+`;
+
+interface DisconnectedOverlayProps {
+ onUseDifferentWalletClicked?: () => void;
+}
+const DisconnectedOverlay = (props: DisconnectedOverlayProps) => {
+ return (
+ <div className="flex flex-column items-center">
+ <GetWalletCallToAction />
+ {!utils.isMobileOperatingSystem() && (
+ <UseDifferentWallet fontColor={colors.mediumBlue} onClick={props.onUseDifferentWalletClicked} />
+ )}
+ </div>
+ );
+};
+
+interface UseDifferentWallet {
+ fontColor: string;
+ onClick?: () => void;
+}
+const UseDifferentWallet = (props: UseDifferentWallet) => {
+ return (
+ <Container marginTop="12px">
+ <Text fontColor={props.fontColor} fontSize="16px" textDecorationLine="underline" onClick={props.onClick}>
+ Use a different wallet
+ </Text>
+ </Container>
+ );
+};
+
+const GetWalletCallToAction = () => {
+ const [downloadLink, isOnMobile] = utils.getBestWalletDownloadLinkAndIsMobile();
+ const imageUrl = isOnMobile ? TOSHI_IMG_SRC : METAMASK_IMG_SRC;
+ const text = isOnMobile ? 'Get Toshi Wallet' : 'Get MetaMask Wallet';
+ return (
+ <a href={downloadLink} target="_blank" style={{ textDecoration: 'none' }}>
+ <Island
+ className="flex items-center py1 px2"
+ style={{ height: 28, borderRadius: 28, backgroundColor: colors.mediumBlue }}
+ >
+ <Image src={imageUrl} width="28px" borderRadius="22%" />
+ <Container marginLeft="8px" marginRight="12px">
+ <Text fontColor={colors.white} fontSize="16px" fontWeight={500}>
+ {text}
+ </Text>
+ </Container>
+ </Island>
+ </a>
+ );
+};
diff --git a/packages/website/ts/components/wallet/null_token_row.tsx b/packages/website/ts/components/wallet/null_token_row.tsx
new file mode 100644
index 000000000..a1ec9871a
--- /dev/null
+++ b/packages/website/ts/components/wallet/null_token_row.tsx
@@ -0,0 +1,41 @@
+import * as React from 'react';
+
+import { Circle } from 'ts/components/ui/circle';
+import { Container } from 'ts/components/ui/container';
+import { Text } from 'ts/components/ui/text';
+import { PlaceHolder } from 'ts/components/wallet/placeholder';
+import { StandardIconRow } from 'ts/components/wallet/standard_icon_row';
+import { colors } from 'ts/style/colors';
+
+export interface NullTokenRowProps {
+ iconDimension: number;
+ fillColor: string;
+}
+
+export const NullTokenRow: React.StatelessComponent<NullTokenRowProps> = ({ iconDimension, fillColor }) => {
+ const icon = <Circle diameter={iconDimension} fillColor={fillColor} />;
+ const main = (
+ <div className="flex flex-column">
+ <PlaceHolder hideChildren={true} fillColor={fillColor}>
+ <Text fontSize="16px" fontWeight="bold" lineHeight="1em">
+ 0.00 XXX
+ </Text>
+ </PlaceHolder>
+ <Container marginTop="3px">
+ <PlaceHolder hideChildren={true} fillColor={fillColor}>
+ <Text fontSize="14px" fontColor={colors.darkGrey} lineHeight="1em">
+ $0.00
+ </Text>
+ </PlaceHolder>
+ </Container>
+ </div>
+ );
+ const accessory = (
+ <Container marginRight="12px">
+ <PlaceHolder hideChildren={true} fillColor={fillColor}>
+ <Container width="20px" height="14px" />
+ </PlaceHolder>
+ </Container>
+ );
+ return <StandardIconRow icon={icon} main={main} accessory={accessory} />;
+};
diff --git a/packages/website/ts/components/wallet/placeholder.tsx b/packages/website/ts/components/wallet/placeholder.tsx
new file mode 100644
index 000000000..bf40d2ea8
--- /dev/null
+++ b/packages/website/ts/components/wallet/placeholder.tsx
@@ -0,0 +1,25 @@
+import * as React from 'react';
+
+import { styled } from 'ts/style/theme';
+
+export interface PlaceHolderProps {
+ className?: string;
+ hideChildren: React.ReactNode;
+ fillColor: string;
+}
+
+const PlainPlaceHolder: React.StatelessComponent<PlaceHolderProps> = ({ className, hideChildren, children }) => {
+ const childrenVisibility = hideChildren ? 'hidden' : 'visible';
+ const childrenStyle: React.CSSProperties = { visibility: childrenVisibility };
+ return (
+ <div className={className}>
+ <div style={childrenStyle}>{children}</div>
+ </div>
+ );
+};
+
+export const PlaceHolder = styled(PlainPlaceHolder)`
+ background-color: ${props => (props.hideChildren ? props.fillColor : 'transparent')};
+ display: inline-block;
+ border-radius: 2px;
+`;
diff --git a/packages/website/ts/components/wallet/standard_icon_row.tsx b/packages/website/ts/components/wallet/standard_icon_row.tsx
new file mode 100644
index 000000000..1a2ec021b
--- /dev/null
+++ b/packages/website/ts/components/wallet/standard_icon_row.tsx
@@ -0,0 +1,44 @@
+import * as React from 'react';
+
+import { colors } from 'ts/style/colors';
+import { styled } from 'ts/style/theme';
+
+export interface StandardIconRowProps {
+ className?: string;
+ icon: React.ReactNode;
+ main: React.ReactNode;
+ accessory?: React.ReactNode;
+ minHeight?: string;
+ borderBottomColor?: string;
+ borderBottomStyle?: string;
+ borderWidth?: string;
+ backgroundColor?: string;
+}
+const PlainStandardIconRow: React.StatelessComponent<StandardIconRowProps> = ({ className, icon, main, accessory }) => {
+ return (
+ <div className={`flex items-center ${className}`}>
+ <div className="flex items-center px2">{icon}</div>
+ <div className="flex-none pr2">{main}</div>
+ <div className="flex-auto" />
+ <div>{accessory}</div>
+ </div>
+ );
+};
+
+export const StandardIconRow = styled(PlainStandardIconRow)`
+ min-height: ${props => props.minHeight};
+ border-bottom-color: ${props => props.borderBottomColor};
+ border-bottom-style: ${props => props.borderBottomStyle};
+ border-width: ${props => props.borderWidth};
+ background-color: ${props => props.backgroundColor};
+`;
+
+StandardIconRow.defaultProps = {
+ minHeight: '85px',
+ borderBottomColor: colors.walletBorder,
+ borderBottomStyle: 'solid',
+ borderWidth: '1px',
+ backgroundColor: colors.walletDefaultItemBackground,
+};
+
+StandardIconRow.displayName = 'StandardIconRow';
diff --git a/packages/website/ts/components/wallet/wallet.tsx b/packages/website/ts/components/wallet/wallet.tsx
index 39c95d31c..6abaa840b 100644
--- a/packages/website/ts/components/wallet/wallet.tsx
+++ b/packages/website/ts/components/wallet/wallet.tsx
@@ -1,43 +1,51 @@
-import { ZeroEx } from '0x.js';
-import {
- colors,
- constants as sharedConstants,
- EtherscanLinkSuffixes,
- Styles,
- utils as sharedUtils,
-} from '@0xproject/react-shared';
-import { BigNumber } from '@0xproject/utils';
+import { EtherscanLinkSuffixes, utils as sharedUtils } from '@0xproject/react-shared';
+import { BigNumber, errorUtils } from '@0xproject/utils';
import * as _ from 'lodash';
-import FlatButton from 'material-ui/FlatButton';
-import { List, ListItem } from 'material-ui/List';
+
import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet';
-import NavigationArrowDownward from 'material-ui/svg-icons/navigation/arrow-downward';
-import NavigationArrowUpward from 'material-ui/svg-icons/navigation/arrow-upward';
-import Close from 'material-ui/svg-icons/navigation/close';
import * as React from 'react';
-import ReactTooltip = require('react-tooltip');
import firstBy = require('thenby');
import { Blockchain } from 'ts/blockchain';
-import { AllowanceToggle } from 'ts/components/inputs/allowance_toggle';
+import { AccountConnection } from 'ts/components/ui/account_connection';
+import { Balance } from 'ts/components/ui/balance';
+import { Container } from 'ts/components/ui/container';
+import { DropDown, DropdownMouseEvent } from 'ts/components/ui/drop_down';
+import { IconButton } from 'ts/components/ui/icon_button';
import { Identicon } from 'ts/components/ui/identicon';
+import { Island } from 'ts/components/ui/island';
+import { PointerDirection } from 'ts/components/ui/pointer';
+import {
+ CopyAddressSimpleMenuItem,
+ DifferentWalletSimpleMenuItem,
+ GoToAccountManagementSimpleMenuItem,
+ SimpleMenu,
+ SimpleMenuItem,
+} from 'ts/components/ui/simple_menu';
+import { Text } from 'ts/components/ui/text';
import { TokenIcon } from 'ts/components/ui/token_icon';
-import { WalletDisconnectedItem } from 'ts/components/wallet/wallet_disconnected_item';
+import { BodyOverlay } from 'ts/components/wallet/body_overlay';
+import { NullTokenRow } from 'ts/components/wallet/null_token_row';
+import { PlaceHolder } from 'ts/components/wallet/placeholder';
+import { StandardIconRow } from 'ts/components/wallet/standard_icon_row';
import { WrapEtherItem } from 'ts/components/wallet/wrap_ether_item';
+import { AllowanceStateToggle } from 'ts/containers/inputs/allowance_state_toggle';
import { Dispatcher } from 'ts/redux/dispatcher';
+import { colors } from 'ts/style/colors';
import {
- BalanceErrs,
+ AccountState,
BlockchainErrs,
ProviderType,
+ ScreenWidths,
Side,
Token,
TokenByAddress,
TokenState,
TokenStateByAddress,
} from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
import { constants } from 'ts/utils/constants';
import { utils } from 'ts/utils/utils';
-import { styles as walletItemStyles } from 'ts/utils/wallet_item_styles';
export interface WalletProps {
userAddress: string;
@@ -48,434 +56,472 @@ export interface WalletProps {
dispatcher: Dispatcher;
tokenByAddress: TokenByAddress;
trackedTokens: Token[];
- userEtherBalanceInWei: BigNumber;
+ userEtherBalanceInWei?: BigNumber;
lastForceTokenStateRefetch: number;
injectedProviderName: string;
providerType: ProviderType;
+ screenWidth: ScreenWidths;
+ location: Location;
+ trackedTokenStateByAddress: TokenStateByAddress;
onToggleLedgerDialog: () => void;
+ onAddToken: () => void;
+ onRemoveToken: () => void;
+ refetchTokenStateAsync: (tokenAddress: string) => Promise<void>;
+ style: React.CSSProperties;
+ toggleTooltipDirection?: PointerDirection;
}
interface WalletState {
- trackedTokenStateByAddress: TokenStateByAddress;
wrappedEtherDirection?: Side;
+ isHoveringSidebar: boolean;
}
-interface AllowanceToggleConfig {
+interface AllowanceStateToggleConfig {
token: Token;
tokenState: TokenState;
}
interface AccessoryItemConfig {
wrappedEtherDirection?: Side;
- allowanceToggleConfig?: AllowanceToggleConfig;
+ allowanceStateToggleConfig?: AllowanceStateToggleConfig;
}
-const styles: Styles = {
- wallet: {
- width: 346,
- backgroundColor: colors.white,
- borderBottomRightRadius: 10,
- borderBottomLeftRadius: 10,
- borderTopRightRadius: 10,
- borderTopLeftRadius: 10,
- boxShadow: `0px 4px 6px ${colors.walletBoxShadow}`,
- overflow: 'hidden',
- },
- list: {
- padding: 0,
- },
- tokenItemInnerDiv: {
- paddingLeft: 60,
- },
- headerItemInnerDiv: {
- paddingLeft: 65,
- },
- footerItemInnerDiv: {
- paddingLeft: 24,
- },
- borderedItem: {
- borderBottomColor: colors.walletBorder,
- borderBottomStyle: 'solid',
- borderWidth: 1,
- },
- tokenItem: {
- backgroundColor: colors.walletDefaultItemBackground,
- },
- wrappedEtherOpenButtonLabel: {
- fontSize: 10,
- },
- amountLabel: {
- fontWeight: 'bold',
- color: colors.black,
- },
- paddedItem: {
- paddingTop: 8,
- paddingBottom: 8,
- },
- accessoryItemsContainer: { width: 150, right: 8 },
-};
-
const ETHER_ICON_PATH = '/images/ether.png';
-const ETHER_TOKEN_SYMBOL = 'WETH';
-const ZRX_TOKEN_SYMBOL = 'ZRX';
-const ETHER_SYMBOL = 'ETH';
-const ICON_DIMENSION = 24;
-const TOKEN_AMOUNT_DISPLAY_PRECISION = 3;
+const ICON_DIMENSION = 28;
+const BODY_ITEM_KEY = 'BODY';
+const HEADER_ITEM_KEY = 'HEADER';
+const ETHER_ITEM_KEY = 'ETHER';
+const WRAP_ROW_ALLOWANCE_TOGGLE_WIDTH = 67;
+const ALLOWANCE_TOGGLE_WIDTH = 56;
+const PLACEHOLDER_COLOR = colors.grey300;
+const LOADING_ROWS_COUNT = 6;
export class Wallet extends React.Component<WalletProps, WalletState> {
- private _isUnmounted: boolean;
+ public static defaultProps = {
+ style: {},
+ };
constructor(props: WalletProps) {
super(props);
- this._isUnmounted = false;
- const initialTrackedTokenStateByAddress = this._getInitialTrackedTokenStateByAddress(props.trackedTokens);
this.state = {
- trackedTokenStateByAddress: initialTrackedTokenStateByAddress,
wrappedEtherDirection: undefined,
+ isHoveringSidebar: false,
};
}
- public componentWillMount() {
- const trackedTokenAddresses = _.keys(this.state.trackedTokenStateByAddress);
- // tslint:disable-next-line:no-floating-promises
- this._fetchBalancesAndAllowancesAsync(trackedTokenAddresses);
- }
- public componentWillUnmount() {
- this._isUnmounted = true;
- }
- public componentWillReceiveProps(nextProps: WalletProps) {
+ public componentDidUpdate(prevProps: WalletProps): void {
+ const currentTrackedTokens = this.props.trackedTokens;
+ const differentTrackedTokens = _.difference(currentTrackedTokens, prevProps.trackedTokens);
+ const firstDifferentTrackedToken = _.head(differentTrackedTokens);
+ // check if there is only one different token, and if that token is a member of the current tracked tokens
+ // this means that the token was added, not removed
if (
- nextProps.userAddress !== this.props.userAddress ||
- nextProps.networkId !== this.props.networkId ||
- nextProps.lastForceTokenStateRefetch !== this.props.lastForceTokenStateRefetch
+ !_.isUndefined(firstDifferentTrackedToken) &&
+ _.size(differentTrackedTokens) === 1 &&
+ _.includes(currentTrackedTokens, firstDifferentTrackedToken)
) {
- const trackedTokenAddresses = _.keys(this.state.trackedTokenStateByAddress);
- // tslint:disable-next-line:no-floating-promises
- this._fetchBalancesAndAllowancesAsync(trackedTokenAddresses);
- }
- if (!_.isEqual(nextProps.trackedTokens, this.props.trackedTokens)) {
- const newTokens = _.difference(nextProps.trackedTokens, this.props.trackedTokens);
- const newTokenAddresses = _.map(newTokens, token => token.address);
- // Add placeholder entry for this token to the state, since fetching the
- // balance/allowance is asynchronous
- const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress;
- _.each(newTokenAddresses, (tokenAddress: string) => {
- trackedTokenStateByAddress[tokenAddress] = {
- balance: new BigNumber(0),
- allowance: new BigNumber(0),
- isLoaded: false,
- };
- });
- this.setState({
- trackedTokenStateByAddress,
- });
- // Fetch the actual balance/allowance.
- // tslint:disable-next-line:no-floating-promises
- this._fetchBalancesAndAllowancesAsync(newTokenAddresses);
+ document.getElementById(firstDifferentTrackedToken.address).scrollIntoView();
}
}
- public render() {
- const isReadyToRender = this.props.blockchainIsLoaded && this.props.blockchainErr === BlockchainErrs.NoError;
- return <div style={styles.wallet}>{isReadyToRender && this._renderRows()}</div>;
- }
- private _renderRows() {
- const isAddressAvailable = !_.isEmpty(this.props.userAddress);
+ public render(): React.ReactNode {
return (
- <List style={styles.list}>
- {isAddressAvailable
- ? _.concat(
- this._renderConnectedHeaderRows(),
- this._renderEthRows(),
- this._renderTokenRows(),
- this._renderFooterRows(),
- )
- : _.concat(this._renderDisconnectedHeaderRows(), this._renderDisconnectedRows())}
- </List>
+ <Island className="flex flex-column wallet" style={this.props.style}>
+ {this._isBlockchainReady() ? this._renderLoadedRows() : this._renderLoadingRows()}
+ </Island>
);
}
- private _renderDisconnectedHeaderRows() {
- const userAddress = this.props.userAddress;
- const primaryText = 'wallet';
+ private _renderLoadingRows(): React.ReactNode {
+ return _.concat(this._renderLoadingHeaderRows(), this._renderLoadingBodyRows());
+ }
+ private _renderLoadingHeaderRows(): React.ReactElement<{}> {
+ return this._renderPlainHeaderRow('Loading...');
+ }
+ private _renderLoadingBodyRows(): React.ReactElement<{}> {
+ const bodyStyle = this._getBodyStyle();
+ const loadingRowsRange = _.range(LOADING_ROWS_COUNT);
return (
- <ListItem
- primaryText={primaryText.toUpperCase()}
- leftIcon={<ActionAccountBalanceWallet color={colors.mediumBlue} />}
- style={styles.paddedItem}
- innerDivStyle={styles.headerItemInnerDiv}
- />
+ <div key={BODY_ITEM_KEY} className="flex flex-column" style={bodyStyle}>
+ {_.map(loadingRowsRange, index => {
+ return <NullTokenRow key={index} iconDimension={ICON_DIMENSION} fillColor={PLACEHOLDER_COLOR} />;
+ })}
+ <Container
+ className="flex items-center"
+ position="absolute"
+ width="100%"
+ height="100%"
+ maxHeight={bodyStyle.maxHeight}
+ >
+ <div className="mx-auto">
+ <BodyOverlay
+ dispatcher={this.props.dispatcher}
+ userAddress={this.props.userAddress}
+ injectedProviderName={this.props.injectedProviderName}
+ providerType={this.props.providerType}
+ onToggleLedgerDialog={this.props.onToggleLedgerDialog}
+ blockchain={this.props.blockchain}
+ blockchainIsLoaded={this.props.blockchainIsLoaded}
+ />
+ </div>
+ </Container>
+ </div>
+ );
+ }
+ private _renderLoadedRows(): React.ReactNode {
+ const isAddressAvailable = !_.isEmpty(this.props.userAddress);
+ return isAddressAvailable
+ ? _.concat(this._renderConnectedHeaderRows(), this._renderBody())
+ : _.concat(this._renderDisconnectedHeaderRows(), this._renderLoadingBodyRows());
+ }
+ private _renderDisconnectedHeaderRows(): React.ReactElement<{}> {
+ const isExternallyInjectedProvider = utils.isExternallyInjected(
+ this.props.providerType,
+ this.props.injectedProviderName,
);
+ const text = isExternallyInjectedProvider ? 'Please unlock MetaMask...' : 'Please connect a wallet...';
+ return this._renderPlainHeaderRow(text);
}
- private _renderDisconnectedRows() {
+ private _renderPlainHeaderRow(text: string): React.ReactElement<{}> {
return (
- <WalletDisconnectedItem
- providerType={this.props.providerType}
- injectedProviderName={this.props.injectedProviderName}
- onToggleLedgerDialog={this.props.onToggleLedgerDialog}
+ <StandardIconRow
+ key={HEADER_ITEM_KEY}
+ icon={<ActionAccountBalanceWallet color={colors.grey} />}
+ main={
+ <Text fontSize="16px" fontColor={colors.grey}>
+ {text}
+ </Text>
+ // https://github.com/palantir/tslint-react/issues/140
+ // tslint:disable-next-line:jsx-curly-spacing
+ }
+ minHeight="60px"
+ backgroundColor={colors.white}
/>
);
}
- private _renderConnectedHeaderRows() {
+ private _renderConnectedHeaderRows(): React.ReactElement<{}> {
+ const isMobile = this.props.screenWidth === ScreenWidths.Sm;
const userAddress = this.props.userAddress;
- const primaryText = utils.getAddressBeginAndEnd(userAddress);
+ const accountState = this._getAccountState();
+ const main = (
+ <div className="flex flex-column">
+ <Text fontSize="16px" lineHeight="19px" fontWeight={500}>
+ {utils.getAddressBeginAndEnd(userAddress)}
+ </Text>
+ <AccountConnection accountState={accountState} injectedProviderName={this.props.injectedProviderName} />
+ </div>
+ );
+ const onClick = _.noop.bind(_);
+ const accessory = (
+ <DropDown
+ activeNode={
+ // this container gives the menu button more of a hover target for the drop down
+ // it prevents accidentally closing the menu by moving off of the button
+ <Container paddingLeft="100px" paddingRight="15px">
+ <Text
+ className="zmdi zmdi-more-horiz"
+ Tag="i"
+ fontSize="32px"
+ fontFamily="Material-Design-Iconic-Font"
+ fontColor={colors.darkGrey}
+ onClick={onClick}
+ hoverColor={colors.mediumBlue}
+ />
+ </Container>
+ }
+ popoverContent={
+ <SimpleMenu minWidth="150px">
+ <CopyAddressSimpleMenuItem userAddress={this.props.userAddress} />
+ {!isMobile && <DifferentWalletSimpleMenuItem onClick={this.props.onToggleLedgerDialog} />}
+ <SimpleMenuItem displayText="Add Tokens..." onClick={this.props.onAddToken} />
+ <SimpleMenuItem displayText="Remove Tokens..." onClick={this.props.onRemoveToken} />
+ {!isMobile && <GoToAccountManagementSimpleMenuItem />}
+ </SimpleMenu>
+ }
+ anchorOrigin={{ horizontal: 'right', vertical: 'bottom' }}
+ targetOrigin={{ horizontal: 'right', vertical: 'top' }}
+ zDepth={1}
+ activateEvent={DropdownMouseEvent.Click}
+ closeEvent={DropdownMouseEvent.Click}
+ />
+ );
return (
- <ListItem
- primaryText={primaryText}
- leftIcon={<Identicon address={userAddress} diameter={ICON_DIMENSION} />}
- style={{ ...styles.paddedItem, ...styles.borderedItem }}
- innerDivStyle={styles.headerItemInnerDiv}
+ <StandardIconRow
+ key={HEADER_ITEM_KEY}
+ icon={<Identicon address={userAddress} diameter={ICON_DIMENSION} />}
+ main={main}
+ accessory={accessory}
+ minHeight="60px"
+ backgroundColor={colors.white}
/>
);
}
- private _renderFooterRows() {
- const primaryText = '+ other tokens';
- return <ListItem primaryText={primaryText} innerDivStyle={styles.footerItemInnerDiv} />;
+ private _renderBody(): React.ReactElement<{}> {
+ const bodyStyle = this._getBodyStyle();
+ return (
+ <div
+ style={bodyStyle}
+ key={BODY_ITEM_KEY}
+ onMouseEnter={this._onSidebarHover.bind(this)}
+ onMouseLeave={this._onSidebarHoverOff.bind(this)}
+ >
+ {this._renderEthRows()}
+ {this._renderTokenRows()}
+ </div>
+ );
+ }
+ private _getBodyStyle(): React.CSSProperties {
+ return {
+ overflow: 'auto',
+ WebkitOverflowScrolling: 'touch',
+ position: 'relative',
+ overflowY: this.state.isHoveringSidebar ? 'scroll' : 'hidden',
+ marginRight: this.state.isHoveringSidebar ? 0 : 4,
+ minHeight: '250px',
+ maxHeight: !utils.isMobileWidth(this.props.screenWidth) ? 'calc(90vh - 300px)' : undefined,
+ };
+ }
+ private _onSidebarHover(_event: React.FormEvent<HTMLInputElement>): void {
+ this.setState({
+ isHoveringSidebar: true,
+ });
+ }
+ private _onSidebarHoverOff(): void {
+ this.setState({
+ isHoveringSidebar: false,
+ });
}
- private _renderEthRows() {
+ private _renderEthRows(): React.ReactNode {
+ const icon = <img style={{ width: ICON_DIMENSION, height: ICON_DIMENSION }} src={ETHER_ICON_PATH} />;
const primaryText = this._renderAmount(
- this.props.userEtherBalanceInWei,
+ this.props.userEtherBalanceInWei || new BigNumber(0),
constants.DECIMAL_PLACES_ETH,
- ETHER_SYMBOL,
+ constants.ETHER_SYMBOL,
+ _.isUndefined(this.props.userEtherBalanceInWei),
+ );
+ const etherToken = this._getEthToken();
+ const etherTokenState = this.props.trackedTokenStateByAddress[etherToken.address];
+ const etherPrice = etherTokenState.price;
+ const secondaryText = this._renderValue(
+ this.props.userEtherBalanceInWei || new BigNumber(0),
+ constants.DECIMAL_PLACES_ETH,
+ etherPrice,
+ _.isUndefined(this.props.userEtherBalanceInWei) || !etherTokenState.isLoaded,
);
const accessoryItemConfig = {
wrappedEtherDirection: Side.Deposit,
};
- const isInWrappedEtherState =
- !_.isUndefined(this.state.wrappedEtherDirection) &&
- this.state.wrappedEtherDirection === accessoryItemConfig.wrappedEtherDirection;
- const style = isInWrappedEtherState
- ? { ...walletItemStyles.focusedItem, ...styles.paddedItem }
- : { ...styles.tokenItem, ...styles.borderedItem, ...styles.paddedItem };
- const etherToken = this._getEthToken();
- return (
- <div>
- <ListItem
- primaryText={primaryText}
- leftIcon={<img style={{ width: ICON_DIMENSION, height: ICON_DIMENSION }} src={ETHER_ICON_PATH} />}
- rightAvatar={this._renderAccessoryItems(accessoryItemConfig)}
- disableTouchRipple={true}
- style={style}
- innerDivStyle={styles.tokenItemInnerDiv}
- />
- {isInWrappedEtherState && (
- <WrapEtherItem
- userAddress={this.props.userAddress}
- networkId={this.props.networkId}
- blockchain={this.props.blockchain}
- dispatcher={this.props.dispatcher}
- userEtherBalanceInWei={this.props.userEtherBalanceInWei}
- direction={accessoryItemConfig.wrappedEtherDirection}
- etherToken={etherToken}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- onConversionSuccessful={this._closeWrappedEtherActionRow.bind(this)}
- refetchEthTokenStateAsync={this._refetchTokenStateAsync.bind(this, etherToken.address)}
- />
- )}
- </div>
- );
+ const key = ETHER_ITEM_KEY;
+ return this._renderBalanceRow(key, icon, primaryText, secondaryText, accessoryItemConfig);
}
- private _renderTokenRows() {
+ private _renderTokenRows(): React.ReactNode {
const trackedTokens = this.props.trackedTokens;
const trackedTokensStartingWithEtherToken = trackedTokens.sort(
- firstBy((t: Token) => t.symbol !== ETHER_TOKEN_SYMBOL)
- .thenBy((t: Token) => t.symbol !== ZRX_TOKEN_SYMBOL)
- .thenBy('address'),
+ firstBy((t: Token) => t.symbol !== constants.ETHER_TOKEN_SYMBOL)
+ .thenBy((t: Token) => t.symbol !== constants.ZRX_TOKEN_SYMBOL)
+ .thenBy('trackedTimestamp'),
);
return _.map(trackedTokensStartingWithEtherToken, this._renderTokenRow.bind(this));
}
- private _renderTokenRow(token: Token) {
- const tokenState = this.state.trackedTokenStateByAddress[token.address];
+ private _renderTokenRow(token: Token): React.ReactNode {
+ const tokenState = this.props.trackedTokenStateByAddress[token.address];
+ if (_.isUndefined(tokenState)) {
+ return null;
+ }
const tokenLink = sharedUtils.getEtherScanLinkIfExists(
token.address,
this.props.networkId,
EtherscanLinkSuffixes.Address,
);
- const amount = this._renderAmount(tokenState.balance, token.decimals, token.symbol);
- const wrappedEtherDirection = token.symbol === ETHER_TOKEN_SYMBOL ? Side.Receive : undefined;
+ const icon = <TokenIcon token={token} diameter={ICON_DIMENSION} link={tokenLink} />;
+ const isWeth = token.symbol === constants.ETHER_TOKEN_SYMBOL;
+ const wrappedEtherDirection = isWeth ? Side.Receive : undefined;
+ const primaryText = this._renderAmount(tokenState.balance, token.decimals, token.symbol, !tokenState.isLoaded);
+ const secondaryText = this._renderValue(
+ tokenState.balance,
+ token.decimals,
+ tokenState.price,
+ !tokenState.isLoaded,
+ );
const accessoryItemConfig: AccessoryItemConfig = {
wrappedEtherDirection,
- allowanceToggleConfig: {
+ allowanceStateToggleConfig: {
token,
tokenState,
},
};
+ const key = token.address;
+ return this._renderBalanceRow(key, icon, primaryText, secondaryText, accessoryItemConfig);
+ }
+ private _renderBalanceRow(
+ key: string,
+ icon: React.ReactNode,
+ primaryText: React.ReactNode,
+ secondaryText: React.ReactNode,
+ accessoryItemConfig: AccessoryItemConfig,
+ className?: string,
+ ): React.ReactNode {
const shouldShowWrapEtherItem =
!_.isUndefined(this.state.wrappedEtherDirection) &&
- this.state.wrappedEtherDirection === accessoryItemConfig.wrappedEtherDirection;
- const style = shouldShowWrapEtherItem
- ? { ...walletItemStyles.focusedItem, ...styles.paddedItem }
- : { ...styles.tokenItem, ...styles.borderedItem, ...styles.paddedItem };
+ this.state.wrappedEtherDirection === accessoryItemConfig.wrappedEtherDirection &&
+ !_.isUndefined(this.props.userEtherBalanceInWei);
const etherToken = this._getEthToken();
+ const wrapEtherItem = shouldShowWrapEtherItem ? (
+ <WrapEtherItem
+ userAddress={this.props.userAddress}
+ networkId={this.props.networkId}
+ blockchain={this.props.blockchain}
+ dispatcher={this.props.dispatcher}
+ userEtherBalanceInWei={this.props.userEtherBalanceInWei}
+ direction={accessoryItemConfig.wrappedEtherDirection}
+ etherToken={etherToken}
+ lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
+ onConversionSuccessful={this._closeWrappedEtherActionRow.bind(this)}
+ // tslint:disable:jsx-no-lambda
+ refetchEthTokenStateAsync={async () => this.props.refetchTokenStateAsync(etherToken.address)}
+ />
+ ) : null;
return (
- <div>
- <ListItem
- primaryText={amount}
- leftIcon={this._renderTokenIcon(token, tokenLink)}
- rightAvatar={this._renderAccessoryItems(accessoryItemConfig)}
- disableTouchRipple={true}
- style={style}
- innerDivStyle={styles.tokenItemInnerDiv}
+ <div id={key} key={key} className={`flex flex-column ${className || ''}`}>
+ {this.state.wrappedEtherDirection === Side.Receive && wrapEtherItem}
+ <StandardIconRow
+ icon={icon}
+ main={
+ <div className="flex flex-column">
+ {primaryText}
+ <Container marginTop="3px">{secondaryText}</Container>
+ </div>
+ }
+ accessory={this._renderAccessoryItems(accessoryItemConfig)}
/>
- {shouldShowWrapEtherItem && (
- <WrapEtherItem
- userAddress={this.props.userAddress}
- networkId={this.props.networkId}
- blockchain={this.props.blockchain}
- dispatcher={this.props.dispatcher}
- userEtherBalanceInWei={this.props.userEtherBalanceInWei}
- direction={accessoryItemConfig.wrappedEtherDirection}
- etherToken={etherToken}
- lastForceTokenStateRefetch={this.props.lastForceTokenStateRefetch}
- onConversionSuccessful={this._closeWrappedEtherActionRow.bind(this)}
- refetchEthTokenStateAsync={this._refetchTokenStateAsync.bind(this, etherToken.address)}
- />
- )}
+ {this.state.wrappedEtherDirection === Side.Deposit && wrapEtherItem}
</div>
);
}
- private _renderAccessoryItems(config: AccessoryItemConfig) {
+ private _renderAccessoryItems(config: AccessoryItemConfig): React.ReactElement<{}> {
const shouldShowWrappedEtherAction = !_.isUndefined(config.wrappedEtherDirection);
- const shouldShowToggle = !_.isUndefined(config.allowanceToggleConfig);
+ const shouldShowToggle = !_.isUndefined(config.allowanceStateToggleConfig);
+ // if we don't have a toggle, we still want some space to the right of the "wrap" button so that it aligns with
+ // the "unwrap" button in the row below
+ const isWrapEtherRow = shouldShowWrappedEtherAction && config.wrappedEtherDirection === Side.Deposit;
+ const width = isWrapEtherRow ? WRAP_ROW_ALLOWANCE_TOGGLE_WIDTH : ALLOWANCE_TOGGLE_WIDTH;
+ const toggle = (
+ <Container className="flex justify-center" width={width}>
+ {shouldShowToggle && this._renderAllowanceToggle(config.allowanceStateToggleConfig)}
+ </Container>
+ );
return (
- <div style={styles.accessoryItemsContainer}>
- <div className="flex">
- <div className="flex-auto">
- {shouldShowWrappedEtherAction && this._renderWrappedEtherButton(config.wrappedEtherDirection)}
- </div>
- <div className="flex-last py1">
- {shouldShowToggle && this._renderAllowanceToggle(config.allowanceToggleConfig)}
- </div>
+ <div className="flex items-center">
+ <div className="flex-auto">
+ {shouldShowWrappedEtherAction && this._renderWrappedEtherButton(config.wrappedEtherDirection)}
</div>
+ <div className="flex-last pl2">{toggle}</div>
</div>
);
}
- private _renderAllowanceToggle(config: AllowanceToggleConfig) {
+ private _renderAllowanceToggle(config: AllowanceStateToggleConfig): React.ReactNode {
+ // TODO: Error handling
return (
- <AllowanceToggle
- networkId={this.props.networkId}
+ <AllowanceStateToggle
blockchain={this.props.blockchain}
- dispatcher={this.props.dispatcher}
token={config.token}
tokenState={config.tokenState}
- onErrorOccurred={_.noop} // TODO: Error handling
- userAddress={this.props.userAddress}
- isDisabled={!config.tokenState.isLoaded}
- refetchTokenStateAsync={this._refetchTokenStateAsync.bind(this, config.token.address)}
+ tooltipDirection={this.props.toggleTooltipDirection}
+ refetchTokenStateAsync={async () => this.props.refetchTokenStateAsync(config.token.address)}
/>
);
}
- private _renderAmount(amount: BigNumber, decimals: number, symbol: string) {
- const unitAmount = ZeroEx.toUnitAmount(amount, decimals);
- const formattedAmount = unitAmount.toPrecision(TOKEN_AMOUNT_DISPLAY_PRECISION);
- const result = `${formattedAmount} ${symbol}`;
- return <div style={styles.amountLabel}>{result}</div>;
- }
- private _renderTokenIcon(token: Token, tokenLink?: string) {
- const tooltipId = `tooltip-${token.address}`;
- const tokenIcon = <TokenIcon token={token} diameter={ICON_DIMENSION} />;
- if (_.isUndefined(tokenLink)) {
- return tokenIcon;
- } else {
+ private _renderAmount(
+ amount: BigNumber,
+ decimals: number,
+ symbol: string,
+ isLoading: boolean = false,
+ ): React.ReactNode {
+ if (isLoading) {
return (
- <a href={tokenLink} target="_blank" style={{ textDecoration: 'none' }}>
- {tokenIcon}
- </a>
+ <PlaceHolder hideChildren={isLoading} fillColor={PLACEHOLDER_COLOR}>
+ <Text fontSize="16px" fontWeight="bold" lineHeight="1em">
+ 0.00 XXX
+ </Text>
+ </PlaceHolder>
);
+ } else {
+ return <Balance amount={amount} decimals={decimals} symbol={symbol} />;
}
}
- private _renderWrappedEtherButton(wrappedEtherDirection: Side) {
+ private _renderValue(
+ amount: BigNumber,
+ decimals: number,
+ price?: BigNumber,
+ isLoading: boolean = false,
+ ): React.ReactNode {
+ const result = !isLoading
+ ? _.isUndefined(price)
+ ? '--'
+ : utils.getUsdValueFormattedAmount(amount, decimals, price)
+ : '$0.00';
+ return (
+ <PlaceHolder hideChildren={isLoading} fillColor={PLACEHOLDER_COLOR}>
+ <Text fontSize="14px" fontColor={colors.darkGrey} lineHeight="1em">
+ {result}
+ </Text>
+ </PlaceHolder>
+ );
+ }
+ private _renderWrappedEtherButton(wrappedEtherDirection: Side): React.ReactNode {
const isWrappedEtherDirectionOpen = this.state.wrappedEtherDirection === wrappedEtherDirection;
let buttonLabel;
- let buttonIcon;
+ let buttonIconName;
if (isWrappedEtherDirectionOpen) {
buttonLabel = 'cancel';
- buttonIcon = <Close />;
+ buttonIconName = 'zmdi-close';
} else {
switch (wrappedEtherDirection) {
case Side.Deposit:
buttonLabel = 'wrap';
- buttonIcon = <NavigationArrowDownward />;
+ buttonIconName = 'zmdi-long-arrow-down';
break;
case Side.Receive:
buttonLabel = 'unwrap';
- buttonIcon = <NavigationArrowUpward />;
+ buttonIconName = 'zmdi-long-arrow-up';
break;
default:
- throw utils.spawnSwitchErr('wrappedEtherDirection', wrappedEtherDirection);
+ throw errorUtils.spawnSwitchErr('wrappedEtherDirection', wrappedEtherDirection);
}
}
const onClick = isWrappedEtherDirectionOpen
- ? this._closeWrappedEtherActionRow.bind(this)
+ ? this._closeWrappedEtherActionRow.bind(this, wrappedEtherDirection)
: this._openWrappedEtherActionRow.bind(this, wrappedEtherDirection);
return (
- <FlatButton
- label={buttonLabel}
- labelPosition="after"
- primary={true}
- icon={buttonIcon}
- labelStyle={styles.wrappedEtherOpenButtonLabel}
- onClick={onClick}
- />
- );
- }
- private _getInitialTrackedTokenStateByAddress(trackedTokens: Token[]) {
- const trackedTokenStateByAddress: TokenStateByAddress = {};
- _.each(trackedTokens, token => {
- trackedTokenStateByAddress[token.address] = {
- balance: new BigNumber(0),
- allowance: new BigNumber(0),
- isLoaded: false,
- };
- });
- return trackedTokenStateByAddress;
- }
- private async _fetchBalancesAndAllowancesAsync(tokenAddresses: string[]) {
- const trackedTokenStateByAddress = this.state.trackedTokenStateByAddress;
- const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
- for (const tokenAddress of tokenAddresses) {
- const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync(
- userAddressIfExists,
- tokenAddress,
- );
- trackedTokenStateByAddress[tokenAddress] = {
- balance,
- allowance,
- isLoaded: true,
- };
- }
- if (!this._isUnmounted) {
- this.setState({
- trackedTokenStateByAddress,
- });
- }
- }
- private async _refetchTokenStateAsync(tokenAddress: string) {
- const userAddressIfExists = _.isEmpty(this.props.userAddress) ? undefined : this.props.userAddress;
- const [balance, allowance] = await this.props.blockchain.getTokenBalanceAndAllowanceAsync(
- userAddressIfExists,
- tokenAddress,
+ <IconButton iconName={buttonIconName} labelText={buttonLabel} onClick={onClick} color={colors.mediumBlue} />
);
- this.setState({
- trackedTokenStateByAddress: {
- ...this.state.trackedTokenStateByAddress,
- [tokenAddress]: {
- balance,
- allowance,
- isLoaded: true,
- },
- },
- });
}
- private _openWrappedEtherActionRow(wrappedEtherDirection: Side) {
+ private _openWrappedEtherActionRow(wrappedEtherDirection: Side): void {
+ const action =
+ wrappedEtherDirection === Side.Deposit ? 'Wallet - Wrap ETH Opened' : 'Wallet - Unwrap WETH Opened';
+ analytics.track(action);
this.setState({
wrappedEtherDirection,
});
}
- private _closeWrappedEtherActionRow() {
+ private _closeWrappedEtherActionRow(wrappedEtherDirection: Side): void {
+ const action =
+ wrappedEtherDirection === Side.Deposit ? 'Wallet - Wrap ETH Closed' : 'Wallet - Unwrap WETH Closed';
+ analytics.track(action);
this.setState({
wrappedEtherDirection: undefined,
});
}
- private _getEthToken() {
- const tokens = _.values(this.props.tokenByAddress);
- const etherToken = _.find(tokens, { symbol: ETHER_TOKEN_SYMBOL });
- return etherToken;
+ private _getEthToken(): Token {
+ return utils.getEthToken(this.props.tokenByAddress);
+ }
+ private _isBlockchainReady(): boolean {
+ return this.props.blockchainIsLoaded && !_.isUndefined(this.props.blockchain);
+ }
+ private _getAccountState(): AccountState {
+ return utils.getAccountState(
+ this._isBlockchainReady(),
+ this.props.providerType,
+ this.props.injectedProviderName,
+ this.props.userAddress,
+ );
}
}
+
+// tslint:disable:max-file-line-count
diff --git a/packages/website/ts/components/wallet/wallet_disconnected_item.tsx b/packages/website/ts/components/wallet/wallet_disconnected_item.tsx
deleted file mode 100644
index 89e32f7be..000000000
--- a/packages/website/ts/components/wallet/wallet_disconnected_item.tsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import { colors, Styles } from '@0xproject/react-shared';
-import FlatButton from 'material-ui/FlatButton';
-import ActionAccountBalanceWallet from 'material-ui/svg-icons/action/account-balance-wallet';
-import * as React from 'react';
-
-import { ProviderType } from 'ts/types';
-import { constants } from 'ts/utils/constants';
-
-export interface WalletDisconnectedItemProps {
- providerType: ProviderType;
- injectedProviderName: string;
- onToggleLedgerDialog: () => void;
-}
-
-const styles: Styles = {
- button: {
- border: colors.walletBorder,
- borderStyle: 'solid',
- borderWidth: 1,
- height: 80,
- },
- hrefAdjustment: {
- paddingTop: 20, // HACK: For some reason when we set the href prop of a FlatButton material-ui reduces the top padding
- },
- otherWalletText: {
- fontSize: 14,
- color: colors.grey500,
- textDecoration: 'underline',
- },
-};
-
-const ITEM_HEIGHT = 292;
-const METAMASK_ICON_WIDTH = 35;
-const LEDGER_ICON_WIDTH = 30;
-const BUTTON_BOTTOM_PADDING = 80;
-
-export const WalletDisconnectedItem: React.StatelessComponent<WalletDisconnectedItemProps> = (
- props: WalletDisconnectedItemProps,
-) => {
- const isExternallyInjectedProvider =
- props.providerType === ProviderType.Injected && props.injectedProviderName !== '0x Public';
- return (
- <div className="flex flex-center">
- <div className="mx-auto">
- <div className="table" style={{ height: ITEM_HEIGHT }}>
- <div className="table-cell align-middle">
- <ProviderButton isExternallyInjectedProvider={isExternallyInjectedProvider} />
- <div className="flex flex-center py2" style={{ paddingBottom: BUTTON_BOTTOM_PADDING }}>
- <div className="mx-auto">
- <div onClick={props.onToggleLedgerDialog} style={{ cursor: 'pointer' }}>
- <img src="/images/ledger_icon.png" style={{ width: LEDGER_ICON_WIDTH }} />
- <span className="px1" style={styles.otherWalletText}>
- user other wallet
- </span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- );
-};
-
-interface ProviderButtonProps {
- isExternallyInjectedProvider: boolean;
-}
-
-const ProviderButton: React.StatelessComponent<ProviderButtonProps> = (props: ProviderButtonProps) => (
- <FlatButton
- label={props.isExternallyInjectedProvider ? 'Please unlock account' : 'Get Metamask Wallet Extension'}
- labelStyle={{ color: colors.black }}
- labelPosition="after"
- primary={true}
- icon={<img src="/images/metamask_icon.png" width={METAMASK_ICON_WIDTH.toString()} />}
- style={props.isExternallyInjectedProvider ? styles.button : { ...styles.button, ...styles.hrefAdjustment }}
- href={props.isExternallyInjectedProvider ? undefined : constants.URL_METAMASK_CHROME_STORE}
- target={props.isExternallyInjectedProvider ? undefined : '_blank'}
- disabled={props.isExternallyInjectedProvider}
- />
-);
diff --git a/packages/website/ts/components/wallet/wrap_ether_item.tsx b/packages/website/ts/components/wallet/wrap_ether_item.tsx
index 3a876721a..54ace7ae2 100644
--- a/packages/website/ts/components/wallet/wrap_ether_item.tsx
+++ b/packages/website/ts/components/wallet/wrap_ether_item.tsx
@@ -1,20 +1,21 @@
-import { ZeroEx } from '0x.js';
-import { colors, Styles } from '@0xproject/react-shared';
+import { Styles } from '@0xproject/react-shared';
import { BigNumber, logUtils } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
import * as _ from 'lodash';
import FlatButton from 'material-ui/FlatButton';
-import { ListItem } from 'material-ui/List';
import * as React from 'react';
import { Blockchain } from 'ts/blockchain';
-import { EthAmountInput } from 'ts/components/inputs/eth_amount_input';
import { TokenAmountInput } from 'ts/components/inputs/token_amount_input';
+import { Container } from 'ts/components/ui/container';
+import { EthAmountInput } from 'ts/containers/inputs/eth_amount_input';
import { Dispatcher } from 'ts/redux/dispatcher';
+import { colors } from 'ts/style/colors';
import { BlockchainCallErrs, Side, Token } from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
import { constants } from 'ts/utils/constants';
import { errorReporter } from 'ts/utils/error_reporter';
import { utils } from 'ts/utils/utils';
-import { styles as walletItemStyles } from 'ts/utils/wallet_item_styles';
export interface WrapEtherItemProps {
userAddress: string;
@@ -31,12 +32,15 @@ export interface WrapEtherItemProps {
interface WrapEtherItemState {
currentInputAmount?: BigNumber;
- currentInputHasErrors: boolean;
isEthConversionHappening: boolean;
+ errorMsg: React.ReactNode;
}
const styles: Styles = {
- topLabel: { color: colors.black, fontSize: 11 },
+ topLabel: {
+ color: colors.black,
+ fontSize: 11,
+ },
inputContainer: {
backgroundColor: colors.white,
borderBottomRightRadius: 3,
@@ -44,15 +48,33 @@ const styles: Styles = {
borderTopRightRadius: 3,
borderTopLeftRadius: 3,
padding: 4,
- width: 125,
},
- ethAmountInput: { height: 32 },
- innerDiv: { paddingLeft: 60, paddingTop: 0 },
- wrapEtherConfirmationButtonContainer: { width: 128, top: 16 },
+ amountInput: {
+ height: 34,
+ },
+ amountInputLabel: {
+ paddingTop: 10,
+ paddingRight: 10,
+ paddingLeft: 5,
+ color: colors.grey,
+ fontSize: 14,
+ },
+ amountInputHint: {
+ bottom: 18,
+ },
wrapEtherConfirmationButtonLabel: {
- fontSize: 10,
+ fontSize: 12,
color: colors.white,
},
+ errorMsg: {
+ fontSize: 12,
+ marginTop: 4,
+ color: colors.red,
+ minHeight: 20,
+ },
+ conversionSpinner: {
+ paddingTop: 26,
+ },
};
export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEtherItemState> {
@@ -60,23 +82,22 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
super(props);
this.state = {
currentInputAmount: undefined,
- currentInputHasErrors: false,
isEthConversionHappening: false,
+ errorMsg: null,
};
}
- public render() {
- const etherBalanceInEth = ZeroEx.toUnitAmount(this.props.userEtherBalanceInWei, constants.DECIMAL_PLACES_ETH);
+ public render(): React.ReactNode {
const isWrappingEth = this.props.direction === Side.Deposit;
const topLabelText = isWrappingEth ? 'Convert ETH into WETH 1:1' : 'Convert WETH into ETH 1:1';
return (
- <ListItem
- primaryText={
- <div>
- <div style={styles.topLabel}>{topLabelText}</div>
+ <Container className="flex" backgroundColor={colors.walletFocusedItemBackground} paddingTop="25px">
+ <div>{this._renderIsEthConversionHappeningSpinner()} </div>
+ <div className="flex flex-column">
+ <div style={styles.topLabel}>{topLabelText}</div>
+ <div className="flex items-center">
<div style={styles.inputContainer}>
{isWrappingEth ? (
<EthAmountInput
- balance={etherBalanceInEth}
amount={this.state.currentInputAmount}
hintText="0.00"
onChange={this._onValueChange.bind(this)}
@@ -84,7 +105,10 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
shouldShowIncompleteErrs={false}
shouldShowErrs={false}
shouldShowUnderline={false}
- style={styles.ethAmountInput}
+ style={styles.amountInput}
+ labelStyle={styles.amountInputLabel}
+ inputHintStyle={styles.amountInputHint}
+ onErrorMsgChange={this._onErrorMsgChange.bind(this)}
/>
) : (
<TokenAmountInput
@@ -99,66 +123,82 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
onChange={this._onValueChange.bind(this)}
amount={this.state.currentInputAmount}
hintText="0.00"
- shouldShowErrs={false} // TODO: error handling
+ shouldShowErrs={false}
shouldShowUnderline={false}
- style={styles.ethAmountInput}
+ style={styles.amountInput}
+ labelStyle={styles.amountInputLabel}
+ inputHintStyle={styles.amountInputHint}
+ onErrorMsgChange={this._onErrorMsgChange.bind(this)}
/>
)}
</div>
+ <div>{this._renderWrapEtherConfirmationButton()}</div>
</div>
- }
- secondaryTextLines={2}
- disableTouchRipple={true}
- style={walletItemStyles.focusedItem}
- innerDivStyle={styles.innerDiv}
- leftIcon={this.state.isEthConversionHappening && this._renderIsEthConversionHappeningSpinner()}
- rightAvatar={this._renderWrapEtherConfirmationButton()}
- />
+
+ {this._renderErrorMsg()}
+ </div>
+ </Container>
);
}
- private _onValueChange(isValid: boolean, amount?: BigNumber) {
+ private _onValueChange(_isValid: boolean, amount?: BigNumber): void {
this.setState({
currentInputAmount: amount,
- currentInputHasErrors: !isValid,
});
}
- private _renderIsEthConversionHappeningSpinner() {
+ private _onErrorMsgChange(errorMsg: React.ReactNode): void {
+ this.setState({
+ errorMsg,
+ });
+ }
+ private _renderIsEthConversionHappeningSpinner(): React.ReactElement<{}> {
+ const visibility = this.state.isEthConversionHappening ? 'visible' : 'hidden';
+ const style: React.CSSProperties = { ...styles.conversionSpinner, visibility };
return (
- <div className="pl1" style={{ paddingTop: 10 }}>
+ <div className="pl3 pr2" style={style}>
<i className="zmdi zmdi-spinner zmdi-hc-spin" />
</div>
);
}
- private _renderWrapEtherConfirmationButton() {
+ private _renderWrapEtherConfirmationButton(): React.ReactElement<{}> {
const isWrappingEth = this.props.direction === Side.Deposit;
const labelText = isWrappingEth ? 'wrap' : 'unwrap';
return (
- <div style={styles.wrapEtherConfirmationButtonContainer}>
+ <div className="pl1 pr3">
<FlatButton
backgroundColor={colors.wrapEtherConfirmationButton}
label={labelText}
+ style={{ zIndex: 0 }}
labelStyle={styles.wrapEtherConfirmationButtonLabel}
- onClick={this._wrapEtherConfirmationAction.bind(this)}
+ onClick={this._wrapEtherConfirmationActionAsync.bind(this)}
disabled={this.state.isEthConversionHappening}
/>
</div>
);
}
- private async _wrapEtherConfirmationAction() {
+ private _renderErrorMsg(): React.ReactNode {
+ return <div style={styles.errorMsg}>{this.state.errorMsg}</div>;
+ }
+ private async _wrapEtherConfirmationActionAsync(): Promise<void> {
this.setState({
isEthConversionHappening: true,
});
+ const etherToken = this.props.etherToken;
+ const amountToConvert = this.state.currentInputAmount;
+ const ethAmount = Web3Wrapper.toUnitAmount(amountToConvert, constants.DECIMAL_PLACES_ETH).toString();
+ const tokenAmount = Web3Wrapper.toUnitAmount(amountToConvert, etherToken.decimals).toString();
try {
- const etherToken = this.props.etherToken;
- const amountToConvert = this.state.currentInputAmount;
if (this.props.direction === Side.Deposit) {
await this.props.blockchain.convertEthToWrappedEthTokensAsync(etherToken.address, amountToConvert);
- const ethAmount = ZeroEx.toUnitAmount(amountToConvert, constants.DECIMAL_PLACES_ETH);
- this.props.dispatcher.showFlashMessage(`Successfully wrapped ${ethAmount.toString()} ETH to WETH`);
+ this.props.dispatcher.showFlashMessage(`Successfully wrapped ${ethAmount} ETH to WETH`);
+ analytics.track('Wrap ETH Success', {
+ amount: ethAmount,
+ });
} else {
await this.props.blockchain.convertWrappedEthTokensToEthAsync(etherToken.address, amountToConvert);
- const tokenAmount = ZeroEx.toUnitAmount(amountToConvert, etherToken.decimals);
- this.props.dispatcher.showFlashMessage(`Successfully unwrapped ${tokenAmount.toString()} WETH to ETH`);
+ this.props.dispatcher.showFlashMessage(`Successfully unwrapped ${tokenAmount} WETH to ETH`);
+ analytics.track('Unwrap WETH Success', {
+ amount: tokenAmount,
+ });
}
await this.props.refetchEthTokenStateAsync();
this.props.onConversionSuccessful();
@@ -169,12 +209,18 @@ export class WrapEtherItem extends React.Component<WrapEtherItemProps, WrapEther
} else if (!utils.didUserDenyWeb3Request(errMsg)) {
logUtils.log(`Unexpected error encountered: ${err}`);
logUtils.log(err.stack);
- const errorMsg =
- this.props.direction === Side.Deposit
- ? 'Failed to wrap your ETH. Please try again.'
- : 'Failed to unwrap your WETH. Please try again.';
- this.props.dispatcher.showFlashMessage(errorMsg);
- await errorReporter.reportAsync(err);
+ if (this.props.direction === Side.Deposit) {
+ this.props.dispatcher.showFlashMessage('Failed to wrap your ETH. Please try again.');
+ analytics.track('Wrap ETH Failure', {
+ amount: ethAmount,
+ });
+ } else {
+ this.props.dispatcher.showFlashMessage('Failed to unwrap your WETH. Please try again.');
+ analytics.track('Unwrap WETH Failed', {
+ amount: tokenAmount,
+ });
+ }
+ errorReporter.report(err);
}
}
this.setState({
diff --git a/packages/website/ts/containers/about.ts b/packages/website/ts/containers/about.ts
index ce8fd3afb..3b1c99d79 100644
--- a/packages/website/ts/containers/about.ts
+++ b/packages/website/ts/containers/about.ts
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
@@ -15,7 +14,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: AboutProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: AboutProps): ConnectedState => ({
translate: state.translate,
});
diff --git a/packages/website/ts/containers/connect_documentation.ts b/packages/website/ts/containers/connect_documentation.ts
index bd6821d19..abf419347 100644
--- a/packages/website/ts/containers/connect_documentation.ts
+++ b/packages/website/ts/containers/connect_documentation.ts
@@ -1,19 +1,17 @@
import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { DocPackages } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/connect/introduction');
-const InstallationMarkdown = require('md/docs/connect/installation');
+const IntroMarkdownV1 = require('md/docs/connect/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/connect/1.0.0/installation');
/* tslint:enable:no-var-requires */
const connectDocSections = {
@@ -36,14 +34,16 @@ const docsInfoConfig: DocsInfoConfig = {
webSocketOrderbookChannel: [connectDocSections.webSocketOrderbookChannel],
types: [connectDocSections.types],
},
- sectionNameToMarkdown: {
- [connectDocSections.introduction]: IntroMarkdown,
- [connectDocSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [connectDocSections.introduction]: IntroMarkdownV1,
+ [connectDocSections.installation]: InstallationMarkdownV1,
+ },
},
sectionNameToModulePath: {
[connectDocSections.httpClient]: ['"src/http_client"'],
[connectDocSections.webSocketOrderbookChannel]: ['"src/ws_orderbook_channel"'],
- [connectDocSections.types]: ['"src/types"'],
+ [connectDocSections.types]: ['"src/types"', '"types/src/index"'],
},
menuSubsectionToVersionWhenIntroduced: {},
sections: connectDocSections,
@@ -91,7 +91,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/deployer_documentation.ts b/packages/website/ts/containers/deployer_documentation.ts
deleted file mode 100644
index 4e1c41f8c..000000000
--- a/packages/website/ts/containers/deployer_documentation.ts
+++ /dev/null
@@ -1,102 +0,0 @@
-import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
-import * as React from 'react';
-import { connect } from 'react-redux';
-import { Dispatch } from 'redux';
-import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
-import { Dispatcher } from 'ts/redux/dispatcher';
-import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
-import { constants } from 'ts/utils/constants';
-import { Translate } from 'ts/utils/translate';
-
-/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/deployer/introduction');
-const InstallationMarkdown = require('md/docs/deployer/installation');
-const UsageMarkdown = require('md/docs/deployer/usage');
-/* tslint:enable:no-var-requires */
-
-const docSections = {
- introduction: 'introduction',
- installation: 'installation',
- usage: 'usage',
- compiler: 'compiler',
- deployer: 'deployer',
- types: docConstants.TYPES_SECTION_NAME,
-};
-
-const docsInfoConfig: DocsInfoConfig = {
- id: DocPackages.Deployer,
- type: SupportedDocJson.TypeDoc,
- displayName: 'Deployer',
- packageUrl: 'https://github.com/0xProject/0x-monorepo',
- menu: {
- introduction: [docSections.introduction],
- install: [docSections.installation],
- usage: [docSections.usage],
- compiler: [docSections.compiler],
- deployer: [docSections.deployer],
- types: [docSections.types],
- },
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.usage]: UsageMarkdown,
- },
- sectionNameToModulePath: {
- [docSections.compiler]: ['"deployer/src/compiler"'],
- [docSections.deployer]: ['"deployer/src/deployer"'],
- [docSections.types]: ['"deployer/src/utils/types"', '"types/src/index"'],
- },
- menuSubsectionToVersionWhenIntroduced: {},
- sections: docSections,
- visibleConstructors: [docSections.compiler, docSections.deployer],
- typeConfigs: {
- // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is
- // currently no way to extract the re-exported types from index.ts via TypeDoc :(
- publicTypes: [
- 'CompilerOptions',
- 'DeployerOptions',
- 'BaseDeployerOptions',
- 'UrlDeployerOptions',
- 'ProviderDeployerOptions',
- 'TxData',
- ],
- typeNameToExternalLink: {
- Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API',
- BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127',
- ContractInstance: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L98',
- },
- typeNameToPrefix: {
- ContractInstance: 'Web3',
- },
- },
-};
-const docsInfo = new DocsInfo(docsInfoConfig);
-
-interface ConnectedState {
- docsVersion: string;
- availableDocVersions: string[];
- docsInfo: DocsInfo;
- translate: Translate;
-}
-
-interface ConnectedDispatch {
- dispatcher: Dispatcher;
-}
-
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
- docsVersion: state.docsVersion,
- availableDocVersions: state.availableDocVersions,
- translate: state.translate,
- docsInfo,
-});
-
-const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
- dispatcher: new Dispatcher(dispatch),
-});
-
-export const Documentation: React.ComponentClass<DocPageProps> = connect(mapStateToProps, mapDispatchToProps)(
- DocPageComponent,
-);
diff --git a/packages/website/ts/containers/ethereum_types_documentation.ts b/packages/website/ts/containers/ethereum_types_documentation.ts
new file mode 100644
index 000000000..0be8dd3bc
--- /dev/null
+++ b/packages/website/ts/containers/ethereum_types_documentation.ts
@@ -0,0 +1,124 @@
+import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { State } from 'ts/redux/reducer';
+import { DocPackages } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+import { Translate } from 'ts/utils/translate';
+
+/* tslint:disable:no-var-requires */
+const IntroMarkdown = require('md/docs/ethereum_types/introduction');
+const InstallationMarkdown = require('md/docs/ethereum_types/installation');
+/* tslint:enable:no-var-requires */
+
+const docSections = {
+ introduction: 'introduction',
+ installation: 'installation',
+ types: docConstants.TYPES_SECTION_NAME,
+};
+
+const docsInfoConfig: DocsInfoConfig = {
+ id: DocPackages.EthereumTypes,
+ type: SupportedDocJson.TypeDoc,
+ displayName: 'Ethereum Types',
+ packageUrl: 'https://github.com/0xProject/0x-monorepo/packages/ethereum-types',
+ menu: {
+ introduction: [docSections.introduction],
+ install: [docSections.installation],
+ types: [docSections.types],
+ },
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdown,
+ [docSections.installation]: InstallationMarkdown,
+ },
+ },
+ sectionNameToModulePath: {
+ [docSections.types]: ['"index"'],
+ },
+ visibleConstructors: [],
+ menuSubsectionToVersionWhenIntroduced: {},
+ sections: docSections,
+ typeConfigs: {
+ // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is
+ // currently no way to extract the re-exported types from index.ts via TypeDoc :(
+ publicTypes: [
+ 'Provider',
+ 'JSONRPCErrorCallback',
+ 'Provider',
+ 'ContractAbi',
+ 'AbiDefinition',
+ 'FunctionAbi',
+ 'ConstructorStateMutability',
+ 'StateMutability',
+ 'MethodAbi',
+ 'ConstructorAbi',
+ 'FallbackAbi',
+ 'EventParameter',
+ 'EventAbi',
+ 'DataItem',
+ 'OpCode',
+ // 'StructLog', // TODO: This type breaks the docs so we don't render it for now
+ 'TransactionTrace',
+ 'Unit',
+ 'JSONRPCRequestPayload',
+ 'JSONRPCResponsePayload',
+ 'BlockWithoutTransactionData',
+ 'BlockWithTransactionData',
+ 'Transaction',
+ 'TxData',
+ 'CallData',
+ 'FilterObject',
+ 'LogTopic',
+ 'DecodedLogEntry',
+ 'DecodedLogEntryEvent',
+ 'LogEntryEvent',
+ 'LogEntry',
+ 'TxDataPayable',
+ 'TransactionReceipt',
+ 'AbiType',
+ 'ContractEventArg',
+ 'DecodedLogArgs',
+ 'LogWithDecodedArgs',
+ 'RawLog',
+ 'BlockParamLiteral',
+ 'BlockParam',
+ 'RawLogEntry',
+ 'SolidityTypes',
+ 'TransactionReceiptWithDecodedLogs',
+ ],
+ typeNameToExternalLink: {
+ BigNumber: constants.URL_BIGNUMBERJS_GITHUB,
+ },
+ },
+};
+const docsInfo = new DocsInfo(docsInfoConfig);
+
+interface ConnectedState {
+ docsVersion: string;
+ availableDocVersions: string[];
+ docsInfo: DocsInfo;
+ translate: Translate;
+}
+
+interface ConnectedDispatch {
+ dispatcher: Dispatcher;
+}
+
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
+ docsVersion: state.docsVersion,
+ availableDocVersions: state.availableDocVersions,
+ translate: state.translate,
+ docsInfo,
+});
+
+const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ dispatcher: new Dispatcher(dispatch),
+});
+
+export const Documentation: React.ComponentClass<DocPageProps> = connect(mapStateToProps, mapDispatchToProps)(
+ DocPageComponent,
+);
diff --git a/packages/website/ts/containers/faq.ts b/packages/website/ts/containers/faq.ts
index b539e33c9..a2b5735f6 100644
--- a/packages/website/ts/containers/faq.ts
+++ b/packages/website/ts/containers/faq.ts
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
@@ -15,7 +14,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: FAQProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: FAQProps): ConnectedState => ({
translate: state.translate,
});
diff --git a/packages/website/ts/containers/generate_order_form.ts b/packages/website/ts/containers/generate_order_form.ts
index 8c5deb690..92296dbab 100644
--- a/packages/website/ts/containers/generate_order_form.ts
+++ b/packages/website/ts/containers/generate_order_form.ts
@@ -1,6 +1,5 @@
-import { ECSignature } from '0x.js';
+import { ECSignature } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Blockchain } from 'ts/blockchain';
@@ -13,6 +12,8 @@ interface GenerateOrderFormProps {
blockchain: Blockchain;
hashData: HashData;
dispatcher: Dispatcher;
+ isFullWidth?: boolean;
+ shouldHideHeader?: boolean;
}
interface ConnectedState {
@@ -29,7 +30,7 @@ interface ConnectedState {
lastForceTokenStateRefetch: number;
}
-const mapStateToProps = (state: State, ownProps: GenerateOrderFormProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: GenerateOrderFormProps): ConnectedState => ({
blockchainErr: state.blockchainErr,
blockchainIsLoaded: state.blockchainIsLoaded,
orderExpiryTimestamp: state.orderExpiryTimestamp,
diff --git a/packages/website/ts/containers/inputs/allowance_state_toggle.ts b/packages/website/ts/containers/inputs/allowance_state_toggle.ts
new file mode 100644
index 000000000..70712685e
--- /dev/null
+++ b/packages/website/ts/containers/inputs/allowance_state_toggle.ts
@@ -0,0 +1,42 @@
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { Blockchain } from 'ts/blockchain';
+import { PointerDirection } from 'ts/components/ui/pointer';
+import { State } from 'ts/redux/reducer';
+import { BalanceErrs, Token, TokenState } from 'ts/types';
+
+import { AllowanceStateToggle as AllowanceStateToggleComponent } from 'ts/components/inputs/allowance_state_toggle';
+import { Dispatcher } from 'ts/redux/dispatcher';
+
+interface AllowanceStateToggleProps {
+ blockchain: Blockchain;
+ onErrorOccurred?: (errType: BalanceErrs) => void;
+ token: Token;
+ tokenState: TokenState;
+ refetchTokenStateAsync: () => Promise<void>;
+ tooltipDirection?: PointerDirection;
+}
+
+interface ConnectedState {
+ networkId: number;
+ userAddress: string;
+}
+
+interface ConnectedDispatch {
+ dispatcher: Dispatcher;
+}
+
+const mapStateToProps = (state: State, _ownProps: AllowanceStateToggleProps): ConnectedState => ({
+ networkId: state.networkId,
+ userAddress: state.userAddress,
+});
+
+const mapDispatchTopProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ dispatcher: new Dispatcher(dispatch),
+});
+
+export const AllowanceStateToggle: React.ComponentClass<AllowanceStateToggleProps> = connect(
+ mapStateToProps,
+ mapDispatchTopProps,
+)(AllowanceStateToggleComponent);
diff --git a/packages/website/ts/containers/inputs/eth_amount_input.ts b/packages/website/ts/containers/inputs/eth_amount_input.ts
new file mode 100644
index 000000000..9ef903b55
--- /dev/null
+++ b/packages/website/ts/containers/inputs/eth_amount_input.ts
@@ -0,0 +1,36 @@
+import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { State } from 'ts/redux/reducer';
+import { ValidatedBigNumberCallback } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+
+import { EthAmountInput as EthAmountInputComponent } from 'ts/components/inputs/eth_amount_input';
+
+interface EthAmountInputProps {
+ label?: string;
+ amount?: BigNumber;
+ hintText?: string;
+ onChange: ValidatedBigNumberCallback;
+ onErrorMsgChange?: (errorMsg: React.ReactNode) => void;
+ shouldShowIncompleteErrs: boolean;
+ shouldCheckBalance: boolean;
+ shouldShowErrs?: boolean;
+ shouldShowUnderline?: boolean;
+ style?: React.CSSProperties;
+ labelStyle?: React.CSSProperties;
+ inputHintStyle?: React.CSSProperties;
+}
+
+interface ConnectedState {
+ balance: BigNumber;
+}
+
+const mapStateToProps = (state: State, _ownProps: EthAmountInputProps): ConnectedState => ({
+ balance: Web3Wrapper.toUnitAmount(state.userEtherBalanceInWei, constants.DECIMAL_PLACES_ETH),
+});
+
+export const EthAmountInput: React.ComponentClass<EthAmountInputProps> = connect(mapStateToProps)(
+ EthAmountInputComponent,
+);
diff --git a/packages/website/ts/containers/jobs.ts b/packages/website/ts/containers/jobs.ts
new file mode 100644
index 000000000..b18485882
--- /dev/null
+++ b/packages/website/ts/containers/jobs.ts
@@ -0,0 +1,28 @@
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { Jobs as JobsComponent, JobsProps } from 'ts/pages/jobs/jobs';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { State } from 'ts/redux/reducer';
+import { ScreenWidths } from 'ts/types';
+import { Translate } from 'ts/utils/translate';
+
+interface ConnectedState {
+ translate: Translate;
+ screenWidth: ScreenWidths;
+}
+
+interface ConnectedDispatch {
+ dispatcher: Dispatcher;
+}
+
+const mapStateToProps = (state: State, _ownProps: JobsProps): ConnectedState => ({
+ translate: state.translate,
+ screenWidth: state.screenWidth,
+});
+
+const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ dispatcher: new Dispatcher(dispatch),
+});
+
+export const Jobs: React.ComponentClass<JobsProps> = connect(mapStateToProps, mapDispatchToProps)(JobsComponent);
diff --git a/packages/website/ts/containers/json_schemas_documentation.ts b/packages/website/ts/containers/json_schemas_documentation.ts
index 154c65ffc..523777114 100644
--- a/packages/website/ts/containers/json_schemas_documentation.ts
+++ b/packages/website/ts/containers/json_schemas_documentation.ts
@@ -1,21 +1,18 @@
-import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
+import { DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
-import { constants } from 'ts/utils/constants';
+import { DocPackages } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/json_schemas/introduction');
-const InstallationMarkdown = require('md/docs/json_schemas/installation');
-const UsageMarkdown = require('md/docs/json_schemas/usage');
-const SchemasMarkdown = require('md/docs/json_schemas/schemas');
+const IntroMarkdownV1 = require('md/docs/json_schemas/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/json_schemas/1.0.0/installation');
+const UsageMarkdownV1 = require('md/docs/json_schemas/1.0.0/usage');
+const SchemasMarkdownV1 = require('md/docs/json_schemas/1.0.0/schemas');
/* tslint:enable:no-var-requires */
const docSections = {
@@ -38,11 +35,13 @@ const docsInfoConfig: DocsInfoConfig = {
schemaValidator: [docSections.schemaValidator],
schemas: [docSections.schemas],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.schemas]: SchemasMarkdown,
- [docSections.usage]: UsageMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.schemas]: SchemasMarkdownV1,
+ [docSections.usage]: UsageMarkdownV1,
+ },
},
sectionNameToModulePath: {
[docSections.schemaValidator]: ['"json-schemas/src/schema_validator"'],
@@ -73,7 +72,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/landing.ts b/packages/website/ts/containers/landing.ts
index a620bb12e..972ed4c23 100644
--- a/packages/website/ts/containers/landing.ts
+++ b/packages/website/ts/containers/landing.ts
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
@@ -15,7 +14,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: LandingProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: LandingProps): ConnectedState => ({
translate: state.translate,
});
diff --git a/packages/website/ts/containers/not_found.ts b/packages/website/ts/containers/not_found.ts
index dd151e2c8..f384dab89 100644
--- a/packages/website/ts/containers/not_found.ts
+++ b/packages/website/ts/containers/not_found.ts
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
@@ -15,7 +14,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: NotFoundProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: NotFoundProps): ConnectedState => ({
translate: state.translate,
});
diff --git a/packages/website/ts/containers/order_utils_documentation.ts b/packages/website/ts/containers/order_utils_documentation.ts
new file mode 100644
index 000000000..c6570f514
--- /dev/null
+++ b/packages/website/ts/containers/order_utils_documentation.ts
@@ -0,0 +1,99 @@
+import { DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { State } from 'ts/redux/reducer';
+import { DocPackages } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+import { Translate } from 'ts/utils/translate';
+
+/* tslint:disable:no-var-requires */
+const IntroMarkdownV1 = require('md/docs/order_utils/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/order_utils/1.0.0/installation');
+/* tslint:enable:no-var-requires */
+
+const docSections = {
+ introduction: 'introduction',
+ installation: 'installation',
+ usage: 'usage',
+ types: 'types',
+};
+
+const docsInfoConfig: DocsInfoConfig = {
+ id: DocPackages.OrderUtils,
+ type: SupportedDocJson.TypeDoc,
+ displayName: 'Order utils',
+ packageUrl: 'https://github.com/0xProject/0x-monorepo',
+ menu: {
+ introduction: [docSections.introduction],
+ install: [docSections.installation],
+ usage: [docSections.usage],
+ types: [docSections.types],
+ },
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ },
+ },
+ sectionNameToModulePath: {
+ [docSections.usage]: [
+ '"order-utils/src/order_hash"',
+ '"order-utils/src/signature_utils"',
+ '"order-utils/src/order_factory"',
+ '"order-utils/src/salt"',
+ '"order-utils/src/assert"',
+ '"order-utils/src/constants"',
+ ],
+ [docSections.types]: ['"order-utils/src/types"', '"types/src/index"'],
+ },
+ menuSubsectionToVersionWhenIntroduced: {},
+ sections: docSections,
+ visibleConstructors: [],
+ typeConfigs: {
+ // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is
+ // currently no way to extract the re-exported types from index.ts via TypeDoc :(
+ publicTypes: [
+ 'OrderError',
+ 'Order',
+ 'SignedOrder',
+ 'ECSignature',
+ 'Provider',
+ 'JSONRPCRequestPayload',
+ 'JSONRPCResponsePayload',
+ 'JSONRPCErrorCallback',
+ ],
+ typeNameToExternalLink: {
+ BigNumber: constants.URL_BIGNUMBERJS_GITHUB,
+ },
+ },
+};
+const docsInfo = new DocsInfo(docsInfoConfig);
+
+interface ConnectedState {
+ docsVersion: string;
+ availableDocVersions: string[];
+ docsInfo: DocsInfo;
+ translate: Translate;
+}
+
+interface ConnectedDispatch {
+ dispatcher: Dispatcher;
+}
+
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
+ docsVersion: state.docsVersion,
+ availableDocVersions: state.availableDocVersions,
+ translate: state.translate,
+ docsInfo,
+});
+
+const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ dispatcher: new Dispatcher(dispatch),
+});
+
+export const Documentation: React.ComponentClass<DocPageProps> = connect(mapStateToProps, mapDispatchToProps)(
+ DocPageComponent,
+);
diff --git a/packages/website/ts/containers/portal.ts b/packages/website/ts/containers/portal.ts
index 725564ead..6747cdf4e 100644
--- a/packages/website/ts/containers/portal.ts
+++ b/packages/website/ts/containers/portal.ts
@@ -3,7 +3,7 @@ import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
-import { Portal as PortalComponent, PortalAllProps as PortalComponentAllProps } from 'ts/components/portal';
+import { Portal as PortalComponent, PortalProps as PortalComponentProps } from 'ts/components/portal/portal';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
import { BlockchainErrs, HashData, Order, ProviderType, ScreenWidths, Side, TokenByAddress } from 'ts/types';
@@ -21,20 +21,22 @@ interface ConnectedState {
providerType: ProviderType;
tokenByAddress: TokenByAddress;
lastForceTokenStateRefetch: number;
- userEtherBalanceInWei: BigNumber;
+ userEtherBalanceInWei?: BigNumber;
screenWidth: ScreenWidths;
shouldBlockchainErrDialogBeOpen: boolean;
userAddress: string;
userSuppliedOrderCache: Order;
flashMessage?: string | React.ReactNode;
translate: Translate;
+ isPortalOnboardingShowing: boolean;
+ portalOnboardingStep: number;
}
interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: PortalComponentAllProps): ConnectedState => {
+const mapStateToProps = (state: State, _ownProps: PortalComponentProps): ConnectedState => {
const receiveAssetToken = state.sideToAssetToken[Side.Receive];
const depositAssetToken = state.sideToAssetToken[Side.Deposit];
const receiveAddress = !_.isUndefined(receiveAssetToken.address)
@@ -76,6 +78,8 @@ const mapStateToProps = (state: State, ownProps: PortalComponentAllProps): Conne
userSuppliedOrderCache: state.userSuppliedOrderCache,
flashMessage: state.flashMessage,
translate: state.translate,
+ isPortalOnboardingShowing: state.isPortalOnboardingShowing,
+ portalOnboardingStep: state.portalOnboardingStep,
};
};
@@ -83,6 +87,6 @@ const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
dispatcher: new Dispatcher(dispatch),
});
-export const Portal: React.ComponentClass<PortalComponentAllProps> = connect(mapStateToProps, mapDispatchToProps)(
+export const Portal: React.ComponentClass<PortalComponentProps> = connect(mapStateToProps, mapDispatchToProps)(
PortalComponent,
);
diff --git a/packages/website/ts/containers/portal_onboarding_flow.ts b/packages/website/ts/containers/portal_onboarding_flow.ts
new file mode 100644
index 000000000..a813205b1
--- /dev/null
+++ b/packages/website/ts/containers/portal_onboarding_flow.ts
@@ -0,0 +1,68 @@
+import { BigNumber } from '@0xproject/utils';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { Blockchain } from 'ts/blockchain';
+import { ActionTypes, ProviderType, ScreenWidths, TokenByAddress, TokenStateByAddress } from 'ts/types';
+
+import { PortalOnboardingFlow as PortalOnboardingFlowComponent } from 'ts/components/onboarding/portal_onboarding_flow';
+import { State } from 'ts/redux/reducer';
+
+interface PortalOnboardingFlowProps {
+ trackedTokenStateByAddress: TokenStateByAddress;
+ blockchain: Blockchain;
+ refetchTokenStateAsync: (tokenAddress: string) => Promise<void>;
+}
+
+interface ConnectedState {
+ networkId: number;
+ stepIndex: number;
+ isRunning: boolean;
+ userAddress: string;
+ hasBeenClosed: boolean;
+ providerType: ProviderType;
+ injectedProviderName: string;
+ blockchainIsLoaded: boolean;
+ userEtherBalanceInWei?: BigNumber;
+ tokenByAddress: TokenByAddress;
+ screenWidth: ScreenWidths;
+}
+
+interface ConnectedDispatch {
+ updateIsRunning: (isRunning: boolean) => void;
+ updateOnboardingStep: (stepIndex: number) => void;
+}
+
+const mapStateToProps = (state: State, _ownProps: PortalOnboardingFlowProps): ConnectedState => ({
+ networkId: state.networkId,
+ stepIndex: state.portalOnboardingStep,
+ isRunning: state.isPortalOnboardingShowing,
+ userAddress: state.userAddress,
+ providerType: state.providerType,
+ injectedProviderName: state.injectedProviderName,
+ blockchainIsLoaded: state.blockchainIsLoaded,
+ userEtherBalanceInWei: state.userEtherBalanceInWei,
+ tokenByAddress: state.tokenByAddress,
+ hasBeenClosed: state.hasPortalOnboardingBeenClosed,
+ screenWidth: state.screenWidth,
+});
+
+const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ updateIsRunning: (isRunning: boolean): void => {
+ dispatch({
+ type: ActionTypes.UpdatePortalOnboardingShowing,
+ data: isRunning,
+ });
+ },
+ updateOnboardingStep: (stepIndex: number): void => {
+ dispatch({
+ type: ActionTypes.UpdatePortalOnboardingStep,
+ data: stepIndex,
+ });
+ },
+});
+
+export const PortalOnboardingFlow: React.ComponentClass<PortalOnboardingFlowProps> = connect(
+ mapStateToProps,
+ mapDispatchToProps,
+)(PortalOnboardingFlowComponent);
diff --git a/packages/website/ts/containers/smart_contracts_documentation.ts b/packages/website/ts/containers/smart_contracts_documentation.ts
index b1b2ea922..b0a712477 100644
--- a/packages/website/ts/containers/smart_contracts_documentation.ts
+++ b/packages/website/ts/containers/smart_contracts_documentation.ts
@@ -1,17 +1,16 @@
import { DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
import { Networks } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, SmartContractDocSections as Sections, WebsitePaths } from 'ts/types';
+import { DocPackages, SmartContractDocSections as Sections } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/smart_contracts/introduction');
+const IntroMarkdownV1 = require('md/docs/smart_contracts/1.0.0/introduction');
/* tslint:enable:no-var-requires */
const docsInfoConfig: DocsInfoConfig = {
@@ -23,8 +22,10 @@ const docsInfoConfig: DocsInfoConfig = {
introduction: [Sections.Introduction],
contracts: [Sections.Exchange, Sections.TokenRegistry, Sections.ZRXToken, Sections.TokenTransferProxy],
},
- sectionNameToMarkdown: {
- [Sections.Introduction]: IntroMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [Sections.Introduction]: IntroMarkdownV1,
+ },
},
sections: {
Introduction: Sections.Introduction,
@@ -76,7 +77,7 @@ interface ConnectedDispatch {
docsInfo: DocsInfo;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/sol_compiler_documentation.ts b/packages/website/ts/containers/sol_compiler_documentation.ts
new file mode 100644
index 000000000..b289c8f34
--- /dev/null
+++ b/packages/website/ts/containers/sol_compiler_documentation.ts
@@ -0,0 +1,85 @@
+import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
+import * as React from 'react';
+import { connect } from 'react-redux';
+import { Dispatch } from 'redux';
+import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { State } from 'ts/redux/reducer';
+import { DocPackages } from 'ts/types';
+import { Translate } from 'ts/utils/translate';
+
+/* tslint:disable:no-var-requires */
+const IntroMarkdownV1 = require('md/docs/sol-compiler/introduction');
+const InstallationMarkdownV1 = require('md/docs/sol-compiler/installation');
+const UsageMarkdown = require('md/docs/sol-compiler/usage');
+/* tslint:enable:no-var-requires */
+
+const docSections = {
+ introduction: 'introduction',
+ installation: 'installation',
+ usage: 'usage',
+ compiler: 'compiler',
+ types: docConstants.TYPES_SECTION_NAME,
+};
+
+const docsInfoConfig: DocsInfoConfig = {
+ id: DocPackages.SolCompiler,
+ type: SupportedDocJson.TypeDoc,
+ displayName: 'Solidity Compiler',
+ packageUrl: 'https://github.com/0xProject/0x-monorepo',
+ menu: {
+ introduction: [docSections.introduction],
+ install: [docSections.installation],
+ usage: [docSections.usage],
+ compiler: [docSections.compiler],
+ types: [docSections.types],
+ },
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.usage]: UsageMarkdown,
+ },
+ },
+ sectionNameToModulePath: {
+ [docSections.compiler]: ['"sol-compiler/src/compiler"'],
+ [docSections.types]: ['"sol-compiler/src/utils/types"', '"types/src/index"'],
+ },
+ menuSubsectionToVersionWhenIntroduced: {},
+ sections: docSections,
+ visibleConstructors: [docSections.compiler],
+ typeConfigs: {
+ // Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is
+ // currently no way to extract the re-exported types from index.ts via TypeDoc :(
+ publicTypes: ['CompilerOptions'],
+ typeNameToExternalLink: {},
+ typeNameToPrefix: {},
+ },
+};
+const docsInfo = new DocsInfo(docsInfoConfig);
+
+interface ConnectedState {
+ docsVersion: string;
+ availableDocVersions: string[];
+ docsInfo: DocsInfo;
+ translate: Translate;
+}
+
+interface ConnectedDispatch {
+ dispatcher: Dispatcher;
+}
+
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
+ docsVersion: state.docsVersion,
+ availableDocVersions: state.availableDocVersions,
+ translate: state.translate,
+ docsInfo,
+});
+
+const mapDispatchToProps = (dispatch: Dispatch<State>): ConnectedDispatch => ({
+ dispatcher: new Dispatcher(dispatch),
+});
+
+export const Documentation: React.ComponentClass<DocPageProps> = connect(mapStateToProps, mapDispatchToProps)(
+ DocPageComponent,
+);
diff --git a/packages/website/ts/containers/sol_cov_documentation.ts b/packages/website/ts/containers/sol_cov_documentation.ts
index 2b901ec6f..d78c450ed 100644
--- a/packages/website/ts/containers/sol_cov_documentation.ts
+++ b/packages/website/ts/containers/sol_cov_documentation.ts
@@ -1,19 +1,16 @@
import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
-import { constants } from 'ts/utils/constants';
+import { DocPackages } from 'ts/types';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/sol_cov/introduction');
-const InstallationMarkdown = require('md/docs/sol_cov/installation');
+const IntroMarkdownV1 = require('md/docs/sol_cov/introduction');
+const InstallationMarkdownV1 = require('md/docs/sol_cov/installation');
const UsageMarkdown = require('md/docs/sol_cov/usage');
/* tslint:enable:no-var-requires */
@@ -22,6 +19,9 @@ const docSections = {
installation: 'installation',
usage: 'usage',
coverageSubprovider: 'coverageSubprovider',
+ abstractArtifactAdapter: 'abstractArtifactAdapter',
+ solCompilerArtifactAdapter: 'solCompilerArtifactAdapter',
+ truffleArtifactAdapter: 'truffleArtifactAdapter',
types: docConstants.TYPES_SECTION_NAME,
};
@@ -34,30 +34,55 @@ const docsInfoConfig: DocsInfoConfig = {
introduction: [docSections.introduction],
install: [docSections.installation],
usage: [docSections.usage],
- coverageSubprovider: [docSections.coverageSubprovider],
+ 'coverage-subprovider': [docSections.coverageSubprovider],
+ 'abstract-artifact-adapter': [docSections.abstractArtifactAdapter],
+ 'sol-compiler-artifact-adapter': [docSections.solCompilerArtifactAdapter],
+ 'truffle-artifact-adapter': [docSections.truffleArtifactAdapter],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.usage]: UsageMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.usage]: UsageMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.coverageSubprovider]: ['"sol-cov/src/coverage_subprovider"'],
- [docSections.types]: ['"subproviders/src/types"'],
+ [docSections.abstractArtifactAdapter]: ['"sol-cov/src/artifact_adapters/abstract_artifact_adapter"'],
+ [docSections.solCompilerArtifactAdapter]: ['"sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter"'],
+ [docSections.truffleArtifactAdapter]: ['"sol-cov/src/artifact_adapters/truffle_artifact_adapter"'],
+ [docSections.types]: ['"subproviders/src/types"', '"types/src/index"'],
},
menuSubsectionToVersionWhenIntroduced: {},
sections: docSections,
- visibleConstructors: [docSections.coverageSubprovider],
+ visibleConstructors: [
+ docSections.coverageSubprovider,
+ docSections.abstractArtifactAdapter,
+ docSections.solCompilerArtifactAdapter,
+ docSections.truffleArtifactAdapter,
+ ],
typeConfigs: {
// Note: This needs to be kept in sync with the types exported in index.ts. Unfortunately there is
// currently no way to extract the re-exported types from index.ts via TypeDoc :(
- publicTypes: ['NextCallback', 'OnNextCompleted', 'ErrorCallback'],
+ publicTypes: [
+ 'JSONRPCRequestPayload',
+ 'NextCallback',
+ 'ErrorCallback',
+ 'AbstractArtifactAdapter',
+ 'CoverageSubprovider',
+ 'TruffleArtifactAdapter',
+ 'SolCompilerArtifactAdapter',
+ 'ContractData',
+ ],
typeNameToExternalLink: {},
- typeNameToPrefix: {
- JSONRPCRequestPayload: 'Web3',
+ typeNameToPrefix: {},
+ typeNameToDocSection: {
+ AbstractArtifactAdapter: docSections.abstractArtifactAdapter,
+ CoverageSubprovider: docSections.coverageSubprovider,
+ TruffleArtifactAdapter: docSections.truffleArtifactAdapter,
+ SolCompilerArtifactAdapter: docSections.solCompilerArtifactAdapter,
},
- typeNameToDocSection: {},
},
};
const docsInfo = new DocsInfo(docsInfoConfig);
@@ -73,7 +98,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/subproviders_documentation.ts b/packages/website/ts/containers/subproviders_documentation.ts
index 7aa05f9a5..0e9150d7b 100644
--- a/packages/website/ts/containers/subproviders_documentation.ts
+++ b/packages/website/ts/containers/subproviders_documentation.ts
@@ -1,19 +1,17 @@
import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { DocPackages } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/subproviders/introduction');
-const InstallationMarkdown = require('md/docs/subproviders/installation');
+const IntroMarkdownV1 = require('md/docs/subproviders/introduction');
+const InstallationMarkdownV1 = require('md/docs/subproviders/installation');
const LedgerNodeHidMarkdown = require('md/docs/subproviders/ledger_node_hid');
/* tslint:enable:no-var-requires */
@@ -27,9 +25,12 @@ const docSections = {
emptyWalletSubprovider: 'emptyWalletSubprovider',
fakeGasEstimateSubprovider: 'fakeGasEstimateSubprovider',
injectedWeb3Subprovider: 'injectedWeb3Subprovider',
+ signerSubprovider: 'signerSubprovider',
redundantRPCSubprovider: 'redundantRPCSubprovider',
ganacheSubprovider: 'ganacheSubprovider',
nonceTrackerSubprovider: 'nonceTrackerSubprovider',
+ privateKeyWalletSubprovider: 'privateKeyWalletSubprovider',
+ mnemonicWalletSubprovider: 'mnemonicWalletSubprovider',
types: docConstants.TYPES_SECTION_NAME,
};
@@ -44,37 +45,47 @@ const docsInfoConfig: DocsInfoConfig = {
subprovider: [docSections.subprovider],
['ledger-subprovider']: [docSections.ledgerSubprovider],
['ledger-node-hid-issue']: [docSections.ledgerNodeHid],
+ ['private-key-wallet-subprovider']: [docSections.privateKeyWalletSubprovider],
+ ['mnemonic-wallet-subprovider']: [docSections.mnemonicWalletSubprovider],
['factory-methods']: [docSections.factoryMethods],
['emptyWallet-subprovider']: [docSections.emptyWalletSubprovider],
['fakeGasEstimate-subprovider']: [docSections.fakeGasEstimateSubprovider],
['injectedWeb3-subprovider']: [docSections.injectedWeb3Subprovider],
+ ['signer-subprovider']: [docSections.signerSubprovider],
['redundantRPC-subprovider']: [docSections.redundantRPCSubprovider],
['ganache-subprovider']: [docSections.ganacheSubprovider],
['nonceTracker-subprovider']: [docSections.nonceTrackerSubprovider],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
- [docSections.ledgerNodeHid]: LedgerNodeHidMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ [docSections.ledgerNodeHid]: LedgerNodeHidMarkdown,
+ },
},
sectionNameToModulePath: {
[docSections.subprovider]: ['"subproviders/src/subproviders/subprovider"'],
[docSections.ledgerSubprovider]: ['"subproviders/src/subproviders/ledger"'],
+ [docSections.privateKeyWalletSubprovider]: ['"subproviders/src/subproviders/private_key_wallet"'],
+ [docSections.mnemonicWalletSubprovider]: ['"subproviders/src/subproviders/mnemonic_wallet"'],
[docSections.factoryMethods]: ['"subproviders/src/index"'],
[docSections.emptyWalletSubprovider]: ['"subproviders/src/subproviders/empty_wallet_subprovider"'],
[docSections.fakeGasEstimateSubprovider]: ['"subproviders/src/subproviders/fake_gas_estimate_subprovider"'],
[docSections.injectedWeb3Subprovider]: ['"subproviders/src/subproviders/injected_web3"'],
+ [docSections.signerSubprovider]: ['"subproviders/src/subproviders/signer"'],
[docSections.redundantRPCSubprovider]: ['"subproviders/src/subproviders/redundant_rpc"'],
[docSections.ganacheSubprovider]: ['"subproviders/src/subproviders/ganache"'],
[docSections.nonceTrackerSubprovider]: ['"subproviders/src/subproviders/nonce_tracker"'],
- [docSections.types]: ['"deployer/src/utils/types"', '"types/src/index"', '"subproviders/src/types"'],
+ [docSections.types]: ['"sol-compiler/src/utils/types"', '"types/src/index"', '"subproviders/src/types"'],
},
menuSubsectionToVersionWhenIntroduced: {},
sections: docSections,
visibleConstructors: [
docSections.subprovider,
docSections.ledgerSubprovider,
+ docSections.privateKeyWalletSubprovider,
+ docSections.mnemonicWalletSubprovider,
docSections.emptyWalletSubprovider,
docSections.fakeGasEstimateSubprovider,
docSections.injectedWeb3Subprovider,
@@ -91,25 +102,22 @@ const docsInfoConfig: DocsInfoConfig = {
'ErrorCallback',
'ECSignature',
'JSONRPCRequestPayloadWithMethod',
+ 'JSONRPCRequestPayload',
'JSONRPCResponsePayload',
'AccountFetchingConfigs',
'LedgerEthereumClientFactoryAsync',
'PartialTxParams',
'LedgerEthereumClient',
'LedgerSubproviderConfigs',
+ 'MnemonicWalletSubproviderConfigs',
+ 'OnNextCompleted',
+ 'Provider',
],
typeNameToExternalLink: {
- Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API',
- BigNumber: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127',
- JSONRPCRequestPayload: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L137',
- JSONRPCResponsePayload: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L144',
- Provider: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150',
- },
- typeNameToPrefix: {
- JSONRPCRequestPayload: 'Web3',
- JSONRPCResponsePayload: 'Web3',
- Provider: 'Web3',
+ Web3: constants.URL_WEB3_DOCS,
+ BigNumber: constants.URL_BIGNUMBERJS_GITHUB,
},
+ typeNameToPrefix: {},
},
};
const docsInfo = new DocsInfo(docsInfoConfig);
@@ -125,7 +133,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/web3_wrapper_documentation.ts b/packages/website/ts/containers/web3_wrapper_documentation.ts
index 289006f10..8d98d9476 100644
--- a/packages/website/ts/containers/web3_wrapper_documentation.ts
+++ b/packages/website/ts/containers/web3_wrapper_documentation.ts
@@ -1,19 +1,17 @@
import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { DocPackages } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/web3_wrapper/introduction');
-const InstallationMarkdown = require('md/docs/web3_wrapper/installation');
+const IntroMarkdownV1 = require('md/docs/web3_wrapper/introduction');
+const InstallationMarkdownV1 = require('md/docs/web3_wrapper/installation');
/* tslint:enable:no-var-requires */
const docSections = {
@@ -34,12 +32,14 @@ const docsInfoConfig: DocsInfoConfig = {
web3Wrapper: [docSections.web3Wrapper],
types: [docSections.types],
},
- sectionNameToMarkdown: {
- [docSections.introduction]: IntroMarkdown,
- [docSections.installation]: InstallationMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [docSections.introduction]: IntroMarkdownV1,
+ [docSections.installation]: InstallationMarkdownV1,
+ },
},
sectionNameToModulePath: {
- [docSections.web3Wrapper]: ['"web3-wrapper/src/index"'],
+ [docSections.web3Wrapper]: ['"web3-wrapper/src/web3_wrapper"'],
[docSections.types]: ['"types/src/index"'],
},
menuSubsectionToVersionWhenIntroduced: {},
@@ -59,15 +59,36 @@ const docsInfoConfig: DocsInfoConfig = {
'BlockWithoutTransactionData',
'CallData',
'LogEntryEvent',
+ 'Provider',
+ 'AbiDefinition',
+ 'LogTopic',
+ 'JSONRPCRequestPayload',
+ 'JSONRPCResponsePayload',
+ 'BlockParamLiteral',
+ 'FunctionAbi',
+ 'EventAbi',
+ 'JSONRPCErrorCallback',
+ 'MethodAbi',
+ 'ConstructorAbi',
+ 'FallbackAbi',
+ 'EventParameter',
+ 'DataItem',
+ 'StateMutability',
+ 'Function',
+ 'Fallback',
+ 'Constructor',
+ 'Event',
+ 'ConstructorStateMutability',
+ 'TransactionReceiptWithDecodedLogs',
+ 'DecodedLogArgs',
+ 'LogWithDecodedArgs',
+ 'ContractEventArg',
],
typeNameToExternalLink: {
- Web3: 'https://github.com/ethereum/wiki/wiki/JavaScript-API',
- Provider: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150',
- BigNumber: 'http://mikemcl.github.io/bignumber.js',
- },
- typeNameToPrefix: {
- Provider: 'Web3',
+ Web3: constants.URL_WEB3_DOCS,
+ BigNumber: constants.URL_BIGNUMBERJS_GITHUB,
},
+ typeNameToPrefix: {},
typeNameToDocSection: {
Web3Wrapper: docSections.web3Wrapper,
},
@@ -86,7 +107,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
translate: state.translate,
diff --git a/packages/website/ts/containers/wiki.ts b/packages/website/ts/containers/wiki.ts
index 2cb87d0a1..357f8bbf4 100644
--- a/packages/website/ts/containers/wiki.ts
+++ b/packages/website/ts/containers/wiki.ts
@@ -1,4 +1,3 @@
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
@@ -15,7 +14,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: WikiProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: WikiProps): ConnectedState => ({
translate: state.translate,
});
diff --git a/packages/website/ts/containers/zero_ex_js_documentation.ts b/packages/website/ts/containers/zero_ex_js_documentation.ts
index 6e893133f..6be54595d 100644
--- a/packages/website/ts/containers/zero_ex_js_documentation.ts
+++ b/packages/website/ts/containers/zero_ex_js_documentation.ts
@@ -1,22 +1,23 @@
import { constants as docConstants, DocsInfo, DocsInfoConfig, SupportedDocJson } from '@0xproject/react-docs';
-import * as _ from 'lodash';
import * as React from 'react';
import { connect } from 'react-redux';
import { Dispatch } from 'redux';
import { DocPage as DocPageComponent, DocPageProps } from 'ts/pages/documentation/doc_page';
import { Dispatcher } from 'ts/redux/dispatcher';
import { State } from 'ts/redux/reducer';
-import { DocPackages, Environments, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { DocPackages } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
/* tslint:disable:no-var-requires */
-const IntroMarkdown = require('md/docs/0xjs/introduction');
-const InstallationMarkdown = require('md/docs/0xjs/installation');
-const AsyncMarkdown = require('md/docs/0xjs/async');
-const ErrorsMarkdown = require('md/docs/0xjs/errors');
-const versioningMarkdown = require('md/docs/0xjs/versioning');
+const IntroMarkdownV1 = require('md/docs/0xjs/1.0.0/introduction');
+const InstallationMarkdownV1 = require('md/docs/0xjs/1.0.0/installation');
+const AsyncMarkdownV1 = require('md/docs/0xjs/1.0.0/async');
+const ErrorsMarkdownV1 = require('md/docs/0xjs/1.0.0/errors');
+const versioningMarkdownV1 = require('md/docs/0xjs/1.0.0/versioning');
+
+const IntroMarkdownV2 = require('md/docs/0xjs/2.0.0/introduction');
+const versioningMarkdownV2 = require('md/docs/0xjs/2.0.0/versioning');
/* tslint:enable:no-var-requires */
const zeroExJsDocSections = {
@@ -56,47 +57,66 @@ const docsInfoConfig: DocsInfoConfig = {
orderWatcher: [zeroExJsDocSections.orderWatcher],
types: [zeroExJsDocSections.types],
},
- sectionNameToMarkdown: {
- [zeroExJsDocSections.introduction]: IntroMarkdown,
- [zeroExJsDocSections.installation]: InstallationMarkdown,
- [zeroExJsDocSections.async]: AsyncMarkdown,
- [zeroExJsDocSections.errors]: ErrorsMarkdown,
- [zeroExJsDocSections.versioning]: versioningMarkdown,
+ sectionNameToMarkdownByVersion: {
+ '0.0.1': {
+ [zeroExJsDocSections.introduction]: IntroMarkdownV1,
+ [zeroExJsDocSections.installation]: InstallationMarkdownV1,
+ [zeroExJsDocSections.async]: AsyncMarkdownV1,
+ [zeroExJsDocSections.errors]: ErrorsMarkdownV1,
+ [zeroExJsDocSections.versioning]: versioningMarkdownV1,
+ },
+ '1.0.0-rc.1': {
+ [zeroExJsDocSections.introduction]: IntroMarkdownV2,
+ [zeroExJsDocSections.versioning]: versioningMarkdownV2,
+ // These are the same as for V1
+ [zeroExJsDocSections.installation]: InstallationMarkdownV1,
+ [zeroExJsDocSections.async]: AsyncMarkdownV1,
+ [zeroExJsDocSections.errors]: ErrorsMarkdownV1,
+ },
},
sectionNameToModulePath: {
[zeroExJsDocSections.zeroEx]: ['"0x.js/src/0x"', '"src/0x"'],
[zeroExJsDocSections.exchange]: [
'"0x.js/src/contract_wrappers/exchange_wrapper"',
'"src/contract_wrappers/exchange_wrapper"',
+ '"contract-wrappers/src/contract_wrappers/exchange_wrapper"',
],
[zeroExJsDocSections.tokenRegistry]: [
'"0x.js/src/contract_wrappers/token_registry_wrapper"',
'"src/contract_wrappers/token_registry_wrapper"',
+ '"contract-wrappers/src/contract_wrappers/token_registry_wrapper"',
],
[zeroExJsDocSections.token]: [
'"0x.js/src/contract_wrappers/token_wrapper"',
'"src/contract_wrappers/token_wrapper"',
+ '"contract-wrappers/src/contract_wrappers/token_wrapper"',
],
[zeroExJsDocSections.etherToken]: [
'"0x.js/src/contract_wrappers/ether_token_wrapper"',
'"src/contract_wrappers/ether_token_wrapper"',
+ '"contract-wrappers/src/contract_wrappers/ether_token_wrapper"',
],
[zeroExJsDocSections.proxy]: [
'"0x.js/src/contract_wrappers/proxy_wrapper"',
'"0x.js/src/contract_wrappers/token_transfer_proxy_wrapper"',
- '"src/contract_wrappers/token_transfer_proxy_wrapper"',
+ '"contract-wrappers/src/contract_wrappers/token_transfer_proxy_wrapper"',
],
[zeroExJsDocSections.orderWatcher]: [
'"0x.js/src/order_watcher/order_state_watcher"',
'"src/order_watcher/order_state_watcher"',
+ '"order-watcher/src/order_watcher/order_watcher"',
],
[zeroExJsDocSections.types]: [
'"0x.js/src/types"',
'"src/types"',
'"types/src/index"',
+ '"contract-wrappers/src/types"',
'"0x.js/src/contract_wrappers/generated/ether_token"',
'"0x.js/src/contract_wrappers/generated/token"',
'"0x.js/src/contract_wrappers/generated/exchange"',
+ '"0x.js/src/generated_contract_wrappers/ether_token"',
+ '"0x.js/src/generated_contract_wrappers/token"',
+ '"0x.js/src/generated_contract_wrappers/exchange"',
],
},
menuSubsectionToVersionWhenIntroduced: {
@@ -114,13 +134,14 @@ const docsInfoConfig: DocsInfoConfig = {
'Order',
'SignedOrder',
'ECSignature',
- 'ZeroExError',
+ 'ContractWrappersError',
'EventCallback',
'EventCallbackAsync',
'EventCallbackSync',
'ExchangeContractErrs',
'ContractEvent',
'Token',
+ 'Provider',
'ExchangeEvents',
'IndexedFilterValues',
'SubscriptionOpts',
@@ -165,23 +186,44 @@ const docsInfoConfig: DocsInfoConfig = {
'OrderStateInvalid',
'OrderState',
'OrderStateWatcherConfig',
+ 'OrderWatcherConfig',
'FilterObject',
'OrderRelevantState',
+ 'JSONRPCRequestPayload',
+ 'JSONRPCResponsePayload',
+ 'JSONRPCErrorCallback',
+ 'LogEntryEvent',
+ 'LogEntry',
+ 'ERC20AssetData',
+ 'ERC721AssetData',
+ 'AssetProxyId',
+ 'WETH9Events',
+ 'WETH9WithdrawalEventArgs',
+ 'WETH9ApprovalEventArgs',
+ 'WETH9EventArgs',
+ 'WETH9DepositEventArgs',
+ 'WETH9TransferEventArgs',
+ 'ERC20TokenTransferEventArgs',
+ 'ERC20TokenApprovalEventArgs',
+ 'ERC20TokenEvents',
+ 'ERC20TokenEventArgs',
+ 'ERC721TokenApprovalEventArgs',
+ 'ERC721TokenApprovalForAllEventArgs',
+ 'ERC721TokenTransferEventArgs',
+ 'ERC721TokenEvents',
+ 'ExchangeCancelUpToEventArgs',
+ 'ExchangeAssetProxyRegisteredEventArgs',
+ 'ExchangeFillEventArgs',
+ 'ExchangeCancelEventArgs',
+ 'ExchangeEventArgs',
+ 'ContractWrappersConfig',
+ 'MessagePrefixType',
+ 'MessagePrefixOpts',
+ 'OrderInfo',
],
- typeNameToPrefix: {
- Provider: 'Web3',
- DecodedLogEntryEvent: 'Web3',
- LogEntryEvent: 'Web3',
- CallData: 'Web3',
- LogEntry: 'Web3',
- },
+ typeNameToPrefix: {},
typeNameToExternalLink: {
- Web3: constants.URL_WEB3_DOCS,
- Provider: constants.URL_WEB3_PROVIDER_DOCS,
BigNumber: constants.URL_BIGNUMBERJS_GITHUB,
- DecodedLogEntryEvent: constants.URL_WEB3_DECODED_LOG_ENTRY_EVENT,
- LogEntryEvent: constants.URL_WEB3_LOG_ENTRY_EVENT,
- LogEntry: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L366',
},
typeNameToDocSection: {
ExchangeWrapper: 'exchange',
@@ -207,7 +249,7 @@ interface ConnectedDispatch {
dispatcher: Dispatcher;
}
-const mapStateToProps = (state: State, ownProps: DocPageProps): ConnectedState => ({
+const mapStateToProps = (state: State, _ownProps: DocPageProps): ConnectedState => ({
docsVersion: state.docsVersion,
availableDocVersions: state.availableDocVersions,
docsInfo,
diff --git a/packages/website/ts/globals.d.ts b/packages/website/ts/globals.d.ts
index 3791b3269..719c2708a 100644
--- a/packages/website/ts/globals.d.ts
+++ b/packages/website/ts/globals.d.ts
@@ -1,15 +1,7 @@
-declare module 'react-tooltip';
-declare module 'react-router-hash-link';
declare module 'truffle-contract';
-declare module 'ethereumjs-util';
-declare module 'keccak';
declare module 'whatwg-fetch';
-declare module 'react-html5video';
-declare module 'web3-provider-engine/subproviders/filters';
declare module 'thenby';
-declare module 'react-recaptcha';
declare module 'react-document-title';
-declare module 'ethereumjs-tx';
declare module 'react-ga';
declare module '*.json' {
@@ -19,130 +11,9 @@ declare module '*.json' {
/* tslint:enable */
}
-// tslint:disable:max-classes-per-file
-
-// find-version declarations
-declare function findVersions(version: string): string[];
-declare module 'find-versions' {
- export = findVersions;
-}
-
-// semver-sort declarations
-declare module 'semver-sort' {
- const desc: (versions: string[]) => string[];
-}
-
-// xml-js declarations
-declare interface XML2JSONOpts {
- compact?: boolean;
- spaces?: number;
-}
-declare module 'xml-js' {
- const xml2json: (xml: string, opts: XML2JSONOpts) => string;
-}
-
// This will be defined by default in TS 2.4
// Source: https://github.com/Microsoft/TypeScript/issues/12364
interface System {
import<T>(module: string): Promise<T>;
}
declare var System: System;
-
-// jsonschema declarations
-// Source: https://github.com/tdegrunt/jsonschema/blob/master/lib/index.d.ts
-declare interface Schema {
- id?: string;
- $schema?: string;
- title?: string;
- description?: string;
- multipleOf?: number;
- maximum?: number;
- exclusiveMaximum?: boolean;
- minimum?: number;
- exclusiveMinimum?: boolean;
- maxLength?: number;
- minLength?: number;
- pattern?: string;
- additionalItems?: boolean | Schema;
- items?: Schema | Schema[];
- maxItems?: number;
- minItems?: number;
- uniqueItems?: boolean;
- maxProperties?: number;
- minProperties?: number;
- required?: string[];
- additionalProperties?: boolean | Schema;
- definitions?: {
- [name: string]: Schema;
- };
- properties?: {
- [name: string]: Schema;
- };
- patternProperties?: {
- [name: string]: Schema;
- };
- dependencies?: {
- [name: string]: Schema | string[];
- };
- enum?: any[];
- type?: string | string[];
- allOf?: Schema[];
- anyOf?: Schema[];
- oneOf?: Schema[];
- not?: Schema;
- // This is the only property that's not defined in https://github.com/tdegrunt/jsonschema/blob/master/lib/index.d.ts
- // There is an open issue for that: https://github.com/tdegrunt/jsonschema/issues/194
- // There is also an opened PR: https://github.com/tdegrunt/jsonschema/pull/218/files
- // As soon as it gets merged we should be good to use types from 'jsonschema' package
- $ref?: string;
-}
-
-// blockies declarations
-declare interface BlockiesIcon {
- toDataURL(): string;
-}
-declare interface BlockiesConfig {
- seed: string;
-}
-declare function blockies(config: BlockiesConfig): BlockiesIcon;
-declare module 'blockies' {
- export = blockies;
-}
-
-// web3-provider-engine declarations
-declare class Subprovider {}
-declare module 'web3-provider-engine/subproviders/subprovider' {
- export = Subprovider;
-}
-declare module 'web3-provider-engine/subproviders/rpc' {
- import { JSONRPCRequestPayload } from '@0xproject/types';
- class RpcSubprovider {
- constructor(options: { rpcUrl: string });
- public handleRequest(
- payload: JSONRPCRequestPayload,
- next: () => void,
- end: (err: Error | null, data?: any) => void,
- ): void;
- }
- export = RpcSubprovider;
-}
-declare module 'web3-provider-engine' {
- class Web3ProviderEngine {
- public on(event: string, handler: () => void): void;
- public send(payload: any): void;
- public sendAsync(payload: any, callback: (error: any, response: any) => void): void;
- public addProvider(provider: any): void;
- public start(): void;
- public stop(): void;
- }
- export = Web3ProviderEngine;
-}
-
-declare interface Artifact {
- abi: any;
- networks: {
- [networkId: number]: {
- address: string;
- };
- };
-}
diff --git a/packages/website/ts/index.tsx b/packages/website/ts/index.tsx
index d542bd804..c6d10452f 100644
--- a/packages/website/ts/index.tsx
+++ b/packages/website/ts/index.tsx
@@ -1,25 +1,23 @@
-// Polyfills
import { MuiThemeProvider } from 'material-ui/styles';
import * as React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { BrowserRouter as Router, Redirect, Route, Switch } from 'react-router-dom';
import * as injectTapEventPlugin from 'react-tap-event-plugin';
-import { createStore, Store as ReduxStore } from 'redux';
+import { MetaTags } from 'ts/components/meta_tags';
import { About } from 'ts/containers/about';
import { FAQ } from 'ts/containers/faq';
+import { Jobs } from 'ts/containers/jobs';
import { Landing } from 'ts/containers/landing';
import { NotFound } from 'ts/containers/not_found';
import { Wiki } from 'ts/containers/wiki';
import { createLazyComponent } from 'ts/lazy_component';
import { trackedTokenStorage } from 'ts/local_storage/tracked_token_storage';
import { tradeHistoryStorage } from 'ts/local_storage/trade_history_storage';
-import { reducer, State } from 'ts/redux/reducer';
-import { WebsitePaths } from 'ts/types';
-import { analytics } from 'ts/utils/analytics';
+import { store } from 'ts/redux/store';
+import { WebsiteLegacyPaths, WebsitePaths } from 'ts/types';
import { muiTheme } from 'ts/utils/mui_theme';
-import { utils } from 'ts/utils/utils';
-import 'whatwg-fetch';
+// Polyfills
injectTapEventPlugin();
// Check if we've introduced an update that requires us to clear the tradeHistory local storage entries
@@ -33,6 +31,7 @@ import 'less/all.less';
// cause we only want to import the module when the user navigates to the page.
// At the same time webpack statically parses for System.import() to determine bundle chunk split points
// so each lazy import needs it's own `System.import()` declaration.
+
const LazyPortal = createLazyComponent('Portal', async () =>
System.import<any>(/* webpackChunkName: "portal" */ 'ts/containers/portal'),
);
@@ -48,8 +47,8 @@ const LazyConnectDocumentation = createLazyComponent('Documentation', async () =
const LazyWeb3WrapperDocumentation = createLazyComponent('Documentation', async () =>
System.import<any>(/* webpackChunkName: "web3WrapperDocs" */ 'ts/containers/web3_wrapper_documentation'),
);
-const LazyDeployerDocumentation = createLazyComponent('Documentation', async () =>
- System.import<any>(/* webpackChunkName: "deployerDocs" */ 'ts/containers/deployer_documentation'),
+const LazySolCompilerDocumentation = createLazyComponent('Documentation', async () =>
+ System.import<any>(/* webpackChunkName: "solCompilerDocs" */ 'ts/containers/sol_compiler_documentation'),
);
const LazyJSONSchemasDocumentation = createLazyComponent('Documentation', async () =>
System.import<any>(/* webpackChunkName: "jsonSchemasDocs" */ 'ts/containers/json_schemas_documentation'),
@@ -60,50 +59,92 @@ const LazySolCovDocumentation = createLazyComponent('Documentation', async () =>
const LazySubprovidersDocumentation = createLazyComponent('Documentation', async () =>
System.import<any>(/* webpackChunkName: "subproviderDocs" */ 'ts/containers/subproviders_documentation'),
);
+const LazyOrderUtilsDocumentation = createLazyComponent('Documentation', async () =>
+ System.import<any>(/* webpackChunkName: "orderUtilsDocs" */ 'ts/containers/order_utils_documentation'),
+);
+const LazyEthereumTypesDocumentation = createLazyComponent('Documentation', async () =>
+ System.import<any>(/* webpackChunkName: "ethereumTypesDocs" */ 'ts/containers/ethereum_types_documentation'),
+);
+
+const DOCUMENT_TITLE = '0x: The Protocol for Trading Tokens';
+const DOCUMENT_DESCRIPTION = 'An Open Protocol For Decentralized Exchange On The Ethereum Blockchain';
-analytics.init();
-// tslint:disable-next-line:no-floating-promises
-analytics.logProviderAsync((window as any).web3);
-const store: ReduxStore<State> = createStore(reducer);
render(
- <Router>
- <div>
- <MuiThemeProvider muiTheme={muiTheme}>
- <Provider store={store}>
- <div>
- <Switch>
- <Route exact={true} path="/" component={Landing as any} />
- <Redirect from="/otc" to={`${WebsitePaths.Portal}`} />
- <Route path={`${WebsitePaths.Portal}`} component={LazyPortal} />
- <Route path={`${WebsitePaths.FAQ}`} component={FAQ as any} />
- <Route path={`${WebsitePaths.About}`} component={About as any} />
- <Route path={`${WebsitePaths.Wiki}`} component={Wiki as any} />
- <Route path={`${WebsitePaths.ZeroExJs}/:version?`} component={LazyZeroExJSDocumentation} />
- <Route path={`${WebsitePaths.Connect}/:version?`} component={LazyConnectDocumentation} />
- <Route path={`${WebsitePaths.Deployer}/:version?`} component={LazyDeployerDocumentation} />
- <Route path={`${WebsitePaths.SolCov}/:version?`} component={LazySolCovDocumentation} />
- <Route
- path={`${WebsitePaths.JSONSchemas}/:version?`}
- component={LazyJSONSchemasDocumentation}
- />
- <Route
- path={`${WebsitePaths.Subproviders}/:version?`}
- component={LazySubprovidersDocumentation}
- />
- <Route
- path={`${WebsitePaths.Web3Wrapper}/:version?`}
- component={LazyWeb3WrapperDocumentation}
- />
- <Route
- path={`${WebsitePaths.SmartContracts}/:version?`}
- component={LazySmartContractsDocumentation}
- />
- <Route component={NotFound as any} />
- </Switch>
- </div>
- </Provider>
- </MuiThemeProvider>
- </div>
- </Router>,
+ <div>
+ <MetaTags title={DOCUMENT_TITLE} description={DOCUMENT_DESCRIPTION} />
+ <Router>
+ <div>
+ <MuiThemeProvider muiTheme={muiTheme}>
+ <Provider store={store}>
+ <div>
+ <Switch>
+ <Route exact={true} path="/" component={Landing as any} />
+ <Redirect from="/otc" to={`${WebsitePaths.Portal}`} />
+ <Route path={WebsitePaths.Careers} component={Jobs as any} />
+ <Route path={WebsitePaths.Portal} component={LazyPortal} />
+ <Route path={WebsitePaths.FAQ} component={FAQ as any} />
+ <Route path={WebsitePaths.About} component={About as any} />
+ <Route path={WebsitePaths.Wiki} component={Wiki as any} />
+ <Route
+ path={`${WebsitePaths.ZeroExJs}/:version?`}
+ component={LazyZeroExJSDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.Connect}/:version?`}
+ component={LazyConnectDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.SolCompiler}/:version?`}
+ component={LazySolCompilerDocumentation}
+ />
+ <Route path={`${WebsitePaths.SolCov}/:version?`} component={LazySolCovDocumentation} />
+ <Route
+ path={`${WebsitePaths.JSONSchemas}/:version?`}
+ component={LazyJSONSchemasDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.Subproviders}/:version?`}
+ component={LazySubprovidersDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.OrderUtils}/:version?`}
+ component={LazyOrderUtilsDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.Web3Wrapper}/:version?`}
+ component={LazyWeb3WrapperDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.SmartContracts}/:version?`}
+ component={LazySmartContractsDocumentation}
+ />
+ <Route
+ path={`${WebsitePaths.EthereumTypes}/:version?`}
+ component={LazyEthereumTypesDocumentation}
+ />
+
+ {/* Legacy endpoints */}
+ <Route
+ path={`${WebsiteLegacyPaths.ZeroExJs}/:version?`}
+ component={LazyZeroExJSDocumentation}
+ />
+ <Route
+ path={`${WebsiteLegacyPaths.Web3Wrapper}/:version?`}
+ component={LazyWeb3WrapperDocumentation}
+ />
+ <Route
+ path={`${WebsiteLegacyPaths.Deployer}/:version?`}
+ component={LazySolCompilerDocumentation}
+ />
+ <Route path={WebsiteLegacyPaths.Jobs} component={Jobs as any} />
+ <Route path={`${WebsitePaths.Docs}`} component={LazyZeroExJSDocumentation} />
+ <Route component={NotFound as any} />
+ </Switch>
+ </div>
+ </Provider>
+ </MuiThemeProvider>
+ </div>
+ </Router>
+ </div>,
document.getElementById('app'),
);
diff --git a/packages/website/ts/lazy_component.tsx b/packages/website/ts/lazy_component.tsx
index 48800c2dd..dce06ed8d 100644
--- a/packages/website/ts/lazy_component.tsx
+++ b/packages/website/ts/lazy_component.tsx
@@ -21,22 +21,22 @@ export class LazyComponent extends React.Component<LazyComponentProps, LazyCompo
component: undefined,
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
// tslint:disable-next-line:no-floating-promises
this._loadComponentFireAndForgetAsync(this.props);
}
- public componentWillReceiveProps(nextProps: LazyComponentProps) {
+ public componentWillReceiveProps(nextProps: LazyComponentProps): void {
if (nextProps.reactComponentPromise !== this.props.reactComponentPromise) {
// tslint:disable-next-line:no-floating-promises
this._loadComponentFireAndForgetAsync(nextProps);
}
}
- public render() {
+ public render(): React.ReactNode {
return _.isUndefined(this.state.component)
? null
: React.createElement(this.state.component, this.props.reactComponentProps);
}
- private async _loadComponentFireAndForgetAsync(props: LazyComponentProps) {
+ private async _loadComponentFireAndForgetAsync(props: LazyComponentProps): Promise<void> {
const component = await props.reactComponentPromise;
this.setState({
component,
diff --git a/packages/website/ts/local_storage/local_storage.ts b/packages/website/ts/local_storage/local_storage.ts
index d94e6877b..13d9ca401 100644
--- a/packages/website/ts/local_storage/local_storage.ts
+++ b/packages/website/ts/local_storage/local_storage.ts
@@ -1,11 +1,11 @@
import * as _ from 'lodash';
export const localStorage = {
- doesExist() {
+ doesExist(): boolean {
return !!window.localStorage;
},
getItemIfExists(key: string): string {
- if (!this.doesExist) {
+ if (!localStorage.doesExist) {
return undefined;
}
const item = window.localStorage.getItem(key);
@@ -14,20 +14,30 @@ export const localStorage = {
}
return item;
},
- setItem(key: string, value: string) {
- if (!this.doesExist || _.isUndefined(value)) {
+ setItem(key: string, value: string): void {
+ if (!localStorage.doesExist || _.isUndefined(value)) {
return;
}
window.localStorage.setItem(key, value);
},
- removeItem(key: string) {
- if (!this.doesExist) {
+ removeItem(key: string): void {
+ if (!localStorage.doesExist) {
return;
}
window.localStorage.removeItem(key);
},
+ getObject(key: string): object | undefined {
+ const item = localStorage.getItemIfExists(key);
+ if (item) {
+ return JSON.parse(item);
+ }
+ return undefined;
+ },
+ setObject(key: string, value: object): void {
+ localStorage.setItem(key, JSON.stringify(value));
+ },
getAllKeys(): string[] {
- if (!this.doesExist) {
+ if (!localStorage.doesExist) {
return [];
}
return _.keys(window.localStorage);
diff --git a/packages/website/ts/local_storage/state_storage.ts b/packages/website/ts/local_storage/state_storage.ts
new file mode 100644
index 000000000..517784b5b
--- /dev/null
+++ b/packages/website/ts/local_storage/state_storage.ts
@@ -0,0 +1,16 @@
+import { localStorage } from 'ts/local_storage/local_storage';
+import { INITIAL_STATE, State } from 'ts/redux/reducer';
+
+const STORAGE_NAME = 'persistedState';
+
+export const stateStorage = {
+ saveState(partialState: Partial<State>): void {
+ localStorage.setObject(STORAGE_NAME, partialState);
+ },
+ getPersistedState(): Partial<State> {
+ return localStorage.getObject(STORAGE_NAME);
+ },
+ getPersistedDefaultState(): State {
+ return { ...INITIAL_STATE, ...stateStorage.getPersistedState() };
+ },
+};
diff --git a/packages/website/ts/local_storage/tracked_token_storage.ts b/packages/website/ts/local_storage/tracked_token_storage.ts
index f865f8109..b1b579aef 100644
--- a/packages/website/ts/local_storage/tracked_token_storage.ts
+++ b/packages/website/ts/local_storage/tracked_token_storage.ts
@@ -17,7 +17,7 @@ export const trackedTokenStorage = {
localStorage.setItem(TRACKED_TOKENS_CLEAR_KEY, configs.LAST_LOCAL_STORAGE_TRACKED_TOKEN_CLEARANCE_DATE);
},
addTrackedTokenToUser(userAddress: string, networkId: number, token: Token): void {
- const trackedTokensByUserAddress = this.getTrackedTokensByUserAddress();
+ const trackedTokensByUserAddress = trackedTokenStorage.getTrackedTokensByUserAddress();
let trackedTokensByNetworkId = trackedTokensByUserAddress[userAddress];
if (_.isUndefined(trackedTokensByNetworkId)) {
trackedTokensByNetworkId = {};
@@ -57,7 +57,7 @@ export const trackedTokenStorage = {
return trackedTokensByAddress;
},
removeTrackedToken(userAddress: string, networkId: number, tokenAddress: string): void {
- const trackedTokensByUserAddress = this.getTrackedTokensByUserAddress();
+ const trackedTokensByUserAddress = trackedTokenStorage.getTrackedTokensByUserAddress();
const trackedTokensByNetworkId = trackedTokensByUserAddress[userAddress];
const trackedTokens = trackedTokensByNetworkId[networkId];
const remainingTrackedTokens = _.filter(trackedTokens, (token: Token) => {
diff --git a/packages/website/ts/local_storage/trade_history_storage.tsx b/packages/website/ts/local_storage/trade_history_storage.tsx
index df731236e..a9b042820 100644
--- a/packages/website/ts/local_storage/trade_history_storage.tsx
+++ b/packages/website/ts/local_storage/trade_history_storage.tsx
@@ -14,7 +14,7 @@ export const tradeHistoryStorage = {
// Clear all fill related localStorage if we've updated the config variable in an update
// that introduced a backward incompatible change requiring the user to re-fetch the fills from
// the blockchain
- clearIfRequired() {
+ clearIfRequired(): void {
const lastClearFillDate = localStorage.getItemIfExists(FILL_CLEAR_KEY);
if (lastClearFillDate !== configs.LAST_LOCAL_STORAGE_FILL_CLEARANCE_DATE) {
const localStorageKeys = localStorage.getAllKeys();
@@ -26,38 +26,38 @@ export const tradeHistoryStorage = {
}
localStorage.setItem(FILL_CLEAR_KEY, configs.LAST_LOCAL_STORAGE_FILL_CLEARANCE_DATE);
},
- addFillToUser(userAddress: string, networkId: number, fill: Fill) {
- const fillsByHash = this.getUserFillsByHash(userAddress, networkId);
- const fillHash = this._getFillHash(fill);
+ addFillToUser(userAddress: string, networkId: number, fill: Fill): void {
+ const fillsByHash = tradeHistoryStorage.getUserFillsByHash(userAddress, networkId);
+ const fillHash = tradeHistoryStorage._getFillHash(fill);
const doesFillExist = !_.isUndefined(fillsByHash[fillHash]);
if (doesFillExist) {
return; // noop
}
fillsByHash[fillHash] = fill;
const userFillsJSONString = JSON.stringify(fillsByHash);
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
localStorage.setItem(userFillsKey, userFillsJSONString);
},
- removeFillFromUser(userAddress: string, networkId: number, fill: Fill) {
- const fillsByHash = this.getUserFillsByHash(userAddress, networkId);
- const fillHash = this._getFillHash(fill);
+ removeFillFromUser(userAddress: string, networkId: number, fill: Fill): void {
+ const fillsByHash = tradeHistoryStorage.getUserFillsByHash(userAddress, networkId);
+ const fillHash = tradeHistoryStorage._getFillHash(fill);
const doesFillExist = !_.isUndefined(fillsByHash[fillHash]);
if (!doesFillExist) {
return; // noop
}
delete fillsByHash[fillHash];
const userFillsJSONString = JSON.stringify(fillsByHash);
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
localStorage.setItem(userFillsKey, userFillsJSONString);
},
getUserFillsByHash(userAddress: string, networkId: number): { [fillHash: string]: Fill } {
- const userFillsKey = this._getUserFillsKey(userAddress, networkId);
+ const userFillsKey = tradeHistoryStorage._getUserFillsKey(userAddress, networkId);
const userFillsJSONString = localStorage.getItemIfExists(userFillsKey);
if (_.isEmpty(userFillsJSONString)) {
return {};
}
const userFillsByHash = JSON.parse(userFillsJSONString);
- _.each(userFillsByHash, (fill, hash) => {
+ _.each(userFillsByHash, fill => {
fill.paidMakerFee = new BigNumber(fill.paidMakerFee);
fill.paidTakerFee = new BigNumber(fill.paidTakerFee);
fill.filledTakerTokenAmount = new BigNumber(fill.filledTakerTokenAmount);
@@ -66,7 +66,7 @@ export const tradeHistoryStorage = {
return userFillsByHash;
},
getFillsLatestBlock(userAddress: string, networkId: number): number {
- const userFillsLatestBlockKey = this._getFillsLatestBlockKey(userAddress, networkId);
+ const userFillsLatestBlockKey = tradeHistoryStorage._getFillsLatestBlockKey(userAddress, networkId);
const blockNumberStr = localStorage.getItemIfExists(userFillsLatestBlockKey);
if (_.isEmpty(blockNumberStr)) {
return constants.GENESIS_ORDER_BLOCK_BY_NETWORK_ID[networkId];
@@ -74,15 +74,15 @@ export const tradeHistoryStorage = {
const blockNumber = _.parseInt(blockNumberStr);
return blockNumber;
},
- setFillsLatestBlock(userAddress: string, networkId: number, blockNumber: number) {
- const userFillsLatestBlockKey = this._getFillsLatestBlockKey(userAddress, networkId);
+ setFillsLatestBlock(userAddress: string, networkId: number, blockNumber: number): void {
+ const userFillsLatestBlockKey = tradeHistoryStorage._getFillsLatestBlockKey(userAddress, networkId);
localStorage.setItem(userFillsLatestBlockKey, `${blockNumber}`);
},
- _getUserFillsKey(userAddress: string, networkId: number) {
+ _getUserFillsKey(userAddress: string, networkId: number): string {
const userFillsKey = `${FILLS_KEY}-${userAddress}-${networkId}`;
return userFillsKey;
},
- _getFillsLatestBlockKey(userAddress: string, networkId: number) {
+ _getFillsLatestBlockKey(userAddress: string, networkId: number): string {
const userFillsLatestBlockKey = `${FILLS_LATEST_BLOCK}-${userAddress}-${networkId}`;
return userFillsLatestBlockKey;
},
diff --git a/packages/website/ts/pages/about/about.tsx b/packages/website/ts/pages/about/about.tsx
index 293580913..aef4d0df9 100644
--- a/packages/website/ts/pages/about/about.tsx
+++ b/packages/website/ts/pages/about/about.tsx
@@ -2,12 +2,12 @@ import { colors, Styles } from '@0xproject/react-shared';
import * as _ from 'lodash';
import * as React from 'react';
import * as DocumentTitle from 'react-document-title';
+import { Link } from 'react-router-dom';
import { Footer } from 'ts/components/footer';
import { TopBar } from 'ts/components/top_bar/top_bar';
import { Profile } from 'ts/pages/about/profile';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { ProfileInfo } from 'ts/types';
-import { constants } from 'ts/utils/constants';
+import { ProfileInfo, WebsitePaths } from 'ts/types';
import { Translate } from 'ts/utils/translate';
import { utils } from 'ts/utils/utils';
@@ -27,7 +27,7 @@ const teamRow1: ProfileInfo[] = [
title: 'Co-founder & CTO',
description: `Smart contract R&D. Previously fixed income trader at DRW. \
Finance at University of Illinois, Urbana-Champaign.`,
- image: '/images/team/amir.jpeg',
+ image: '/images/team/amir.png',
linkedIn: 'https://www.linkedin.com/in/abandeali1/',
github: 'https://github.com/abandeali1',
medium: 'https://medium.com/@abandeali1',
@@ -36,7 +36,7 @@ const teamRow1: ProfileInfo[] = [
name: 'Fabio Berger',
title: 'Senior Engineer',
description: `Full-stack blockchain engineer. Previously software engineer \
- at Airtable and founder of WealthLift. Computer science at Duke.`,
+ at Airtable and founder of WealthLift. Computer Science at Duke.`,
image: '/images/team/fabio.jpg',
linkedIn: 'https://www.linkedin.com/in/fabio-berger-03ab261a/',
github: 'https://github.com/fabioberger',
@@ -59,7 +59,7 @@ const teamRow2: ProfileInfo[] = [
name: 'Leonid Logvinov',
title: 'Engineer',
description: `Full-stack blockchain engineer. Previously blockchain engineer \
- at Neufund. Computer science at University of Warsaw.`,
+ at Neufund. Computer Science at University of Warsaw.`,
image: '/images/team/leonid.png',
linkedIn: 'https://www.linkedin.com/in/leonidlogvinov/',
github: 'https://github.com/LogvinovLeon',
@@ -99,7 +99,7 @@ const teamRow3: ProfileInfo[] = [
},
{
name: 'Jacob Evans',
- title: 'Blockchain Engineer',
+ title: 'Ecosystem Engineer',
description: `Previously software engineer at Qantas and RSA Security.`,
image: '/images/team/jacob.jpg',
linkedIn: 'https://www.linkedin.com/in/dekzter/',
@@ -112,7 +112,7 @@ const teamRow4: ProfileInfo[] = [
{
name: 'Blake Henderson',
title: 'Operations Associate',
- description: `Operations and Analytics. Previously analytics at LinkedIn. Economics at UC San Diego. `,
+ description: `Operations and Analytics. Previously analytics at LinkedIn. Economics at UC San Diego.`,
image: '/images/team/blake.jpg',
linkedIn: 'https://www.linkedin.com/in/blakerhenderson/',
github: '',
@@ -127,6 +127,78 @@ const teamRow4: ProfileInfo[] = [
github: '',
medium: '',
},
+ {
+ name: 'Greg Hysen',
+ title: 'Blockchain Engineer',
+ description: `Smart contract R&D. Previously lead distributed systems engineer at Hivemapper. Computer Science at University of Waterloo.`,
+ image: '/images/team/greg.jpeg',
+ linkedIn: 'https://www.linkedin.com/in/gregory-hysen-71741463/',
+ github: 'https://github.com/hysz',
+ medium: '',
+ },
+];
+
+const teamRow5: ProfileInfo[] = [
+ {
+ name: 'Remco Bloemen',
+ title: 'Technical Fellow',
+ description: `Previously cofounder at Neufund and Coblue. Part III at Cambridge. PhD dropout at Twente Business School.`,
+ image: '/images/team/remco.jpeg',
+ linkedIn: 'https://www.linkedin.com/in/remcobloemen/',
+ github: 'http://github.com/recmo',
+ medium: '',
+ },
+ {
+ name: 'Francesco Agosti',
+ title: 'Engineer',
+ description: `Full-stack engineer. Previously senior software engineer at Yelp. Computer Science at Duke.`,
+ image: 'images/team/fragosti.png',
+ linkedIn: 'https://www.linkedin.com/in/fragosti/',
+ github: 'http://github.com/fragosti',
+ },
+ {
+ name: 'Mel Oberto',
+ title: 'Office Ops / Executive Assistant',
+ description: `Daily Operations. Previously People Operations Associate at Heap. Marketing and MBA at Sacred Heart University.`,
+ image: 'images/team/mel.png',
+ linkedIn: 'https://www.linkedin.com/in/melanieoberto',
+ },
+];
+
+const teamRow6: ProfileInfo[] = [
+ {
+ name: 'Alex Browne',
+ title: 'Engineer in Residence',
+ description: `Full-stack blockchain engineer. Previously at Plaid. Open source guru and footgun dismantler. Computer Science and Electrical Engineering at Duke.`,
+ image: 'images/team/alexbrowne.png',
+ linkedIn: 'https://www.linkedin.com/in/stephenalexbrowne/',
+ github: 'http://github.com/albrow',
+ },
+ {
+ name: 'Peter Zeitz',
+ title: 'Research Fellow',
+ description: `Researching decentralized governance. Previously Assistant Professor of Economics at National University of Singapore Business School. PhD in Economics at UCLA.`,
+ image: 'images/team/peter.jpg',
+ linkedIn: 'https://www.linkedin.com/in/peter-z-7b9595163/',
+ },
+ {
+ name: 'Chris Kalani',
+ title: 'Director of Design',
+ description: `Previously founded Wake (acquired by InVision). Early Facebook product designer.`,
+ image: 'images/team/chris.png',
+ linkedIn: 'https://www.linkedin.com/in/chriskalani/',
+ github: 'https://github.com/chriskalani',
+ },
+];
+
+const teamRow7: ProfileInfo[] = [
+ {
+ name: 'Clay Robbins',
+ title: 'Business Development Lead',
+ description: `Growth & Business Development. Previously product and partnerships at Square. Economics at Dartmouth College.`,
+ image: 'images/team/clay.png',
+ linkedIn: 'https://www.linkedin.com/in/robbinsclay/',
+ },
];
const advisors: ProfileInfo[] = [
@@ -188,10 +260,10 @@ const styles: Styles = {
};
export class About extends React.Component<AboutProps, AboutState> {
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public render() {
+ public render(): React.ReactNode {
return (
<div style={{ backgroundColor: colors.lightestGrey }}>
<DocumentTitle title="0x About Us" />
@@ -212,9 +284,9 @@ export class About extends React.Component<AboutProps, AboutState> {
lineHeight: 1.5,
}}
>
- Our team is a diverse and globally distributed group with backgrounds in engineering,
- research, business and design. We are passionate about decentralized technology and its
- potential to act as an equalizing force in the world.
+ Our team is a globally distributed group with backgrounds in engineering, research, business
+ and design. We are passionate about decentralized technology and its potential to act as an
+ equalizing force in the world.
</div>
</div>
<div className="pt3 md-px4 lg-px0">
@@ -222,6 +294,9 @@ export class About extends React.Component<AboutProps, AboutState> {
<div className="clearfix">{this._renderProfiles(teamRow2)}</div>
<div className="clearfix">{this._renderProfiles(teamRow3)}</div>
<div className="clearfix">{this._renderProfiles(teamRow4)}</div>
+ <div className="clearfix">{this._renderProfiles(teamRow5)}</div>
+ <div className="clearfix">{this._renderProfiles(teamRow6)}</div>
+ <div className="clearfix">{this._renderProfiles(teamRow7)}</div>
</div>
<div className="pt3 pb2">
<div
@@ -250,9 +325,9 @@ export class About extends React.Component<AboutProps, AboutState> {
}}
>
We are seeking outstanding candidates to{' '}
- <a href={constants.URL_ANGELLIST} target="_blank" style={{ color: 'black' }}>
+ <Link to={WebsitePaths.Careers} style={{ color: 'black' }}>
join our team
- </a>
+ </Link>
. We value passion, diversity and unique perspectives.
</div>
</div>
@@ -261,7 +336,7 @@ export class About extends React.Component<AboutProps, AboutState> {
</div>
);
}
- private _renderProfiles(profiles: ProfileInfo[]) {
+ private _renderProfiles(profiles: ProfileInfo[]): React.ReactNode {
const numIndiv = profiles.length;
const colSize = utils.getColSize(numIndiv);
return _.map(profiles, profile => {
diff --git a/packages/website/ts/pages/about/profile.tsx b/packages/website/ts/pages/about/profile.tsx
index 4361da103..bcbeb0272 100644
--- a/packages/website/ts/pages/about/profile.tsx
+++ b/packages/website/ts/pages/about/profile.tsx
@@ -22,7 +22,7 @@ interface ProfileProps {
profileInfo: ProfileInfo;
}
-export function Profile(props: ProfileProps) {
+export const Profile = (props: ProfileProps) => {
return (
<div className={`lg-col md-col lg-col-${props.colSize} md-col-6`}>
<div style={{ maxWidth: 300 }} className="mx-auto lg-px3 md-px3 sm-px4 sm-pb3">
@@ -39,6 +39,7 @@ export function Profile(props: ProfileProps) {
fontSize: 14,
fontFamily: 'Roboto Mono',
color: colors.darkGrey,
+ whiteSpace: 'nowrap',
}}
>
{props.profileInfo.title.toUpperCase()}
@@ -47,15 +48,15 @@ export function Profile(props: ProfileProps) {
<div style={{ minHeight: 60, lineHeight: 1.4 }} className="pt1 pb2 mx-auto lg-h6 md-h6 sm-h5 sm-center">
{props.profileInfo.description}
</div>
- <div className="flex pb3 mx-auto sm-hide xs-hide" style={{ width: 280, opacity: 0.5 }}>
+ <div className="flex pb3 sm-hide xs-hide" style={{ width: 280, opacity: 0.5 }}>
{renderSocialMediaIcons(props.profileInfo)}
</div>
</div>
</div>
);
-}
+};
-function renderSocialMediaIcons(profileInfo: ProfileInfo) {
+function renderSocialMediaIcons(profileInfo: ProfileInfo): React.ReactNode {
const icons = [
renderSocialMediaIcon('zmdi-github-box', profileInfo.github),
renderSocialMediaIcon('zmdi-linkedin-box', profileInfo.linkedIn),
@@ -64,7 +65,7 @@ function renderSocialMediaIcons(profileInfo: ProfileInfo) {
return icons;
}
-function renderSocialMediaIcon(iconName: string, url: string) {
+function renderSocialMediaIcon(iconName: string, url: string): React.ReactNode {
if (_.isEmpty(url)) {
return null;
}
diff --git a/packages/website/ts/pages/documentation/doc_page.tsx b/packages/website/ts/pages/documentation/doc_page.tsx
index 8ec1a023d..8159bbd49 100644
--- a/packages/website/ts/pages/documentation/doc_page.tsx
+++ b/packages/website/ts/pages/documentation/doc_page.tsx
@@ -1,5 +1,4 @@
-import { DocAgnosticFormat, DocsInfo, Documentation, DoxityDocObj } from '@0xproject/react-docs';
-import { MenuSubsectionsBySection } from '@0xproject/react-shared';
+import { DocAgnosticFormat, DocsInfo, Documentation } from '@0xproject/react-docs';
import findVersions = require('find-versions');
import * as _ from 'lodash';
import * as React from 'react';
@@ -8,14 +7,13 @@ import semverSort = require('semver-sort');
import { SidebarHeader } from 'ts/components/sidebar_header';
import { TopBar } from 'ts/components/top_bar/top_bar';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { DocPackages, Environments } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { DocPackages } from 'ts/types';
import { constants } from 'ts/utils/constants';
import { docUtils } from 'ts/utils/doc_utils';
import { Translate } from 'ts/utils/translate';
import { utils } from 'ts/utils/utils';
-const isDevelopment = configs.ENVIRONMENT === Environments.DEVELOPMENT;
+const isDevelopmentOrStaging = utils.isDevelopment() || utils.isStaging();
const DEFAULT_ICON = 'docs.png';
const ZERO_EX_JS_VERSION_MISSING_TOPLEVEL_PATH = '0.32.4';
@@ -30,10 +28,12 @@ const docIdToSubpackageName: { [id: string]: string } = {
[DocPackages.Connect]: 'connect',
[DocPackages.SmartContracts]: 'contracts',
[DocPackages.Web3Wrapper]: 'web3-wrapper',
- [DocPackages.Deployer]: 'deployer',
+ [DocPackages.SolCompiler]: 'sol-compiler',
[DocPackages.JSONSchemas]: 'json-schemas',
[DocPackages.SolCov]: 'sol-cov',
[DocPackages.Subproviders]: 'subproviders',
+ [DocPackages.OrderUtils]: 'order-utils',
+ [DocPackages.EthereumTypes]: 'ethereum-types',
};
export interface DocPageProps {
@@ -58,7 +58,7 @@ export class DocPage extends React.Component<DocPageProps, DocPageState> {
docAgnosticFormat: undefined,
};
}
- public componentWillMount() {
+ public componentWillMount(): void {
const pathName = this.props.location.pathname;
const lastSegment = pathName.substr(pathName.lastIndexOf('/') + 1);
const versions = findVersions(lastSegment);
@@ -66,10 +66,10 @@ export class DocPage extends React.Component<DocPageProps, DocPageState> {
// tslint:disable-next-line:no-floating-promises
this._fetchJSONDocsFireAndForgetAsync(preferredVersionIfExists);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
}
- public render() {
+ public render(): React.ReactNode {
const menuSubsectionsBySection = _.isUndefined(this.state.docAgnosticFormat)
? {}
: this.props.docsInfo.getMenuSubsectionsBySection(this.state.docAgnosticFormat);
@@ -106,7 +106,9 @@ export class DocPage extends React.Component<DocPageProps, DocPageState> {
}
private async _fetchJSONDocsFireAndForgetAsync(preferredVersionIfExists?: string): Promise<void> {
const folderName = docIdToSubpackageName[this.props.docsInfo.id];
- const docBucketRoot = isDevelopment ? constants.S3_STAGING_DOC_BUCKET_ROOT : constants.S3_DOC_BUCKET_ROOT;
+ const docBucketRoot = isDevelopmentOrStaging
+ ? constants.S3_STAGING_DOC_BUCKET_ROOT
+ : constants.S3_DOC_BUCKET_ROOT;
const versionToFilePath = await docUtils.getVersionToFilePathAsync(docBucketRoot, folderName);
const versions = _.keys(versionToFilePath);
this.props.dispatcher.updateAvailableDocVersions(versions);
@@ -132,7 +134,7 @@ export class DocPage extends React.Component<DocPageProps, DocPageState> {
});
}
}
- private _getSourceUrl() {
+ private _getSourceUrl(): string {
const url = this.props.docsInfo.packageUrl;
let pkg = docIdToSubpackageName[this.props.docsInfo.id];
let tagPrefix = pkg;
@@ -152,7 +154,7 @@ export class DocPage extends React.Component<DocPageProps, DocPageState> {
const sourceUrl = `${url}/blob/${tagPrefix}%40${this.props.docsVersion}/packages${pkg}`;
return sourceUrl;
}
- private _onVersionSelected(semver: string) {
+ private _onVersionSelected(semver: string): void {
let path = window.location.pathname;
const lastChar = path[path.length - 1];
if (_.isFinite(_.parseInt(lastChar))) {
diff --git a/packages/website/ts/pages/faq/faq.tsx b/packages/website/ts/pages/faq/faq.tsx
index 701031d44..c9295d806 100644
--- a/packages/website/ts/pages/faq/faq.tsx
+++ b/packages/website/ts/pages/faq/faq.tsx
@@ -404,10 +404,10 @@ const sections: FAQSection[] = [
];
export class FAQ extends React.Component<FAQProps, FAQState> {
- public componentDidMount() {
+ public componentDidMount(): void {
window.scrollTo(0, 0);
}
- public render() {
+ public render(): React.ReactNode {
return (
<div>
<DocumentTitle title="0x FAQ" />
@@ -422,7 +422,7 @@ export class FAQ extends React.Component<FAQProps, FAQState> {
</div>
);
}
- private _renderSections() {
+ private _renderSections(): React.ReactNode {
const renderedSections = _.map(sections, (section: FAQSection, i: number) => {
const isFirstSection = i === 0;
return (
@@ -434,7 +434,7 @@ export class FAQ extends React.Component<FAQProps, FAQState> {
});
return renderedSections;
}
- private _renderQuestions(questions: FAQQuestion[], isFirstSection: boolean) {
+ private _renderQuestions(questions: FAQQuestion[], isFirstSection: boolean): React.ReactNode {
const renderedQuestions = _.map(questions, (question: FAQQuestion, i: number) => {
const isFirstQuestion = i === 0;
return (
diff --git a/packages/website/ts/pages/faq/question.tsx b/packages/website/ts/pages/faq/question.tsx
index 240dae910..f80985257 100644
--- a/packages/website/ts/pages/faq/question.tsx
+++ b/packages/website/ts/pages/faq/question.tsx
@@ -1,5 +1,4 @@
import { colors } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import { Card, CardHeader, CardText } from 'material-ui/Card';
import * as React from 'react';
@@ -20,7 +19,7 @@ export class Question extends React.Component<QuestionProps, QuestionState> {
isExpanded: props.shouldDisplayExpanded,
};
}
- public render() {
+ public render(): React.ReactNode {
return (
<div className="py1">
<Card
@@ -43,7 +42,7 @@ export class Question extends React.Component<QuestionProps, QuestionState> {
</div>
);
}
- private _onExchangeChange() {
+ private _onExchangeChange(): void {
this.setState({
isExpanded: !this.state.isExpanded,
});
diff --git a/packages/website/ts/pages/fullscreen_message.tsx b/packages/website/ts/pages/fullscreen_message.tsx
new file mode 100644
index 000000000..6fcf7b32c
--- /dev/null
+++ b/packages/website/ts/pages/fullscreen_message.tsx
@@ -0,0 +1,30 @@
+import { Styles } from '@0xproject/react-shared';
+import * as React from 'react';
+
+export interface FullscreenMessageProps {
+ headerText: string;
+ bodyText: string;
+}
+
+const styles: Styles = {
+ thin: {
+ fontWeight: 100,
+ },
+};
+
+export const FullscreenMessage = (props: FullscreenMessageProps) => {
+ return (
+ <div className="mx-auto max-width-4 py4">
+ <div className="center py4">
+ <div className="py4">
+ <div className="py4">
+ <h1 style={styles.thin}>{props.headerText}</h1>
+ <div className="py1">
+ <div className="py3">{props.bodyText}</div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ );
+};
diff --git a/packages/website/ts/pages/jobs/benefits.tsx b/packages/website/ts/pages/jobs/benefits.tsx
new file mode 100644
index 000000000..563b72e63
--- /dev/null
+++ b/packages/website/ts/pages/jobs/benefits.tsx
@@ -0,0 +1,158 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { Circle } from 'ts/components/ui/circle';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { styled } from 'ts/style/theme';
+import { ScreenWidths } from 'ts/types';
+import { constants } from 'ts/utils/constants';
+
+const BENEFITS = [
+ 'Comprehensive insurance (medical, dental, and vision)',
+ 'Unlimited vacation (three weeks per year minimum)',
+ 'Meals and snacks provided in-office daily',
+ 'Flexible hours and liberal work-from-home-policy',
+ 'Supportive remote working environment',
+ 'Transportation, phone, and wellness expense',
+ 'Relocation assistance',
+ 'Optional team excursions (fully paid, often international)',
+ 'Competitive salary and cryptocurrency-based compensation',
+];
+
+interface Value {
+ iconSrc: string;
+ text: string;
+}
+const VALUES: Value[] = [
+ {
+ iconSrc: 'images/jobs/heart-icon.svg',
+ text: 'Do the right thing',
+ },
+ {
+ iconSrc: 'images/jobs/ship-icon.svg',
+ text: 'Consistently ship',
+ },
+ {
+ iconSrc: 'images/jobs/calendar-icon.svg',
+ text: 'Focus on long term impact',
+ },
+];
+
+export interface BenefitsProps {
+ screenWidth: ScreenWidths;
+}
+
+export const Benefits = (props: BenefitsProps) => {
+ const isSmallScreen = props.screenWidth === ScreenWidths.Sm;
+ return (
+ <Container className="flex flex-column items-center py4 px3" backgroundColor={colors.white}>
+ {!isSmallScreen ? (
+ <Container className="flex" maxWidth="1200px">
+ <BenefitsList />
+ <Container marginLeft="120px">
+ <ValuesList />
+ </Container>
+ </Container>
+ ) : (
+ <Container className="flex-column">
+ <BenefitsList />
+ <Container marginTop="50px">
+ <ValuesList />
+ </Container>
+ </Container>
+ )}
+ </Container>
+ );
+};
+
+const Header: React.StatelessComponent = ({ children }) => (
+ <Container marginBottom="30px">
+ <Text fontFamily="Roboto Mono" fontSize="24px" fontColor={colors.black}>
+ {children}
+ </Text>
+ </Container>
+);
+
+interface BenefitsListProps {
+ className?: string;
+}
+const PlainBenefitsList: React.StatelessComponent<BenefitsListProps> = ({ className }) => {
+ return (
+ <Container className={className}>
+ <Header>Benefits</Header>
+ {_.map(BENEFITS, benefit => <BenefitItem key={benefit} description={benefit} />)}
+ </Container>
+ );
+};
+const BenefitsList = styled(PlainBenefitsList)`
+ transform: translateY(30px);
+`;
+
+interface BenefitItemProps {
+ description: string;
+}
+
+const BenefitItem: React.StatelessComponent<BenefitItemProps> = ({ description }) => (
+ <Container marginBottom="15px">
+ <div className="flex">
+ <Circle className="flex-none pr2 pt1" diameter={8} fillColor={colors.black} />
+ <div className="flex-auto">
+ <Text fontSize="14px" lineHeight="24px">
+ {description}
+ </Text>
+ </div>
+ </div>
+ </Container>
+);
+
+interface ValuesListProps {
+ className?: string;
+}
+const PlainValuesList: React.StatelessComponent<ValuesListProps> = ({ className }) => {
+ return (
+ <Container className={className} maxWidth="270px">
+ <Header>Our Values</Header>
+ {_.map(VALUES, value => <ValueItem key={value.text} {...value} />)}
+ <Text fontSize="14px" lineHeight="26px">
+ We care deeply about our culture and values, and encourage you to{' '}
+ <a
+ style={{ color: colors.mediumBlue, textDecoration: 'none' }}
+ target="_blank"
+ href={constants.URL_MISSION_AND_VALUES_BLOG_POST}
+ >
+ read more on our blog
+ </a>.
+ </Text>
+ </Container>
+ );
+};
+
+const ValuesList = styled(PlainValuesList)`
+ border-color: ${colors.beigeWhite};
+ border-radius: 7px;
+ border-width: 1px;
+ border-style: solid;
+ padding-left: 38px;
+ padding-right: 38px;
+ padding-top: 28px;
+ padding-bottom: 28px;
+`;
+
+type ValueItemProps = Value;
+const ValueItem: React.StatelessComponent<ValueItemProps> = ({ iconSrc, text }) => {
+ return (
+ <Container marginBottom="25px">
+ <div className="flex items-center">
+ <Image className="flex-none pr2" width="20px" src={iconSrc} />
+ <div className="flex-auto">
+ <Text fontSize="14px" lineHeight="24px" fontWeight="bold">
+ {text}
+ </Text>
+ </div>
+ </div>
+ </Container>
+ );
+};
diff --git a/packages/website/ts/pages/jobs/jobs.tsx b/packages/website/ts/pages/jobs/jobs.tsx
new file mode 100644
index 000000000..cc4b1f04b
--- /dev/null
+++ b/packages/website/ts/pages/jobs/jobs.tsx
@@ -0,0 +1,71 @@
+import { colors, utils as sharedUtils } from '@0xproject/react-shared';
+import * as _ from 'lodash';
+import * as React from 'react';
+import * as DocumentTitle from 'react-document-title';
+
+import { Footer } from 'ts/components/footer';
+import { MetaTags } from 'ts/components/meta_tags';
+import { TopBar } from 'ts/components/top_bar/top_bar';
+import { Container } from 'ts/components/ui/container';
+import { Benefits } from 'ts/pages/jobs/benefits';
+import { Join0x } from 'ts/pages/jobs/join_0x';
+import { Mission } from 'ts/pages/jobs/mission';
+import { OpenPositions } from 'ts/pages/jobs/open_positions';
+import { Dispatcher } from 'ts/redux/dispatcher';
+import { ScreenWidths } from 'ts/types';
+import { Translate } from 'ts/utils/translate';
+import { utils } from 'ts/utils/utils';
+
+const OPEN_POSITIONS_HASH = 'positions';
+const THROTTLE_TIMEOUT = 100;
+const DOCUMENT_TITLE = 'Careers at 0x';
+const DOCUMENT_DESCRIPTION = 'Join 0x in creating a tokenized world where all value can flow freely';
+
+export interface JobsProps {
+ location: Location;
+ translate: Translate;
+ dispatcher: Dispatcher;
+ screenWidth: ScreenWidths;
+}
+
+export interface JobsState {}
+
+export class Jobs extends React.Component<JobsProps, JobsState> {
+ // TODO: consolidate this small screen scaffolding into one place (its being used in portal and docs as well)
+ private readonly _throttledScreenWidthUpdate: () => void;
+ public constructor(props: JobsProps) {
+ super(props);
+ this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT);
+ }
+ public componentDidMount(): void {
+ window.addEventListener('resize', this._throttledScreenWidthUpdate);
+ window.scrollTo(0, 0);
+ }
+ public render(): React.ReactNode {
+ return (
+ <Container overflowX="hidden">
+ <MetaTags title={DOCUMENT_TITLE} description={DOCUMENT_DESCRIPTION} />
+ <DocumentTitle title={DOCUMENT_TITLE} />
+ <TopBar
+ blockchainIsLoaded={false}
+ location={this.props.location}
+ style={{ backgroundColor: colors.white, position: 'relative' }}
+ translate={this.props.translate}
+ />
+ <Join0x onCallToActionClick={this._onJoin0xCallToActionClick.bind(this)} />
+ <Mission screenWidth={this.props.screenWidth} />
+ <Benefits screenWidth={this.props.screenWidth} />
+ <OpenPositions hash={OPEN_POSITIONS_HASH} screenWidth={this.props.screenWidth} />
+ <Footer translate={this.props.translate} dispatcher={this.props.dispatcher} />
+ </Container>
+ );
+ }
+ private _onJoin0xCallToActionClick(): void {
+ sharedUtils.setUrlHash(OPEN_POSITIONS_HASH);
+ sharedUtils.scrollToHash(OPEN_POSITIONS_HASH, '');
+ }
+ private _updateScreenWidth(): void {
+ const newScreenWidth = utils.getScreenWidth();
+ this.props.dispatcher.updateScreenWidth(newScreenWidth);
+ }
+}
diff --git a/packages/website/ts/pages/jobs/join_0x.tsx b/packages/website/ts/pages/jobs/join_0x.tsx
new file mode 100644
index 000000000..ec8afbd93
--- /dev/null
+++ b/packages/website/ts/pages/jobs/join_0x.tsx
@@ -0,0 +1,64 @@
+import { colors } from '@0xproject/react-shared';
+
+import * as React from 'react';
+
+import { Button } from 'ts/components/ui/button';
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+import { constants } from 'ts/utils/constants';
+
+const BUTTON_TEXT = 'View open positions';
+
+export interface Join0xProps {
+ onCallToActionClick: () => void;
+}
+
+export const Join0x = (props: Join0xProps) => (
+ <div className="clearfix center lg-py4 md-py4" style={{ backgroundColor: colors.white, color: colors.black }}>
+ <div
+ className="mx-auto inline-block align-middle py4"
+ style={{ lineHeight: '44px', textAlign: 'center', position: 'relative' }}
+ >
+ <Container className="sm-hide xs-hide" position="absolute" left="100%" marginLeft="80px">
+ <Image src="images/jobs/hero-dots-right.svg" width="400px" />
+ </Container>
+ <Container className="sm-hide xs-hide" position="absolute" right="100%" marginRight="80px">
+ <Image src="images/jobs/hero-dots-left.svg" width="400px" />
+ </Container>
+ <div className="h2 sm-center sm-pt3" style={{ fontFamily: 'Roboto Mono' }}>
+ Join Us in Our Mission
+ </div>
+ <Container className="pb2 lg-pt2 md-pt2 sm-pt3 sm-px3 sm-center" maxWidth="537px">
+ <Text fontSize="14px" lineHeight="30px">
+ At 0x, our mission is to create a tokenized world where all value can flow freely.
+ <br />
+ <br />We are powering a growing ecosystem of decentralized applications and solving novel challenges
+ to make our technology intuitive, flexible, and accessible to all.{' '}
+ <a
+ style={{ color: colors.mediumBlue, textDecoration: 'none' }}
+ target="_blank"
+ href={constants.URL_MISSION_AND_VALUES_BLOG_POST}
+ >
+ Read more
+ </a>{' '}
+ about our mission, and join us in building financial infrastructure upon which the exchange of
+ anything of value will take place.
+ </Text>
+ </Container>
+ <div className="py3">
+ <Button
+ type="button"
+ backgroundColor={colors.black}
+ width="290px"
+ fontColor={colors.white}
+ fontSize="18px"
+ fontFamily="Roboto Mono"
+ onClick={props.onCallToActionClick}
+ >
+ {BUTTON_TEXT}
+ </Button>
+ </div>
+ </div>
+ </div>
+);
diff --git a/packages/website/ts/pages/jobs/mission.tsx b/packages/website/ts/pages/jobs/mission.tsx
new file mode 100644
index 000000000..28546f985
--- /dev/null
+++ b/packages/website/ts/pages/jobs/mission.tsx
@@ -0,0 +1,47 @@
+import * as React from 'react';
+
+import { Container } from 'ts/components/ui/container';
+import { Image } from 'ts/components/ui/image';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { ScreenWidths } from 'ts/types';
+
+export interface MissionProps {
+ screenWidth: ScreenWidths;
+}
+export const Mission = (props: MissionProps) => {
+ const shouldShowImage = props.screenWidth === ScreenWidths.Lg;
+ const image = <Image src="/images/jobs/world-map.svg" maxWidth="500px" maxHeight="280px" />;
+ const missionStatementClassName = !shouldShowImage ? 'center' : undefined;
+ const missionStatement = (
+ <Container className={missionStatementClassName} maxWidth="388px">
+ <Text fontFamily="Roboto Mono" fontSize="22px" lineHeight="31px">
+ Powered by a Diverse<br />Worldwide Community
+ </Text>
+ <Container marginTop="32px">
+ <Text fontSize="14px" lineHeight="2em">
+ We're a highly technical team with varied backgrounds in engineering, science, business, finance,
+ and research. While the core team is headquartered in San Francisco, there are 30+ teams building on
+ 0x and hundreds of thousands of participants behind our efforts globally. We're passionate about
+ open-source software and decentralized technology's potential to act as an equalizing force in the
+ world.
+ </Text>
+ </Container>
+ </Container>
+ );
+ return (
+ <div
+ className="flex flex-column items-center py4 px3"
+ style={{ backgroundColor: colors.jobsPageBackground, color: colors.black }}
+ >
+ {shouldShowImage ? (
+ <Container className="flex items-center" maxWidth="1200px">
+ {image}
+ <Container marginLeft="115px">{missionStatement}</Container>
+ </Container>
+ ) : (
+ <Container className="flex flex-column items-center">{missionStatement}</Container>
+ )}
+ </div>
+ );
+};
diff --git a/packages/website/ts/pages/jobs/open_positions.tsx b/packages/website/ts/pages/jobs/open_positions.tsx
new file mode 100644
index 000000000..b8442a9c4
--- /dev/null
+++ b/packages/website/ts/pages/jobs/open_positions.tsx
@@ -0,0 +1,179 @@
+import * as _ from 'lodash';
+import CircularProgress from 'material-ui/CircularProgress';
+import * as React from 'react';
+
+import { Container } from 'ts/components/ui/container';
+import { Retry } from 'ts/components/ui/retry';
+import { Text } from 'ts/components/ui/text';
+import { colors } from 'ts/style/colors';
+import { styled } from 'ts/style/theme';
+import { ScreenWidths, WebsiteBackendJobInfo } from 'ts/types';
+import { backendClient } from 'ts/utils/backend_client';
+import { constants } from 'ts/utils/constants';
+import { utils } from 'ts/utils/utils';
+
+const TABLE_ROW_MIN_HEIGHT = 100;
+
+export interface OpenPositionsProps {
+ hash: string;
+ screenWidth: ScreenWidths;
+}
+export interface OpenPositionsState {
+ jobInfos?: WebsiteBackendJobInfo[];
+ error?: Error;
+}
+
+export class OpenPositions extends React.Component<OpenPositionsProps, OpenPositionsState> {
+ private _isUnmounted: boolean;
+ constructor(props: OpenPositionsProps) {
+ super(props);
+ this._isUnmounted = false;
+ this.state = {
+ jobInfos: undefined,
+ error: undefined,
+ };
+ }
+ public componentWillMount(): void {
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchJobInfosAsync();
+ }
+ public componentWillUnmount(): void {
+ this._isUnmounted = true;
+ }
+ public render(): React.ReactNode {
+ const isReadyToRender = _.isUndefined(this.state.error) && !_.isUndefined(this.state.jobInfos);
+ const isSmallScreen = utils.isMobileWidth(this.props.screenWidth);
+ return (
+ <Container id={this.props.hash} className="mx-auto pb4 px3 max-width-4">
+ {!isSmallScreen && (
+ <hr style={{ border: 0, borderTop: 1, borderStyle: 'solid', borderColor: colors.beigeWhite }} />
+ )}
+ <Container marginTop="64px" marginBottom="50px">
+ <Text fontFamily="Roboto Mono" fontSize="24px" fontColor={colors.black}>
+ Open Positions
+ </Text>
+ </Container>
+ {isReadyToRender ? this._renderTable() : this._renderLoading()}
+ </Container>
+ );
+ }
+ private _renderLoading(): React.ReactNode {
+ return (
+ // TODO: consolidate this loading component with the one in portal and RelayerIndex
+ // TODO: possibly refactor into a generic loading container with spinner and retry UI
+ <div className="center">
+ {_.isUndefined(this.state.error) ? (
+ <CircularProgress size={40} thickness={5} />
+ ) : (
+ <Retry onRetry={this._fetchJobInfosAsync.bind(this)} />
+ )}
+ </div>
+ );
+ }
+ private _renderTable(): React.ReactNode {
+ return (
+ <Container width="100%">
+ <div>
+ {_.map(this.state.jobInfos, jobInfo => {
+ return (
+ <JobInfoTableRow
+ key={jobInfo.id}
+ screenWidth={this.props.screenWidth}
+ jobInfo={jobInfo}
+ onClick={this._openJobInfoUrl.bind(this, jobInfo)}
+ />
+ );
+ })}
+ </div>
+ <Container className="center" marginTop="70px">
+ <Text fontStyle="italic" fontSize="14px">
+ Interested in telling us why you'd be a valuable addition to the team outside of the positions
+ listed above?{' '}
+ <a
+ style={{ color: colors.mediumBlue, textDecoration: 'none' }}
+ href={`mailto:${constants.EMAIL_JOBS}`}
+ >
+ Email us!
+ </a>
+ </Text>
+ </Container>
+ </Container>
+ );
+ }
+ private async _fetchJobInfosAsync(): Promise<void> {
+ try {
+ if (!this._isUnmounted) {
+ this.setState({
+ jobInfos: undefined,
+ error: undefined,
+ });
+ }
+ const jobInfos = await backendClient.getJobInfosAsync();
+ if (!this._isUnmounted) {
+ this.setState({
+ jobInfos,
+ });
+ }
+ } catch (error) {
+ if (!this._isUnmounted) {
+ this.setState({
+ error,
+ });
+ }
+ }
+ }
+ private _openJobInfoUrl(jobInfo: WebsiteBackendJobInfo): void {
+ const url = jobInfo.url;
+ utils.openUrl(url);
+ }
+}
+
+export interface JobInfoTableRowProps {
+ className?: string;
+ screenWidth: ScreenWidths;
+ jobInfo: WebsiteBackendJobInfo;
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
+}
+
+const PlainJobInfoTableRow: React.StatelessComponent<JobInfoTableRowProps> = ({
+ className,
+ screenWidth,
+ jobInfo,
+ onClick,
+}) => {
+ const isSmallScreen = screenWidth === ScreenWidths.Sm;
+ const titleClassName = isSmallScreen ? 'col col-12 center' : 'col col-5';
+ const paddingLeft = isSmallScreen ? undefined : '30px';
+ return (
+ <Container className={className} onClick={onClick} marginBottom="30px" paddingLeft={paddingLeft}>
+ <Container className="flex items-center" minHeight={TABLE_ROW_MIN_HEIGHT} width="100%">
+ <Container className="clearfix container" width="100%">
+ <Container className={titleClassName}>
+ <Text fontSize="16px" fontWeight="bold" fontColor={colors.mediumBlue}>
+ {jobInfo.title}
+ </Text>
+ </Container>
+ {!isSmallScreen && (
+ <Container className="col col-3">
+ <Text fontSize="16px">{jobInfo.department}</Text>
+ </Container>
+ )}
+ {!isSmallScreen && (
+ <Container className="col col-4 center">
+ <Text fontSize="16px">{jobInfo.office}</Text>
+ </Container>
+ )}
+ </Container>
+ </Container>
+ </Container>
+ );
+};
+
+export const JobInfoTableRow = styled(PlainJobInfoTableRow)`
+ cursor: pointer;
+ background-color: ${colors.grey100};
+ border-radius: 7px;
+ &:hover {
+ opacity: 0.5;
+ }
+`;
diff --git a/packages/website/ts/pages/jobs/photo_rail.tsx b/packages/website/ts/pages/jobs/photo_rail.tsx
new file mode 100644
index 000000000..acc9dcb91
--- /dev/null
+++ b/packages/website/ts/pages/jobs/photo_rail.tsx
@@ -0,0 +1,22 @@
+import * as _ from 'lodash';
+import * as React from 'react';
+
+import { FilledImage } from 'ts/components/ui/filled_image';
+
+export interface PhotoRailProps {
+ images: string[];
+}
+
+export const PhotoRail = (props: PhotoRailProps) => {
+ return (
+ <div className="clearfix" style={{ height: 490 }}>
+ {_.map(props.images, (image: string) => {
+ return (
+ <div key={image} className="col lg-col-4 md-col-4 col-12 center" style={{ height: '100%' }}>
+ <FilledImage src={image} />
+ </div>
+ );
+ })}
+ </div>
+ );
+};
diff --git a/packages/website/ts/pages/landing/landing.tsx b/packages/website/ts/pages/landing/landing.tsx
index c943e3d79..2a51ee3c0 100644
--- a/packages/website/ts/pages/landing/landing.tsx
+++ b/packages/website/ts/pages/landing/landing.tsx
@@ -1,11 +1,13 @@
import { colors } from '@0xproject/react-shared';
import * as _ from 'lodash';
-import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react';
import DocumentTitle = require('react-document-title');
import { Link } from 'react-router-dom';
import { Footer } from 'ts/components/footer';
+import { SubscribeForm } from 'ts/components/forms/subscribe_form';
import { TopBar } from 'ts/components/top_bar/top_bar';
+import { CallToAction } from 'ts/components/ui/button';
+import { Container } from 'ts/components/ui/container';
import { Dispatcher } from 'ts/redux/dispatcher';
import { Deco, Key, Language, ScreenWidths, WebsitePaths } from 'ts/types';
import { constants } from 'ts/utils/constants';
@@ -37,6 +39,8 @@ interface Project {
}
const THROTTLE_TIMEOUT = 100;
+const WHATS_NEW_TITLE = '18 ideas for 0x relayers in 2018';
+const WHATS_NEW_URL = 'https://blog.0xproject.com/18-ideas-for-0x-relayers-in-2018-80a1498b955f';
const relayersAndDappProjects: Project[] = [
{
@@ -92,8 +96,8 @@ const relayersAndDappProjects: Project[] = [
projectUrl: constants.PROJECT_URL_BLOCKNET,
},
{
- logoFileName: 'status.png',
- projectUrl: constants.PROJECT_URL_STATUS,
+ logoFileName: 'imtoken.png',
+ projectUrl: constants.PROJECT_URL_IMTOKEN,
},
{
logoFileName: 'augur.png',
@@ -123,10 +127,6 @@ const relayerProjects: Project[] = [
projectUrl: constants.PROJECT_URL_0CEAN,
},
{
- logoFileName: 'dydx.png',
- projectUrl: constants.PROJECT_URL_DYDX,
- },
- {
logoFileName: 'amadeus.png',
projectUrl: constants.PROJECT_URL_AMADEUS,
},
@@ -154,6 +154,10 @@ const relayerProjects: Project[] = [
logoFileName: 'idt.png',
projectUrl: constants.PROJECT_URL_IDT,
},
+ {
+ logoFileName: 'imtoken.png',
+ projectUrl: constants.PROJECT_URL_IMTOKEN,
+ },
];
export interface LandingProps {
@@ -167,7 +171,7 @@ interface LandingState {
}
export class Landing extends React.Component<LandingProps, LandingState> {
- private _throttledScreenWidthUpdate: () => void;
+ private readonly _throttledScreenWidthUpdate: () => void;
constructor(props: LandingProps) {
super(props);
this.state = {
@@ -175,14 +179,14 @@ export class Landing extends React.Component<LandingProps, LandingState> {
};
this._throttledScreenWidthUpdate = _.throttle(this._updateScreenWidth.bind(this), THROTTLE_TIMEOUT);
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.addEventListener('resize', this._throttledScreenWidthUpdate);
window.scrollTo(0, 0);
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
window.removeEventListener('resize', this._throttledScreenWidthUpdate);
}
- public render() {
+ public render(): React.ReactNode {
return (
<div id="landing" className="clearfix" style={{ color: colors.grey500 }}>
<DocumentTitle title="0x Protocol" />
@@ -216,24 +220,14 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderHero() {
+ private _renderHero(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
- const buttonLabelStyle: React.CSSProperties = {
- textTransform: 'none',
- fontSize: isSmallScreen ? 12 : 14,
- fontWeight: 400,
- };
- const lightButtonStyle: React.CSSProperties = {
- borderRadius: 6,
- border: '1px solid #D8D8D8',
- lineHeight: '33px',
- height: 38,
- };
const left = 'col lg-col-7 md-col-7 col-12 lg-pl4 md-pl4 sm-pl0 sm-px3 sm-center';
return (
<div className="clearfix py4" style={{ backgroundColor: colors.heroGrey }}>
<div className="mx-auto max-width-4 clearfix">
- <div className="lg-pt4 md-pt4 sm-pt2 lg-pb4 md-pb4 lg-my4 md-my4 sm-mt2 sm-mb4 clearfix">
+ {this._renderWhatsNew()}
+ <div className="lg-pt4 md-pt4 sm-pt2 lg-pb4 md-pb4 lg-mt4 md-mt4 sm-mt2 sm-mb4 clearfix">
<div className="col lg-col-5 md-col-5 col-12 sm-center">
<img src="/images/landing/hero_chip_image.png" height={isSmallScreen ? 300 : 395} />
</div>
@@ -265,44 +259,58 @@ export class Landing extends React.Component<LandingProps, LandingState> {
>
{this.props.translate.get(Key.TopTagline)}
</div>
- <div className="pt3 clearfix sm-mx-auto" style={{ maxWidth: 389 }}>
- <div className="lg-pr2 md-pr2 col col-6 sm-center">
+ <Container className="pt3 clearfix sm-mx-auto" maxWidth="390px">
+ <div className="lg-pr2 md-pr2 lg-col lg-col-6 sm-center sm-col sm-col-12 mb2">
<Link to={WebsitePaths.ZeroExJs} className="text-decoration-none">
- <RaisedButton
- style={{ borderRadius: 6, minWidth: 157.36 }}
- buttonStyle={{ borderRadius: 6 }}
- labelStyle={buttonLabelStyle}
- label={this.props.translate.get(Key.BuildCallToAction, Deco.Cap)}
- onClick={_.noop}
- />
+ <CallToAction width="175px" type="light">
+ {this.props.translate.get(Key.BuildCallToAction, Deco.Cap)}
+ </CallToAction>
</Link>
</div>
- <div className="col col-6 sm-center">
- <a
- href={constants.URL_ZEROEX_CHAT}
- target="_blank"
- className="text-decoration-none"
- >
- <RaisedButton
- style={{ borderRadius: 6, minWidth: 150 }}
- buttonStyle={lightButtonStyle}
- labelColor="white"
- backgroundColor={colors.heroGrey}
- labelStyle={buttonLabelStyle}
- label={this.props.translate.get(Key.CommunityCallToAction, Deco.Cap)}
- onClick={_.noop}
- />
- </a>
+ <div className="lg-col lg-col-6 sm-center sm-col sm-col-12">
+ <Link to={WebsitePaths.Portal} className="text-decoration-none">
+ <CallToAction width="175px">
+ {this.props.translate.get(Key.TradeCallToAction, Deco.Cap)}
+ </CallToAction>
+ </Link>
</div>
- </div>
+ </Container>
</div>
</div>
</div>
</div>
+ {this.props.translate.getLanguage() === Language.English && <SubscribeForm />}
</div>
);
}
- private _renderProjects(projects: Project[], title: string, backgroundColor: string, isTitleCenter: boolean) {
+ private _renderWhatsNew(): React.ReactNode {
+ return (
+ <div className="sm-center sm-px1">
+ <a href={WHATS_NEW_URL} target="_blank" className="inline-block text-decoration-none">
+ <div className="flex sm-pl0 md-pl2 lg-pl0" style={{ fontFamily: 'Roboto Mono', fontWeight: 600 }}>
+ <div
+ className="mr1 px1"
+ style={{
+ backgroundColor: colors.white,
+ borderRadius: 3,
+ color: colors.heroGrey,
+ height: 23,
+ }}
+ >
+ New
+ </div>
+ <div style={{ color: colors.darkGrey }}>{WHATS_NEW_TITLE}</div>
+ </div>
+ </a>
+ </div>
+ );
+ }
+ private _renderProjects(
+ projects: Project[],
+ title: string,
+ backgroundColor: string,
+ isTitleCenter: boolean,
+ ): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
const projectList = _.map(projects, (project: Project, i: number) => {
const isRelayersOnly = projects.length === 12;
@@ -319,6 +327,9 @@ export class Landing extends React.Component<LandingProps, LandingState> {
case ScreenWidths.Lg:
colWidth = isRelayersOnly ? 2 : 2 - i % 2;
break;
+
+ default:
+ throw new Error(`Encountered unknown ScreenWidths value: ${this.state.screenWidth}`);
}
return (
<div key={`project-${project.logoFileName}`} className={`col col-${colWidth} center`}>
@@ -368,7 +379,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderTokenizationSection() {
+ private _renderTokenizationSection(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
return (
<div className="clearfix lg-py4 md-py4 sm-pb4 sm-pt2" style={{ backgroundColor: colors.grey100 }}>
@@ -399,7 +410,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderProtocolSection() {
+ private _renderProtocolSection(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
return (
<div className="clearfix pt4" style={{ backgroundColor: colors.heroGrey }}>
@@ -444,7 +455,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderBuildingBlocksSection() {
+ private _renderBuildingBlocksSection(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
const descriptionStyle: React.CSSProperties = {
fontFamily: 'Roboto Mono',
@@ -501,7 +512,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderBlockChipImage() {
+ private _renderBlockChipImage(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
return (
<div className="col lg-col-6 md-col-6 col-12 sm-center">
@@ -509,7 +520,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderTokenCloud() {
+ private _renderTokenCloud(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
return (
<div className="col lg-col-6 md-col-6 col-12 center">
@@ -517,7 +528,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderAssetTypes() {
+ private _renderAssetTypes(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
const assetTypes: AssetType[] = [
{
@@ -560,7 +571,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
});
return assets;
}
- private _renderInfoBoxes() {
+ private _renderInfoBoxes(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
const boxStyle: React.CSSProperties = {
maxWidth: 253,
@@ -623,7 +634,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderUseCases() {
+ private _renderUseCases(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
const useCases: UseCase[] = [
@@ -721,19 +732,8 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _renderCallToAction() {
+ private _renderCallToAction(): React.ReactNode {
const isSmallScreen = this.state.screenWidth === ScreenWidths.Sm;
- const buttonLabelStyle: React.CSSProperties = {
- textTransform: 'none',
- fontSize: 15,
- fontWeight: 400,
- };
- const lightButtonStyle: React.CSSProperties = {
- borderRadius: 6,
- border: `1px solid ${colors.grey500}`,
- lineHeight: '33px',
- height: 49,
- };
const callToActionClassNames =
'lg-pr3 md-pr3 lg-right-align md-right-align sm-center sm-px3 h4 lg-table-cell md-table-cell';
return (
@@ -752,15 +752,9 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
<div className="sm-center sm-pt2 lg-table-cell md-table-cell">
<Link to={WebsitePaths.ZeroExJs} className="text-decoration-none">
- <RaisedButton
- style={{ borderRadius: 6, minWidth: 150 }}
- buttonStyle={lightButtonStyle}
- labelColor={colors.white}
- backgroundColor={colors.heroGrey}
- labelStyle={buttonLabelStyle}
- label={this.props.translate.get(Key.BuildCallToAction, Deco.Cap)}
- onClick={_.noop}
- />
+ <CallToAction fontSize="15px">
+ {this.props.translate.get(Key.BuildCallToAction, Deco.Cap)}
+ </CallToAction>
</Link>
</div>
</div>
@@ -768,7 +762,7 @@ export class Landing extends React.Component<LandingProps, LandingState> {
</div>
);
}
- private _updateScreenWidth() {
+ private _updateScreenWidth(): void {
const newScreenWidth = utils.getScreenWidth();
if (newScreenWidth !== this.state.screenWidth) {
this.setState({
@@ -776,7 +770,4 @@ export class Landing extends React.Component<LandingProps, LandingState> {
});
}
}
- private _onLanguageSelected(language: Language) {
- this.props.dispatcher.updateSelectedLanguage(language);
- }
} // tslint:disable:max-file-line-count
diff --git a/packages/website/ts/pages/not_found.tsx b/packages/website/ts/pages/not_found.tsx
index ff25a35e9..a7992a8fa 100644
--- a/packages/website/ts/pages/not_found.tsx
+++ b/packages/website/ts/pages/not_found.tsx
@@ -1,8 +1,7 @@
-import { Styles } from '@0xproject/react-shared';
-import * as _ from 'lodash';
import * as React from 'react';
import { Footer } from 'ts/components/footer';
import { TopBar } from 'ts/components/top_bar/top_bar';
+import { FullscreenMessage } from 'ts/pages/fullscreen_message';
import { Dispatcher } from 'ts/redux/dispatcher';
import { Translate } from 'ts/utils/translate';
@@ -12,35 +11,15 @@ export interface NotFoundProps {
dispatcher: Dispatcher;
}
-interface NotFoundState {}
-
-const styles: Styles = {
- thin: {
- fontWeight: 100,
- },
+export const NotFound = (props: NotFoundProps) => {
+ return (
+ <div>
+ <TopBar blockchainIsLoaded={false} location={props.location} translate={props.translate} />
+ <FullscreenMessage
+ headerText={'404 Not Found'}
+ bodyText={"Hm... looks like we couldn't find what you are looking for."}
+ />
+ <Footer translate={props.translate} dispatcher={props.dispatcher} />
+ </div>
+ );
};
-
-export class NotFound extends React.Component<NotFoundProps, NotFoundState> {
- public render() {
- return (
- <div>
- <TopBar blockchainIsLoaded={false} location={this.props.location} translate={this.props.translate} />
- <div className="mx-auto max-width-4 py4">
- <div className="center py4">
- <div className="py4">
- <div className="py4">
- <h1 style={{ ...styles.thin }}>404 Not Found</h1>
- <div className="py1">
- <div className="py3">
- Hm... looks like we couldn't find what you are looking for.
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <Footer translate={this.props.translate} dispatcher={this.props.dispatcher} />
- </div>
- );
- }
-}
diff --git a/packages/website/ts/pages/wiki/wiki.tsx b/packages/website/ts/pages/wiki/wiki.tsx
index 23d1b52fb..55f532b11 100644
--- a/packages/website/ts/pages/wiki/wiki.tsx
+++ b/packages/website/ts/pages/wiki/wiki.tsx
@@ -4,22 +4,19 @@ import {
HeaderSizes,
MarkdownSection,
NestedSidebarMenu,
- SectionHeader,
Styles,
utils as sharedUtils,
} from '@0xproject/react-shared';
-import { logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import CircularProgress from 'material-ui/CircularProgress';
import RaisedButton from 'material-ui/RaisedButton';
import * as React from 'react';
import DocumentTitle = require('react-document-title');
-import { scroller } from 'react-scroll';
import { SidebarHeader } from 'ts/components/sidebar_header';
import { TopBar } from 'ts/components/top_bar/top_bar';
import { Dispatcher } from 'ts/redux/dispatcher';
-import { Article, ArticlesBySection, WebsitePaths } from 'ts/types';
-import { configs } from 'ts/utils/configs';
+import { Article, ArticlesBySection } from 'ts/types';
+import { backendClient } from 'ts/utils/backend_client';
import { constants } from 'ts/utils/constants';
import { Translate } from 'ts/utils/translate';
import { utils } from 'ts/utils/utils';
@@ -46,7 +43,7 @@ const styles: Styles = {
left: 0,
bottom: 0,
right: 0,
- overflowZ: 'hidden',
+ overflow: 'hidden',
height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`,
WebkitOverflowScrolling: 'touch',
},
@@ -68,19 +65,19 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
isHoveringSidebar: false,
};
}
- public componentDidMount() {
+ public componentDidMount(): void {
window.addEventListener('hashchange', this._onHashChanged.bind(this), false);
}
- public componentWillMount() {
+ public componentWillMount(): void {
// tslint:disable-next-line:no-floating-promises
this._fetchArticlesBySectionAsync();
}
- public componentWillUnmount() {
+ public componentWillUnmount(): void {
this._isUnmounted = true;
clearTimeout(this._wikiBackoffTimeoutId);
window.removeEventListener('hashchange', this._onHashChanged.bind(this), false);
}
- public render() {
+ public render(): React.ReactNode {
const menuSubsectionsBySection = _.isUndefined(this.state.articlesBySection)
? {}
: this._getMenuSubsectionsBySection(this.state.articlesBySection);
@@ -170,7 +167,7 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
const sections = _.map(sectionNames, sectionName => this._renderSection(sectionName));
return sections;
}
- private _renderSection(sectionName: string) {
+ private _renderSection(sectionName: string): React.ReactNode {
const articles = this.state.articlesBySection[sectionName];
const renderedArticles = _.map(articles, (article: Article) => {
const githubLink = `${constants.URL_GITHUB_WIKI}/edit/master/${sectionName}/${article.fileName}`;
@@ -194,46 +191,39 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
);
});
return (
- <div key={`section-${sectionName}`} className="py2 md-px1 sm-px2">
- {/* <div className="pl2">
- <SectionHeader sectionName={sectionName} headerSize={HeaderSizes.H1} />
- </div> */}
+ <div key={`section-${sectionName}`} className="py2 md-px1 sm-px0">
{renderedArticles}
</div>
);
}
private async _fetchArticlesBySectionAsync(): Promise<void> {
- const endpoint = `${configs.BACKEND_BASE_URL}${WebsitePaths.Wiki}`;
- const response = await fetch(endpoint);
- if (response.status === constants.HTTP_NO_CONTENT_STATUS_CODE) {
- // We need to backoff and try fetching again later
- this._wikiBackoffTimeoutId = window.setTimeout(() => {
- // tslint:disable-next-line:no-floating-promises
- this._fetchArticlesBySectionAsync();
- }, WIKI_NOT_READY_BACKOUT_TIMEOUT_MS);
- return;
- }
- if (response.status !== 200) {
- // TODO: Show the user an error message when the wiki fail to load
- const errMsg = await response.text();
- logUtils.log(`Failed to load wiki: ${response.status} ${errMsg}`);
- return;
- }
- const articlesBySection = await response.json();
- if (!this._isUnmounted) {
- this.setState(
- {
- articlesBySection,
- },
- async () => {
- await utils.onPageLoadAsync();
- const hash = this.props.location.hash.slice(1);
- sharedUtils.scrollToHash(hash, sharedConstants.SCROLL_CONTAINER_ID);
- },
- );
+ try {
+ const articlesBySection = await backendClient.getWikiArticlesBySectionAsync();
+ if (!this._isUnmounted) {
+ this.setState(
+ {
+ articlesBySection,
+ },
+ async () => {
+ await utils.onPageLoadPromise;
+ const hash = this.props.location.hash.slice(1);
+ sharedUtils.scrollToHash(hash, sharedConstants.SCROLL_CONTAINER_ID);
+ },
+ );
+ }
+ } catch (err) {
+ const errMsg = `${err}`;
+ if (_.includes(errMsg, `${constants.HTTP_NO_CONTENT_STATUS_CODE}`)) {
+ // We need to backoff and try fetching again later
+ this._wikiBackoffTimeoutId = window.setTimeout(() => {
+ // tslint:disable-next-line:no-floating-promises
+ this._fetchArticlesBySectionAsync();
+ }, WIKI_NOT_READY_BACKOUT_TIMEOUT_MS);
+ return;
+ }
}
}
- private _getMenuSubsectionsBySection(articlesBySection: ArticlesBySection) {
+ private _getMenuSubsectionsBySection(articlesBySection: ArticlesBySection): { [section: string]: string[] } {
const sectionNames = _.keys(articlesBySection);
const menuSubsectionsBySection: { [section: string]: string[] } = {};
for (const sectionName of sectionNames) {
@@ -243,17 +233,17 @@ export class Wiki extends React.Component<WikiProps, WikiState> {
}
return menuSubsectionsBySection;
}
- private _onSidebarHover(event: React.FormEvent<HTMLInputElement>) {
+ private _onSidebarHover(_event: React.FormEvent<HTMLInputElement>): void {
this.setState({
isHoveringSidebar: true,
});
}
- private _onSidebarHoverOff() {
+ private _onSidebarHoverOff(): void {
this.setState({
isHoveringSidebar: false,
});
}
- private _onHashChanged(event: any) {
+ private _onHashChanged(_event: any): void {
const hash = window.location.hash.slice(1);
sharedUtils.scrollToHash(hash, sharedConstants.SCROLL_CONTAINER_ID);
}
diff --git a/packages/website/ts/redux/analyticsMiddleware.ts b/packages/website/ts/redux/analyticsMiddleware.ts
new file mode 100644
index 000000000..51d39a5d7
--- /dev/null
+++ b/packages/website/ts/redux/analyticsMiddleware.ts
@@ -0,0 +1,36 @@
+import { Middleware } from 'redux';
+import { State } from 'ts/redux/reducer';
+import { ActionTypes } from 'ts/types';
+import { analytics } from 'ts/utils/analytics';
+
+export const analyticsMiddleware: Middleware = store => next => action => {
+ const nextAction = next(action);
+ const nextState = (store.getState() as any) as State;
+ switch (action.type) {
+ case ActionTypes.UpdateInjectedProviderName:
+ analytics.addEventProperties({
+ injectedProviderName: nextState.injectedProviderName,
+ });
+ break;
+ case ActionTypes.UpdateNetworkId:
+ analytics.addEventProperties({
+ networkId: nextState.networkId,
+ });
+ break;
+ case ActionTypes.UpdateUserAddress:
+ analytics.addUserProperties({
+ ethAddress: nextState.userAddress,
+ });
+ break;
+ case ActionTypes.UpdateUserEtherBalance:
+ if (nextState.userEtherBalanceInWei) {
+ analytics.addUserProperties({
+ ethBalance: nextState.userEtherBalanceInWei.toString(),
+ });
+ }
+ break;
+ default:
+ break;
+ }
+ return nextAction;
+};
diff --git a/packages/website/ts/redux/dispatcher.ts b/packages/website/ts/redux/dispatcher.ts
index 13e9a10cc..db008d319 100644
--- a/packages/website/ts/redux/dispatcher.ts
+++ b/packages/website/ts/redux/dispatcher.ts
@@ -1,4 +1,4 @@
-import { ECSignature } from '0x.js';
+import { ECSignature } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import { Dispatch } from 'redux';
import { State } from 'ts/redux/reducer';
@@ -17,52 +17,52 @@ import {
} from 'ts/types';
export class Dispatcher {
- private _dispatch: Dispatch<State>;
+ private readonly _dispatch: Dispatch<State>;
constructor(dispatch: Dispatch<State>) {
this._dispatch = dispatch;
}
// Portal
- public resetState() {
+ public resetState(): void {
this._dispatch({
type: ActionTypes.ResetState,
});
}
- public updateNodeVersion(nodeVersion: string) {
+ public updateNodeVersion(nodeVersion: string): void {
this._dispatch({
data: nodeVersion,
type: ActionTypes.UpdateNodeVersion,
});
}
- public updateScreenWidth(screenWidth: ScreenWidths) {
+ public updateScreenWidth(screenWidth: ScreenWidths): void {
this._dispatch({
data: screenWidth,
type: ActionTypes.UpdateScreenWidth,
});
}
- public swapAssetTokenSymbols() {
+ public swapAssetTokenSymbols(): void {
this._dispatch({
type: ActionTypes.SwapAssetTokens,
});
}
- public updateOrderSalt(salt: BigNumber) {
+ public updateOrderSalt(salt: BigNumber): void {
this._dispatch({
data: salt,
type: ActionTypes.UpdateOrderSalt,
});
}
- public updateUserSuppliedOrderCache(order: Order) {
+ public updateUserSuppliedOrderCache(order: Order): void {
this._dispatch({
data: order,
type: ActionTypes.UpdateUserSuppliedOrderCache,
});
}
- public updateShouldBlockchainErrDialogBeOpen(shouldBeOpen: boolean) {
+ public updateShouldBlockchainErrDialogBeOpen(shouldBeOpen: boolean): void {
this._dispatch({
data: shouldBeOpen,
type: ActionTypes.UpdateShouldBlockchainErrDialogBeOpen,
});
}
- public updateChosenAssetToken(side: Side, token: AssetToken) {
+ public updateChosenAssetToken(side: Side, token: AssetToken): void {
this._dispatch({
data: {
side,
@@ -71,7 +71,7 @@ export class Dispatcher {
type: ActionTypes.UpdateChosenAssetToken,
});
}
- public updateChosenAssetTokenAddress(side: Side, address: string) {
+ public updateChosenAssetTokenAddress(side: Side, address: string): void {
this._dispatch({
data: {
address,
@@ -80,43 +80,43 @@ export class Dispatcher {
type: ActionTypes.UpdateChosenAssetTokenAddress,
});
}
- public updateOrderTakerAddress(address: string) {
+ public updateOrderTakerAddress(address: string): void {
this._dispatch({
data: address,
type: ActionTypes.UpdateOrderTakerAddress,
});
}
- public updateUserAddress(address?: string) {
+ public updateUserAddress(address?: string): void {
this._dispatch({
data: address,
type: ActionTypes.UpdateUserAddress,
});
}
- public updateOrderExpiry(unixTimestampSec: BigNumber) {
+ public updateOrderExpiry(unixTimestampSec: BigNumber): void {
this._dispatch({
data: unixTimestampSec,
type: ActionTypes.UpdateOrderExpiry,
});
}
- public encounteredBlockchainError(err: BlockchainErrs) {
+ public encounteredBlockchainError(err: BlockchainErrs): void {
this._dispatch({
data: err,
type: ActionTypes.BlockchainErrEncountered,
});
}
- public updateBlockchainIsLoaded(isLoaded: boolean) {
+ public updateBlockchainIsLoaded(isLoaded: boolean): void {
this._dispatch({
data: isLoaded,
type: ActionTypes.UpdateBlockchainIsLoaded,
});
}
- public addTokenToTokenByAddress(token: Token) {
+ public addTokenToTokenByAddress(token: Token): void {
this._dispatch({
data: token,
type: ActionTypes.AddTokenToTokenByAddress,
});
}
- public removeTokenToTokenByAddress(token: Token) {
+ public removeTokenToTokenByAddress(token: Token): void {
this._dispatch({
data: token,
type: ActionTypes.RemoveTokenFromTokenByAddress,
@@ -127,7 +127,7 @@ export class Dispatcher {
networkId: number,
userAddressIfExists: string | undefined,
sideToAssetToken: SideToAssetToken,
- ) {
+ ): void {
this._dispatch({
data: {
tokenByAddress,
@@ -138,50 +138,57 @@ export class Dispatcher {
type: ActionTypes.BatchDispatch,
});
}
- public updateTokenByAddress(tokens: Token[]) {
+ public updateTokenByAddress(tokens: Token[]): void {
this._dispatch({
data: tokens,
type: ActionTypes.UpdateTokenByAddress,
});
}
- public forceTokenStateRefetch() {
+ public forceTokenStateRefetch(): void {
this._dispatch({
type: ActionTypes.ForceTokenStateRefetch,
});
}
- public updateECSignature(ecSignature: ECSignature) {
+ public updateECSignature(ecSignature: ECSignature): void {
this._dispatch({
data: ecSignature,
type: ActionTypes.UpdateOrderECSignature,
});
}
- public updateUserWeiBalance(balance: BigNumber) {
+ public updateUserWeiBalance(balance?: BigNumber): void {
this._dispatch({
data: balance,
type: ActionTypes.UpdateUserEtherBalance,
});
}
- public updateNetworkId(networkId: number) {
+ public updateNetworkId(networkId: number): void {
this._dispatch({
data: networkId,
type: ActionTypes.UpdateNetworkId,
});
}
- public updateOrderFillAmount(amount: BigNumber) {
+ public updateOrderFillAmount(amount: BigNumber): void {
this._dispatch({
data: amount,
type: ActionTypes.UpdateOrderFillAmount,
});
}
+ public updatePortalOnboardingShowing(isShowing: boolean): void {
+ this._dispatch({
+ data: isShowing,
+ type: ActionTypes.UpdatePortalOnboardingShowing,
+ });
+ }
+
// Docs
- public updateCurrentDocsVersion(version: string) {
+ public updateCurrentDocsVersion(version: string): void {
this._dispatch({
data: version,
type: ActionTypes.UpdateLibraryVersion,
});
}
- public updateAvailableDocVersions(versions: string[]) {
+ public updateAvailableDocVersions(versions: string[]): void {
this._dispatch({
data: versions,
type: ActionTypes.UpdateAvailableLibraryVersions,
@@ -189,30 +196,30 @@ export class Dispatcher {
}
// Shared
- public showFlashMessage(msg: string | React.ReactNode) {
+ public showFlashMessage(msg: string | React.ReactNode): void {
this._dispatch({
data: msg,
type: ActionTypes.ShowFlashMessage,
});
}
- public hideFlashMessage() {
+ public hideFlashMessage(): void {
this._dispatch({
type: ActionTypes.HideFlashMessage,
});
}
- public updateProviderType(providerType: ProviderType) {
+ public updateProviderType(providerType: ProviderType): void {
this._dispatch({
type: ActionTypes.UpdateProviderType,
data: providerType,
});
}
- public updateInjectedProviderName(injectedProviderName: string) {
+ public updateInjectedProviderName(injectedProviderName: string): void {
this._dispatch({
type: ActionTypes.UpdateInjectedProviderName,
data: injectedProviderName,
});
}
- public updateSelectedLanguage(language: Language) {
+ public updateSelectedLanguage(language: Language): void {
this._dispatch({
type: ActionTypes.UpdateSelectedLanguage,
data: language,
diff --git a/packages/website/ts/redux/reducer.ts b/packages/website/ts/redux/reducer.ts
index a628f65c2..caddabcf0 100644
--- a/packages/website/ts/redux/reducer.ts
+++ b/packages/website/ts/redux/reducer.ts
@@ -1,4 +1,5 @@
-import { ECSignature, ZeroEx } from '0x.js';
+import { constants, generatePseudoRandomSalt } from '@0xproject/order-utils';
+import { ECSignature } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
import * as _ from 'lodash';
import * as moment from 'moment';
@@ -38,7 +39,10 @@ export interface State {
tokenByAddress: TokenByAddress;
lastForceTokenStateRefetch: number;
userAddress: string;
- userEtherBalanceInWei: BigNumber;
+ userEtherBalanceInWei?: BigNumber;
+ portalOnboardingStep: number;
+ isPortalOnboardingShowing: boolean;
+ hasPortalOnboardingBeenClosed: boolean;
// Note: cache of supplied orderJSON in fill order step. Do not use for anything else.
userSuppliedOrderCache: Order;
@@ -53,7 +57,7 @@ export interface State {
translate: Translate;
}
-const INITIAL_STATE: State = {
+export const INITIAL_STATE: State = {
// Portal
blockchainErr: BlockchainErrs.NoError,
blockchainIsLoaded: false,
@@ -65,8 +69,8 @@ const INITIAL_STATE: State = {
s: '',
v: 27,
},
- orderTakerAddress: ZeroEx.NULL_ADDRESS,
- orderSalt: ZeroEx.generatePseudoRandomSalt(),
+ orderTakerAddress: constants.NULL_ADDRESS,
+ orderSalt: generatePseudoRandomSalt(),
nodeVersion: undefined,
screenWidth: utils.getScreenWidth(),
shouldBlockchainErrDialogBeOpen: false,
@@ -77,9 +81,11 @@ const INITIAL_STATE: State = {
tokenByAddress: {},
lastForceTokenStateRefetch: moment().unix(),
userAddress: '',
- userEtherBalanceInWei: new BigNumber(0),
+ userEtherBalanceInWei: undefined,
userSuppliedOrderCache: undefined,
-
+ portalOnboardingStep: 0,
+ isPortalOnboardingShowing: false,
+ hasPortalOnboardingBeenClosed: false,
// Docs
docsVersion: DEFAULT_DOCS_VERSION,
availableDocVersions: [DEFAULT_DOCS_VERSION],
@@ -91,7 +97,7 @@ const INITIAL_STATE: State = {
translate: new Translate(),
};
-export function reducer(state: State = INITIAL_STATE, action: Action) {
+export function reducer(state: State = INITIAL_STATE, action: Action): State {
switch (action.type) {
// Portal
case ActionTypes.ResetState:
@@ -150,7 +156,7 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
}
case ActionTypes.AddTokenToTokenByAddress: {
- const newTokenByAddress = state.tokenByAddress;
+ const newTokenByAddress = { ...state.tokenByAddress };
newTokenByAddress[action.data.address] = action.data;
return {
...state,
@@ -159,7 +165,7 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
}
case ActionTypes.RemoveTokenFromTokenByAddress: {
- const newTokenByAddress = state.tokenByAddress;
+ const newTokenByAddress = { ...state.tokenByAddress };
delete newTokenByAddress[action.data.address];
return {
...state,
@@ -168,7 +174,7 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
}
case ActionTypes.UpdateTokenByAddress: {
- const tokenByAddress = state.tokenByAddress;
+ const tokenByAddress = { ...state.tokenByAddress };
const tokens = action.data;
_.each(tokens, token => {
const updatedToken = {
@@ -247,7 +253,7 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
}
case ActionTypes.UpdateChosenAssetTokenAddress: {
- const newAssetToken = state.sideToAssetToken[action.data.side];
+ const newAssetToken = { ...state.sideToAssetToken[action.data.side] };
newAssetToken.address = action.data.address;
const newSideToAssetToken = {
...state.sideToAssetToken,
@@ -292,6 +298,25 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
};
}
+ case ActionTypes.UpdatePortalOnboardingStep: {
+ const portalOnboardingStep = action.data;
+ return {
+ ...state,
+ portalOnboardingStep,
+ };
+ }
+
+ case ActionTypes.UpdatePortalOnboardingShowing: {
+ const isPortalOnboardingShowing = action.data;
+ return {
+ ...state,
+ isPortalOnboardingShowing,
+ hasPortalOnboardingBeenClosed: !isPortalOnboardingShowing ? true : state.hasPortalOnboardingBeenClosed,
+ // always start onboarding from the beginning
+ portalOnboardingStep: 0,
+ };
+ }
+
// Docs
case ActionTypes.UpdateLibraryVersion: {
return {
diff --git a/packages/website/ts/redux/store.ts b/packages/website/ts/redux/store.ts
new file mode 100644
index 000000000..006241371
--- /dev/null
+++ b/packages/website/ts/redux/store.ts
@@ -0,0 +1,24 @@
+import * as _ from 'lodash';
+import { applyMiddleware, createStore, Store as ReduxStore } from 'redux';
+import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly';
+import { stateStorage } from 'ts/local_storage/state_storage';
+import { analyticsMiddleware } from 'ts/redux/analyticsMiddleware';
+import { reducer, State } from 'ts/redux/reducer';
+
+const ONE_SECOND = 1000;
+
+export const store: ReduxStore<State> = createStore(
+ reducer,
+ stateStorage.getPersistedDefaultState(),
+ composeWithDevTools(applyMiddleware(analyticsMiddleware)),
+);
+store.subscribe(
+ _.throttle(() => {
+ const state = store.getState();
+ // Persisted state
+ stateStorage.saveState({
+ hasPortalOnboardingBeenClosed: state.hasPortalOnboardingBeenClosed,
+ isPortalOnboardingShowing: state.isPortalOnboardingShowing,
+ });
+ }, ONE_SECOND),
+);
diff --git a/packages/website/ts/schemas/validator.ts b/packages/website/ts/schemas/validator.ts
index dac0f0098..3fd013002 100644
--- a/packages/website/ts/schemas/validator.ts
+++ b/packages/website/ts/schemas/validator.ts
@@ -1,5 +1,4 @@
import { SchemaValidator } from '@0xproject/json-schemas';
-import { Schema as JSONSchema, Validator } from 'jsonschema';
import { orderMetadataSchema } from 'ts/schemas/metadata_schema';
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
import { portalTokenMetadataSchema } from 'ts/schemas/portal_token_metadata';
diff --git a/packages/website/ts/style/colors.ts b/packages/website/ts/style/colors.ts
new file mode 100644
index 000000000..349845a09
--- /dev/null
+++ b/packages/website/ts/style/colors.ts
@@ -0,0 +1,21 @@
+import { colors as sharedColors } from '@0xproject/react-shared';
+
+const appColors = {
+ walletBoxShadow: 'rgba(0, 0, 0, 0.05)',
+ walletBorder: '#ededee',
+ walletDefaultItemBackground: '#fbfbfc',
+ walletFocusedItemBackground: '#f0f1f4',
+ allowanceToggleShadow: 'rgba(0, 0, 0, 0)',
+ wrapEtherConfirmationButton: sharedColors.mediumBlue,
+ drawerMenuBackground: '#4a4a4a',
+ menuItemDefaultSelectedBackground: '#424242',
+ jobsPageBackground: sharedColors.grey50,
+ jobsPageOpenPositionRow: sharedColors.grey100,
+ metaMaskOrange: '#f68c24',
+ metaMaskTransparentOrange: 'rgba(255, 248, 242, 0.8)',
+};
+
+export const colors = {
+ ...sharedColors,
+ ...appColors,
+};
diff --git a/packages/website/ts/style/keyframes.ts b/packages/website/ts/style/keyframes.ts
new file mode 100644
index 000000000..28ea50247
--- /dev/null
+++ b/packages/website/ts/style/keyframes.ts
@@ -0,0 +1,22 @@
+import { keyframes } from 'ts/style/theme';
+
+export const rotate = keyframes`
+ 100% {
+ transform: rotate(360deg);
+ }
+`;
+
+export const dash = keyframes`
+ 0% {
+ stroke-dasharray: 1, 150;
+ stroke-dashoffset: 0;
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -35;
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -124;
+ }
+`;
diff --git a/packages/website/ts/style/media.ts b/packages/website/ts/style/media.ts
new file mode 100644
index 000000000..870d9a277
--- /dev/null
+++ b/packages/website/ts/style/media.ts
@@ -0,0 +1,14 @@
+import { css } from 'ts/style/theme';
+import { ScreenWidths } from 'ts/types';
+
+const generateMediaWrapper = (screenWidth: ScreenWidths) => (...args: any[]) => css`
+ @media (max-width: ${screenWidth}em) {
+ ${css.apply(css, args)};
+ }
+`;
+
+export const media = {
+ small: generateMediaWrapper(ScreenWidths.Sm),
+ medium: generateMediaWrapper(ScreenWidths.Md),
+ large: generateMediaWrapper(ScreenWidths.Lg),
+};
diff --git a/packages/website/ts/style/theme.ts b/packages/website/ts/style/theme.ts
new file mode 100644
index 000000000..ce7d6975d
--- /dev/null
+++ b/packages/website/ts/style/theme.ts
@@ -0,0 +1,17 @@
+import * as styledComponents from 'styled-components';
+
+// tslint:disable:no-unnecessary-type-assertion
+const {
+ default: styled,
+ css,
+ injectGlobal,
+ keyframes,
+ ThemeProvider,
+} = styledComponents as styledComponents.ThemedStyledComponentsModule<IThemeInterface>;
+// tslint:enable:no-unnecessary-type-assertion
+
+export interface IThemeInterface {}
+
+export const theme = {};
+
+export { styled, css, injectGlobal, keyframes, ThemeProvider };
diff --git a/packages/website/ts/style/z_index.ts b/packages/website/ts/style/z_index.ts
new file mode 100644
index 000000000..a3998f59b
--- /dev/null
+++ b/packages/website/ts/style/z_index.ts
@@ -0,0 +1,6 @@
+export const zIndex = {
+ topBar: 1100,
+ aboveTopBar: 1101,
+ overlay: 1105,
+ aboveOverlay: 1106,
+};
diff --git a/packages/website/ts/types.ts b/packages/website/ts/types.ts
index 901483327..e1b5be39a 100644
--- a/packages/website/ts/types.ts
+++ b/packages/website/ts/types.ts
@@ -1,6 +1,7 @@
-import { ECSignature } from '0x.js';
+import { ECSignature } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
-import * as _ from 'lodash';
+import { Provider } from 'ethereum-types';
+import * as React from 'react';
export enum Side {
Receive = 'RECEIVE',
@@ -13,14 +14,19 @@ export interface Token {
address: string;
symbol: string;
decimals: number;
- isTracked: boolean;
isRegistered: boolean;
+ trackedTimestamp?: number;
}
export interface TokenByAddress {
[address: string]: Token;
}
+export interface Styleable {
+ style: React.CSSProperties;
+ children: React.ReactNode;
+}
+
export interface AssetToken {
address?: string;
amount?: BigNumber;
@@ -125,6 +131,8 @@ export enum ActionTypes {
UpdateUserSuppliedOrderCache = 'UPDATE_USER_SUPPLIED_ORDER_CACHE',
UpdateOrderFillAmount = 'UPDATE_ORDER_FILL_AMOUNT',
UpdateShouldBlockchainErrDialogBeOpen = 'UPDATE_SHOULD_BLOCKCHAIN_ERR_DIALOG_BE_OPEN',
+ UpdatePortalOnboardingStep = 'UPDATE_ONBOARDING_STEP',
+ UpdatePortalOnboardingShowing = 'UPDATE_PORTAL_ONBOARDING_SHOWING',
// Docs
UpdateLibraryVersion = 'UPDATE_LIBRARY_VERSION',
@@ -207,12 +215,12 @@ export interface ContractEvent {
args: any;
}
-export type InputErrMsg = React.ReactNode | string | undefined;
export type ValidatedBigNumberCallback = (isValid: boolean, amount?: BigNumber) => void;
+// Associated values are in `em` units
export enum ScreenWidths {
- Sm = 'SM',
- Md = 'MD',
- Lg = 'LG',
+ Sm = 40,
+ Md = 52,
+ Lg = 64,
}
export enum AlertTypes {
@@ -235,8 +243,11 @@ export enum BlockchainCallErrs {
}
export enum Environments {
- DEVELOPMENT,
- PRODUCTION,
+ DEVELOPMENT = 'DEVELOPMENT',
+ DOGFOOD = 'DOGFOOD',
+ STAGING = 'STAGING',
+ PRODUCTION = 'PRODUCTION',
+ UNKNOWN = 'UNKNOWN',
}
export type ContractInstance = any; // TODO: add type definition for Contract
@@ -341,21 +352,32 @@ export enum Docs {
SmartContracts,
}
+export enum WebsiteLegacyPaths {
+ ZeroExJs = '/docs/0xjs',
+ Web3Wrapper = '/docs/web3_wrapper',
+ Deployer = '/docs/deployer',
+ Jobs = '/jobs',
+}
+
export enum WebsitePaths {
Portal = '/portal',
Wiki = '/wiki',
- ZeroExJs = '/docs/0xjs',
+ Docs = '/docs',
+ ZeroExJs = '/docs/0x.js',
Home = '/',
FAQ = '/faq',
About = '/about',
Whitepaper = '/pdfs/0x_white_paper.pdf',
SmartContracts = '/docs/contracts',
Connect = '/docs/connect',
- Web3Wrapper = '/docs/web3_wrapper',
- Deployer = '/docs/deployer',
+ Web3Wrapper = '/docs/web3-wrapper',
+ SolCompiler = '/docs/sol-compiler',
JSONSchemas = '/docs/json-schemas',
SolCov = '/docs/sol-cov',
Subproviders = '/docs/subproviders',
+ OrderUtils = '/docs/order-utils',
+ EthereumTypes = '/docs/ethereum-types',
+ Careers = '/careers',
}
export enum DocPackages {
@@ -363,10 +385,12 @@ export enum DocPackages {
ZeroExJs = 'ZERO_EX_JS',
SmartContracts = 'SMART_CONTRACTS',
Web3Wrapper = 'WEB3_WRAPPER',
- Deployer = 'DEPLOYER',
+ SolCompiler = 'SOL_COMPILER',
JSONSchemas = 'JSON_SCHEMAS',
SolCov = 'SOL_COV',
Subproviders = 'SUBPROVIDERS',
+ OrderUtils = 'ORDER_UTILS',
+ EthereumTypes = 'ETHEREUM_TYPES',
}
export enum Key {
@@ -415,9 +439,10 @@ export enum Key {
About = 'ABOUT',
Careers = 'CAREERS',
Contact = 'CONTACT',
- Deployer = 'DEPLOYER',
+ SolCompiler = 'SOL_COMPILER',
JsonSchemas = 'JSON_SCHEMAS',
SolCov = 'SOL_COV',
+ EthereumTypes = 'ETHEREUM_TYPES',
Subproviders = 'SUBPROVIDERS',
Blog = 'BLOG',
Forum = 'FORUM',
@@ -425,6 +450,7 @@ export enum Key {
Whitepaper = 'WHITEPAPER',
Wiki = 'WIKI',
Web3Wrapper = 'WEB3_WRAPPER',
+ OrderUtils = 'ORDER_UTILS',
And = 'AND',
Faq = 'FAQ',
SmartContracts = 'SMART_CONTRACTS',
@@ -434,6 +460,7 @@ export enum Key {
Developers = 'DEVELOPERS',
Home = 'HOME',
RocketChat = 'ROCKETCHAT',
+ TradeCallToAction = 'TRADE_CALL_TO_ACTION',
}
export enum SmartContractDocSections {
@@ -467,6 +494,18 @@ export enum Providers {
Parity = 'PARITY',
Metamask = 'METAMASK',
Mist = 'MIST',
+ Toshi = 'TOSHI',
+ Cipher = 'CIPHER',
+}
+
+export interface InjectedProviderUpdate {
+ selectedAddress: string;
+ networkVersion: string;
+}
+
+export interface InjectedProviderObservable {
+ subscribe(updateHandler: (update: InjectedProviderUpdate) => void): void;
+ unsubscribe(updateHandler: (update: InjectedProviderUpdate) => void): void;
}
export interface TimestampMsRange {
@@ -481,13 +520,91 @@ export interface OutdatedWrappedEtherByNetworkId {
};
}
-export interface TokenStateByAddress {
- [address: string]: TokenState;
+export type ItemByAddress<T> = ObjectMap<T>;
+
+export interface ObjectMap<T> {
+ [key: string]: T;
}
+export type TokenStateByAddress = ItemByAddress<TokenState>;
+
export interface TokenState {
balance: BigNumber;
allowance: BigNumber;
isLoaded: boolean;
+ price?: BigNumber;
+}
+
+export interface WebsiteBackendRelayerInfo {
+ name: string;
+ weeklyTxnVolume?: string;
+ url: string;
+ appUrl?: string;
+ headerImgUrl?: string;
+ logoImgUrl?: string;
+ primaryColor?: string;
+ topTokens: WebsiteBackendTokenInfo[];
+}
+
+export interface WebsiteBackendPriceInfo {
+ [symbol: string]: string;
+}
+
+export interface WebsiteBackendTokenInfo {
+ address: string;
+ decimals: number;
+ name: string;
+ symbol: string;
+}
+
+export interface WebsiteBackendGasInfo {
+ safeSlow: number;
+ average: number;
+ fast: number;
+ fastest: number;
+}
+
+export interface WebsiteBackendJobInfo {
+ id: number;
+ title: string;
+ department: string;
+ office: string;
+ url: string;
+}
+
+export enum BrowserType {
+ Chrome = 'Chrome',
+ Firefox = 'Firefox',
+ Opera = 'Opera',
+ Other = 'Other',
+}
+
+export enum OperatingSystemType {
+ Android = 'Android',
+ iOS = 'iOS',
+ Mac = 'Mac',
+ Windows = 'Windows',
+ WindowsPhone = 'WindowsPhone',
+ Linux = 'Linux',
+ Other = 'Other',
+}
+
+export enum AccountState {
+ Disconnected = 'Disconnected',
+ Ready = 'Ready',
+ Loading = 'Loading',
+ Locked = 'Locked',
+}
+
+export interface InjectedProvider extends Provider {
+ publicConfigStore?: InjectedProviderObservable;
+}
+
+// Minimal expected interface for an injected web3 object
+export interface InjectedWeb3 {
+ currentProvider: InjectedProvider;
+ version: {
+ getNetwork(cd: (err: Error, networkId: string) => void): void;
+ };
}
// tslint:disable:max-file-line-count
diff --git a/packages/website/ts/utils/analytics.ts b/packages/website/ts/utils/analytics.ts
index 37c47c7b0..e5a1ddfa4 100644
--- a/packages/website/ts/utils/analytics.ts
+++ b/packages/website/ts/utils/analytics.ts
@@ -1,26 +1,83 @@
import * as _ from 'lodash';
-import * as ReactGA from 'react-ga';
-import { configs } from 'ts/utils/configs';
+import { ObjectMap, Order } from 'ts/types';
import { utils } from 'ts/utils/utils';
-import * as Web3 from 'web3';
-export const analytics = {
- init() {
- ReactGA.initialize(configs.GOOGLE_ANALYTICS_ID);
- },
- logEvent(category: string, action: string, label: string, value?: any) {
- ReactGA.event({
- category,
- action,
- label,
- value,
- });
- },
- async logProviderAsync(web3IfExists: Web3) {
- await utils.onPageLoadAsync();
- const providerType = !_.isUndefined(web3IfExists)
- ? utils.getProviderType(web3IfExists.currentProvider)
- : 'NONE';
- ReactGA.ga('set', 'dimension1', providerType);
- },
-};
+export interface HeapAnalytics {
+ loaded: boolean;
+ identify(id: string, idType: string): void;
+ track(eventName: string, eventProperties?: ObjectMap<string | number>): void;
+ resetIdentity(): void;
+ addUserProperties(properties: ObjectMap<string | number>): void;
+ addEventProperties(properties: ObjectMap<string | number>): void;
+ removeEventProperty(property: string): void;
+ clearEventProperties(): void;
+}
+export class Analytics {
+ private _heap: HeapAnalytics;
+ public static init(): Analytics {
+ return new Analytics(Analytics.getHeap());
+ }
+ public static getHeap(): HeapAnalytics {
+ const heap = (window as any).heap;
+ if (!_.isUndefined(heap)) {
+ return heap;
+ } else {
+ throw new Error('Could not find the Heap SDK on the page.');
+ }
+ }
+ constructor(heap: HeapAnalytics) {
+ this._heap = heap;
+ }
+ // tslint:disable:no-floating-promises
+ // HeapAnalytics Wrappers
+ public identify(id: string, idType: string): void {
+ this._heapLoadedGuardAsync(() => this._heap.identify(id, idType));
+ }
+ public track(eventName: string, eventProperties?: ObjectMap<string | number>): void {
+ this._heapLoadedGuardAsync(() => this._heap.track(eventName, eventProperties));
+ }
+ public resetIdentity(): void {
+ this._heapLoadedGuardAsync(() => this._heap.resetIdentity());
+ }
+ public addUserProperties(properties: ObjectMap<string | number>): void {
+ this._heapLoadedGuardAsync(() => this._heap.addUserProperties(properties));
+ }
+ public addEventProperties(properties: ObjectMap<string | number>): void {
+ this._heapLoadedGuardAsync(() => this._heap.addEventProperties(properties));
+ }
+ public removeEventProperty(property: string): void {
+ this._heapLoadedGuardAsync(() => this._heap.removeEventProperty(property));
+ }
+ public clearEventProperties(): void {
+ this._heapLoadedGuardAsync(() => this._heap.clearEventProperties());
+ }
+ // tslint:enable:no-floating-promises
+ // Custom methods
+ public trackOrderEvent(eventName: string, order: Order): void {
+ const orderLoggingData = {
+ takerTokenAmount: order.signedOrder.takerTokenAmount,
+ makeTokenAmount: order.signedOrder.makerTokenAmount,
+ takerToken: order.metadata.takerToken.symbol,
+ makerToken: order.metadata.makerToken.symbol,
+ };
+ this.track(eventName, orderLoggingData);
+ }
+ /**
+ * Heap is not available as a UMD module, and additionally has the strange property of replacing itself with
+ * a different object once it's loaded.
+ * Instead of having an await call before every analytics use, we opt to have the awaiting logic in here by
+ * guarding every API call with the guard below.
+ */
+ private async _heapLoadedGuardAsync(callback: () => void): Promise<void> {
+ if (this._heap.loaded) {
+ callback();
+ return undefined;
+ }
+ await utils.onPageLoadPromise;
+ // HACK: Reset heap to loaded heap
+ this._heap = (window as any).heap;
+ callback();
+ }
+}
+
+export const analytics = Analytics.init();
diff --git a/packages/website/ts/utils/backend_client.ts b/packages/website/ts/utils/backend_client.ts
new file mode 100644
index 000000000..5164211df
--- /dev/null
+++ b/packages/website/ts/utils/backend_client.ts
@@ -0,0 +1,61 @@
+import * as _ from 'lodash';
+
+import {
+ ArticlesBySection,
+ WebsiteBackendGasInfo,
+ WebsiteBackendJobInfo,
+ WebsiteBackendPriceInfo,
+ WebsiteBackendRelayerInfo,
+ WebsiteBackendTokenInfo,
+} from 'ts/types';
+import { fetchUtils } from 'ts/utils/fetch_utils';
+import { utils } from 'ts/utils/utils';
+
+const ETH_GAS_STATION_ENDPOINT = '/eth_gas_station';
+const JOBS_ENDPOINT = '/jobs';
+const PRICES_ENDPOINT = '/prices';
+const RELAYERS_ENDPOINT = '/relayers';
+const TOKENS_ENDPOINT = '/tokens';
+const WIKI_ENDPOINT = '/wiki';
+const SUBSCRIBE_SUBSTACK_NEWSLETTER_ENDPOINT = '/newsletter_subscriber/substack';
+
+export const backendClient = {
+ async getGasInfoAsync(): Promise<WebsiteBackendGasInfo> {
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), ETH_GAS_STATION_ENDPOINT);
+ return result;
+ },
+ async getJobInfosAsync(): Promise<WebsiteBackendJobInfo[]> {
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), JOBS_ENDPOINT);
+ return result;
+ },
+ async getPriceInfoAsync(tokenSymbols: string[]): Promise<WebsiteBackendPriceInfo> {
+ if (_.isEmpty(tokenSymbols)) {
+ return {};
+ }
+ const joinedTokenSymbols = tokenSymbols.join(',');
+ const queryParams = {
+ tokens: joinedTokenSymbols,
+ };
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), PRICES_ENDPOINT, queryParams);
+ return result;
+ },
+ async getRelayerInfosAsync(): Promise<WebsiteBackendRelayerInfo[]> {
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), RELAYERS_ENDPOINT);
+ return result;
+ },
+ async getTokenInfosAsync(): Promise<WebsiteBackendTokenInfo[]> {
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), TOKENS_ENDPOINT);
+ return result;
+ },
+ async getWikiArticlesBySectionAsync(): Promise<ArticlesBySection> {
+ const result = await fetchUtils.requestAsync(utils.getBackendBaseUrl(), WIKI_ENDPOINT);
+ return result;
+ },
+ async subscribeToNewsletterAsync(email: string): Promise<Response> {
+ const result = await fetchUtils.postAsync(utils.getBackendBaseUrl(), SUBSCRIBE_SUBSTACK_NEWSLETTER_ENDPOINT, {
+ email,
+ referrer: window.location.href,
+ });
+ return result;
+ },
+};
diff --git a/packages/website/ts/utils/configs.ts b/packages/website/ts/utils/configs.ts
index a54fc56a8..a1c64f9cb 100644
--- a/packages/website/ts/utils/configs.ts
+++ b/packages/website/ts/utils/configs.ts
@@ -1,70 +1,24 @@
-import * as _ from 'lodash';
-import { Environments, OutdatedWrappedEtherByNetworkId, PublicNodeUrlsByNetworkId } from 'ts/types';
+import { OutdatedWrappedEtherByNetworkId, PublicNodeUrlsByNetworkId } from 'ts/types';
const BASE_URL = window.location.origin;
-const isDevelopment = _.includes(
- ['https://0xproject.localhost:3572', 'https://localhost:3572', 'https://127.0.0.1'],
- BASE_URL,
-);
const INFURA_API_KEY = 'T5WSC8cautR4KXyYgsRs';
export const configs = {
AMOUNT_DISPLAY_PRECSION: 5,
- BACKEND_BASE_URL: 'https://website-api.0xproject.com',
+ BACKEND_BASE_PROD_URL: 'https://website-api.0xproject.com',
+ BACKEND_BASE_STAGING_URL: 'https://staging-website-api.0xproject.com',
BASE_URL,
BITLY_ACCESS_TOKEN: 'ffc4c1a31e5143848fb7c523b39f91b9b213d208',
DEFAULT_DERIVATION_PATH: `44'/60'/0'`,
// WARNING: ZRX & WETH MUST always be default trackedTokens
DEFAULT_TRACKED_TOKEN_SYMBOLS: ['WETH', 'ZRX'],
DOMAIN_STAGING: 'staging-0xproject.s3-website-us-east-1.amazonaws.com',
- DOMAIN_DEVELOPMENT: '0xproject.localhost:3572',
+ DOMAIN_DOGFOOD: 'dogfood.0xproject.com',
+ DOMAINS_DEVELOPMENT: ['0xproject.localhost:3572', 'localhost:3572', '127.0.0.1'],
DOMAIN_PRODUCTION: '0xproject.com',
- ENVIRONMENT: isDevelopment ? Environments.DEVELOPMENT : Environments.PRODUCTION,
- ICON_URL_BY_SYMBOL: {
- REP: '/images/token_icons/augur.png',
- DGD: '/images/token_icons/digixdao.png',
- WETH: '/images/token_icons/ether_erc20.png',
- MLN: '/images/token_icons/melon.png',
- GNT: '/images/token_icons/golem.png',
- MKR: '/images/token_icons/makerdao.png',
- ZRX: '/images/token_icons/zero_ex.png',
- ANT: '/images/token_icons/aragon.png',
- BNT: '/images/token_icons/bancor.png',
- BAT: '/images/token_icons/basicattentiontoken.png',
- CVC: '/images/token_icons/civic.png',
- EOS: '/images/token_icons/eos.png',
- FUN: '/images/token_icons/funfair.png',
- GNO: '/images/token_icons/gnosis.png',
- ICN: '/images/token_icons/iconomi.png',
- OMG: '/images/token_icons/omisego.png',
- SNT: '/images/token_icons/status.png',
- STORJ: '/images/token_icons/storjcoinx.png',
- PAY: '/images/token_icons/tenx.png',
- QTUM: '/images/token_icons/qtum.png',
- DNT: '/images/token_icons/district0x.png',
- SNGLS: '/images/token_icons/singularity.png',
- EDG: '/images/token_icons/edgeless.png',
- '1ST': '/images/token_icons/firstblood.jpg',
- WINGS: '/images/token_icons/wings.png',
- BQX: '/images/token_icons/bitquence.png',
- LUN: '/images/token_icons/lunyr.png',
- RLC: '/images/token_icons/iexec.png',
- MCO: '/images/token_icons/monaco.png',
- ADT: '/images/token_icons/adtoken.png',
- CFI: '/images/token_icons/cofound-it.png',
- ROL: '/images/token_icons/etheroll.png',
- WGNT: '/images/token_icons/golem.png',
- MTL: '/images/token_icons/metal.png',
- NMR: '/images/token_icons/numeraire.png',
- SAN: '/images/token_icons/santiment.png',
- TAAS: '/images/token_icons/taas.png',
- TKN: '/images/token_icons/tokencard.png',
- TRST: '/images/token_icons/trust.png',
- } as { [symbol: string]: string },
- IS_MAINNET_ENABLED: true,
GOOGLE_ANALYTICS_ID: 'UA-98720122-1',
LAST_LOCAL_STORAGE_FILL_CLEARANCE_DATE: '2017-11-22',
- LAST_LOCAL_STORAGE_TRACKED_TOKEN_CLEARANCE_DATE: '2017-12-19',
+ LAST_LOCAL_STORAGE_TRACKED_TOKEN_CLEARANCE_DATE: '2018-7-5',
OUTDATED_WRAPPED_ETHERS: [
{
42: {
diff --git a/packages/website/ts/utils/constants.ts b/packages/website/ts/utils/constants.ts
index 0584938eb..005d17823 100644
--- a/packages/website/ts/utils/constants.ts
+++ b/packages/website/ts/utils/constants.ts
@@ -1,9 +1,12 @@
-import { Networks } from '@0xproject/react-shared';
import { BigNumber } from '@0xproject/utils';
export const constants = {
DECIMAL_PLACES_ETH: 18,
DECIMAL_PLACES_ZRX: 18,
+ ETHER_TOKEN_SYMBOL: 'WETH',
+ ZRX_TOKEN_SYMBOL: 'ZRX',
+ ETHER_SYMBOL: 'ETH',
+ TOKEN_AMOUNT_DISPLAY_PRECISION: 4,
GENESIS_ORDER_BLOCK_BY_NETWORK_ID: {
1: 4145578,
42: 3117574,
@@ -23,18 +26,22 @@ export const constants = {
NETWORK_ID_TESTRPC: 50,
NULL_ADDRESS: '0x0000000000000000000000000000000000000000',
PROVIDER_NAME_LEDGER: 'Ledger',
- PROVIDER_NAME_METAMASK: 'Metamask',
+ PROVIDER_NAME_METAMASK: 'MetaMask',
PROVIDER_NAME_PARITY_SIGNER: 'Parity Signer',
PROVIDER_NAME_MIST: 'Mist',
+ PROVIDER_NAME_CIPHER: 'Cipher Browser',
+ PROVIDER_NAME_TOSHI: 'Toshi',
PROVIDER_NAME_GENERIC: 'Injected Web3',
PROVIDER_NAME_PUBLIC: '0x Public',
- ROLLBAR_ACCESS_TOKEN: 'a6619002b51c4464928201e6ea94de65',
+ ROLLBAR_ACCESS_TOKEN: '32c39bfa4bb6440faedc1612a9c13d28',
S3_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/doc-jsons',
S3_STAGING_DOC_BUCKET_ROOT: 'https://s3.amazonaws.com/staging-doc-jsons',
SUCCESS_STATUS: 200,
UNAVAILABLE_STATUS: 503,
TAKER_FEE: new BigNumber(0),
TESTNET_NAME: 'Kovan',
+ NUMERAL_USD_FORMAT: '$0,0.00',
+ EMAIL_JOBS: 'jobs@0xproject.com',
PROJECT_URL_ETHFINEX: 'https://www.ethfinex.com/',
PROJECT_URL_AMADEUS: 'http://amadeusrelay.org',
PROJECT_URL_DDEX: 'https://ddex.io',
@@ -52,8 +59,8 @@ export const constants = {
PROJECT_URL_MAKER: 'https://makerdao.com',
PROJECT_URL_ARAGON: 'https://aragon.one',
PROJECT_URL_BLOCKNET: 'https://blocknet.co',
- PROJECT_URL_0CEAN: 'http://the0cean.com',
- PROJECT_URL_STATUS: 'https://status.im',
+ PROJECT_URL_0CEAN: 'https://theocean.trade',
+ PROJECT_URL_IMTOKEN: 'https://tokenlon.token.im/',
PROJECT_URL_AUGUR: 'https://augur.net',
PROJECT_URL_AUCTUS: 'https://auctus.org',
PROJECT_URL_OPEN_ANX: 'https://www.openanx.org',
@@ -67,6 +74,11 @@ export const constants = {
URL_GITHUB_ORG: 'https://github.com/0xProject',
URL_GITHUB_WIKI: 'https://github.com/0xProject/wiki',
URL_METAMASK_CHROME_STORE: 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn',
+ URL_METAMASK_FIREFOX_STORE: 'https://addons.mozilla.org/en-US/firefox/addon/ether-metamask/',
+ URL_TOSHI_IOS_APP_STORE: 'https://itunes.apple.com/us/app/toshi-ethereum-wallet/id1278383455?mt=8',
+ URL_TOSHI_ANDROID_APP_STORE: 'https://play.google.com/store/apps/details?id=org.toshi&hl=en_US',
+ URL_METAMASK_HOMEPAGE: 'https://metamask.io/',
+ URL_METAMASK_OPERA_STORE: 'https://addons.opera.com/en/extensions/details/metamask/',
URL_MIST_DOWNLOAD: 'https://github.com/ethereum/mist/releases',
URL_PARITY_CHROME_STORE:
'https://chrome.google.com/webstore/detail/parity-ethereum-integrati/himekenlppkgeaoeddcliojfddemadig',
@@ -81,4 +93,5 @@ export const constants = {
URL_WEB3_LOG_ENTRY_EVENT: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L127',
URL_WEB3_PROVIDER_DOCS: 'https://github.com/0xProject/web3-typescript-typings/blob/f5bcb96/index.d.ts#L150',
URL_BIGNUMBERJS_GITHUB: 'http://mikemcl.github.io/bignumber.js',
+ URL_MISSION_AND_VALUES_BLOG_POST: 'https://blog.0xproject.com/the-0x-mission-and-values-181a58706f9f',
};
diff --git a/packages/website/ts/utils/doc_utils.ts b/packages/website/ts/utils/doc_utils.ts
index 2a599bcbe..b9084bba7 100644
--- a/packages/website/ts/utils/doc_utils.ts
+++ b/packages/website/ts/utils/doc_utils.ts
@@ -1,23 +1,21 @@
import { DoxityDocObj, TypeDocNode } from '@0xproject/react-docs';
-import { logUtils } from '@0xproject/utils';
-import findVersions = require('find-versions');
+import { fetchAsync, logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import { S3FileObject, VersionToFilePath } from 'ts/types';
-import { utils } from 'ts/utils/utils';
import convert = require('xml-js');
export const docUtils = {
async getVersionToFilePathAsync(s3DocJsonRoot: string, folderName: string): Promise<VersionToFilePath> {
- const versionFilePaths = await this.getVersionFileNamesAsync(s3DocJsonRoot, folderName);
+ const versionFilePaths = await docUtils.getVersionFileNamesAsync(s3DocJsonRoot, folderName);
const versionToFilePath: VersionToFilePath = {};
_.each(versionFilePaths, filePath => {
- const [version] = findVersions(filePath);
+ const version = filePath.split('/v')[1].replace('.json', '');
versionToFilePath[version] = filePath;
});
return versionToFilePath;
},
async getVersionFileNamesAsync(s3DocJsonRoot: string, folderName: string): Promise<string[]> {
- const response = await fetch(s3DocJsonRoot);
+ const response = await fetchAsync(s3DocJsonRoot);
if (response.status !== 200) {
// TODO: Show the user an error message when the docs fail to load
const errMsg = await response.text();
@@ -74,7 +72,7 @@ export const docUtils = {
},
async getJSONDocFileAsync(filePath: string, s3DocJsonRoot: string): Promise<TypeDocNode | DoxityDocObj> {
const endpoint = `${s3DocJsonRoot}/${filePath}`;
- const response = await fetch(endpoint);
+ const response = await fetchAsync(endpoint);
if (response.status !== 200) {
// TODO: Show the user an error message when the docs fail to load
const errMsg = await response.text();
diff --git a/packages/website/ts/utils/error_reporter.ts b/packages/website/ts/utils/error_reporter.ts
index 19f563880..6008fffed 100644
--- a/packages/website/ts/utils/error_reporter.ts
+++ b/packages/website/ts/utils/error_reporter.ts
@@ -1,5 +1,4 @@
import { logUtils } from '@0xproject/utils';
-import { Environments } from 'ts/types';
import { configs } from 'ts/utils/configs';
import { constants } from 'ts/utils/constants';
import { utils } from 'ts/utils/utils';
@@ -13,7 +12,15 @@ const rollbarConfig = {
itemsPerMinute: 10,
maxItems: 500,
payload: {
- environment: configs.ENVIRONMENT,
+ environment: utils.getEnvironment(),
+ client: {
+ javascript: {
+ source_map_enabled: true,
+ // This is only defined in production environments.
+ code_version: process.env.GIT_SHA,
+ guess_uncaught_frames: true,
+ },
+ },
},
uncaughtErrorLevel: 'error',
hostWhiteList: [configs.DOMAIN_PRODUCTION, configs.DOMAIN_STAGING],
@@ -29,25 +36,18 @@ const rollbarConfig = {
'SecurityError (DOM Exception 18)',
],
};
-import Rollbar = require('../../public/js/rollbar.umd.nojson.min.js');
+import Rollbar = require('../../public/js/rollbar.umd.min.js');
const rollbar = Rollbar.init(rollbarConfig);
export const errorReporter = {
- async reportAsync(err: Error): Promise<any> {
- if (configs.ENVIRONMENT === Environments.DEVELOPMENT) {
+ report(err: Error): void {
+ if (utils.isDevelopment()) {
return; // Let's not log development errors to rollbar
}
-
- return new Promise((resolve, reject) => {
- rollbar.error(err, (rollbarErr: Error) => {
- if (rollbarErr) {
- logUtils.log(`Error reporting to rollbar, ignoring: ${rollbarErr}`);
- // We never want to reject and cause the app to throw because of rollbar
- resolve();
- } else {
- resolve();
- }
- });
+ rollbar.error(err, (rollbarErr: Error) => {
+ if (rollbarErr) {
+ logUtils.log(`Error reporting to rollbar, ignoring: ${rollbarErr}`);
+ }
});
},
};
diff --git a/packages/website/ts/utils/fetch_utils.ts b/packages/website/ts/utils/fetch_utils.ts
new file mode 100644
index 000000000..e9a88b6b3
--- /dev/null
+++ b/packages/website/ts/utils/fetch_utils.ts
@@ -0,0 +1,48 @@
+import { fetchAsync, logUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+import * as queryString from 'query-string';
+
+import { errorReporter } from 'ts/utils/error_reporter';
+
+const logErrorIfPresent = (response: Response, requestedURL: string) => {
+ if (response.status !== 200) {
+ const errorText = `Error requesting url: ${requestedURL}, ${response.status}: ${response.statusText}`;
+ logUtils.log(errorText);
+ const error = Error(errorText);
+ errorReporter.report(error);
+ throw error;
+ }
+};
+
+export const fetchUtils = {
+ async requestAsync(baseUrl: string, path: string, queryParams?: object): Promise<any> {
+ const query = queryStringFromQueryParams(queryParams);
+ const url = `${baseUrl}${path}${query}`;
+ const response = await fetchAsync(url);
+ logErrorIfPresent(response, url);
+ const result = await response.json();
+ return result;
+ },
+ async postAsync(baseUrl: string, path: string, body: object): Promise<Response> {
+ const url = `${baseUrl}${path}`;
+ const response = await fetchAsync(url, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(body),
+ });
+ logErrorIfPresent(response, url);
+ return response;
+ },
+};
+
+function queryStringFromQueryParams(queryParams?: object): string {
+ // if params are undefined or empty, return an empty string
+ if (_.isUndefined(queryParams) || _.isEmpty(queryParams)) {
+ return '';
+ }
+ // stringify the formatted object
+ const stringifiedParams = queryString.stringify(queryParams);
+ return `?${stringifiedParams}`;
+}
diff --git a/packages/website/ts/utils/mui_theme.ts b/packages/website/ts/utils/mui_theme.ts
index d611f0895..f677b4625 100644
--- a/packages/website/ts/utils/mui_theme.ts
+++ b/packages/website/ts/utils/mui_theme.ts
@@ -17,7 +17,7 @@ export const muiTheme = getMuiTheme({
datePicker: {
color: colors.grey700,
textColor: colors.white,
- calendarTextColor: colors.white,
+ calendarTextColor: colors.grey,
selectColor: colors.darkestGrey,
selectTextColor: colors.white,
},
diff --git a/packages/website/ts/utils/order_parser.ts b/packages/website/ts/utils/order_parser.ts
new file mode 100644
index 000000000..be08da80e
--- /dev/null
+++ b/packages/website/ts/utils/order_parser.ts
@@ -0,0 +1,33 @@
+import { logUtils } from '@0xproject/utils';
+import * as _ from 'lodash';
+
+import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
+import { validator } from 'ts/schemas/validator';
+import { Order } from 'ts/types';
+
+export const orderParser = {
+ parse(queryString: string): Order | undefined {
+ if (queryString.length === 0) {
+ return undefined;
+ }
+ const queryParams = queryString.substring(1).split('&');
+ const orderQueryParam = _.find(queryParams, queryParam => {
+ const queryPair = queryParam.split('=');
+ return queryPair[0] === 'order';
+ });
+ if (_.isUndefined(orderQueryParam)) {
+ return undefined;
+ }
+ const orderPair = orderQueryParam.split('=');
+ if (orderPair.length !== 2) {
+ return undefined;
+ }
+ const order = JSON.parse(decodeURIComponent(orderPair[1]));
+ const validationResult = validator.validate(order, portalOrderSchema);
+ if (validationResult.errors.length > 0) {
+ logUtils.log(`Invalid shared order: ${validationResult.errors}`);
+ return undefined;
+ }
+ return order;
+ },
+};
diff --git a/packages/website/ts/utils/translate.ts b/packages/website/ts/utils/translate.ts
index 5148e48ad..1ee1a59c5 100644
--- a/packages/website/ts/utils/translate.ts
+++ b/packages/website/ts/utils/translate.ts
@@ -42,10 +42,10 @@ export class Translate {
}
this.setLanguage(language);
}
- public getLanguage() {
+ public getLanguage(): Language {
return this._selectedLanguage;
}
- public setLanguage(language: Language) {
+ public setLanguage(language: Language): void {
const isLanguageSupported = !_.isUndefined(languageToTranslations[language]);
if (!isLanguageSupported) {
throw new Error(`${language} not supported`);
@@ -53,8 +53,21 @@ export class Translate {
this._selectedLanguage = language;
this._translation = languageToTranslations[language];
}
- public get(key: Key, decoration?: Deco) {
+ public get(key: Key, decoration?: Deco): string {
let text = this._translation[key];
+ // if a translation does not exist for a certain language, fallback to english
+ // if it still doesn't exist in english, throw an error
+ if (_.isUndefined(text)) {
+ const englishTranslation: Translation = languageToTranslations[Language.English];
+ const englishText = englishTranslation[key];
+ if (!_.isUndefined(englishText)) {
+ text = englishText;
+ } else {
+ throw new Error(
+ `Translation key not available in ${this._selectedLanguage} or ${Language.English}: ${key}`,
+ );
+ }
+ }
if (!_.isUndefined(decoration) && !_.includes(languagesWithoutCaps, this._selectedLanguage)) {
switch (decoration) {
case Deco.Cap:
@@ -77,7 +90,7 @@ export class Translate {
}
return text;
}
- private _capitalize(text: string) {
+ private _capitalize(text: string): string {
return `${text.charAt(0).toUpperCase()}${text.slice(1)}`;
}
}
diff --git a/packages/website/ts/utils/utils.ts b/packages/website/ts/utils/utils.ts
index 75597a7e2..39bbd404c 100644
--- a/packages/website/ts/utils/utils.ts
+++ b/packages/website/ts/utils/utils.ts
@@ -1,28 +1,42 @@
-import { ECSignature, ExchangeContractErrs, Web3Provider, ZeroEx, ZeroExError } from '0x.js';
-import { constants as sharedConstants, EtherscanLinkSuffixes, Networks } from '@0xproject/react-shared';
+import { ContractWrappersError, ExchangeContractErrs } from '@0xproject/contract-wrappers';
+import { OrderError } from '@0xproject/order-utils';
+import { constants as sharedConstants, Networks } from '@0xproject/react-shared';
+import { ECSignature, Provider } from '@0xproject/types';
import { BigNumber } from '@0xproject/utils';
+import { Web3Wrapper } from '@0xproject/web3-wrapper';
+import * as bowser from 'bowser';
import deepEqual = require('deep-equal');
import * as _ from 'lodash';
import * as moment from 'moment';
-import { Order, Providers, ScreenWidths, Side, SideToAssetToken, Token, TokenByAddress } from 'ts/types';
+import * as numeral from 'numeral';
+
+import {
+ AccountState,
+ BlockchainCallErrs,
+ BrowserType,
+ Environments,
+ OperatingSystemType,
+ Order,
+ Providers,
+ ProviderType,
+ ScreenWidths,
+ Side,
+ SideToAssetToken,
+ Token,
+ TokenByAddress,
+ TokenState,
+} from 'ts/types';
import { configs } from 'ts/utils/configs';
import { constants } from 'ts/utils/constants';
import * as u2f from 'ts/vendor/u2f_api';
-import Web3 = require('web3');
-
-const LG_MIN_EM = 64;
-const MD_MIN_EM = 52;
export const utils = {
- assert(condition: boolean, message: string) {
+ assert(condition: boolean, message: string): void {
if (!condition) {
throw new Error(message);
}
},
- spawnSwitchErr(name: string, value: any) {
- return new Error(`Unexpected switch value: ${value} encountered for ${name}`);
- },
- isNumeric(n: string) {
+ isNumeric(n: string): boolean {
return !isNaN(parseFloat(n)) && isFinite(Number(n));
},
// This default unix timestamp is used for orders where the user does not specify an expiry date.
@@ -45,7 +59,7 @@ export const utils = {
return moment.unix(unixTimestampSec.toNumber());
},
convertToReadableDateTimeFromUnixTimestamp(unixTimestampSec: BigNumber): string {
- const m = this.convertToMomentFromUnixTimestamp(unixTimestampSec);
+ const m = utils.convertToMomentFromUnixTimestamp(unixTimestampSec);
const formattedDate: string = m.format('h:MMa MMMM D YYYY');
return formattedDate;
},
@@ -95,13 +109,13 @@ export const utils = {
};
return order;
},
- async sleepAsync(ms: number) {
- return new Promise(resolve => setTimeout(resolve, ms));
+ async sleepAsync(ms: number): Promise<NodeJS.Timer> {
+ return new Promise<NodeJS.Timer>(resolve => setTimeout(resolve, ms));
},
- deepEqual(actual: any, expected: any, opts?: { strict: boolean }) {
+ deepEqual(actual: any, expected: any, opts?: { strict: boolean }): boolean {
return deepEqual(actual, expected, opts);
},
- getColSize(items: number) {
+ getColSize(items: number): number {
const bassCssGridSize = 12; // Source: http://basscss.com/#basscss-grid
const colSize = bassCssGridSize / items;
if (!_.isInteger(colSize)) {
@@ -109,7 +123,7 @@ export const utils = {
}
return colSize;
},
- getScreenWidth() {
+ getScreenWidth(): ScreenWidths {
const documentEl = document.documentElement;
const body = document.getElementsByTagName('body')[0];
const widthInPx = window.innerWidth || documentEl.clientWidth || body.clientWidth;
@@ -118,9 +132,9 @@ export const utils = {
// This logic mirrors the CSS media queries in BassCSS for the `lg-`, `md-` and `sm-` CSS
// class prefixes. Do not edit these.
- if (widthInEm > LG_MIN_EM) {
+ if (widthInEm > ScreenWidths.Lg) {
return ScreenWidths.Lg;
- } else if (widthInEm > MD_MIN_EM) {
+ } else if (widthInEm > ScreenWidths.Md) {
return ScreenWidths.Md;
} else {
return ScreenWidths.Sm;
@@ -141,7 +155,7 @@ export const utils = {
const intervalId = setTimeout(() => {
resolve(false);
}, getApiVersionTimeoutMs);
- u2f.getApiVersion((version: number) => {
+ u2f.getApiVersion((_version: number) => {
clearTimeout(intervalId);
resolve(true);
});
@@ -151,7 +165,7 @@ export const utils = {
// This checks the error message returned from an injected Web3 instance on the page
// after a user was prompted to sign a message or send a transaction and decided to
// reject the request.
- didUserDenyWeb3Request(errMsg: string) {
+ didUserDenyWeb3Request(errMsg: string): boolean {
const metamaskDenialErrMsg = 'User denied';
const paritySignerDenialErrMsg = 'Request has been rejected';
const ledgerDenialErrMsg = 'Invalid status 6985';
@@ -161,23 +175,44 @@ export const utils = {
_.includes(errMsg, ledgerDenialErrMsg);
return isUserDeniedErrMsg;
},
- getCurrentEnvironment() {
- switch (location.host) {
- case configs.DOMAIN_DEVELOPMENT:
- return 'development';
- case configs.DOMAIN_STAGING:
- return 'staging';
- case configs.DOMAIN_PRODUCTION:
- return 'production';
- default:
- return 'production';
- }
- },
getAddressBeginAndEnd(address: string): string {
const truncatedAddress = `${address.substring(0, 6)}...${address.substr(-4)}`; // 0x3d5a...b287
return truncatedAddress;
},
- hasUniqueNameAndSymbol(tokens: Token[], token: Token) {
+ getReadableAccountState(accountState: AccountState, userAddress: string): string {
+ switch (accountState) {
+ case AccountState.Loading:
+ return 'Loading...';
+ case AccountState.Ready:
+ return utils.getAddressBeginAndEnd(userAddress);
+ case AccountState.Locked:
+ return 'Please Unlock';
+ case AccountState.Disconnected:
+ return 'Connect a Wallet';
+ default:
+ return '';
+ }
+ },
+ getAccountState(
+ isBlockchainReady: boolean,
+ providerType: ProviderType,
+ injectedProviderName: string,
+ userAddress?: string,
+ ): AccountState {
+ const isAddressAvailable = !_.isUndefined(userAddress) && !_.isEmpty(userAddress);
+ const isExternallyInjectedProvider = utils.isExternallyInjected(providerType, injectedProviderName);
+ if (!isBlockchainReady) {
+ return AccountState.Loading;
+ } else if (isAddressAvailable) {
+ return AccountState.Ready;
+ // tslint:disable-next-line: prefer-conditional-expression
+ } else if (isExternallyInjectedProvider) {
+ return AccountState.Locked;
+ } else {
+ return AccountState.Disconnected;
+ }
+ },
+ hasUniqueNameAndSymbol(tokens: Token[], token: Token): boolean {
if (token.isRegistered) {
return true; // Since it's registered, it is the canonical token
}
@@ -192,21 +227,20 @@ export const utils = {
const isUniqueSymbol = _.isUndefined(tokenWithSameSymbolIfExists);
return isUniqueName && isUniqueSymbol;
},
- zeroExErrToHumanReadableErrMsg(error: ZeroExError | ExchangeContractErrs, takerAddress: string): string {
- const ZeroExErrorToHumanReadableError: { [error: string]: string } = {
- [ZeroExError.ExchangeContractDoesNotExist]: 'Exchange contract does not exist',
- [ZeroExError.EtherTokenContractDoesNotExist]: 'EtherToken contract does not exist',
- [ZeroExError.TokenTransferProxyContractDoesNotExist]: 'TokenTransferProxy contract does not exist',
- [ZeroExError.TokenRegistryContractDoesNotExist]: 'TokenRegistry contract does not exist',
- [ZeroExError.TokenContractDoesNotExist]: 'Token contract does not exist',
- [ZeroExError.ZRXContractDoesNotExist]: 'ZRX contract does not exist',
- [ZeroExError.UnhandledError]: 'Unhandled error occured',
- [ZeroExError.UserHasNoAssociatedAddress]: 'User has no addresses available',
- [ZeroExError.InvalidSignature]: 'Order signature is not valid',
- [ZeroExError.ContractNotDeployedOnNetwork]: 'Contract is not deployed on the detected network',
- [ZeroExError.InvalidJump]: 'Invalid jump occured while executing the transaction',
- [ZeroExError.OutOfGas]: 'Transaction ran out of gas',
- [ZeroExError.NoNetworkId]: 'No network id detected',
+ zeroExErrToHumanReadableErrMsg(error: ContractWrappersError | ExchangeContractErrs, takerAddress: string): string {
+ const ContractWrappersErrorToHumanReadableError: { [error: string]: string } = {
+ [ContractWrappersError.ExchangeContractDoesNotExist]: 'Exchange contract does not exist',
+ [ContractWrappersError.EtherTokenContractDoesNotExist]: 'EtherToken contract does not exist',
+ [ContractWrappersError.TokenTransferProxyContractDoesNotExist]:
+ 'TokenTransferProxy contract does not exist',
+ [ContractWrappersError.TokenRegistryContractDoesNotExist]: 'TokenRegistry contract does not exist',
+ [ContractWrappersError.TokenContractDoesNotExist]: 'Token contract does not exist',
+ [ContractWrappersError.ZRXContractDoesNotExist]: 'ZRX contract does not exist',
+ [BlockchainCallErrs.UserHasNoAssociatedAddresses]: 'User has no addresses available',
+ [OrderError.InvalidSignature]: 'Order signature is not valid',
+ [ContractWrappersError.ContractNotDeployedOnNetwork]: 'Contract is not deployed on the detected network',
+ [ContractWrappersError.InvalidJump]: 'Invalid jump occured while executing the transaction',
+ [ContractWrappersError.OutOfGas]: 'Transaction ran out of gas',
};
const exchangeContractErrorToHumanReadableError: {
[error: string]: string;
@@ -239,7 +273,7 @@ export const utils = {
[ExchangeContractErrs.InsufficientRemainingFillAmount]: 'Insufficient remaining fill amount',
};
const humanReadableErrorMsg =
- exchangeContractErrorToHumanReadableError[error] || ZeroExErrorToHumanReadableError[error];
+ exchangeContractErrorToHumanReadableError[error] || ContractWrappersErrorToHumanReadableError[error];
return humanReadableErrorMsg;
},
isParityNode(nodeVersion: string): boolean {
@@ -259,23 +293,23 @@ export const utils = {
);
return isTestNetwork;
},
- getCurrentBaseUrl() {
+ getCurrentBaseUrl(): string {
const port = window.location.port;
const hasPort = !_.isUndefined(port);
const baseUrl = `https://${window.location.hostname}${hasPort ? `:${port}` : ''}`;
return baseUrl;
},
- async onPageLoadAsync(): Promise<void> {
+ onPageLoadPromise: new Promise<void>((resolve, _reject) => {
if (document.readyState === 'complete') {
- return; // Already loaded
+ resolve();
+ return;
}
- return new Promise<void>((resolve, reject) => {
- window.onload = () => resolve();
- });
- },
- getProviderType(provider: Web3.Provider): Providers | string {
+ window.onload = () => resolve();
+ }),
+ getProviderType(provider: Provider): Providers | string {
const constructorName = provider.constructor.name;
let parsedProviderName = constructorName;
+ // https://ethereum.stackexchange.com/questions/24266/elegant-way-to-detect-current-provider-int-web3-js
switch (constructorName) {
case 'EthereumProvider':
parsedProviderName = Providers.Mist;
@@ -289,7 +323,165 @@ export const utils = {
parsedProviderName = Providers.Parity;
} else if ((provider as any).isMetaMask) {
parsedProviderName = Providers.Metamask;
+ } else if (!_.isUndefined(_.get(window, 'SOFA'))) {
+ parsedProviderName = Providers.Toshi;
+ } else if (!_.isUndefined(_.get(window, '__CIPHER__'))) {
+ parsedProviderName = Providers.Cipher;
}
return parsedProviderName;
},
+ getBackendBaseUrl(): string {
+ return utils.isDogfood() ? configs.BACKEND_BASE_STAGING_URL : configs.BACKEND_BASE_PROD_URL;
+ },
+ isDevelopment(): boolean {
+ return _.includes(configs.DOMAINS_DEVELOPMENT, window.location.host);
+ },
+ isStaging(): boolean {
+ return _.includes(window.location.href, configs.DOMAIN_STAGING);
+ },
+ isExternallyInjected(providerType: ProviderType, injectedProviderName: string): boolean {
+ return providerType === ProviderType.Injected && injectedProviderName !== constants.PROVIDER_NAME_PUBLIC;
+ },
+ isDogfood(): boolean {
+ return _.includes(window.location.href, configs.DOMAIN_DOGFOOD);
+ },
+ isProduction(): boolean {
+ return _.includes(window.location.href, configs.DOMAIN_PRODUCTION);
+ },
+ getEnvironment(): Environments {
+ if (utils.isDogfood()) {
+ return Environments.DOGFOOD;
+ }
+ if (utils.isDevelopment()) {
+ return Environments.DEVELOPMENT;
+ }
+ if (utils.isStaging()) {
+ return Environments.STAGING;
+ }
+ if (utils.isProduction()) {
+ return Environments.PRODUCTION;
+ }
+ return Environments.UNKNOWN;
+ },
+ getEthToken(tokenByAddress: TokenByAddress): Token {
+ return utils.getTokenBySymbol(constants.ETHER_TOKEN_SYMBOL, tokenByAddress);
+ },
+ getZrxToken(tokenByAddress: TokenByAddress): Token {
+ return utils.getTokenBySymbol(constants.ZRX_TOKEN_SYMBOL, tokenByAddress);
+ },
+ getTokenBySymbol(symbol: string, tokenByAddress: TokenByAddress): Token {
+ const tokens = _.values(tokenByAddress);
+ const token = _.find(tokens, { symbol });
+ return token;
+ },
+ getTrackedTokens(tokenByAddress: TokenByAddress): Token[] {
+ const allTokens = _.values(tokenByAddress);
+ const trackedTokens = _.filter(allTokens, t => utils.isTokenTracked(t));
+ return trackedTokens;
+ },
+ getFormattedAmountFromToken(token: Token, tokenState: TokenState): string {
+ return utils.getFormattedAmount(tokenState.balance, token.decimals);
+ },
+ format(value: BigNumber, format: string): string {
+ const formattedAmount = numeral(value).format(format);
+ if (_.isNaN(formattedAmount)) {
+ // https://github.com/adamwdraper/Numeral-js/issues/596
+ return numeral(new BigNumber(0)).format(format);
+ }
+ return formattedAmount;
+ },
+ getFormattedAmount(amount: BigNumber, decimals: number): string {
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
+ // if the unit amount is less than 1, show the natural number of decimal places with a max of 4
+ // if the unit amount is greater than or equal to 1, show only 2 decimal places
+ const lessThanOnePrecision = Math.min(constants.TOKEN_AMOUNT_DISPLAY_PRECISION, unitAmount.decimalPlaces());
+ const greaterThanOnePrecision = 2;
+ const precision = unitAmount.lt(1) ? lessThanOnePrecision : greaterThanOnePrecision;
+ const format = `0,0.${_.repeat('0', precision)}`;
+ return utils.format(unitAmount, format);
+ },
+ getUsdValueFormattedAmount(amount: BigNumber, decimals: number, price: BigNumber): string {
+ const unitAmount = Web3Wrapper.toUnitAmount(amount, decimals);
+ const value = unitAmount.mul(price);
+ return utils.format(value, constants.NUMERAL_USD_FORMAT);
+ },
+ openUrl(url: string): void {
+ window.open(url, '_blank');
+ },
+ isMobileWidth(screenWidth: ScreenWidths): boolean {
+ return screenWidth === ScreenWidths.Sm;
+ },
+ isMobileOperatingSystem(): boolean {
+ return bowser.mobile;
+ },
+ getBrowserType(): BrowserType {
+ if (bowser.chrome) {
+ return BrowserType.Chrome;
+ } else if (bowser.firefox) {
+ return BrowserType.Firefox;
+ } else if (bowser.opera) {
+ return BrowserType.Opera;
+ } else {
+ return BrowserType.Other;
+ }
+ },
+ getOperatingSystem(): OperatingSystemType {
+ if (bowser.android) {
+ return OperatingSystemType.Android;
+ } else if (bowser.ios) {
+ return OperatingSystemType.iOS;
+ } else if (bowser.mac) {
+ return OperatingSystemType.Mac;
+ } else if (bowser.windows) {
+ return OperatingSystemType.Windows;
+ } else if (bowser.windowsphone) {
+ return OperatingSystemType.WindowsPhone;
+ } else if (bowser.linux) {
+ return OperatingSystemType.Linux;
+ } else {
+ return OperatingSystemType.Other;
+ }
+ },
+ isTokenTracked(token: Token): boolean {
+ return !_.isUndefined(token.trackedTimestamp);
+ },
+ // Returns a [downloadLink, isOnMobile] tuple.
+ getBestWalletDownloadLinkAndIsMobile(): [string, boolean] {
+ const browserType = utils.getBrowserType();
+ const isOnMobile = utils.isMobileOperatingSystem();
+ const operatingSystem = utils.getOperatingSystem();
+ let downloadLink;
+ if (isOnMobile) {
+ switch (operatingSystem) {
+ case OperatingSystemType.Android:
+ downloadLink = constants.URL_TOSHI_ANDROID_APP_STORE;
+ break;
+ case OperatingSystemType.iOS:
+ downloadLink = constants.URL_TOSHI_IOS_APP_STORE;
+ break;
+ default:
+ // Toshi is only supported on these mobile OSes - just default to iOS
+ downloadLink = constants.URL_TOSHI_IOS_APP_STORE;
+ }
+ } else {
+ switch (browserType) {
+ case BrowserType.Chrome:
+ downloadLink = constants.URL_METAMASK_CHROME_STORE;
+ break;
+ case BrowserType.Firefox:
+ downloadLink = constants.URL_METAMASK_FIREFOX_STORE;
+ break;
+ case BrowserType.Opera:
+ downloadLink = constants.URL_METAMASK_OPERA_STORE;
+ break;
+ default:
+ downloadLink = constants.URL_METAMASK_HOMEPAGE;
+ }
+ }
+ return [downloadLink, isOnMobile];
+ },
+ getTokenIconUrl(symbol: string): string {
+ const result = `/images/token_icons/${symbol}.png`;
+ return result;
+ },
};
diff --git a/packages/website/ts/utils/wallet_item_styles.ts b/packages/website/ts/utils/wallet_item_styles.ts
deleted file mode 100644
index 1ad304ce1..000000000
--- a/packages/website/ts/utils/wallet_item_styles.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { colors, Styles } from '@0xproject/react-shared';
-
-export const styles: Styles = {
- focusedItem: {
- backgroundColor: colors.walletFocusedItemBackground,
- },
-};
diff --git a/packages/website/tslint.json b/packages/website/tslint.json
index d6a5f5031..b55ffe90f 100644
--- a/packages/website/tslint.json
+++ b/packages/website/tslint.json
@@ -4,6 +4,7 @@
"no-implicit-dependencies": false,
"no-object-literal-type-assertion": false,
"completed-docs": false,
- "prefer-function-over-method": false
+ "prefer-function-over-method": false,
+ "custom-no-magic-numbers": false
}
}
diff --git a/packages/website/webpack.config.js b/packages/website/webpack.config.js
index e28e9e064..8653196a6 100644
--- a/packages/website/webpack.config.js
+++ b/packages/website/webpack.config.js
@@ -1,6 +1,51 @@
const path = require('path');
const webpack = require('webpack');
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
+const RollbarSourceMapPlugin = require('rollbar-sourcemap-webpack-plugin');
+const childProcess = require('child_process');
+const GIT_SHA = childProcess
+ .execSync('git rev-parse HEAD')
+ .toString()
+ .trim();
+
+const generatePlugins = () => {
+ let plugins = [];
+ if (process.env.NODE_ENV === 'production') {
+ plugins = plugins.concat([
+ // Since we do not use moment's locale feature, we exclude them from the bundle.
+ // This reduces the bundle size by 0.4MB.
+ new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
+ new webpack.DefinePlugin({
+ 'process.env': {
+ NODE_ENV: JSON.stringify(process.env.NODE_ENV),
+ GIT_SHA: JSON.stringify(GIT_SHA),
+ },
+ }),
+ // TODO: Revert to webpack bundled version with webpack v4.
+ // The v3 series bundled version does not support ES6 and
+ // fails to build.
+ new UglifyJsPlugin({
+ sourceMap: true,
+ uglifyOptions: {
+ mangle: {
+ reserved: ['BigNumber'],
+ },
+ },
+ }),
+ ]);
+ if (process.env.DEPLOY_ROLLBAR_SOURCEMAPS === 'true') {
+ plugins = plugins.concat([
+ new RollbarSourceMapPlugin({
+ accessToken: '32c39bfa4bb6440faedc1612a9c13d28',
+ version: GIT_SHA,
+ publicPath: 'https://0xproject.com/',
+ }),
+ ]);
+ }
+ }
+ return plugins;
+};
module.exports = {
entry: ['./ts/index.tsx'],
output: {
@@ -24,6 +69,11 @@ module.exports = {
{
test: /\.js$/,
loader: 'source-map-loader',
+ exclude: [
+ // instead of /\/node_modules\//
+ path.join(process.cwd(), 'node_modules'),
+ path.join(process.cwd(), '../..', 'node_modules'),
+ ],
},
{
test: /\.tsx?$/,
@@ -65,22 +115,5 @@ module.exports = {
},
disableHostCheck: true,
},
- plugins:
- process.env.NODE_ENV === 'production'
- ? [
- // Since we do not use moment's locale feature, we exclude them from the bundle.
- // This reduces the bundle size by 0.4MB.
- new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
- new webpack.DefinePlugin({
- 'process.env': {
- NODE_ENV: JSON.stringify(process.env.NODE_ENV),
- },
- }),
- new webpack.optimize.UglifyJsPlugin({
- mangle: {
- except: ['BigNumber'],
- },
- }),
- ]
- : [],
+ plugins: generatePlugins(),
};
diff --git a/tsconfig.json b/tsconfig.json
index 448f2d752..588285140 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,8 +6,10 @@
"sourceMap": true,
"declaration": true,
"experimentalDecorators": true,
+ "downlevelIteration": true,
"noImplicitReturns": true,
"pretty": true,
+ "skipLibCheck": true,
"typeRoots": ["node_modules/@0xproject/typescript-typings/types", "node_modules/@types"],
"strict": true
}
diff --git a/yarn.lock b/yarn.lock
index 862ea09b2..598af599b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,16 +2,798 @@
# yarn lockfile v1
+"0x.js@0.38.5":
+ version "0.38.5"
+ resolved "https://registry.yarnpkg.com/0x.js/-/0x.js-0.38.5.tgz#da4724e81e648279ea288cbac4b1a950a7cd7707"
+ dependencies:
+ "@0xproject/assert" "^0.2.13"
+ "@0xproject/base-contract" "^0.3.5"
+ "@0xproject/contract-wrappers" "^0.1.0"
+ "@0xproject/order-utils" "^0.0.8"
+ "@0xproject/order-watcher" "^0.0.7"
+ "@0xproject/sol-compiler" "^0.5.3"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
"8fold-marked@0.3.9":
version "0.3.9"
resolved "https://registry.yarnpkg.com/8fold-marked/-/8fold-marked-0.3.9.tgz#bb89c645612f8ccfaffac1ca6e3c11f168c9cf59"
-"@0xproject/tslint-config@0.4.8":
- version "0.4.8"
- resolved "https://registry.yarnpkg.com/@0xproject/tslint-config/-/tslint-config-0.4.8.tgz#5a3dfb1fc94e17752184137b452c5b0b3287d822"
+"@0x-lerna-fork/add@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/add/-/add-3.0.0-beta.22.tgz#b69d7cbf6a28af6abb3aabb47fb617e7c6c7ac2c"
dependencies:
- lodash "^4.17.4"
- tslint-react "^3.2.0"
+ "@0x-lerna-fork/bootstrap" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ dedent "^0.7.0"
+ npm-package-arg "^6.0.0"
+ p-map "^1.2.0"
+ package-json "^4.0.1"
+ semver "^5.5.0"
+
+"@0x-lerna-fork/batch-packages@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/batch-packages/-/batch-packages-3.0.0-beta.22.tgz#13adf6e31236c5080fdff1428767114a43150382"
+ dependencies:
+ "@0x-lerna-fork/package-graph" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/bootstrap@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/bootstrap/-/bootstrap-3.0.0-beta.22.tgz#d07c8fb3a44668a5af672e895edf561abf145f79"
+ dependencies:
+ "@0x-lerna-fork/batch-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-conf" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-install" "^3.0.0-beta.22"
+ "@0x-lerna-fork/rimraf-dir" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-lifecycle" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-parallel-batches" "^3.0.0-beta.22"
+ "@0x-lerna-fork/symlink-binary" "^3.0.0-beta.22"
+ "@0x-lerna-fork/symlink-dependencies" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ dedent "^0.7.0"
+ get-port "^3.2.0"
+ multimatch "^2.1.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+ p-waterfall "^1.0.0"
+ read-package-tree "^5.1.6"
+ semver "^5.5.0"
+
+"@0x-lerna-fork/changed@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/changed/-/changed-3.0.0-beta.22.tgz#febe7309820d88e95695fab538849302ae7e58a4"
+ dependencies:
+ "@0x-lerna-fork/collect-updates" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/output" "^3.0.0-beta.22"
+ "@0x-lerna-fork/publish" "^3.0.0-beta.22"
+ chalk "^2.3.1"
+
+"@0x-lerna-fork/child-process@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/child-process/-/child-process-3.0.0-beta.22.tgz#159fb6506fb4db04f78d09552d7f78957631baa4"
+ dependencies:
+ chalk "^2.3.1"
+ execa "^0.10.0"
+ strong-log-transformer "^1.0.6"
+
+"@0x-lerna-fork/clean@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/clean/-/clean-3.0.0-beta.22.tgz#c29559fa7c4fdf1abef9c52a86a4408043ef0d63"
+ dependencies:
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/prompt" "^3.0.0-beta.22"
+ "@0x-lerna-fork/rimraf-dir" "^3.0.0-beta.22"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+ p-waterfall "^1.0.0"
+
+"@0x-lerna-fork/cli@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/cli/-/cli-3.0.0-beta.22.tgz#131f5de34ede1a1c04e007d122cc8c0583355b95"
+ dependencies:
+ "@0x-lerna-fork/add" "^3.0.0-beta.22"
+ "@0x-lerna-fork/bootstrap" "^3.0.0-beta.22"
+ "@0x-lerna-fork/changed" "^3.0.0-beta.22"
+ "@0x-lerna-fork/clean" "^3.0.0-beta.22"
+ "@0x-lerna-fork/create" "^3.0.0-beta.22"
+ "@0x-lerna-fork/diff" "^3.0.0-beta.22"
+ "@0x-lerna-fork/exec" "^3.0.0-beta.22"
+ "@0x-lerna-fork/global-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/import" "^3.0.0-beta.22"
+ "@0x-lerna-fork/init" "^3.0.0-beta.22"
+ "@0x-lerna-fork/link" "^3.0.0-beta.22"
+ "@0x-lerna-fork/list" "^3.0.0-beta.22"
+ "@0x-lerna-fork/publish" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run" "^3.0.0-beta.22"
+ dedent "^0.7.0"
+ is-ci "^1.0.10"
+ npmlog "^4.1.2"
+ yargs "^11.0.0"
+
+"@0x-lerna-fork/collect-packages@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/collect-packages/-/collect-packages-3.0.0-beta.22.tgz#33fdb2c9ec40d5a6ca28f685d507dd52cb1b5a4b"
+ dependencies:
+ "@0x-lerna-fork/package" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ globby "^8.0.1"
+ load-json-file "^4.0.0"
+ p-map "^1.2.0"
+
+"@0x-lerna-fork/collect-updates@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/collect-updates/-/collect-updates-3.0.0-beta.22.tgz#fcdeeef3e6d1c6fa7111a390b01be619cf26e2d4"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ minimatch "^3.0.4"
+ npmlog "^4.1.2"
+ semver "^5.5.0"
+ slash "^1.0.0"
+
+"@0x-lerna-fork/command@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/command/-/command-3.0.0-beta.22.tgz#1faa8ccfaa31d130878c81e58b7374e2b5e7f9ed"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/collect-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/collect-updates" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/package-graph" "^3.0.0-beta.22"
+ "@0x-lerna-fork/project" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ "@0x-lerna-fork/write-log-file" "^3.0.0-beta.22"
+ dedent "^0.7.0"
+ execa "^0.10.0"
+ lodash "^4.17.5"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/conventional-commits@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/conventional-commits/-/conventional-commits-3.0.0-beta.22.tgz#6c7b9b54546d2ea6eb9aed1a3ac96a374f9fc152"
+ dependencies:
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ conventional-changelog-angular "^1.6.6"
+ conventional-changelog-core "^2.0.5"
+ conventional-recommended-bump "^2.0.6"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ get-stream "^3.0.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ semver "^5.5.0"
+
+"@0x-lerna-fork/create-symlink@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/create-symlink/-/create-symlink-3.0.0-beta.22.tgz#57d7a148f5f3af99b64f48d5962d37a065a7fce9"
+ dependencies:
+ cmd-shim "^2.0.2"
+ fs-extra "^5.0.0"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/create@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/create/-/create-3.0.0-beta.22.tgz#3283037aa9343f985c55ce5fb320f14cae1421ce"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-conf" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ camelcase "^4.1.0"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ globby "^8.0.1"
+ init-package-json "^1.10.3"
+ npm-package-arg "^6.0.0"
+ pify "^3.0.0"
+ semver "^5.5.0"
+ slash "^1.0.0"
+ validate-npm-package-license "^3.0.3"
+ validate-npm-package-name "^3.0.0"
+
+"@0x-lerna-fork/diff@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/diff/-/diff-3.0.0-beta.22.tgz#5131c89ab2e2588e0c971dec71a629135a43b8b8"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/exec@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/exec/-/exec-3.0.0-beta.22.tgz#437a6e18c5b32485fb19e3f7e1967fd13ea939ae"
+ dependencies:
+ "@0x-lerna-fork/batch-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-parallel-batches" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+
+"@0x-lerna-fork/filter-options@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/filter-options/-/filter-options-3.0.0-beta.22.tgz#c95c8963cac0218e0130ec893a164557e6c17f56"
+ dependencies:
+ dedent "^0.7.0"
+
+"@0x-lerna-fork/filter-packages@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/filter-packages/-/filter-packages-3.0.0-beta.22.tgz#b4af6915138589ac6076d678a46e6f54864fa6c4"
+ dependencies:
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ multimatch "^2.1.0"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/get-npm-exec-opts@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0-beta.22.tgz#f06726c900f980154cdc3adfb3a8551393ec3e97"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/global-options@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/global-options/-/global-options-3.0.0-beta.22.tgz#c301f769c0621e0f4b2cd9904846291abbb0d26e"
+
+"@0x-lerna-fork/import@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/import/-/import-3.0.0-beta.22.tgz#5bdd0a70517a6277578417ea980db62ea8fa00c3"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/prompt" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ dedent "^0.7.0"
+ fs-extra "^5.0.0"
+ p-map-series "^1.0.0"
+
+"@0x-lerna-fork/init@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/init/-/init-3.0.0-beta.22.tgz#732812d5604428f4483c2e6284eeb9424551bea2"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ fs-extra "^5.0.0"
+ p-map "^1.2.0"
+ write-json-file "^2.3.0"
+
+"@0x-lerna-fork/lerna@3.0.0-beta.23":
+ version "3.0.0-beta.23"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/lerna/-/lerna-3.0.0-beta.23.tgz#102390423e6ed6c1d0b72f43da166d85bc6bd0ac"
+ dependencies:
+ "@0x-lerna-fork/cli" "^3.0.0-beta.22"
+ import-local "^1.0.0"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/link@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/link/-/link-3.0.0-beta.22.tgz#bf090e6b1db473df8887105cb4d04389749a4fe1"
+ dependencies:
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/package-graph" "^3.0.0-beta.22"
+ "@0x-lerna-fork/symlink-dependencies" "^3.0.0-beta.22"
+ p-map "^1.2.0"
+ slash "^1.0.0"
+
+"@0x-lerna-fork/list@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/list/-/list-3.0.0-beta.22.tgz#4df8aec3bfc994fab559f2ef8d675741e551efc4"
+ dependencies:
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/output" "^3.0.0-beta.22"
+ chalk "^2.3.1"
+ columnify "^1.5.4"
+
+"@0x-lerna-fork/npm-conf@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-conf/-/npm-conf-3.0.0-beta.22.tgz#d5f0f8754d7c5fb2db736fee5b6e26355b4802ac"
+ dependencies:
+ config-chain "^1.1.11"
+ pify "^3.0.0"
+
+"@0x-lerna-fork/npm-dist-tag@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-dist-tag/-/npm-dist-tag-3.0.0-beta.22.tgz#92b4d99d02df36b48375f6ae05d13fbcc195a036"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/get-npm-exec-opts" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/npm-install@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-install/-/npm-install-3.0.0-beta.22.tgz#d0c17de0d05cb773c32a0a46da11678d6bc21f6b"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/get-npm-exec-opts" "^3.0.0-beta.22"
+ fs-extra "^5.0.0"
+ npm-package-arg "^6.0.0"
+ npmlog "^4.1.2"
+ signal-exit "^3.0.2"
+ write-pkg "^3.1.0"
+
+"@0x-lerna-fork/npm-publish@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-publish/-/npm-publish-3.0.0-beta.22.tgz#4199433a49f8b92293c220dc11f9db5dcb5ced56"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/get-npm-exec-opts" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/npm-run-script@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/npm-run-script/-/npm-run-script-3.0.0-beta.22.tgz#0e954343eb360e23388f4b52ca3ca475ca7cae89"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/get-npm-exec-opts" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/output@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/output/-/output-3.0.0-beta.22.tgz#cc17096b5f5c6a7e86c196dc630d9690c028fb14"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/package-graph@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/package-graph/-/package-graph-3.0.0-beta.22.tgz#2f5ed68be8ed5be9adeb47b07fac368818856658"
+ dependencies:
+ npm-package-arg "^6.0.0"
+ semver "^5.5.0"
+
+"@0x-lerna-fork/package@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/package/-/package-3.0.0-beta.22.tgz#5a60bddf0ae41e992186846f091676cde640ae9a"
+ dependencies:
+ npm-package-arg "^6.0.0"
+ write-pkg "^3.1.0"
+
+"@0x-lerna-fork/project@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/project/-/project-3.0.0-beta.22.tgz#aec6fbeb68f70732eb9c35a315875570d0605fd5"
+ dependencies:
+ "@0x-lerna-fork/package" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ cosmiconfig "^5.0.2"
+ dedent "^0.7.0"
+ dot-prop "^4.2.0"
+ glob-parent "^3.1.0"
+ load-json-file "^4.0.0"
+ npmlog "^4.1.2"
+ resolve-from "^4.0.0"
+ write-json-file "^2.3.0"
+
+"@0x-lerna-fork/prompt@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/prompt/-/prompt-3.0.0-beta.22.tgz#be177c65191c6e931da90f0b798cdb5646edd08a"
+ dependencies:
+ inquirer "^5.1.0"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/publish@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/publish/-/publish-3.0.0-beta.22.tgz#3fc44b93e30b872efd8161e45d1484416f01a5db"
+ dependencies:
+ "@0x-lerna-fork/batch-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ "@0x-lerna-fork/collect-updates" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/conventional-commits" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-conf" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-dist-tag" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-publish" "^3.0.0-beta.22"
+ "@0x-lerna-fork/output" "^3.0.0-beta.22"
+ "@0x-lerna-fork/prompt" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-lifecycle" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-parallel-batches" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ chalk "^2.3.1"
+ dedent "^0.7.0"
+ minimatch "^3.0.4"
+ npmlog "^4.1.2"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-reduce "^1.0.0"
+ p-waterfall "^1.0.0"
+ semver "^5.5.0"
+ slash "^1.0.0"
+ temp-write "^3.4.0"
+ write-json-file "^2.3.0"
+
+"@0x-lerna-fork/resolve-symlink@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/resolve-symlink/-/resolve-symlink-3.0.0-beta.22.tgz#a60094ed02f7e76f76990c001d7cf34a80d8bfc7"
+ dependencies:
+ fs-extra "^5.0.0"
+ npmlog "^4.1.2"
+ read-cmd-shim "^1.0.1"
+
+"@0x-lerna-fork/rimraf-dir@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/rimraf-dir/-/rimraf-dir-3.0.0-beta.22.tgz#202060d5742f1bc32201060634a2c6b6df533138"
+ dependencies:
+ "@0x-lerna-fork/child-process" "^3.0.0-beta.22"
+ npmlog "^4.1.2"
+ path-exists "^3.0.0"
+ rimraf "^2.6.2"
+
+"@0x-lerna-fork/run-lifecycle@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run-lifecycle/-/run-lifecycle-3.0.0-beta.22.tgz#10d6ccc8dd44d82723f61f0255ec40f39f4a2501"
+ dependencies:
+ npm-lifecycle "^2.0.0"
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/run-parallel-batches@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run-parallel-batches/-/run-parallel-batches-3.0.0-beta.22.tgz#ca763a70f9410cf9fc010948c33366bf4b43cae2"
+ dependencies:
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+
+"@0x-lerna-fork/run@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/run/-/run-3.0.0-beta.22.tgz#96f2201619c817b2eca7d101ec47c767a5f9d631"
+ dependencies:
+ "@0x-lerna-fork/batch-packages" "^3.0.0-beta.22"
+ "@0x-lerna-fork/command" "^3.0.0-beta.22"
+ "@0x-lerna-fork/filter-options" "^3.0.0-beta.22"
+ "@0x-lerna-fork/npm-run-script" "^3.0.0-beta.22"
+ "@0x-lerna-fork/output" "^3.0.0-beta.22"
+ "@0x-lerna-fork/run-parallel-batches" "^3.0.0-beta.22"
+ "@0x-lerna-fork/validation-error" "^3.0.0-beta.22"
+ p-map "^1.2.0"
+
+"@0x-lerna-fork/symlink-binary@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/symlink-binary/-/symlink-binary-3.0.0-beta.22.tgz#4dbc3775e6cc1d6c1993e1746aaa41b25202412e"
+ dependencies:
+ "@0x-lerna-fork/create-symlink" "^3.0.0-beta.22"
+ "@0x-lerna-fork/package" "^3.0.0-beta.22"
+ fs-extra "^5.0.0"
+ p-map "^1.2.0"
+ read-pkg "^3.0.0"
+
+"@0x-lerna-fork/symlink-dependencies@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/symlink-dependencies/-/symlink-dependencies-3.0.0-beta.22.tgz#8fc4bb08a5371401c6cf61f01365d132ccdc69d9"
+ dependencies:
+ "@0x-lerna-fork/create-symlink" "^3.0.0-beta.22"
+ "@0x-lerna-fork/resolve-symlink" "^3.0.0-beta.22"
+ "@0x-lerna-fork/symlink-binary" "^3.0.0-beta.22"
+ fs-extra "^5.0.0"
+ p-finally "^1.0.0"
+ p-map "^1.2.0"
+ p-map-series "^1.0.0"
+
+"@0x-lerna-fork/validation-error@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/validation-error/-/validation-error-3.0.0-beta.22.tgz#3bfd7f99d3e82e0f989c7a79f29384a97c754ff9"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@0x-lerna-fork/write-log-file@^3.0.0-beta.22":
+ version "3.0.0-beta.22"
+ resolved "https://registry.yarnpkg.com/@0x-lerna-fork/write-log-file/-/write-log-file-3.0.0-beta.22.tgz#fb84dd89a01973a198f8b5bb568bb708cddc9213"
+ dependencies:
+ npmlog "^4.1.2"
+ write-file-atomic "^2.3.0"
+
+"@0xproject/assert@^0.2.12", "@0xproject/assert@^0.2.14":
+ version "0.2.14"
+ resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.14.tgz#7d5a373fedc8eb482716b730f4dddf3ef33bfa29"
+ dependencies:
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ lodash "4.17.10"
+ valid-url "1.0.9"
+
+"@0xproject/assert@^0.2.13":
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/@0xproject/assert/-/assert-0.2.13.tgz#8eb0e16cd6d802eae1b0ab86d344360ea0038331"
+ dependencies:
+ "@0xproject/json-schemas" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ lodash "4.17.10"
+ valid-url "1.0.9"
+
+"@0xproject/base-contract@^0.3.4", "@0xproject/base-contract@^0.3.5", "@0xproject/base-contract@^0.3.6":
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/@0xproject/base-contract/-/base-contract-0.3.6.tgz#c6d742ce2904bdd9e77524d99ba2438d3aae8a40"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/contract-wrappers@^0.0.5":
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.0.5.tgz#36f91afb7de51478f9d2e4e0a3c4e685b3d18f28"
+ dependencies:
+ "@0xproject/assert" "^0.2.12"
+ "@0xproject/base-contract" "^0.3.4"
+ "@0xproject/fill-scenarios" "^0.0.4"
+ "@0xproject/json-schemas" "^0.8.1"
+ "@0xproject/order-utils" "^0.0.7"
+ "@0xproject/types" "^0.8.1"
+ "@0xproject/typescript-typings" "^0.4.1"
+ "@0xproject/utils" "^0.7.1"
+ "@0xproject/web3-wrapper" "^0.7.1"
+ ethereumjs-blockstream "2.0.7"
+ ethereumjs-util "5.1.5"
+ ethers "3.0.22"
+ js-sha3 "0.7.0"
+ lodash "4.17.10"
+ uuid "3.2.1"
+
+"@0xproject/contract-wrappers@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@0xproject/contract-wrappers/-/contract-wrappers-0.1.1.tgz#8108d7ec051f202ef0cfa77c91c4ef994bf89881"
+ dependencies:
+ "@0xproject/assert" "^0.2.14"
+ "@0xproject/base-contract" "^0.3.6"
+ "@0xproject/fill-scenarios" "^0.0.6"
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/order-utils" "^0.0.9"
+ "@0xproject/sol-compiler" "^0.5.4"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethereumjs-blockstream "5.0.0"
+ ethereumjs-util "5.1.5"
+ ethers "3.0.22"
+ js-sha3 "0.7.0"
+ lodash "4.17.10"
+ uuid "3.2.1"
+
+"@0xproject/fill-scenarios@^0.0.4":
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.4.tgz#4d23c75abda7e9f117b698c0b8b142af07e0c69e"
+ dependencies:
+ "@0xproject/base-contract" "^0.3.4"
+ "@0xproject/order-utils" "^0.0.7"
+ "@0xproject/types" "^0.8.1"
+ "@0xproject/typescript-typings" "^0.4.1"
+ "@0xproject/utils" "^0.7.1"
+ "@0xproject/web3-wrapper" "^0.7.1"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/fill-scenarios@^0.0.5":
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.5.tgz#a62a240ae40423b9b73ecc0b1fc2abb58b76621c"
+ dependencies:
+ "@0xproject/base-contract" "^0.3.5"
+ "@0xproject/order-utils" "^0.0.8"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/fill-scenarios@^0.0.6":
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/@0xproject/fill-scenarios/-/fill-scenarios-0.0.6.tgz#969a2c49122650af5a1bf7fe7c6d286a0e6f2de2"
+ dependencies:
+ "@0xproject/base-contract" "^0.3.6"
+ "@0xproject/order-utils" "^0.0.9"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/json-schemas@^0.8.1", "@0xproject/json-schemas@^0.8.3":
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.3.tgz#455e6219a6bd05e990392165192a983a9ab89f26"
+ dependencies:
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@types/node" "9.6.0"
+ jsonschema "1.2.2"
+ lodash.values "4.3.0"
+
+"@0xproject/json-schemas@^0.8.2":
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/@0xproject/json-schemas/-/json-schemas-0.8.2.tgz#9d3f446e546ce0c959cf7beb45d41ac60476a78c"
+ dependencies:
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@types/node" "9.6.0"
+ jsonschema "1.2.2"
+ lodash.values "4.3.0"
+
+"@0xproject/order-utils@^0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.7.tgz#eaa465782ea5745bdad54e1a851533172d993b7c"
+ dependencies:
+ "@0xproject/assert" "^0.2.12"
+ "@0xproject/json-schemas" "^0.8.1"
+ "@0xproject/types" "^0.8.1"
+ "@0xproject/typescript-typings" "^0.4.1"
+ "@0xproject/utils" "^0.7.1"
+ "@0xproject/web3-wrapper" "^0.7.1"
+ "@types/node" "9.6.0"
+ bn.js "4.11.7"
+ ethereumjs-abi "0.6.5"
+ ethereumjs-util "5.1.5"
+ lodash "4.17.10"
+
+"@0xproject/order-utils@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.8.tgz#72077749a22cae5f0c748a6af90d1d77f5ebf8c9"
+ dependencies:
+ "@0xproject/assert" "^0.2.13"
+ "@0xproject/json-schemas" "^0.8.2"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
+ "@types/node" "9.6.0"
+ bn.js "4.11.7"
+ ethereumjs-abi "0.6.5"
+ ethereumjs-util "5.1.5"
+ lodash "4.17.10"
+
+"@0xproject/order-utils@^0.0.9":
+ version "0.0.9"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-utils/-/order-utils-0.0.9.tgz#75225dfbd87335d18810abf995d8e077b9a84868"
+ dependencies:
+ "@0xproject/assert" "^0.2.14"
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ "@types/node" "9.6.0"
+ bn.js "4.11.7"
+ ethereumjs-abi "0.6.5"
+ ethereumjs-util "5.1.5"
+ lodash "4.17.10"
+
+"@0xproject/order-watcher@^0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@0xproject/order-watcher/-/order-watcher-0.0.7.tgz#fbe019aa33447781096b5d562e7a3a4ec91a1da2"
+ dependencies:
+ "@0xproject/assert" "^0.2.13"
+ "@0xproject/base-contract" "^0.3.5"
+ "@0xproject/contract-wrappers" "^0.1.0"
+ "@0xproject/fill-scenarios" "^0.0.5"
+ "@0xproject/json-schemas" "^0.8.2"
+ "@0xproject/order-utils" "^0.0.8"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.2"
+ "@0xproject/utils" "^0.7.2"
+ "@0xproject/web3-wrapper" "^0.7.2"
+ bintrees "1.0.2"
+ ethereum-types "^0.0.2"
+ ethereumjs-blockstream "5.0.0"
+ ethers "3.0.22"
+ lodash "4.17.10"
+
+"@0xproject/react-shared@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/react-shared/-/react-shared-0.2.3.tgz#f0403b9b7f1cfbe2853b53cc983ebb13ee8753a5"
+ dependencies:
+ "@types/lodash" "4.14.104"
+ "@types/material-ui" "0.18.0"
+ "@types/node" "9.6.0"
+ "@types/react" "16.3.13"
+ "@types/react-dom" "16.0.4"
+ "@types/react-scroll" "0.0.31"
+ basscss "8.0.4"
+ is-mobile "0.2.2"
+ lodash "4.17.10"
+ material-ui "0.17.4"
+ react "15.6.1"
+ react-dom "15.6.1"
+ react-highlight "0xproject/react-highlight"
+ react-markdown "3.2.2"
+ react-scroll "1.7.7"
+ react-tap-event-plugin "2.0.1"
+
+"@0xproject/sol-compiler@^0.5.3", "@0xproject/sol-compiler@^0.5.4":
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/@0xproject/sol-compiler/-/sol-compiler-0.5.4.tgz#3e0b04b0c02c5ec046ebb962b5ed20978c6b4cdd"
+ dependencies:
+ "@0xproject/json-schemas" "^0.8.3"
+ "@0xproject/sol-resolver" "^0.0.8"
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ "@0xproject/web3-wrapper" "^0.7.3"
+ "@types/yargs" "10.0.2"
+ chalk "2.3.2"
+ ethereumjs-util "5.1.5"
+ isomorphic-fetch "2.2.1"
+ lodash "4.17.10"
+ mkdirp "0.5.1"
+ require-from-string "2.0.1"
+ semver "5.5.0"
+ solc "0.4.23"
+ web3 "0.20.6"
+ web3-eth-abi "1.0.0-beta.33"
+ yargs "11.1.0"
+
+"@0xproject/sol-resolver@^0.0.8":
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/@0xproject/sol-resolver/-/sol-resolver-0.0.8.tgz#5496ccebc9afa9eedfb5b62104f6478aa852bf66"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.0.3"
+ lodash "4.17.10"
+
+"@0xproject/types@^0.5.0":
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/@0xproject/types/-/types-0.5.0.tgz#ba3cfbc11a8c6344b57c9680aa7df2ea84b9bf05"
+ dependencies:
+ bignumber.js "~4.1.0"
+
+"@0xproject/types@^0.8.1", "@0xproject/types@^0.8.2":
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/@0xproject/types/-/types-0.8.2.tgz#6f936b73bfb6f017b5102002d97da0881da92d1b"
+ dependencies:
+ "@types/node" "9.6.0"
+ bignumber.js "~4.1.0"
+
+"@0xproject/typescript-typings@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/typescript-typings/-/typescript-typings-0.0.3.tgz#3272080bde00ade0a970b0d236686b483b08a1d0"
+ dependencies:
+ "@0xproject/types" "^0.5.0"
+ bignumber.js "~4.1.0"
+
+"@0xproject/typescript-typings@^0.4.1", "@0xproject/typescript-typings@^0.4.2", "@0xproject/typescript-typings@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/typescript-typings/-/typescript-typings-0.4.3.tgz#f99f939a43f2764ad7182fcd78a71212a1d76d96"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ bignumber.js "~4.1.0"
+ ethereum-types "^0.0.2"
+
+"@0xproject/utils@^0.7.1", "@0xproject/utils@^0.7.2", "@0xproject/utils@^0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/utils/-/utils-0.7.3.tgz#ffa7c6da9bf0dd3e13694f185dcfc48a8981ff05"
+ dependencies:
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@types/node" "9.6.0"
+ bignumber.js "~4.1.0"
+ ethereum-types "^0.0.2"
+ ethereumjs-util "^5.1.1"
+ ethers "3.0.22"
+ js-sha3 "0.7.0"
+ lodash "4.17.10"
+ web3 "0.20.6"
+
+"@0xproject/web3-wrapper@^0.7.1", "@0xproject/web3-wrapper@^0.7.2", "@0xproject/web3-wrapper@^0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@0xproject/web3-wrapper/-/web3-wrapper-0.7.3.tgz#9bd50b034b92fd505b6766b6e225f014b6d08b08"
+ dependencies:
+ "@0xproject/types" "^0.8.2"
+ "@0xproject/typescript-typings" "^0.4.3"
+ "@0xproject/utils" "^0.7.3"
+ ethers "3.0.22"
+ lodash "4.17.10"
+ web3 "0.20.6"
"@ledgerhq/hw-app-eth@^4.3.0":
version "4.7.3"
@@ -20,8 +802,8 @@
"@ledgerhq/hw-transport" "^4.7.3"
"@ledgerhq/hw-transport-node-hid@^4.3.0":
- version "4.7.3"
- resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.7.3.tgz#e7634d53161cdffed4f602cddca6a7bc34e7b79b"
+ version "4.7.6"
+ resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.7.6.tgz#f2bd7c714e359af84377d07dd6431f2aa582e71e"
dependencies:
"@ledgerhq/hw-transport" "^4.7.3"
node-hid "^0.7.2"
@@ -39,6 +821,45 @@
dependencies:
events "^2.0.0"
+"@lerna/batch-packages@^3.0.0-beta.18":
+ version "3.0.0-beta.18"
+ resolved "http://registry.yarnpkg.com/@lerna%2fbatch-packages/-/batch-packages-3.0.0-beta.18.tgz#69d5e3f5003e454a1615c38d9f0b65b10853625a"
+ dependencies:
+ "@lerna/package-graph" "^3.0.0-beta.18"
+ "@lerna/validation-error" "^3.0.0-beta.10"
+ npmlog "^4.1.2"
+
+"@lerna/package-graph@^3.0.0-beta.18":
+ version "3.0.0-beta.18"
+ resolved "http://registry.yarnpkg.com/@lerna%2fpackage-graph/-/package-graph-3.0.0-beta.18.tgz#8c33a6a10453d310e14fc9d317dc51e845e11963"
+ dependencies:
+ npm-package-arg "^6.0.0"
+ semver "^5.5.0"
+
+"@lerna/validation-error@^3.0.0-beta.10":
+ version "3.0.0-beta.10"
+ resolved "http://registry.yarnpkg.com/@lerna%2fvalidation-error/-/validation-error-3.0.0-beta.10.tgz#cf5cbc39c4d27b89c6080e326de745f6fb7451ab"
+ dependencies:
+ npmlog "^4.1.2"
+
+"@loopback/dist-util@^0.3.6":
+ version "0.3.6"
+ resolved "https://registry.npmjs.org/@loopback/dist-util/-/dist-util-0.3.6.tgz#bd1d5887aa0f2bec41722f1d74fc19319d04e975"
+
+"@loopback/openapi-v3-types@^0.8.2":
+ version "0.8.3"
+ resolved "https://registry.npmjs.org/@loopback/openapi-v3-types/-/openapi-v3-types-0.8.3.tgz#d87948591295fb85057f4a2460283ea6a0e01c8c"
+ dependencies:
+ "@loopback/dist-util" "^0.3.6"
+ openapi3-ts "^0.11.0"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
"@sindresorhus/is@^0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
@@ -57,9 +878,21 @@
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/bintrees/-/bintrees-1.0.2.tgz#0dfdce4eeebdf90427bd35b0e79dc248b3d157a6"
-"@types/bluebird@^3.5.3":
- version "3.5.20"
- resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.20.tgz#f6363172add6f4eabb8cada53ca9af2781e8d6a1"
+"@types/bip39@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/bip39/-/bip39-2.4.0.tgz#eee31a14abc8ebbb41a1ff14575c447b18346cbc"
+ dependencies:
+ "@types/node" "*"
+
+"@types/blockies@^0.0.0":
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/@types/blockies/-/blockies-0.0.0.tgz#e1dea77f138ee718bebbeb5b59d5d02139983617"
+
+"@types/bn.js@^4.11.0":
+ version "4.11.0"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.0.tgz#401cb20874f0a7b8414e46308a99c449759b7de9"
+ dependencies:
+ "@types/node" "*"
"@types/body-parser@*", "@types/body-parser@^1.16.1":
version "1.16.8"
@@ -68,18 +901,30 @@
"@types/express" "*"
"@types/node" "*"
-"@types/caseless@*":
- version "0.12.1"
- resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a"
-
-"@types/dateformat@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-1.0.1.tgz#2e5b235c8c55652c4fec284506d2a36fe65fe87e"
+"@types/compare-versions@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/compare-versions/-/compare-versions-3.0.0.tgz#4a45dffe0ebbc00d0f2daef8a0e96ffc66cf5955"
"@types/deep-equal@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/deep-equal/-/deep-equal-1.0.1.tgz#71cfabb247c22bcc16d536111f50c0ed12476b03"
+"@types/depcheck@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@types/depcheck/-/depcheck-0.6.0.tgz#13c8654983feb0916f45c40b2d9fafe0c8b0e4a8"
+
+"@types/ethereumjs-abi@^0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@types/ethereumjs-abi/-/ethereumjs-abi-0.6.0.tgz#72d21083a36d9288821b62905e04b15e0c12175d"
+ dependencies:
+ "@types/node" "*"
+
+"@types/ethereumjs-tx@^1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/ethereumjs-tx/-/ethereumjs-tx-1.0.0.tgz#ae2ce90a145cc1a6849656db38baf0e793ff7927"
+ dependencies:
+ "@types/node" "*"
+
"@types/events@*":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
@@ -99,15 +944,13 @@
"@types/express-serve-static-core" "*"
"@types/serve-static" "*"
-"@types/fetch-mock@^5.12.1":
+"@types/fetch-mock@^5.12.2":
version "5.12.2"
resolved "https://registry.yarnpkg.com/@types/fetch-mock/-/fetch-mock-5.12.2.tgz#8c96517ff74303031c65c5da2d99858e34c844d2"
-"@types/form-data@*":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e"
- dependencies:
- "@types/node" "*"
+"@types/find-versions@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/find-versions/-/find-versions-2.0.0.tgz#a976ca032ab8dd1161116604eded0620d2b85df2"
"@types/fs-extra@5.0.0":
version "5.0.0"
@@ -121,7 +964,7 @@
dependencies:
"@types/node" "*"
-"@types/glob@*", "@types/glob@^5.0.33":
+"@types/glob@*", "@types/glob@5.0.35", "@types/glob@^5.0.33":
version "5.0.35"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
dependencies:
@@ -129,10 +972,20 @@
"@types/minimatch" "*"
"@types/node" "*"
-"@types/handlebars@4.0.36", "@types/handlebars@^4.0.31", "@types/handlebars@^4.0.36":
+"@types/handlebars@4.0.36":
version "4.0.36"
resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.36.tgz#ff57c77fa1ab6713bb446534ddc4d979707a3a79"
+"@types/handlebars@^4.0.31", "@types/handlebars@^4.0.36":
+ version "4.0.37"
+ resolved "https://registry.yarnpkg.com/@types/handlebars/-/handlebars-4.0.37.tgz#a3bc3eba0c0f03f753cac00841a5b21e26a02c03"
+
+"@types/hdkey@^0.7.0":
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/@types/hdkey/-/hdkey-0.7.0.tgz#6734d138e3c597f241be8fae2e60c2949bc3af87"
+ dependencies:
+ "@types/node" "*"
+
"@types/highlight.js@9.12.2", "@types/highlight.js@^9.1.8":
version "9.12.2"
resolved "https://registry.yarnpkg.com/@types/highlight.js/-/highlight.js-9.12.2.tgz#6ee7cd395effe5ec80b515d3ff1699068cd0cd1d"
@@ -141,10 +994,18 @@
version "4.6.2"
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0"
-"@types/istanbul@^0.4.29":
+"@types/is-mobile@0.3.0":
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/@types/is-mobile/-/is-mobile-0.3.0.tgz#821825eeddb9016c41dd11c0dd6d2db8621432fc"
+
+"@types/istanbul@^0.4.30":
version "0.4.30"
resolved "https://registry.yarnpkg.com/@types/istanbul/-/istanbul-0.4.30.tgz#073159320ab3296b2cfeb481f756a1f8f4c9c8e4"
+"@types/js-combinatorics@^0.5.29":
+ version "0.5.29"
+ resolved "https://registry.yarnpkg.com/@types/js-combinatorics/-/js-combinatorics-0.5.29.tgz#47a7819a0b6925b6dc4bd2c2278a7e6329b29387"
+
"@types/jsonschema@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@types/jsonschema/-/jsonschema-1.1.1.tgz#08703dfe074010e8e829123111594af731f57b1a"
@@ -164,8 +1025,8 @@
"@types/lodash" "*"
"@types/lodash@*", "@types/lodash@^4.14.37":
- version "4.14.106"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.106.tgz#6093e9a02aa567ddecfe9afadca89e53e5dce4dd"
+ version "4.14.107"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.107.tgz#b2d2ae3958bfb8ff828495cbe12214af9e4d035e"
"@types/lodash@4.14.104":
version "4.14.104"
@@ -175,6 +1036,10 @@
version "4.14.99"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.99.tgz#e6e10c0a4cc16c7409b3181f1e66880d2fb7d4dc"
+"@types/loglevel@^1.5.3":
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/@types/loglevel/-/loglevel-1.5.3.tgz#adfce55383edc5998a2170ad581b3e23d6adb5b8"
+
"@types/marked@0.0.28":
version "0.0.28"
resolved "https://registry.yarnpkg.com/@types/marked/-/marked-0.0.28.tgz#44ba754e9fa51432583e8eb30a7c4dd249b52faa"
@@ -202,7 +1067,7 @@
version "2.0.29"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-2.0.29.tgz#5002e14f75e2d71e564281df0431c8c1b4a2a36a"
-"@types/mkdirp@^0.5.1":
+"@types/mkdirp@^0.5.1", "@types/mkdirp@^0.5.2":
version "0.5.2"
resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f"
dependencies:
@@ -212,21 +1077,43 @@
version "2.2.48"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.48.tgz#3523b126a0b049482e1c3c11877460f76622ffab"
+"@types/mocha@^5.2.2":
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.3.tgz#11f3a5629d67cd444fa6c94536576244e6a52ea9"
+
"@types/nock@^9.1.2":
- version "9.1.2"
- resolved "https://registry.yarnpkg.com/@types/nock/-/nock-9.1.2.tgz#0515b27e3f6bbc11834d22508ad02e2921dd376a"
+ version "9.1.3"
+ resolved "https://registry.yarnpkg.com/@types/nock/-/nock-9.1.3.tgz#1d445679375b9e25afd449dc56585f81729454e8"
dependencies:
"@types/node" "*"
"@types/node@*":
+ version "9.6.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.5.tgz#ee700810fdf49ac1c399fc5980b7559b3e5a381d"
+
+"@types/node@9.6.0":
version "9.6.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7"
+"@types/node@^10.5.3":
+ version "10.5.7"
+ resolved "https://registry.npmjs.org/@types/node/-/node-10.5.7.tgz#960d9feb3ade2233bcc9843c918d740b4f78a7cf"
+
"@types/node@^8.0.53":
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.0.tgz#f5d649cc49af8ed6507d15dc6e9b43fe8b927540"
+ version "8.10.8"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.8.tgz#794cba23cc9f8d9715f6543fa8827433b5f5cd3b"
+
+"@types/numeral@^0.0.22":
+ version "0.0.22"
+ resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.22.tgz#86bef1f0a2d743afdc2ef3168d45f2905e1a0b93"
+
+"@types/opn@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@types/opn/-/opn-5.1.0.tgz#bff7bc371677f4bdbb37884400e03fd81f743927"
+ dependencies:
+ "@types/node" "*"
-"@types/query-string@^5.0.1":
+"@types/query-string@^5.0.1", "@types/query-string@^5.1.0":
version "5.1.0"
resolved "https://registry.yarnpkg.com/@types/query-string/-/query-string-5.1.0.tgz#7f40cdea49ddafa0ea4f3db35fb6c24d3bfd4dcc"
@@ -242,13 +1129,33 @@
dependencies:
"@types/react" "*"
-"@types/react-dom@^16.0.3":
+"@types/react-dom@*":
+ version "16.0.6"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.6.tgz#f1a65a4e7be8ed5d123f8b3b9eacc913e35a1a3c"
+ dependencies:
+ "@types/node" "*"
+ "@types/react" "*"
+
+"@types/react-dom@16.0.4":
version "16.0.4"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.4.tgz#2e8fd45f5443780ed49bf2cdd9809e6091177a7d"
dependencies:
"@types/node" "*"
"@types/react" "*"
+"@types/react-dom@^16.0.3":
+ version "16.0.5"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.5.tgz#a757457662e3819409229e8f86795ff37b371f96"
+ dependencies:
+ "@types/node" "*"
+ "@types/react" "*"
+
+"@types/react-helmet@^5.0.6":
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/@types/react-helmet/-/react-helmet-5.0.6.tgz#49607cbb72e1bb7dcefa9174cb591434d3b6f0af"
+ dependencies:
+ "@types/react" "*"
+
"@types/react-redux@^4.4.37":
version "4.4.47"
resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-4.4.47.tgz#12af1677116e08d413fe2620d0a85560c8a0536e"
@@ -257,8 +1164,8 @@
redux "^3.6.0"
"@types/react-router-dom@^4.0.4":
- version "4.2.5"
- resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.5.tgz#a6fc921f1008567eae35244e30f34f5f7655d5f0"
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.6.tgz#9f7eb3c0e6661a9607d878ff8675cc4ea95cd276"
dependencies:
"@types/history" "*"
"@types/react" "*"
@@ -281,9 +1188,11 @@
version "0.0.30"
resolved "https://registry.yarnpkg.com/@types/react-tap-event-plugin/-/react-tap-event-plugin-0.0.30.tgz#123f35080412f489b6770c5a65c159ff96654cb5"
-"@types/react@*", "@types/react@^16.0.34":
- version "16.0.41"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.41.tgz#72146737f4d439dc95a53315de4bfb43ac8542ca"
+"@types/react@*", "@types/react@16.3.13":
+ version "16.3.13"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-16.3.13.tgz#47d466462b774556c1174ea0eda22c0578643362"
+ dependencies:
+ csstype "^2.2.0"
"@types/redux@^3.6.0":
version "3.6.0"
@@ -291,21 +1200,6 @@
dependencies:
redux "*"
-"@types/request-promise-native@^1.0.2":
- version "1.0.14"
- resolved "https://registry.yarnpkg.com/@types/request-promise-native/-/request-promise-native-1.0.14.tgz#20f2ba136e6f29c2ea745c60767738d434793d31"
- dependencies:
- "@types/request" "*"
-
-"@types/request@*":
- version "2.47.0"
- resolved "https://registry.yarnpkg.com/@types/request/-/request-2.47.0.tgz#76a666cee4cb85dcffea6cd4645227926d9e114e"
- dependencies:
- "@types/caseless" "*"
- "@types/form-data" "*"
- "@types/node" "*"
- "@types/tough-cookie" "*"
-
"@types/require-from-string@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/require-from-string/-/require-from-string-1.2.0.tgz#c18cfc8a2c1a0259e5841d1fef2b5e9d01c64242"
@@ -317,7 +1211,7 @@
"@types/glob" "*"
"@types/node" "*"
-"@types/semver@^5.5.0":
+"@types/semver@5.5.0", "@types/semver@^5.5.0":
version "5.5.0"
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45"
@@ -346,9 +1240,17 @@
version "2.3.7"
resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.7.tgz#e92c2fed3297eae078d78d1da032b26788b4af86"
-"@types/tough-cookie@*":
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-2.3.2.tgz#e0d481d8bb282ad8a8c9e100ceb72c995fb5e709"
+"@types/sleep@^0.0.7":
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/@types/sleep/-/sleep-0.0.7.tgz#0572b5d06978b4305671c614b0f68b4640ce7d43"
+
+"@types/solidity-parser-antlr@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.1.tgz#29ff386773a72a06c8a9c40c666d2a1cea53c2ed"
+
+"@types/tmp@^0.0.33":
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.0.33.tgz#1073c4bc824754ae3d10cfab88ab0237ba964e4d"
"@types/uuid@^3.4.2":
version "3.4.3"
@@ -360,13 +1262,14 @@
version "1.0.2"
resolved "https://registry.yarnpkg.com/@types/valid-url/-/valid-url-1.0.2.tgz#60fa435ce24bfd5ba107b8d2a80796aeaf3a8f45"
-"@types/websocket@^0.0.34":
- version "0.0.34"
- resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.34.tgz#25596764cec885eda070fdb6d19cd76fe582747c"
+"@types/websocket@^0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-0.0.39.tgz#aa971e24f9c1455fe2a57ee3e69c7d395016b12a"
dependencies:
+ "@types/events" "*"
"@types/node" "*"
-"@types/yargs@^10.0.0":
+"@types/yargs@10.0.2", "@types/yargs@^10.0.0":
version "10.0.2"
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-10.0.2.tgz#cc4ea921877874d1261e2c44b89807bc836e1b12"
@@ -375,8 +1278,8 @@
resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-11.0.0.tgz#124b9ed9c65b7091cc36da59ae12cbd47d8745ea"
JSONStream@^1.0.4:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea"
+ version "1.3.3"
+ resolved "http://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.3.tgz#27b4b8fbbfeab4e71bcf551e7f27be8d952239bf"
dependencies:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
@@ -389,6 +1292,10 @@ abbrev@1.0.x:
version "1.0.9"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+abortcontroller-polyfill@^1.1.9:
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.1.9.tgz#9fefe359fda2e9e0932dc85e6106453ac393b2da"
+
abstract-leveldown@0.12.3:
version "0.12.3"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.3.tgz#116b1ec5c7710ef7a2d5706768bbdb4440be1070"
@@ -436,6 +1343,16 @@ acorn-dynamic-import@^2.0.0:
dependencies:
acorn "^4.0.3"
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ dependencies:
+ acorn "^3.0.4"
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
acorn@^4.0.3:
version "4.0.13"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
@@ -444,14 +1361,22 @@ acorn@^5.0.0:
version "5.5.3"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9"
-add-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
+acorn@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
aes-js@^0.2.3:
version "0.2.4"
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-0.2.4.tgz#94b881ab717286d015fa219e08fb66709dda5a3d"
+ajv-keywords@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
ajv-keywords@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be"
@@ -463,7 +1388,7 @@ ajv@^4.9.1:
co "^4.6.0"
json-stable-stringify "^1.0.1"
-ajv@^5.1.0:
+ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
version "5.5.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
dependencies:
@@ -551,6 +1476,10 @@ ansi-wrap@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+antlr4@4.7.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.0.tgz#297f956ddc06f83397fc0990ecf2e0cf20bfbbee"
+
any-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
@@ -559,6 +1488,13 @@ any-promise@1.3.0, any-promise@^1.0.0, any-promise@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+anymatch@^1.1.0, anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -566,6 +1502,12 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
+append-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1"
+ dependencies:
+ buffer-equal "^1.0.0"
+
append-transform@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
@@ -641,7 +1583,7 @@ array-flatten@^2.1.0:
array-ify@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+ resolved "http://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
array-includes@^3.0.3:
version "3.0.3"
@@ -684,7 +1626,7 @@ arrify@^1.0.0, arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-asap@~2.0.3:
+asap@^2.0.0, asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@@ -766,10 +1708,14 @@ async@2.6.0, async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.
dependencies:
lodash "^4.14.0"
-async@^0.9.0:
+async@^0.9.0, async@~0.9.0:
version "0.9.2"
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+async@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+
async@~1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/async/-/async-1.2.1.tgz#a4816a17cd5ff516dfa2c7698a453369b9790de0"
@@ -779,8 +1725,8 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
atob@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d"
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc"
autoprefixer@^6.3.1:
version "6.7.7"
@@ -805,6 +1751,20 @@ awesome-typescript-loader@^3.1.3:
mkdirp "^0.5.1"
source-map-support "^0.5.3"
+aws-sdk@^2.127.0:
+ version "2.290.0"
+ resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.290.0.tgz#e0e4777a62ad29df3b86521a103b3f02189a30f5"
+ dependencies:
+ buffer "4.9.1"
+ events "1.1.1"
+ ieee754 "1.1.8"
+ jmespath "0.15.0"
+ querystring "0.2.0"
+ sax "1.2.1"
+ url "0.10.3"
+ uuid "3.1.0"
+ xml2js "0.4.19"
+
aws-sign2@~0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
@@ -813,11 +1773,15 @@ aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
-aws4@1.6.0, aws4@^1.2.1, aws4@^1.6.0:
+aws4@1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
-babel-code-frame@^6.22.0, babel-code-frame@^6.26.0, babel-code-frame@^6.8.0:
+aws4@^1.2.1, aws4@^1.6.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
dependencies:
@@ -849,33 +1813,7 @@ babel-core@^6.0.14, babel-core@^6.26.0:
slash "^1.0.0"
source-map "^0.5.6"
-babel-core@~6.13.2:
- version "6.13.2"
- resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.13.2.tgz#f761e1199361d5a6ed16f93ce801ad50acadb338"
- dependencies:
- babel-code-frame "^6.8.0"
- babel-generator "^6.11.4"
- babel-helpers "^6.8.0"
- babel-messages "^6.8.0"
- babel-register "^6.9.0"
- babel-runtime "^6.9.1"
- babel-template "^6.9.0"
- babel-traverse "^6.13.0"
- babel-types "^6.13.0"
- babylon "^6.7.0"
- convert-source-map "^1.1.0"
- debug "^2.1.1"
- json5 "^0.4.0"
- lodash "^4.2.0"
- minimatch "^3.0.2"
- path-exists "^1.0.0"
- path-is-absolute "^1.0.0"
- private "^0.1.6"
- shebang-regex "^1.0.0"
- slash "^1.0.0"
- source-map "^0.5.0"
-
-babel-generator@^6.11.4, babel-generator@^6.18.0, babel-generator@^6.26.0:
+babel-generator@^6.18.0, babel-generator@^6.26.0:
version "6.26.1"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
dependencies:
@@ -904,14 +1842,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
-babel-helper-builder-react-jsx@^6.24.1:
- version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
- dependencies:
- babel-runtime "^6.26.0"
- babel-types "^6.26.0"
- esutils "^2.0.2"
-
babel-helper-call-delegate@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
@@ -1007,20 +1937,20 @@ babel-helper-replace-supers@^6.24.1:
babel-traverse "^6.24.1"
babel-types "^6.24.1"
-babel-helpers@^6.24.1, babel-helpers@^6.8.0:
+babel-helpers@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
dependencies:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-messages@^6.23.0, babel-messages@^6.8.0:
+babel-messages@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13:
+babel-plugin-check-es2015-constants@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
dependencies:
@@ -1058,18 +1988,10 @@ babel-plugin-syntax-export-extensions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
-babel-plugin-syntax-flow@^6.18.0, babel-plugin-syntax-flow@^6.3.13:
+babel-plugin-syntax-flow@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
-babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
- version "6.18.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
-
-babel-plugin-syntax-jsx@~6.13.0:
- version "6.13.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.13.0.tgz#e741ff3992c578310be45c571bcd90a2f9c5586e"
-
babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
@@ -1121,19 +2043,19 @@ babel-plugin-transform-decorators@^6.24.1:
babel-template "^6.24.1"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13:
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13:
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.9.0:
+babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
dependencies:
@@ -1143,7 +2065,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es20
babel-types "^6.26.0"
lodash "^4.17.4"
-babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
dependencies:
@@ -1157,33 +2079,33 @@ babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-cla
babel-traverse "^6.24.1"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13:
+babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
dependencies:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0, babel-plugin-transform-es2015-destructuring@^6.9.0:
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
dependencies:
@@ -1191,13 +2113,13 @@ babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es20
babel-runtime "^6.22.0"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13:
+babel-plugin-transform-es2015-literals@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1, babel-plugin-transform-es2015-modules-amd@^6.8.0:
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
dependencies:
@@ -1205,7 +2127,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
dependencies:
@@ -1214,7 +2136,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e
babel-template "^6.26.0"
babel-types "^6.26.0"
-babel-plugin-transform-es2015-modules-systemjs@^6.12.0, babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
dependencies:
@@ -1222,7 +2144,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.12.0, babel-plugin-transform-e
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-plugin-transform-es2015-modules-umd@^6.12.0, babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1:
+babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
dependencies:
@@ -1230,14 +2152,14 @@ babel-plugin-transform-es2015-modules-umd@^6.12.0, babel-plugin-transform-es2015
babel-runtime "^6.22.0"
babel-template "^6.24.1"
-babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13:
+babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
dependencies:
babel-helper-replace-supers "^6.24.1"
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0:
+babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
dependencies:
@@ -1248,20 +2170,20 @@ babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-
babel-traverse "^6.24.1"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13:
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
dependencies:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13:
+babel-plugin-transform-es2015-spread@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13:
+babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
dependencies:
@@ -1269,19 +2191,19 @@ babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es201
babel-runtime "^6.22.0"
babel-types "^6.24.1"
-babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+babel-plugin-transform-es2015-template-literals@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
dependencies:
babel-runtime "^6.22.0"
-babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13:
+babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
dependencies:
@@ -1304,7 +2226,7 @@ babel-plugin-transform-export-extensions@^6.22.0:
babel-plugin-syntax-export-extensions "^6.8.0"
babel-runtime "^6.22.0"
-babel-plugin-transform-flow-strip-types@^6.3.13, babel-plugin-transform-flow-strip-types@^6.8.0:
+babel-plugin-transform-flow-strip-types@^6.8.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
dependencies:
@@ -1318,35 +2240,7 @@ babel-plugin-transform-object-rest-spread@^6.22.0:
babel-plugin-syntax-object-rest-spread "^6.8.0"
babel-runtime "^6.26.0"
-babel-plugin-transform-react-display-name@^6.3.13:
- version "6.25.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
- dependencies:
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-react-jsx-self@^6.11.0:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
- dependencies:
- babel-plugin-syntax-jsx "^6.8.0"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-react-jsx-source@^6.3.13:
- version "6.22.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
- dependencies:
- babel-plugin-syntax-jsx "^6.8.0"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-react-jsx@^6.3.13:
- version "6.24.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
- dependencies:
- babel-helper-builder-react-jsx "^6.24.1"
- babel-plugin-syntax-jsx "^6.8.0"
- babel-runtime "^6.22.0"
-
-babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.9.0:
+babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
dependencies:
@@ -1394,12 +2288,6 @@ babel-preset-env@^1.3.2:
invariant "^2.2.2"
semver "^5.3.0"
-babel-preset-es2015-loose@~7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/babel-preset-es2015-loose/-/babel-preset-es2015-loose-7.0.0.tgz#fd80c85d3b20cbf309bd0ce30a36380c5784bf06"
- dependencies:
- modify-babel-preset "^1.0.0"
-
babel-preset-es2015@^6.9.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
@@ -1429,47 +2317,6 @@ babel-preset-es2015@^6.9.0:
babel-plugin-transform-es2015-unicode-regex "^6.24.1"
babel-plugin-transform-regenerator "^6.24.1"
-babel-preset-es2015@~6.13.2:
- version "6.13.2"
- resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.13.2.tgz#006c469a7528bd066f2917c8b4955309dcd53cfb"
- dependencies:
- babel-plugin-check-es2015-constants "^6.3.13"
- babel-plugin-transform-es2015-arrow-functions "^6.3.13"
- babel-plugin-transform-es2015-block-scoped-functions "^6.3.13"
- babel-plugin-transform-es2015-block-scoping "^6.9.0"
- babel-plugin-transform-es2015-classes "^6.9.0"
- babel-plugin-transform-es2015-computed-properties "^6.3.13"
- babel-plugin-transform-es2015-destructuring "^6.9.0"
- babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
- babel-plugin-transform-es2015-for-of "^6.6.0"
- babel-plugin-transform-es2015-function-name "^6.9.0"
- babel-plugin-transform-es2015-literals "^6.3.13"
- babel-plugin-transform-es2015-modules-amd "^6.8.0"
- babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
- babel-plugin-transform-es2015-modules-systemjs "^6.12.0"
- babel-plugin-transform-es2015-modules-umd "^6.12.0"
- babel-plugin-transform-es2015-object-super "^6.3.13"
- babel-plugin-transform-es2015-parameters "^6.9.0"
- babel-plugin-transform-es2015-shorthand-properties "^6.3.13"
- babel-plugin-transform-es2015-spread "^6.3.13"
- babel-plugin-transform-es2015-sticky-regex "^6.3.13"
- babel-plugin-transform-es2015-template-literals "^6.6.0"
- babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
- babel-plugin-transform-es2015-unicode-regex "^6.3.13"
- babel-plugin-transform-regenerator "^6.9.0"
-
-babel-preset-react@~6.11.0:
- version "6.11.1"
- resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.11.1.tgz#98ac2bd3c1b76f3062ae082580eade154a19b590"
- dependencies:
- babel-plugin-syntax-flow "^6.3.13"
- babel-plugin-syntax-jsx "^6.3.13"
- babel-plugin-transform-flow-strip-types "^6.3.13"
- babel-plugin-transform-react-display-name "^6.3.13"
- babel-plugin-transform-react-jsx "^6.3.13"
- babel-plugin-transform-react-jsx-self "^6.11.0"
- babel-plugin-transform-react-jsx-source "^6.3.13"
-
babel-preset-stage-1@^6.5.0:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
@@ -1509,14 +2356,14 @@ babel-register@^6.26.0, babel-register@^6.9.0:
mkdirp "^0.5.1"
source-map-support "^0.4.15"
-babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.1:
+babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
dependencies:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
-babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.9.0:
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
dependencies:
@@ -1526,7 +2373,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0, babel-te
babylon "^6.18.0"
lodash "^4.17.4"
-babel-traverse@^6.13.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0, babel-traverse@^6.7.3:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
dependencies:
@@ -1540,7 +2387,7 @@ babel-traverse@^6.13.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-tr
invariant "^2.2.2"
lodash "^4.17.4"
-babel-types@^6.13.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
dependencies:
@@ -1556,17 +2403,23 @@ babelify@^7.3.0:
babel-core "^6.0.14"
object-assign "^4.0.0"
-babylon@^6.17.3, babylon@^6.18.0, babylon@^6.7.0:
+babylon@^6.1.21, babylon@^6.17.3, babylon@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
babylon@^7.0.0-beta.30:
- version "7.0.0-beta.42"
- resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.42.tgz#67cfabcd4f3ec82999d29031ccdea89d0ba99657"
+ version "7.0.0-beta.46"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.46.tgz#b6ddaba81bbb130313932757ff9c195d527088b6"
+
+backoff@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f"
+ dependencies:
+ precond "0.2"
bail@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764"
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.3.tgz#63cfb9ddbac829b02a3128cd53224be78e6c21a3"
balanced-match@^0.4.2:
version "0.4.2"
@@ -1580,13 +2433,19 @@ base-x@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac"
+base-x@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.4.tgz#94c1788736da065edb1d68808869e357c977fa77"
+ dependencies:
+ safe-buffer "^5.0.1"
+
base64-js@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978"
base64-js@^1.0.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801"
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
base@^0.11.1:
version "0.11.2"
@@ -1644,7 +2503,7 @@ basscss-typography@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/basscss-typography/-/basscss-typography-3.0.4.tgz#ec946a2bad8dd1af97be9ea108ad4bb7be932464"
-basscss@^8.0.3:
+basscss@8.0.4, basscss@^8.0.3:
version "8.0.4"
resolved "https://registry.yarnpkg.com/basscss/-/basscss-8.0.4.tgz#b371a2ce25aeb9b322302f37f4e425753dd29ae1"
dependencies:
@@ -1678,10 +2537,6 @@ big.js@^3.1.3:
version "3.2.0"
resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
-"bignumber.js@git+https://github.com/debris/bignumber.js#master":
- version "2.0.7"
- resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9"
-
"bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2":
version "2.0.7"
resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2"
@@ -1706,11 +2561,11 @@ bindings@^1.2.1, bindings@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
-bintrees@^1.0.2:
+bintrees@1.0.2, bintrees@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8"
-bip39@^2.2.0:
+bip39@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235"
dependencies:
@@ -1736,6 +2591,24 @@ bip66@^1.1.3:
dependencies:
safe-buffer "^5.0.1"
+bitcore-lib@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/bitcore-lib/-/bitcore-lib-0.15.0.tgz#f924be13869f2aab7e04aeec5642ad3359b6cec2"
+ dependencies:
+ bn.js "=4.11.8"
+ bs58 "=4.0.1"
+ buffer-compare "=1.1.1"
+ elliptic "=6.4.0"
+ inherits "=2.0.1"
+ lodash "=4.17.4"
+
+bitcore-mnemonic@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bitcore-mnemonic/-/bitcore-mnemonic-1.5.0.tgz#c7e785beb6bf0616ed4992785dc3658670425a39"
+ dependencies:
+ bitcore-lib "^0.15.0"
+ unorm "^1.3.3"
+
bl@^1.0.0:
version "1.2.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
@@ -1765,7 +2638,7 @@ blockies@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/blockies/-/blockies-0.0.2.tgz#22ad58da4f6b382bc79bf4386c5820c70047e4ed"
-bluebird@^2.6.2, bluebird@^2.9.34:
+bluebird@^2.6.2, bluebird@^2.9.24, bluebird@^2.9.34:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
@@ -1781,10 +2654,14 @@ bn.js@4.11.7:
version "4.11.7"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.7.tgz#ddb048e50d9482790094c13eb3fcfc833ce7ab46"
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.11.7, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0:
+bn.js@=4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.3, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.4.0, bn.js@^4.8.0:
version "4.11.8"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+bn.js@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-2.2.0.tgz#12162bc2ae71fc40a5626c33438f3a875cd37625"
+
body-parser@1.18.2, body-parser@^1.16.0, body-parser@^1.17.1:
version "1.18.2"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
@@ -1829,7 +2706,7 @@ boom@5.x.x:
dependencies:
hoek "4.x.x"
-bowser@^1.7.3:
+bowser@^1.7.3, bowser@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.9.3.tgz#6643ae4d783f31683f6d23156976b74183862162"
@@ -1861,16 +2738,14 @@ braces@^1.8.2:
repeat-element "^1.1.2"
braces@^2.3.0, braces@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb"
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
dependencies:
arr-flatten "^1.1.0"
array-unique "^0.3.2"
- define-property "^1.0.0"
extend-shallow "^2.0.1"
fill-range "^4.0.0"
isobject "^3.0.1"
- kind-of "^6.0.2"
repeat-element "^1.1.2"
snapdragon "^0.8.1"
snapdragon-node "^2.0.1"
@@ -1885,9 +2760,13 @@ browser-stdout@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+
browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
dependencies:
buffer-xor "^1.0.3"
cipher-base "^1.0.0"
@@ -1897,16 +2776,16 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
safe-buffer "^5.0.1"
browserify-cipher@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
dependencies:
browserify-aes "^1.0.4"
browserify-des "^1.0.0"
evp_bytestokey "^1.0.0"
browserify-des@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c"
dependencies:
cipher-base "^1.0.1"
des.js "^1.0.0"
@@ -1957,6 +2836,12 @@ browserslist@^2.1.2:
caniuse-lite "^1.0.30000792"
electron-to-chromium "^1.3.30"
+bs58@=4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ dependencies:
+ base-x "^3.0.2"
+
bs58@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/bs58/-/bs58-2.0.1.tgz#55908d58f1982aba2008fa1bed8f91998a29bf8d"
@@ -1978,10 +2863,18 @@ btoa@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0"
+buffer-compare@=1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-compare/-/buffer-compare-1.1.1.tgz#5be7be853af89198d1f4ddc090d1d66a48aef596"
+
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+buffer-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
+
buffer-from@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0"
@@ -1990,6 +2883,10 @@ buffer-from@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531"
+buffer-from@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
buffer-indexof@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
@@ -2002,23 +2899,23 @@ buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
-buffer@^3.0.1:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
+buffer@4.9.1, buffer@^4.3.0, buffer@^4.9.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
dependencies:
- base64-js "0.0.8"
+ base64-js "^1.0.2"
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^4.3.0:
- version "4.9.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+buffer@^3.0.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb"
dependencies:
- base64-js "^1.0.2"
+ base64-js "0.0.8"
ieee754 "^1.1.4"
isarray "^1.0.0"
-buffer@^5.0.5, buffer@^5.0.6:
+buffer@^5.0.3, buffer@^5.0.5:
version "5.1.0"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.1.0.tgz#c913e43678c7cb7c8bd16afbcddb6c5505e8f9fe"
dependencies:
@@ -2033,9 +2930,13 @@ builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+builtins@^1.0.3:
+ version "1.0.3"
+ resolved "http://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
+
byline@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
+ resolved "http://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
bytes@3.0.0:
version "3.0.0"
@@ -2113,6 +3014,20 @@ caching-transform@^1.0.0:
mkdirp "^0.5.1"
write-file-atomic "^1.1.4"
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ dependencies:
+ callsites "^0.2.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
camelcase-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
@@ -2122,7 +3037,7 @@ camelcase-keys@^2.0.0:
camelcase-keys@^4.0.0:
version "4.2.0"
- resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
+ resolved "http://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77"
dependencies:
camelcase "^4.1.0"
map-obj "^2.0.0"
@@ -2132,7 +3047,7 @@ camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
-camelcase@^2.0.0:
+camelcase@^2.0.0, camelcase@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
@@ -2154,12 +3069,12 @@ caniuse-api@^1.5.2:
lodash.uniq "^4.5.0"
caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
- version "1.0.30000820"
- resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000820.tgz#7c20e25cea1768b261b724f82e3a6a253aaa1468"
+ version "1.0.30000830"
+ resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000830.tgz#6e45255b345649fd15ff59072da1e12bb3de2f13"
caniuse-lite@^1.0.30000792:
- version "1.0.30000820"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000820.tgz#6e36ee75187a2c83d26d6504a1af47cc580324d2"
+ version "1.0.30000830"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz#cb96b8a2dd3cbfe04acea2af3c4e894249095328"
capture-stack-trace@^1.0.0:
version "1.0.0"
@@ -2209,6 +3124,14 @@ chain-function@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
+chalk@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@@ -2220,8 +3143,16 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
supports-color "^2.0.0"
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65"
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
@@ -2240,16 +3171,16 @@ change-emitter@^0.1.2:
resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
character-entities-legacy@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f"
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz#7c6defb81648498222c9855309953d05f4d63a9c"
character-entities@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca"
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.2.tgz#58c8f371c0774ef0ba9b2aca5f00d8f100e6e363"
character-reference-invalid@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc"
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz#21e421ad3d84055952dab4a43a04e73cd425d3ed"
chardet@^0.4.0:
version "0.4.2"
@@ -2269,6 +3200,32 @@ checkpoint-store@^1.1.0:
dependencies:
functional-red-black-tree "^1.0.1"
+chokidar-cli@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-1.2.0.tgz#8e7f58442273182018be1868e53c22af65a21948"
+ dependencies:
+ anymatch "^1.1.0"
+ bluebird "^2.9.24"
+ chokidar "^1.0.1"
+ lodash "^3.7.0"
+ shell-quote "^1.4.3"
+ yargs "^3.7.2"
+
+chokidar@^1.0.1:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+ dependencies:
+ anymatch "^1.3.0"
+ async-each "^1.0.0"
+ glob-parent "^2.0.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^2.0.0"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ optionalDependencies:
+ fsevents "^1.0.0"
+
chokidar@^2.0.0, chokidar@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
@@ -2306,6 +3263,10 @@ circular-json@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
clap@^1.0.9:
version "1.2.3"
resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
@@ -2321,6 +3282,10 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
+classnames@^2.2.0, classnames@^2.2.3, classnames@^2.2.6:
+ version "2.2.6"
+ resolved "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+
classnames@^2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
@@ -2381,6 +3346,14 @@ cli-width@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+clipboard@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz#a12481e1c13d8a50f5f036b0560fe5d16d74e46a"
+ dependencies:
+ good-listener "^1.2.2"
+ select "^1.1.2"
+ tiny-emitter "^2.0.0"
+
cliui@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
@@ -2389,7 +3362,7 @@ cliui@^2.1.0:
right-align "^0.1.1"
wordwrap "0.0.2"
-cliui@^3.2.0:
+cliui@^3.0.3, cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
dependencies:
@@ -2445,7 +3418,7 @@ cloneable-readable@^1.0.0:
cmd-shim@^2.0.2:
version "2.0.2"
- resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb"
+ resolved "http://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb"
dependencies:
graceful-fs "^4.1.2"
mkdirp "~0.5.0"
@@ -2472,8 +3445,8 @@ coinstring@^2.0.0:
create-hash "^1.1.1"
collapse-white-space@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.3.tgz#4b906f670e5a963a87b76b0e1689643341b6023c"
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091"
collection-visit@^1.0.0:
version "1.0.0"
@@ -2518,7 +3491,7 @@ colormin@^1.0.5:
css-color-names "0.0.4"
has "^1.0.1"
-colors@1.0.3:
+colors@1.0.3, colors@1.0.x:
version "1.0.3"
resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
@@ -2532,7 +3505,7 @@ colors@^1.1.2:
columnify@^1.5.4:
version "1.5.4"
- resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
+ resolved "http://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
dependencies:
strip-ansi "^3.0.0"
wcwidth "^1.0.0"
@@ -2543,14 +3516,6 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
-command-join@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/command-join/-/command-join-2.0.0.tgz#52e8b984f4872d952ff1bdc8b98397d27c7144cf"
-
-commander@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
-
commander@2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
@@ -2559,24 +3524,18 @@ commander@2.12.2:
version "2.12.2"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
-commander@2.13.0:
+commander@2.13.0, commander@~2.13.0:
version "2.13.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
-commander@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
-
-commander@2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
- dependencies:
- graceful-readlink ">= 1.0.0"
-
-commander@^2.12.1, commander@^2.8.1, commander@^2.9.0:
+commander@2.15.1, commander@^2.12.1, commander@^2.8.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+commander@^2.7.1:
+ version "2.17.1"
+ resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+
commander@~2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
@@ -2589,7 +3548,7 @@ commondir@^1.0.1:
compare-func@^1.3.1:
version "1.3.2"
- resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
+ resolved "http://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648"
dependencies:
array-ify "^1.0.0"
dot-prop "^3.0.0"
@@ -2598,41 +3557,10 @@ compare-versions@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5"
-component-clone@0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/component-clone/-/component-clone-0.2.2.tgz#c7f5979822880fad8cfb0962ba29186d061ee04f"
- dependencies:
- component-type "*"
-
-component-emitter@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.0.tgz#ccd113a86388d06482d03de3fc7df98526ba8efe"
-
component-emitter@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
-component-raf@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/component-raf/-/component-raf-1.2.0.tgz#b2bc72d43f1b014fde7a4b3c447c764bc73ccbaa"
-
-component-tween@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/component-tween/-/component-tween-1.2.0.tgz#cc39ce5dbab05b52825f41d1947638a0b01b2b8a"
- dependencies:
- component-clone "0.2.2"
- component-emitter "1.2.0"
- component-type "1.1.0"
- ease-component "1.0.0"
-
-component-type@*:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.1.tgz#8a47901700238e4fc32269771230226f24b415a9"
-
-component-type@1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.1.0.tgz#95b666aad53e5c8d1f2be135c45b5d499197c0c5"
-
compressible@~2.0.13:
version "2.0.13"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9"
@@ -2655,7 +3583,15 @@ concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
-concat-stream@^1.4.10, concat-stream@^1.5.0:
+concat-stream@^1.5.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26"
+ dependencies:
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+concat-stream@^1.5.1, concat-stream@^1.6.0:
version "1.6.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
dependencies:
@@ -2664,6 +3600,13 @@ concat-stream@^1.4.10, concat-stream@^1.5.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
+config-chain@^1.1.11:
+ version "1.1.11"
+ resolved "http://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
configstore@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
@@ -2689,10 +3632,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
-consolidated-events@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/consolidated-events/-/consolidated-events-1.1.1.tgz#25395465b35e531395418b7bbecb5ecaf198d179"
-
constants-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
@@ -2707,38 +3646,16 @@ content-type@~1.0.4:
conventional-changelog-angular@^1.6.6:
version "1.6.6"
- resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f"
+ resolved "http://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f"
dependencies:
compare-func "^1.3.1"
q "^1.5.1"
-conventional-changelog-atom@^0.2.7:
- version "0.2.7"
- resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.2.7.tgz#1cb4e9d79576734d187fa10662212652644686fd"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-cli@^1.3.13:
- version "1.3.20"
- resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.20.tgz#f2b5ad8f73334879b645721c11292032c0b93a88"
+conventional-changelog-core@^2.0.5:
+ version "2.0.11"
+ resolved "http://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz#19b5fbd55a9697773ed6661f4e32030ed7e30287"
dependencies:
- add-stream "^1.0.0"
- conventional-changelog "^1.1.22"
- lodash "^4.2.1"
- meow "^4.0.0"
- tempfile "^1.1.1"
-
-conventional-changelog-codemirror@^0.3.7:
- version "0.3.7"
- resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.7.tgz#1e911361ebe6f96b1966a623c2bf52065114eda5"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-core@^2.0.9:
- version "2.0.9"
- resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-2.0.9.tgz#74fd7ccfce349267a878bf2ff470c315fc6db38e"
- dependencies:
- conventional-changelog-writer "^3.0.8"
+ conventional-changelog-writer "^3.0.9"
conventional-commits-parser "^2.1.7"
dateformat "^3.0.0"
get-pkg-repo "^1.0.0"
@@ -2752,50 +3669,13 @@ conventional-changelog-core@^2.0.9:
read-pkg-up "^1.0.1"
through2 "^2.0.0"
-conventional-changelog-ember@^0.3.10:
- version "0.3.10"
- resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.3.10.tgz#aa42b1f6d73df14a7bc9c20f2726884934e03164"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-eslint@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.8.tgz#3046276acafcd6c9403605439f16164b46bb21b6"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-express@^0.3.6:
- version "0.3.6"
- resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz#4a6295cb11785059fb09202180d0e59c358b9c2c"
- dependencies:
- q "^1.5.1"
-
-conventional-changelog-jquery@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510"
- dependencies:
- q "^1.4.1"
-
-conventional-changelog-jscs@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c"
- dependencies:
- q "^1.4.1"
-
-conventional-changelog-jshint@^0.3.7:
- version "0.3.7"
- resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.7.tgz#f59d591042dec607a65816686191700611f684bd"
- dependencies:
- compare-func "^1.3.1"
- q "^1.5.1"
-
conventional-changelog-preset-loader@^1.1.8:
version "1.1.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373"
+ resolved "http://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz#40bb0f142cd27d16839ec6c74ee8db418099b373"
-conventional-changelog-writer@^3.0.8:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.8.tgz#e772ab261960f0bc849893ee843c0949d8e942dc"
+conventional-changelog-writer@^3.0.9:
+ version "3.0.9"
+ resolved "http://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz#4aecdfef33ff2a53bb0cf3b8071ce21f0e994634"
dependencies:
compare-func "^1.3.1"
conventional-commits-filter "^1.1.6"
@@ -2808,32 +3688,16 @@ conventional-changelog-writer@^3.0.8:
split "^1.0.0"
through2 "^2.0.0"
-conventional-changelog@^1.1.22:
- version "1.1.22"
- resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.22.tgz#3aa0395525ac5903e48b6ed0ecf41957bc10819c"
- dependencies:
- conventional-changelog-angular "^1.6.6"
- conventional-changelog-atom "^0.2.7"
- conventional-changelog-codemirror "^0.3.7"
- conventional-changelog-core "^2.0.9"
- conventional-changelog-ember "^0.3.10"
- conventional-changelog-eslint "^1.0.8"
- conventional-changelog-express "^0.3.6"
- conventional-changelog-jquery "^0.1.0"
- conventional-changelog-jscs "^0.1.0"
- conventional-changelog-jshint "^0.3.7"
- conventional-changelog-preset-loader "^1.1.8"
-
-conventional-commits-filter@^1.1.1, conventional-commits-filter@^1.1.6:
+conventional-commits-filter@^1.1.6:
version "1.1.6"
- resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831"
+ resolved "http://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz#4389cd8e58fe89750c0b5fb58f1d7f0cc8ad3831"
dependencies:
is-subset "^0.1.1"
modify-values "^1.0.0"
-conventional-commits-parser@^2.1.1, conventional-commits-parser@^2.1.7:
+conventional-commits-parser@^2.1.7:
version "2.1.7"
- resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e"
+ resolved "http://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz#eca45ed6140d72ba9722ee4132674d639e644e8e"
dependencies:
JSONStream "^1.0.4"
is-text-path "^1.0.0"
@@ -2843,19 +3707,20 @@ conventional-commits-parser@^2.1.1, conventional-commits-parser@^2.1.7:
through2 "^2.0.0"
trim-off-newlines "^1.0.0"
-conventional-recommended-bump@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz#1b7137efb5091f99fe009e2fe9ddb7cc490e9375"
+conventional-recommended-bump@^2.0.6:
+ version "2.0.9"
+ resolved "http://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz#7392421e7d0e3515f3df2040572a23cc73a68a93"
dependencies:
- concat-stream "^1.4.10"
- conventional-commits-filter "^1.1.1"
- conventional-commits-parser "^2.1.1"
- git-raw-commits "^1.3.0"
- git-semver-tags "^1.3.0"
- meow "^3.3.0"
- object-assign "^4.0.1"
+ concat-stream "^1.6.0"
+ conventional-changelog-preset-loader "^1.1.8"
+ conventional-commits-filter "^1.1.6"
+ conventional-commits-parser "^2.1.7"
+ git-raw-commits "^1.3.6"
+ git-semver-tags "^1.3.6"
+ meow "^4.0.0"
+ q "^1.5.1"
-convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
+convert-source-map@^1.5.0, convert-source-map@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
@@ -2912,13 +3777,28 @@ copyfiles@^1.2.0:
noms "0.0.0"
through2 "^2.0.1"
+copyfiles@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.0.0.tgz#bbd78bb78e8fd6db5c67adf54249317b24560f2a"
+ dependencies:
+ glob "^7.0.5"
+ minimatch "^3.0.3"
+ mkdirp "^0.5.1"
+ noms "0.0.0"
+ through2 "^2.0.1"
+ yargs "^11.0.0"
+
core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
-core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0:
- version "2.5.3"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e"
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.5"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b"
+
+core-js@^2.4.1:
+ version "2.5.6"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.6.tgz#0fe6d45bf3cac3ac364a9d72de7576f4eb221b9d"
core-util-is@1.0.2, core-util-is@~1.0.0:
version "1.0.2"
@@ -2931,6 +3811,14 @@ cors@^2.8.1:
object-assign "^4"
vary "^1"
+cosmiconfig@^5.0.2:
+ version "5.0.5"
+ resolved "http://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+
coveralls@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99"
@@ -2942,8 +3830,8 @@ coveralls@^3.0.0:
request "^2.79.0"
create-ecdh@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.1.tgz#44223dfed533193ba5ba54e0df5709b89acf1f82"
dependencies:
bn.js "^4.1.0"
elliptic "^6.0.0"
@@ -2955,17 +3843,18 @@ create-error-class@^3.0.0:
capture-stack-trace "^1.0.0"
create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
dependencies:
cipher-base "^1.0.1"
inherits "^2.0.1"
- ripemd160 "^2.0.0"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
sha.js "^2.4.0"
create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
dependencies:
cipher-base "^1.0.3"
create-hash "^1.1.0"
@@ -2982,6 +3871,20 @@ create-react-class@^15.5.2, create-react-class@^15.6.0:
loose-envify "^1.3.1"
object-assign "^4.1.1"
+create-react-context@^0.2.1:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/create-react-context/-/create-react-context-0.2.2.tgz#9836542f9aaa22868cd7d4a6f82667df38019dca"
+ dependencies:
+ fbjs "^0.8.0"
+ gud "^1.0.0"
+
+cross-fetch@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.1.0.tgz#7d4ea7e10a4f3bb73d5c2f0a3791ec3752d39b50"
+ dependencies:
+ node-fetch "2.1.1"
+ whatwg-fetch "2.0.3"
+
cross-spawn@^4:
version "4.0.2"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
@@ -2997,7 +3900,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^6.0.5:
+cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
dependencies:
@@ -3039,7 +3942,7 @@ crypto-js@3.1.9-1, crypto-js@^3.1.9-1:
version "3.1.9-1"
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8"
-crypto-js@^3.1.4:
+crypto-js@^3.1.4, crypto-js@^3.1.5:
version "3.1.8"
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.8.tgz#715f070bf6014f2ae992a98b3929258b713f08d5"
@@ -3047,15 +3950,20 @@ crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+css-color-keywords@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
+
css-color-names@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
css-in-js-utils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz#5af1dd70f4b06b331f48d22a3d86e0786c0b9435"
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99"
dependencies:
hyphenate-style-name "^1.0.2"
+ isobject "^3.0.1"
css-loader@0.23.x:
version "0.23.1"
@@ -3107,6 +4015,14 @@ css-selector-tokenizer@^0.7.0:
fastparse "^1.1.1"
regexpu-core "^1.0.0"
+css-to-react-native@^2.0.3:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.2.0.tgz#d524ef7f39a2747a8914e86563669ba35b7cf2e7"
+ dependencies:
+ css-color-keywords "^1.0.0"
+ fbjs "^0.8.5"
+ postcss-value-parser "^3.3.0"
+
cssesc@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
@@ -3148,13 +4064,6 @@ cssesc@^0.1.0:
postcss-value-parser "^3.2.3"
postcss-zindex "^2.0.1"
-csso@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8"
- dependencies:
- clap "^1.0.9"
- source-map "^0.5.3"
-
csso@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
@@ -3162,6 +4071,10 @@ csso@~2.3.1:
clap "^1.0.9"
source-map "^0.5.3"
+csstype@^2.2.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.4.2.tgz#158e36c69566bf968da63d0ba14eda1c20e8643a"
+
csv-parse@1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-1.2.4.tgz#cbf676e355226625888c6432400b83f07e75cc2e"
@@ -3172,6 +4085,10 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
+cycle@1.0.x:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+
cyclist@~0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
@@ -3188,7 +4105,7 @@ d@1:
dargs@^4.0.1:
version "4.1.0"
- resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
+ resolved "http://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17"
dependencies:
number-is-nan "^1.0.0"
@@ -3214,7 +4131,7 @@ dateformat@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062"
-dateformat@^3.0.0, dateformat@^3.0.2:
+dateformat@^3.0.0, dateformat@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
@@ -3222,10 +4139,6 @@ dbug@~0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/dbug/-/dbug-0.4.2.tgz#32b4b3105e8861043a6f9ac755d80e542d365b31"
-death@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318"
-
debug-log@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f"
@@ -3236,13 +4149,7 @@ debug@2.2.0:
dependencies:
ms "0.7.1"
-debug@2.6.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b"
- dependencies:
- ms "0.7.2"
-
-debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8:
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
dependencies:
@@ -3254,6 +4161,10 @@ debug@3.1.0, debug@^3.1.0:
dependencies:
ms "2.0.0"
+debuglog@^1.0.1:
+ version "1.0.1"
+ resolved "http://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
decache@^3.0.5:
version "3.1.0"
resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da"
@@ -3262,7 +4173,7 @@ decache@^3.0.5:
decamelize-keys@^1.0.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+ resolved "http://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
dependencies:
decamelize "^1.1.0"
map-obj "^1.0.0"
@@ -3271,6 +4182,16 @@ decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+decamelize@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
+ dependencies:
+ xregexp "4.0.0"
+
+decko@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz#fd43c735e967b8013306884a56fbe665996b6817"
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -3331,7 +4252,7 @@ decompress@^4.0.0:
dedent@^0.7.0:
version "0.7.0"
- resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ resolved "http://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
deep-eql@^0.1.3:
version "0.1.3"
@@ -3349,7 +4270,19 @@ deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
-deep-extend@^0.4.0, deep-extend@~0.4.0:
+deep-equal@~0.2.1:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d"
+
+deep-extend@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+deep-extend@~0.4.0:
version "0.4.2"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
@@ -3411,6 +4344,18 @@ defined@^1.0.0, defined@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+del@^2.0.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
del@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
@@ -3426,10 +4371,30 @@ delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+delegate@^3.1.2:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
+
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+depcheck@^0.6.9:
+ version "0.6.9"
+ resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-0.6.9.tgz#efe6fdf5cf00c2172811bc2a2403d59e5341e519"
+ dependencies:
+ babel-traverse "^6.7.3"
+ babylon "^6.1.21"
+ builtin-modules "^1.1.1"
+ deprecate "^1.0.0"
+ deps-regex "^0.1.4"
+ js-yaml "^3.4.2"
+ lodash "^4.5.1"
+ minimatch "^3.0.2"
+ require-package-name "^2.0.1"
+ walkdir "0.0.11"
+ yargs "^8.0.2"
+
depd@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
@@ -3438,10 +4403,18 @@ depd@~1.1.1, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+deprecate@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-1.0.0.tgz#661490ed2428916a6c8883d8834e5646f4e4a4a8"
+
deprecated@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19"
+deps-regex@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184"
+
des.js@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
@@ -3469,43 +4442,34 @@ detect-indent@^4.0.0:
detect-indent@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+ resolved "http://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
detect-libc@^1.0.2, detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
-detect-node@^2.0.3:
+detect-node@2.0.3, detect-node@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127"
-dharma-loan-frame@^0.0.12:
- version "0.0.12"
- resolved "https://registry.yarnpkg.com/dharma-loan-frame/-/dharma-loan-frame-0.0.12.tgz#5765883feb92aec0481471f663f5dcb71e88b5e7"
+dezalgo@^1.0.0:
+ version "1.0.3"
+ resolved "http://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
dependencies:
- progress-checkmark "^0.0.1"
- react-svg-loader "^1.1.1"
- urlencode "^1.1.0"
-
-diff@1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
-
-diff@3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9"
+ asap "^2.0.0"
+ wrappy "1"
diff@3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
-diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0:
+diff@3.5.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
diffie-hellman@^5.0.0:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
dependencies:
bn.js "^4.1.0"
miller-rabin "^4.0.0"
@@ -3522,6 +4486,23 @@ dirty-chai@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/dirty-chai/-/dirty-chai-2.0.1.tgz#6b2162ef17f7943589da840abc96e75bda01aff3"
+discharge@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/discharge/-/discharge-0.7.1.tgz#9067f5b79b1123a565b5aa6f0cacc7305b7e22af"
+ dependencies:
+ aws-sdk "^2.127.0"
+ execa "^0.9.0"
+ glob "^7.1.2"
+ inquirer "^3.3.0"
+ listr "^0.12.0"
+ lodash.differenceby "^4.8.0"
+ lodash.intersectionby "^4.7.0"
+ lodash.intersectionwith "^4.4.0"
+ log-symbols "^2.2.0"
+ meow "^3.7.0"
+ mime "^2.0.3"
+ update-notifier "^2.3.0"
+
dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@@ -3546,6 +4527,12 @@ doctrine@^0.7.2:
esutils "^1.1.6"
isarray "0.0.1"
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ dependencies:
+ esutils "^2.0.2"
+
dom-helpers@^3.2.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6"
@@ -3579,6 +4566,10 @@ domhandler@^2.3.0:
dependencies:
domelementtype "1"
+dompurify@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/dompurify/-/dompurify-1.0.7.tgz#33e5c4a5fc84df93b58ca162d1d3f28537aa3ec2"
+
domutils@^1.5.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
@@ -3588,16 +4579,20 @@ domutils@^1.5.1:
dot-prop@^3.0.0:
version "3.0.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
+ resolved "http://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177"
dependencies:
is-obj "^1.0.0"
-dot-prop@^4.1.0:
+dot-prop@^4.1.0, dot-prop@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
dependencies:
is-obj "^1.0.0"
+dotenv@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
+
drbg.js@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
@@ -3620,7 +4615,7 @@ duplexer@^0.1.1, duplexer@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
-duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.3:
+duplexify@^3.4.2, duplexify@^3.5.3:
version "3.5.4"
resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4"
dependencies:
@@ -3629,9 +4624,14 @@ duplexify@^3.2.0, duplexify@^3.4.2, duplexify@^3.5.3:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
-ease-component@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/ease-component/-/ease-component-1.0.0.tgz#b375726db0b5b04595b77440396fec7daa5d77c9"
+duplexify@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
ecc-jsbn@~0.1.1:
version "0.1.1"
@@ -3651,19 +4651,28 @@ ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
-ejs@^2.3.1:
- version "2.5.8"
- resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.8.tgz#2ab6954619f225e6193b7ac5f7c39c48fefe4380"
+ejs@^2.5.9:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
- version "1.3.40"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.40.tgz#1fbd6d97befd72b8a6f921dc38d22413d2f6fddf"
+ version "1.3.42"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz#95c33bf01d0cc405556aec899fe61fd4d76ea0f9"
elegant-spinner@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
-elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0:
+elliptic@6.3.3:
+ version "6.3.3"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ inherits "^2.0.1"
+
+elliptic@=6.4.0, elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0:
version "6.4.0"
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
dependencies:
@@ -3675,6 +4684,15 @@ elliptic@^6.0.0, elliptic@^6.2.3, elliptic@^6.4.0:
minimalistic-assert "^1.0.0"
minimalistic-crypto-utils "^1.0.0"
+elliptic@^3.1.0:
+ version "3.1.0"
+ resolved "http://registry.npmjs.org/elliptic/-/elliptic-3.1.0.tgz#c21682ef762769b56a74201609105da11d5f60cc"
+ dependencies:
+ bn.js "^2.0.3"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ inherits "^2.0.1"
+
emojis-list@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@@ -3731,7 +4749,11 @@ entities@^1.1.1, entities@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
-errno@^0.1.1, errno@^0.1.3, errno@~0.1.1:
+envinfo@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-4.4.2.tgz#472c49f3a8b9bca73962641ce7cb692bf623cd1c"
+
+errno@^0.1.1, errno@^0.1.3, errno@~0.1.1, errno@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
dependencies:
@@ -3769,8 +4791,8 @@ es-to-primitive@^1.1.1:
is-symbol "^1.0.1"
es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
- version "0.10.41"
- resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.41.tgz#bab3e982d750f0112f0cb9e6abed72c59eb33eb2"
+ version "0.10.42"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.42.tgz#8c07dd33af04d5dcd1310b5cef13bea63a89ba8d"
dependencies:
es6-iterator "~2.0.3"
es6-symbol "~3.1.1"
@@ -3839,10 +4861,6 @@ escape-html@1.0.3, escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
-escape-string-regexp@1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1"
-
escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -3867,6 +4885,67 @@ escope@^3.6.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
+eslint-scope@^3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+
+eslint@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+ dependencies:
+ ajv "^5.3.0"
+ babel-code-frame "^6.22.0"
+ chalk "^2.1.0"
+ concat-stream "^1.6.0"
+ cross-spawn "^5.1.0"
+ debug "^3.1.0"
+ doctrine "^2.1.0"
+ eslint-scope "^3.7.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^3.5.4"
+ esquery "^1.0.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.0.1"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.9.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^7.0.0"
+ progress "^2.0.0"
+ regexpp "^1.0.1"
+ require-uncached "^1.0.3"
+ semver "^5.3.0"
+ strip-ansi "^4.0.0"
+ strip-json-comments "~2.0.1"
+ table "4.0.2"
+ text-table "~0.2.0"
+
+espree@^3.5.4:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1:
version "2.7.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
@@ -3875,6 +4954,12 @@ esprima@^4.0.0, esprima@~4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+esquery@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+ dependencies:
+ estraverse "^4.0.0"
+
esrecurse@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
@@ -3885,7 +4970,7 @@ estraverse@^1.9.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
-estraverse@^4.1.0, estraverse@^4.1.1:
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
@@ -3914,6 +4999,46 @@ eth-block-tracker@^2.2.2:
pify "^2.3.0"
tape "^4.6.3"
+eth-block-tracker@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-3.0.1.tgz#95cd5e763c7293e0b1b2790a2a39ac2ac188a5e1"
+ dependencies:
+ eth-query "^2.1.0"
+ ethereumjs-tx "^1.3.3"
+ ethereumjs-util "^5.1.3"
+ ethjs-util "^0.1.3"
+ json-rpc-engine "^3.6.0"
+ pify "^2.3.0"
+ tape "^4.6.3"
+
+eth-json-rpc-infura@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.1.0.tgz#01b955a04d1a827b14c6cdc8a78b3a025d06a183"
+ dependencies:
+ cross-fetch "^2.1.0"
+ eth-json-rpc-middleware "^1.5.0"
+ json-rpc-engine "^3.4.0"
+ json-rpc-error "^2.0.0"
+ tape "^4.8.0"
+
+eth-json-rpc-middleware@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f"
+ dependencies:
+ async "^2.5.0"
+ eth-query "^2.1.2"
+ eth-tx-summary "^3.1.2"
+ ethereumjs-block "^1.6.0"
+ ethereumjs-tx "^1.3.3"
+ ethereumjs-util "^5.1.2"
+ ethereumjs-vm "^2.1.0"
+ fetch-ponyfill "^4.0.0"
+ json-rpc-engine "^3.6.0"
+ json-rpc-error "^2.0.0"
+ json-stable-stringify "^1.0.1"
+ promise-to-callback "^1.0.0"
+ tape "^4.6.3"
+
eth-lib@0.1.27, eth-lib@^0.1.26:
version "0.1.27"
resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.27.tgz#f0b0fd144f865d2d6bf8257a40004f2e75ca1dd6"
@@ -3934,7 +5059,23 @@ eth-lib@0.2.7:
elliptic "^6.4.0"
xhr-request-promise "^0.1.2"
-eth-query@^2.1.0:
+eth-lightwallet@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/eth-lightwallet/-/eth-lightwallet-3.0.1.tgz#297022932aa568f4e4eb0873bff257f5e5b78709"
+ dependencies:
+ bitcore-lib "^0.15.0"
+ bitcore-mnemonic "^1.5.0"
+ buffer "^4.9.0"
+ crypto-js "^3.1.5"
+ elliptic "^3.1.0"
+ ethereumjs-tx "^1.3.3"
+ ethereumjs-util "^5.1.1"
+ rlp "^2.0.0"
+ scrypt-async "^1.2.0"
+ tweetnacl "0.13.2"
+ web3 "0.20.2"
+
+eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
dependencies:
@@ -3948,6 +5089,24 @@ eth-sig-util@^1.4.2:
ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git"
ethereumjs-util "^5.1.1"
+eth-tx-summary@^3.1.2:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.1.tgz#0c2d5e4c57d2511614f85b9b583c32fa2924166c"
+ dependencies:
+ async "^2.1.2"
+ bn.js "^4.11.8"
+ clone "^2.0.0"
+ concat-stream "^1.5.1"
+ end-of-stream "^1.1.0"
+ eth-query "^2.0.2"
+ ethereumjs-block "^1.4.1"
+ ethereumjs-tx "^1.1.1"
+ ethereumjs-util "^5.0.1"
+ ethereumjs-vm "^2.3.4"
+ through2 "^2.0.3"
+ treeify "^1.0.1"
+ web3-provider-engine "^13.3.2"
+
ethereum-common@0.0.16:
version "0.0.16"
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.16.tgz#9a1e169ead34ab75e089f50ca512bfd0fbd12655"
@@ -3960,7 +5119,14 @@ ethereum-common@^0.0.18:
version "0.0.18"
resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f"
-ethereumjs-abi@^0.6.4:
+ethereum-types@^0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/ethereum-types/-/ethereum-types-0.0.2.tgz#6ef6faf46a24697cbf66b6c8a0ecf2095ce58c38"
+ dependencies:
+ "@types/node" "^8.0.53"
+ bignumber.js "~4.1.0"
+
+ethereumjs-abi@0.6.5:
version "0.6.5"
resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241"
dependencies:
@@ -3969,7 +5135,7 @@ ethereumjs-abi@^0.6.4:
"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git":
version "0.6.5"
- resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#09c3c48fd3bed143df7fa8f36f6f164205e23796"
+ resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#00ba8463a7f7a67fcad737ff9c2ebd95643427f7"
dependencies:
bn.js "^4.10.0"
ethereumjs-util "^5.0.0"
@@ -3981,7 +5147,7 @@ ethereumjs-account@^2.0.3, ethereumjs-account@~2.0.4:
ethereumjs-util "^4.0.1"
rlp "^2.0.0"
-ethereumjs-block@^1.2.2, ethereumjs-block@~1.7.0:
+ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0, ethereumjs-block@~1.7.0:
version "1.7.1"
resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f"
dependencies:
@@ -4001,7 +5167,7 @@ ethereumjs-block@~1.2.2:
ethereumjs-util "^4.0.1"
merkle-patricia-tree "^2.1.2"
-ethereumjs-blockstream@^2.0.6:
+ethereumjs-blockstream@2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/ethereumjs-blockstream/-/ethereumjs-blockstream-2.0.7.tgz#8e791d18d517f13e0ba928892dda545dc930936b"
dependencies:
@@ -4009,26 +5175,40 @@ ethereumjs-blockstream@^2.0.6:
source-map-support "0.4.14"
uuid "3.0.1"
-ethereumjs-testrpc-sc@6.1.2:
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/ethereumjs-testrpc-sc/-/ethereumjs-testrpc-sc-6.1.2.tgz#bd1d8306abb2d51481f3f01538fa71fb7fd44a4d"
+ethereumjs-blockstream@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-blockstream/-/ethereumjs-blockstream-5.0.0.tgz#63bfe9185757329a32822d5815562eb1dcd75d71"
dependencies:
- source-map-support "^0.5.3"
- webpack-cli "^2.0.9"
+ immutable "3.8.2"
+ source-map-support "0.5.6"
+ uuid "3.2.1"
-ethereumjs-testrpc@^6.0.3:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/ethereumjs-testrpc/-/ethereumjs-testrpc-6.0.3.tgz#7a0b87bf3670f92f607f98fa6a78801d9741b124"
+ethereumjs-tx@0xProject/ethereumjs-tx#fake-tx-include-signature-by-default:
+ version "1.3.4"
+ resolved "https://codeload.github.com/0xProject/ethereumjs-tx/tar.gz/29d1153889c389591f74b2401da8a0c6ad40f9a7"
dependencies:
- webpack "^3.0.0"
+ ethereum-common "^0.0.18"
+ ethereumjs-util "^5.0.0"
-ethereumjs-tx@^1.0.0, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.0, ethereumjs-tx@^1.3.3:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.4.tgz#c2304912f6c07af03237ad8675ac036e290dad48"
+ethereumjs-tx@^1.0.0, ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.5.tgz#c5ab252977ed2b13fb2fca195fdfa95a7d54f858"
dependencies:
ethereum-common "^0.0.18"
ethereumjs-util "^5.0.0"
+ethereumjs-util@5.1.5, ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz#2f02575852627d45622426f25ee4a0b5f377f27a"
+ dependencies:
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ ethjs-util "^0.1.3"
+ keccak "^1.0.2"
+ rlp "^2.0.0"
+ safe-buffer "^5.1.1"
+ secp256k1 "^3.0.1"
+
ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0, ethereumjs-util@^4.4.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz#3e9428b317eebda3d7260d854fddda954b1f1bc6"
@@ -4039,9 +5219,9 @@ ethereumjs-util@^4.0.1, ethereumjs-util@^4.3.0, ethereumjs-util@^4.4.0:
rlp "^2.0.0"
secp256k1 "^3.0.1"
-ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.3, ethereumjs-util@^5.1.5:
- version "5.1.5"
- resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.1.5.tgz#2f02575852627d45622426f25ee4a0b5f377f27a"
+ethereumjs-util@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642"
dependencies:
bn.js "^4.11.0"
create-hash "^1.1.2"
@@ -4051,9 +5231,25 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum
safe-buffer "^5.1.1"
secp256k1 "^3.0.1"
-ethereumjs-vm@2.3.3, ethereumjs-vm@^2.0.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.3.3.tgz#05719139e0c4a59e829022964a6048b17d2d84b0"
+ethereumjs-vm@2.3.5:
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.3.5.tgz#e69306737b8a7ea80c633ceb9b7dd561897007de"
+ dependencies:
+ async "^2.1.2"
+ async-eventemitter "^0.2.2"
+ ethereum-common "0.2.0"
+ ethereumjs-account "^2.0.3"
+ ethereumjs-block "~1.7.0"
+ ethereumjs-util "^5.1.3"
+ fake-merkle-patricia-tree "^1.0.1"
+ functional-red-black-tree "^1.0.1"
+ merkle-patricia-tree "^2.1.2"
+ rustbn.js "~0.1.1"
+ safe-buffer "^5.1.1"
+
+ethereumjs-vm@^2.0.2, ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.3.4.tgz#f635d7cb047571a1840a6e9a74d29de4488f8ad6"
dependencies:
async "^2.1.2"
async-eventemitter "^0.2.2"
@@ -4067,7 +5263,7 @@ ethereumjs-vm@2.3.3, ethereumjs-vm@^2.0.2:
rustbn.js "~0.1.1"
safe-buffer "^5.1.1"
-ethereumjs-wallet@^0.6.0, ethereumjs-wallet@~0.6.0:
+ethereumjs-wallet@0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.0.tgz#82763b1697ee7a796be7155da9dfb49b2f98cfdb"
dependencies:
@@ -4079,19 +5275,19 @@ ethereumjs-wallet@^0.6.0, ethereumjs-wallet@~0.6.0:
utf8 "^2.1.1"
uuid "^2.0.1"
-ethers-contracts@^2.2.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/ethers-contracts/-/ethers-contracts-2.2.1.tgz#e2bf5dd5e157313ba454b50c646c8472fcd0a8b3"
- dependencies:
- ethers-utils "^2.1.0"
-
-ethers-utils@^2.1.0:
- version "2.1.11"
- resolved "https://registry.yarnpkg.com/ethers-utils/-/ethers-utils-2.1.11.tgz#b27535ca3226118be300211c39c896b1e5e21641"
+ethers@0xproject/ethers.js#eip-838-reasons, ethers@3.0.22:
+ version "3.0.18"
+ resolved "https://codeload.github.com/0xproject/ethers.js/tar.gz/b91342bd200d142af0165d6befddf783c8ae8447"
dependencies:
+ aes-js "3.0.0"
bn.js "^4.4.0"
+ elliptic "6.3.3"
hash.js "^1.0.0"
+ inherits "2.0.1"
js-sha3 "0.5.7"
+ scrypt-js "2.0.3"
+ setimmediate "1.0.4"
+ uuid "2.0.1"
xmlhttprequest "1.8.0"
ethjs-abi@0.1.8:
@@ -4102,6 +5298,14 @@ ethjs-abi@0.1.8:
js-sha3 "0.5.5"
number-to-bn "1.7.0"
+ethjs-abi@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/ethjs-abi/-/ethjs-abi-0.2.1.tgz#e0a7a93a7e81163a94477bad56ede524ab6de533"
+ dependencies:
+ bn.js "4.11.6"
+ js-sha3 "0.5.5"
+ number-to-bn "1.7.0"
+
ethjs-unit@0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
@@ -4147,7 +5351,11 @@ eventemitter3@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.0.0.tgz#fc29ecf233bd19fbd527bb4089bbf665dc90c1e3"
-events@^1.0.0:
+eventemitter3@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+
+events@1.1.1, events@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
@@ -4168,6 +5376,18 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
+execa@^0.10.0:
+ version "0.10.0"
+ resolved "http://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
execa@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
@@ -4180,9 +5400,9 @@ execa@^0.7.0:
signal-exit "^3.0.0"
strip-eof "^1.0.0"
-execa@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+execa@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01"
dependencies:
cross-spawn "^5.0.1"
get-stream "^3.0.0"
@@ -4294,8 +5514,8 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
external-editor@^2.0.4, external-editor@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48"
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
dependencies:
chardet "^0.4.0"
iconv-lite "^0.4.17"
@@ -4328,6 +5548,10 @@ extsprintf@^1.2.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+eyes@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+
fake-merkle-patricia-tree@^1.0.1, fake-merkle-patricia-tree@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3"
@@ -4346,11 +5570,21 @@ fast-deep-equal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+fast-glob@^2.0.2:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.1.tgz#686c2345be88f3741e174add0be6f2e5b6078889"
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.1"
+ micromatch "^3.1.10"
+
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
-fast-levenshtein@~2.0.4:
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
@@ -4370,7 +5604,7 @@ faye-websocket@~0.11.0:
dependencies:
websocket-driver ">=0.5.1"
-fbjs@^0.8, fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.6, fbjs@^0.8.9:
+fbjs@^0.8.0, fbjs@^0.8.1, fbjs@^0.8.16, fbjs@^0.8.4, fbjs@^0.8.5, fbjs@^0.8.6, fbjs@^0.8.9:
version "0.8.16"
resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
dependencies:
@@ -4415,6 +5649,13 @@ figures@^2.0.0:
dependencies:
escape-string-regexp "^1.0.5"
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
file-type@3.9.0, file-type@^3.6.0, file-type@^3.8.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
@@ -4499,6 +5740,12 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ dependencies:
+ locate-path "^3.0.0"
+
find-versions@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-2.0.0.tgz#2ad90d490f6828c1aa40292cf709ac3318210c3c"
@@ -4545,15 +5792,24 @@ flagged-respawn@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7"
+flat-cache@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
flatten@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
flow-parser@^0.*:
- version "0.68.0"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.68.0.tgz#9cc96620a102e316a314b6bcd56205ceace862d8"
+ version "0.72.0"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.72.0.tgz#6c8041e76ac7d0be1a71ce29c00cd1435fb6013c"
-flush-write-stream@^1.0.0:
+flush-write-stream@^1.0.0, flush-write-stream@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
dependencies:
@@ -4582,7 +5838,7 @@ for-own@^1.0.0:
dependencies:
for-in "^1.0.1"
-foreach@^2.0.5:
+foreach@^2.0.4, foreach@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@@ -4613,6 +5869,10 @@ form-data@~2.3.1:
combined-stream "1.0.6"
mime-types "^2.1.12"
+format-util@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95"
+
forwarded@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -4655,7 +5915,7 @@ fs-extra@^2.0.0, fs-extra@^2.1.2:
graceful-fs "^4.1.2"
jsonfile "^2.1.0"
-fs-extra@^4.0.0, fs-extra@^4.0.1:
+fs-extra@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
dependencies:
@@ -4671,6 +5931,19 @@ fs-extra@^5.0.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs-mkdirp-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
+ dependencies:
+ graceful-fs "^4.1.11"
+ through2 "^2.0.3"
+
fs-promise@^2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/fs-promise/-/fs-promise-2.0.3.tgz#f64e4f854bcf689aa8bddcba268916db3db46854"
@@ -4693,6 +5966,13 @@ fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+fsevents@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
fsevents@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
@@ -4725,9 +6005,16 @@ functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
-ganache-core@0xProject/ganache-core:
- version "2.1.0"
- resolved "https://codeload.github.com/0xProject/ganache-core/tar.gz/a5bf2cdd541beed1bae5a6e7bbab22541345dd42"
+ganache-cli@6.1.3:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/ganache-cli/-/ganache-cli-6.1.3.tgz#40323e56c878b5c7275830cb8a4fa75a32f6d468"
+ dependencies:
+ source-map-support "^0.5.3"
+ webpack-cli "^2.0.9"
+
+ganache-core@0xProject/ganache-core#monorepo-dep:
+ version "2.1.2"
+ resolved "https://codeload.github.com/0xProject/ganache-core/tar.gz/9f86ca3d114ee4395e2d16362f95a8c57ec69bb4"
dependencies:
abstract-leveldown "^3.0.0"
async "^2.5.0"
@@ -4738,10 +6025,10 @@ ganache-core@0xProject/ganache-core:
clone "^2.1.1"
ethereumjs-account "~2.0.4"
ethereumjs-block "~1.2.2"
- ethereumjs-tx "^1.3.0"
- ethereumjs-util "^5.1.5"
- ethereumjs-vm "2.3.3"
- ethereumjs-wallet "~0.6.0"
+ ethereumjs-tx "0xProject/ethereumjs-tx#fake-tx-include-signature-by-default"
+ ethereumjs-util "^5.2.0"
+ ethereumjs-vm "2.3.5"
+ ethereumjs-wallet "0.6.0"
fake-merkle-patricia-tree "~1.0.1"
heap "~0.2.6"
js-scrypt "^0.2.0"
@@ -4750,16 +6037,15 @@ ganache-core@0xProject/ganache-core:
localstorage-down "^0.6.7"
lodash "^4.17.5"
merkle-patricia-tree "^2.2.0"
- mocha "~3.3.0"
pify "^3.0.0"
prepend-file "^1.3.1"
seedrandom "~2.4.2"
shebang-loader "0.0.1"
- solc "0.4.18"
+ solc "0.4.24"
temp "^0.8.3"
tmp "0.0.31"
- web3 "^1.0.0-beta.30"
- web3-provider-engine "^13.6.5"
+ web3 "^1.0.0-beta.34"
+ web3-provider-engine "^14.0.6"
websocket "^1.0.24"
yargs "^7.0.2"
@@ -4796,7 +6082,7 @@ get-func-name@^2.0.0:
get-pkg-repo@^1.0.0:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d"
+ resolved "http://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d"
dependencies:
hosted-git-info "^2.1.4"
meow "^3.3.0"
@@ -4806,7 +6092,7 @@ get-pkg-repo@^1.0.0:
get-port@^3.2.0:
version "3.2.0"
- resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+ resolved "http://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
get-stdin@^4.0.1:
version "4.0.1"
@@ -4854,9 +6140,9 @@ ghauth@^2.0.0:
read "~1.0.5"
xtend "~4.0.0"
-git-raw-commits@^1.3.0, git-raw-commits@^1.3.6:
+git-raw-commits@^1.3.6:
version "1.3.6"
- resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff"
+ resolved "http://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.3.6.tgz#27c35a32a67777c1ecd412a239a6c19d71b95aff"
dependencies:
dargs "^4.0.1"
lodash.template "^4.0.2"
@@ -4866,21 +6152,21 @@ git-raw-commits@^1.3.0, git-raw-commits@^1.3.6:
git-remote-origin-url@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
+ resolved "http://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
dependencies:
gitconfiglocal "^1.0.0"
pify "^2.3.0"
-git-semver-tags@^1.3.0, git-semver-tags@^1.3.6:
+git-semver-tags@^1.3.6:
version "1.3.6"
- resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5"
+ resolved "http://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.3.6.tgz#357ea01f7280794fe0927f2806bee6414d2caba5"
dependencies:
meow "^4.0.0"
semver "^5.5.0"
gitconfiglocal@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
+ resolved "http://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
dependencies:
ini "^1.3.2"
@@ -4920,7 +6206,7 @@ glob-parent@^2.0.0:
dependencies:
is-glob "^2.0.0"
-glob-parent@^3.0.0, glob-parent@^3.1.0:
+glob-parent@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
dependencies:
@@ -4938,17 +6224,19 @@ glob-stream@^3.1.5:
through2 "^0.6.1"
unique-stream "^1.0.0"
-glob-stream@^5.3.2:
- version "5.3.5"
- resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22"
+glob-stream@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4"
dependencies:
extend "^3.0.0"
- glob "^5.0.3"
- glob-parent "^3.0.0"
- micromatch "^2.3.7"
- ordered-read-streams "^0.3.0"
- through2 "^0.6.0"
- to-absolute-glob "^0.1.1"
+ glob "^7.1.1"
+ glob-parent "^3.1.0"
+ is-negated-glob "^1.0.0"
+ ordered-read-streams "^1.0.0"
+ pumpify "^1.3.5"
+ readable-stream "^2.1.5"
+ remove-trailing-separator "^1.0.1"
+ to-absolute-glob "^2.0.0"
unique-stream "^2.0.2"
glob-to-regexp@^0.3.0:
@@ -4967,24 +6255,6 @@ glob2base@^0.0.12:
dependencies:
find-index "^0.1.1"
-glob@3.2.11:
- version "3.2.11"
- resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
- dependencies:
- inherits "2"
- minimatch "0.3"
-
-glob@7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.2"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -5005,7 +6275,7 @@ glob@^4.3.1:
minimatch "^2.0.1"
once "^1.3.0"
-glob@^5.0.15, glob@^5.0.3:
+glob@^5.0.15:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
dependencies:
@@ -5047,17 +6317,32 @@ global-prefix@^1.0.1:
is-windows "^1.0.1"
which "^1.2.14"
-global@~4.3.0:
+global@^4.3.0, global@~4.3.0:
version "4.3.2"
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
dependencies:
min-document "^2.19.0"
process "~0.5.1"
+globals@^11.0.1:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
+
globals@^9.18.0:
version "9.18.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
globby@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5079,6 +6364,18 @@ globby@^7.1.1:
pify "^3.0.0"
slash "^1.0.0"
+globby@^8.0.0, globby@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
+ dependencies:
+ array-union "^1.0.1"
+ dir-glob "^2.0.0"
+ fast-glob "^2.0.2"
+ glob "^7.1.2"
+ ignore "^3.3.5"
+ pify "^3.0.0"
+ slash "^1.0.0"
+
globule@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5"
@@ -5093,6 +6390,12 @@ glogg@^1.0.0:
dependencies:
sparkles "^1.0.0"
+good-listener@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
+ dependencies:
+ delegate "^3.1.2"
+
got@7.1.0, got@^7.0.0, got@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
@@ -5129,8 +6432,8 @@ got@^6.7.1:
url-parse-lax "^1.0.0"
got@^8.2.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/got/-/got-8.3.0.tgz#6ba26e75f8a6cc4c6b3eb1fe7ce4fec7abac8533"
+ version "8.3.1"
+ resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed"
dependencies:
"@sindresorhus/is" "^0.7.0"
cacheable-request "^2.1.1"
@@ -5178,19 +6481,13 @@ growl@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
-growl@1.9.2:
- version "1.9.2"
- resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
-gulp-sourcemaps@1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c"
- dependencies:
- convert-source-map "^1.1.1"
- graceful-fs "^4.1.2"
- strip-bom "^2.0.0"
- through2 "^2.0.0"
- vinyl "^1.0.0"
+gud@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
gulp-util@^3.0.0:
version "3.0.8"
@@ -5311,6 +6608,10 @@ has-symbol-support-x@^1.4.1:
version "1.4.2"
resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+has-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
+
has-to-string-tag-x@^1.2.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
@@ -5462,10 +6763,14 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
-hosted-git-info@^2.1.4, hosted-git-info@^2.5.0:
+hosted-git-info@^2.1.4:
version "2.6.0"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222"
+hosted-git-info@^2.6.0:
+ version "2.7.1"
+ resolved "http://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
hpack.js@^2.1.6:
version "2.1.6"
resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
@@ -5502,7 +6807,7 @@ http-deceiver@^1.2.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
-http-errors@1.6.2, http-errors@~1.6.2:
+http-errors@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
dependencies:
@@ -5511,6 +6816,15 @@ http-errors@1.6.2, http-errors@~1.6.2:
setprototypeof "1.0.3"
statuses ">= 1.3.1 < 2"
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
http-https@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b"
@@ -5562,14 +6876,6 @@ httpntlm@1.7.5:
httpreq ">=0.4.22"
underscore "~1.7.0"
-httpplease@^0.16:
- version "0.16.4"
- resolved "https://registry.yarnpkg.com/httpplease/-/httpplease-0.16.4.tgz#d382ebe230ef5079080b4e9ffebf316a9e75c0da"
- dependencies:
- urllite "~0.5.0"
- xmlhttprequest "*"
- xtend "~3.0.0"
-
httpreq@>=0.4.22:
version "0.4.24"
resolved "https://registry.yarnpkg.com/httpreq/-/httpreq-0.4.24.tgz#4335ffd82cd969668a39465c929ac61d6393627f"
@@ -5596,10 +6902,26 @@ hyphenate-style-name@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
-iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.11, iconv-lite@~0.4.13:
+i@0.3.x:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
+
+iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+iconv-lite@^0.4.17, iconv-lite@~0.4.13:
+ version "0.4.21"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798"
+ dependencies:
+ safer-buffer "^2.1.0"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
icss-replace-symbols@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -5610,6 +6932,10 @@ icss-utils@^2.1.0:
dependencies:
postcss "^6.0.1"
+ieee754@1.1.8:
+ version "1.1.8"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
ieee754@^1.1.4:
version "1.1.11"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.11.tgz#c16384ffe00f5b7835824e67b6f2bd44a5229455"
@@ -5622,6 +6948,16 @@ ignore-by-default@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^3.3.3, ignore@^3.3.7:
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+
ignore@^3.3.5:
version "3.3.7"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021"
@@ -5638,6 +6974,10 @@ immutable@3.8.1:
version "3.8.1"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2"
+immutable@3.8.2:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
+
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@@ -5693,7 +7033,7 @@ inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, i
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
-inherits@2.0.1:
+inherits@2.0.1, inherits@=2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
@@ -5701,6 +7041,19 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+init-package-json@^1.10.3:
+ version "1.10.3"
+ resolved "http://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.3.tgz#45ffe2f610a8ca134f2bd1db5637b235070f6cbe"
+ dependencies:
+ glob "^7.1.1"
+ npm-package-arg "^4.0.0 || ^5.0.0 || ^6.0.0"
+ promzard "^0.3.0"
+ read "~1.0.1"
+ read-package-json "1 || 2"
+ semver "2.x || 3.x || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+ validate-npm-package-name "^3.0.0"
+
inline-style-prefixer@^3.0.2:
version "3.0.8"
resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534"
@@ -5721,7 +7074,7 @@ inquirer@^0.8.2:
rx "^2.4.3"
through "^2.3.6"
-inquirer@^3.2.2, inquirer@^3.3.0:
+inquirer@^3.0.6, inquirer@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
dependencies:
@@ -5740,7 +7093,7 @@ inquirer@^3.2.2, inquirer@^3.3.0:
strip-ansi "^4.0.0"
through "^2.3.6"
-inquirer@^5.1.0:
+inquirer@^5.1.0, inquirer@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
dependencies:
@@ -5908,6 +7261,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "http://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
is-dotfile@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -5993,7 +7350,7 @@ is-installed-globally@^0.1.0:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
-is-mobile@^0.2.2:
+is-mobile@0.2.2, is-mobile@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-0.2.2.tgz#0e2e006d99ed2c2155b761df80f2a3619ae2ad9f"
@@ -6001,6 +7358,10 @@ is-natural-number@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+is-negated-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2"
+
is-npm@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
@@ -6095,6 +7456,10 @@ is-relative@^1.0.0:
dependencies:
is-unc-path "^1.0.0"
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
@@ -6111,7 +7476,7 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
is-subset@^0.1.1:
version "0.1.1"
- resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+ resolved "http://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
is-svg@^2.0.0:
version "2.1.0"
@@ -6125,7 +7490,7 @@ is-symbol@^1.0.1:
is-text-path@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
+ resolved "http://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
dependencies:
text-extensions "^1.0.0"
@@ -6143,13 +7508,13 @@ is-url@^1.1.0:
version "1.2.4"
resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
-is-utf8@^0.2.0:
+is-utf8@^0.2.0, is-utf8@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
-is-valid-glob@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe"
+is-valid-glob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa"
is-whitespace-character@^1.0.0:
version "1.0.1"
@@ -6175,6 +7540,14 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+isarray@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7"
+
+isbinaryfile@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -6189,14 +7562,14 @@ isobject@^3.0.0, isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
-isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.0, isomorphic-fetch@^2.2.1:
+isomorphic-fetch@2.2.1, isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
dependencies:
node-fetch "^1.0.1"
whatwg-fetch ">=0.10.0"
-isstream@~0.1.2:
+isstream@0.1.x, isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -6241,9 +7614,9 @@ istanbul-lib-source-maps@^1.2.3:
rimraf "^2.6.1"
source-map "^0.5.3"
-istanbul-reports@^1.1.4:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554"
+istanbul-reports@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.4.0.tgz#3d7b44b912ecbe7652a603662b962120739646a1"
dependencies:
handlebars "^4.0.3"
@@ -6266,7 +7639,7 @@ istanbul@^0.4.5:
which "^1.1.1"
wordwrap "^1.0.0"
-istextorbinary@^2.1.0:
+istextorbinary@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/istextorbinary/-/istextorbinary-2.2.1.tgz#a5231a08ef6dd22b268d0895084cf8d58b5bec53"
dependencies:
@@ -6281,17 +7654,18 @@ isurl@^1.0.0-alpha5:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"
-jade@0.26.3:
- version "0.26.3"
- resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c"
- dependencies:
- commander "0.6.1"
- mkdirp "0.3.0"
+jmespath@0.15.0:
+ version "0.15.0"
+ resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
js-base64@^2.1.9:
version "2.4.3"
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582"
+js-combinatorics@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/js-combinatorics/-/js-combinatorics-0.5.3.tgz#5da5a1c4632ec59fdf8d49dccfe59ef088122b15"
+
js-scrypt@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/js-scrypt/-/js-scrypt-0.2.0.tgz#7a62b701b4616e70ad0cde544627aabb99d7fe39"
@@ -6306,31 +7680,31 @@ js-sha3@0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7"
+js-sha3@0.7.0, js-sha3@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a"
+
js-sha3@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.3.1.tgz#86122802142f0828502a0d1dee1d95e253bb0243"
-js-sha3@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a"
-
js-tokens@^3.0.0, js-tokens@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.7.0:
+js-yaml@3.x, js-yaml@^3.4.2, js-yaml@^3.6.1, js-yaml@^3.7.0:
version "3.11.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef"
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
-js-yaml@~3.6.0:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30"
+js-yaml@^3.12.0, js-yaml@^3.9.0, js-yaml@^3.9.1:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
dependencies:
argparse "^1.0.7"
- esprima "^2.6.0"
+ esprima "^4.0.0"
js-yaml@~3.7.0:
version "3.7.0"
@@ -6400,10 +7774,16 @@ json-loader@^0.5.4:
resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
json-parse-better-errors@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a"
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-pointer@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.0.tgz#8e500550a6aac5464a473377da57aa6cc22828d7"
+ dependencies:
+ foreach "^2.0.4"
-json-rpc-engine@^3.6.0:
+json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.6.1.tgz#f53084726dc6dedeead0e2c457eeb997135f1e25"
dependencies:
@@ -6413,7 +7793,7 @@ json-rpc-engine@^3.6.0:
json-rpc-error "^2.0.0"
promise-to-callback "^1.0.0"
-json-rpc-error@^2.0.0:
+json-rpc-error@2.0.0, json-rpc-error@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02"
dependencies:
@@ -6423,6 +7803,15 @@ json-rpc-random-id@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8"
+json-schema-ref-parser@^5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-5.1.2.tgz#c9cdaec76ea894f71eb3776c3b3291dfa62e56c9"
+ dependencies:
+ call-me-maybe "^1.0.1"
+ debug "^3.1.0"
+ js-yaml "^3.12.0"
+ ono "^4.0.5"
+
json-schema-traverse@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
@@ -6431,6 +7820,10 @@ json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+
json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
@@ -6441,14 +7834,10 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.0, json-stringify-safe@~5.0
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
-json3@3.3.2, json3@^3.3.2:
+json3@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
-json5@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d"
-
json5@^0.5.0, json5@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
@@ -6471,9 +7860,17 @@ jsonify@~0.0.0:
jsonparse@^1.2.0:
version "1.3.1"
- resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ resolved "http://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsonschema-draft4@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz#f0af2005054f0f0ade7ea2118614b69dc512d865"
+
+jsonschema@*, jsonschema@1.2.4, jsonschema@^1.2.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.4.tgz#a46bac5d3506a254465bc548876e267c6d0d6464"
-jsonschema@*, jsonschema@^1.2.0:
+jsonschema@1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.2.tgz#83ab9c63d65bf4d596f91d81195e78772f6452bc"
@@ -6520,7 +7917,7 @@ killable@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b"
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
dependencies:
@@ -6572,61 +7969,19 @@ lcov-parse@^0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
-lcov-result-merger@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lcov-result-merger/-/lcov-result-merger-2.0.0.tgz#ba26a3b7d15b40b0efe6e603b1354b1dded28ce1"
+lcov-result-merger@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lcov-result-merger/-/lcov-result-merger-3.0.0.tgz#4b9f2fc12cc3df9013ff79a55d4d4a6f909f9d64"
dependencies:
- through2 "^2.0.1"
- vinyl "^2.0.0"
- vinyl-fs "^2.4.3"
+ through2 "^2.0.3"
+ vinyl "^2.1.0"
+ vinyl-fs "^3.0.2"
-lerna-get-packages@^1.0.0:
+lead@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/lerna-get-packages/-/lerna-get-packages-1.0.0.tgz#60fa309a71cf2e34eec63224368de2fe8f61ba65"
-
-lerna@^2.5.1:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.9.0.tgz#303f70bc50b1c4541bdcf54eda13c36fe54401f3"
+ resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42"
dependencies:
- async "^1.5.0"
- chalk "^2.1.0"
- cmd-shim "^2.0.2"
- columnify "^1.5.4"
- command-join "^2.0.0"
- conventional-changelog-cli "^1.3.13"
- conventional-recommended-bump "^1.2.1"
- dedent "^0.7.0"
- execa "^0.8.0"
- find-up "^2.1.0"
- fs-extra "^4.0.1"
- get-port "^3.2.0"
- glob "^7.1.2"
- glob-parent "^3.1.0"
- globby "^6.1.0"
- graceful-fs "^4.1.11"
- hosted-git-info "^2.5.0"
- inquirer "^3.2.2"
- is-ci "^1.0.10"
- load-json-file "^4.0.0"
- lodash "^4.17.4"
- minimatch "^3.0.4"
- npmlog "^4.1.2"
- p-finally "^1.0.0"
- package-json "^4.0.1"
- path-exists "^3.0.0"
- read-cmd-shim "^1.0.1"
- read-pkg "^3.0.0"
- rimraf "^2.6.1"
- safe-buffer "^5.1.1"
- semver "^5.4.1"
- signal-exit "^3.0.2"
- slash "^1.0.0"
- strong-log-transformer "^1.0.6"
- temp-write "^3.3.0"
- write-file-atomic "^2.3.0"
- write-json-file "^2.2.0"
- write-pkg "^3.1.0"
- yargs "^8.0.2"
+ flush-write-stream "^1.0.2"
less-loader@^2.2.3:
version "2.2.3"
@@ -6721,7 +8076,7 @@ levelup@~0.19.0:
semver "~5.1.0"
xtend "~3.0.0"
-levn@~0.3.0:
+levn@^0.3.0, levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
dependencies:
@@ -6749,6 +8104,19 @@ listr-silent-renderer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e"
+listr-update-renderer@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9"
+ dependencies:
+ chalk "^1.1.3"
+ cli-truncate "^0.2.1"
+ elegant-spinner "^1.0.1"
+ figures "^1.7.0"
+ indent-string "^3.0.0"
+ log-symbols "^1.0.2"
+ log-update "^1.0.2"
+ strip-ansi "^3.0.1"
+
listr-update-renderer@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7"
@@ -6771,6 +8139,27 @@ listr-verbose-renderer@^0.4.0:
date-fns "^1.27.2"
figures "^1.7.0"
+listr@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a"
+ dependencies:
+ chalk "^1.1.3"
+ cli-truncate "^0.2.1"
+ figures "^1.7.0"
+ indent-string "^2.1.0"
+ is-promise "^2.1.0"
+ is-stream "^1.1.0"
+ listr-silent-renderer "^1.1.1"
+ listr-update-renderer "^0.2.0"
+ listr-verbose-renderer "^0.4.0"
+ log-symbols "^1.0.2"
+ log-update "^1.0.2"
+ ora "^0.2.3"
+ p-map "^1.1.1"
+ rxjs "^5.0.0-beta.11"
+ stream-to-observable "^0.1.0"
+ strip-ansi "^3.0.1"
+
listr@^0.13.0:
version "0.13.0"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d"
@@ -6825,7 +8214,7 @@ loader-runner@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
-loader-utils@0.2.x, loader-utils@^0.2.5, loader-utils@~0.2.13, loader-utils@~0.2.2:
+loader-utils@0.2.x, loader-utils@^0.2.5, loader-utils@~0.2.2:
version "0.2.17"
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
dependencies:
@@ -6865,25 +8254,21 @@ locate-path@^2.0.0:
p-locate "^2.0.0"
path-exists "^3.0.0"
-lodash-es@^4.17.5, lodash-es@^4.2.1:
- version "4.17.7"
- resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.7.tgz#db240a3252c3dd8360201ac9feef91ac977ea856"
-
-lodash._baseassign@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e"
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
dependencies:
- lodash._basecopy "^3.0.0"
- lodash.keys "^3.0.0"
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+lodash-es@^4.17.5, lodash-es@^4.2.1:
+ version "4.17.8"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.8.tgz#6fa8c8c5d337481df0bdf1c0d899d42473121e45"
lodash._basecopy@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36"
-lodash._basecreate@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821"
-
lodash._basetostring@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5"
@@ -6937,20 +8322,16 @@ lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
-lodash.create@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7"
- dependencies:
- lodash._baseassign "^3.0.0"
- lodash._basecreate "^3.0.0"
- lodash._isiterateecall "^3.0.0"
-
lodash.deburr@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-3.2.0.tgz#6da8f54334a366a7cf4c4c76ef8d80aa1b365ed5"
dependencies:
lodash._root "^3.0.0"
+lodash.differenceby@^4.8.0:
+ version "4.8.0"
+ resolved "https://registry.npmjs.org/lodash.differenceby/-/lodash.differenceby-4.8.0.tgz#cfd59e94353af5de51da5d302ca4ebff33faac57"
+
lodash.escape@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698"
@@ -6961,14 +8342,26 @@ lodash.escaperegexp@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
-lodash.foreach@^4.5.0:
+lodash.find@^4.3.0:
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1"
+
+lodash.foreach@^4.2.0, lodash.foreach@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
-lodash.get@^4.4.2:
+lodash.get@^4.0.0, lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+lodash.intersectionby@^4.7.0:
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/lodash.intersectionby/-/lodash.intersectionby-4.7.0.tgz#12f125e4da00b22290febda1b6c1b68bb9255125"
+
+lodash.intersectionwith@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/lodash.intersectionwith/-/lodash.intersectionwith-4.4.0.tgz#818949e293052ba7fc73a440f6114c2c81c38e1c"
+
lodash.isarguments@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
@@ -6979,11 +8372,7 @@ lodash.isarray@^3.0.0:
lodash.isequal@^4.0.0:
version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
-
-lodash.isplainobject@~4.0.4:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
lodash.keys@^3.0.0:
version "3.1.2"
@@ -7001,6 +8390,10 @@ lodash.merge@^4.6.0:
version "4.6.1"
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
+lodash.reduce@^4.3.0:
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
lodash.restparam@^3.0.0:
version "3.6.1"
resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
@@ -7021,7 +8414,7 @@ lodash.template@^3.0.0:
lodash.template@^4.0.2:
version "4.4.0"
- resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
+ resolved "http://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
dependencies:
lodash._reinterpolate "~3.0.0"
lodash.templatesettings "^4.0.0"
@@ -7035,7 +8428,7 @@ lodash.templatesettings@^3.0.0:
lodash.templatesettings@^4.0.0:
version "4.1.0"
- resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
+ resolved "http://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
dependencies:
lodash._reinterpolate "~3.0.0"
@@ -7047,7 +8440,7 @@ lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-lodash.values@^4.3.0:
+lodash.values@4.3.0, lodash.values@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
@@ -7057,19 +8450,23 @@ lodash.words@^3.0.0:
dependencies:
lodash._root "^3.0.0"
+lodash@4.17.10, lodash@^4.17.10:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
lodash@4.17.2:
version "4.17.2"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42"
-lodash@4.17.4:
+lodash@4.17.4, lodash@=4.17.4:
version "4.17.4"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
-lodash@^3.10.1, lodash@^3.3.1, lodash@^3.6.0:
+lodash@^3.10.1, lodash@^3.3.1, lodash@^3.6.0, lodash@^3.7.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
-lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0:
+lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1:
version "4.17.5"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
@@ -7100,7 +8497,7 @@ log-update@^1.0.2:
ansi-escapes "^1.0.0"
cli-cursor "^1.0.2"
-loglevel@^1.4.1:
+loglevel@^1.4.1, loglevel@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
@@ -7174,21 +8571,39 @@ ltgt@~2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34"
+lunr@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.1.tgz#113616a2b602ddc10932a7bf8a4e6e57ebfecdf2"
+
macaddress@^0.2.8:
version "0.2.8"
resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
-make-dir@^1.0.0, make-dir@^1.1.0:
+make-dir@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b"
dependencies:
pify "^3.0.0"
+make-dir@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+make-error@^1.1.1:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535"
+
make-iterator@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.0.tgz#57bef5dc85d23923ba23767324d8e8f8f3d9694b"
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
dependencies:
- kind-of "^3.1.0"
+ kind-of "^6.0.2"
+
+make-promises-safe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/make-promises-safe/-/make-promises-safe-1.1.0.tgz#b4d28c61ef8ad5502f38dbb3a0ee89627f76ad61"
map-cache@^0.2.0, map-cache@^0.2.2:
version "0.2.2"
@@ -7200,7 +8615,7 @@ map-obj@^1.0.0, map-obj@^1.0.1:
map-obj@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
+ resolved "http://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9"
map-stream@~0.1.0:
version "0.1.0"
@@ -7212,15 +8627,23 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
+mark.js@^8.11.1:
+ version "8.11.1"
+ resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5"
+
markdown-escapes@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518"
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.2.tgz#e639cbde7b99c841c0bacc8a07982873b46d2122"
+
+marked@0.3.18:
+ version "0.3.18"
+ resolved "https://registry.npmjs.org/marked/-/marked-0.3.18.tgz#3ef058cd926101849b92a7a7c15db18c7fc76b2f"
marked@^0.3.12, marked@^0.3.5:
version "0.3.19"
resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
-material-ui@^0.17.1:
+material-ui@0.17.4, material-ui@^0.17.1:
version "0.17.4"
resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-0.17.4.tgz#193999ecb49c3ec15ae0abb4e90fdf9a7bd343e0"
dependencies:
@@ -7262,15 +8685,16 @@ media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
-mem-fs-editor@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz#dd0a6eaf2bb8a6b37740067aa549eb530105af9f"
+mem-fs-editor@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-4.0.2.tgz#55a79b1e824da631254c4c95ba6366602c77af90"
dependencies:
commondir "^1.0.1"
- deep-extend "^0.4.0"
- ejs "^2.3.1"
+ deep-extend "^0.5.1"
+ ejs "^2.5.9"
glob "^7.0.3"
- globby "^6.1.0"
+ globby "^8.0.0"
+ isbinaryfile "^3.0.2"
mkdirp "^0.5.0"
multimatch "^2.0.0"
rimraf "^2.2.8"
@@ -7302,6 +8726,10 @@ memdown@^1.0.0:
ltgt "~2.2.0"
safe-buffer "~5.1.1"
+memoize-one@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-4.0.0.tgz#fc5e2f1427a216676a62ec652cf7398cfad123db"
+
memory-fs@^0.4.0, memory-fs@~0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -7329,8 +8757,8 @@ meow@^3.1.0, meow@^3.3.0, meow@^3.7.0:
trim-newlines "^1.0.0"
meow@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/meow/-/meow-4.0.0.tgz#fd5855dd008db5b92c552082db1c307cba20b29d"
+ version "4.0.1"
+ resolved "http://registry.yarnpkg.com/meow/-/meow-4.0.1.tgz#d48598f6f4b1472f35bf6317a95945ace347f975"
dependencies:
camelcase-keys "^4.0.0"
decamelize-keys "^1.0.0"
@@ -7352,11 +8780,9 @@ merge-source-map@^1.0.2:
dependencies:
source-map "^0.6.1"
-merge-stream@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
- dependencies:
- readable-stream "^2.0.1"
+merge2@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.2.0:
version "2.3.1"
@@ -7375,7 +8801,7 @@ methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
-micromatch@^2.3.11, micromatch@^2.3.7:
+micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7:
version "2.3.11"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
dependencies:
@@ -7393,7 +8819,7 @@ micromatch@^2.3.11, micromatch@^2.3.7:
parse-glob "^3.0.4"
regex-cache "^0.4.2"
-micromatch@^3.0.3, micromatch@^3.0.4, micromatch@^3.1.4, micromatch@^3.1.8:
+micromatch@^3.0.3, micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
dependencies:
@@ -7452,6 +8878,10 @@ mime@^1.2.11, mime@^1.3.4, mime@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+mime@^2.0.3:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369"
+
mimic-fn@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
@@ -7467,21 +8897,14 @@ min-document@^2.19.0:
dom-walk "^0.1.0"
minimalistic-assert@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
-minimatch@0.3:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
- dependencies:
- lru-cache "2"
- sigmund "~1.0.0"
-
-"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
@@ -7502,7 +8925,7 @@ minimatch@~0.2.11:
minimist-options@^3.0.1:
version "3.0.2"
- resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
+ resolved "http://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954"
dependencies:
arrify "^1.0.1"
is-plain-obj "^1.1.0"
@@ -7523,6 +8946,19 @@ minimist@~0.0.1:
version "0.0.10"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
mississippi@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
@@ -7551,32 +8987,24 @@ mkdirp-promise@^5.0.1:
dependencies:
mkdirp "*"
-mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
minimist "0.0.8"
-mkdirp@0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
-
-mocha@^2.4.5:
- version "2.5.3"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58"
+mobx-react@^5.2.3:
+ version "5.2.5"
+ resolved "https://registry.npmjs.org/mobx-react/-/mobx-react-5.2.5.tgz#fc44ac17e1798f6b590f064b831d8a1d89850ef0"
dependencies:
- commander "2.3.0"
- debug "2.2.0"
- diff "1.4.0"
- escape-string-regexp "1.0.2"
- glob "3.2.11"
- growl "1.9.2"
- jade "0.26.3"
- mkdirp "0.5.1"
- supports-color "1.2.0"
- to-iso-string "0.0.2"
+ hoist-non-react-statics "^2.5.0"
+ react-lifecycles-compat "^3.0.2"
+
+mobx@^4.2.0:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/mobx/-/mobx-4.3.1.tgz#334e5aab4916b1d43f0faf3605a64b1b4b3ccb8d"
-mocha@^4.0.1:
+mocha@^4.0.1, mocha@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794"
dependencies:
@@ -7591,40 +9019,38 @@ mocha@^4.0.1:
mkdirp "0.5.1"
supports-color "4.4.0"
-mocha@~3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.3.0.tgz#d29b7428d3f52c82e2e65df1ecb7064e1aabbfb5"
+mocha@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
dependencies:
- browser-stdout "1.3.0"
- commander "2.9.0"
- debug "2.6.0"
- diff "3.2.0"
+ browser-stdout "1.3.1"
+ commander "2.15.1"
+ debug "3.1.0"
+ diff "3.5.0"
escape-string-regexp "1.0.5"
- glob "7.1.1"
- growl "1.9.2"
- json3 "3.3.2"
- lodash.create "3.1.1"
+ glob "7.1.2"
+ growl "1.10.5"
+ he "1.1.1"
+ minimatch "3.0.4"
mkdirp "0.5.1"
- supports-color "3.1.2"
+ supports-color "5.4.0"
mock-fs@^4.1.0:
version "4.4.2"
resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.4.2.tgz#09dec5313f97095a450be6aa2ad8ab6738d63d6b"
-modify-babel-preset@^1.0.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/modify-babel-preset/-/modify-babel-preset-1.2.0.tgz#d1b7c8c24896e19dbc4847347213e6b7144d1bc7"
- dependencies:
- require-relative "^0.8.7"
-
modify-values@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
+ resolved "http://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
-moment@2.21.0, moment@^2.6.0:
+moment@2.21.0:
version "2.21.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a"
+moment@^2.6.0:
+ version "2.22.2"
+ resolved "http://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+
mout@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99"
@@ -7644,10 +9070,6 @@ ms@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
-ms@0.7.2:
- version "0.7.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7663,7 +9085,7 @@ multicast-dns@^6.0.1:
dns-packet "^1.3.1"
thunky "^1.0.2"
-multimatch@^2.0.0:
+multimatch@^2.0.0, multimatch@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
dependencies:
@@ -7694,7 +9116,7 @@ mz@^2.6.0:
object-assign "^4.0.1"
thenify-all "^1.0.0"
-nan@^2.0.5, nan@^2.0.8, nan@^2.2.1, nan@^2.3.0, nan@^2.3.3, nan@^2.6.2:
+nan@2.10.0, nan@>=2.5.1, nan@^2.0.8, nan@^2.2.1, nan@^2.3.0, nan@^2.3.3, nan@^2.6.2, nan@^2.9.2:
version "2.10.0"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
@@ -7720,16 +9142,32 @@ nanomatch@^1.2.9:
to-regex "^3.0.1"
natives@^1.1.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.2.tgz#4437ca1ed8a7f047531ccdfaf2792853df4efa1c"
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.3.tgz#44a579be64507ea2d6ed1ca04a9415915cf75558"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+ncp@1.0.x:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
+
+needle@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
neo-async@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f"
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
newman@^3.9.3:
version "3.9.3"
@@ -7767,8 +9205,8 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
nise@^1.2.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.2.tgz#fd6fd8dc040dfb3c0a45252feb6ff21832309b14"
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.3.tgz#c17a850066a8a1dfeb37f921da02441afc4a82ba"
dependencies:
"@sinonjs/formatio" "^2.0.0"
just-extend "^1.1.27"
@@ -7777,8 +9215,8 @@ nise@^1.2.0:
text-encoding "^0.6.4"
nock@^9.2.3:
- version "9.2.3"
- resolved "https://registry.yarnpkg.com/nock/-/nock-9.2.3.tgz#39738087d6a0497d3a165fb352612b38a2f9b92f"
+ version "9.2.5"
+ resolved "https://registry.yarnpkg.com/nock/-/nock-9.2.5.tgz#c131fc8d3c4723f386be0269739638be84733f2f"
dependencies:
chai "^4.1.2"
debug "^3.1.0"
@@ -7800,6 +9238,10 @@ node-dir@0.1.8:
version "0.1.8"
resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
+node-fetch@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.1.tgz#369ca70b82f50c86496104a6c776d274f4e4a2d4"
+
node-fetch@^1.0.1, node-fetch@^1.3.3, node-fetch@~1.7.1:
version "1.7.3"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
@@ -7811,6 +9253,23 @@ node-forge@0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300"
+node-gyp@^3.6.2:
+ version "3.7.0"
+ resolved "http://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203"
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request ">=2.9.0 <2.82.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
node-hid@^0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-0.7.2.tgz#15025cdea2e9756aca2de7266529996d40e52c56"
@@ -7853,6 +9312,21 @@ node-oauth1@1.2.2:
dependencies:
crypto-js "3.1.9-1"
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
node-pre-gyp@^0.6.39:
version "0.6.39"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
@@ -7874,8 +9348,8 @@ node-uuid@^1.4.7:
resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907"
nodemon@^1.11.0:
- version "1.17.2"
- resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.17.2.tgz#17c0062629610e03dd01241c576f1c4068da9fdd"
+ version "1.17.3"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.17.3.tgz#3b0bbc2ee05ccb43b1aef15ba05c63c7bc9b8530"
dependencies:
chokidar "^2.0.2"
debug "^3.1.0"
@@ -7906,7 +9380,7 @@ noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
-nopt@3.x:
+"nopt@2 || 3", nopt@3.x:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
dependencies:
@@ -7925,7 +9399,7 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
-normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
+normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5:
version "2.4.0"
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
dependencies:
@@ -7934,7 +9408,7 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"
-normalize-path@^2.0.1, normalize-path@^2.1.1:
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
dependencies:
@@ -7961,13 +9435,52 @@ normalize-url@^1.4.0:
query-string "^4.1.0"
sort-keys "^1.0.0"
-npm-run-all@^4.1.2:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056"
+now-and-later@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee"
+ dependencies:
+ once "^1.3.2"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-lifecycle@^2.0.0:
+ version "2.0.3"
+ resolved "http://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-2.0.3.tgz#696bedf1143371163e9cc16fe872357e25d8d90e"
+ dependencies:
+ byline "^5.0.0"
+ graceful-fs "^4.1.11"
+ node-gyp "^3.6.2"
+ resolve-from "^4.0.0"
+ slide "^1.1.6"
+ uid-number "0.0.6"
+ umask "^1.1.0"
+ which "^1.3.0"
+
+"npm-package-arg@^4.0.0 || ^5.0.0 || ^6.0.0", npm-package-arg@^6.0.0:
+ version "6.1.0"
+ resolved "http://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
+ dependencies:
+ hosted-git-info "^2.6.0"
+ osenv "^0.1.5"
+ semver "^5.5.0"
+ validate-npm-package-name "^3.0.0"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-all@^4.1.2, npm-run-all@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.3.tgz#49f15b55a66bb4101664ce270cb18e7103f8f185"
dependencies:
ansi-styles "^3.2.0"
chalk "^2.1.0"
- cross-spawn "^5.1.0"
+ cross-spawn "^6.0.4"
memorystream "^0.3.1"
minimatch "^3.0.4"
ps-tree "^1.1.0"
@@ -7981,7 +9494,7 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
-npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
dependencies:
@@ -8005,9 +9518,13 @@ number-to-bn@1.7.0:
bn.js "4.11.6"
strip-hex-prefix "1.0.0"
+numeral@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/numeral/-/numeral-2.0.6.tgz#4ad080936d443c2561aed9f2197efffe25f4e506"
+
nyc@^11.0.1:
- version "11.6.0"
- resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.6.0.tgz#d9c7b51ffceb6bba099a4683a6adc1b331b98853"
+ version "11.7.1"
+ resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.7.1.tgz#7cb0a422e501b88ff2c1634341dec2560299d67b"
dependencies:
archy "^1.0.0"
arrify "^1.0.1"
@@ -8024,7 +9541,7 @@ nyc@^11.0.1:
istanbul-lib-instrument "^1.10.0"
istanbul-lib-report "^1.1.3"
istanbul-lib-source-maps "^1.2.3"
- istanbul-reports "^1.1.4"
+ istanbul-reports "^1.4.0"
md5-hex "^1.2.0"
merge-source-map "^1.0.2"
micromatch "^2.3.11"
@@ -8065,7 +9582,7 @@ object-inspect@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3"
-object-keys@^1.0.8:
+object-keys@^1.0.11, object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
@@ -8079,6 +9596,15 @@ object-visit@^1.0.0:
dependencies:
isobject "^3.0.0"
+object.assign@^4.0.4:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+ dependencies:
+ define-properties "^1.1.2"
+ function-bind "^1.1.1"
+ has-symbols "^1.0.0"
+ object-keys "^1.0.11"
+
object.defaults@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
@@ -8128,7 +9654,7 @@ on-headers@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
-once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4, once@^1.4.0:
+once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.3.3, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
@@ -8150,6 +9676,30 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
+ono@^4.0.5:
+ version "4.0.5"
+ resolved "https://registry.npmjs.org/ono/-/ono-4.0.5.tgz#bc62740493a5c1c08b2c21e60cbb0e5c56ab7de2"
+ dependencies:
+ format-util "^1.0.3"
+
+openapi-sampler@1.0.0-beta.13:
+ version "1.0.0-beta.13"
+ resolved "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.0.0-beta.13.tgz#bb8ea6f38471d6f0140c716e5f89242d1d277093"
+ dependencies:
+ json-pointer "^0.6.0"
+
+openapi-schema-validation@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.1.tgz#927e1277082ef61688239730470bfbbdd0f1268d"
+ dependencies:
+ jsonschema "1.2.4"
+ jsonschema-draft4 "^1.0.0"
+ swagger-schema-official "2.0.0-bab6bed"
+
+openapi3-ts@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-0.11.0.tgz#8e4c51ad8d54f8f2516b895e4ce8c01550cd4854"
+
opn-cli@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/opn-cli/-/opn-cli-3.1.0.tgz#f819ae6cae0b411bd0149b8560fe6c88adad20f8"
@@ -8167,7 +9717,7 @@ opn@^4.0.0:
object-assign "^4.0.1"
pinkie-promise "^2.0.0"
-opn@^5.1.0:
+opn@^5.1.0, opn@^5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
dependencies:
@@ -8180,7 +9730,7 @@ optimist@^0.6.1:
minimist "~0.0.1"
wordwrap "~0.0.2"
-optionator@^0.8.1:
+optionator@^0.8.1, optionator@^0.8.2:
version "0.8.2"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
dependencies:
@@ -8212,11 +9762,10 @@ ordered-read-streams@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126"
-ordered-read-streams@^0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b"
+ordered-read-streams@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e"
dependencies:
- is-stream "^1.0.1"
readable-stream "^2.0.1"
original@>=0.0.5:
@@ -8251,7 +9800,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-osenv@^0.1.4:
+osenv@0, osenv@^0.1.4, osenv@^0.1.5:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
dependencies:
@@ -8263,8 +9812,8 @@ p-cancelable@^0.3.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
p-cancelable@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.0.tgz#bcb41d35bf6097fc4367a065b6eb84b9b124eff0"
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
p-each-series@^1.0.0:
version "1.0.0"
@@ -8290,13 +9839,31 @@ p-limit@^1.0.0, p-limit@^1.1.0:
dependencies:
p-try "^1.0.0"
+p-limit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
+ dependencies:
+ p-try "^2.0.0"
+
p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
dependencies:
p-limit "^1.1.0"
-p-map@^1.1.1:
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ dependencies:
+ p-limit "^2.0.0"
+
+p-map-series@^1.0.0:
+ version "1.0.0"
+ resolved "http://registry.yarnpkg.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+ dependencies:
+ p-reduce "^1.0.0"
+
+p-map@^1.1.1, p-map@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -8320,6 +9887,16 @@ p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+p-try@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
+
+p-waterfall@^1.0.0:
+ version "1.0.0"
+ resolved "http://registry.yarnpkg.com/p-waterfall/-/p-waterfall-1.0.0.tgz#7ed94b3ceb3332782353af6aae11aa9fc235bb00"
+ dependencies:
+ p-reduce "^1.0.0"
+
package-json@^4.0.0, package-json@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@@ -8342,8 +9919,8 @@ parallel-transform@^1.1.0:
readable-stream "^2.1.5"
parse-asn1@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
dependencies:
asn1.js "^4.0.0"
browserify-aes "^1.0.0"
@@ -8351,6 +9928,17 @@ parse-asn1@^5.0.0:
evp_bytestokey "^1.0.0"
pbkdf2 "^3.0.3"
+parse-entities@^1.0.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.2.tgz#9eaf719b29dc3bd62246b4332009072e01527777"
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
parse-entities@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890"
@@ -8372,7 +9960,7 @@ parse-filepath@^1.0.1:
parse-github-repo-url@^1.3.0:
version "1.4.1"
- resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50"
+ resolved "http://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50"
parse-glob@^3.0.4:
version "3.0.4"
@@ -8433,10 +10021,6 @@ path-dirname@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
-path-exists@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081"
-
path-exists@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@@ -8451,7 +10035,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
-path-is-inside@^1.0.1:
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
@@ -8523,14 +10107,14 @@ pbkdf2@^3.0.3, pbkdf2@^3.0.9:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
-pegjs@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd"
-
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+perfect-scrollbar@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.4.0.tgz#5d014ef9775e1f43058a1dbae9ed1daf0e7091f1"
+
performance-now@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
@@ -8569,16 +10153,36 @@ pkg-dir@^2.0.0:
dependencies:
find-up "^2.1.0"
-pkginfo@^0.3.0:
+pkginfo@0.3.x, pkginfo@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
+pkginfo@0.x.x:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
+
plur@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a"
dependencies:
irregular-plurals "^1.0.0"
+pluralize@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+polished@^1.9.2:
+ version "1.9.2"
+ resolved "https://registry.npmjs.org/polished/-/polished-1.9.2.tgz#d705cac66f3a3ed1bd38aad863e2c1e269baf6b6"
+
+polished@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/polished/-/polished-1.9.3.tgz#d61b8a0c4624efe31e2583ff24a358932b6b75e1"
+
+popper.js@1.14.3, popper.js@^1.14.1:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
+
portfinder@^1.0.9:
version "1.0.13"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9"
@@ -8955,8 +10559,8 @@ postman-url-encoder@1.0.1:
resolved "https://registry.yarnpkg.com/postman-url-encoder/-/postman-url-encoder-1.0.1.tgz#a094a42e9415ff0bbfdce0eaa8e6011d449ee83c"
prebuild-install@^2.2.2:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.1.tgz#0f234140a73760813657c413cdccdda58296b1da"
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.3.tgz#9f65f242782d370296353710e9bc843490c19f69"
dependencies:
detect-libc "^1.0.3"
expand-template "^1.0.2"
@@ -8974,6 +10578,10 @@ prebuild-install@^2.2.2:
tunnel-agent "^0.6.0"
which-pm-runs "^1.0.0"
+precond@0.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
+
prelude-ls@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
@@ -8997,8 +10605,8 @@ preserve@^0.2.0:
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
prettier@^1.11.1, prettier@^1.5.3:
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.11.1.tgz#61e43fc4cd44e68f2b0dfc2c38cd4bb0fccdcc75"
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325"
pretty-bytes@^1.0.4:
version "1.0.4"
@@ -9022,6 +10630,12 @@ pretty-ms@3.1.0:
parse-ms "^1.0.0"
plur "^2.1.2"
+prismjs@^1.15.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9"
+ optionalDependencies:
+ clipboard "^2.0.0"
+
private@^0.1.6, private@^0.1.7, private@~0.1.5:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -9038,10 +10652,6 @@ process@~0.5.1:
version "0.5.2"
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
-progress-checkmark@^0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/progress-checkmark/-/progress-checkmark-0.0.1.tgz#a43248dfc1de42d6f235a06a00c168cdbe99efc8"
-
progress-stream@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77"
@@ -9074,7 +10684,31 @@ promisify-child-process@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/promisify-child-process/-/promisify-child-process-1.0.5.tgz#817ad1aec92c013d83bb37e1f143e9b4033d9669"
-prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
+prompt@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe"
+ dependencies:
+ colors "^1.1.2"
+ pkginfo "0.x.x"
+ read "1.0.x"
+ revalidator "0.1.x"
+ utile "0.3.x"
+ winston "2.1.x"
+
+promzard@^0.3.0:
+ version "0.3.0"
+ resolved "http://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
+ dependencies:
+ read "1"
+
+prop-types@^15.5.0, prop-types@^15.6.2:
+ version "15.6.2"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
+ dependencies:
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1:
version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
dependencies:
@@ -9086,6 +10720,10 @@ propagate@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/propagate/-/propagate-1.0.0.tgz#00c2daeedda20e87e3782b344adba1cddd6ad709"
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "http://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
proxy-addr@~2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
@@ -9118,8 +10756,8 @@ pstree.remy@^1.1.0:
ps-tree "^1.1.0"
public-encrypt@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
dependencies:
bn.js "^4.1.0"
browserify-rsa "^4.0.0"
@@ -9173,8 +10811,8 @@ pull-pushable@^2.0.0:
resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581"
pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.4.5:
- version "3.6.3"
- resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.3.tgz#8010864c1d9d99e8539d5a487ca7583131c499b8"
+ version "3.6.7"
+ resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.7.tgz#fe4ae4f7cc3a9ee3ac82cd5be32729f2f0d5f02b"
pull-window@^2.1.4:
version "2.1.4"
@@ -9204,6 +10842,14 @@ pumpify@^1.3.3:
inherits "^2.0.3"
pump "^2.0.0"
+pumpify@^1.3.5:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -9216,7 +10862,7 @@ punycode@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
-q@^1.1.2, q@^1.4.1, q@^1.5.1:
+q@^1.1.2, q@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -9243,6 +10889,13 @@ query-string@^5.0.1:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
+query-string@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.0.0.tgz#8b8f39447b73e8290d6f5e3581779218e9171142"
+ dependencies:
+ decode-uri-component "^0.2.0"
+ strict-uri-encode "^2.0.0"
+
querystring-es3@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -9261,7 +10914,7 @@ querystringify@~1.0.0:
quick-lru@^1.0.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
+ resolved "http://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
randomatic@^1.1.3:
version "1.1.7"
@@ -9313,6 +10966,15 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
react-addons-create-fragment@^15.4.0:
version "15.6.2"
resolved "https://registry.yarnpkg.com/react-addons-create-fragment/-/react-addons-create-fragment-15.6.2.tgz#a394de7c2c7becd6b5475ba1b97ac472ce7c74f8"
@@ -9360,6 +11022,21 @@ react-dom@^15.5.4:
object-assign "^4.1.0"
prop-types "^15.5.10"
+react-dom@^16.3.2:
+ version "16.4.2"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
+ dependencies:
+ fbjs "^0.8.16"
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.0"
+
+react-dropdown@^1.3.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.5.0.tgz#3a08f0dd574b64d8eddde60ce51e45b72edc81c3"
+ dependencies:
+ classnames "^2.2.3"
+
react-event-listener@^0.4.5:
version "0.4.5"
resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.4.5.tgz#e3e895a0970cf14ee8f890113af68197abf3d0b1"
@@ -9369,12 +11046,14 @@ react-event-listener@^0.4.5:
prop-types "^15.5.4"
warning "^3.0.0"
-react-ga@^2.4.1:
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/react-ga/-/react-ga-2.4.1.tgz#dfbd5f028ed39a07067f7a8bf57dc0d240000767"
- optionalDependencies:
- prop-types "^15.6.0"
- react "^15.6.2 || ^16.0"
+react-helmet@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-5.2.0.tgz#a81811df21313a6d55c5f058c4aeba5d6f3d97a7"
+ dependencies:
+ deep-equal "^1.0.1"
+ object-assign "^4.1.1"
+ prop-types "^15.5.4"
+ react-side-effect "^1.1.0"
react-highlight@0xproject/react-highlight:
version "0.10.0"
@@ -9385,17 +11064,34 @@ react-highlight@0xproject/react-highlight:
react "^15.5.4"
react-dom "^15.5.4"
-react-html5video@^2.1.0:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/react-html5video/-/react-html5video-2.5.1.tgz#bbc4314be1d583cb991a11ca3480e70a3c964caf"
+react-hot-loader@^4.3.3:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.3.4.tgz#4f9bdd55bb20d77a6ae8931fa1c187e5f0ce6279"
+ dependencies:
+ fast-levenshtein "^2.0.6"
+ global "^4.3.0"
+ hoist-non-react-statics "^2.5.0"
+ prop-types "^15.6.1"
+ react-lifecycles-compat "^3.0.4"
+ shallowequal "^1.0.2"
-react-inlinesvg@^0.5.5:
- version "0.5.5"
- resolved "https://registry.yarnpkg.com/react-inlinesvg/-/react-inlinesvg-0.5.5.tgz#811c75decd392eaef682346751418c2fd911af42"
+react-is@^16.3.1:
+ version "16.4.0"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.4.0.tgz#cc9fdc855ac34d2e7d9d2eb7059bbc240d35ffcf"
+
+react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
+
+react-markdown@3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-3.2.2.tgz#439774c14f25eb25d1b96c126f28ca1486fb0a24"
dependencies:
- fbjs "^0.8"
- httpplease "^0.16"
- once "^1.4"
+ prop-types "^15.6.0"
+ remark-parse "^4.0.0"
+ unified "^6.1.5"
+ unist-util-visit "^1.1.3"
+ xtend "^4.0.1"
react-markdown@^3.2.2:
version "3.3.0"
@@ -9407,9 +11103,16 @@ react-markdown@^3.2.2:
unist-util-visit "^1.3.0"
xtend "^4.0.1"
-react-recaptcha@^2.3.2:
- version "2.3.7"
- resolved "https://registry.yarnpkg.com/react-recaptcha/-/react-recaptcha-2.3.7.tgz#5a10ea4a7a7f59e6b602d4d385caf73a9bd15043"
+react-popper@^1.0.0-beta.6:
+ version "1.0.0-beta.6"
+ resolved "https://registry.npmjs.org/react-popper/-/react-popper-1.0.0-beta.6.tgz#cb27a2ac56adccbaf5f9c4132387289069240834"
+ dependencies:
+ babel-runtime "6.x.x"
+ create-react-context "^0.2.1"
+ popper.js "^1.14.1"
+ prop-types "^15.6.1"
+ typed-styles "^0.0.5"
+ warning "^3.0.0"
react-redux@^5.0.3:
version "5.0.7"
@@ -9433,12 +11136,6 @@ react-router-dom@^4.1.1:
react-router "^4.2.0"
warning "^3.0.0"
-react-router-hash-link@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/react-router-hash-link/-/react-router-hash-link-1.2.0.tgz#ce824cc5f0502ce9b0686bb6dd9c08659b24094c"
- dependencies:
- prop-types "^15.6.0"
-
react-router@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.2.0.tgz#61f7b3e3770daeb24062dae3eedef1b054155986"
@@ -9451,44 +11148,43 @@ react-router@^4.2.0:
prop-types "^15.5.4"
warning "^3.0.0"
-react-scroll@^1.5.2:
+react-scroll@1.7.7:
version "1.7.7"
resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.7.7.tgz#948c40c9a189b62bf4a53ee0fd50e5d89d37260a"
dependencies:
lodash.throttle "^4.1.1"
prop-types "^15.5.8"
-react-side-effect@^1.0.2:
+react-scroll@^1.5.2:
+ version "1.7.8"
+ resolved "https://registry.yarnpkg.com/react-scroll/-/react-scroll-1.7.8.tgz#45d8bd0f3fb104a7a1c3adb358e3a742a7091409"
+ dependencies:
+ lodash.throttle "^4.1.1"
+ prop-types "^15.5.8"
+
+react-side-effect@^1.0.2, react-side-effect@^1.1.0:
version "1.1.5"
resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-1.1.5.tgz#f26059e50ed9c626d91d661b9f3c8bb38cd0ff2d"
dependencies:
exenv "^1.2.1"
shallowequal "^1.0.1"
-react-svg-loader@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/react-svg-loader/-/react-svg-loader-1.1.1.tgz#ac9ffa098b620f26581a03594505244346c00d76"
- dependencies:
- babel-core "~6.13.2"
- babel-plugin-syntax-jsx "~6.13.0"
- babel-preset-es2015 "~6.13.2"
- babel-preset-es2015-loose "~7.0.0"
- babel-preset-react "~6.11.0"
- js-yaml "~3.6.0"
- loader-utils "~0.2.13"
- lodash.isplainobject "~4.0.4"
- svgo "~0.6.3"
- yargs "~4.8.0"
-
-react-tap-event-plugin@^2.0.1:
+react-tabs@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/react-tabs/-/react-tabs-2.2.2.tgz#2f2935da379889484751d1df47c1b639e5ee835d"
+ dependencies:
+ classnames "^2.2.0"
+ prop-types "^15.5.0"
+
+react-tap-event-plugin@2.0.1, react-tap-event-plugin@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/react-tap-event-plugin/-/react-tap-event-plugin-2.0.1.tgz#316beb3bc6556e29ec869a7293e89c826a9074d2"
dependencies:
fbjs "^0.8.6"
react-tooltip@^3.2.7:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-3.4.0.tgz#037f38f797c3e6b1b58d2534ccc8c2c76af4f52d"
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/react-tooltip/-/react-tooltip-3.5.0.tgz#f4bff54b3c70415b6bd25b8bcf7801c230d1b517"
dependencies:
classnames "^2.2.5"
prop-types "^15.6.0"
@@ -9503,13 +11199,6 @@ react-transition-group@^1.2.0:
prop-types "^15.5.6"
warning "^3.0.0"
-react-waypoint@^7.0.4:
- version "7.3.4"
- resolved "https://registry.yarnpkg.com/react-waypoint/-/react-waypoint-7.3.4.tgz#6f4a167ca71c0877576699d6980089f001137f90"
- dependencies:
- consolidated-events "^1.1.0"
- prop-types "^15.0.0"
-
react@15.6.1:
version "15.6.1"
resolved "https://registry.yarnpkg.com/react/-/react-15.6.1.tgz#baa8434ec6780bde997cdc380b79cd33b96393df"
@@ -9530,9 +11219,9 @@ react@^15.5.4:
object-assign "^4.1.0"
prop-types "^15.5.10"
-"react@^15.6.2 || ^16.0":
- version "16.2.0"
- resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
+react@^16.3.2:
+ version "16.4.2"
+ resolved "https://registry.npmjs.org/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"
@@ -9548,10 +11237,31 @@ read-chunk@^2.1.0:
read-cmd-shim@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
+ resolved "http://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
+ dependencies:
+ graceful-fs "^4.1.2"
+
+"read-package-json@1 || 2", read-package-json@^2.0.0:
+ version "2.0.13"
+ resolved "http://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
dependencies:
+ glob "^7.1.1"
+ json-parse-better-errors "^1.0.1"
+ normalize-package-data "^2.0.0"
+ slash "^1.0.0"
+ optionalDependencies:
graceful-fs "^4.1.2"
+read-package-tree@^5.1.6:
+ version "5.2.1"
+ resolved "http://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.2.1.tgz#6218b187d6fac82289ce4387bbbaf8eef536ad63"
+ dependencies:
+ debuglog "^1.0.1"
+ dezalgo "^1.0.0"
+ once "^1.3.0"
+ read-package-json "^2.0.0"
+ readdir-scoped-modules "^1.0.0"
+
read-pkg-up@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -9597,22 +11307,22 @@ read-pkg@^3.0.0:
normalize-package-data "^2.3.2"
path-type "^3.0.0"
-read@~1.0.5:
+read@1, read@1.0.x, read@~1.0.1, read@~1.0.5:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
dependencies:
mute-stream "~0.0.4"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5:
- version "2.3.5"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d"
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
- string_decoder "~1.0.3"
+ string_decoder "~1.1.1"
util-deprecate "~1.0.1"
"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.15, readable-stream@~1.0.26, readable-stream@~1.0.31:
@@ -9633,6 +11343,15 @@ readable-stream@^1.0.33, readable-stream@~1.1.9:
isarray "0.0.1"
string_decoder "~0.10.x"
+readdir-scoped-modules@^1.0.0:
+ version "1.0.2"
+ resolved "http://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+ dependencies:
+ debuglog "^1.0.1"
+ dezalgo "^1.0.0"
+ graceful-fs "^4.1.2"
+ once "^1.3.0"
+
readdirp@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
@@ -9692,11 +11411,53 @@ redent@^1.0.0:
redent@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
+ resolved "http://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa"
dependencies:
indent-string "^3.0.0"
strip-indent "^2.0.0"
+redoc-cli@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/redoc-cli/-/redoc-cli-0.6.1.tgz#497fd9d4c5f3aff7cb0d1b043222f2546789b48e"
+ dependencies:
+ handlebars "^4.0.11"
+ isarray "^2.0.4"
+ mkdirp "^0.5.1"
+ mobx "^4.2.0"
+ react "^16.3.2"
+ react-dom "^16.3.2"
+ redoc "^2.0.0-alpha.29"
+ tslib "^1.9.0"
+ yargs "^11.0.0"
+
+redoc@^2.0.0-alpha.29:
+ version "2.0.0-alpha.34"
+ resolved "https://registry.npmjs.org/redoc/-/redoc-2.0.0-alpha.34.tgz#3c46aa3902212ac20c5cbe2b7d0d7621f175f7e9"
+ dependencies:
+ classnames "^2.2.6"
+ decko "^1.2.0"
+ dompurify "^1.0.6"
+ eventemitter3 "^3.0.0"
+ json-pointer "^0.6.0"
+ json-schema-ref-parser "^5.1.1"
+ lunr "^2.3.0"
+ mark.js "^8.11.1"
+ marked "0.3.18"
+ memoize-one "^4.0.0"
+ mobx-react "^5.2.3"
+ openapi-sampler "1.0.0-beta.13"
+ perfect-scrollbar "^1.4.0"
+ polished "^1.9.3"
+ prismjs "^1.15.0"
+ prop-types "^15.6.2"
+ react-dropdown "^1.3.0"
+ react-hot-loader "^4.3.3"
+ react-tabs "^2.0.0"
+ slugify "^1.2.1"
+ stickyfill "^1.1.1"
+ styled-components "^3.3.3"
+ tslib "^1.9.3"
+
reduce-css-calc@^1.2.6:
version "1.3.0"
resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
@@ -9711,7 +11472,18 @@ reduce-function-call@^1.0.1:
dependencies:
balanced-match "^0.4.2"
-redux@*, redux@^3.6.0:
+redux-devtools-extension@^2.13.2:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d"
+
+redux@*:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.0.tgz#aa698a92b729315d22b34a0553d7e6533555cc03"
+ dependencies:
+ loose-envify "^1.1.0"
+ symbol-observable "^1.2.0"
+
+redux@^3.6.0:
version "3.7.2"
resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
dependencies:
@@ -9749,6 +11521,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
+regexpp@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+
regexpu-core@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
@@ -9788,6 +11564,26 @@ regjsparser@^0.1.4:
dependencies:
jsesc "~0.5.0"
+remark-parse@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b"
+ dependencies:
+ collapse-white-space "^1.0.2"
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-whitespace-character "^1.0.0"
+ is-word-character "^1.0.0"
+ markdown-escapes "^1.0.0"
+ parse-entities "^1.0.2"
+ repeat-string "^1.5.4"
+ state-toggle "^1.0.0"
+ trim "0.0.1"
+ trim-trailing-lines "^1.0.0"
+ unherit "^1.0.4"
+ unist-util-remove-position "^1.0.0"
+ vfile-location "^2.0.0"
+ xtend "^4.0.1"
+
remark-parse@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
@@ -9808,6 +11604,21 @@ remark-parse@^5.0.0:
vfile-location "^2.0.0"
xtend "^4.0.1"
+remove-bom-buffer@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53"
+ dependencies:
+ is-buffer "^1.1.5"
+ is-utf8 "^0.2.1"
+
+remove-bom-stream@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523"
+ dependencies:
+ remove-bom-buffer "^3.0.0"
+ safe-buffer "^5.1.0"
+ through2 "^2.0.3"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -9834,37 +11645,11 @@ replace-ext@1.0.0, replace-ext@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
-req-cwd@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-1.0.1.tgz#0d73aeae9266e697a78f7976019677e76acf0fff"
- dependencies:
- req-from "^1.0.1"
-
-req-from@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/req-from/-/req-from-1.0.1.tgz#bf81da5147947d32d13b947dc12a58ad4587350e"
- dependencies:
- resolve-from "^2.0.0"
-
request-ip@~1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-1.2.3.tgz#66988f0e22406ec4af630d19b573fe4b447c3b49"
-request-promise-core@1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
- dependencies:
- lodash "^4.13.1"
-
-request-promise-native@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
- dependencies:
- request-promise-core "1.1.1"
- stealthy-require "^1.1.0"
- tough-cookie ">=2.3.3"
-
-request@2.81.0:
+request@2.81.0, "request@>=2.9.0 <2.82.0":
version "2.81.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
dependencies:
@@ -9891,7 +11676,7 @@ request@2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.0.0"
-request@^2.54.0, request@^2.67.0, request@^2.79.0, request@^2.81.0:
+request@^2.54.0, request@^2.67.0, request@^2.79.0:
version "2.85.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa"
dependencies:
@@ -9918,25 +11703,61 @@ request@^2.54.0, request@^2.67.0, request@^2.79.0, request@^2.81.0:
tunnel-agent "^0.6.0"
uuid "^3.1.0"
+request@^2.85.0:
+ version "2.87.0"
+ resolved "https://registry.npmjs.org/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.6.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.5"
+ extend "~3.0.1"
+ forever-agent "~0.6.1"
+ form-data "~2.3.1"
+ har-validator "~5.0.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.17"
+ oauth-sign "~0.8.2"
+ performance-now "^2.1.0"
+ qs "~6.5.1"
+ safe-buffer "^5.1.1"
+ tough-cookie "~2.3.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.1.0"
+
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+require-from-string@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+
require-from-string@^1.1.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
require-from-string@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff"
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
require-main-filename@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
-require-relative@^0.8.7:
- version "0.8.7"
- resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
+require-package-name@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9"
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0:
version "1.0.0"
@@ -9955,10 +11776,14 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1:
expand-tilde "^2.0.0"
global-modules "^1.0.0"
-resolve-from@4.0.0:
+resolve-from@4.0.0, resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
@@ -9967,6 +11792,12 @@ resolve-from@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+resolve-options@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131"
+ dependencies:
+ value-or-function "^3.0.0"
+
resolve-pathname@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
@@ -9980,8 +11811,8 @@ resolve@1.1.x:
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c"
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3"
dependencies:
path-parse "^1.0.5"
@@ -10021,13 +11852,17 @@ ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+revalidator@0.1.x:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
+
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
dependencies:
align-text "^0.1.1"
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
dependencies:
@@ -10048,6 +11883,18 @@ rlp@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.0.0.tgz#9db384ff4b89a8f61563d92395d8625b18f3afb0"
+rollbar-sourcemap-webpack-plugin@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/rollbar-sourcemap-webpack-plugin/-/rollbar-sourcemap-webpack-plugin-2.3.0.tgz#47176fd6441d1ce17b4d3c7e9c9cf7f2076b0485"
+ dependencies:
+ async "^2.6.0"
+ babel-runtime "^6.26.0"
+ lodash.find "^4.3.0"
+ lodash.foreach "^4.2.0"
+ lodash.reduce "^4.3.0"
+ request "^2.85.0"
+ verror "^1.6.1"
+
rollbar@^0.6.5:
version "0.6.6"
resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-0.6.6.tgz#8630cff4af967667d06b227f243635ea86dcc5ba"
@@ -10073,6 +11920,10 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
+run-s@^0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/run-s/-/run-s-0.0.0.tgz#599912be20c00ba7698655c9936d075d31b71754"
+
rustbn.js@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.1.2.tgz#979fa0f9562216dd667c9d2cd179ae5d13830eff"
@@ -10091,9 +11942,15 @@ rx@^2.4.3:
version "2.5.3"
resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566"
+rxjs@^5.0.0-beta.11:
+ version "5.5.11"
+ resolved "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87"
+ dependencies:
+ symbol-observable "1.0.1"
+
rxjs@^5.4.2, rxjs@^5.5.2:
- version "5.5.8"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.8.tgz#b2b0809a57614ad6254c03d7446dea0d83ca3791"
+ version "5.5.10"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.10.tgz#fde02d7a614f6c8683d0d1957827f492e09db045"
dependencies:
symbol-observable "1.0.1"
@@ -10101,12 +11958,20 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+safe-buffer@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
safe-regex@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
dependencies:
ret "~0.1.10"
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
samsam@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50"
@@ -10120,7 +11985,11 @@ sanitize-html@1.15.0:
srcset "^1.0.0"
xtend "^4.0.0"
-sax@^1.2.4, sax@~1.2.1:
+sax@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
+
+sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@@ -10135,18 +12004,13 @@ scoped-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8"
-scroll-to-element@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/scroll-to-element/-/scroll-to-element-2.0.0.tgz#3467330e3384743b7295ac64b30279990c5ac164"
- dependencies:
- scroll-to "0.0.2"
+scrypt-async@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/scrypt-async/-/scrypt-async-1.3.1.tgz#a11fd6fac981b4b823ee01dee0221169500ddae9"
-scroll-to@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/scroll-to/-/scroll-to-0.0.2.tgz#936d398a9133660a2492145c2c0081dfcb0728f3"
- dependencies:
- component-raf "1.2.0"
- component-tween "1.2.0"
+scrypt-js@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4"
scrypt.js@0.2.0, scrypt.js@^0.2.0:
version "0.2.0"
@@ -10194,6 +12058,10 @@ select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+select@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
+
selfsigned@^1.9.1:
version "1.10.2"
resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758"
@@ -10225,14 +12093,14 @@ semver-sort@0.0.4:
semver "^5.0.3"
semver-regex "^1.0.0"
-"semver@2 || 3 || 4 || 5", semver@5.5.0, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
-
-semver@5.4.1, semver@~5.4.1:
+"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@~5.4.1:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+"semver@2.x || 3.x || 4 || 5", semver@5.5.0, semver@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
semver@^4.1.0:
version "4.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
@@ -10241,6 +12109,10 @@ semver@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19"
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "http://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
send@0.16.2:
version "0.16.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
@@ -10272,8 +12144,8 @@ serialised-error@1.1.2:
stack-trace "0.0.9"
serialize-javascript@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005"
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
serve-index@^1.7.2:
version "1.9.1"
@@ -10332,6 +12204,10 @@ set-value@^2.0.0:
is-plain-object "^2.0.3"
split-string "^3.0.1"
+setimmediate@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f"
+
setimmediate@^1.0.4, setimmediate@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
@@ -10352,15 +12228,19 @@ sha.js@^2.4.0, sha.js@^2.4.8:
safe-buffer "^5.0.1"
sha3@^1.1.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.0.tgz#6989f1b70a498705876a373e2c62ace96aa9399a"
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/sha3/-/sha3-1.2.2.tgz#a66c5098de4c25bc88336ec8b4817d005bca7ba9"
dependencies:
- nan "^2.0.5"
+ nan "2.10.0"
shallowequal@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.2.tgz#1561dbdefb8c01408100319085764da3fcf83f8f"
+shallowequal@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -10375,7 +12255,7 @@ shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
-shell-quote@^1.6.1:
+shell-quote@^1.4.3, shell-quote@^1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
dependencies:
@@ -10392,7 +12272,7 @@ shelljs@0.8.0:
interpret "^1.0.0"
rechoir "^0.6.2"
-shelljs@^0.7.0, shelljs@^0.7.3, shelljs@^0.7.4:
+shelljs@^0.7.0, shelljs@^0.7.3:
version "0.7.8"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
dependencies:
@@ -10400,7 +12280,15 @@ shelljs@^0.7.0, shelljs@^0.7.3, shelljs@^0.7.4:
interpret "^1.0.0"
rechoir "^0.6.2"
-shelljs@^0.8.0, shelljs@^0.8.1:
+shelljs@^0.8.0:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35"
+ dependencies:
+ glob "^7.0.0"
+ interpret "^1.0.0"
+ rechoir "^0.6.2"
+
+shelljs@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.1.tgz#729e038c413a2254c4078b95ed46e0397154a9f1"
dependencies:
@@ -10445,8 +12333,8 @@ single-line-log@^0.4.1:
resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-0.4.1.tgz#87a55649f749d783ec0dcd804e8140d9873c7cee"
sinon@^4.0.0:
- version "4.4.9"
- resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.4.9.tgz#0792a2a5171eb0cf242edacb0eba3898b8b4297f"
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04"
dependencies:
"@sinonjs/formatio" "^2.0.0"
diff "^3.1.0"
@@ -10460,14 +12348,30 @@ slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+sleep@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/sleep/-/sleep-5.1.1.tgz#878fa1d44d08eeb0f26fb2018ef8629eb1a3ab94"
+ dependencies:
+ nan ">=2.5.1"
+
slice-ansi@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
-slide@^1.1.5:
+slice-ansi@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+
+slide@^1.1.5, slide@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+slugify@^1.2.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/slugify/-/slugify-1.3.1.tgz#f572127e8535329fbc6c1edb74ab856b61ad7de2"
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -10525,13 +12429,19 @@ sockjs@0.3.19:
faye-websocket "^0.10.0"
uuid "^3.0.1"
-sol-explore@^1.6.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/sol-explore/-/sol-explore-1.6.2.tgz#43ae8c419fd3ac056a05f8a9d1fb1022cd41ecc2"
+solc@0.4.23, solc@^0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.23.tgz#54a0ff4015827b32fddb62c0a418b5247310a58e"
+ dependencies:
+ fs-extra "^0.30.0"
+ memorystream "^0.3.1"
+ require-from-string "^1.1.0"
+ semver "^5.3.0"
+ yargs "^4.7.1"
-solc@0.4.18:
- version "0.4.18"
- resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.18.tgz#83ac6d871dd16a9710e67dbb76dad7f614100702"
+solc@0.4.24, solc@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.24.tgz#354f14b269b38cbaa82a47d1ff151723502b954e"
dependencies:
fs-extra "^0.30.0"
memorystream "^0.3.1"
@@ -10539,7 +12449,7 @@ solc@0.4.18:
semver "^5.3.0"
yargs "^4.7.1"
-solc@^0.4.18, solc@^0.4.2:
+solc@^0.4.2:
version "0.4.21"
resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.21.tgz#6a7ecd505bfa0fc268330d5de6b9ae65c8c68264"
dependencies:
@@ -10549,31 +12459,20 @@ solc@^0.4.18, solc@^0.4.2:
semver "^5.3.0"
yargs "^4.7.1"
-solidity-coverage@^0.4.10:
- version "0.4.14"
- resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.4.14.tgz#fe0eb49233196b1b9ec900a41ca9c3de526983a6"
+solhint@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/solhint/-/solhint-1.2.1.tgz#59a1416cef94da38d587f768a73536d6e3403dd3"
dependencies:
- death "^1.1.0"
- ethereumjs-testrpc-sc "6.1.2"
- istanbul "^0.4.5"
- keccakjs "^0.2.1"
- req-cwd "^1.0.1"
- shelljs "^0.7.4"
- sol-explore "^1.6.2"
- solidity-parser-sc "0.4.6"
- web3 "^0.18.4"
-
-solidity-parser-antlr@^0.2.7:
- version "0.2.8"
- resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.2.8.tgz#8eb8547a88dfeaf6cf4c7811e3824084214244d4"
+ antlr4 "4.7.0"
+ commander "2.11.0"
+ eslint "^4.19.1"
+ glob "7.1.2"
+ ignore "^3.3.7"
+ lodash "^4.17.10"
-solidity-parser-sc@0.4.6, solidity-parser-sc@^0.4.4:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/solidity-parser-sc/-/solidity-parser-sc-0.4.6.tgz#e3a8d2ac887b89992582cbb20794eaa9b299e6a0"
- dependencies:
- mocha "^2.4.5"
- pegjs "^0.10.0"
- yargs "^4.6.0"
+solidity-parser-antlr@^0.2.12:
+ version "0.2.12"
+ resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.2.12.tgz#1154f183d5cdda2c7677549ee584dbdb7fb2269c"
sort-keys@^1.0.0:
version "1.1.2"
@@ -10627,6 +12526,13 @@ source-map-support@0.4.14:
dependencies:
source-map "^0.5.6"
+source-map-support@0.5.6, source-map-support@^0.5.6:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map-support@^0.4.15:
version "0.4.18"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
@@ -10649,7 +12555,7 @@ source-map@0.1.x, source-map@~0.1.33:
dependencies:
amdefine ">=0.0.4"
-source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@@ -10741,7 +12647,7 @@ split-string@^3.0.1, split-string@^3.0.2:
split2@^2.0.0:
version "2.2.0"
- resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
+ resolved "http://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
dependencies:
through2 "^2.0.2"
@@ -10751,7 +12657,7 @@ split@0.3:
dependencies:
through "2"
-split@^1.0.0:
+split@^1.0.0, split@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
dependencies:
@@ -10792,7 +12698,7 @@ stack-trace@0.0.9:
version "0.0.9"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695"
-stack-trace@~0.0.9:
+stack-trace@0.0.x, stack-trace@~0.0.9:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
@@ -10807,13 +12713,17 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
-"statuses@>= 1.3.1 < 2", statuses@~1.4.0:
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
+statuses@~1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
-stealthy-require@^1.1.0:
+stickyfill@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ resolved "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz#39413fee9d025c74a7e59ceecb23784cc0f17f02"
stream-browserify@^2.0.1:
version "2.0.1"
@@ -10859,6 +12769,10 @@ stream-shift@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+stream-to-observable@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe"
+
stream-to-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
@@ -10880,6 +12794,10 @@ strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+strict-uri-encode@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+
string-editor@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/string-editor/-/string-editor-0.1.2.tgz#f5ff1b5ac4aed7ac6c2fb8de236d1551b20f61d0"
@@ -10921,9 +12839,9 @@ string.prototype.trim@~1.1.2:
es-abstract "^1.5.0"
function-bind "^1.0.2"
-string_decoder@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.0.tgz#384f322ee8a848e500effde99901bba849c5d403"
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
dependencies:
safe-buffer "~5.1.0"
@@ -10931,12 +12849,6 @@ string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
-string_decoder@~1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
- dependencies:
- safe-buffer "~5.1.0"
-
stringstream@~0.0.4, stringstream@~0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -10963,13 +12875,6 @@ strip-ansi@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
-strip-bom-stream@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee"
- dependencies:
- first-chunk-stream "^1.0.0"
- strip-bom "^2.0.0"
-
strip-bom-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
@@ -11018,7 +12923,7 @@ strip-indent@^1.0.1:
strip-indent@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+ resolved "http://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
version "2.0.1"
@@ -11026,7 +12931,7 @@ strip-json-comments@2.0.1, strip-json-comments@~2.0.1:
strong-log-transformer@^1.0.6:
version "1.0.6"
- resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3"
+ resolved "http://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3"
dependencies:
byline "^5.0.0"
duplexer "^0.1.1"
@@ -11047,15 +12952,42 @@ style-loader@^0.20.2:
loader-utils "^1.1.0"
schema-utils "^0.4.5"
-supports-color@1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e"
+styled-components@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/styled-components/-/styled-components-3.3.0.tgz#335b1b2b673b416cd5ec012010e237ed1f877fe9"
+ dependencies:
+ buffer "^5.0.3"
+ css-to-react-native "^2.0.3"
+ fbjs "^0.8.16"
+ hoist-non-react-statics "^2.5.0"
+ is-plain-object "^2.0.1"
+ prop-types "^15.5.4"
+ react-is "^16.3.1"
+ stylis "^3.5.0"
+ stylis-rule-sheet "^0.0.10"
+ supports-color "^3.2.3"
-supports-color@3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5"
+styled-components@^3.3.3:
+ version "3.4.2"
+ resolved "https://registry.npmjs.org/styled-components/-/styled-components-3.4.2.tgz#8f518419932327e47fe9144824e3184b3e2da95d"
dependencies:
- has-flag "^1.0.0"
+ buffer "^5.0.3"
+ css-to-react-native "^2.0.3"
+ fbjs "^0.8.16"
+ hoist-non-react-statics "^2.5.0"
+ prop-types "^15.5.4"
+ react-is "^16.3.1"
+ stylis "^3.5.0"
+ stylis-rule-sheet "^0.0.10"
+ supports-color "^3.2.3"
+
+stylis-rule-sheet@^0.0.10:
+ version "0.0.10"
+ resolved "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
+
+stylis@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz#016fa239663d77f868fef5b67cf201c4b7c701e1"
supports-color@4.4.0:
version "4.4.0"
@@ -11063,6 +12995,12 @@ supports-color@4.4.0:
dependencies:
has-flag "^2.0.0"
+supports-color@5.4.0, supports-color@^5.1.0, supports-color@^5.2.0, supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -11079,12 +13017,6 @@ supports-color@^4.2.1:
dependencies:
has-flag "^2.0.0"
-supports-color@^5.1.0, supports-color@^5.2.0, supports-color@^5.3.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0"
- dependencies:
- has-flag "^3.0.0"
-
svgo@^0.7.0:
version "0.7.2"
resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -11097,17 +13029,36 @@ svgo@^0.7.0:
sax "~1.2.1"
whet.extend "~0.9.9"
-svgo@~0.6.3:
- version "0.6.6"
- resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08"
+swagger-cli@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/swagger-cli/-/swagger-cli-2.1.1.tgz#f91748e9dabbd659091228af6bb86529d6d12d2a"
dependencies:
- coa "~1.0.1"
- colors "~1.1.2"
- csso "~2.0.0"
- js-yaml "~3.6.0"
- mkdirp "~0.5.1"
- sax "~1.2.1"
- whet.extend "~0.9.9"
+ chalk "^2.4.1"
+ js-yaml "^3.12.0"
+ mkdirp "^0.5.1"
+ swagger-parser "^5.0.1"
+ yargs "^12.0.1"
+
+swagger-methods@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.4.tgz#2c5b844f4a22ab2f5e773f98193c28e386b1c37e"
+
+swagger-parser@^5.0.1:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/swagger-parser/-/swagger-parser-5.0.2.tgz#8ff382dd7b2ce39d8ad68b9d56ee9973abfb7f19"
+ dependencies:
+ call-me-maybe "^1.0.1"
+ debug "^3.1.0"
+ json-schema-ref-parser "^5.1.1"
+ ono "^4.0.5"
+ openapi-schema-validation "^0.4.1"
+ swagger-methods "^1.0.4"
+ swagger-schema-official "2.0.0-bab6bed"
+ z-schema "^3.19.1"
+
+swagger-schema-official@2.0.0-bab6bed:
+ version "2.0.0-bab6bed"
+ resolved "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz#70070468d6d2977ca5237b2e519ca7d06a2ea3fd"
swarm-js@0.1.37:
version "0.1.37"
@@ -11135,7 +13086,7 @@ symbol-observable@^0.2.2:
version "0.2.4"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
-symbol-observable@^1.0.3, symbol-observable@^1.0.4:
+symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
@@ -11143,6 +13094,17 @@ symbol@~0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.3.1.tgz#b6f9a900d496a57f02408f22198c109dda063041"
+table@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+ dependencies:
+ ajv "^5.2.3"
+ ajv-keywords "^2.1.0"
+ chalk "^2.1.0"
+ lodash "^4.17.4"
+ slice-ansi "1.0.0"
+ string-width "^2.1.1"
+
tapable@^0.2.5, tapable@^0.2.7:
version "0.2.8"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
@@ -11151,7 +13113,7 @@ tapable@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
-tape@^4.4.0, tape@^4.6.3:
+tape@^4.4.0, tape@^4.6.3, tape@^4.8.0:
version "4.9.0"
resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a"
dependencies:
@@ -11210,7 +13172,7 @@ tar.gz@^1.0.5:
mout "^0.11.0"
tar "^2.1.1"
-tar@^2.1.1, tar@^2.2.1:
+tar@^2.0.0, tar@^2.1.1, tar@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
dependencies:
@@ -11218,9 +13180,21 @@ tar@^2.1.1, tar@^2.2.1:
fstream "^1.0.2"
inherits "2"
+tar@^4:
+ version "4.4.6"
+ resolved "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
temp-dir@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+ resolved "http://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
temp-write@^2.1.0:
version "2.1.0"
@@ -11233,9 +13207,9 @@ temp-write@^2.1.0:
pinkie-promise "^2.0.0"
uuid "^2.0.1"
-temp-write@^3.3.0:
+temp-write@^3.4.0:
version "3.4.0"
- resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
+ resolved "http://registry.yarnpkg.com/temp-write/-/temp-write-3.4.0.tgz#8cff630fb7e9da05f047c74ce4ce4d685457d492"
dependencies:
graceful-fs "^4.1.2"
is-stream "^1.1.0"
@@ -11251,13 +13225,6 @@ temp@^0.8.1, temp@^0.8.3:
os-tmpdir "^1.0.0"
rimraf "~2.2.6"
-tempfile@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2"
- dependencies:
- os-tmpdir "^1.0.0"
- uuid "^2.0.1"
-
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
@@ -11280,9 +13247,9 @@ text-encoding@^0.6.4:
text-extensions@^1.0.0:
version "1.7.0"
- resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39"
+ resolved "http://registry.yarnpkg.com/text-extensions/-/text-extensions-1.7.0.tgz#faaaba2625ed746d568a23e4d0aacd9bf08a8b39"
-text-table@^0.2.0:
+text-table@^0.2.0, text-table@~0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
@@ -11306,6 +13273,10 @@ thenify-all@^1.0.0, thenify-all@^1.6.0:
dependencies:
any-promise "^1.0.0"
+throat@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+
through2-filter@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec"
@@ -11313,14 +13284,14 @@ through2-filter@^2.0.0:
through2 "~2.0.0"
xtend "~4.0.0"
-through2@^0.6.0, through2@^0.6.1, through2@~0.6.3:
+through2@^0.6.1, through2@~0.6.3:
version "0.6.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48"
dependencies:
readable-stream ">=1.0.33-1 <1.1.0-0"
xtend ">=4.0.0 <4.1.0-0"
-through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@~2.0.0:
+through2@^2.0.0, through2@^2.0.1, through2@^2.0.2, through2@^2.0.3, through2@~2.0.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
@@ -11361,11 +13332,15 @@ timed-out@^4.0.0, timed-out@^4.0.1:
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
timers-browserify@^2.0.4:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae"
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
dependencies:
setimmediate "^1.0.4"
+tiny-emitter@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
+
tiny-queue@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.0.tgz#c49fcb5c87555be1b4a5df7eb87101d5b78bc9dc"
@@ -11382,11 +13357,12 @@ tmp@^0.0.33:
dependencies:
os-tmpdir "~1.0.2"
-to-absolute-glob@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f"
+to-absolute-glob@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b"
dependencies:
- extend-shallow "^2.0.1"
+ is-absolute "^1.0.0"
+ is-negated-glob "^1.0.0"
to-arraybuffer@^1.0.0:
version "1.0.1"
@@ -11396,10 +13372,6 @@ to-fast-properties@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
-to-iso-string@0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1"
-
to-no-case@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a"
@@ -11438,6 +13410,12 @@ to-space-case@^1.0.0:
dependencies:
to-no-case "^1.0.0"
+to-through@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6"
+ dependencies:
+ through2 "^2.0.3"
+
toggle-selection@^1.0.3:
version "1.0.6"
resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
@@ -11448,7 +13426,7 @@ touch@^3.1.0:
dependencies:
nopt "~1.0.10"
-tough-cookie@>=2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+tough-cookie@~2.3.0, tough-cookie@~2.3.3:
version "2.3.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
dependencies:
@@ -11458,17 +13436,21 @@ traverse-chain@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1"
+treeify@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
+
trim-newlines@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
trim-newlines@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
+ resolved "http://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20"
trim-off-newlines@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
+ resolved "http://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
trim-right@^1.0.1:
version "1.0.1"
@@ -11483,8 +13465,8 @@ trim@0.0.1:
resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
trough@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86"
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535"
truffle-blockchain-utils@0.0.1:
version "0.0.1"
@@ -11507,19 +13489,27 @@ truffle-contract@2.0.1:
truffle-contract-schema "0.0.5"
web3 "^0.18.0"
-truffle-hdwallet-provider@^0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/truffle-hdwallet-provider/-/truffle-hdwallet-provider-0.0.3.tgz#0e1de02104b73d3875e1cf7093305b4ea8a2d843"
+ts-node@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff"
dependencies:
- bip39 "^2.2.0"
- ethereumjs-wallet "^0.6.0"
- web3 "^0.18.2"
- web3-provider-engine "^8.4.0"
+ arrify "^1.0.0"
+ buffer-from "^1.1.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.6"
+ yn "^2.0.0"
-tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
+tslib@^1.0.0, tslib@^1.8.0, tslib@^1.8.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
+tslib@^1.9.0, tslib@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
tslint-config-0xproject@^0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/tslint-config-0xproject/-/tslint-config-0xproject-0.0.2.tgz#39901e0c0b3e9388f00092a28b90c015395d5bba"
@@ -11540,21 +13530,22 @@ tslint-react@^3.0.0, tslint-react@^3.2.0:
dependencies:
tsutils "^2.13.1"
-tslint@5.8.0:
- version "5.8.0"
- resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13"
+tslint@5.11.0:
+ version "5.11.0"
+ resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed"
dependencies:
babel-code-frame "^6.22.0"
builtin-modules "^1.1.1"
- chalk "^2.1.0"
- commander "^2.9.0"
+ chalk "^2.3.0"
+ commander "^2.12.1"
diff "^3.2.0"
glob "^7.1.1"
+ js-yaml "^3.7.0"
minimatch "^3.0.4"
resolve "^1.3.2"
semver "^5.3.0"
- tslib "^1.7.1"
- tsutils "^2.12.1"
+ tslib "^1.8.0"
+ tsutils "^2.27.2"
tslint@^5.9.1:
version "5.9.1"
@@ -11573,13 +13564,25 @@ tslint@^5.9.1:
tslib "^1.8.0"
tsutils "^2.12.1"
+tsutils@2.22.2:
+ version "2.22.2"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.22.2.tgz#0b9f3d87aa3eb95bd32d26ce2b88aa329a657951"
+ dependencies:
+ tslib "^1.8.1"
+
tsutils@^1.4.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0"
tsutils@^2.12.1, tsutils@^2.13.1:
- version "2.22.2"
- resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.22.2.tgz#0b9f3d87aa3eb95bd32d26ce2b88aa329a657951"
+ version "2.26.1"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.26.1.tgz#9e4a0cb9ff173863f34c22a961969081270d1878"
+ dependencies:
+ tslib "^1.8.1"
+
+tsutils@^2.27.2:
+ version "2.27.2"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
dependencies:
tslib "^1.8.1"
@@ -11593,6 +13596,10 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"
+tweetnacl@0.13.2:
+ version "0.13.2"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.13.2.tgz#453161770469d45cd266c36404e2bc99a8fa9944"
+
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -11622,6 +13629,10 @@ type-is@~1.6.15, type-is@~1.6.16:
media-typer "0.3.0"
mime-types "~2.1.18"
+typed-styles@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.5.tgz#a60df245d482a9b1adf9c06c078d0f06085ed1cf"
+
typedarray-to-buffer@^3.1.2:
version "3.1.5"
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
@@ -11686,21 +13697,6 @@ types-bn@^0.0.1:
dependencies:
bn.js "4.11.7"
-"types-bn@https://github.com/machinomy/types-bn.git":
- version "0.0.1"
- resolved "https://github.com/machinomy/types-bn.git#08ede69e138640d332b0dae0dc2e2fffee5f7160"
- dependencies:
- bn.js "4.11.7"
-
-types-ethereumjs-util@0xProject/types-ethereumjs-util:
- version "0.0.7"
- resolved "https://codeload.github.com/0xProject/types-ethereumjs-util/tar.gz/72722fc605bfa7f87ec4a959956b387320479ffc"
- dependencies:
- bn.js "^4.11.7"
- buffer "^5.0.6"
- rlp "^2.0.0"
- types-bn "https://github.com/machinomy/types-bn.git"
-
typescript@2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.1.tgz#c3ccb16ddaa0b2314de031e7e6fee89e5ba346bc"
@@ -11709,6 +13705,10 @@ typescript@2.7.1:
version "2.7.1"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.1.tgz#bb3682c2c791ac90e7c6210b26478a8da085c359"
+typescript@2.9.2:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
+
typewise-core@^1.2, typewise-core@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195"
@@ -11731,6 +13731,13 @@ ua-parser-js@^0.7.9:
version "0.7.17"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
+uglify-es@^3.3.4:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
uglify-js@^2.6, uglify-js@^2.8.29:
version "2.8.29"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
@@ -11752,7 +13759,20 @@ uglifyjs-webpack-plugin@^0.4.6:
uglify-js "^2.8.29"
webpack-sources "^1.0.1"
-uid-number@^0.0.6:
+uglifyjs-webpack-plugin@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz#2ef8387c8f1a903ec5e44fa36f9f3cbdcea67641"
+ dependencies:
+ cacache "^10.0.4"
+ find-cache-dir "^1.0.0"
+ schema-utils "^0.4.5"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ uglify-es "^3.3.4"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+uid-number@0.0.6, uid-number@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
@@ -11760,6 +13780,10 @@ ultron@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"
+umask@^1.1.0:
+ version "1.1.0"
+ resolved "http://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
+
unbzip2-stream@^1.0.9:
version "1.2.5"
resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47"
@@ -11880,6 +13904,12 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0:
dependencies:
unist-util-is "^2.1.1"
+unist-util-visit@^1.1.3:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.1.tgz#c019ac9337a62486be58531bc27e7499ae7d55c7"
+ dependencies:
+ unist-util-is "^2.1.1"
+
universalify@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
@@ -11912,8 +13942,8 @@ upath@^1.0.0:
resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
update-notifier@^2.3.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.4.0.tgz#f9b4c700fbfd4ec12c811587258777d563d8c866"
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
dependencies:
boxen "^1.2.1"
chalk "^2.0.1"
@@ -11956,8 +13986,8 @@ url-parse@1.0.x:
requires-port "1.0.x"
url-parse@^1.1.8:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986"
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.3.0.tgz#04a06c420d22beb9804f7ada2d57ad13160a4258"
dependencies:
querystringify "~1.0.0"
requires-port "~1.0.0"
@@ -11970,6 +14000,13 @@ url-to-options@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+url@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
url@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -11977,18 +14014,6 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
-urlencode@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/urlencode/-/urlencode-1.1.0.tgz#1f2ba26f013c85f0133f7a3ad6ff2730adf7cbb7"
- dependencies:
- iconv-lite "~0.4.11"
-
-urllite@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/urllite/-/urllite-0.5.0.tgz#1b7bb9ca3fb0db9520de113466bbcf7cc341451a"
- dependencies:
- xtend "~4.0.0"
-
use@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544"
@@ -12021,6 +14046,17 @@ util@0.10.3, util@^0.10.3:
dependencies:
inherits "2.0.1"
+utile@0.3.x:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a"
+ dependencies:
+ async "~0.9.0"
+ deep-equal "~0.2.1"
+ i "0.3.x"
+ mkdirp "0.x.x"
+ ncp "1.0.x"
+ rimraf "2.x.x"
+
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
@@ -12037,14 +14073,14 @@ uuid@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+uuid@3.2.1, uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+
uuid@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
-uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
-
uvm@1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/uvm/-/uvm-1.7.0.tgz#685d3a149ec7118fb73a73dfdc158ab46b0f0634"
@@ -12064,25 +14100,35 @@ v8flags@^2.0.2:
dependencies:
user-home "^1.1.1"
-vali-date@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6"
-
-valid-url@^1.0.9:
+valid-url@1.0.9, valid-url@^1.0.9:
version "1.0.9"
resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
-validate-npm-package-license@^3.0.1:
+validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
dependencies:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
+validate-npm-package-name@^3.0.0:
+ version "3.0.0"
+ resolved "http://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+ dependencies:
+ builtins "^1.0.3"
+
+validator@^10.0.0:
+ version "10.5.0"
+ resolved "https://registry.npmjs.org/validator/-/validator-10.5.0.tgz#1debbe1e6f5fd0c920ed2af47516f3762033939c"
+
value-equal@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
+value-or-function@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
+
vary@^1, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -12091,7 +14137,7 @@ vendors@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
-verror@1.10.0:
+verror@1.10.0, verror@^1.6.1:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
dependencies:
@@ -12142,27 +14188,39 @@ vinyl-fs@^0.3.0:
through2 "^0.6.1"
vinyl "^0.4.0"
-vinyl-fs@^2.4.3:
- version "2.4.4"
- resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239"
+vinyl-fs@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7"
dependencies:
- duplexify "^3.2.0"
- glob-stream "^5.3.2"
+ fs-mkdirp-stream "^1.0.0"
+ glob-stream "^6.1.0"
graceful-fs "^4.0.0"
- gulp-sourcemaps "1.6.0"
- is-valid-glob "^0.3.0"
+ is-valid-glob "^1.0.0"
lazystream "^1.0.0"
- lodash.isequal "^4.0.0"
- merge-stream "^1.0.0"
- mkdirp "^0.5.0"
- object-assign "^4.0.0"
- readable-stream "^2.0.4"
- strip-bom "^2.0.0"
- strip-bom-stream "^1.0.0"
+ lead "^1.0.0"
+ object.assign "^4.0.4"
+ pumpify "^1.3.5"
+ readable-stream "^2.3.3"
+ remove-bom-buffer "^3.0.0"
+ remove-bom-stream "^1.2.0"
+ resolve-options "^1.1.0"
through2 "^2.0.0"
- through2-filter "^2.0.0"
- vali-date "^1.0.0"
- vinyl "^1.0.0"
+ to-through "^2.0.0"
+ value-or-function "^3.0.0"
+ vinyl "^2.0.0"
+ vinyl-sourcemap "^1.1.0"
+
+vinyl-sourcemap@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16"
+ dependencies:
+ append-buffer "^1.0.2"
+ convert-source-map "^1.5.0"
+ graceful-fs "^4.1.6"
+ normalize-path "^2.1.1"
+ now-and-later "^2.0.0"
+ remove-bom-buffer "^3.0.0"
+ vinyl "^2.0.0"
vinyl@^0.4.0:
version "0.4.6"
@@ -12179,7 +14237,7 @@ vinyl@^0.5.0:
clone-stats "^0.0.1"
replace-ext "0.0.1"
-vinyl@^1.0.0, vinyl@^1.1.0:
+vinyl@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884"
dependencies:
@@ -12187,7 +14245,7 @@ vinyl@^1.0.0, vinyl@^1.1.0:
clone-stats "^0.0.1"
replace-ext "0.0.1"
-vinyl@^2.0.0, vinyl@^2.0.1:
+vinyl@^2.0.0, vinyl@^2.0.1, vinyl@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
dependencies:
@@ -12204,6 +14262,10 @@ vm-browserify@0.0.4:
dependencies:
indexof "0.0.1"
+walkdir@0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532"
+
warning@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
@@ -12226,13 +14288,13 @@ wbuf@^1.1.0, wbuf@^1.7.2:
wcwidth@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ resolved "http://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
dependencies:
defaults "^1.0.3"
-web3-bzz@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.33.tgz#31500f699b7e70edf51490c55effb427bfbb3b01"
+web3-bzz@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.0.0-beta.34.tgz#068d37777ab65e5c60f8ec8b9a50cfe45277929c"
dependencies:
got "7.1.0"
swarm-js "0.1.37"
@@ -12246,51 +14308,59 @@ web3-core-helpers@1.0.0-beta.33:
web3-eth-iban "1.0.0-beta.33"
web3-utils "1.0.0-beta.33"
-web3-core-method@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.33.tgz#ed8ec4c4afab21dc0989de3583684466522b6e86"
+web3-core-helpers@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.34.tgz#b168da00d3e19e156bc15ae203203dd4dfee2d03"
dependencies:
underscore "1.8.3"
- web3-core-helpers "1.0.0-beta.33"
- web3-core-promievent "1.0.0-beta.33"
- web3-core-subscriptions "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ web3-eth-iban "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
-web3-core-promievent@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.33.tgz#d1f5ebb601527dd496562c362176e558d972d358"
+web3-core-method@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.34.tgz#ec163c8a2c490fa02a7ec15559fa7307fc7cc6dd"
+ dependencies:
+ underscore "1.8.3"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-promievent "1.0.0-beta.34"
+ web3-core-subscriptions "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
+
+web3-core-promievent@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.34.tgz#a4f4fa6784bb293e82c60960ae5b56a94cd03edc"
dependencies:
any-promise "1.3.0"
eventemitter3 "1.1.1"
-web3-core-requestmanager@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.33.tgz#7a36c40354002dfb179ca2dbdb6a6012c9f719eb"
+web3-core-requestmanager@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.34.tgz#01f8f6cf2ae6b6f0b70c38bae1ef741b5bab215c"
dependencies:
underscore "1.8.3"
- web3-core-helpers "1.0.0-beta.33"
- web3-providers-http "1.0.0-beta.33"
- web3-providers-ipc "1.0.0-beta.33"
- web3-providers-ws "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-providers-http "1.0.0-beta.34"
+ web3-providers-ipc "1.0.0-beta.34"
+ web3-providers-ws "1.0.0-beta.34"
-web3-core-subscriptions@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.33.tgz#602875c9f4d5f4d0e1621462b5fc1ec19b35bde3"
+web3-core-subscriptions@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.34.tgz#9fed144033f221c3cf21060302ffdaf5ef2de2de"
dependencies:
eventemitter3 "1.1.1"
underscore "1.8.3"
- web3-core-helpers "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
-web3-core@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.33.tgz#f82ed525f5b66aecda95eeced3cad2bd695f7839"
+web3-core@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.34.tgz#121be8555e9fb00d2c5d05ddd3381d0c9e46987e"
dependencies:
- web3-core-helpers "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-core-requestmanager "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-core-requestmanager "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
-web3-eth-abi@1.0.0-beta.33, web3-eth-abi@^1.0.0-beta.24:
+web3-eth-abi@1.0.0-beta.33:
version "1.0.0-beta.33"
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.33.tgz#2221f7151643660032a4df340f612349168c824a"
dependencies:
@@ -12299,9 +14369,18 @@ web3-eth-abi@1.0.0-beta.33, web3-eth-abi@^1.0.0-beta.24:
web3-core-helpers "1.0.0-beta.33"
web3-utils "1.0.0-beta.33"
-web3-eth-accounts@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.33.tgz#25a8d7f4e58e1e993b92f0695482cccdc9212f91"
+web3-eth-abi@1.0.0-beta.34, web3-eth-abi@^1.0.0-beta.24:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.34.tgz#034533e3aa2f7e59ff31793eaea685c0ed5af67a"
+ dependencies:
+ bn.js "4.11.6"
+ underscore "1.8.3"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
+
+web3-eth-accounts@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.34.tgz#e09142eeecc797ac3459b75e9b23946d3695f333"
dependencies:
any-promise "1.3.0"
crypto-browserify "3.12.0"
@@ -12309,23 +14388,23 @@ web3-eth-accounts@1.0.0-beta.33:
scrypt.js "0.2.0"
underscore "1.8.3"
uuid "2.0.1"
- web3-core "1.0.0-beta.33"
- web3-core-helpers "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ web3-core "1.0.0-beta.34"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
-web3-eth-contract@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.33.tgz#9e5919f2917a3c67b4fb6569d49c5e3038925bce"
+web3-eth-contract@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.34.tgz#9dbb38fae7643a808427a20180470ec7415c91e6"
dependencies:
underscore "1.8.3"
- web3-core "1.0.0-beta.33"
- web3-core-helpers "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-core-promievent "1.0.0-beta.33"
- web3-core-subscriptions "1.0.0-beta.33"
- web3-eth-abi "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ web3-core "1.0.0-beta.34"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-core-promievent "1.0.0-beta.34"
+ web3-core-subscriptions "1.0.0-beta.34"
+ web3-eth-abi "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
web3-eth-iban@1.0.0-beta.33:
version "1.0.0-beta.33"
@@ -12334,115 +14413,129 @@ web3-eth-iban@1.0.0-beta.33:
bn.js "4.11.6"
web3-utils "1.0.0-beta.33"
-web3-eth-personal@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.33.tgz#b4e48587cc4e7eb018da26fde3b4f3ba5f9b98ef"
+web3-eth-iban@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.34.tgz#9af458605867ccf74ea979aaf326b38ba6a5ba0c"
dependencies:
- web3-core "1.0.0-beta.33"
- web3-core-helpers "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-net "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ bn.js "4.11.6"
+ web3-utils "1.0.0-beta.34"
-web3-eth@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.33.tgz#84a9f94da965527c92d838ad4e570df02589849f"
+web3-eth-personal@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.34.tgz#9afba167342ebde5420bcd5895c3f6c34388f205"
dependencies:
- underscore "1.8.3"
- web3-core "1.0.0-beta.33"
- web3-core-helpers "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-core-subscriptions "1.0.0-beta.33"
- web3-eth-abi "1.0.0-beta.33"
- web3-eth-accounts "1.0.0-beta.33"
- web3-eth-contract "1.0.0-beta.33"
- web3-eth-iban "1.0.0-beta.33"
- web3-eth-personal "1.0.0-beta.33"
- web3-net "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+ web3-core "1.0.0-beta.34"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-net "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
-web3-net@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.33.tgz#b6c90d1a0e1626eaae8b3d922ac153672fd56445"
+web3-eth@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.34.tgz#74086000850c6fe6f535ef49837d6d4bb6113268"
dependencies:
- web3-core "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
-
-web3-provider-engine@^13.0.1, web3-provider-engine@^13.6.5:
- version "13.6.6"
- resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-13.6.6.tgz#7d8972ffcd31e103bd2ce8a521b1b7da08cb173f"
+ underscore "1.8.3"
+ web3-core "1.0.0-beta.34"
+ web3-core-helpers "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-core-subscriptions "1.0.0-beta.34"
+ web3-eth-abi "1.0.0-beta.34"
+ web3-eth-accounts "1.0.0-beta.34"
+ web3-eth-contract "1.0.0-beta.34"
+ web3-eth-iban "1.0.0-beta.34"
+ web3-eth-personal "1.0.0-beta.34"
+ web3-net "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
+
+web3-net@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.34.tgz#427cea2f431881449c8e38d523290f173f9ff63d"
+ dependencies:
+ web3-core "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
+
+web3-provider-engine@14.0.6, web3-provider-engine@^14.0.6:
+ version "14.0.6"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0"
dependencies:
async "^2.5.0"
+ backoff "^2.5.0"
clone "^2.0.0"
- eth-block-tracker "^2.2.2"
+ cross-fetch "^2.1.0"
+ eth-block-tracker "^3.0.0"
+ eth-json-rpc-infura "^3.1.0"
eth-sig-util "^1.4.2"
ethereumjs-block "^1.2.2"
ethereumjs-tx "^1.2.0"
- ethereumjs-util "^5.1.1"
- ethereumjs-vm "^2.0.2"
- fetch-ponyfill "^4.0.0"
+ ethereumjs-util "^5.1.5"
+ ethereumjs-vm "^2.3.4"
json-rpc-error "^2.0.0"
json-stable-stringify "^1.0.1"
promise-to-callback "^1.0.0"
readable-stream "^2.2.9"
request "^2.67.0"
semaphore "^1.0.3"
- solc "^0.4.2"
tape "^4.4.0"
+ ws "^5.1.1"
xhr "^2.2.0"
xtend "^4.0.1"
-web3-provider-engine@^8.4.0:
- version "8.6.1"
- resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-8.6.1.tgz#4d86e19e30caaf97df351511ec0f60136e5b30eb"
+web3-provider-engine@^13.3.2:
+ version "13.8.0"
+ resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz#4c7c1ad2af5f1fe10343b8a65495879a2f9c00df"
dependencies:
- async "^2.1.2"
+ async "^2.5.0"
clone "^2.0.0"
+ eth-block-tracker "^2.2.2"
+ eth-sig-util "^1.4.2"
ethereumjs-block "^1.2.2"
ethereumjs-tx "^1.2.0"
- ethereumjs-util "^5.0.1"
+ ethereumjs-util "^5.1.1"
ethereumjs-vm "^2.0.2"
- isomorphic-fetch "^2.2.0"
+ fetch-ponyfill "^4.0.0"
+ json-rpc-error "^2.0.0"
+ json-stable-stringify "^1.0.1"
+ promise-to-callback "^1.0.0"
+ readable-stream "^2.2.9"
request "^2.67.0"
semaphore "^1.0.3"
solc "^0.4.2"
tape "^4.4.0"
- web3 "^0.16.0"
xhr "^2.2.0"
xtend "^4.0.1"
-web3-providers-http@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.33.tgz#3b35ae00ee7df5b96b4934962ad4a86f2a5599c1"
+web3-providers-http@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.0.0-beta.34.tgz#e561b52bbb43766282007d40285bfe3550c27e7a"
dependencies:
- web3-core-helpers "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
xhr2 "0.1.4"
-web3-providers-ipc@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.33.tgz#4f0adc9afe9d12c066e4be5c3c536f5073cb07c6"
+web3-providers-ipc@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.34.tgz#a1b77f1a306d73649a9c039052e40cb71328d00a"
dependencies:
oboe "2.1.3"
underscore "1.8.3"
- web3-core-helpers "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
-web3-providers-ws@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.33.tgz#8fddea42e19bbf2521ec879546457a623a9dc9ef"
+web3-providers-ws@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.34.tgz#7de70f1b83f2de36476772156becfef6e3516eb3"
dependencies:
underscore "1.8.3"
- web3-core-helpers "1.0.0-beta.33"
+ web3-core-helpers "1.0.0-beta.34"
websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible"
-web3-shh@1.0.0-beta.33:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.33.tgz#f99e26573f6e099321af0d9f2bfcfe3ded3550a1"
+web3-shh@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.34.tgz#975061d71eaec42ccee576f7bd8f70f03844afe0"
dependencies:
- web3-core "1.0.0-beta.33"
- web3-core-method "1.0.0-beta.33"
- web3-core-subscriptions "1.0.0-beta.33"
- web3-net "1.0.0-beta.33"
+ web3-core "1.0.0-beta.34"
+ web3-core-method "1.0.0-beta.34"
+ web3-core-subscriptions "1.0.0-beta.34"
+ web3-net "1.0.0-beta.34"
web3-typescript-typings@^0.10.2:
version "0.10.2"
@@ -12462,26 +14555,29 @@ web3-utils@1.0.0-beta.33:
underscore "1.8.3"
utf8 "2.1.1"
-web3@^0.16.0:
- version "0.16.0"
- resolved "https://registry.yarnpkg.com/web3/-/web3-0.16.0.tgz#a4554175cd462943035b1f1d39432f741c6b6019"
+web3-utils@1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.34.tgz#9411fc39aaef39ca4e06169f762297d9ff020970"
dependencies:
- bignumber.js "git+https://github.com/debris/bignumber.js#master"
- crypto-js "^3.1.4"
- utf8 "^2.1.1"
- xmlhttprequest "*"
+ bn.js "4.11.6"
+ eth-lib "0.1.27"
+ ethjs-unit "0.1.6"
+ number-to-bn "1.7.0"
+ randomhex "0.1.5"
+ underscore "1.8.3"
+ utf8 "2.1.1"
-web3@^0.18.0, web3@^0.18.2, web3@^0.18.4:
- version "0.18.4"
- resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d"
+web3@0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.2.tgz#c54dac5fc0e377399c04c1a6ecbb12e4513278d6"
dependencies:
- bignumber.js "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2"
+ bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git"
crypto-js "^3.1.4"
utf8 "^2.1.1"
xhr2 "*"
xmlhttprequest "*"
-web3@^0.20.0:
+web3@0.20.6:
version "0.20.6"
resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.6.tgz#3e97306ae024fb24e10a3d75c884302562215120"
dependencies:
@@ -12491,17 +14587,27 @@ web3@^0.20.0:
xhr2 "*"
xmlhttprequest "*"
-web3@^1.0.0-beta.30:
- version "1.0.0-beta.33"
- resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.33.tgz#c6021b5769927726371c184b868445311b139295"
- dependencies:
- web3-bzz "1.0.0-beta.33"
- web3-core "1.0.0-beta.33"
- web3-eth "1.0.0-beta.33"
- web3-eth-personal "1.0.0-beta.33"
- web3-net "1.0.0-beta.33"
- web3-shh "1.0.0-beta.33"
- web3-utils "1.0.0-beta.33"
+web3@^0.18.0:
+ version "0.18.4"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-0.18.4.tgz#81ec1784145491f2eaa8955b31c06049e07c5e7d"
+ dependencies:
+ bignumber.js "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2"
+ crypto-js "^3.1.4"
+ utf8 "^2.1.1"
+ xhr2 "*"
+ xmlhttprequest "*"
+
+web3@^1.0.0-beta.34:
+ version "1.0.0-beta.34"
+ resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.34.tgz#347e561b784098cb5563315f490479a1d91f2ab1"
+ dependencies:
+ web3-bzz "1.0.0-beta.34"
+ web3-core "1.0.0-beta.34"
+ web3-eth "1.0.0-beta.34"
+ web3-eth-personal "1.0.0-beta.34"
+ web3-net "1.0.0-beta.34"
+ web3-shh "1.0.0-beta.34"
+ web3-utils "1.0.0-beta.34"
webpack-addons@^1.1.5:
version "1.1.5"
@@ -12510,16 +14616,18 @@ webpack-addons@^1.1.5:
jscodeshift "^0.4.0"
webpack-cli@^2.0.9:
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.0.13.tgz#6e2bd9ef91345344737217e22e29001ad8537518"
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.3.tgz#65d166851abaa56067ef3f716b02a97ba6bbe84d"
dependencies:
chalk "^2.3.2"
cross-spawn "^6.0.5"
diff "^3.5.0"
enhanced-resolve "^4.0.0"
+ envinfo "^4.4.2"
glob-all "^3.1.0"
global-modules "^1.0.0"
got "^8.2.0"
+ import-local "^1.0.0"
inquirer "^5.1.0"
interpret "^1.0.4"
jscodeshift "^0.5.0"
@@ -12531,13 +14639,12 @@ webpack-cli@^2.0.9:
p-each-series "^1.0.0"
p-lazy "^1.0.0"
prettier "^1.5.3"
- resolve-cwd "^2.0.0"
supports-color "^5.3.0"
v8-compile-cache "^1.1.2"
webpack-addons "^1.1.5"
- yargs "^11.0.0"
+ yargs "^11.1.0"
yeoman-environment "^2.0.0"
- yeoman-generator "^2.0.3"
+ yeoman-generator "^2.0.4"
webpack-dev-middleware@1.12.2, webpack-dev-middleware@^1.10.0:
version "1.12.2"
@@ -12582,17 +14689,17 @@ webpack-dev-server@^2.11.1, webpack-dev-server@^2.5.0:
yargs "6.6.0"
webpack-node-externals@^1.6.0:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz#232c62ec6092b100635a3d29d83c1747128df9bd"
+ version "1.7.2"
+ resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3"
-webpack-sources@^1.0.1:
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
dependencies:
source-list-map "^2.0.0"
source-map "~0.6.1"
-webpack@^3.0.0, webpack@^3.1.0, webpack@^3.11.0:
+webpack@^3.1.0, webpack@^3.11.0:
version "3.11.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894"
dependencies:
@@ -12648,7 +14755,7 @@ websocket@^1.0.24, websocket@^1.0.25:
typedarray-to-buffer "^3.1.2"
yaeti "^0.0.6"
-whatwg-fetch@>=0.10.0, whatwg-fetch@^2.0.3:
+whatwg-fetch@2.0.3, whatwg-fetch@>=0.10.0:
version "2.0.3"
resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
@@ -12668,6 +14775,12 @@ which-pm-runs@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb"
+which@1:
+ version "1.3.1"
+ resolved "http://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
@@ -12690,10 +14803,26 @@ window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+window-size@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
+
window-size@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075"
+winston@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e"
+ dependencies:
+ async "~1.0.0"
+ colors "1.0.x"
+ cycle "1.0.x"
+ eyes "0.1.x"
+ isstream "0.1.x"
+ pkginfo "0.3.x"
+ stack-trace "0.0.x"
+
word-wrap@1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
@@ -12710,6 +14839,12 @@ wordwrap@~0.0.2:
version "0.0.3"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+worker-farm@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ dependencies:
+ errno "~0.1.7"
+
wrap-ansi@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -12737,9 +14872,9 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
-write-json-file@^2.2.0:
+write-json-file@^2.2.0, write-json-file@^2.3.0:
version "2.3.0"
- resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
+ resolved "http://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f"
dependencies:
detect-indent "^5.0.0"
graceful-fs "^4.1.2"
@@ -12749,12 +14884,18 @@ write-json-file@^2.2.0:
write-file-atomic "^2.0.0"
write-pkg@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.1.0.tgz#030a9994cc9993d25b4e75a9f1a1923607291ce9"
+ version "3.2.0"
+ resolved "http://registry.yarnpkg.com/write-pkg/-/write-pkg-3.2.0.tgz#0e178fe97820d389a8928bc79535dbe68c2cff21"
dependencies:
sort-keys "^2.0.0"
write-json-file "^2.2.0"
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
ws@^3.0.0:
version "3.3.3"
resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
@@ -12763,6 +14904,24 @@ ws@^3.0.0:
safe-buffer "~5.1.0"
ultron "~1.1.0"
+ws@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.1.1.tgz#1d43704689711ac1942fd2f283e38f825c4b8b95"
+ dependencies:
+ async-limiter "~1.0.0"
+
+wsrun@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/wsrun/-/wsrun-2.2.0.tgz#fe05ca2c466e9281059d255b2773e7964dbcb3a7"
+ dependencies:
+ bluebird "^3.5.1"
+ chalk "^2.3.0"
+ glob "^7.1.2"
+ lodash "^4.17.4"
+ split "^1.0.1"
+ throat "^4.1.0"
+ yargs "^10.0.3"
+
x-is-function@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e"
@@ -12806,20 +14965,35 @@ xhr@^2.0.4, xhr@^2.2.0, xhr@^2.3.3:
parse-headers "^2.0.0"
xtend "^4.0.0"
-xml-js@^1.3.2:
- version "1.6.2"
- resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.2.tgz#4c4cb8413998f73701a202a1b8b2f17c985a72c5"
+xml-js@^1.6.4:
+ version "1.6.4"
+ resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.4.tgz#fcf9fdc9fb6d691122a02fe5a55c30f84d93ab90"
dependencies:
sax "^1.2.4"
+xml2js@0.4.19:
+ version "0.4.19"
+ resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~9.0.1"
+
xmlbuilder@9.0.4:
version "9.0.4"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f"
+xmlbuilder@~9.0.1:
+ version "9.0.7"
+ resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+
xmlhttprequest@*, xmlhttprequest@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
+xregexp@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"
+
"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@@ -12834,11 +15008,11 @@ xtend@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a"
-y18n@^3.2.1:
+y18n@^3.2.0, y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
-y18n@^4.0.0:
+"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
@@ -12850,6 +15024,16 @@ yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
+ dependencies:
+ camelcase "^4.1.0"
+
yargs-parser@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
@@ -12887,7 +15071,7 @@ yargs-parser@^9.0.2:
dependencies:
camelcase "^4.1.0"
-yargs@11.1.0:
+yargs@11.1.0, yargs@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
dependencies:
@@ -12956,7 +15140,36 @@ yargs@^11.0.0:
y18n "^3.2.1"
yargs-parser "^9.0.2"
-yargs@^4.6.0, yargs@^4.7.1, yargs@~4.8.0:
+yargs@^12.0.1:
+ version "12.0.1"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2"
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^2.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1 || ^4.0.0"
+ yargs-parser "^10.1.0"
+
+yargs@^3.7.2:
+ version "3.32.0"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
+ dependencies:
+ camelcase "^2.0.1"
+ cliui "^3.0.3"
+ decamelize "^1.1.1"
+ os-locale "^1.4.0"
+ string-width "^1.0.1"
+ window-size "^0.1.4"
+ y18n "^3.2.0"
+
+yargs@^4.7.1:
version "4.8.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0"
dependencies:
@@ -13034,42 +15247,44 @@ yauzl@^2.4.2:
fd-slicer "~1.0.1"
yeoman-environment@^2.0.0, yeoman-environment@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.0.5.tgz#84f22bafa84088971fe99ea85f654a3a3dd2b693"
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.1.0.tgz#175f49ad693aff41c8998d32f6103c20c62ec37b"
dependencies:
chalk "^2.1.0"
+ cross-spawn "^6.0.5"
debug "^3.1.0"
diff "^3.3.1"
escape-string-regexp "^1.0.2"
- globby "^6.1.0"
+ globby "^8.0.1"
grouped-queue "^0.3.3"
- inquirer "^3.3.0"
+ inquirer "^5.2.0"
is-scoped "^1.0.0"
- lodash "^4.17.4"
+ lodash "^4.17.10"
log-symbols "^2.1.0"
mem-fs "^1.1.0"
+ strip-ansi "^4.0.0"
text-table "^0.2.0"
untildify "^3.0.2"
-yeoman-generator@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.3.tgz#19426ed22687ffe05d31526c3f1c2cf67ba768f3"
+yeoman-generator@^2.0.4:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81"
dependencies:
async "^2.6.0"
chalk "^2.3.0"
cli-table "^0.3.1"
- cross-spawn "^5.1.0"
+ cross-spawn "^6.0.5"
dargs "^5.1.0"
- dateformat "^3.0.2"
+ dateformat "^3.0.3"
debug "^3.1.0"
detect-conflict "^1.0.0"
error "^7.0.2"
find-up "^2.1.0"
github-username "^4.0.0"
- istextorbinary "^2.1.0"
- lodash "^4.17.4"
+ istextorbinary "^2.2.1"
+ lodash "^4.17.10"
make-dir "^1.1.0"
- mem-fs-editor "^3.0.2"
+ mem-fs-editor "^4.0.0"
minimist "^1.2.0"
pretty-bytes "^4.0.2"
read-chunk "^2.1.0"
@@ -13080,3 +15295,24 @@ yeoman-generator@^2.0.3:
text-table "^0.2.0"
through2 "^2.0.0"
yeoman-environment "^2.0.5"
+
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+
+z-schema@^3.19.1:
+ version "3.22.0"
+ resolved "https://registry.npmjs.org/z-schema/-/z-schema-3.22.0.tgz#e1326063cb438f348c648350770258ff5e20a22b"
+ dependencies:
+ lodash.get "^4.0.0"
+ lodash.isequal "^4.0.0"
+ validator "^10.0.0"
+ optionalDependencies:
+ commander "^2.7.1"
+
+zeppelin-solidity@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/zeppelin-solidity/-/zeppelin-solidity-1.8.0.tgz#049fcde7daea9fc85210f8c6db9f8cd1ab8a853a"
+ dependencies:
+ dotenv "^4.0.0"
+ ethjs-abi "^0.2.1"